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