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
最後系統就跑起來了。