tiny4412燒寫uboot到emmc及更新kernel rootfs

uboot: https://github.com/zczjx/uboot_tiny4412

kernel: https://github.com/zczjx/linux-4.4.38-for-tiny4412

rootfs:https://github.com/zczjx/buildroot-es_udk

採用火哥大神的項目玩一玩tiny4412,本篇記錄一下燒寫的過程,中間走了一些彎路。

參考:http://wiki.100ask.org/Tiny4412

           https://www.cnblogs.com/pengdonglin137/articles/4161084.html

1.首先編譯uboot,並用sd卡製作sd卡啓動,這裏不再詳細說明。我們的目的是想把uboot燒寫進emmc中。emmc其實和SD卡類似,都是SD設備,emmc是8-bit模式,SD是4-bit模式。TINY4412是eMMC4.4. 既然sd卡能燒,那麼emmc一定可以燒。


2.在這裏不得不講一下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燒錄到開發板的內存。到內存之後可以使用emmc write指令將uboot燒寫進emmc中。

3.現在通過SD啓動方式進入UBOOT中,在uboot中串口模式下輸入:

>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卡。

4.繼續輸入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.

5. 格式化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中。

6. 從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。

7.接下來我們要運行dnw

u-boot下面輸入:
>dnw  0x50000000
OTG cable Connected!
Now, Waiting for DNW to transmit data
提示等待數據輸入,這裏就是等待我們從PC端通過DNW傳送數據過來,其中0x50000000指明瞭將要把文件下載到tiny4412內存的0x50000000地址處,如果不帶0x50000000會下載不成功。

在PC端運行:sudo dnw -a 0x50000000 E4412_N.bl1.bin

其中-a也指明瞭下載到0x50000000地址處。

然後再在uboot中:  mmc write 1 0x50000000 0 0x10

將內存中的文件燒寫進emmc中。

依次燒寫如下文件:

Uboot: dnw 0x50000000

PC:    sudo dnw -a 0x50000000 ../tiny4412_100_ask/uboot_tiny4412/sd_fuse/tiny4412/bl2.bin 

Uboot: mmc write 1 0x50000000 0x10 0x1c
--------------------------------------------------------
Uboot: dnw 0x50000000

PC:    sudo dnw -a 0x50000000 ../tiny4412_100_ask/uboot_tiny4412/u-boot.bin

Uboot: mmc write 1 0x50000000 0x30 0x230

--------------------------------------------------------
Uboot: dnw 0x50000000

PC:    sudo dnw -a 0x50000000 ../tiny4412_100_ask/uboot_tiny4412/sd_fuse/tiny4412/E4412_tzsw.bin 

Uboot: mmc write 1 0xc0000000 0x2c0 0xB8

Uboot: emmc close 1
 

這樣就把uboot燒寫進emmc中了。設置emmc啓動,重啓之後就可以看到uboot運行了。

接着設置環境變量,

setenv bootargs root=/dev/mmcblkp3 rootfstype=ext4 console=ttySAC0,115200n8 androidboot.console=ttySAC0 uhost0=n ctp=2 skipcali=y vmalloc=384m lcd=S70

saveenv

其中root=/dev/mmcblkp3指明瞭rootfs位於emmc分區的第三個分區、這個其實是跟fastboot燒寫文件系統的位置有關係,是fastboot中指定的。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

上面只是燒寫好了uboot,接下來燒寫kernel,dtb,rootfs。

假設已經編譯好了kernel,dtb,rootfs。

uboot:fastboot

[Partition table on MoviNAND]
ptn 0 name='fwbl1' start=0x0 len=N/A (use hard-coded info. (cmd: movi))
ptn 1 name='bl2' start=N/A len=N/A (use hard-coded info. (cmd: movi))
ptn 2 name='bootloader' start=N/A len=N/A (use hard-coded info. (cmd: movi))
ptn 3 name='tzsw' start=N/A len=N/A (use hard-coded info. (cmd: movi))
ptn 4 name='kernel-3-5' start=N/A len=N/A (use hard-coded info. (cmd: movi))
ptn 5 name='kernel-4-4' start=N/A len=N/A (use hard-coded info. (cmd: movi))
ptn 6 name='ramdisk' start=N/A len=0x6800(~27262976KB) (use hard-coded info. (cmd: movi))
ptn 7 name='dtb' start=N/A len=0x800(~2097152KB) (use hard-coded info. (cmd: movi))
ptn 8 name='rootfs_k35' start=0x418C800 len=0x501D8(~336027648KB) 
ptn 9 name='rootfs_k44' start=0x18202800 len=0x202605(~-2137517056KB) 
ptn 10 name='cache' start=0x98B83C00 len=0x822FF(~546044928KB) 
ptn 11 name='fat' start=0xB9443800 len=0xADE2F(~729332736KB) 
OTG cable Connected!

這裏可以看到指明瞭rootfs_k44的起始地址爲0x18202800,這個地址換算一下就能算出是從第幾個block開始,512Byte = 1block

0x18202800   = 404760576 Byte 

404760576 / 512 = 790548  這個790548剛好是我們分區時第三個分區的起始地址

接着在下載一個在linux 端運行的fastboot工具。

fastboot flash kernel-4-4 arch/arm/boot/uImage

fastboot flash dtb arch/arm/boot/dts/exynos4412-tiny4412.dtb

fastboot flash rootfs_k44   rootfs.ext4_tiny4412 

reboot

最後系統就跑起來了。

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章