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