日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux内核ddr初始化,X-007-UBOOT-DDR的初始化(Bubblegum-96平台)

發(fā)布時間:2023/12/10 linux 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux内核ddr初始化,X-007-UBOOT-DDR的初始化(Bubblegum-96平台) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。