uboot移植理解
第一次寫部落格,簡單記錄下自己這周對uboot移植的理解吧!
——小白記錄,謹慎參考,敬請指導
1.uboot啟動過程
(1)BL0:BL0檔案是存放在CPU內部IROM中的一段固化程式碼,CPU上電後,首先執行BL0檔案
作用:初始化系統時鐘,設定看門狗,初始化堆疊,載入BL1
(2)BL1:是一段外部程式碼,存放在SD卡或者是NANDFlash中
作用:初始化RAM,關閉Cache,設定堆疊,載入BL2
(3)BL2:是指程式碼重定向後在記憶體中執行的uboot完整程式碼
作用:初始化其他外設,載入核心
三者之間的關係:(Interal ROM固化程式碼)BL0將BL1(bootloader的前16KB--BL1)載入到iRAM;BL1然後在iRAM中執行將BL2(剩下的bootloader)載入到SDRAM;BL2載入核心,把OS在SDRAM中執行起來,最終OS是執行在SDRAM(記憶體)中的。
這三個檔案之間的關係就是:BL0 執行時會將 BL1 拷貝到 CPU 的 IRAM 中,然後執行BL1;BL 檔案執行起來之後會先進行記憶體的初始化,之後將 BL2 檔案拷貝到外部記憶體中
2.uboot基礎配置
執行命令:make origen_config
呼叫:mkconfig——生成config.mk與config.h
執行命令:make all
直接生成 uboot.bin 即BL2檔案
要想做好uboot移植,就必須學會配置相關的硬體資訊。這裡在提三個檔案,..board/samsung/smdkc210/lowlevel_init.s
../cpu/arm_cortexa9/uboot.lds../cpu/arm_cortexa9/start.s
lowlevel_init.s:硬體初始化配置
uboot.lds: 連結指令碼就是程式連結時的的參考檔案,其目的是描述輸入檔案中各段應該怎麼樣被對映到輸出檔案,
以及程式執行時的記憶體佈局等等
start.s:關閉看門狗,關中斷,設定時鐘,SDRAM初始化
要想做好硬體資訊的配置,首先要能讀懂晶片手冊相應功能所賦予的地址,這樣才能在配置的時候進行呼叫。
例子1:為Exynos4412開發板配置led
第一步:檢視Exynos4412開發板原理圖,確定led所連線的cpu引腳
由此可知:LED3對應的晶片引腳為GPK1_1
第二步:修改start.s,點亮LED3
在修改start.s之前,我們需要知道GPK1_1控制暫存器的地址,對硬體裝置的操作,本質上也就是對CPU引腳所對應暫存器的操作。對暫存器的操作無外乎讀/寫操作。下面我們檢視資料手冊得到GPK1_1控制暫存器地址。
控制暫存器:Base Address: 0x1100_0000 偏移地址:0x0060
這裡我們需要設定GPK1_1的控制暫存器為輸出,GPK1CON暫存器佔4個位元組,其中4-7位用於對GPK1_1的配置,知道了這些資訊,我們開始在start.s中新增點燈程式碼:
/* LED Test Code */
ldr r0, =0x11000060 //得到GPK1CON暫存器地址
ldr r1, [r0]//將GPK1CON暫存器地址中的資料付給r1
bic r1, r1, #0xf0//將r1中的資料與0xf00的非即0x11進行與運算,將控制GPK1_1的位清零
orr r1, r1, #0x10//將控制GPK1_1的位設定為1,由0x1 = Ouput可知,此處將GPK1_1設定為輸出
str r1, [r0]//將r1的值寫到GPK1CON暫存器所在的地址中
至此,設定GPK1_1所對應的引腳為輸出。做好了點亮LED3的第一步,下一步個人認為是設定GPK1_1對應的資料位,就不寫了,哈哈哈,終於寫了那麼多了,不算完,慢慢補充......