01
主要的平臺(tái)環(huán)境
虛擬機(jī)環(huán)境 : 百問(wèn)網(wǎng)的ubuntu16.04 x 64位
硬件平臺(tái) : JZ2440平臺(tái)-采用的s3c2440,ARM9
uboot:2012-04-01
交叉編譯工具鏈 : arm-linux-gcc-4.4.3
Kernel :Linux-3.4.2
文件系統(tǒng) : yaffs2文件系統(tǒng)+busybox-1.22.1+tslib-1.4
QT版本 : qt-everywhere-opensource-src-5.6.0
02
uboot編譯器前準(zhǔn)備
首先我們可以到uboot官網(wǎng)下載其源碼
然后獲得百問(wèn)網(wǎng)的補(bǔ)丁patch。
從uboot官網(wǎng)獲得的是壓縮包,需要進(jìn)行解壓獲得uboot源文件:
tar jxvf u-boot-2012.04.01.tar.bz2
補(bǔ)丁就是對(duì)uboot源文件進(jìn)行文件內(nèi)容的修改等,以便適配硬件平臺(tái)。
cd ./u-boot-2012.04.01
patch -p1 <../u-boot-2012.04.01_100ask.patch
由于我的硬件上NandFlash有幾個(gè)區(qū)有壞塊,所以我把內(nèi)核分區(qū)加大,不然文件系統(tǒng)落在壞塊處,無(wú)法被掛載,于是進(jìn)行了uboot的分區(qū)修改,對(duì)u-boot-2012.04.01/include/configs/smdk2440.h下內(nèi)核分區(qū)修改為了36M,如下圖所示:
上面的"食材"準(zhǔn)備好了,我們還需要"廚具"來(lái)進(jìn)行做飯,編譯器代碼的編譯器,由于最終編譯出來(lái)的文件需要在S3C2440平臺(tái)上執(zhí)行,所以肯定就需要使用對(duì)應(yīng)的編譯器,不能使用ubuntu虛擬機(jī)自帶的編譯器。
編譯器本質(zhì)上就是一個(gè)軟件,跟Keil或者IAR中的集成開(kāi)發(fā)環(huán)境里的編譯器是類(lèi)似的,只是在linux里面一般不再通過(guò)圖形化界面操作,而是通過(guò)命令行操作。
小哥已經(jīng)把相應(yīng)的arm-linux-gcc-4.4.3.tar壓縮文件解壓,相關(guān)的工具鏈就只在如下目錄下:
/home/book/WorkSpace/Qt/src/arm-linux-gcc-4.4.3/opt/FriendlyARM/toolschain/4.4.3/bin/
也可以看到該目錄下的工具,編譯就靠他們了:
03
uboot編譯
編譯還是不難的,因?yàn)閡boot支持非常多的單板,所以我們首先要配置編譯選項(xiàng),選擇2440平臺(tái),命令如下:
make CROSS_COMPILE=/home/book/WorkSpace/Qt/src/arm-linux-gcc-4.4.3/opt/FriendlyARM/toolschain/4.4.3/bin/arm-linux- smdk2440_config
因?yàn)樾「绮幌敫淖兿到y(tǒng)的環(huán)境變量,所以通過(guò)make指定了交叉編譯工具的絕對(duì)路徑來(lái)進(jìn)行編譯。
得到如下編譯結(jié)果:
配置OK以后,我們就可以開(kāi)始正式的源碼編譯,類(lèi)似于我們IDE環(huán)境中的錘子,執(zhí)行編譯命令:
make CROSS_COMPILE=/home/book/WorkSpace/Qt/src/arm-linux-gcc-4.4.3/opt/FriendlyARM/toolschain/4.4.3/bin/arm-linux- -j8
這里原本可以不需要-j8選項(xiàng)就可以進(jìn)行uboot源碼的編譯,而-j8表示并行編譯,也就是最多進(jìn)行8個(gè)編譯指令同時(shí)執(zhí)行,從而編譯速度更快,同樣-j4表示4條編譯指令同時(shí)執(zhí)行,一般都是在多核處理器下進(jìn)行使用會(huì)有明顯的加快效果。
最終我們可以得到u-boot.bin燒錄文件。
最終我們可以得到u-boot.bin燒錄文件。
bin文件對(duì)于玩單片機(jī)的朋友再熟悉不過(guò)了,其就是一個(gè)裸機(jī)程序,單任務(wù)順序執(zhí)行的程序。
有了一個(gè)燒錄文件我們就可以燒錄到開(kāi)發(fā)板中運(yùn)行測(cè)試了。
04
NorFlash燒錄與啟動(dòng)
在開(kāi)發(fā)板中沒(méi)有其他程序的時(shí)候,對(duì)于JZ2440我們可以選擇使用jlink燒錄器把uboot.bin文件燒錄到開(kāi)發(fā)板的NorFlash中運(yùn)行,其實(shí)與使用keil通過(guò)jlink燒錄到單片機(jī)是類(lèi)似的。
通過(guò)Jlink驅(qū)動(dòng)中的jFlash軟件工具,配置好芯片類(lèi)型為ARM9,然后把前面編譯好的uboot.bin文件加載到j(luò)Flash中,如上圖所示。
然后點(diǎn)擊菜單匯總的connect連接芯片。
如上圖所示連接OK,可以首先全部擦除Flash(如果直接寫(xiě)入,可能存在寫(xiě)入失敗的情況),然后再進(jìn)行program,把bin文件燒寫(xiě)到NorFlash上,直到完成~
然后使用MobaXterm終端軟件,使用Serial串口中斷連接,確定撥碼為NorFlash啟動(dòng)以后重啟開(kāi)發(fā)板,其開(kāi)發(fā)板便會(huì)順利打印相關(guān)信息。
在倒數(shù)未結(jié)束之前按回車(chē)即可進(jìn)入uboot的命令行,跟我們的windows啟動(dòng)中的bios是類(lèi)似的。
上圖使用mtdparts命令行來(lái)查看目前uboot里面所配置的系統(tǒng)分區(qū),其中uboot中的內(nèi)核分區(qū)大小與我們前面的修改是一致。
05
NandFlash的啟動(dòng)原理
前面我們把uboot.bin文件燒錄到NorFlash上,能夠正確的啟動(dòng),因?yàn)镹orFlash能夠支持代碼運(yùn)行的,CPU可以直接進(jìn)行總線(xiàn)的讀取,但是無(wú)法直接寫(xiě)入NorFlash,這點(diǎn)與單片機(jī)是類(lèi)似的。
我們?cè)谶M(jìn)行stm32開(kāi)發(fā)中程序一般都是在Flash上運(yùn)行的,說(shuō)明CPU可以直接讀取指令進(jìn)行運(yùn)算,而單片機(jī)中的Flash寫(xiě)數(shù)據(jù),一般都需要經(jīng)過(guò)解鎖,擦除,編程寫(xiě)入這三大步驟,而對(duì)于NandFlash是一種串行的數(shù)據(jù)讀取方式,CPU無(wú)法直接通過(guò)總線(xiàn)進(jìn)行讀寫(xiě)工作。
那既然讀寫(xiě)都不行,NandFlash該如何啟動(dòng)程序呢?
對(duì)于S3c2440有一個(gè)機(jī)制,當(dāng)上電啟動(dòng)撥碼選擇的是NorFlash啟動(dòng),則NorFlash地址映射在0x00000000處,并且CPU直接從NorFlash上啟動(dòng)程序。
當(dāng)上電啟動(dòng)撥碼選擇的是NandFlash啟動(dòng)時(shí),其芯片會(huì)把內(nèi)部的SRAM地址映射在0x00000000處,同時(shí)其芯片內(nèi)部會(huì)將NandFlash的前4K代碼數(shù)據(jù)拷貝到SRAM進(jìn)行執(zhí)行,所以當(dāng)uboot程序小于4K能夠直接運(yùn)行uboot,而當(dāng)程序大于4K,那么超出4K部分的程序?qū)o(wú)法直接得到運(yùn)行。
出于這樣的原因我們需要在程序運(yùn)行超過(guò)4K之前把超出代碼拷貝到可以運(yùn)行的介質(zhì)中進(jìn)行運(yùn)行,一般會(huì)選擇SDRAM來(lái)運(yùn)行,那么 制作一個(gè)既可以在NandFlash上運(yùn)行又可以在NorFlash中運(yùn)行的uboot ,主要把握兩點(diǎn):
1)如何判斷啟動(dòng)的類(lèi)型,是NorFlash還是NandFlash,由于NorFlash啟動(dòng)只能讀不能寫(xiě),而NandFlash啟動(dòng)會(huì)拷貝到SRAM中運(yùn)行,所以其可讀可寫(xiě),這樣就可以把兩種啟動(dòng)方式區(qū)分開(kāi)來(lái)。
2)NorFlash可以直接運(yùn)行,而NandFlash上啟動(dòng)需要進(jìn)行重定位,其實(shí)就是為了保證運(yùn)行地址與拷貝以后的地址保持一致,這樣代碼才能夠執(zhí)行。
06
NandFlash啟動(dòng)
由于百問(wèn)網(wǎng)的補(bǔ)丁已經(jīng)做好了NandFlash啟動(dòng)的代碼處理,這里我們只是操作一下如何把uboot.bin燒錄到NandFlash并啟動(dòng)即可,細(xì)節(jié)暫時(shí)不詳細(xì)過(guò)問(wèn)。
1、首先還是要從NorFlash啟動(dòng),進(jìn)入uboot的命令行,輸出printenv命令查看環(huán)境變量設(shè)置。
2、因?yàn)槲覀儨?zhǔn)備使用TFTP服務(wù)把uboot.bin文件拷貝到SDRAM中,然后再把SDRAM中的uboot.bin文件寫(xiě)入NandFlash上即可, 所以要設(shè)置好uboot的IP地址ipaddr與電腦的IP地址處于同一網(wǎng)段、服務(wù)器的IP地址serverip為電腦的IP ,如下是我們的電腦IP地址,所以通過(guò)使用setserverip 192.168.1.200來(lái)改變服務(wù)器IP地址,否則后面無(wú)法使用TFTP服務(wù)。
3、可能你會(huì)發(fā)現(xiàn)雖然開(kāi)發(fā)板與電腦進(jìn)行了連接,但是電腦上的網(wǎng)絡(luò)標(biāo)識(shí)仍然沒(méi)有網(wǎng)絡(luò)連接,因?yàn)閡boot與主機(jī)只在uboot執(zhí)行網(wǎng)絡(luò)命令才會(huì)交互數(shù)據(jù),所以電腦上看起來(lái)是沒(méi)有網(wǎng)絡(luò)連接的,不過(guò)當(dāng)我們進(jìn)行TFTP服務(wù)請(qǐng)求就會(huì)有網(wǎng)絡(luò)連接狀態(tài)顯示了。
4、然后在電腦上打開(kāi)TFTP服務(wù)軟件,并且設(shè)置好所要傳輸?shù)膗boot.bin的路徑。
5、回到uboot命令行,執(zhí)行命令:tftp 0x30000000 u-boot.bin,從而從電腦中獲得編譯好的uboot放到SDRAM中的0x30000000開(kāi)始的位置,傳輸過(guò)程如下圖所示:
6、然后我們把準(zhǔn)備寫(xiě)入NandFlash的Flash位置進(jìn)行擦除和寫(xiě)入,如果你不太記得uboot所分區(qū)域,可以使用mtdparts命令進(jìn)行查詢(xún)分區(qū),如下圖所示,然后使用命令:nand erase 起始地址 擦除長(zhǎng)度,來(lái)對(duì)uboot放置區(qū)域進(jìn)行擦除。
6、最后將之前下載到SDRAM中的u-boot.bin文件進(jìn)行燒錄到NandFlash中,采用命令:nand write 源地址 目的地址 長(zhǎng)度,如下圖所示寫(xiě)入NandFlashOK。
7、然后通過(guò)把開(kāi)發(fā)板的啟動(dòng)撥碼撥到NandFlash啟動(dòng),可以觀(guān)察到終端有輸出,這樣開(kāi)發(fā)板便從NandFlash啟動(dòng)成功了。
評(píng)論