目錄(?)[+]
- 一DM6441的Boot過程簡介
- 二DM6441的UBL移植
- CCS文件夾
- Common文件夾
- GNU文件夾
- 移植DDR2
- 移植Nand Flash
- 其它
聲明:本文參考網友zjb_integrated的文章《TI?Davinci?DM6446開發攻略——UBL移植》和《DAVINCI DM365-DM368開發攻略——U-BOOT-2010.12及UBL的移植》,內容有增刪,特此聲明!另有系列網文《DM365的UBL源碼分析》(作者不詳)對UBL源碼的分析比較透徹,有興趣的也可以看看。
一、DM6441的Boot過程簡介
在搭好?TI Davinci DM6441的開發環境后,今天起進入Linux的移植階段。UBL的移植,相對于UBOOT移植、KERNEL移植、ROOTFS移植、設備驅動及DSP開發來說,還是比較簡單的。先從DAVINCI的啟動說起,了解UBL在DAVIN系統中的位置和作用。對于固件程序燒寫在NAND FLASH 的Davinci dm644x嵌入式系統, 上電啟動的過程如下:
RBL(ARM ROM Boot Loader)在芯片出廠的時候就已經燒寫到ROM里了,這不需要大家關心。上電后,RBL會自動從EMIFA EM_CS2 memory space (0x0200 0000)執行指令,這個地址就是NAND FLASH 或NOR FLASH的片選起始地址。當你的系統設置為NAND BOOT的時候,UBL(User Boot Loader)是必不可少的,否則RBL不能直接把UBOOT給BOOT起來,因為RBL只支持14K NAND FLASH 的 BOOT程序,而UBOOT編譯出來后的bin文件一般都大于80K,特別是版本越高,UBOOT的代碼越大,所以這時候就需要寫一個UBL。
UBL 從NAND FLASH 讀取UBOOT,然后把UBOOT COPY 到 DDR2(RAM)的相關地址上,然后把UBOOT 給BOOT 起來。根據TI DAVIN RBL的規定,不同型號的NAND FLASH,UBL保存的地址是不同的,512字節PAGE 的NAND(即SMALL PAGE),保存的地址是:0x00004000;2048字節PAGE的NAND (即LARGE PAGE)保存的地址是:0x20000。
至于如何通過仿真器燒寫UBL或通過UART BOOT燒寫UBL,在U-BOOT移植的文章再詳細介紹。
PS:不要混淆UBL和U-Boot!
二、DM6441的UBL移植
DM644x下有CCS、Common,GNU三個文件夾:
CCS文件夾:
這里邊的程序需要在TI CCS下編譯,通過仿真器和JTAG在DM36X的板子上調試和燒寫NAND FLASH或NOR FLASH,有燒寫Writer的應用程序,用CCS打開工程文件,會連接到/dvsdk_2_00_00_22/PSP_02_00_00_140/board_utilites/Common/drivers里。暫且先不管。Common文件夾:
1、屏蔽所有中斷;
2、清除中斷標志;
3、DEVICE_PSCInit(),Power and Sleep Controller;
4、DEVICE_pinmuxControl(),主芯片管腳復用的設置,DM644X的管腳復用很多,很復雜,一共5個PINMUX寄存器需配置;
5、DEVICE_PLL1Init(),PPL1配置,使用不同的頻率的DM644x,這些值都不同,不過TI已經提供參數參考,DM6441一般使用Uint32 PLL1_Mult = 19; ?// DSP=513 MHz
6、DEVICE_PLL2Init(),PPL2的配置,使用同上,不同頻率的值不同;使用不同型號的DDR,要設置不同的參數,即時序參數等,這是關鍵的地方。
7、DEVICE_DDR2Init(),DDR2的配置,市場上不同的DDR2內存芯片需要不同的參數配置,就在這個函數內。
8、DEVICE_EMIFInit(),這個針對NAND FLASH接口或NOR FLASH接口的訪問時序配置;
9、DEVICE_UART0Init(),串口UART0的配置,這個就是我們調試DM644X串口的設置,我們使用UART0來調試LINUX,這里配置不好,后面的開發就無法調試了。
11、DEVICE_I2C0Init()的設置;
GNU文件夾:
這個就是在LINUX環境下編譯UBL的環境,修改dvsdk_2_00_00_22/PSP_02_00_00_140/board_utilites/dm644x/GNU/ubl下的makefile,把與nor相關的命令全注釋掉,只保留與nand相關的:$(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 $@
nandboot.c?(DM644x_FlashAndBootUtils_1_50/Common/ubl/src)
1、移植DDR2
? ? 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;?
? // 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
? { 0xFF, ? 32768, ? ? ?32, ? ?512+16},// 512 MB,devID尚未確定,added by Dashon,2012.3.18
? { 0xA1, ? 1024, ? ? ? 64, ? ? 2048+64}, // 128 MB - Big Block
3、其它
? //if (status == E_PASS) status |= DEVICE_I2C0Init();//modified by Dashon,2012.3.16