Armboot在EV40評估板上的移植_第1頁
Armboot在EV40評估板上的移植_第2頁
Armboot在EV40評估板上的移植_第3頁
Armboot在EV40評估板上的移植_第4頁
Armboot在EV40評估板上的移植_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Armboot在EV40評估板上的移植    摘要:介紹Armboot以及EV40評估板的特點;詳細討論Armboot在EV40上的移植并給出主要代碼;以Flash編程為例,介紹與評估板相關(guān)Armboot命令的實現(xiàn)。   關(guān)鍵詞:Armboot AT91M40800 ARM 移植1 Armboot簡介Armboot是一個bootloader,是為基于ARM或者StrongARM CPU的嵌入式系統(tǒng)所設(shè)計的。它支持多種類型的Flash;允許映像文件經(jīng)由bootp、dhcp、tftp從網(wǎng)絡(luò)傳輸;支持從串口線下載S-record或

2、者binary文件;允許內(nèi)存的顯示及修改;支持jffs2文件系統(tǒng)等。Armboot源碼公開,可以在2 EV40評估板簡介Micetek祥佑數(shù)碼科技有限公司配合其Hitool for ARM開發(fā)工具推出了基于AT91X40系列微控制器的ARM EV40(簡稱EV40)評估板??捎脕黹_發(fā)、調(diào)試和評估以Atmel ARM為硬件基礎(chǔ)的嵌入式系統(tǒng)。EV40評估板包括一個AT91X40系列的微控制器AT91M40800以及一些外圍器件。主要的外圍部分包括:2個串口、1個復(fù)位按鈕、3個應(yīng)用按鍵、3個LED指示燈、1個7段LED顯示器、512KB以太網(wǎng)接口、USB接口、PC104接口、EBI擴展接口、I/O擴

3、展接口、時鐘源選擇、觸摸板接口和LCD接口。3 Armboot在EV40上的移植本文的主要目的是使讀者盡快地能在EV40上運行Armboot,因此,去掉(或修改)了一些完整版本所具有的代碼(比如中斷處理),從而加快開發(fā)。同時,這里使用Hitool for ARM開發(fā)工具,完成代碼的修改、編譯及調(diào)試。3.1 初始化Armboot的運行,開始于cpu/$cpu/start.s,完成一系列的初始化后(中間調(diào)用board/$board/memsetup.s),調(diào)用common/board.c中的函數(shù)start_armboot作為C語言程序的入口。如果使用Hitool,并正確地配置startup con

4、fig(使用初始文件micev40_em.inc)。使用Hitool自動生成的start_up.s代替start.s,把B_main替換為ldr pc,_start_armbootstartarmboot:.word start_armboot如果沒有micev40_em.inc,則自行創(chuàng)建,內(nèi)容如下:long ffe00000 0x01002529 long ffe00014 0x02502021long ffe00004 0x022028al long ffe00018 0x60000000long ffe00008 0x03002529 long ffe0001c 0x70000000l

5、ong ffe0000c 0x40000000 long ffe00020 0x00000001long ffe00010 0x02402021 long ffe00024 0x00000006這部分的作用相當(dāng)于borad$board.s。用來初始化EBI的各個寄存器。接下來是串口的初始化。這部分比較重要,作用是實現(xiàn)主機與目標板的通信,從而在超級終端(console)上提供用戶接口。在start_armboot函數(shù)中,cpu_init(&bd)、board_init(&bd)可以屏蔽掉;serial_init(&bd)用來初始化串口。初始化過程的一個示例如下(使用USA

6、RT0)。計算時鐘分頻數(shù)CD,公式為:異步模式CD=選擇的時鐘/16×波特率(結(jié)果四舍五入)同步模式CD=選擇的時候/波特率(CD必須為偶數(shù))CD將作US_BRGR(波特率發(fā)生寄存器)的值。設(shè)置PS_PCER(省電模塊的外圍時鐘使能寄存器),它的各位和中斷源對應(yīng)。首先使能外圍的時鐘:#define PS_PCER_US0 0x04PS_PCER=PS_PCER_US0;設(shè)置PIO_PDR(PIO禁止寄存器)。此寄存器用于禁止PIO控制器控制單個引腳,而用作外圍引腳。并行I/O口線中一些為復(fù)用口線,可以由PIO控制器控制或作為其它外圍引腳。如P13(SCK0,SUART0時鐘信號)、P

