- 論壇徽章:
- 0
|
相信做此工作的都對板子和u-boot有一定的理解,廢話省略。寫這個筆記以記錄這段時間研究這個東西的一些心得,供以后參考。這個文檔很不完善,畫的圖也變形了,郁悶!當(dāng)然我工作也還沒有結(jié)束,隨著更深入的工作我會慢慢完善這個筆記。分析的方式我參考以前閱讀的一位以pxa270目標(biāo)平臺的文獻(xiàn)資料,但具體位置已不記得了,在此說明。
首先,u-boot已經(jīng)提供了對davinci處理器的支持,目前1.3.3版本中有三個davinci目標(biāo)板子,分別為:TI的dv-evm,另外兩個schmoogie和sonata我也不大清楚是哪個公司的產(chǎn)品,總之我沒有見過更沒有用過。
板子概況:
處理器:Davinci DM6446(ARM926EJS + DSP64X+)
SDRAM:MT47H64M16BT 256M
NAND FLASH:K9F1208
網(wǎng)卡:BCM5221
下載u-boot-1.3.3.tar.bz2,解壓后
修改頂極的Makefile,添加自己交叉編譯器的名稱,當(dāng)然首先要導(dǎo)出該交叉編譯工具鏈的環(huán)境變量。
板子的名稱在該Makefile中已有,所以直接使用。
在/board/davinci/dv-evm目錄下即為目標(biāo)板子的相關(guān)代碼文件。
CPU相關(guān)的代碼在/cpu/arm926ejs以及/cpu/arm926ejs/davinci目錄
在/include/configs/目錄下有板子相關(guān)的定義文件davinci_dvevm.h,對著自己板子的具體情況修改就是。
做完這些工作,現(xiàn)測試一下,看是不是修改的能夠通過:
#make davinci_dvevm_config
#make
通過,表明前期工作正常。
開始深入u-boot研究。
涉及到的目錄和文件列表為:
啟動第一階段(stage 1,主要為匯編語言):
1、/cpu/arm926ejs/start.S
2、/board/davinci/dv-evm/u-boot.lds
3、/cpu/arm926ejs/davinci/lowlevel_init.S
4、/include/asm-arm/arch-davinci/
5、/include/configs/davinci/davinci_dvevm.h
6、/board/davinci/da-evm/config.mk
啟動第二階段(stage 2,主要為C語言):
1、/lib_arm/board.c
2、/board/davinci/dv-evm/dv_board.c
通過查看/board/davinci/dv-evm/u-boot.lds可知,u-boot入口函數(shù)為_start,該函數(shù)定義于/cpu/arm926ejs/start.S文件
.globl _start
_start:
b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq
在ARM體系結(jié)構(gòu)中,0x0為異常向量表地址,上電執(zhí)行的第一條指令是跳轉(zhuǎn)到reset復(fù)位處理程序;
reset:
/*
* set the cpu to SVC32 mode
*/
//note:Bootloader中沒有必要支持中斷的實現(xiàn),這屬于內(nèi)核機(jī)制以及設(shè)備驅(qū)動管理的管理范疇;SVC模式是系統(tǒng)的一種保護(hù)模式,這樣就可以進(jìn)行一些只能在SVC模式下的操作,例如一些特定寄存器訪問操作。
mrs r0,cpsr
bic r0,r0,#0x1f
orr r0,r0,#0xd3
msr cpsr,r0
/*
* we do sys-critical inits only at reboot,
* not when booting from ram!
*/
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_crit
#endif
一般情況下,不定義CONFIG_SKIP_LOWLEVEL_INIT,那么接下來跳轉(zhuǎn)到cpu_init_crit處執(zhí)行,
cpu_init_crit:
/*
* flush v4 I/D caches
*/
mov r0, #0
mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */
mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */
/*
* disable MMU stuff and caches
*/
//note:MMU必須關(guān)閉,原因為Bootloader中所有對地址的操作都是使用物理地址,是實在的實地址,不存在虛擬地址,因此MMU必須關(guān)閉。
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, #0x00002300 /* clear bits 13, 9:8 (--V- --RS) */
bic r0, r0, #0x00000087 /* clear bits 7, 2:0 (B--- -CAM) */
orr r0, r0, #0x00000002 /* set bit 2 (A) Align */
orr r0, r0, #0x00001000 /* set bit 12 (I) I-Cache */
mcr p15, 0, r0, c1, c0, 0
//note:數(shù)據(jù)cache必須關(guān)閉;原因為Bootloader主要是裝載內(nèi)核鏡像,鏡像數(shù)據(jù)必須真實寫回SDRAM中,所以數(shù)據(jù)cache必須關(guān)閉;
指令cache可以關(guān)閉也可以開啟;對于指令cache,不存在強(qiáng)制性的規(guī)定,但是一般情況下,推薦關(guān)閉指令 cache。
/*
* Go setup Memory and board specific bits prior to relocation.
*/
mov ip, lr /* perserve link reg across call */
bl lowlevel_init /* go setup pll,mux,memory */
mov lr, ip /* restore link */
mov pc, lr /* back to my caller */
如上描述,程序跟著進(jìn)入lowlevel_init執(zhí)行,該函數(shù)定義于/cpu/arm926ejs/davinci/lowlevel_init.S
此函數(shù)主要用來初始化各種寄存器,各種寄存器定義可以參閱TMS320DM6446 Digital Media System-on-Chip手冊。
其中,寄存器在/include/asm-arm/arch-davinci/中定義,當(dāng)然該目錄下一些數(shù)據(jù)類型的定義還要參閱/include/asm-arm/arch-arm926ejs/sizes.h
寄存器的初始值定義于/include/configs/davinci/davinci_dvevm.h.
按照程序的執(zhí)行流程,從cpu_init_crit執(zhí)行完畢后返回,緊接著執(zhí)行relocate:
relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0 |---------------------------------| -------------|
| ...... | |
|---------------------------------| SDRAM
| | |
| GLB_DATA_SIZE | Flash
| | |
| u-boot image | |
|---------------------------------|
start_armboot函數(shù)定義于/lib_arm/board.c.
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u/27691/showart_1005629.html |
|