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
最后系统就跑起来了。