分享tiny4412,emmc燒錄u-boot, 支持fastboot模式燒寫emmc

本人是第一次在此發帖,希望大家多多支持,發帖目的是爲了分享,分享的目的是傳遞開源的精神。
Tiny4412開發板剛拿到手是,看了下介紹,發現superboot是個好東西,但是不開源,這個嚴重與開源思想不符合。

前言:
按照光盤介紹編譯燒寫U-boot也無法啓動板子,只有superboot使用後纔可以啓動板子。到此大家估計很多和我想的一樣,如何使用開源的u-boot來啓動開發板。

言歸正傳,我們的目的是要用u-boot來運行tiny4412.

正文:
首先要注意的是,原版的內核配置把CONFIG_ARM_TRUSTZONE給打開了,這個與superboot.bin是配套使用的,但是u-boot經研究發現暫不支持TZ模式,所以內核配置要把這個選項去掉。不然按照教程會出現死機。論壇也有很多網友發現了此現象,不再贅述。(後面有時間本人會研究下trustzone機制)

把TZ選項去掉後,通過SD卡燒錄u-boot可以把板子帶起來,這個不是我們要講述的重點,我們要講的是如何把u-boot燒錄到emmc中,這個友善沒有提供方法,其實不難。

emmc其實和SD卡類似,都是SD設備,emmc是8-bit模式,SD是4-bit模式。TINY4412是eMMC4.4. 既然sd卡能燒,那麼emmc一定可以燒。

SD卡燒錄,其實通過友善教程,在U-boot源碼目錄下有sd_fusing.sh,打開看下即可知道燒錄原理。這個不講了,有興趣的朋友可以看下,很見到。就是把各個bin文件按照指定位置燒到SD卡的系統分區中。

那麼eMMC如何燒寫呢,這是我們要講的重點。在這裏不得不講一下DNW工具,這個可以通過USB把電腦端的文件燒錄到目標板的內存中。附件是dnw Linux完整源碼包,解要到一個文件夾,裏面有dnw.c , Makefile, 預編譯dnw(x86_64). 大家可以直接使用或是自己編譯,編譯後的dnw 可以複製到/usr/bin,並chmod 777 /usr/bin/dnw.

u-boot中斷也支持dnw指令,所以eMMC燒錄就有可能了,因爲電腦上的u-boot.bin固件可以通過dnw燒錄到開發板的內存了。。。。

編譯uboot過程友善的文檔已經寫的很完善,大家自己參考並編譯u-boot. 編譯完成後u-boot目錄下有:
u-boot.bin
進入u-boot/sd_fuse/執行make,可以生成mkbl2工具,
進入u-boot/sd_fuse/tiny4412目錄下可以看到bl2.bin  E4412_N.bl1.bin  E4412_tzsw.bin三個bin,其中bl2.bin在製作SD啓動卡時會生成,我們也需要此文件。

下面講如何使用dnw下載固件到開發板內存, 注意本人是以Ubuntu環境來調試,使用Windows的朋友自己對照流程。

1 下載附件dnw編譯,上面已經講了,
2 按照友善文檔,製作SD啓動卡,開發板SW2開關選擇SD啓動.
3 把串口先連接PC與開發板。
4 插製作好的SD卡到開發板,並給開發板上電SW1.
5 鍵盤按任意鍵盤進入uboot終端,此時輸入help可以看到很多指令。

6 現在我們進入了SD卡模式啓動的u-boot. 現在我們看下mmc設備信息:
u-boot模式下輸入:
>mmcinfo 0
省略。。。
>mmcinfo 1
Device: S5P_MSHC4
Manufacturer ID: 15
OEM: 100
Name: M4G1Y
Tran Speed: 0
Rd Block Len: 512
MMC version 4.0
High Capacity: Yes
Size: 3728MB (block: 7634944)
Bus Width: 8-bit
Boot Partition Size: 2048 KB

上面兩條指令分別執行,可以發現 mmc 0就是我們的SD卡,mmc 1設備就是我們要燒錄的設備eMMC,uboot返回提示是8-bit,內存容量是4G的eMMC卡。

