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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在s5pv210开发板上移植官方2101310版本的uboot

發(fā)布時間:2023/12/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在s5pv210开发板上移植官方2101310版本的uboot 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

uboot官方標(biāo)準(zhǔn)uboot移植
?解決燒錄運(yùn)行問題:
輸出錯誤信息分析:第一個SD checksum Error是第一順序啟動設(shè)備SD0(iNand)啟動時校驗和失敗打印出來的;第二個SD checksum Error是第二順序啟動設(shè)備SD2(外部SD卡)啟動時校驗和失敗打印出來的,所以外部SD卡校驗失敗,經(jīng)過對比兩份b-boot.bin的二進(jìn)制文件發(fā)現(xiàn)當(dāng)前u-boot.bin前面少了16字節(jié)的占位,導(dǎo)致mkbl1的校驗和代碼不成功。
?關(guān)于start.S文件的移植:
?確定lowlevel.S的位置:
1、確定方法有兩個,可以查看兩個文件所在的Makefile,發(fā)現(xiàn)board/samsung/goni下的lowlevel.o被包含進(jìn)去了,而另一個由于宏定義不滿足而未被包含進(jìn)去
2、或者查看已經(jīng)編譯過的uboot源碼目錄,看哪個所在目錄下被編譯成了.o文件
?解決lowlevel_init.o重定義問題:
1、首先對代碼添加開發(fā)板制鎖,和串口打印字符“O”代碼,發(fā)現(xiàn)并未起到效果
2、然后用led測試代碼添加發(fā)現(xiàn)在調(diào)用lowlevel_init.S函數(shù)之前有作用,但進(jìn)入lowlevel_init.S之后便沒有作用,由此推測原因是在燒錄uboot時是先將uboot的前8k燒進(jìn)SRAM時候lowlevel_init.S不在其中,所以要將鏈接腳本u-boot.lds進(jìn)行修改,將lowlevel_init.o放到前面,這樣就保證lowlevel_init函數(shù)被鏈接到前8k中去了
3、修改后進(jìn)行編譯后出現(xiàn)lowlevel.o重定義的錯誤,原因是這個函數(shù)被鏈接時鏈接了2次,一次是lowlevel_init函數(shù)本身目錄生成libgoni.o時,另一次是生成最終的u-boot時,那么解決思路是讓它在當(dāng)前目錄下Makefile中不被鏈接,只在最終時鏈接,方法是參考start.S文件的解決方法,因為start.S這個文件和lowlevel_init.o這個文件情況一樣,但卻沒有這個重定義問題,找到start.S目錄下的Makefile,發(fā)現(xiàn)用了all: $(obj).depend $(START) $(LIB)這種方式,便避免了問題,所以我們也采用這種方法進(jìn)行改造,便解決了問題。
?添加初始化DDR的代碼:
1、在成功初始化串口后,直接轉(zhuǎn)入_main函數(shù),在_main函數(shù)中直接在DDR中設(shè)置棧,然后進(jìn)行板級初始化(也就是進(jìn)入到第二階段了),所以我們要添加DDR初始化,并重定位。
2、在Samsung版本的初始化DDR函數(shù)和cpu_init.S文件和s5pc110.h頭文件相關(guān),cpu_init.S文件和lowlevel.S文件一樣,都要放到前8k中,所以處理方法一樣,然后對cpu_init.S代碼進(jìn)行修整,把無用代碼去掉,將缺少的宏定義人工添加處理上;再對s5pc110.h進(jìn)行修整;調(diào)用初始化代碼,在后面添加輸出字符“K”,經(jīng)過驗證看到OK字樣。說明DDR初始化成功。
?重定位代碼的移植:
?在跳轉(zhuǎn)到第二階段的_main函數(shù)之前添加重定位的代碼,根據(jù)Samsung版本的代碼移植設(shè)置棧、movi_bl2_copy、清bss等代碼,movi_bl2_copy的代碼在movi.c中,從原來版本進(jìn)行拷貝,去掉里面的無關(guān)代碼,這個movi.o也要放到前8k中,所以處理方法與lowlevel_init.o一樣。該文件中的宏定義依賴于movi.h,所以再將movi.h拷貝過來,movi.c中的其他頭文件先暫不做處理,(再對_main中進(jìn)行處理,將里面的重定位代碼去掉)然后進(jìn)行編譯,出現(xiàn)movi.c中reg.h未定義,解決方法將它注釋掉;再編譯出現(xiàn)奇怪的連接錯誤:u-boot contains relocations other than R_ARM_RELATIVE,然后在Ubuntu下用grep "R_ARM_RELATIVE" -nR *搜索(原因是在ubuntu下可以搜索到所有文件,包括Makefile),發(fā)現(xiàn)在Makefile中有一個重定位的規(guī)則,解決方法是將它屏蔽掉;再進(jìn)行編譯,正確。但啟動后發(fā)現(xiàn)毫無作用,進(jìn)行檢測在代碼前面加上打印“A”的調(diào)試信息發(fā)現(xiàn)沒有顯示,表示重定位代碼根本就沒有運(yùn)行,再進(jìn)行前面lowlevel_init中的復(fù)查,發(fā)現(xiàn)里面有一個關(guān)于自鎖檢查的循環(huán)應(yīng)該出來問題,導(dǎo)致不能返回,解決方法是將下面的mov lr, r11和mov pc, lr放到初始化DDR后,讓它直接返回(這里經(jīng)過試驗驗證還要將bl internal_ram_init這句代碼屏蔽掉,不然會卡在里面出不來)即可,再次編譯啟動就看到了uboot的打印信息。至此說明uboot的DDR初始化和重定位已經(jīng)成功,后面就是第二階段的移植了。
?CPU時鐘顯示:
1、先在print_cpuinfo打印CPU信息函數(shù)中更改顯示時鐘的代碼(按照以前Samsung的格式方法)
2、原來的uboot中并沒有代碼初始化時鐘,所以是默認(rèn)的iROM中的初始化,ARMCLK是400MHZ,所以要進(jìn)行修改
3、在lowlevel_init.S中刪除以前的初始化時鐘代碼,添加新的時鐘初始化代碼(ARMCLK是1000MHZ),并在頭文件中添加相應(yīng)的宏
4、添加過后進(jìn)行編譯出現(xiàn)很奇怪的錯誤:Error: internal_relocation (type: OFFSET_IMM) not fixed up,其實(shí)就是沒有加頭文件的原因,添加#include <s5pc110.h>就正確了
?board、DDR、MACH_TYPE的移植:
board和DDR配置比較簡單,不做詳細(xì)記錄;MACH_TYPE在board_init中定義,在這個uboot中是將機(jī)器碼集中配置在一個頭文件中的,所以將其改成我們開發(fā)板的MACH_TYPE_SMDKV210即可
?去掉oneNand,添加SD/MMC:
1、剛開始為了簡便只是單純地把onenand_init函數(shù)給屏蔽掉了,這樣編譯通過也可以啟動進(jìn)入命令行,但是存在問題,因為原來的環(huán)境變量默認(rèn)放在onenand中,這樣修改還是無法解決這個問題
2、正確的方法是將限制這個函數(shù)的宏定義CONFIG_CMD_ONENAND注釋掉,這樣編譯會出現(xiàn)關(guān)于環(huán)境變量的保存和重定位等錯誤,錯誤在/common/env_ononand.c中其實(shí)在配置頭文件中有關(guān)于定位env環(huán)境變量位置的一些宏定義,CONFIG_ENV_IS_IN_ONENAND等,它們的作用就是配置要把環(huán)境變量放到哪里;我們也可以另一個角度來思考為什么會編譯env_ononand.c這個文件,我們進(jìn)到相應(yīng)目錄下的Makefile中看到這個.o文件就被CONFIG_ENV_IS_IN_ONENAND這個宏所限制,所以我們先將這幾個宏定義去掉,看會發(fā)生什么錯誤
3、編譯出現(xiàn)了#error Define one of CONFIG_ENV_IS_IN_{EEPROM|FLASH|DATAFLASH|ONENAND|SPI_FLASH|NVRAM|MMC|FAT|REMOTE|UBI} or CONFIG_ENV_IS_NOWHERE,這樣我們就知道了我們必須定義環(huán)境變量所在的位置,那么我們就要定義到SD/MMC中,我們便添加宏#define CONFIG_ENV_IS_IN_MMC ?1
4、這個宏的添加將會導(dǎo)致相應(yīng)的env_mmc.c被編譯,可能會出現(xiàn)一些文件中相關(guān)的錯誤,經(jīng)過編譯出現(xiàn)了error: 'CONFIG_SYS_MMC_ENV_DEV' undeclared (first use in this function),在這個文件中向下查找發(fā)現(xiàn)saveenv中的find_mmc_device函數(shù)也引用了這個宏,在以前uboot分析時知道這個函數(shù)是在查找mmc設(shè)備號,0表示內(nèi)部iNand,1表示外部SD卡
5、再次編譯,在onenand.c中出現(xiàn)問題,現(xiàn)在我們已經(jīng)不需要這個文件了,便直接在相應(yīng)目錄下Makefile中去掉即可,再次編譯成功
?SD卡驅(qū)動移植:
1、uboot2013.10中:驅(qū)動相關(guān)的文件主要有:drivers/mmc/mmc.c、drivers/mmc/sdhci.c、drivers/mmc/s5p_sdhci.c、board/samsung/goni/goni.c
?三星移植版本中,驅(qū)動相關(guān)的文件主要有:drivers/mmc/mmc.c、drivers/mmc/s3c_hsmmc.c、cpu/s5pc11x/cpu.c、cpu/s5pc11x/setup_hsmmc.c
?先將Samsung中的mmc.c和s3c_hsmmc.c復(fù)制到當(dāng)前uboot中,然后對相應(yīng)目錄下的Makefile進(jìn)行修改,將原來的驅(qū)動文件去除,添加上我們新移植的
2、將原來Samsung版本cpu_mmc_init函數(shù)的內(nèi)容添加到board_mmc_init中,進(jìn)行代碼瀏覽,將需要移植的頭文件和修改的地方進(jìn)行修改,進(jìn)行編譯,查看錯誤
3、regs.h沒有定義出現(xiàn)錯誤,將其注釋掉(同時也將setup_hsmmc.c中的去掉),編譯;cmd_mmc.c這個文件出現(xiàn)錯誤,這個文件明顯是和mmc目錄相關(guān)的,因為我們將mmc的驅(qū)動改變了,所以相應(yīng)的命令也會改變,所以我們的解決方法是將原來Samsung的這個文件拷貝過來,編譯;出現(xiàn)s3c_hsmmc.c這個文件中的宏未定義的錯誤,加上頭文件s5pc110.h(推測這個頭文件應(yīng)該是在regs.h中有包含,同時也將setup_hsmmc.c中的加上),編譯;mmc_write.c這個文件出現(xiàn)錯誤,這個文件應(yīng)該和原來的mmc.c有關(guān),但我們將它替換了,所以我們就把他在Makefile中去掉,編譯;出現(xiàn)MPLL未定義的錯誤,原因是頭文件未包含,這個頭文件應(yīng)該用鏈接符號的方式來定義<asm/arch/clk.h>才可以,編譯成功,經(jīng)過測試mmc讀寫也都成功
?環(huán)境變量的移植:
1、先分析env環(huán)境變量應(yīng)該放在哪里,它的位置不能和uboot、kernel、rootfs等沖突,根據(jù)重定位movi_bl2_copy代碼的#define MOVI_BL2_POS ((eFUSE_SIZE / MOVI_BLKSIZE) + MOVI_BL1_BLKCNT + MOVI_ENV_BLKCNT) 就是1+16+32,其中的1就是扇區(qū)0(空閑的),16是就是扇區(qū)1-16(uboot的BL1),32就是扇區(qū)17-48(存放ENV的),49自然就是uboot的BL2開始扇區(qū)了,所以我們只要將ENV分區(qū)放到17扇區(qū)即可。
2、我們分析這個uboot代碼中的saveenv函數(shù)中的mmc_get_env_addr和write_env得知通過這個宏CONFIG_ENV_OFFSET來定義ENV在iNand(我們之前把ENV保存在iNand中)的起始扇區(qū)位置,所以這里我們要把起始扇區(qū)改為17
3、再將初始環(huán)境變量整理一下,在配置頭文件中進(jìn)行刪除增添,編譯后對iNand的17扇區(qū)進(jìn)行讀測試,正確
?網(wǎng)卡驅(qū)動的移植:
1、我們要在這個uboot中添加網(wǎng)絡(luò)支持,瀏覽代碼發(fā)現(xiàn)網(wǎng)絡(luò)初始化依賴于CONFIG_CMD_NET這個宏,所以我們首先要把它定義在頭文件中(這里有一個關(guān)鍵點(diǎn):在配置頭文件中有這樣一句#undef CONFIG_CMD_NET,會取消我們的定義,所以一定要記得把它去掉才行),然后分別添加ping和tftp命令,這兩個命令也分別依賴宏定義,將其添加上,經(jīng)過編譯啟動后的現(xiàn)象是可以出現(xiàn)這兩個命令,但是并不能起作用
2、經(jīng)過前面的代碼,我們并沒有看到有初始化dm9000網(wǎng)卡的代碼,所以還要先移植初始化代碼,還是和原來一樣放到board_init中,編譯運(yùn)行還是不起作用

3、根據(jù)uboot啟動信息提示定位錯誤代碼:Net Initialization Skipped和No ethernet found,前一個錯誤是沒有定義自己的board_eth_init函數(shù),我們定義一個同名的board_eth_init這個函數(shù)就可以,第二個錯誤根據(jù)代碼分析是由于eth_devices(每一個網(wǎng)卡驅(qū)動都要在這個鏈表里面注冊,這樣才能發(fā)現(xiàn)網(wǎng)卡驅(qū)動,不然就會提示找不到網(wǎng)卡)這個鏈表是空的,所以我們在這個函數(shù)之前就要在這個鏈表中注冊好網(wǎng)卡,那么注冊網(wǎng)卡驅(qū)動的函數(shù)在dm9000x.c中的dm9000_initialize,我們就要調(diào)用這個函數(shù),所以我們就在自己定義的board_eth_init中調(diào)用dm9000_initialize,編譯時出現(xiàn)board_eth_init重定義問題,解決方法是將原來的board_eth_init注釋掉,這樣便實(shí)現(xiàn)了網(wǎng)絡(luò)模塊。


?

總結(jié)

以上是生活随笔為你收集整理的在s5pv210开发板上移植官方2101310版本的uboot的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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