当前位置:首页 > 嵌入式 > 嵌入式硬件
[导读]摘要:介绍Armboot以及EV40评估板的特点;详细讨论Armboot在EV40上的移植并给出主要代码;以Flash编程为例,介绍与评估板相关 Armboot命令的实现。 关键词:Armboot AT91M40

摘要:介绍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_armboot startarmboot:.word start_armboot 如果没有micev40_em.inc,则自行创建,内容如下: long ffe00000 0x01002529 long ffe00014 0x02502021 long ffe00004 0x022028al long ffe00018 0x60000000 long ffe00008 0x03002529 long ffe0001c 0x70000000 long ffe0000c 0x40000000 long ffe00020 0x00000001 long ffe00010 0x02402021 long ffe00024 0x00000006 这部分的作用相当于borad$board.s。用来初始化EBI的各个寄存器。 接下来是串口的初始化。这部分比较重要,作用是实现主机与目标板的通信,从而在超级终端(console)上提供用户接口。 在start_armboot函数中,cpu_init(%26;amp;bd)、board_init(%26;amp;bd)可以屏蔽掉;serial_init(%26;amp;bd)用来初始化串口。初始化过程的一个示例如下(使用USART0)。 ①计算时钟分频数CD,公式为: 异步模式 CD=选择的时钟/16%26;#215;波特率(结果四舍五入) 同步模式 CD=选择的时候/波特率(CD必须为偶数) CD将作US_BRGR(波特率发生寄存器)的值。 ②设置PS_PCER(省电模块的外围时钟使能寄存器),它的各位和中断源对应。首先使能外围的时钟: #define PS_PCER_US0 0x04 PS_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 0x0080 US_CR=US_RSTRX|US_RSTTX|US_RXDIS|US_TXDIS ⑤清除发送和接收计数寄存器。 US_TCR=0 US_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 0x0010 US_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 0x1 While((US_CSR %26;amp; US_RXRDY)==0){} /*等待US_RHR(接收保持寄存器)收到字符*/character=US_RHR /*收到字符后,把它赋给某一变量供以后使用*/ 以上内容用于cpu$cpu.c中的serial_getc()函数。 3.3 通过串口发送数据 #define US_TXRDY 0x2 while((US_CSR %26;amp; 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(%26;amp;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)%26;amp;%26;amp;(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)%26;amp;%26;amp;(i++<100000)); //*若超时 if(i>=100000){ return ERR_TIMOUT; } 结语 到此为止,移植可以告一段落了,如果有已经修改好的uClinux内核文件,可以试试使用Armboot(源码见网站 http://www.dpj.com.cn),让它来下载并引导内核。还有一点须提醒读者注意,Armboot官方网站使用arm-linux-gcc 编译。如果在写Flash时遇到问题(高字节和低字节内容相同),试试arm-elf-gcc suite。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