国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

Armboot在EV40評估板上的移植

發(fā)布時(shí)間:2010-4-13 15:08    發(fā)布者:hkx
關(guān)鍵詞: Armboot , EV40 , 評估板
1 Armboot簡介

Armboot是一個(gè)bootloader,是為基于ARM或者 StrongARM CPU的嵌入式系統(tǒng)所設(shè)計(jì)的。它支持多種類型的Flash;允許映像文件經(jīng)由bootp、dhcp、tftp從網(wǎng)絡(luò)傳輸;支持從串口線下載S- record或者binary文件;允許內(nèi)存的顯示及修改;支持jffs2文件系統(tǒng)等。Armboot源碼公開,可以在 http://www.sourceforg.net/projects/armboot下載。

2 EV40評估板簡介

Micetek祥佑數(shù)碼科技有限公司配合其Hitool for ARM開發(fā)工具推出了基于AT91X40系列微控制器的ARM EV40(簡稱EV40)評估板。可用來開發(fā)、調(diào)試和評估以Atmel ARM為硬件基礎(chǔ)的嵌入式系統(tǒng)。EV40評估板包括一個(gè)AT91X40系列的微控制器AT91M40800以及一些外圍器件。

主要的外圍部分包括:2個(gè)串口、1個(gè)復(fù)位按鈕、3個(gè)應(yīng)用按鍵、3個(gè)LED指示燈、1個(gè)7段LED顯示器、512KB以太網(wǎng)接口、USB接口、PC104接口、 EBI擴(kuò)展接口、I/O擴(kuò)展接口、時(shí)鐘源選擇、觸摸板接口和LCD接口。

3 Armboot在EV40上的移植

本文的主要目的是使讀者盡快地能在EV40上運(yùn)行Armboot,因此,去掉(或修改)了一些完整版本所具有的代碼(比如中斷處理),從而加快開發(fā)。同時(shí),這里使用Hitool for ARM開發(fā)工具,完成代碼的修改、編譯及調(diào)試。

3.1 初始化

Armboot 的運(yùn)行,開始于cpu/$cpu/start.s,完成一系列的初始化后(中間調(diào)用board/$board/memsetup.s),調(diào)用common /board.c中的函數(shù)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,則自行創(chuàng)建,內(nèi)容如下:
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

這部分的作用相當(dāng)于borad$board.s。用來初始化 EBI的各個(gè)寄存器。
接下來是串口的初始化。這部分比較重要,作用是實(shí)現(xiàn)主機(jī)與目標(biāo)板的通信,從而在超級終端(console)上提供用戶接口。

在start_armboot函數(shù)中,cpu_init(&bd)、board_init(&bd)可以屏蔽掉;serial_init(&bd)用來初始化串口。初始化過程的一個(gè)示例如下(使用USART0)。

①計(jì)算時(shí)鐘分頻數(shù) CD,公式為:
異步模式
CD=選擇的時(shí)鐘/16×波特率(結(jié)果四舍五入)
同步模式
CD= 選擇的時(shí)候/波特率(CD必須為偶數(shù))
CD將作US_BRGR(波特率發(fā)生寄存器)的值。

②設(shè)置PS_PCER(省電模塊的外圍時(shí)鐘使能寄存器),它的各位和中斷源對應(yīng)。首先使能外圍的時(shí)鐘:
#define PS_PCER_US0 0x04
PS_PCER=PS_PCER_US0;

③設(shè)置PIO_PDR(PIO禁止寄存器)。此寄存器用于禁止PIO控制器控制單個(gè)引腳,而用作外圍引腳。并行I/O口線中一些為復(fù)用口線,可以由PIO控制器控制或作為其它外圍引腳。如P13(SCK0,SUART0時(shí)鐘信號)、P14(TXD0,USART0數(shù)據(jù)發(fā)送端)、 P15(RXD0,USART0數(shù)據(jù)接收端)。
#define PIO_PDR_RXD0 0x8000
#define PIO_PDR_TXD0 0x4000
#define PIO_PDR_TXD0 0x2000
如果使用 MCK(主時(shí)鐘),
PIO_PDR=PIO_PDR_RXD0|PIO_PDR_TXD0;
如果使用SCK(外部時(shí)鐘),
PIO_PDR=PIO_PDR_RXD0|PIO_PDR_TXD0|PIO_PDR_SCK0。