7 繼續輸入:
>fdisk -p 0
>fdisk -p 1
partion #    size(MB)     block start #    block count    partition_Id
   1           695          6070812         1424478          0x0C
   2           320           134244          656304          0x83
   3          2057           790548         4213770          0x83
   4           520          5004318         1066494          0x83

這兩條指令是分別查看mmc 0/1設備的分區表信息。設備mmc1的分區信息,即eMMC分析,注意這個是superboot分區信息,我們就用這個分區。

分區1 是FAE分區, 分區2 是給system的,分區3是user-data, 分區4 是 cache.

8 格式化eMMC, u-boot模式下輸入如下指令來格式化eMMC設備。
>fdisk -c 1 320 2057 520
執行後會返回分區信息,繼續格式話分區1,2,3,4
>fatformat mmc 1:1
這句話意思是對mmc 1設備的第一分區格式作fat格式化。
>ext3format mmc 1:2
>ext3format mmc 1:3
>ext3format mmc 1:4
上面三個指令是分別對eMMC的分區2,3,4作ext3格式化。

到此我們完成了對eMMC的設備的格式化。

接下來我們要想辦法燒錄bl1.bin, bl2.bin, u-boot.bin, tzsw.bin燒錄到eMMC中。

9 從PC端下載固件到開發板Memory中。
剛纔我們重點介紹了dnw, 接下來我們要使用此工具來下載固件到開發板內存中。注意是下載到內存,把固件數據緩存起來,到時要燒錄到eMMC中。
首先我們要打開emmc設備
u-boot下輸入:
>emmc open 1
eMMC OPEN Success.!!
                        !!!Notice!!!
!You must close eMMC boot Partition after all image writing!
!eMMC boot partition has continuity at image writing time.!
!So, Do not close boot partition, Before, all images is written.!
上面提示emmc開啓成功,注意說明,emmc一旦打開,需要連續燒錄,燒錄完成後可以關閉emmc.

10 接下來我們要運行dnw
u-boot下面輸入:
>dnw
OTG cable Connected!
Now, Waiting for DNW to transmit data
提示等待數據輸入,這裏就是等待我們從PC端通過DNW傳送數據過來。

此時在PC端終端串口,cd到u-boot目錄所在路徑
user@~/u-boot/:
輸入: dwn sd_fuse/tiny4412/E4412_N.bl1.bin

此時u-boot中斷會提示傳送校驗完成,此時已經把bl1.bin通過USB傳送到了memeory的0xc0000000起始地址,大小8KB.
接下來我們燒錄bl1.bin到eMMC中,u-boot下繼續輸入:
>mmc write 1 0xc0000000 0 0x10
會提示寫入信息,說明已經寫入成功。這個是把剛纔從PC端通過dnw下載下來的bl1.bin固件下載到emmc中,起始0, 16個block, 一個block是512B, 16*512=8*1024=8KB. 這個是bl1.bin的存放位置。

