TI Davinci DM6441嵌入式Linux移植攻略——UBL移植篇

目錄(?)[+]

  1. 一DM6441的Boot過程簡介
  2. 二DM6441的UBL移植
    1. CCS文件夾
    2. Common文件夾
    3. GNU文件夾
      1. 移植DDR2
      2. 移植Nand Flash
      3. 其它

聲明:本文參考網友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移植

其實UBL和U-Boot的聯系非常密切,放在這里單獨來寫,是因為本人也是個菜鳥,很多東西也不太懂,可以邊寫邊加深理解。
nand-boot和nor-boot其實在移植的層面來看,都差不多。根據目標板的實際情況,重點放在nand-boot。這個UBL的版本是V1.50(當然你可以用更高的V2.00,導師提供給我的也是2.00的,但我的開發環境里是1.50的),在root/dvsdk_2_00_00_22/PSP_02_00_00_140/board_utilites/dm644x下(后面的U-Boot也在該目錄),有個文件DM644x_FlashAndBootUtils_1_50.tar.gz,為了方便,把它復制到/home/usrname并解壓出來:
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的驅動源碼、工具、腳本等等。我們主要關注arch,drivers,src,ubl,這幾個文件夾打開看看就明白什么意思了。UBL的main()函數在/Common/ubl/src/ubl.c里。
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文件夾:

Common里有核心的文件device.c和device_nand.c。device.c是最重要的文件,這里初始化很多系統的東西,見DEVICE_init():
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,這里配置不好,后面的開發就無法調試了。
10、DEVICE_TIMER0Init(),定時器TIMER0的設置;
11、DEVICE_I2C0Init()的設置;

GNU文件夾:

這個就是在LINUX環境下編譯UBL的環境,修改dvsdk_2_00_00_22/PSP_02_00_00_140/board_utilites/dm644x/GNU/ubl下的makefile,把與nor相關的命令全注釋掉,只保留與nand相關的:
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的存儲地址,不同型號的NAND FLASH ,比如SMALL PAGE(512字節)和LARGE PAGE(2048字節)這些都要修改除非你的NAND的類型和TI EVM 兼容。
nandboot.c?(DM644x_FlashAndBootUtils_1_50/Common/ubl/src)
主要任務就是如何把u-boot.bin或帶有頭的u-boot.img正確COPY到DDR里,這里最容易出問題,編譯出來的U-BOOT文件一般帶有Valid magic number(MAGIC_NUMBER_VALID),入口地址entrypaoit,這些信息不對都使UBOOT 運行不起來,建議看一下或COPY UBOOT的image.h。

好了,介紹到這里,我們已知道UBL的移植就是對device.c、device.h、device_nand.c、device_nand.h、nand.c、nand.h、nandboot.c及相應的makefile文件進行相應的修改。相信已可以根據自己目標板的實際情況進行相應移植了。下面正式開始對板子進行移植:
首先說下板子的配置:
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的評估板不一樣,所以下面的重點是對DDR2和Nand Flash的移植。

1、移植DDR2

1)在device.c中第106至123行是對DDR2參數的配置,根據數據手冊修改為:
? ? // 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時鐘采用默認的162MHz,不必修改PLL2的配置。其他參數基本與MT47H64M16BT一致,也不作修改。
2)在device.c中的Uint32 DEVICE_DDR2Init()函數中第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
第一個數字是devID,我暫時還沒確定NAND1G-B的devID,在進行調試nand flash讀取設備ID才能確定,這里先用0xFF代替。

3、其它

由于板子沒有I2C,需在device.c的Uint32 DEVICE_init()函數屏蔽掉I2C的初始化:
// I2C0 Setup
? //if (status == E_PASS) status |= DEVICE_I2C0Init();//modified by Dashon,2012.3.16

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253459.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253459.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253459.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python接口自動化測試(二)-requests.get()

環境搭建好后&#xff0c;接下來我們先來了解一下requests的一些簡單使用&#xff0c;主要包括&#xff1a; requests常用請求方法使用&#xff0c;包括&#xff1a;get&#xff0c;postrequests庫中的Session、Cookie的使用其它高級部分&#xff1a;認證、代理、證書驗證、超時…

