天天看點

【uboot移植】基于samsung移植過的uboot(一)

準備工作

我這邊擷取到了三星關于其開發闆smdkv210移植過的uboot源代碼,當然這個代碼也是三星基于uboot官方的某一版本開發的。三星出的開發闆會賣給一些大代理商,是以源代碼也會随之流出。

分頭在windows的共享檔案夾、ubuntu中各解壓,便于看代碼和編譯,以及修改檔案之後友善拷貝。

對于我們看代碼來說,為了避免在SourceInsight中看到太多的重名檔案,我們最好對其目錄下的cpu、board檔案夾下的檔案進行删減。cpu下僅留下s5pc11x,board下僅留下samsung。

嘗試運作

一般來說,我們使用的開發闆是基于三星出的開發闆的硬體基礎上進行了一定的修改或裁剪。是以,我們開發闆使用的uboot與Samsung使用的開發闆uboot,其實很大程度上存在相似。由此,我們可以嘗試直接将Samsung的uboot在我們的開發闆上跑一下。

一、那既然要跑一下的話,我們先看Makefile中的交叉編譯工具鍊(CROSS_COMPILE) 是否配置正确。ubuntu對應的目錄也安裝了該工具鍊。

【uboot移植】基于samsung移植過的uboot(一)

二、交叉編譯工具鍊檢查好之後,我們可以嘗試編譯了,uboot在編譯前需要先配置,make xxx_config。但是這個uboot中并沒有我們開發闆相關的配置項以及配置頭檔案。我們開發闆x210是基于三星開發闆smdkv210開發的,是以找到smdkv210的配置項。有5個開發闆,我們就随便選一個吧,第一個mdkv210single_config(理論上如果知道哪個與我們開發闆更類似就選取哪個),mdkv210single_config對應include/configs/smdkv210single.h頭檔案。

【uboot移植】基于samsung移植過的uboot(一)

make smdkv210single_config之後make。然後通過燒錄腳本進行燒錄,這裡的燒錄腳本中執行的兩個檔案sd_fdisk、mkbl1(分别是sd_fdisk.c、C110-EVT1-mkbl1.c編譯而來的)是x86-64架構的,三星上傳到時候沒有将其clean。我們重新将這兩個檔案make一下,得到 Intel 80386版本的。

然後運作,運作結果是:

第一,序列槽無輸出;

第二,開發闆供電鎖存成功。

那麼可以得出結論:錯誤在開發闆供電鎖存代碼和序列槽初始化列印"O"代碼之間死掉了。

順藤摸瓜找錯誤點

找到中間段的一些代碼,通過led去找到卡死的函數為PMIC_InitIp(PMIC是電源管理晶片),因為我們開發闆沒有PMIC,是以這個函數内部向PMIC發送I2C接口的指令時會死循環,是以屏蔽這裡之後問題解決。

【uboot移植】基于samsung移植過的uboot(一)

找的問題所在點之後,把led的代碼去掉,重新啟動。

【uboot移植】基于samsung移植過的uboot(一)

那後uboot卡在了列印“NAND:”之後,我們搜尋之後鎖定到了lib_arm/board.c中。結合分析調用順序以及加列印确認(序列槽已經初始化了),鎖定到了start_armboot函數中Board Specific這一系列的defined(CONFIG_SMDKC110)中的nand_init這個函數。

【uboot移植】基于samsung移植過的uboot(一)

但是定位到這個函數之後,繼續加列印定位。最後其調用關系如下:

drivers/mtd/nand/nand.c中nand_init( )

nand_init_chip( )

cpu/s5pc11x/nand.c中的board_nand_init( )

【uboot移植】基于samsung移植過的uboot(一)

最後定位到了這一句,這句代碼是在等待引腳的預備狀态。按理說這些地方應該是不需要改動的,是以應該是前置步驟的某些配置相關出問題了。

是以分析到這就先不往下分析了,後續從前面的列印内容來查問題。