④復(fù)位接收器和發(fā)送器。這是通過設(shè)置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

⑤ 清除發(fā)送和接收計(jì)數(shù)寄存器。
US_TCR=0
US_RCR=0

⑥設(shè)置波特率產(chǎn)生寄存器 US_BRGR。
US_BRGR=CD

⑦設(shè)置USART模式寄存器US_MR。
#define US_CHMODE_NORMAL 0x0000 /*普通模式*/
#define US_NBSTOP_1 0x0000 /*停止位1*/
#define US_PAR_NO 0x800 /*無奇偶校驗(yàn)*/
#define US_CHRL_8 0xC0 /*數(shù)據(jù)位8*/
#define US_CLKS_MCK 0x00 /*主時(shí)鐘*/
#define US_ASYNC_MODE(US_CHMODE_NORMAL
+US_NBSTOP_1+US_PAR_NO+US_CHRL_8+US_CLKS_MCK)
US_MR=US_ASYNC_MODE

⑧設(shè)置發(fā)送時(shí)間確保寄存器US_TTGR。
US_TTGR=0

⑨使能接收器和發(fā)送器。
#define US_TXEN 0x0040
#define US_RXEN 0x0010
US_CR=US_RXEN|US_TXEN

⑩屏蔽所有USART中斷。
US_IDR=0xFFFFFFFF

⑾最好在這里插入一個(gè)延時(shí)循環(huán),保證初始化工作的順利工作。
For(i=0;i<=10;i++);

為了讓讀者更清楚理解以上個(gè)寄存器的來源,這里以USART0各寄存器的定義為例:
//USART的各個(gè)寄存器
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 /*通道狀態(tài)寄存器*/
at91_reg US_RHR /*接收保持寄存器*/
at91_reg US_THR /*發(fā)送保持寄存器*/
at91_reg US_BRGR /*波特率產(chǎn)生寄存器*/
at91_reg US_TTOR /*接收超時(shí)寄存器*/
at91_reg US_TTGR /*發(fā)送器時(shí)間確保寄存器*
at91_reg Reserved
at91_reg US_RPR /*接收指針寄存器*/
at91_reg US_RCR /*接收計(jì)數(shù)寄存器*/
at91_reg US_TPR /*發(fā)送指針寄存器*/
at91_reg US_TCR; /*發(fā)送計(jì)數(shù)寄存器*/
}StructUSART;
#define USART0_BASE ((StructUSART*)0xFFFD0000)

3.2 通過串口接收數(shù)據(jù)

#define US_RXRDY 0x1
While((US_CSR & US_RXRDY)==0){}
/*等待 US_RHR(接收保持寄存器)收到字符*/character=US_RHR
/*收到字符后,把它賦給某一變量供以后使用*/
以上內(nèi)容用于cpu$cpu.c中的serial_getc()函數(shù)。

3.3 通過串口發(fā)送數(shù)據(jù)

