linux内核ddr初始化,X-007-UBOOT-DDR的初始化(Bubblegum-96平台)
X-007-UBOOT-DDR的初始化(Bubblegum-96平臺)
作者:wowo 發(fā)布于:2016-7-21 22:47
分類:X Project
1. 前言
到目前為止,“X Project”在Bubblegum-96平臺上的代碼,都是運行在SRAM中。由于SRAM的size很小(最多也就96KB),如果要做更多的事情,就必須把DDR跑起來。不過,關(guān)于Bubblegum-96平臺的DDR driver,我和codingbelief同學(xué)折騰了很久,試圖找出一個最佳的方法,給大家呈現(xiàn)出DDR driver的開發(fā)方法和開發(fā)步驟。最終,受限于“資源”的短缺,還是失敗了。
根據(jù)Bubblegum-96公開的資料,只知道它包含了一個2GB的、單bank的LPDDR,除此之外,找不到任何技術(shù)有關(guān)的細節(jié),如LPDDR的datasheet、S900 DDR controller的說明、DDR時鐘的配置等等。沒有這些東西,我們根本無法完成DDR的配置,更不用說以此介紹、分析DDR driver了。
但是,雖然困難重重,“X Project”還是要進行下去,既然常規(guī)方法走不通,我們就采用一些非常規(guī)的手段,無論如何,還是能把DDR成功的初始化起來的。由于是非常規(guī)手段,當(dāng)然就無法開源,也無法給大家講解了。
因此,本文關(guān)于DDR的技術(shù)細節(jié)不多,主要目的是結(jié)合DDR的初始化,進一步介紹嵌入式linux開發(fā)的基本過程,包括如下知識點:
嵌入式Linux的啟動過程。
u-boot SPL的使用場景。
u-boot啟動過程中DDR初始化的流程。
2. Bubblegum-96的啟動過程
由于RAM資源的短缺,嵌入式系統(tǒng)的啟動過程是相當(dāng)繁瑣的,以Bubblegum-96為例:
CPU啟動時,只有96KB的SRAM可用。
CPU啟動時,ROM code只會從外部存儲介質(zhì)中(NAND、MMC、SD等)拷貝并執(zhí)行2KB的代碼。
首先與上面兩個條件,Bubblegum-96的啟動代碼必須具備如下的特點。
1)軟件從外部存儲介質(zhì)加載并執(zhí)行的時候
a)第一個被執(zhí)行的image,必須小于2KB(我們暫時稱它為SPL,Secondary Program Loader)。
b)SPL在有限的size中,必須完成兩個事情:初始化DDR;將后續(xù)的啟動代碼(如u-boot)從存儲介質(zhì)中copy到DDR中執(zhí)行。
c)u-boot在DDR中運行(不再受限于系統(tǒng)資源),進行必要的初始化之后,將linux kernel copy到DDR中并執(zhí)行。
d)linux kernel執(zhí)行,并加載rootfs。
2)固件更新的時候(這里提供一種方案,將借助Android的fastboot,不唯一)
a)第一個被執(zhí)行的image(SPL),必須小于SRAM的size(根據(jù)經(jīng)驗,Bubblegum-96平臺,要小于70KB)。
b)通過ROM code的DFU程序,將SPL上傳到SRAM并執(zhí)行。
c)SPL初始化DDR,并將控制權(quán)重新交給ROM code的DFU程序。
d)通過ROM code的DFU程序,將u-boot(size不再受限)上傳到DDR并執(zhí)行。
e)u-boot中啟動fastboot服務(wù),通過fastboot協(xié)議,更新固件。
本文將基于“X Project”前面的成果,介紹通過將SPL上傳到SRAM并執(zhí)行、初始化DDR,然后再把u-boot上傳到DDR并執(zhí)行的過程。
3. 初始化過程介紹
3.1 編寫DDR driver,正確初始化DDR
由于非技術(shù)的原因,這里無法多說,感興趣的同學(xué),可以在資料充足的情況下,在自己的板子上嘗試。最終的結(jié)果,就是導(dǎo)出一個類似于xxx_ddr_init()的接口,該接口會被SPL調(diào)用。
3.2 在SPL的初始化代碼中,調(diào)用DDR的init接口,初始化DDR,然后將控制權(quán)交回給ROM code
基于“X-003-UBOOT-基于Bubblegum-96平臺的u-boot移植說明”的成果,我們已經(jīng)可以在SPL的board_init_f接口中點亮一盞LED燈,現(xiàn)在要做的,就是調(diào)用DDR的初始化接口,如下:
void board_init_f(ulong bootflag)
{
bubblegum_early_debug(1);
#ifdef HAS_DDR_SOURCE_CODE
s900_ddr_init();
#endif
reboot_to_adfu();
}
注1:這里之所以要加一個宏定義,是因為源代碼中沒有DDR的source code,避免編譯錯誤而已。
DDR初始化完成后,需要把控制權(quán)交回給ROM code的DFU程序,這可要費一番心思,如下:
static void reboot_to_adfu(void)
{
void (*call_adfu)(void);
//call_adfu = (void (*)(void))0xffff5a00;
call_adfu = (void (*)(void))0xffff0400;
call_adfu();
while (1);
}
我這里用了一個比較笨的方法,直接跳轉(zhuǎn)到S900 ROM code的起始地址了,大家可以根據(jù)自己平臺的實際情況,自行處理。
以上SPL并沒有source code提供,我把編譯出來的bin文件共享出來了,可參考:
3.3 修改u-boot的代碼,完善dram_init接口,告訴u-boot當(dāng)前DDR的size
int dram_init(void)
{
printf("dram_init\n");
bubblegum_early_debug(11);
/* no need do dram init in here, we have done it in SPL */
gd->ram_size = 2 * 1024 * 1024 * 1024;??? /* 2GB, TODO */
printf("dram_init OK\n");
return 0;
}
由于SPL已經(jīng)完成了DDR初始化,這里什么事情都不需要做,只要通過gd->ram_size告知u-boot DDR的size(這里是2GB)即可。當(dāng)然,這里的賦值有點粗暴,后續(xù)再完善吧。
3.4 修改u-boot的配置項,將u-boot編譯到DDR中,從DDR執(zhí)行
改動如下:
-#define CONFIG_SYS_TEXT_BASE CONFIG_SPL_TEXT_BASE
-#define CONFIG_SYS_INIT_SP_ADDR CONFIG_SPL_STACK
+#define CONFIG_SYS_TEXT_BASE 0x11000000
+#define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_SDRAM_BASE + 0x7ff00)
/* Some commands use this as the default load address, TODO */
-#define CONFIG_SYS_LOAD_ADDR (CONFIG_SYS_SDRAM_BASE)
+#define CONFIG_SYS_LOAD_ADDR (CONFIG_SYS_SDRAM_BASE + 0x7ffc0)
S900 DDR的地址映射是從0x0開始的,我們隨便找一個地址(這里是0x11000000)。編譯生成新的bin文件后,進行簡單的測試,具體如下。
以上可參考如下patch:
4. 測試
在build目錄編譯完成后,按照如下的步驟執(zhí)行:
1)按住Bubblegum-96的ADFU鍵,使板子進入DFU模式
2)按住Bubblegum-96的ADFU鍵不松開,將splboot.bin(就是我們的SPL image)上傳到SRAM并執(zhí)行
sudo ../tools/dfu/dfu bubblegum 0xe406b200 ../tools/actions/splboot.bin 1
3)執(zhí)行完畢后,會重新進入DFU模式,進入后,可以松開ADFU按鍵。
4)將u-boot上傳到DDR并執(zhí)行(注意上傳位置和CONFIG_SYS_TEXT_BASE 一致)
sudo ../tools/dfu/dfu bubblegum 0x11000000 out/u-boot/u-boot-dtb.bin 1
5)檢查串口打印,執(zhí)行成功。
原創(chuàng)文章,轉(zhuǎn)發(fā)請注明出處。蝸窩科技,www.wowotech.net。
評論:
ary
2016-08-07 20:06
我覺得wowo可以考慮先在一個成熟的開源板子上做一遍移植,一是通用的板子大家都能買到,另外就是開源板子硬件公開程度更高,資料更全,移植更方便
2016-08-07 20:27
@ary:多謝提議,其實不用太在意板子,大家可以用不同的板子,思路一樣就可以了。
另外不成熟的板子,會遇到一些問題,有問題也是學(xué)習(xí)的過程。
現(xiàn)在有同學(xué)在tiny210上面移植了(比較成熟了),可以參看:
http://www.wowotech.net/forum/viewtopic.php?id=52
2016-07-25 19:39
wowo:
Bubblegum-96這個板子你們是買的還是?
2016-07-26 08:52
@pingchangxin:我們手上的是廠家送的。
發(fā)表評論:
昵稱
郵件地址 (選填)
個人主頁 (選填)
總結(jié)
以上是生活随笔為你收集整理的linux内核ddr初始化,X-007-UBOOT-DDR的初始化(Bubblegum-96平台)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 去美元化最成功的国家,连被排除出美元结算
- 下一篇: linux查看文件从底部开始,linux