uboot移植——使用三星官方的uboot进行移植
以下內(nèi)容源于朱有鵬嵌入式課程的學(xué)習(xí),如有侵權(quán),請告知?jiǎng)h除。
參考資料:http://www.cnblogs.com/biaohc/p/6460902.html
 
 
總結(jié)的思維導(dǎo)圖下載地址:https://pan.baidu.com/s/1nvilb6L
 
 
 
 
 
由于我們使用210的cpu,因此選擇三星的210開發(fā)板的配置。
1、刪除無關(guān)的文件
在開始移植之前我們首先要把不相關(guān)的cpu、board、lib目錄刪除:
(1)board目錄下:把不相關(guān)的開發(fā)板的文件全部刪除只保留:board->samsung->common文件夾以及board->samsung->smdkc110文件夾;
- 每個(gè)文件夾代表一個(gè)開發(fā)板。
 
(2)cpu目錄下:只保留s5pc11x文件夾,其他全部刪除; ?
(3)include目錄下:asm-開頭的文件只保留asm-arm;asm-arm目錄下arch-開頭的文件只保留s5pc11x; ?
(4)include/configs目錄下:只保留smdkv210single.h文件;每一個(gè)開發(fā)板對應(yīng)一個(gè).h文件。
(5) lib_ 開頭的文件夾保留lib_arm、lib_generic 。
然后在用sourceinsight生成project。
 
2、直接編譯三星移植版uboot嘗試運(yùn)行
(1)在uboot根目錄下進(jìn)行配置make smdkv210single_config(對應(yīng)include/configs/smdkv210single.h頭文件),然后make,生成uboot.bin文件。
(2)把生成的uboot.bin文件燒錄到sd卡中。
- 首先注意的是燒寫時(shí)要在uboot根目錄下,燒寫命令:./sd_fusing.sh ?/dev/sdb;
 - 注意sd_fusing腳本中,燒寫的內(nèi)容是不是uboot.bin、uboot.bin的路徑對不對,..在此表示 ~/uboot/;
 - 利用file mkbl1查看mkbl1是不是32bit的,如果不是,則需要在sd_fusing目錄下執(zhí)行make clean,然后再make。
 - sd_fusing.sh文件中,/mkbl1 ../u-boot.bin SD-bl1-8k.bin 8192表示將uboot的前8k復(fù)制到SD-bl1-8k.bin文件中;
 - 執(zhí)行此sd_fusing.sh腳本即可把bl1、uboot.bin燒錄到sd卡中。
 
(3)啟動(dòng)開發(fā)板,發(fā)現(xiàn)電源置鎖,只有一句SD checksum Error,沒有打印出ok。
- 分析:uboot中串口最早的輸出“OK”,在lowlevel_init.S中初始化串口時(shí)打印出來的;串口無輸出"O"說明在打印"O"之前代碼已經(jīng)死掉了;開發(fā)板供電鎖存在lowlevel_init.S中,開發(fā)板供電鎖存成功說明這個(gè)代碼之前的部分是沒問題的。
 - 結(jié)論:錯(cuò)誤發(fā)生在開發(fā)板供電鎖存代碼和串口初始化打印"O"代碼。
 - 在lowlevel_ini t函數(shù)中,PMIC_InitIp函數(shù)是用來管理電源的。由于210開發(fā)板沒有用到這個(gè)功能,所以程序卡在此函數(shù)中。只要把此函數(shù)注釋掉即可。
 
?
 
 
3、uboot的版本號和時(shí)鐘配置
輸出如下:
 
(1)開始打印U-BOOT的版本號,由display_banner 這個(gè)函數(shù)中實(shí)現(xiàn)。
- 想要修改“for SMDKV210”這個(gè)信息,只需在smdkv210single.h中修改這個(gè)宏定義CFG_PROMPT即可。如下
 
 
 