#define US_TXRDY 0x2
while((US_CSR & US_TXRDY)==0){}
/*等待 US_THR(發(fā)送保持寄存器)送出字符*/
US_THR=character
/*當(dāng)US_THR為空后,往里寫下一個(gè)要發(fā)送字符*
以上內(nèi)容用于cpu$cpu.c中的serial_putc()函數(shù)。

3.4 計(jì)數(shù)器的使用

在 cpu$cpu.c中,有個(gè)udelay(unsigned long usec)函數(shù),作用是延時(shí)usec ms。通過使用定時(shí)器/計(jì)數(shù)器TC(Timer/Counter)模塊完成該功能。同串口使用制似,也需要初始化一系列的寄存器,然后執(zhí)行某種觸發(fā),使計(jì)數(shù)器復(fù)位,時(shí)鐘啟動;當(dāng)計(jì)數(shù)器值到這TC_RC時(shí),會發(fā)生RC比較,導(dǎo)致TC_SR(狀態(tài)寄存器)的CPCS位(0x10)置位。由此可見,適當(dāng)設(shè)置 TC_RC寄存器的值,可以產(chǎn)生不同長短的延時(shí);通過判斷CPCS位,可作為延時(shí)結(jié)束的標(biāo)志。

3.5 設(shè)置自動引導(dǎo)命令

Armboot 在開始會有幾秒的延時(shí),讓你選擇是否自動引導(dǎo)。如果不自動引導(dǎo),則可通過console,敲入命令,手工引導(dǎo)。

自動引導(dǎo)采用的命令來源于環(huán)境變量。環(huán)境變量是由一些以“0”結(jié)束的形如“name=value”的字符串所組成的序列,整個(gè)序列以兩個(gè)“0”結(jié)束。環(huán)境變量存儲于結(jié)構(gòu) env_t的data數(shù)組中。有3處可以存放環(huán)境變量,一是SDRAM,在env_init(&bd)(中完成初始化;二是Flash。這里定義放在第三個(gè)扇區(qū),即
#define CFG_ENV_ADDR(PHYS_FLASH_1+0x20000)/*環(huán)境變量扇區(qū)地址*/
env_t*env=(env_t*)CFG_ENV_ADDR。
三是default_environment。 Default_environment是一個(gè)定義好的全局?jǐn)?shù)組,作用相當(dāng)于env_t中的data。

使用 getenv(bd_t*bd,uchar *name)從環(huán)境變量中條目(形如“name=value”;value可以為空"")查找匹配name的條目;成功返回value對應(yīng)的地址,失敗返回0。

通過源碼我們可以看出,這里采用的環(huán)境變量是default_environment,而且,name=bootcmd;因此,如果采用自動boot,則會自動執(zhí)行bootp,bootm。由于筆者并不打算讓Armboot自動執(zhí)行任何命令,所以,將 CONFIG_BOOTCOMMAND置空。

4 Flash編程

到此為止,Armboot基本上可以說能夠在板子上運(yùn)行了。一些和板子無關(guān)的命令已經(jīng)可以運(yùn)行,比如查看內(nèi)存md;下載binary文件loadb(使用kermit模式/協(xié)議)等等。也有些命令依然還不能運(yùn)行,它們根據(jù)具體的目標(biāo)板有不同的代碼。比如loads、erase等。

這里我們以Flash編程為例,實(shí)現(xiàn)erase命令。 Loads中也需要調(diào)用和Flash有關(guān)的函數(shù)。以下的編程是針對Fujitsu MBM29LV160TE的。不同的Flash,命令序列和命令地址都可能不同。

4.1 Flash擦除

Flash 的擦除是按照扇區(qū)來擦除的,扇區(qū)的大小由具體的Flash規(guī)定。

EV40使用的Flash是Fujitsu MBM29LV160TE。它規(guī)定,一個(gè)存儲體上有35個(gè)扇區(qū)s0~s34;s0~s30大小為64KB(0x10000),s31大小為 32KB,s32~s33大小為8KB,s34大小為16KB。