從一個Android碼農視角回顧2018GDD大會

兩天的GDD大會結束了&#xff0c;很開心&#xff0c;可以看得出&#xff0c;這次Google真的很用心。不但分享的內容質量很高。而且又有得吃又有得玩&#xff0c;還有許多好看的小姐姐&#xff0c;真不妄我請了兩天年假來參加這個大會。先來幾張圖鎮樓 哈哈&#xff0c;跑題了。…

Python3.x和Python2.x的區別[轉]

Python3.x和Python2.x的區別 1.性能 Py3.0運行 pystone benchmark的速度比Py2.5慢30%。Guido認為Py3.0有極大的優化空間&#xff0c;在字符串和整形操作上可 以取得很好的優化結果。 Py3.1性能比Py2.5慢15%&#xff0c;還有很大的提升空間。 2.編碼 Py3.X源碼文件默認使用utf-8…

數字圖像處理——圖像銳化

圖像增強是圖像處理的一個重要環節,早期的圖像處理就是從圖像增強開始的,人們研究對質量低的圖像進行處理以獲得改善質量后的圖像。現今的圖像增強還為后續的圖像處理,如圖像信息提取、圖像識別等,提供更高識別度的圖像。 從圖像處理技術來看,圖像的攝取、編碼、傳輸和處理…

DAVINCI DM365-DM368開發攻略——U-BOOT-2010.12及UBL的移植

從盛夏走到深秋&#xff0c;我們繼續DAVINCI DM365-DM368的開發。說來慚愧&#xff0c;人家51CTO熱情支持本博客&#xff0c;而本人卻一直沒有像其他博客之星一樣頻繁更新博客&#xff0c;心里確實說不過去。管理公司確實很累&#xff0c;有更急的客戶的項目要做&#xff0c;我…

陳天藝1636050045假設跑步者1小時40分鐘35秒跑了24英里。編寫一個程序顯示每小時以公里為單位的平均速度值...

