作者信息
作者:彭東林
QQ: 405728433
平台介紹
開發環境:win7 64位 + VMware11 + Ubuntu14.04 64位
開發板:tiny4412ADK + S700 + 4GB eMMC + 1G DDR3
工具鏈:友善之臂提供的 arm-linux- (gcc version 4.5.1)
要移植的u-boot版本:u-boot-2015-10
參考u-boot版本:友善之臂提供的 u-boot-2010-12
摘要
本博文簡要分析了移植u-boot-2015-12到tiny4412,采用的是spl的啟動方式,目前可以做到的是進入u-boot的命令終端,如下圖:
而且僅僅支持從SD卡啟動,以后會慢慢完善。
移植
要移植u-boot到tiny4412,首先我們需要對這塊板子的啟動方式、地址空間分配有清楚的認識。此外,由於剛開始只需要做到進入u-boot的命令行(如上圖),其中至少涉及到了系統時鍾初始化、內存初始化以及串口初始化,做到這三點,就為以后的各種工作鋪平了道路。
下面是一些參考資料:
- 技術部落 (這個網站對tiny4412的啟動、時鍾、串口以及內存初始化進行了詳細的講解)
- 嵌入式Linux系統開發完全手冊_基於4412_上冊.pdf (這個文檔是韋東山寫的,講的也非常好)
- Android_Exynos4412_iROM_Secure_Booting_Guide_Ver.1.00.00.pdf (這篇文檔是Samsung的,詳細介紹了這款SOC的啟動)
- SEC_Exynos4412_Users Manual_Ver.1.00.00.pdf (這篇文檔也是Samsung的,是exynos4412的用戶手冊,有兩千八百多頁,包含了exynos4412的詳細信息)
下面我簡要說明。
- exynos4412的地址空間
我們需要關注的主要是上面三個。
iROM:這段地址空間對應exynos4412內部固化的一段程序,exynos4412啟動的第一條指令就存放在這里。
iRAM:這段地址空間對應的是exynos4412內部的一個存儲器,這段存儲器的特點是上電就可以用,不用初始化。
DMC0:這段地址空間就是核心板上的DDR3對應的存儲空間(我的tiny4412有1GB的DDR3,所以地址空間是0x40000000-0x80000000),上電后需要初始化DRAM控制器才能使用。
- exynos4412的啟動
可以有幾張圖:
圖一
圖一中,iROM首先運行,然后根據OM的值判斷從哪個存儲設備加載BL1到iRAM,然后BL1再根據OM的值判斷從哪個存儲設備加載OS到DRAM中。注意:以tiny4412從sdcard啟動為例,iROM固化在SOC內部,BL1是Samsung提供的鏡像文件E4412_N.bl1.bin,OS在這里可以認為是BL2,這部分是u-boot代碼中編譯生成的SPL,BL2是由BL1加載到iRAM中運行的。最后,BL2再根據OM值,從sdcard中將u-boot代碼拷貝到DRAM中。
圖二
圖二中,顯示了iROM、BL1和BL2的運行地址空間,iRAM的地址空間是0x02020000-0x02060000。由於iROM是只讀存儲器,所以把iRAM的0x02020000-0x02021400的5KB地址空間分配給iROM用,用於存放iROM的全局變量(ZI/RW,分別存放全局未初始化變量、全局已初始化變量)、局部變量(stack)等等。從0x02021400-0x02023400的8KB地址空間屬於BL1,可以認為BL1的第一條指令就存放在0x02021400地址單元。緊接着的0x02023400-0x02027400的16KB地址空間屬於BL2,即:BL2的第一條指令存放的地址就是0x02023400,這個值很重要,如果我們的SPL中有“非位置無關碼”,那么就必須將SPL加載到其運行地址處,否則在執行那些非位置無關碼的時候會出錯,我們知道,SPL這段程序是由BL1負責加載到iRAM的0x02023400地址處運行的,但是BL1是Samsung提供的,並沒有源代碼,只有二進制鏡像,所以在SPL有“非位置無關碼”的時候,必須將SPL的鏈接地址設置為0x02023400.
圖三
圖三中是從sdcard啟動時,程序在sdcard中的布局。其中sdcard的扇區大小是512B。第0個扇區是保留扇區,第1到第16扇區共8KB的空間存放BL1(也就是:E4412_N.bl1.bin),從第17到第48扇區的16KB空間用於存放BL2(也就是u-boot-spl.bin),之后的扇區可以根據實際需求自己安排。
關於時鍾、DRAM、串口的初始化請參考上面列出的參考資料。
有了上面的基礎知識,下面開始移植。