本文介绍全志H3 recovery制作过程,代码基于friendly arm的Nano pi M1开发代码。
一,编译打包
运行配置脚本: . ./buildroot/script/mksetup.sh
1,芯片类型选择sun8iw7p1,平台选择linux,开发板我这里就选择了dolphin-cmcc-p1
2,执行命令:mklichee
此命令最终将编译出u-boot、kernel、rootfs以及一些全志自己的环境配置之类的东西。编译成功之后既可以执行打包操作。编译成功后如下图所示。
3,打包:mkpack
打包出来的最终文件就是即将烧录的文件。打包如下图所示。
二,烧录
烧录工具用全志提供的官方烧录工具PhoenixSuit,烧录方法为按住开发板的fel按键,将开发板通过usb接入到电脑上,此时即可正常烧录。烧录后系统会自动起来。
烧录时会弹出两个对话框,都点“是”即可。
烧录成功后系统直接启动,用户名为root,不需要密码即可登录。
四,制作带recovery的烧录文件
这次制作recevory要求recevory能够分别升级正常的boot和rootfs,考虑到尽量少占用flash其中recevory的文件系统选为ramfs。
1,配置内核
a,配置ramfs:General Setup->Initial RAM filesystem and RAM disk (initramfs/initrd) support
选择ramfs file为内核目录里面的rootfs.cpio.gz
b,配置驱动:Devices Drivers->Block devices->RAM block device support
其两个子选项值为系统默认即可
c,File systems->Second extended fs support
以上三个配置项截图如下:
这样再编译出来的boot.img就是带ramfs的了,后面只要配置下环境变量就可以让系统从ramfs启动。
五,配置环境变量
env.cfg 文件保存了uboot和kernel使用的配置参数信息,本例中使用的是tools/pack/chips/sun8iw7p1/configs/dolphin-cmcc-p1/env.cfg
除了正常的bootcmd,再添加recoverycmd命令:recoverycmd=run setargs_ram boot_recovery
添加setargs_ram参数项:setargs_ram=setenv bootargs console=${console} root=${ram_root} init=${init} loglevel=${loglevel} vmalloc=384M partitions=${partitions} mac_addr=${mac} wifi_mac=${wifi_mac} bt_mac=${bt_mac} specialstr=${specialstr} serialno=${serialno}
增加定义ram_root变量:ram_root=/dev/ram
添加boot_recevory命令:
boot_recovery=sunxi_flash read 40007800 recovery
完整的env.cfg如下图所示:
六,修改mmc分区表
本例中使用的分区配置文件实质是tools/pack/common/partition/sys_partition_linux.fex。增加recevory分区,分区大小可设定为32768*512字节,如下图所示:
七,修改打包脚本
修改打包脚本就是为了增加对recevory系统的打包过程。在tools/pack/pack 打包文件中的do_pack_linux函数中直接添加recevory.fex文件引用。如下图所示
八,修改u-boot启动选择
在文件u-boot-2011.09/board/sunxi/board_common.c中定义全局变量g_nRecoveryMode,在函数check_physical_key_early中如果gpio_value的值为0,置位g_nRecoveryMode,此处修改如下图所示;
在common/main.c文件中,原来是直接根据bootcmd来启动的,现在增加判断,如果g_nRecoveryMode置位,则根据recoverycmd来启动,修改如下图所示:
至此修改完成,重新编译打包烧录,默认进入正常的系统,按下gpio PD1时进入recovery系统,我们这里选择的是按键的gpio是在系统配置文件里面默认配置好了的。
进入rececory系统,即可升级boot分区和rootfs分区,
升级内核和文件系统的命令如下:dd if=/mnt/usb/h3_boot.img of=/dev/mmcblk0p6
dd if=/mnt/usb/h3_rootfs of=/dev/mmcblk0p7
至此,实现了类似于安卓的recevory功能。