具體實(shí)現(xiàn)6個(gè)命令序列:
typedef volatile unsigned short flash_word;
#define CFG_FLASH_BASE 0x100000
flash_word *flash_address=CFG_FLASH_BASE,*s_address;
s_address= 擦除扇區(qū)的起始地址;
*(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*/
// 扇區(qū)的擦除需要時(shí)間,擦除成功的標(biāo)志是*s_address==0xFFFF
while((*s_address!=0xFFFF)&&(i++<1000000));
//*若超過
if(i>=1000000){
return ERR_TIMOUT;
}

4.2 Flash寫入

寫入以字(2字節(jié))為單位,地址要字對齊。具體實(shí)現(xiàn)為4個(gè)命令序列:
s_sddress= 寫入處的起始地址(偶地址);
*(flash_address+0x555)=0xAA; /*命令1*/
* (flash_address+0x2AA)=0x55; /*命令2*/
*(flash_address+0x555)=0xA0; /*命令3*/
*s_address=data; /*命令4;data為欲寫入數(shù)據(jù),要求是flash_word類型*/
// 扇區(qū)的寫入需要時(shí)間,寫入成功的標(biāo)志是*s_address==data
while((*s_address!=data)&&(i++<100000));
//*若超時(shí)
if(i>=100000){
return ERR_TIMOUT;
}

結(jié)語

到此為止,移植可以告一段落了,如果有已經(jīng)修改好的uClinux內(nèi)核文件,可以試試使用Armboot(源碼見網(wǎng)站 http://www.dpj.com.cn),讓它來下載并引導(dǎo)內(nèi)核。還有一點(diǎn)須提醒讀者注意,Armboot官方網(wǎng)站使用arm-linux-gcc 編譯。如果在寫Flash時(shí)遇到問題(高字節(jié)和低字節(jié)內(nèi)容相同),試試arm-elf-gcc suite。

參考文獻(xiàn)

   1. 馬忠梅.徐英慧 AT91 系列ARM核微控制器結(jié)構(gòu)與開發(fā) 2003
   2. 杜春雷 ARM 體系結(jié)構(gòu)與編程 2003
   3. 馬忠梅.馬廣云 ARM 嵌入式處理器結(jié)構(gòu)與應(yīng)用基礎(chǔ) 2002
   4. Fujitsu Semiconductor Data Sheet for MBM29LV160TE/BE

作 者:北京理工大學(xué) 趙勐 陳朔鷹 馬忠梅  
來 源:單片機(jī)與嵌入式系統(tǒng)應(yīng)用2004(1)
本文地址:http://m.qingdxww.cn/thread-10398-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區(qū)
  • 利用SAM E54 Xplained Pro評估工具包演示CAN轉(zhuǎn)USB橋接器以及基于CAN的主機(jī)和自舉程序應(yīng)用程序
  • 使用SAM-IoT Wx v2開發(fā)板演示AWS IoT Core應(yīng)用程序
  • 使用Harmony3加速TCP/IP應(yīng)用的開發(fā)培訓(xùn)教程
  • 集成高級模擬外設(shè)的PIC18F-Q71家族介紹培訓(xùn)教程
  • 貿(mào)澤電子(Mouser)專區(qū)

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产字幕 | 天天夜碰日日摸日日澡 | 国产成人精品三级在线 | 一个人hd高清在线观看 | 黄视频网站在线看 | 国产精品久久久久一区二区三区 | 国产白嫩美女在线观看 | 日韩黄色一级 | 日本免费高清视频二区 | 欧美自拍三级 | 91精品国产福利在线观看性色 | 岛国午夜精品视频在线观看 | 全面回忆在线观看免费完整版高清 | 最新在线防屏蔽国产一区 | 亚洲午夜一级毛片 | 国内精品久久久久 | 99精品在线观看视频 | 日本欧美一二三区色视频 | 国产综合精品日本亚洲777 | 日韩一级视频免费观看 | 男人天堂网在线播放 | 另类视频在线观看 | 成人精品在线观看 | 天天夜夜狠狠一区二区三区 | 成人黄页网站免费观看大全 | 中文字幕手机在线播放 | 亚洲第一区精品日韩在线播放 | 一周的说唱歌手免费观看 | xxxx日本在线播放免费不卡 | 91免费视频播放 | 青青草原亚洲 | 日韩综合在线观看 | 久久国产精品-久久精品 | 色久天| 狠狠88综合久久久久综合网 | 国产精品白嫩在线观看 | 日本护士xxxx0000 | 免费在线观看的黄色网址 | 一区二区三区www | 亚洲aaaa级特黄毛片 | 久久精品99毛片免费 |