(2)時(shí)鐘信息是對的。
- 時(shí)鐘信息是在print_cpuinfo這個(gè)函數(shù)中打印出來的。
 - 時(shí)鐘部分的代碼在lowlevel_init.S中的bl system_clock_init調(diào)用的函數(shù)中。
 - 函數(shù)的代碼部分是沒任何問題的,不需要改動(dòng)。
 - 如果時(shí)鐘部分要更改,關(guān)鍵是去更改頭文件中的宏定義。
 - 三星移植時(shí)已經(jīng)把210常用的各種時(shí)鐘配置全都計(jì)算好用宏開關(guān)來控制了。只要打開相應(yīng)的宏開關(guān)就能將系統(tǒng)配置為各種不同的頻率。
 
(3)下面的信息是在checkboard函數(shù)中打印的
- 如果要修改這個(gè)信息,可以在這個(gè)函數(shù)中修改。
 - 在board\samsung\smdkc110.c文件中
 
 
 
 
4、DDR的配置
下面所顯示的信息是錯(cuò)誤的
 
首先,看一下原來的DRAM中的配置信息(在smdkv210single.h中進(jìn)行配置):
 
可知,這里有兩塊DRAM,大小均為512M(故總顯示為1GB),但實(shí)際我們x210開發(fā)板只有512MB。
因此修改如下:#define SDRAM_BANK_SIZE ?0x10000000 ? ?/* 256 MB */
 
其次,DRAM0和DRAM1的地址,分別為0x20000000~0x2FFFFFFF(256MB),0x40000000~0x4FFFFFFF(256MB)。
我們希望起始內(nèi)存的地址為0x3000_0000~0x4FFF_FFFF,因此需要DDR地址另外配置。
步驟1:更改寄存器的值(可看做硬件配置部分的修改)
 
 
(1)根據(jù)裸機(jī)中DDR初始化部分的課程,和uboot中DDR初始化部分的代碼的課程,得出結(jié)論
- DDR的初始化代碼部分是在lowlevel_init.S中寫的,是不動(dòng)的,代碼部分就是對相應(yīng)寄存器做相應(yīng)值的初始化;
 - 要?jiǎng)拥氖侵?#xff0c;而uboot為了具有可移植性把值都宏定義在include/configs/xxx.h中了。
 - 因此我們只需要去這個(gè)配置頭文件中更改配置值即可。
 
(2)#define DMC0_MEMCONFIG_00x20E01323 改為:#define DMC0_MEMCONFIG_00x30E01323
- 實(shí)際發(fā)現(xiàn)還是運(yùn)行不了,需要改為?#define DMC0_MEMCONFIG_00x30F01323
 
 
步驟2:軟件配置值更改
 
- 寄存器的值改了后相當(dāng)于是硬件配置部分做了更改。但是uboot中DDR相關(guān)的一些,還在原來位置,所以要去更改。
 - 在include\configs\smdkv210single.h中,將#defineMEMORY_BASE_ADDRESS0x20000000 改為 #define ? ?MEMORY_BASE_ADDRESS0x30000000。
 
 步驟3:虛擬地址映射表中相應(yīng)修改
 
(1)uboot中開啟了MMU對內(nèi)存進(jìn)行了段式映射,有一張內(nèi)存映射表。
(2)修改發(fā)生在lowlevel_init.S中的mmu_table標(biāo)簽這塊內(nèi)容里。
(2)經(jīng)過實(shí)際分析,發(fā)現(xiàn)這個(gè)內(nèi)存映射只是把20000000開始的256MB映射到C0000000開頭的256MB。我們更改方法是將2改成3。
 
步驟4:修改虛擬地址到物理地址的映射函數(shù)
- 修改uboot/board/samsung/smdkc110/smdkc110.c中的virt_to_phy_smdkc110,將其中的20000000改為30000000即可。
 
 
5、SD卡版本號問題
 
(1)從打印出來的錯(cuò)誤信息中挑選一個(gè)關(guān)鍵詞,然后去源代碼中搜索這個(gè)關(guān)鍵詞,通過這種搜索的方法定位問題。通過搜索將問題定位在drivers/mmc/mmc.c的818行。
(2)在下面這個(gè)函數(shù)中,讀取版本號如果版本號>5的話打印下面信息,我們直接把5修改為8。
 
