主题 : 分享tiny4412,emmc烧录u-boot, 支持fastboot模式烧写emmc 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 105548
精华: 0
发帖: 12
金钱: 60 两
威望: 12 点
贡献值: 0 点
综合积分: 24 分
注册时间: 2014-06-27
最后登录: 2019-01-03
楼主  发表于: 2014-07-04 20:13

 分享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添砖加瓦。

谢谢
Harry



附件: dnw.tar.gz (9 K) 下载次数:406
附件: fastboot_kernel_patch.txt (1 K) 下载次数:281
附件: fastboot_uboot_patch.txt (3 K) 下载次数:274
级别: 新手上路
UID: 105548
精华: 0
发帖: 12
金钱: 60 两
威望: 12 点
贡献值: 0 点
综合积分: 24 分
注册时间: 2014-06-27
最后登录: 2019-01-03
1楼  发表于: 2014-07-04 20:25
自己先顶下。

注意使用附件补丁后,在启动系统后,执行adb reboot bootloader即可进入u-boot的fastboot模式。

目前LCD还有显示信息,论坛有兴趣的朋友可以帮忙完善和分享一下。
级别: 骑士
UID: 29604
精华: 9
发帖: 171
金钱: 1830 两
威望: 366 点
贡献值: 9 点
综合积分: 522 分
注册时间: 2010-10-01
最后登录: 2016-04-13
2楼  发表于: 2014-07-05 10:57
非常好的帖子。
级别: 新手上路
UID: 56972
精华: 0
发帖: 46
金钱: 235 两
威望: 47 点
贡献值: 0 点
综合积分: 92 分
注册时间: 2011-10-17
最后登录: 2014-10-07
3楼  发表于: 2014-07-09 13:52
请问你使用的是
Tiny4412ADK增强版 还是Tiny4412SDK标准版 ?
级别: 新手上路
UID: 105548
精华: 0
发帖: 12
金钱: 60 两
威望: 12 点
贡献值: 0 点
综合积分: 24 分
注册时间: 2014-06-27
最后登录: 2019-01-03
4楼  发表于: 2014-07-09 17:33
Tiny4412 SDK标准版,应该差不多,增强板多了miniPCI卡槽,支持3G网卡。
级别: 新手上路
UID: 56972
精华: 0
发帖: 46
金钱: 235 两
威望: 47 点
贡献值: 0 点
综合积分: 92 分
注册时间: 2011-10-17
最后登录: 2014-10-07
5楼  发表于: 2014-07-10 08:29

 回 4楼(ahai518) 的帖子

嗯,Tiny4412 SDK标准版还多了miniUSB,没有miniUSB,因此采用你的方法采用DNW不可行,不知道是否有其它方式?
级别: 新手上路
UID: 87100
精华: 0
发帖: 12
金钱: 60 两
威望: 12 点
贡献值: 0 点
综合积分: 24 分
注册时间: 2013-01-30
最后登录: 2014-07-21
6楼  发表于: 2014-07-10 13:46
大家都知道在友善的u-boot教程中,从SD卡启动开发板,SD卡被uboot分配了节点0,emmc被分配到节点1,之后的分区和格式化命令都可以自由选择节点0或节点1的设备,但是,fastboot默认烧写的就是烧写节点0。
下面两种思路是不是可行?
1、修改uboot fastboot命令,让其可以直接烧写节点1
2、修改uboot的哪个地方,把sd卡认成节点1,emmc认成节点0,fastboot不改。
级别: 新手上路
UID: 105548
精华: 0
发帖: 12
金钱: 60 两
威望: 12 点
贡献值: 0 点
综合积分: 24 分
注册时间: 2014-06-27
最后登录: 2019-01-03
7楼  发表于: 2014-07-11 13:32
回楼上, 不建议这么做,修改fastboot烧写为1,你烧进去后,从emmc启动后是修改过的u-boot,此时mmc 1是sd card, mmc 0是emmc,和SD卡启动正好相反。u-boot就无法刷进去了。

第二个问题,没深入研究,只是目前uboot是按从哪个启动就认为哪个是mmc 0.
级别: 新手上路
UID: 87100
精华: 0
发帖: 12
金钱: 60 两
威望: 12 点
贡献值: 0 点
综合积分: 24 分
注册时间: 2013-01-30
最后登录: 2014-07-21
8楼  发表于: 2014-07-11 23:25
ahai518你好,第一种思路确实有问题,破坏了fastboot的通用性。
第二种思路确实有人已经实现,请看http://blog.csdn.net/yunfly163/article/details/7495156,他描述了sd卡启动之后烧写emmc的方法,显然他是从sd卡启动的,但是emmc却认成了节点0。从他的代码片段上看还是和友善有不小差别,我水平有限,不知道怎么实现的,你要是有兴趣可以研究一下。
此外他还提到另一种使用Sdfuse命令来烧写emmc的方法,优点是不用usb,有点像友善的superboot,但是友善开源的uboot不支持Sdfuse。
级别: 新手上路
UID: 105548
精华: 0
发帖: 12
金钱: 60 两
威望: 12 点
贡献值: 0 点
综合积分: 24 分
注册时间: 2014-06-27
最后登录: 2019-01-03
9楼  发表于: 2014-07-12 17:26
回复楼上:
Tiny4412 u-boot 你可以看下:
u-boot/board/samsung/tiny4412/tiny4412.c

int board_mmc_init(bd_t *bis)
{
#ifdef CONFIG_S3C_HSMMC
    setup_hsmmc_clock();
    setup_hsmmc_cfg_gpio();

    if (OmPin == BOOT_EMMC_4_4 || OmPin == BOOT_EMMC) {
#ifdef CONFIG_S5PC210
        smdk_s5p_mshc_init();
#endif
        smdk_s3c_hsmmc_init();
    } else {
        smdk_s3c_hsmmc_init();
#ifdef CONFIG_S5PC210
        smdk_s5p_mshc_init();
#endif
    }
#endif
    return 0;
}

这个初始化,明显可以看出,当为eMMC启动时,先初始化smdk_s5p_mshc_init(), 再初始化smdk_s3c_hsmmc_init(); 这两个分别注册register_mmc,索引对应的会增加,而mshc就是emmc, HSMMC就是SDMMC, 所以从emmc启动,emmc设备为mmc 0 ,sdmmc为mmc 1. 而从sd卡启动,这两个初始化相反了(见上面else),此时mmc 0 就是SD,mmc 1就是emmc.

do_mmcinfo 寻找设备就是按照register_mmc时注册的顺序(mmc 0,mmc 1)来查找的。

所以你不妨把上面的 else里面的初始化顺序对调,看下是不是可以默认mmc 0为emmc.

mmc 0/1顺序相反 就是这个引起的。