日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 嵌入式 > 嵌入式軟件
[導讀]Armboot在EV40評估板上的移植

摘要:介紹Armboot以及EV40評估板的特點;詳細討論Armboot在EV40上的移植并給出主要代碼;以Flash編程為例,介紹與評估板相關Armboot命令的實現(xiàn)。

   關鍵詞:Armboot AT91M40800 ARM 移植

1 Armboot簡介

Armboot是一個bootloader,是為基于ARM或者StrongARM CPU的嵌入式系統(tǒng)所設計的。它支持多種類型的Flash;允許映像文件經(jīng)由bootp、dhcp、tftp從網(wǎng)絡傳輸;支持從串口線下載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為硬件基礎的嵌入式系統(tǒng)。EV40評估板包括一個AT91X40系列的微控制器AT91M40800以及一些外圍器件。

主要的外圍部分包括:2個串口、1個復位按鈕、3個應用按鍵、3個LED指示燈、1個7段LED顯示器、512KB以太網(wǎng)接口、USB接口、PC104接口、EBI擴展接口、I/O擴展接口、時鐘源選擇、觸摸板接口和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 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

這部分的作用相當于borad$board.s。用來初始化EBI的各個寄存器。

接下來是串口的初始化。這部分比較重要,作用是實現(xiàn)主機與目標板的通信,從而在超級終端(console)上提供用戶接口。

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

①計算時鐘分頻數(shù)CD,公式為:

異步模式

CD=選擇的時鐘/16×波特率(結(jié)果四舍五入)

同步模式

CD=選擇的時候/波特率(CD必須為偶數(shù))

CD將作US_BRGR(波特率發(fā)生寄存器)的值。

②設置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數(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ā)送器。這是通過設置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ā)送和接收計數(shù)寄存器。

US_TCR=0

US_RCR=0

⑥設置波特率產(chǎn)生寄存器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 /*數(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

⑧設置發(fā)送時間確保寄存器US_TTGR。

US_TTGR=0

⑨使能接收器和發(fā)送器。

#define US_TXEN 0x0040

#define US_RXEN 0x0010

US_CR=US_RXEN|US_TXEN

⑩屏蔽所有USART中斷。

US_IDR=0xFFFFFFFF

⑾最好在這里插入一個延時循環(huán),保證初始化工作的順利工作。

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 ; /*通道狀態(tài)寄存器*/

at91_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;

#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

/*當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ù)器復位,時鐘啟動;當計數(shù)器值到這TC_RC時,會發(fā)生RC比較,導致TC_SR(狀態(tài)寄存器)的CPCS位(0x10)置位。由此可見,適當設置TC_RC寄存器的值,可以產(chǎn)生不同長短的延時;通過判斷CPCS位,可作為延時結(jié)束的標志。

3.5 設置自動引導命令

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

自動引導采用的命令來源于環(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_t*env=(env_t*)CFG_ENV_ADDR。

三是default_environment。Default_environment是一個定義好的全局數(shù)組,作用相當于env_t中的data。

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

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

4 Flash編程

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

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

4.1 Flash擦除

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

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

具體實現(xiàn)6個命令序列:

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ū)的擦除需要時間,擦除成功的標志是*s_address==0xFFFF

while((*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ù),要求是flash_word類型*/

//扇區(qū)的寫入需要時間,寫入成功的標志是*s_address==data

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

//*若超時

if(i>=100000){

return ERR_TIMOUT;

}

結(jié)語

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

本站聲明: 本文章由作者或相關機構(gòu)授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅(qū)動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅(qū)動性能的關鍵。

關鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質(zhì)量和效率直接關系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅(qū)動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關鍵字: LED 驅(qū)動電源 開關電源

LED驅(qū)動電源是把電源供應轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅(qū)動電源
關閉