- 這個(gè)函數(shù)是在讀取SD/iNand的ext_csd寄存器的值。通過瀏覽代碼結(jié)合出錯(cuò)地方,可以判斷出:從sd卡中讀取ext_csd寄存器是成功的,并且從讀取結(jié)果中拿到了SD卡的版本號信息。然后代碼對版本號進(jìn)行了判斷,并且如果版本號大于5就會(huì)報(bào)錯(cuò)并且函數(shù)錯(cuò)誤退出。這就是問題所正。
 - 當(dāng)前板子上有一個(gè)iNand接在SD0上,有一個(gè)外置SD卡接在SD2上,那uboot中初始化的是iNand而不是SD卡。
 - 也就是說uboot中實(shí)際用的是SD0而不是SD2。因?yàn)閒ind_mmc_device(0),這里的0指的是SD0,可以改為1。
 - 使用外置SD卡時(shí),這個(gè)版本號的問題不會(huì)出現(xiàn)。從這里可以推測出SD卡和iNand的區(qū)別,SD卡版本低,iNand的版本比較高。
 
6、網(wǎng)卡驅(qū)動(dòng)的移植
A、背景知識
(1)uboot中提供了很多網(wǎng)卡芯片的驅(qū)動(dòng)程序,所以uboot中是移植而不是編寫。 (2)網(wǎng)卡驅(qū)動(dòng)在uboot/drivers/net/dm9000x.c和dm9000x.h- 此驅(qū)動(dòng)源于linux kernel源代碼,可以在uboot中直接使用,無需更改。
 
- linux驅(qū)動(dòng)設(shè)計(jì)中,數(shù)據(jù)和代碼是分開的。
 - 這里的代碼主要指uboot/drivers/net/dm9000x.c和dm9000x.h。
 - 而數(shù)據(jù)是由硬件開發(fā)板中的接法決定的,數(shù)據(jù)由一定的數(shù)據(jù)結(jié)構(gòu)來提供。
 - 移植DM9000驅(qū)動(dòng)時(shí),dm9000x.c和h不需要改動(dòng),要?jiǎng)拥氖穷^文件的數(shù)據(jù)。
 
B、網(wǎng)卡移植的關(guān)鍵:初始化
(1)uboot在第二階段init_sequences中進(jìn)行了一系列的初始化,其中就有網(wǎng)卡芯片的初始化。 (2)只要將網(wǎng)卡芯片正確的初始化了,則網(wǎng)卡芯片就能工作(意思是網(wǎng)卡驅(qū)動(dòng)dm9000x.c和dm9000x.h依賴于這里的初始化)。 (3)dm9000初始化的代碼在start_armboot最開始初始化的一堆函數(shù)數(shù)組中的board_init函數(shù)中,其中調(diào)用的是dm9000_pre_init這個(gè)函數(shù)。C、移植步驟
見博客http://blog.csdn.net/oqqhutu12345678/article/details/72547924
 
(1)從三星版本的代碼中可以看出,它操作的是bit20-bit23,對照數(shù)據(jù)手冊中寄存器定義,可以看出三星的開發(fā)板DM9000是接在Bank5上的。
- 而我們接在bank1上的,因此我們需要操作的bit位是bit4-bit7。
 
步驟2:基地址的配置(在smdkv210single.h中)
(1)CONFIG_DM9000_BASE是DM9000網(wǎng)卡通過SROM bank映射到SoC中地址空間中的地址。
- 這個(gè)地址的值取決于硬件接到哪個(gè)bank,這個(gè)bank的基地址是SoC自己定義好的。
 - 譬如我們這里接到了bank1上,bank1的基地址是0x88000000(但實(shí)際寫的是0x88000300)。
 
- DM9000_IO表示訪問芯片IO的基地址,直接就是CONFIG_DM9000_BASE;
 - DM9000_DATA表示我們訪問數(shù)據(jù)時(shí)的基地址,因?yàn)镈M9000芯片的CMD引腳接到了ADDR2,因此這里要+4(0b100,對應(yīng)ADDR2)
 
總結(jié)
以上是生活随笔為你收集整理的uboot移植——使用三星官方的uboot进行移植的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: Keras中文文档总结
 - 下一篇: 有赞下拉菜单html,有赞vant-ui