7、14(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(主時鐘),PIO_PDR=PIO_PDR_RXD0|PIO_PDR_TXD0;如果使用SCK(外部時鐘),PIO_PDR=PIO_PDR_RXD0|PIO_PDR_TXD0|PIO_PDR_SCK0。復(fù)位接收器和發(fā)送器。這是通過設(shè)置US_CR(USART控制寄存器)。#define US_RSTRX 0x0004#define US_

8、RSTRX 0x0008#define US_RXDIS 0x0020#define US_TXDIS 0x0080US_CR=US_RSTRX|US_RSTTX|US_RXDIS|US_TXDIS清除發(fā)送和接收計數(shù)寄存器。US_TCR=0US_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 /*無奇偶校驗*/#define US_CHRL_8

9、0xC0 /*數(shù)據(jù)位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設(shè)置發(fā)送時間確保寄存器US_TTGR。US_TTGR=0使能接收器和發(fā)送器。#define US_TXEN 0x0040#define US_RXEN 0x0010US_CR=US_RXEN|US_TXEN屏蔽所有USART中斷。US_IDR=0xFFFFFFFF最好在這里插入一個延時循環(huán),保證初始化工作

10、的順利工作。For(i=0;i<=10;i+);為了讓讀者更清楚理解以上個寄存器的來源,這里以USART0各寄存器的定義為例:/USART的各個寄存器typedef volatile unsigned int at91_reg;typedef structat91_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)寄存器*/a

11、t91_reg US_RHR ; /*接收保持寄存器*/at91_reg US_THR ; /*發(fā)送保持寄存器*/at91_reg US_BRGR ; /*波特率產(chǎn)生寄存器*/at91_reg US_TTOR ; /*接收超時寄存器*/at91_reg US_TTGR ; /*發(fā)送器時間確保寄存器*at91_reg Reserved ;at91_reg US_RPR ; /*接收指針寄存器*/at91_reg US_RCR ; /*接收計數(shù)寄存器*/at91_reg US_TPR ; /*發(fā)送指針寄存器*/at91_reg US_TCR; /*發(fā)送計數(shù)寄存器*/StructUSART;#def

12、ine USART0_BASE (StructUSART*)0xFFFD0000)3.2 通過串口接收數(shù)據(jù)#define US_RXRDY 0x1While(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 0x2while(US_CSR & US_TXRDY)=0)/*等待US_THR(發(fā)送保持寄存器)送出字符*/US_THR=char

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

14、,可作為延時結(jié)束的標志。3.5 設(shè)置自動引導(dǎo)命令A(yù)rmboot在開始會有幾秒的延時,讓你選擇是否自動引導(dǎo)。如果不自動引導(dǎo),則可通過console,敲入命令,手工引導(dǎo)。自動引導(dǎo)采用的命令來源于環(huán)境變量。環(huán)境變量是由一些以“0”結(jié)束的形如“name=value”的字符串所組成的序列,整個序列以兩個“0”結(jié)束。環(huán)境變量存儲于結(jié)構(gòu)env_t的data數(shù)組中。有3處可以存放環(huán)境變量,一是SDRAM,在env_init(&bd)(中完成初始化;二是Flash。這里定義放在第三個扇區(qū),即#define CFG_ENV_ADDR(PHYS_FLASH_1+0x20000)/*環(huán)境變量扇區(qū)地址*/env

15、_t*env=(env_t*)CFG_ENV_ADDR。三是default_environment。Default_environment是一個定義好的全局數(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。由于筆者并

16、不打算讓Armboot自動執(zhí)行任何命令,所以,將CONFIG_BOOTCOMMAND置空。4 Flash編程到此為止,Armboot基本上可以說能夠在板子上運行了。一些和板子無關(guān)的命令已經(jīng)可以運行,比如查看內(nèi)存md;下載binary文件loadb(使用kermit模式/協(xié)議)等等。也有些命令依然還不能運行,它們根據(jù)具體的目標板有不同的代碼。比如loads、erase等。這里我們以Flash編程為例,實現(xiàn)erase命令。Loads中也需要調(diào)用和Flash有關(guān)的函數(shù)。以下的編程是針對Fujitsu MBM29LV160TE的。不同的Flash,命令序列和命令地址都可能不同。4.1 Flash擦除F

17、lash的擦除是按照扇區(qū)來擦除的,扇區(qū)的大小由具體的Flash規(guī)定。EV40使用的Flash是Fujitsu MBM29LV160TE。它規(guī)定,一個存儲體上有35個扇區(qū)s0s34;s0s30大小為64KB(0x10000),s31大小為32KB,s32s33大小為8KB,s34大小為16KB。具體實現(xiàn)6個命令序列:typedef volatile unsigned short flash_word;#define CFG_FLASH_BASE 0x100000flash_word *flash_address=CFG_FLASH_BASE,*s_address;s_address=擦除扇區(qū)的起

18、始地址;*(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ū)的擦除需要時間,擦除成功的標志是*s_address=0xFFFFwhile(*s_address!=0xFFFF)&&(i+<1000000);/*若超過if(i>=1000000)return ERR_TIMOUT;4.2 Flash寫入寫入以字(2字節(jié))為單位,地址要字對齊。具體實現(xiàn)為4個命令序列:s_sddress=寫入處的起始地址(偶地址);*(flash_address+0x555)=0xAA; /*命令1*/*(flash_address+0x2AA)=0x55; /*命令2*/*(flash_address+0x555)=0xA0; /*命令3*/*s_address=data; /*命令4;data為欲寫入數(shù)據(jù),

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論