当前位置:首页 > 基于S3C44B0VxWorksBSP移植方法
思创黄金开发板 S3C44B0X VxWorks BSP 移植笔记 版本: 1.0 日期: 2004.07.18 #endif /* (SBCARM7_CACHE_SIZE == SBCARM7_CACHE_8K) */ }
void sngks32cCacheDisable ( void ) {
UINT32 result;
SBCARM7_CTRL_REG_READ(S3C44B0X_SYSCFG, result);
/* Amine: SBCARM7_CACHE_ENABLE->SBCARM7_CACHE_MODE */ SBCARM7_CTRL_REG_WRITE(S3C44B0X_SYSCFG,
(result & ~(SBCARM7_CACHE_MODE))); }
/* Amine: 修改较多,如循环次数,地址进位,重新使能等 */ void sngks32cCacheFlush(void) {
int i, num;
UINT32 *tagram; UINT32 addr;
addr = SBCARM7_TAGRAM_BEG;
num = (SBCARM7_TAGRAM_END - SBCARM7_TAGRAM_BEG)/16; sngks32cCacheDisable(); for(i=0; i < num; i++) {
tagram = (UINT32 *)addr; *tagram = 0x00000000; addr += 16; }
SBCARM7_CTRL_REG_WRITE (S3C44B0X_SYSCFG, (SBCARM7_WRITE_BUFF | SBCARM7_CACHE_8K)); }
注意:对直接硬件操作避免使用Cache,最好只对程序和数据空间使用Cache。例如: Cache对TFFS的有影响,flash指令序列缓存在Cache中会导致某些操作失败(参看sngks32cCacheEnable函数中代码)。 4.6.2 测试
下面的代码可以粗略地测试系统的运行效率,比较Cache使用前后的结果。代码有由d3000编写。或者使用Dhrystone Benchmark 2.1测试程序(安装SDT后,在\\ARM251\\Examples\\dhry下有)。
UINT32 u32Array[2048];
int bench(void) { UINT32 *pInt; UINT32 i;
int tick1,tick2;
pInt = malloc(2048*sizeof(UINT32)); for(i=0;i<2048;i++) u32Array[i]=i;
tick1=tickGet();
for (i=0; i< 10000;i++)
bcopyLongs((char*)u32Array, (char*)pInt,2048); tick2=tickGet();
共享
?Amine, 2014 页 17 of 36
思创黄金开发板 S3C44B0X VxWorks BSP 移植笔记 版本: 1.0 日期: 2004.07.18 printf(\
return 0; }
4.7 网络驱动
网卡芯片兼容NE2000,使用ne2000End驱动,主要修改寄存器地址,初始化参数,实现代码几乎没有修改。 4.7.1 修改
ne2000End.c修改很少:修改头文件包含目录;sysIntConnect修改为intConnect;sysLanIntEnable改为intEnable,并修改返回类型void为STATUS。
ne2000End.h修改也很简单。因为网络芯片的A0地址线接在CPU的A5上,需修改奇地址寄存器的地址,欧地址寄存器保持不变, 例如:
#define ENE_CMD #define ENE_TRINCRL 0x01 #define ENE_TRINCRH 0x02 #define ENE_BOUND 0x03
0x00 /* command */ /* TRDMA incrementer */ /* TRDMA incrementer */ /* boundary page */ 0x00 /* command */ /* TRDMA incrementer */ /* TRDMA incrementer */ /* boundary page */
需要修改为:
#define ENE_CMD #define ENE_TRINCRL 0x20 #define ENE_TRINCRH 0x02 #define ENE_BOUND 0x22
config.h增加网络驱动宏定义。
#ifdef INCLUDE_END
/* Amine: INCLUDE_SNGKS32C_END->INCLUDE_NE2000_END */
#define INCLUDE_NE2000_END /* Include Ethernet driver */ #endif /* INCLUDE_END */
configNet.h向endDevTbl[]表中添加新驱动条目,填写初始化串。注意,初始化串中不能使用宏定义,数值都采用16进制表示。
END_TBL_ENTRY endDevTbl [] = {
/*Amine: added*/
/*
/*Note:
{ 0, ne2000EndLoad, \#endif /* INCLUDE_NE2000_END */
sysLib.c中完成CPU端口初始化,注意网卡使用EXTINT1,上升沿触发。并完成网卡芯片复位初始化。添加ne2000EnetAddr 定义,并实现sysInByte、sysOutByte、sysInWordString和sysOutWordString函数。注意,sysInWordString和sysOutWordString的端口地址不用累加,并需按8位操作.
/* Amine: sysSngks32cMacAddr->ne2000EnetAddr */ unsigned char ne2000EnetAddr[] = ETHERNET_MAC_ADRS;
void {
sysInWordString (unsigned long port, unsigned short *pData, int count)
共享
?Amine, 2014 页 18 of 36
思创黄金开发板 S3C44B0X VxWorks BSP 移植笔记 版本: 1.0 日期: 2004.07.18 int i, byte_count; char *pbyte;
pbyte = (char *)pData; byte_count = count*2;
for(i=0; i int i, byte_count; char *pbyte; pbyte = (char *)pData; byte_count = count*2; for(i=0; i 4.7.2 寄存器测试 网络驱动调试出现问题时,可以用下面的函数测试网卡芯片的寄存器,检测是否设置正常。 void NetTest(void) { unsigned char c[]={0x21,0x41,0xa1,0xe1}; int i,j; volatile unsigned char *p =(volatile unsigned char *)(NETBASE); printf(\ printf(\ for (i=0; i<4; i++) { *(volatile unsigned char *)(p) = c[i]; printf(\ for (j=0;j<16;j++) { if (j&1) { printf(\ } else { printf(\ } } } printf(\ *(NETBASE+0x00) = 0x22; } 4.7.3 网络初始化分离 需从bootLoad()分离出网络初始化,为了让系统总是启动网络,而不管bootLine的配置。在 bootConfig.c添加int netInit(char * bootString)函数,将bootLoad中相关变量定义和网络初始化移入netInit()中,保留网络加载代码。代码不用作修改, 只需在起始处加入定义,并加入bootline解析代码,netInit中会使用bootline中的网络设备名和号。 共享 ?Amine, 2014 页 19 of 36 思创黄金开发板 S3C44B0X VxWorks BSP 移植笔记 BOOT_PARAMS params; /* interpret boot command */ if (usrBootLineCrack (bootString, ¶ms) != OK) return (ERROR); 版本: 1.0 日期: 2004.07.18 在bootconfig.c的bootCmdLoop()开始处添加netInit调用以加入网络初始化,放在bootLine初始化和TFFS加载之后。 if( netInit(BOOT_LINE_ADRS) == ERROR ) printf (\ 4.8 TFFS驱动 为了在Flash存储器上使用文件系统,需要添加TFFS驱动,作为文件系统和存储器的中间层。TFFS 驱动分为3层,开发者面向Socket和MTD两层。 4.8.1 Socket 复制mv177-sysTffs.c到BSP目录,并更名为为sysTffs.c。sysTffs.c包含了tffsConfig.c,还需要复制tffsConfig.c到BSP目录。 sysTffs.c和tffsConfig.c修改都比较,很容易完成。 sysTffs.c中主要添加自己的MTD宏定义,设置Flash存储器基址和大小,屏蔽无关的写保护操作。 tffsConfig.c中向mtdTable[]表注册自己的MTD。 4.8.2 MTD TFFS驱动的工作主要集中MTD上,MTD和具体的Flash存储器相关,实现写,擦除等基本操作。参照其他Flash存储器型号的MTD实现文件,在BSP目录下添加自己的MTD代码文件,名称任意,如sst39vf160.c。 sst39vf160.c几乎都是由自己编写,这里不能列出所有细节,只是提醒几个注意问题。 ? Flash存储器基址和大小需要和sysTffs.c中的设置一致。 ? 需要参考自己的Flash芯片的手册,修改操作指令序列。 ? Flash芯片的手册中描述的地址是按字而言,也就是芯片的A0接在CPU的A1上,所以手册给出的指 令地址不能直接使用,需要左移一位。 ? VxWorks提供的地址映射函数使用有问题,需要编写自己的地址映射函数。 ? Cache不要覆盖Flash存储器空间,因为Flash的操作指令序列是连续的,Cache可能会导致中断而使操 作失败。 ? 需要在擦除和写操作中屏蔽中断,因为Flash在擦除、写和读ID状态时,不能正常读取Flash中数 据。而VxWorks的异常入口位于Flash存储器的开始处,异常发生时不能得到正常的入口指令,会导致系统跑飞。解决这个问题的最好方法是添加第2片Flash存储器,专门用于文件系统。 ? 建议在每个函数入口添加调试信息,打印出入口参数等,以方便定位错误。 ? 最好在VxWorks中调试TFFS,而不是在bootRom中。 4.8.3 格式化 在实际加载使用TFFS前,先需要格式化。格式化是否成功,可以判断你是MTD代码是否成功,所以格式化操作失败是移植最常遇到的障碍。格式化操作如下代码所示。我在bootShell添加了一个命令“z”,用于启动格式化操作。 case 'z': /* Amine: tffs format */ if( tffsDevFormat(0,0) != OK ) printErr (\ 共享 ?Amine, 2014 页 20 of 36
共分享92篇相关文档