文章一:概略介紹
U-Boot 到blackfin的移植
如板子名farsight-533
步驟一:
總的Makefile文件中添加自己board
總Makefile文件中:
我們添加:
farsight-533_config : unconfig
@./mkconfig $(@:_config=) blackfin bf533 farsight-533
josh@ubuntu:~$ touch include/configs/farsight-533.h
步驟三:Board Directory
建立目錄:borad/farsight-533/
Makefile - list all files to generate
config.mk - custom compiler flags
farsight-533.c - a C file named exactly the same as your board
u-boot.lds - the U-Boot linker script
1) Board C File: farsight-533.c
這里面需要實(shí)現(xiàn)幾個應(yīng)該實(shí)現(xiàn)的函數(shù)。
用來在初始化driver之前檢查板級相關(guān)的細(xì)節(jié)信息,通常僅僅打印出你板子的標(biāo)識信息(banner)。 返回0 - 成功 返回非0 - 失敗
int checkboard(void)
{
printf("Board: farsight-533 board\n");
printf(" Support: http://www./\n");
return 0;
}
initdram()
任何板級的內(nèi)存初始化應(yīng)該在這里進(jìn)行。
由于公用的blackfin cpu的代碼將基于你的board configuation setting來初始化on-chip external memory controller, 因此實(shí)際上這里沒有太多的事情要做了。很可能你的函數(shù)只需要描述你有多少外部存儲,下面是個可以copy-paste來用的例子:
long int initdram(int board_type)
{
DECLARE_GLOBAL_DATA_PTR;
gd->bd->bi_memstart = CFG_SDRAM_BASE;
gd->bd->bi_memsize = CFG_MAX_RAM_SIZE;
return CFG_MAX_RAM_SIZE;
}
如果你的MAC沒有專門的EEPROM來存儲MAC地址,并且你沒有在你的board configuration file中硬編碼MAC地址,那么你必須實(shí)現(xiàn)這個函數(shù)。
如果你的MAC地址有專門的EEPROM來保存MAC地址,那么U-boot driver將為你代勞。你不必實(shí)現(xiàn)
下面這個例子是為MAC硬編碼MAC地址:
int board_get_enetaddr(uchar *mac_addr)
{
uchar *board_mac_addr = (uchar *)0x203F0000;
memcpy(mac_addr, board_mac_addr, 6);
return 0;
}
這個函數(shù)是可選的。用來在軟件重啟前對硬件做點(diǎn)額外的事情
void board_reset(void)
{
/* do something weird */
}
misc_init_r() : miscellaneous board initialization
其他的板級初始化函數(shù)
你需要在你的board configuration file中定義CONFIG_MISC_INIT_R這個宏
#if defined(CONFIG_MISC_INIT_R)
int misc_init_r(void)
{
/* do random stuff */
}
#endif
文章二:基于 華恒科技開發(fā)板 的移植
本文介紹的移植過程基于華恒科技提供的軟件包(用于HHBF531-StartKIT-R1開發(fā)板)。我
們的硬件平臺是:
CPU:BF533
FLASH:S29AL004D-512KB
SDRAM:HY57V281620-16MB
下面我們分成以下幾個步驟進(jìn)行介紹:
一, 建立交叉編譯開發(fā)環(huán)境:
1, 安裝(虛擬)linux系統(tǒng):
移植uclinux要在linux系統(tǒng)環(huán)境下交叉編譯,所以需要一個linux系統(tǒng)??梢园惭b一個
完整的linux操作系統(tǒng),也可以在windows系統(tǒng)下利用虛擬軟件運(yùn)行l(wèi)inux系統(tǒng)。本人不習(xí)慣
使用linux操作系統(tǒng),所以在windows環(huán)境下安裝了一個虛擬linux——colinux。本人下載
的colinux安裝包是colinux_installer_v0.95.zip ,安裝包內(nèi)包含blackfin交叉編譯工具
鏈,利用此工具包安裝的虛擬linux系統(tǒng)內(nèi)已經(jīng)帶有blackfin交叉編譯工具鏈,下載地址為
:http://blackfin./gf/project/bfin-colinux/frs/。
安裝colinux的方法很簡單,和一般的windows軟件安裝相同,全部采用默認(rèn)值即可。唯一
要注意的是,要保證安裝盤(比如說c盤)有足夠的空間(大約需要3.5GB)。
安裝成功后,點(diǎn)擊你桌面上的blackfin-colinux圖標(biāo)就可以運(yùn)行colinux了。Colinux默認(rèn)
已經(jīng)建立兩個用戶:root和uclinux,密碼均為bf533。查看linux根目錄下有沒有/opt/uC
linux/bfin-elf、/opt/uClinux/bfin-linux-uclibc、/opt/uClinux/bfin-uclinux三個目
錄,有的話blackfin交叉工具鏈已經(jīng)安裝成功,但不一定適用于本文的源碼編譯;因?yàn)槟?br>些變量定義不一致可能導(dǎo)致華恒提供的源碼編譯錯誤,所以要使用華恒提供的軟件包附帶
的交叉編譯工具鏈。
更多資料參見:http://blackfin./。
2, 安裝blackfin交叉編譯工具鏈:
解壓華恒軟件包HHBF531-R1-v1.0.0-070327.tgz:
#tar jxvf HHBF531-R1-v1.0.0-070327.tgz
生成HHBF531-R1文件夾,內(nèi)包含交叉編譯工具鏈、uboot源碼包、uclinux源碼包、jtag工
具和源碼鏡像。
進(jìn)入交叉編譯工具鏈目錄:
#cd HHBF531-R1/toolchains
交叉編譯工具鏈?zhǔn)且粋€tgz壓縮包gcc-bfin-3.4.tgz,包含的用于交叉編譯的可執(zhí)行文件,
直接解壓到相應(yīng)目錄即可以使用,無需安裝。
#tar jxvf gcc-bfin-3.4.tgz /usr/local/
設(shè)置編譯工具目錄:
#PATH=”/usr/local/gcc-bfin-3.4-uclinux/bin:$PATH”
這樣,交叉編譯環(huán)境就建立好了。開始華恒提供的源碼吧,看看你的環(huán)境是否建立正確!
如果出現(xiàn)錯誤,仔細(xì)檢查以上過程。
二, 移植u-boot:
uclinux啟動離不開引導(dǎo)程序,這個引導(dǎo)程序叫作bootloader。Bootloader是在操作系統(tǒng)運(yùn)
行之前執(zhí)行的一段小程序。通過這段小程序,我們可以初始化硬件設(shè)備、建立內(nèi)存空間的
映射表,從而建立適當(dāng)?shù)南到y(tǒng)軟硬件環(huán)境,為最終調(diào)用操作系統(tǒng)內(nèi)核做好準(zhǔn)備。
U-Boot是一種通用的Bootloader,可以方便地移植到各種硬件平臺上。
華恒提供的u-boot在HHBF531-R1/u-boot目錄下,支持blackfin系列DSP和常用開發(fā)板。
我們這里把U-Boot的移植分成兩個部分。第一部分是為我們的新開發(fā)板在目錄/board/下建
立一個新目錄,并拷貝最類似的開發(fā)板源碼到該目錄,做一些配置修改,對我們的新開發(fā)
板進(jìn)行配置并編譯通過;第二部分是針對我們的新開發(fā)板的特點(diǎn)修改相關(guān)源碼文件的內(nèi)容
,使其能在我們的新開發(fā)板上運(yùn)行。
1, 第一部分:
我們的新開發(fā)板基于BF533,與U-Boot中的hhbf開發(fā)板最類似,我們以hhbf開發(fā)板為模板修
改得到我們新開發(fā)板的移植代碼。
進(jìn)入u-boot目錄:
#cd HHBF531-R1/u-boot
注意要讓uclinux用戶用于讀寫操作的權(quán)限,否則下面操作時報“Permition denied.”錯
誤。簡單點(diǎn),我們直接用root用戶登陸。
進(jìn)入開發(fā)板目錄,建立對應(yīng)于我們開發(fā)板的文件目錄,這里命名為naribf533。
#cd board
#cp –R hhbf naribf533
#cd naribf533
#mv hhbf.c naribf533.c(修改文件名)
刪除不需要的文件:
#mv –r hhbf*
#mv psd4256.h
這樣我們新開發(fā)板的文件目錄和文件都有了(現(xiàn)在還不能在我們開發(fā)板上運(yùn)行)。然后修
改naribf533目錄下的Makefile和u-boot.lds,把其中的hhbf全部修改為naribf533,后面
編譯過程中如果報找不到hhbf的錯誤也把相應(yīng)的hhbf改為naribf533。
再加入一個頭文件:
#cd include/configs
#cp hhbf.h naribf533.h
這個頭文件中有很多內(nèi)容要修改,我們將在第二部分中予以修改。
修改頂層目錄下的Makefile,找到以下內(nèi)容:
hhbf533_config : unconfig
@ > include/config.h
@echo “#define CONFIG_HHBF 1” >> include/config.h
@echo “#define CONFIG_BF533 1” >> include/config.h
@./mkconfig –a $(@:_config=) blackfin bf533 hhbf533 #hhtech
模仿上述語句,在下面增加以下內(nèi)容:
naribf533_config : unconfig
@ > include/config.h
@echo “#define CONFIG_HHBF 1” >> include/config.h
@echo “#define CONFIG_BF533 1” >> include/config.h
@./mkconfig –a $(@:_config=) blackfin bf533 naribf533
切記在“@./mkconfig –a $(@:_config=) blackfin bf533 naribf533”前面的是Tab來的
,萬萬不能用空格代替,因?yàn)樗强窟@個來識別命令的!
最后編譯u-boot,
#make distclean
#make naribf533_config(就是在Makefile里添加的config)
#make
看看有沒有錯,有錯的話按著提示來改,如果沒錯的話應(yīng)該就能生成u-boot.bin這個文件
。現(xiàn)在還不能使用,因?yàn)檫@只是hhbf的一個仿制品而已。
編譯正確生成u-boot.bin文件,這一部分就算完成了。下面我們嘗試修改相應(yīng)的源代碼。
2, 第二部分:
該部分主要是修改開發(fā)板配置文件以及flash驅(qū)動。
我們先來修改開發(fā)板配置文件,讓u-boot能運(yùn)行起來。修改的主要內(nèi)容包括:串口設(shè)置、
時鐘設(shè)置、flash設(shè)置和SDRAM設(shè)置。我們的開發(fā)板上目前還沒有網(wǎng)絡(luò)功能,先不設(shè)置該內(nèi)
容。
將以下設(shè)置替換原開發(fā)板配置文件相應(yīng)部分即可。
串口設(shè)置,將波特率設(shè)置為115200。
#define CONFIG_BAUDRATE 115200
時鐘設(shè)置,根據(jù)開發(fā)板晶振頻率和系統(tǒng)需要的工作頻率設(shè)置,我們開發(fā)板的晶振為27MHz,
內(nèi)核時鐘為輸入時鐘的22倍頻,系統(tǒng)時鐘為內(nèi)核時鐘的5分頻,所以如下設(shè)置。
#ifdef CONFIG_BF533
#define CONFIG_CLKIN_HZ 27000000
#endif//CONFIG_BF533
#ifdef CONFIG_BF561
#define CONFIG_CLKIN_HZ 33000000
#endif//CONFIG_BF561
/* CONFIG_CLKIN_HALF controls what is passed to PLL 0=CLKIN */
/* 1=CLKIN/2 */
#define CONFIG_CLKIN_HALF 0
/* CONFIG_PLL_BYPASS controls if the PLL is used 0=don't bypass */
/* 1=bypass PLL */
#define CONFIG_PLL_BYPASS 0
/* CONFIG_VCO_MULT controls what the multiplier of the PLL is. */
/* Values can range from 1-64 */
#ifdef CONFIG_BF533
#define CONFIG_VCO_MULT 12
#endif//CONFIG_BF533
#ifdef CONFIG_BF561
#define CONFIG_VCO_MULT 10
#endif//CONFIG_BF561
/* CONFIG_CCLK_DIV controls what the core clock divider is */
/* Values can be 1, 2, 4, or 8 ONLY */
#define CONFIG_CCLK_DIV 1
/* CONFIG_SPI_BAUD controls the SPI peripheral clock divider */
/* Values can range from 2-65535 */
/* SCK Frequency = SCLK / (2 * CONFIG_SPI_BAUD) */
#define CONFIG_SPI_BAUD 2
/* CONFIG_SCLK_DIV controls what the peripheral clock divider is */
/* Values can range from 1-15 */
#define CONFIG_SCLK_DIV 4
flash設(shè)置,根據(jù)你的開發(fā)板flash容量和起始地址定制,我們的開發(fā)板flash容量為512KB
,起始地址為0x20000000。
#ifdef CONFIG_BF533
#define CFG_MAX_FLASH_BANKS 1 //flash只有一段
#define CFG_MAX_FLASH_SECT 11 //flash一共有11個sector
#endif//CONFIG_BF533
#ifdef CONFIG_BF533
#define CFG_ENV_ADDR 0x20020000
#define CFG_ENV_SECT_SIZE 0x10000
#endif//CONFIG_BF533
#ifdef CONFIG_BF533
#define FLASH_SIZE 0x80000
#define CFG_FLASH_SIZE 0x80000 //容量為512KB
#endif//CONFIG_BF533
SDRAM設(shè)置,根據(jù)你的開發(fā)板SDRAM容量和起始地址定制,我們的開發(fā)板SDRAM容量為16MB,
列地址寬度為9,起始地址為0x00000000。
#define CFG_LARGE_IMAGE_LEN 0x1000000 /* Large Image Length */
#ifdef CONFIG_BF533
#define CONFIG_MEM_SIZE 16 /* 128, 64, 32, 16 */
#endif//CONFIG_BF533
#define CONFIG_MEM_ADD_WDTH 9 /* 8, 9, 10, 11 */
#define CFG_MEMTEST_START 0x00100000 /* memtest works on */
#define CFG_MEMTEST_END 0x00f00000 /* 1..15 MB in DRAM */
#define CFG_SDRAM_BASE 0x00000000
#ifdef CONFIG_BF533
#define CFG_MAX_RAM_SIZE 0x01000000
#endif//CONFIG_BF533
如上設(shè)置后,重新編譯u-boot,發(fā)現(xiàn)出現(xiàn)錯誤#error "CFG_MONITOR_BASE != TEXT_BASE"
,原因是TEXT_BASE設(shè)置值與配置文件不一致,主要是由于我們修改了SDRAM的容量。到b
oard/naribf533目錄下修改config.mk文件,將TEXT_BASE的地址修改為0x0fc0000。接下來
編譯應(yīng)該沒有任何錯誤了。
編譯生成的u-boot.bin下載到開發(fā)板即可以運(yùn)行了,應(yīng)該能看到串口返回的u-boot成功運(yùn)
行的信息。這樣第一步修改就完成了。
在上面看到的u-boot運(yùn)行信息里,你會發(fā)現(xiàn)有很多關(guān)于華恒的信息,可能你很不愿意顯示
這些內(nèi)容。這是因?yàn)槟氵€沒有修改flash驅(qū)動,里面顯示的還是華恒提供的flash驅(qū)動顯示
的內(nèi)容。而且此時還不能下載uclinux鏡像,因?yàn)槿A恒提供的flash驅(qū)動不一定適合你的開
發(fā)板,不能對你的開發(fā)板flash進(jìn)行寫操作。所以,我們接下來修改flash驅(qū)動。
flash驅(qū)動對應(yīng)的文件是board/naribf533/flash.c,它主要包括以下幾個函數(shù):
unsigned long flash_init (void ),F(xiàn)lash初始化;
void flash_print_info (flash_info_t *info),打印Flash信息;
int flash_erase (flash_info_t *info, int s_first, int s_last),F(xiàn)lash擦除
;
volatile static int write_dword (flash_info_t *info, ulong dest, ulong d
ata),F(xiàn)lash寫入;
int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt),
從內(nèi)存復(fù)制數(shù)據(jù)。
Flash驅(qū)動修改要根據(jù)你使用的flash特性進(jìn)行,參考flash的文檔。主要修改內(nèi)容包括:f
lash操作命令、flash扇區(qū)分配和一些打印信息。
另外,還有SDRAM的配置。除了再(board).h文件中的配置以外,如果你使用的SDRAM的刷新
頻率不同于hhbf531學(xué)習(xí)板上使用的,還必須到include/asm-blackfin/mem_init.h文件中
去修改SDRAM_Tref和SDRAM_NRA兩個參數(shù)。
3, 測試U-boot:
如果以上修改內(nèi)容都做到了,編譯得到的u-boot應(yīng)該沒有什么問題了,但測試還是必要的
。
u-boot能正確打印啟動信息,不代表u-boot完全正確了,比如說flash不能正確擦寫、SDR
AM不能正確操作等問題都可能存在。這里分一下幾項(xiàng)內(nèi)容測試u-boot。
1)測試u-boot所有命令:
在u-boot的monitor下,鍵入help,會顯示u-boot支持的所有命令。依次測試各命令,檢查
是否正確。
2)測試flash驅(qū)動:
通過u-boot的loadb和go命令,下載一個可執(zhí)行程序到某個未使用的地址空間,檢查是否正
確運(yùn)行,以測試flash能否正確讀寫。
3)測試SDRAM:
SDRAM的測試往往被人忽略,其實(shí)該部分是很重要的,一旦錯誤可能給后面的內(nèi)核移植帶來
很多問題,本人就遇到這樣的問題。
測試SDRAM主要包括空間的連續(xù)性和是否有空間重疊現(xiàn)象。
連續(xù)性測試可以通過md命令,從低地址到高地址依次打印內(nèi)存信息,檢查打印的地址是否
連續(xù)。
內(nèi)存空間是否重疊可以通過對每MB空間寫入特定數(shù),檢查各MB空間的數(shù)據(jù)是否重復(fù),重復(fù)
則可能因?yàn)榭臻g重疊。
除以上測試內(nèi)容外,可能還有其他小問題,視情況另做測試。
通過以上測試后,你的u-boot基本就沒有問題了,可以放心地利用它下載運(yùn)行l(wèi)inux了。
U-Boot在基于ADSP BF533的嵌入式Linux系統(tǒng)上的移植
1 引言
Boot Loader(內(nèi)核引導(dǎo)程序)是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段自舉程序,用于初始化硬件設(shè)備、改變處理器運(yùn)行模式、重組中斷向量和建立內(nèi)存空間映射圖,從而將系統(tǒng)的軟硬件帶到一個合適的狀態(tài)或者用戶定制的特定狀態(tài),以便為最終加載操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境[1]。
嵌入式Linux系統(tǒng)常用的Boot Loader有arm-boot、redboot、U-Boot等。U-Boot (全稱Universal Boot Loader)是當(dāng)前比較流行的遵循GPL條件的開放源碼項(xiàng)目。U-Boot具有源碼公開的特點(diǎn),開發(fā)人員可根據(jù)自身需要進(jìn)行裁減;支持多種處理器和嵌入式操作系統(tǒng)內(nèi)核;具有多種設(shè)備驅(qū)動源碼:支持種引導(dǎo)方式;具有功能強(qiáng)大且成熟、穩(wěn)定等諸多優(yōu)點(diǎn),故在嵌入式系統(tǒng)開發(fā)過程中廣泛采用。U-Boot嚴(yán)重依賴于底層硬件,不同的CPU或嵌入式板極設(shè)備需要不同的U-Boot,因此,在嵌入式系統(tǒng)中建立通用的U-Boot是非常困難的,故U-Boot需針對開發(fā)板量身定做。
2 開發(fā)平臺
2.1 BF533簡介
Blackfin系列DSP是ADI公司與Intel聯(lián)合開發(fā)推出的第一款高性能、低功耗第四代定點(diǎn)DSP產(chǎn)品,融合了Analog Devices/Intel公司的微信號結(jié)構(gòu)(MSA)。它將一個32位RISC型指令集和雙16位乘法累加(MAC)信號處理功能與通用型微控制器所具有的易用性組合在一起。這種組合使Blackfin處理器能夠在信號處理和控制處理應(yīng)用中發(fā)揮最佳的性能。且Blackfin處理器通過將工業(yè)標(biāo)準(zhǔn)接口與高性能的信號處理內(nèi)核相結(jié)合在一起,用戶可以快速設(shè)計出節(jié)省成本的解決方案,而且無需昂貴的外部組件。
本開發(fā)系統(tǒng)采用BF533,BF533是主頻高達(dá)600 MHz、峰值處理能力為1.2 GMI/s的高性能Blackfin處理器。BF533內(nèi)核包含2個16位MAC、2個40位ALU、4個8位視頻ALU以及1個40位移位器。另外,BF533還包括1個UART口、1個SPI口、2個串行口(SPORT)、4個通用定時器(其中3個具有PWM功能)、1個實(shí)時時鐘、看門狗定時器以及1個并行外設(shè)接口。外部存儲器控制器可與SDRAM、SRAM、Flash和ROM實(shí)現(xiàn)無縫連接[2]。
2.2 系統(tǒng)硬件平臺簡介
本系統(tǒng)的開發(fā)板硬件系統(tǒng)如圖1所示。
目標(biāo)板以Blackfin嵌入式處理器為核心,數(shù)據(jù)地址線復(fù)用到SDRAM、Flash、USB、Ethernet,并通過FPGA實(shí)現(xiàn)邏輯控制。此外,將UART端口轉(zhuǎn)換為RS232端口引出。其中SDRAM的地址為0x00000000~0x02000000,F(xiàn)lash的地址為0x20000000~0x20300000。
宿主機(jī)采用Window和Suse10.0雙操作系統(tǒng),采用串行接口和以太網(wǎng)連接宿主機(jī)和目標(biāo)板,程序先在宿主機(jī)上編譯,然后下載至目標(biāo)板上運(yùn)行,目標(biāo)板的終端被重定向到串行接口,由宿主機(jī)輸出。
2.3 開發(fā)環(huán)境的建立
2.3.1 在宿主機(jī)上設(shè)置終端
大部分嵌入式系統(tǒng)在宿主機(jī)大多都采用kermit或minaicom實(shí)現(xiàn)與目標(biāo)板的通信,本系統(tǒng)采用inicom。minicom是Linux下一個類似于Windows超級終端的友好串口通信程序。在終端輸入bash#minicom-s進(jìn)入minicom設(shè)置畫面,設(shè)置串口波特率、有效數(shù)據(jù)位、停止位以及奇偶校驗(yàn)位分別為57 600、8 bit、1位停止位以及無奇偶校驗(yàn)位等。
2.3.2安裝交叉編譯器
交叉編譯是在一個架構(gòu)下編譯另外一個架構(gòu)的目標(biāo)文件。要從http://blackfin.網(wǎng)站上下載Blackfin ToolChain,然后安裝并修改環(huán)境變量PATH,使其包含ToolChain的安裝目錄。
3 U-Boot啟動兩階段
U-Boot代碼一般分為stage1和stage2兩大部分。stage1依賴于cpu體系結(jié)構(gòu)如設(shè)備初始化代碼,常用匯編語言編寫以達(dá)到短小精悍,提高系統(tǒng)運(yùn)行效率的目的。它主要包括cpu/bf533目錄下的start.s。stage2一般采用C語言編寫實(shí)現(xiàn)復(fù)雜功能,這樣代碼則具有更好的可讀性和可移植性,主要包括lib blackfin/board.c文件和common/main.c文件中main_loop函數(shù)。
stagel從cpu入口函數(shù)cpu/bf533/start.s開始,通常包含以下步驟:
(1)基本硬件的初始化,為隨后執(zhí)行kernel準(zhǔn)備好基本的硬件環(huán)境。包括:屏蔽所有中斷,引導(dǎo)裝載程序的執(zhí)行過程中不必執(zhí)行任何中斷,中斷屏蔽可通過寫cpu的中斷屏蔽寄存器或狀態(tài)寄存器實(shí)現(xiàn);設(shè)置cpu的速度和時鐘頻率,初始化pll;RAM初始化,初始化內(nèi)存控制器的各個寄存器;初始化UART,向串口打印U-Boot的字符信息;關(guān)閉cpu內(nèi)部指令,數(shù)據(jù)cache。
(2) 為加載U-Boot的stage2準(zhǔn)備RAM空間,通常將stage2置于整個RAM空間的最頂層1 MB空間。
(3)拷貝U-Boot的stage2到RAM。判斷是否是Flash運(yùn)行,如果是就將stage2的代碼拷貝到TEXT BASE處。將stage2安排到RAM空間的最頂層1 MB是較推薦的方法。
(4)設(shè)置堆棧指針sp為C語言代碼執(zhí)行做好準(zhǔn)備。
(5)跳轉(zhuǎn)到stage2的C語言代碼入口點(diǎn)。
stage2主要包括lib-blackfin/board.c中board_init_f、board_init_r函數(shù)以及common/main.C中main_loop函數(shù)。通常包含以下步驟:
(1)初始化此階段需用的硬件設(shè)備,由board_init_f和board_init_r函數(shù)實(shí)現(xiàn)。
(2)內(nèi)存映射檢測。
(3)加載內(nèi)核并為內(nèi)核設(shè)置啟動參數(shù)。
(4)調(diào)用內(nèi)核。
4 U-BOOt的移植
4.1 U-Boot方法與要點(diǎn)
移植U-Boot簡便的方法是從U-Boot支持的開發(fā)板中選擇一個與其目標(biāo)板接近的開發(fā)板進(jìn)行修改。需修改的是與硬件相關(guān)的部分,涉及到兩個層面:針對CPU的移植,由于U-Boot_1.1.3支持BF533,故只需做第二層面的移植:針對目標(biāo)板硬件的移植。在移植前,需仔細(xì)閱讀U-Boot/readme文件,該文件對目錄結(jié)構(gòu)和如何移植作了簡要介紹。從移植U-Boot的最小要求、U-Boot能夠正常啟動的角度出發(fā),選擇BF533的STAMP板為模板,相關(guān)源代碼在/board/stamp目錄下,結(jié)合U-Boot的啟動流程,主要修改文件如下:
(1)與目標(biāo)板相關(guān)的代碼部分:在board下創(chuàng)建mybf533目錄,無需從頭開始,參考與目標(biāo)板相似的STAMP板在mybf533目錄下創(chuàng)建mybf533.c、mybf533.h、flash.c、config.mk、Makefie等文件。需要修改/board/mybf533/config.mk:
TFEXT_BASE用于設(shè)置程序編譯鏈接的起始地址即將U-Boot的stage2拷貝到SDRAM的TEXT_BASE處,即SDRAM最頂層一段存儲區(qū)。修改board/mybf533/Makefile:
(2)與CPU相關(guān)的代碼部分:U-Boot_1.1.3/epu文件中含有BF533的目錄,其中包含start.s、cpu.c、cpu.h、interrupt.c、init_sdram.s等。故不需要建立與cpu相關(guān)的文件目錄。
(3)與頭文件相關(guān)的代碼:在include/configs創(chuàng)建mybf533.h,參考include/configs/stamp.h,如下:
Flash的修改與具體型號和容量有關(guān),修改過程中參考Flash擦除數(shù)據(jù)命令、特定寄存器的寫入地址以及扇區(qū)的大小和位置。
與SDRAM相關(guān)設(shè)置:
注意:最后一行要用Tab鍵開頭表示命令。其中blackfin表示CPU的種類.bf533是cpu bf533對應(yīng)的代碼目錄,mybf533是目標(biāo)板對應(yīng)的目錄。這樣可使用make mybf533_config配置自身的開發(fā)板。
其他修改視情況而定。如根據(jù)SDRAM大小修改cplb表,根據(jù)需要修改堆棧大小。如drivers/cfi_flash.c中flash_init()函數(shù),cpu/bf533/ints.c中init_IRQ()函數(shù)等。
修改完畢后就可以采用如以下命令編譯U-Boot:bash$>make clean,bash$>make mrproper,bash$>make mybf533_config,bash$>make。
編譯完后U-Boot_1.1.3生成U-Boot的二進(jìn)制文件U-Boot.bin(U-Boot.bin只能用于更新)。執(zhí)行bash$>bfin-uclinux-objcopy-I binary-Oihex U-Boot.bin,生成可在Windows下首次燒寫到Flash的十六進(jìn)制文件U-Boot.hex。
4.2 U-Boot的燒寫
第一次下載U-Boot到目標(biāo)板或者當(dāng)U-Boot不能正常啟動時。必須通過JTAG或者ADI ICE將U-Boot下載到目標(biāo)板。在此可將ADI公司的仿真器與Visual DSP++環(huán)境相連,通過Visual DSP++,在TOOLS-->Flash Programmer下執(zhí)行Flash驅(qū)動程序M25P64.dxe,選擇"Erase all"-->Load Flie燒寫U-Boot.hex文件到Flash中。
移植成功后,打開終端minicom復(fù)位開發(fā)板,若串口能輸出正確的啟動信息.則表明移植基本成功。啟動后,如果在設(shè)定的時間內(nèi),串口沒有接收到按鍵。U-Boot將自動加載操作系統(tǒng)內(nèi)核和文件系統(tǒng)。若設(shè)定時間內(nèi)串口接收到按鍵,則U-Boot停止自動加載,進(jìn)入命令行,可看到U-Boot的提示符"mybf533>",查看Flash信息,調(diào)試或手動加載內(nèi)核。
生成新的U-Boot.bin文件后??赏ㄟ^Ethernet或者串口更新U-Boot。因?yàn)榫W(wǎng)絡(luò)的傳輸速度遠(yuǎn)比串口快,故一般選擇網(wǎng)絡(luò)傳輸。將新生成的U-Boot.bin拷貝到宿主機(jī)根目錄下的tftpboot目錄(前提是已經(jīng)創(chuàng)建tftp sever),在目標(biāo)板出現(xiàn)U-Boot提示符后。按任意鍵進(jìn)入下載模式:
mybf533>tftp 0x1000000 U-Boot.bin
0x1000000為SDRAM默認(rèn)的下載地址空間,用于U-Boot的升級、調(diào)試。當(dāng)需要升級或者修改U-Boot,可將新的U-Boot從SDRAM燒寫到。Flash,覆蓋原來的U-Boot,以減少燒寫Flash的次數(shù)。在燒寫以前最好測試一下所下載的U-Boot能否正常運(yùn)行:
如果不正確,應(yīng)重復(fù)執(zhí)行Erase all和Copy命令,直到正確為止。至此,U-Boot移植的步驟已基本完成。
5 結(jié)束語
U-Boot是一個功能強(qiáng)大的Boot loader。前期移植工作是嵌入式系統(tǒng)開發(fā)的首要環(huán)節(jié)。但其移植不可避免的存在一些難以預(yù)料的問題。嵌入式開發(fā)人員應(yīng)該在了解U-Boot的工作機(jī)理、移植條件后,根據(jù)目標(biāo)板和具體情況靈活裁減U-Boot以提高操作系統(tǒng)移植的穩(wěn)定性,縮短移植周期,降低產(chǎn)品成本。
本文結(jié)合U-Boot的運(yùn)行機(jī)理以及U-Boot移植的基本要求,研究了U-Boot在基于BF533的嵌入式系統(tǒng)上的移植。本文的移植是在不改變U-Boot框架前提下,對嵌入式目標(biāo)板和CPU相關(guān)代碼進(jìn)行修改,實(shí)現(xiàn)了成功移植且移植后的U-Boot能夠在目標(biāo)板上穩(wěn)定運(yùn)行,為后續(xù)開發(fā)奠定了良好的基礎(chǔ)。
基于Blackfin嵌入式系統(tǒng)的U-boot分析與調(diào)試
引言
Boot loader代碼是CPU芯片復(fù)位后進(jìn)入操作系統(tǒng)之前執(zhí)行的一段代碼,主要用于完成硬件啟動到操作系統(tǒng)啟動的過渡,從而為操作系統(tǒng)提供基本的運(yùn)行環(huán)境。Boot loader代碼與CPU的內(nèi)核結(jié)構(gòu)、具體型號、應(yīng)用系統(tǒng)配置及操作系統(tǒng)有關(guān),其功能類似于PC機(jī)的BIOS程序。
Blackfin DSP是美國模擬器件公司與Intel聯(lián)合開發(fā)的第4代DSP產(chǎn)品,是專為通信和互聯(lián)網(wǎng)應(yīng)用而設(shè)計的通用DSP芯片,適合處理互聯(lián)網(wǎng)中的大量圖像、聲音、文本和數(shù)據(jù)流,以及汽車電子中的可視系統(tǒng)、寬帶無線系統(tǒng)、消費(fèi)類多媒體電子、數(shù)字?jǐn)z像機(jī)、多通道VoIP、安全和監(jiān)督、機(jī)頂盒和視頻電話會議等。 本文對基于Blackfin 561微處理器構(gòu)建的嵌入式開發(fā)板EZKIT561的U-boot第一和第二階段的具體工作流程進(jìn)行了分析,畫出了各階段的流程圖,同時在U-boot第一階段代碼中加入LED指示程序來跟蹤第一階段的執(zhí)行情況;而在U-boot第二階段,則在代碼的相應(yīng)位置添加了向串口的打印信息,以跟蹤U-boot在此階段的執(zhí)行情況。
1 Blackfin DSP簡介
ADI公司推出的Blackfin處理器是專為嵌人式音頻、視頻、通信計算要求和功耗約束條件而設(shè)計的新型16~32位嵌入式處理器。Blackfin處理器由ADI和Intel聯(lián)合開發(fā),主要基于微信號架構(gòu)(MSA)。它將一個32位RISC型指令集和雙16位乘法累加(MAC)信號處理功能與通用型微控制器所具有的易用性組合在一起。這種處理特征使得Blackfin處理器在信號處理和控制處理應(yīng)用中均能發(fā)揮上佳作用,因而在許多場合可免除增設(shè)單獨(dú)異類處理器。
2 Boot loader及U-boot簡介
2.1 Boot loader簡介
Boot loader是用于初始化目標(biāo)板硬件,可給嵌入式操作系統(tǒng)提供板上硬件資源信息,并進(jìn)行裝載、引導(dǎo)嵌人式操作系統(tǒng)運(yùn)行的固件。最終,Boot Loader會把操作系統(tǒng)內(nèi)核映像加載到RAM中,并將系統(tǒng)控制權(quán)傳遞給它。
大多數(shù)Boot Loader都包含兩種不同的操作模式: "啟動加載"模式和"下載模式"。
啟動加載(Boot loading)模式也稱"自主"(Autonomous)模式。即Boot Loader從目標(biāo)機(jī)上的某個固態(tài)存儲設(shè)備上將操作系統(tǒng)加載到RAM中運(yùn)行。這種模式是Boot Loader的正常工作模式,因此在嵌入式產(chǎn)品發(fā)布的時侯,Boot Loader顯然必須工作在這種模式下。
在下載(Downloading)模式下,目標(biāo)機(jī)上的Boot Loader將通過串口連接或網(wǎng)絡(luò)連接等手段從主機(jī)(Host)下載內(nèi)核映像和根文件系統(tǒng)映像等。從主機(jī)下載的文件通常先被Boot Loader保存到目標(biāo)機(jī)的RAM,然后再被Boot Loader寫到目標(biāo)機(jī)的FLASH等固態(tài)存儲設(shè)備中。Boot Loader的這種模式通常在第一次安裝內(nèi)核與根文件系統(tǒng)時使用;此外,以后的系統(tǒng)更新也會使用Boot Loader的這種模式。工作于這種模式下的Boot Loader通常都會向它的終端用戶提供一個簡單的命令行接口。
2.2 U-boot簡介
U-Boot(全稱U niversal Boot Loader)是遵循GPL條款的開放源碼項(xiàng)目。其源碼目錄和編譯形式與Linux內(nèi)核相似。事實(shí)上,不少U-Boot源碼就是相應(yīng)的Linux內(nèi)核源程序的簡化,尤其是一些設(shè)備的驅(qū)動程序,這一點(diǎn)從U-Boot源碼的注釋中就能體現(xiàn)。目前支持的目標(biāo)操作系統(tǒng)有OpenBSD,NetBSD,F(xiàn)reeBSD,4.4BSD,Linux,SVR4,Esix,Solaris,Irix,VxWorks,LynxOS,pSOS,QNX,RTEMS,ARTOS;這是U-Boot中Universal的一層含義,另外一層含義是U-Boot除了支持PowerPC系列處理器外,還能支持Black-fin、MIPS、x86、ARM、NIOS、XScale等諸多處理器。上述兩個特點(diǎn)正是U-Boot項(xiàng)目的開發(fā)目標(biāo),即支持盡可能多的嵌入式處理器和嵌人式操作系統(tǒng)。U-Boot的主要目錄結(jié)構(gòu)如表1所列。
3 基于Blackfin DSP的U-boot運(yùn)行分析
大多數(shù)Boot loader都分為stagel和stage2兩大部分,U-boot也是如此。
3.1 U-boot的stagel階段
依賴于CPU體系結(jié)構(gòu)的代碼(比如設(shè)備初始化代碼等),通常都放在stage1中,該代碼可用blackfin DSP匯編語言來實(shí)現(xiàn),以達(dá)到短小精悍的目的。實(shí)際操作可在位于U-boot 1.1.3\cpu\bf533中的Start.S和Startl.S文件中實(shí)現(xiàn),而且是從Start.S開始運(yùn)行,此階段的程序流程圖如圖1所示。
stage1的步驟以執(zhí)行的先后主要包括硬件設(shè)備初始化、為加載Boot Loader的stage2準(zhǔn)備RAM空間、拷貝Boot Loader的stage2到RAM空間、設(shè)置堆棧、跳轉(zhuǎn)到stag2的C入口等。
3.2 U-boot的stage2階段
通常stage2可用C語言來實(shí)現(xiàn)更復(fù)雜的功能,該代碼具有更好的可讀性和可移植性。Stage2實(shí)現(xiàn)的主要功能包括初始化本階段要使用到的硬件設(shè)備,檢測系統(tǒng)內(nèi)存映射(memory map),將ker-nel映像和根文件系統(tǒng)映像從flash上讀到RAM空間中,為內(nèi)核設(shè)置啟動參數(shù),以及調(diào)用內(nèi)核等。
而基于ADSP-BF561 EZKIT-Lite評估板的U-boot在該階段的啟動時,首先在第一階段結(jié)束后,調(diào)用\U-boot 1.1.3\1ib_blackfin\board.c文件中的board_init_f()函數(shù)并執(zhí)行。
然后再調(diào)用board.c文件中的board_init_r()函數(shù)并按先后順序執(zhí)行,其流程圖如圖2所示。
之后,再在board_init_r函數(shù)的最后調(diào)用\U-boot 1.1.3\common\main.c中的main_loop()函數(shù)。在執(zhí)行過程中,系統(tǒng)會首先對自動啟動內(nèi)核進(jìn)行倒計時,倒計時的時間由環(huán)境變量bootdelay的設(shè)定值決定。由于先前已經(jīng)對串口進(jìn)行了初始化,所以會在windows超級終端打印"ezkit:>",這樣,mainloop()函數(shù)的執(zhí)行將產(chǎn)生兩條分支:一是等待u-boot的自啟動命令執(zhí)行,即執(zhí)行bootcmd環(huán)境變量所設(shè)定的自動運(yùn)行的命令(比如setenvbootcmd bootm 0x2000 0000),引導(dǎo)flash特定地址中的嵌入式操作系統(tǒng);二是在u-boot的自啟動命令執(zhí)行前按下任意鍵,以進(jìn)入u-boot的命令行。在此狀態(tài)下可以查看和修改環(huán)境變量、下載更新U-boot和內(nèi)核鏡像文件、對flash進(jìn)行擦寫操作或通過命令啟動操作系統(tǒng)(如bootm 0x2000 0000);
4 基于評估板的U-boot啟動跟蹤調(diào)試
4.1 第一階段跟蹤調(diào)試
由于U-boot的啟動過程分為兩個階段,第一階段在串口初始化之前無法獲得字符串提示信息。這樣,第一階段的運(yùn)行過程似乎就沒辦法掌握.但是,EZKIT561開發(fā)板提供16個用戶可編程的LED,所以就可以通過這16個LED來了解u-boot在第一階段的具體執(zhí)行過程,即在U-boot第一階段的幾個不同的代碼處添加LED指示程序。
ADSP-BF561有48個雙向通用可編程I/O引腳。這些可編程引腳具有實(shí)現(xiàn)SPI接口的特殊功能。每一個可編程引腳均能通過操作一系列的標(biāo)志控制寄存器、標(biāo)志狀態(tài)寄存器和標(biāo)志中斷寄存器來進(jìn)行獨(dú)立控制。由于一共有48個通用可編程I/O引腳,所以可將以上寄存器分成三組,每組可對16個通用可編程I/O引腳進(jìn)行操作。
通過參考EZKIT56 1原理圖可知,LED 5~20與PF 32~47 pins相連,可以跟蹤堆棧配置。設(shè)計時可使用以下寄存器進(jìn)行控制。
(1)FIO2_DIR寄存器
這是一個16位寄存器,若將其中的某一位設(shè)置為1,那么相應(yīng)的PF引腳就可作為輸出;反之,則為輸入。其相關(guān)設(shè)置代碼如下:
(2)FIO2_FLAG_D
這也是一個16位寄存器,對其寫操作時,可指定相應(yīng)的PF引腳狀態(tài);而當(dāng)進(jìn)行讀操作時,則返回相應(yīng)的PF引腳的值。它的每一位都控制著一個LED燈。其相關(guān)設(shè)置代碼如下:
w [p0]=r0;
ssync;
添加的跟蹤堆棧配置程序的流程圖如圖3所示。修改代碼后即可在U-boot文件夾路徑下依次輸入以下命令:make clean、make mrproper、make ezkit561 config和make,然后再利用bfin-u.clinux-objcopy將生成的U-boot.bin轉(zhuǎn)換為U-boot.hex,最后通過VDSP++開發(fā)環(huán)境中TOOL下的flashprogrammer將u-boot.hex燒寫到flash中,同時進(jìn)行復(fù)位操作以觀察LED的變化。
本設(shè)計希望在堆棧配置前使LED 13、LED 14亮,其它LED滅,持續(xù)時間為1 s;而在堆棧分配之后使LED 11、LED 12亮,其它LED滅,持續(xù)時間為1 s。其實(shí)際的觀察結(jié)果是,在復(fù)位之后,LED 13、LED 14持續(xù)亮1 s,接著LED 11、LED 12持續(xù)亮1秒,可見其完全達(dá)到了預(yù)期目標(biāo)。
4.2 第二階段跟蹤調(diào)試
第二階段是在進(jìn)人C函數(shù)之后,就進(jìn)行串口的初始化。之后,便可通過向串口打印信息來實(shí)時跟蹤所啟動的執(zhí)行流程,以了解程序目前執(zhí)行的具體部分或運(yùn)行到哪一個階段出現(xiàn)了問題。
下面以打印串口初始化完成信息為例。首先在U-boot第二階段找到串口初始化的代碼,即U-boot/lib-blackfin/board.c文件的serial.init()函數(shù),然后在此函數(shù)之后添加printf("serial initializationis ok!\n")以實(shí)現(xiàn)打印。其程序代碼如下:
修改代碼后的編譯和下載步驟如前所示,調(diào)試時使用的串行通信軟件是windows自帶的"超級終端"程序,所選擇的"每秒位數(shù)" (即波特率)為57600,傳輸文件使用的通信協(xié)議為Kermit協(xié)議。配置好超級終端后,按下開發(fā)板上的復(fù)位鍵.終端便可顯示出系統(tǒng)啟動過程的相關(guān)信息。系統(tǒng)復(fù)位后,第一行顯示的是"serial initializa-tion is ok!"。這便是自行添加的打印語句,其主要功能是提示串口初始化已完成。
由于第二階段可以通過串口打印信息,且在相關(guān)的每一階段均可添加相關(guān)的printf句來實(shí)現(xiàn)打印提示信息,所以跟蹤及調(diào)試都比較容易。
5 結(jié)束語
通過分析基于Blackfin 561微處理器構(gòu)建的嵌入式開發(fā)板EZKIT561的U-boot代碼,以期對Boot Loader的啟動過程有一個比較深入的理解,文章還通過一些調(diào)試方法對其運(yùn)行階段進(jìn)行跟蹤,以便對將來在開發(fā)板上的ucLinux移植和進(jìn)一步的視頻編解碼工作進(jìn)行準(zhǔn)備。
轉(zhuǎn)載于:https://www.cnblogs.com/intellisys/archive/2009/11/10/1599879.html