空心雨毕业论文网提供毕业论文、职称论文、硕士论文、计算机论文等的代写服务,同时还提供各种期刊论文的发表。如果你有需要,请联系我们QQ:5599630;电话:13350726595;E-mail:singlehearted@vip.qq.com
RSS
 
当前位置 :空心雨毕业论文网 >> 工学论文 >> 电子机械 >> 正文

Armboot在EV40评估板上的移植

来源:网络转载 作者:okxy168.com 时间:2008-01-10 浏览:1 字体:【

摘要:介绍Armboot以及EV40评估板的特点;详细讨论Armboot在EV40上的移植并给出主要代码;以Flash编程为例,介绍与评估板相关Armboot命令的实现。 关键词:Armboot AT91M40800 ARM 移植1 Armboot简介Armboot是一个bootloader,是为基于ARM或者StrongARM CPU的嵌入式系统所设计的。它支持多种类型的Flash;允许映像文件经由bootp、dhcp、tftp从网络传输;支持从串口线下载S-record或者binary文件;允许内存的显示及修改;支持jffs2文件系统等。Armboot源码公开,可以在http://www.sourceforg.net/projects/armboot下载。2 EV40评估板简介Micetek祥佑数码科技有限公司配合其Hitool for ARM开发工具推出了基于AT91X40系列微控制器的ARM EV40(简称EV40)评估板。可用来开发、调试和评估以Atmel ARM为硬件基础的嵌入式系统。EV40评估板包括一个AT91X40系列的微控制器AT91M40800以及一些外围器件。主要的外围部分包括:2个串口、1个复位按钮、3个应用按键、3个LED指示灯、1个7段LED显示器、512KB以太网接口、USB接口、PC104接口、EBI扩展接口、I/O扩展接口、时钟源选择、触摸板接口和LCD接口。3 Armboot在EV40上的移植本文的主要目的是使读者尽快地能在EV40上运行Armboot,因此,去掉(或修改)了一些完整版本所具有的代码(比如中断处理),从而加快开发。同时,这里使用Hitool for ARM开发工具,完成代码的修改、编译及调试。3.1 初始化Armboot的运行,开始于cpu/$cpu/start.s,完成一系列的初始化后(中间调用board/$board/memsetup.s),调用common/board.c中的函数start_armboot作为C语言程序的入口。如果使用Hitool,并正确地配置startup config(使用初始文件micev40_em.inc)。使用Hitool自动生成的start_up.s代替start.s,把B_main替换为ldr pc,_start_armbootstartarmboot:.word start_armboot如果没有micev40_em.inc,则自行创建,内容如下:long ffe00000 0x01002529 long ffe00014 0x02502021long ffe00004 0x022028al long ffe00018 0x60000000long ffe00008 0x03002529 long ffe0001c 0x70000000long ffe0000c 0x40000000 long ffe00020 0x00000001long ffe00010 0x02402021 long ffe00024 0x00000006这部分的作用相当于borad$board.s。用来初始化EBI的各个寄存器。接下来是串口的初始化。这部分比较重要,作用是实现主机与目标板的通信,从而在超级终端(console)上提供用户接口。在start_armboot函数中,cpu_init(&bd)、board_init(&bd)可以屏蔽掉;serial_init(&bd)用来初始化串口。初始化过程的一个示例如下(使用USART0)。①计算时钟分频数CD,公式为:异步模式CD=选择的时钟/16×波特率(结果四舍五入)同步模式CD=选择的时候/波特率(CD必须为偶数)CD将作US_BRGR(波特率发生寄存器)的值。②设置PS_PCER(省电模块的外围时钟使能寄存器),它的各位和中断源对应。首先使能外围的时钟:#define PS_PCER_US0 0x04PS_PCER=PS_PCER_US0;③设置PIO_PDR(PIO禁止寄存器)。此寄存器用于禁止PIO控制器控制单个引脚,而用作外围引脚。并行I/O口线中一些为复用口线,可以由PIO控制器控制或作为其它外围引脚。如P13(SCK0,SUART0时钟信号)、P14(TXD0,USART0数据发送端)、P15(RXD0,USART0数据接收端)。#define PIO_PDR_RXD0 0x8000#define PIO_PDR_TXD0 0x4000#define PIO_PDR_TXD0 0x2000如果使用MCK(主时钟),PIO_PDR=PIO_PDR_RXD0|PIO_PDR_TXD0;如果使用SCK(外部时钟),PIO_PDR=PIO_PDR_RXD0|PIO_PDR_TXD0|PIO_PDR_SCK0。④复位接收器和发送器。这是通过设置US_CR(USART控制寄存器)。#define US_RSTRX 0x0004#define US_RSTRX 0x0008#define US_RXDIS 0x0020#define US_TXDIS 0x0080US_CR=US_RSTRX|US_RSTTX|US_RXDIS|US_TXDIS⑤清除发送和接收计数寄存器。US_TCR=0US_RCR=0⑥设置波特率产生寄存器US_BRGR。US_BRGR=CD⑦设置USART模式寄存器US_MR。#define US_CHMODE_NORMAL 0x0000 /*普通模式*/#define US_NBSTOP_1 0x0000 /*停止位1*/#define US_PAR_NO 0x800 /*无奇偶校验*/#define US_CHRL_8 0xC0 /*数据位8*/#define US_CLKS_MCK 0x00 /*主时钟*/#define US_ASYNC_MODE(US_CHMODE_NORMAL US_NBSTOP_1 US_PAR_NO US_CHRL_8 US_CLKS_MCK)US_MR=US_ASYNC_MODE⑧设置发送时间确保寄存器US_TTGR。US_TTGR=0⑨使能接收器和发送器。#define US_TXEN 0x0040#define US_RXEN 0x0010US_CR=US_RXEN|US_TXEN⑩屏蔽所有USART中断。US_IDR=0xFFFFFFFF⑾最好在这里插入一个延时循环,保证初始化工作的顺利工作。For(i=0;i <=10;i );为了让读者更清楚理解以上个寄存器的来源,这里以USART0各寄存器的定义为例://USART的各个寄存器typedef volatile unsigned int at91_reg;typedef struct{at91_reg US_CR ; /*控制寄存器*/at91_reg US_MR ; /*模式寄存器*/at91_reg US_IER ; /*中断使能寄存器*/at91_reg US_IDR ; /*中断禁止寄存器*/at91_reg US_IMR ; /*中断屏蔽寄存器*/at91_reg US_CSR ; /*通道状态寄存器*/at91_reg US_RHR ; /*接收保持寄存器*/at91_reg US_THR ; /*发送保持寄存器*/at91_reg US_BRGR ; /*波特率产生寄存器*/at91_reg US_TTOR ; /*接收超时寄存器*/at91_reg US_TTGR ; /*发送器时间确保寄存器*at91_reg Reserved ;at91_reg US_RPR ; /*接收指针寄存器*/at91_reg US_RCR ; /*接收计数寄存器*/at91_reg US_TPR ; /*发送指针寄存器*/at91_reg US_TCR; /*发送计数寄存器*/}StructUSART;#define USART0_BASE ((StructUSART*)0xFFFD0000)3.2 通过串口接收数据#define US_RXRDY 0x1While((US_CSR & US_RXRDY)==0){}/*等待US_RHR(接收保持寄存器)收到字符*/character=US_RHR/*收到字符后,把它赋给某一变量供以后使用*/以上内容用于cpu$cpu.c中的serial_getc()函数。3.3 通过串口发送数据#define US_TXRDY 0x2while((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 0x100000flash_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==0xFFFFwhile((*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==datawhile((*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
最新评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
      本站是由一个众多学科的博士群体组建而成,主要创办者为成都各重点高校博士。本论文网内理工科写手均为博士,文科类写手大部分为博士,且领域涵盖广泛,写作势力强大,若有部分专业,没有相关的写手,我们给你寻找合适的写手! 依托强大的人力资源,我们本着诚心交流的宗旨,专门为您排解写作上的难题。从在科研及实践工作中稳扎稳打的经历,我们具备了研究问题,解决问题的能力。论文写作和论文发表,作为教育体系的一个重要环节,我们确实有能力给您解决好问题,正所谓,真金不怕火来炼,请相信我们的势力,没有把握的事,我们不会做!
      本站受多家期刊委托,其中包括国家级中文核心期刊目录正刊,CSSCI目录正刊,增刊,省级以上公开出版的优秀期刊正刊,本站负责论文推荐发表,加急1个月即可发表。本站负责论文发表,不发表承诺退款!!目前主要负责法律,管理,经济,理工,农学,行政,医学,艺术,英语等类论文发表论文代写。详细期刊目录见本站相关内容。
赞助商链接