TI Davinci DM6441嵌入式Linux移植攻略——UBL移植篇
目錄(?)[+]
聲明:本文參考網(wǎng)友zjb_integrated的文章《TI?Davinci?DM6446開(kāi)發(fā)攻略——UBL移植》和《DAVINCI DM365-DM368開(kāi)發(fā)攻略——U-BOOT-2010.12及UBL的移植》,內(nèi)容有增刪,特此聲明!另有系列網(wǎng)文《DM365的UBL源碼分析》(作者不詳)對(duì)UBL源碼的分析比較透徹,有興趣的也可以看看。
一、DM6441的Boot過(guò)程簡(jiǎn)介
在搭好?TI Davinci DM6441的開(kāi)發(fā)環(huán)境后,今天起進(jìn)入Linux的移植階段。UBL的移植,相對(duì)于UBOOT移植、KERNEL移植、ROOTFS移植、設(shè)備驅(qū)動(dòng)及DSP開(kāi)發(fā)來(lái)說(shuō),還是比較簡(jiǎn)單的。先從DAVINCI的啟動(dòng)說(shuō)起,了解UBL在DAVIN系統(tǒng)中的位置和作用。對(duì)于固件程序燒寫在NAND FLASH 的Davinci dm644x嵌入式系統(tǒng), 上電啟動(dòng)的過(guò)程如下:
RBL(ARM ROM Boot Loader)在芯片出廠的時(shí)候就已經(jīng)燒寫到ROM里了,這不需要大家關(guān)心。上電后,RBL會(huì)自動(dòng)從EMIFA EM_CS2 memory space (0x0200 0000)執(zhí)行指令,這個(gè)地址就是NAND FLASH 或NOR FLASH的片選起始地址。當(dāng)你的系統(tǒng)設(shè)置為NAND BOOT的時(shí)候,UBL(User Boot Loader)是必不可少的,否則RBL不能直接把UBOOT給BOOT起來(lái),因?yàn)镽BL只支持14K NAND FLASH 的 BOOT程序,而UBOOT編譯出來(lái)后的bin文件一般都大于80K,特別是版本越高,UBOOT的代碼越大,所以這時(shí)候就需要寫一個(gè)UBL。
UBL 從NAND FLASH 讀取UBOOT,然后把UBOOT COPY 到 DDR2(RAM)的相關(guān)地址上,然后把UBOOT 給BOOT 起來(lái)。根據(jù)TI DAVIN RBL的規(guī)定,不同型號(hào)的NAND FLASH,UBL保存的地址是不同的,512字節(jié)PAGE 的NAND(即SMALL PAGE),保存的地址是:0x00004000;2048字節(jié)PAGE的NAND (即LARGE PAGE)保存的地址是:0x20000。
至于如何通過(guò)仿真器燒寫UBL或通過(guò)UART BOOT燒寫UBL,在U-BOOT移植的文章再詳細(xì)介紹。
PS:不要混淆UBL和U-Boot!
二、DM6441的UBL移植
其實(shí)UBL和U-Boot的聯(lián)系非常密切,放在這里單獨(dú)來(lái)寫,是因?yàn)楸救艘彩莻€(gè)菜鳥(niǎo),很多東西也不太懂,可以邊寫邊加深理解。 nand-boot和nor-boot其實(shí)在移植的層面來(lái)看,都差不多。根據(jù)目標(biāo)板的實(shí)際情況,重點(diǎn)放在nand-boot。這個(gè)UBL的版本是V1.50(當(dāng)然你可以用更高的V2.00,導(dǎo)師提供給我的也是2.00的,但我的開(kāi)發(fā)環(huán)境里是1.50的),在root/dvsdk_2_00_00_22/PSP_02_00_00_140/board_utilites/dm644x下(后面的U-Boot也在該目錄),有個(gè)文件DM644x_FlashAndBootUtils_1_50.tar.gz,為了方便,把它復(fù)制到/home/usrname并解壓出來(lái): host $ cp DM644x_FlashAndBootUtils_1_50.tar.gz /home/usrname host $ tar zxvf?DM644x_FlashAndBootUtils_1_50.tar.gz host $ cd?DM644x_FlashAndBootUtils_1_50 UBL就是在Common和DM644x下。 Common目錄里有非常多東西,包括UBL的驅(qū)動(dòng)源碼、工具、腳本等等。我們主要關(guān)注arch,drivers,src,ubl,這幾個(gè)文件夾打開(kāi)看看就明白什么意思了。UBL的main()函數(shù)在/Common/ubl/src/ubl.c里。DM644x下有CCS、Common,GNU三個(gè)文件夾:
CCS文件夾:
這里邊的程序需要在TI CCS下編譯,通過(guò)仿真器和JTAG在DM36X的板子上調(diào)試和燒寫NAND FLASH或NOR FLASH,有燒寫Writer的應(yīng)用程序,用CCS打開(kāi)工程文件,會(huì)連接到/dvsdk_2_00_00_22/PSP_02_00_00_140/board_utilites/Common/drivers里。暫且先不管。Common文件夾:
Common里有核心的文件device.c和device_nand.c。device.c是最重要的文件,這里初始化很多系統(tǒng)的東西,見(jiàn)DEVICE_init():1、屏蔽所有中斷;
2、清除中斷標(biāo)志;
3、DEVICE_PSCInit(),Power and Sleep Controller;
4、DEVICE_pinmuxControl(),主芯片管腳復(fù)用的設(shè)置,DM644X的管腳復(fù)用很多,很復(fù)雜,一共5個(gè)PINMUX寄存器需配置;
5、DEVICE_PLL1Init(),PPL1配置,使用不同的頻率的DM644x,這些值都不同,不過(guò)TI已經(jīng)提供參數(shù)參考,DM6441一般使用Uint32 PLL1_Mult = 19; ?// DSP=513 MHz
6、DEVICE_PLL2Init(),PPL2的配置,使用同上,不同頻率的值不同;使用不同型號(hào)的DDR,要設(shè)置不同的參數(shù),即時(shí)序參數(shù)等,這是關(guān)鍵的地方。
7、DEVICE_DDR2Init(),DDR2的配置,市場(chǎng)上不同的DDR2內(nèi)存芯片需要不同的參數(shù)配置,就在這個(gè)函數(shù)內(nèi)。
8、DEVICE_EMIFInit(),這個(gè)針對(duì)NAND FLASH接口或NOR FLASH接口的訪問(wèn)時(shí)序配置;
9、DEVICE_UART0Init(),串口UART0的配置,這個(gè)就是我們調(diào)試DM644X串口的設(shè)置,我們使用UART0來(lái)調(diào)試LINUX,這里配置不好,后面的開(kāi)發(fā)就無(wú)法調(diào)試了。 10、DEVICE_TIMER0Init(),定時(shí)器TIMER0的設(shè)置;
11、DEVICE_I2C0Init()的設(shè)置;
GNU文件夾:
這個(gè)就是在LINUX環(huán)境下編譯UBL的環(huán)境,修改dvsdk_2_00_00_22/PSP_02_00_00_140/board_utilites/dm644x/GNU/ubl下的makefile,把與nor相關(guān)的命令全注釋掉,只保留與nand相關(guān)的: all:$(MAKE) -C build TYPE=nand
# $(MAKE) -C build TYPE=nor
clean:
$(MAKE) -C build TYPE=nand clean
# $(MAKE) -C build TYPE=nor clean
%::
$(MAKE) -C build TYPE=nand $@
# $(MAKE) -C build TYPE=nor $@ 然后是make clean和 make生成ubl_DM644x_nand.bin的文件。
另外,在其它目錄還有一些重要的文件: nand.c及nand.h (DM644x_FlashAndBootUtils_1_50/Common/drivers) 主要移植就是定義好UBOOT在NAND的存儲(chǔ)地址,不同型號(hào)的NAND FLASH ,比如SMALL PAGE(512字節(jié))和LARGE PAGE(2048字節(jié))這些都要修改除非你的NAND的類型和TI EVM 兼容。
nandboot.c?(DM644x_FlashAndBootUtils_1_50/Common/ubl/src) 主要任務(wù)就是如何把u-boot.bin或帶有頭的u-boot.img正確COPY到DDR里,這里最容易出問(wèn)題,編譯出來(lái)的U-BOOT文件一般帶有Valid magic number(MAGIC_NUMBER_VALID),入口地址entrypaoit,這些信息不對(duì)都使UBOOT 運(yùn)行不起來(lái),建議看一下或COPY UBOOT的image.h。
好了,介紹到這里,我們已知道UBL的移植就是對(duì)device.c、device.h、device_nand.c、device_nand.h、nand.c、nand.h、nandboot.c及相應(yīng)的makefile文件進(jìn)行相應(yīng)的修改。相信已可以根據(jù)自己目標(biāo)板的實(shí)際情況進(jìn)行相應(yīng)移植了。下面正式開(kāi)始對(duì)板子進(jìn)行移植: 首先說(shuō)下板子的配置: CPU:DM6441 DDR2: 三星的K4T1G164QE-HCLE6,CL=3,16bit,8bank, PageSize=512word Nand Flash:ST的NAND512-A,512Mbit容量,BusWidth=8,PageSize=512Bytes,BlockSize=16K DDR2和Nand Flash都與Ti的評(píng)估板不一樣,所以下面的重點(diǎn)是對(duì)DDR2和Nand Flash的移植。
1、移植DDR2
1)在device.c中第106至123行是對(duì)DDR2參數(shù)的配置,根據(jù)數(shù)據(jù)手冊(cè)修改為: ? ? // For K4T1G164QE @ 162 MHz,modified by Dashon 2012.3.16? ? static const Uint8 DDR_NM = 1;//16bit,modified by Dashon 2012.3.16
? ? static const Uint8 DDR_CL = 3;
? ? static const Uint8 DDR_IBANK = 3;
? ? static const Uint8 DDR_PAGESIZE = 1;//512,modified by Dashon 2012.3.16
? ? static const Uint8 DDR_T_RFC = 20;
? ? static const Uint8 DDR_T_RP = 2;
? ? static const Uint8 DDR_T_RCD = 2;
? ? static const Uint8 DDR_T_WR = 2;
? ? static const Uint8 DDR_T_RAS = 6;
? ? static const Uint8 DDR_T_RC = 8;
? ? static const Uint8 DDR_T_RRD = 2;
? ? static const Uint8 DDR_T_WTR = 1;
? ? static const Uint8 DDR_T_XSNR = 22;
? ? static const Uint8 DDR_T_XSRD = 199;
? ? static const Uint8 DDR_T_RTP = 1;
? ? static const Uint8 DDR_T_CKE = 2;
? ? static const Uint16 DDR_RR = 1053;
? ? static const Uint8 DDR_READ_Latency = 5;?
DDR2時(shí)鐘采用默認(rèn)的162MHz,不必修改PLL2的配置。其他參數(shù)基本與MT47H64M16BT一致,也不作修改。 2)在device.c中的Uint32 DEVICE_DDR2Init()函數(shù)中第432至441行,修改寄存器SBCR的值: // modified by Dashon 2012.3.16
? // For K4T1G164QE @ 162 MHz
? // Setup the read latency (CAS Latency + 3 = 6 (but write 6-1=5))
? DDR->DDRPHYCR = (0x50006400) | DDR_READ_Latency;
? // Set TIMUNLOCK bit, CAS LAtency 3, 8 banks, 512-word page size?
? //DDR->SDBCR = 0x0013C631;
? DDR->SDBCR = ?0x0013c000 |
? ? ? ? ? ? ? ? (DDR_NM << 14) ? |
? ? ? ? ? ? ? ? (DDR_CL << 9) ? ?|
? ? ? ? ? ? ? ? (DDR_IBANK << 4) |
? ? ? ? ? ? ? ? (DDR_PAGESIZE <<0);
2、移植Nand Flash
1)在device.h中第109行,修改BusWidth為8: #define DEVICE_BOOTCFG_EMIFWIDTH_MASK ?(0x00000000)//BusWidth=8,modified by Dashon,2012.3.16 2)在device_nand.c中const NAND_CHIP_InfoObj DEVICE_NAND_CHIP_infoTable[]的定義中增加NAND512-A的信息: { 0x79, ? 8192, ? ? ? 32, ? ? 512+16},// 128 MB? { 0xFF, ? 32768, ? ? ?32, ? ?512+16},// 512 MB,devID尚未確定,added by Dashon,2012.3.18
? { 0xA1, ? 1024, ? ? ? 64, ? ? 2048+64}, // 128 MB - Big Block
第一個(gè)數(shù)字是devID,我暫時(shí)還沒(méi)確定NAND1G-B的devID,在進(jìn)行調(diào)試nand flash讀取設(shè)備ID才能確定,這里先用0xFF代替。
3、其它
由于板子沒(méi)有I2C,需在device.c的Uint32 DEVICE_init()函數(shù)屏蔽掉I2C的初始化: // I2C0 Setup? //if (status == E_PASS) status |= DEVICE_I2C0Init();//modified by Dashon,2012.3.16
總結(jié)
以上是生活随笔為你收集整理的TI Davinci DM6441嵌入式Linux移植攻略——UBL移植篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: PhoneUtils
- 下一篇: linux 刷新磁盘分区,linux中关