public class AverageSpeed{ public static void main(String[]args){ double speedkm 60/(45.5/14); double speedm speedkm /1.6; system.out.println&#xff08;“averagespeed ”speedm "m/h"&#xff09; } }轉載于:https://www.cnblogs.com/Archon-Cty/p/7…

EMVA 1288 測試標準

一、概述 如果要對比兩臺相機的性能,我們應該關注哪些參數呢,是焦距、像素、還是光圈大小?這些參數通常廣為人知,并且很容易做出對比。但在一些專業領域,例如機器視覺、自動駕駛等行業,計算機算法對圖像有著獨特的要求,這些標準有些已經跟不上數字成像的發展步伐,而且其…

Spring Boot - 修改Tomcat默認的8080端口

前言 默認情況下&#xff0c;Spring Boot內置的Tomcat服務會使用8080端口啟動&#xff0c;我們可以使用以下任何技巧去更改默認的Tomcat端口&#xff1b; 注&#xff1a;我們可以通過server.port0配置&#xff0c;去自動配置一個未被占用的http端口&#xff0c;由操作系統實現。…

2017年度目標

語言&#xff1a;python&#xff0c;lisp&#xff0c;js&#xff0c;html5技術&#xff1a;android&#xff0c;hadoop數學&#xff1a;復變函數&#xff0c;代數&#xff0c;概率&#xff0c;數論英語&#xff1a;reading其他&#xff1a;金融/經濟/股票&#xff0c;歷史/史記…

嵌入式系統系統升級內核雙備份的實現方式

1.nand flash MTD分區 kernels/linux-2.6.31.1-cavm1/drivers/mtd/maps/xxxxx-flash.c /* MTD partitions: From CNW5602 32MB * mtd0: 0x000C0000 00020000 "bootloader" * mtd1: 0x00040000 00020000 "factory_config" * mt…

SerDes接口——架構與電路

隨著通信技術的飛速發展&#xff0c;高速串行互連以其結構簡單&#xff0c;不需要傳輸同步時鐘&#xff0c;相比并行傳輸有更高數據傳輸效率的優點&#xff0c;成為現代通信和數據傳輸的重要組成部分。隨著對數據傳輸速率要求的不斷提高&#xff0c;SERDES應運而生。它是一種時…

Springboot分模塊開發詳解(2):建立子工程

1.創建base-entity 選中base工程&#xff0c;右鍵創建一個新的maven工程 自動選擇了base這個目錄存放子工程 創建后&#xff0c;pom.xml修改成如下內容&#xff1a; <?xml version"1.0"?> <projectxsi:schemaLocation"http://maven.apache.org/POM/4…

到天宮做客(2017寒假培訓測試壓軸題)

個人QQ&#xff1a;757394026團隊QQ&#xff1a;466373640個人博客&#xff1a;www.doubleq.winc/noi/信息學奧數博客&#xff1a;http://www.cnblogs.com/zwfymqz 題目描述 有一天&#xff0c;我做了個夢&#xff0c;夢見我很榮幸的接到了豬八戒的邀請&#xff0c;到天宮陪他吃…

NAND FLASH分區規劃

由于BOOTLOADRER、PARAMS以及內核、文件系統都在NAND FLASH上&#xff0c;因此分區就得進行統一規劃。系統的NAND FLASH分區依賴于u-boot和Linux內核兩方面的設置。U-Boot中的NAND分區 文件&#xff1a;include/configs/開發板.h這是Phy3250的參數&#xff0c;Phy3250采用32MB的…

圖像去霧算法學習

現有的圖像采集設備對外界環境的干擾非常敏感,在霧霾環境中,獲取的戶外圖像往往退化嚴重,主要表現為場景特征信息模糊、對比度低、色彩失真,不利于計算機視覺系統對圖像真實特征的提取,從而影響其后續的分析、理解、識別等一系列處理,很大程度上降低了視覺系統的實際應用…

訓練與解碼

BW算法是對某一個HMM(一個音素)進行訓練&#xff0c;需要該HMM對應的觀察向量(一段音頻)&#xff0c;如何讓一段文本中的某個音素找到對應一整段音頻中的一小段音頻&#xff1f;需要用到對齊來找到所有的[音素-音頻]的配對。 訓練時也需要解碼 1&#xff0c;設訓練的一句話有n…

Atlassian發布事故管理解決方案Jira Ops

Atlassian聯合首席執行官兼聯合創始人Scott Farquhar于9月4日宣布&#xff0c;Atlassian推出了一款名為Jira Ops的新產品&#xff0c;并且他們將收購OpsGenie。\\正如“Jira Ops \u0026amp; OpsGenie: powerful incident management”所描述的那樣&#xff0c;Jira Ops是一款新…

U-Boot如何向內核傳遞Flash的分區信息

1.如何對nand 分區。修改mtdparts環境變量就可以了么&#xff1f; 對于目前的U-boot而言,是的.而且, 設置了mtdparts變量之后,你可以在nand read/write/erase命令中直接使用分區的名字而不必指定分區的偏移位置. set bootargs noinitrd consolettySAC0 root/dev/mtdblock3 ro…

Python爬蟲學習系列教程

大家好哈&#xff0c;我呢最近在學習Python爬蟲&#xff0c;感覺非常有意思&#xff0c;真的讓生活可以方便很多。學習過程中我把一些學習的筆記總結下來&#xff0c;還記錄了一些自己實際寫的一些小爬蟲&#xff0c;在這里跟大家一同分享&#xff0c;希望對Python爬蟲感興趣的…

ICer 常用網站推薦

總結一下我經常用到的IC網站&#xff0c;主要是數字IC&#xff0c;大致分資源類和資訊類吧&#xff1a; 一、資訊類 CSDN&#xff1a;目前關于IC的文章也越來越多啊。。https://www.csdn.net/ 知乎&#xff1a;目前來說應該是活躍大佬比較多。。https://www.zhihu.com/ DVCO…