以此類推,燒錄bl2.bin. u-boot.bin, tzsw.bin
-----------------------------------------------------------------------------------------------------------------------------------------------------
u-boot終端繼續輸入:
>dnw
PC端輸入: (注意輸入內容是以 dnw 開始的,前面是當前路徑,便於理解)
user@~/u-boot/:  dwn sd_fuse/tiny4412/bl2.bin
u-boot下繼續輸入:
>mmc write 1 0xc0000000 0x10 0x1C
bl2.bin實際大小約14K,分配的空間是16K. 其實是第16個block開始,寫入28個block, 28*512B=14*1024=14K
注意這個區域預分配是32個Block,所以下一個開始是32+16=48
------------------------------------------------------------------------------------------------------------------------------------------------------
u-boot終端繼續輸入:
>dnw
PC端輸入: (注意輸入內容是以 dnw 開始的,前面是當前路徑,便於理解)
user@~/u-boot/:  dwn u-boot.bin
u-boot下繼續輸入:
>mmc write 1 0xc0000000 0x30 0x21D
u-boot.bin實際大小約270K,分配的空間是328K. 其實是第48個block開始,寫入541個block, 541*512B=270.5*1024 約270K
------------------------------------------------------------------------------------------------------------------------------------------------------
u-boot終端繼續輸入:
>dnw
PC端輸入: (注意輸入內容是以 dnw 開始的,前面是當前路徑,便於理解)
user@~/u-boot/:  dwn sd_fuse/tiny4412/E4412_tzsw.bin
u-boot下繼續輸入:
>mmc write 1 0xc0000000 0x2c0 0xB8
tzsw.bin實際大小約92K,分配的空間是160K. 其實是第704個block開始,寫入184個block, 184*512=92*1024=92K
------------------------------------------------------------------------------------------------------------------------------------------------------
啓動分區到此全部寫入完成,注意一定要關閉emmc,
u-boot下繼續輸入:
>emmc close 1
eMMC CLOSE Success.!!
關閉emmc設備,提示關閉成功。此時我們已經把啓動文件全部燒錄到了eMMC中。
-------------------------------------------------------------------------------------------------------------------------------------------------------

接下來我們可以把開發板的SW2撥動到NAND啓動,同時u-boot中斷輸入reset, 並在電腦鍵盤按下任意鍵,此時我們可以看到:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
U-Boot 2010.12-00000-g3e284d5-dirty (Jul 04 2014 - 17:40:58) for TINY4412


CPU:    S5PC220 [Samsung SOC on SMP Platform Base on ARM CortexA9]
        APLL = 1400MHz, MPLL = 800MHz

Board:  TINY4412
DRAM:   1023 MiB

vdd_arm: 1.2
vdd_int: 1.0
vdd_mif: 1.1

BL1 version:  N/A (TrustZone Enabled BSP)


Checking Boot Mode ... EMMC4.41
REVISION: 1.1
MMC Device 0: 3728 MB
MMC Device 1: 1876 MB
MMC Device 2: N/A
Read... Bootmode reg 0x00000000
Get Bootmode reg 0xf3ca4c36
ModeKey Check... run normal_boot
Net:    No ethernet found.
Hit any key to stop autoboot:  0
TINY4412 #
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

大功告成啊,我們的u-boot已經成功寫入到了eMMC中,並可以成功啓動。

還有一件非常重要的事情我們還有做,就是啓動參數寫入,我們bootargs寫入到env分區,注意ENV分區在TZSW分區後面,內核分區之前。即 TZSW | ENV | KERNEL
從eMMC啓動u-boot後,在u-boot終端輸入:
>setenv bootargs console=ttySAC0,115200n8 androidboot.console=ttySAC0 uhost0=n ctp=2 skipcali=y vmalloc=512m lcd=S70
>saveenv
設置並保存啓動參數,此時再重啓板子,進入U-boot。
u-boot下輸入:
>printenv
查看剛纔燒錄的啓動參數是否成功。

11 燒寫kernel, system, ramdisk
下面燒kernel, system,ramdisk和SD卡燒錄一樣。
u-boot繼續輸入
>fastboot
進入fastboot模式

PC端使用fastboot flash kernel zImag, fastboot flash system system.img, fastboot flash ramdisk ramdisk-u.img即可把剩下全部的img燒錄到eMMC中。重啓開發板,就可以啓動開發板。

雖然沒有開源的superboot,但是依然無法阻擋我們一個開源的心。

還有本人已經成功在u-boot加入按鍵啓動u-boot的fastboot功能,在此貼一併發出。。。

使用開發板底板的K1按鍵,按住K1,開機即可進入系統的fastboot模式。 同時支持fastboot下載完成後執行fastboot reboot bootloader重啓模式。

功能已經全部驗證。

到此位置,針對u-boot燒錄eMMC的過程基本已經講解完畢,希望給大家帶來幫助,給友善的開源u-boot添磚加瓦。
發佈了10 篇原創文章 · 獲贊 4 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章