您当前的位置:五五电子网电子知识单片机-工控设备嵌入式系统-技术Armboot在EV40评估板上的移植 正文
Armboot在EV40评估板上的移植

Armboot在EV40评估板上的移植

点击数:7744 次   录入时间:03-04 11:48:27   整理:http://www.55dianzi.com   嵌入式系统-技术

3.3 通过串口发送数据

#define US_TXRDY 0x2

while((US_CSR & US_TXRDY)==0){}

/*等待US_THR(发送保持寄存器)送出字符*/

US_THR=character

/*当US_THR为空后,往里写下一个要发送字符*

以上内容用于cpu$cpu.c中的serial_putc()函数。

3.4 计数器的使用

在cpu$cpu.c中,有个udelay(unsigned long usec)函数,作用是延时usec ms。通过使用定时器/计数器TC(Timer/Counter)模块完成该功能。同串口使用制似,也需要初始化一系列的寄存器,然后执行某种触发,使计数器复位,时钟启动;当计数器值到这TC_RC时,会发生RC比较,导致TC_SR(状态寄存器)的CPCS位(0x10)置位。由此可见,适当设置TC_RC寄存器的值,可以产生不同长短的延时;通过判断CPCS位,可作为延时结束的标志。

3.5 设置自动引导命令

Armboot在开始会有几秒的延时,让你选择是否自动引导。如果不自动引导,则可通过console,敲入命令,手工引导。

自动引导采用的命令来源于环境变量。环境变量是由一些以“0”结束的形如“name=value”的字符串所组成的序列,整个序列以两个“0”结束。环境变量存储于结构env_t的data数组中。有3处可以存放环境变量,一是SDRAM,在env_init(&bd)(中完成初始化;二是Flash。这里定义放在第三个扇区,即

#define CFG_ENV_ADDR(PHYS_FLASH_1+0x20000)/*环境变量扇区地址*/

env_t*env=(env_t*)CFG_ENV_ADDR。

三是default_environment。Default_environment是一个定义好的全局数组,作用相当于env_t中的data。

使用getenv(bd_t*bd,uchar *name)从环境变量中条目(形如“name=value”;value可以为空"")查找匹配name的条目;成功返回value对应的地址,失败返回0。

通过源码我们可以看出,这里采用的环境变量是default_environment,而且,name=bootcmd;因此,如果采用自动boot,则会自动执行bootp,bootm。由于笔者并不打算让Armboot自动执行任何命令,所以,将CONFIG_BOOTCOMMAND置空。

4 Flash编程

到此为止,Armboot基本上可以说能够在板子上运行了。一些和板子无关的命令已经可以运行,比如查看内存md;下载binary文件loadb(使用kermit模式/协议)等等。也有些命令依然还不能运行,它们根据具体的目标板有不同的代码。比如loads、erase等。

这里我们以Flash编程为例,实现erase命令。Loads中也需要调用和Flash有关的函数。以下的编程是针对Fujitsu MBM29LV160TE的。不同的Flash,命令序列和命令地址都可能不同。

4.1 Flash擦除

Flash的擦除是按照扇区来擦除的,扇区的大小由具体的Flash规定。

EV40使用的Flash是Fujitsu MBM29LV160TE。它规定,一个存储体上有35个扇区s0~s34;s0~s30大小为64KB(0x10000),s31大小为32KB,s32~s33大小为8KB,s34大小为16KB。

具体实现6个命令序列:

typedef volatile unsigned short flash_word;

#define CFG_FLASH_BASE 0x100000

flash_word *flash_address=CFG_FLASH_BASE,*s_address;

s_address=擦除扇区的起始地址;

*(flash_address+0x555)=0xAA;/*命令1*/

*(flash_address+0x2AA)=0x55;/*命令2*/

*(flash_address+0x555)=0x80;/*命令3*/

*(flash_address+0x555)=0xAA;/*命令4*/

*(flash_address+0x2AA)=0x55;/*命令5*/

*s_address=0x30; /*命令6*/

//扇区的擦除需要时间,擦除成功的标志是*s_address==0xFFFF

while((*s_address!=0xFFFF)&&(i++<1000000));

//*若超过

if(i>=1000000){

return ERR_TIMOUT;

}

4.2 Flash写入

写入以字(2字节)为单位,地址要字对齐。具体实现为4个命令序列:

s_sddress=写入处的起始地址(偶地址);

*(flash_address+0x555)=0xAA; /*命令1*/

*(flash_address+0x2AA)=0x55; /*命令2*/

*(flash_address+0x555)=0xA0; /*命令3*/

*s_address=data; /*命令4;data为欲写入数据,要求是flash_word类型*/

//扇区的写入需要时间,写入成功的标志是*s_address==data

while((*s_address!=data)&&(i++<100000));

//*若超时

if(i>=100000){

return ERR_TIMOUT;

}

结语

到此为止,移植可以告一段落了,如果有已经修改好的uClinux内核文件,可以试试使用Armboot(源码见网站http://www.dpj.com.cn),让它来下载并引导内核。还有一点须提醒读者注意,Armboot官方网站使用arm-linux-gCC编译。如果在写Flash时遇到问题(高字节和低字节内容相同),试试arm-elf-gcc suite。



上一页  [1] [2] 


本文关键字:评估  嵌入式系统-技术单片机-工控设备 - 嵌入式系统-技术

《Armboot在EV40评估板上的移植》相关文章>>>