221 lines
9.4 KiB
Plaintext
Executable File
221 lines
9.4 KiB
Plaintext
Executable File
#增加说明 luckylau
|
||
#修改2016-4-14 增加分区相关说明,删除target_sys中usr.img部分,增加大容量升级说明
|
||
#修改2016-3-23 初始版本
|
||
#author:henrisk
|
||
|
||
AW-OTA使用须知:
|
||
由于实际应用中存储介质大小各异,其相应OTA方案也会不同。对于小于32M(一般为spinor)的介质,需要预先设定:
|
||
make menuconfig
|
||
Target Images --->
|
||
*** Image Options ***
|
||
[*] For storage less than 32M, enable this when using ota
|
||
选中该配置项后,rootfs的/usr会被分拆出部分生成usr.squashfs(usr.img)存放在extend分区并与recovery镜像(boot_initramfs)复用该分区,以此起到节省存储空间的作用。
|
||
|
||
而对于大容量介质,建议不选中该配置项,即不需要usr.img和extend分区,而只需要添加recovery分区,这样在OTA升级时会省去很多麻烦。
|
||
|
||
不管是小容量还是大容量,都要在make之前选中应用包misc-package:
|
||
make menuconfig
|
||
Allwinner --->
|
||
<*> misc-upgrade........................... read and write the misc partition
|
||
|
||
一、分区定义:
|
||
boot分区:存内核镜像
|
||
rootfs分区:基础系统镜像分区(/lib, /bin, /etc, /sbin等非/usr,非挂载其他分区的路径,wifi支持环境,alsa支持环境、OTA环境)
|
||
extend分区:扩展系统镜像分区(/usr 应用分区)
|
||
上面三个分区为升级分区
|
||
|
||
private分区:存储SN号分区
|
||
misc分区:系统状态、刷机状态分区
|
||
UDISK分区:用户数据分区(/mnt/UDISK)
|
||
overlayfs分区:存储overlayfs覆盖数据
|
||
上面分区为不升级分区
|
||
|
||
二、分区大小注意事项:
|
||
分区大小在方案使用sys_partition.fex中定义
|
||
size的算法:如 8192/2/1024 = 4M
|
||
|
||
a)配置boot分区大小,boot分区大小需要依赖内核配置,需要小于等于sys_partition.fex中定义的boot标签的定义:
|
||
如:
|
||
[partition]
|
||
name = boot
|
||
size = 8192
|
||
downloadfile = "boot.fex"
|
||
user_type = 0x8000
|
||
|
||
boot分区镜像大小需要在menuconfig中预先设定:
|
||
make menuconfig
|
||
Target Images --->
|
||
*** Image Options ***
|
||
(4) Boot filesystem partition size (in MB)
|
||
|
||
b)rootfs分区的大小,不需要通过make menuconfig去设定,直接根据镜像大小修改分区文件即可。
|
||
1)对于一些小容量flash的方案(如16M),需在/bin 下存放联网逻辑程序、版本控制程序、下载镜像程序、播报语音程序以及语音文件(这些文件在编译时应该install到/bin或者/lib下)
|
||
可以在固件编译完后,查看bin/sunxi(sun5i)/下rootfs.img的大小在决定sys_partition.fex中rootfs分区的大小,如
|
||
\*0*/ $ ll bin/sun5i/rootfs.img
|
||
-rw-r--r-- 1 heweihong heweihong 1835008 4月 14 16:44 bin/sun5i/rootfs.img
|
||
|
||
2)对于大容量flash的方案(如128M以上,或者有足够的flash空间存相关镜像),不需要1)中那些OTA额外的程序,直接查看rootfs.img的大小设定分区文件即可。
|
||
|
||
c)extend分区的大小,需要考虑多个方面:
|
||
1)编译后 usr.img的大小
|
||
2)make_ota_image后initramfs镜像的大小(make_ota_image见后面说明)
|
||
如:
|
||
\*0*/ $ ll build_dir/target-arm_cortex-xxxxxxxx/linux-sun5i(linux-sunxi)/
|
||
-rw-r--r-- 1 heweihong heweihong 479232 4月 14 16:44 usr.squashfs
|
||
-rwxr-xr-x 1 heweihong heweihong 5510192 4月 14 16:44 zImage-initramfs*
|
||
取两个最大值,并增加一些余量即可
|
||
|
||
并把这个值设置为initramfs镜像的大小
|
||
make menuconfig
|
||
Target Images --->
|
||
*** Image Options ***
|
||
(8) Boot-Recovery initramfs filesystem partition size (in MB)
|
||
|
||
d)其他分区如private、misc等使用默认的大小即可
|
||
e)剩下的空间全部自动分配进入UDISK分区(一定要留取一定空间给UDISK分区,至少可以格式化,挂载,一些OTA过程会在里面写一些中间文件,小容量flash的方案,也要保证有256K~512K的空间)
|
||
|
||
特别注意:这些分区大小不能通过OTA去修改的,所以对于大容量flash的方案,应该在满足分区条件限制(如上面adc三点)的情况下留有足够的余量,满足后续OTA增加内容的需求。
|
||
对于小容量flash的方案,需要在增加内容是调节相关分区的大小。
|
||
|
||
三、misc-upgrade升级
|
||
1. misc-upgrade 是基于小容量flash方案重新划分分区后,以misc分区、extend分区为媒介设计的OTA方案
|
||
|
||
2. OTA镜像包SDK编译说明:(SDK根目录)
|
||
环境变量:
|
||
source scripts/setenv.sh
|
||
|
||
编译命令:
|
||
make_ota_image (在新版本代码已经成功编译出烧录固件的环境的基础上,打包OTA镜像)
|
||
make_ota_image --force (重新编译新版本代码,然后再打包OTA镜像)
|
||
|
||
注:在执行make_ota_image之前需要配置支持ramdisk并选用xz压缩cpio
|
||
make menuconfig
|
||
target Images --->
|
||
[*] ramdisk --->
|
||
--- ramdisk
|
||
Compression (xz) --->
|
||
|
||
3. OTA镜像包说明:
|
||
\*0*/ $ ll bin/sunxi(sun5i)/ota/
|
||
?????? 20856
|
||
-rw-rw-r-- 1 heweihong heweihong 5731339 3?? 23 15:48 ramdisk_sys.tar.gz
|
||
-rw-rw-r-- 1 heweihong heweihong 10335244 3?? 23 15:48 target_sys.tar.gz
|
||
-rw-rw-r-- 1 heweihong heweihong 5116895 3?? 23 15:48 usr_sys.tar.gz
|
||
|
||
三个tar包就是OTA的压缩镜像包
|
||
ramdisk_sys.tar.gz:ramdisk镜像(要升级内核分区、rootfs分区时使用,防止烧写过程掉电,导致机器变砖)
|
||
target_sys.tar.gz: 系统镜像(升级内核分区、rootfs分区)
|
||
usr_sys.tar.gz: 应用分区镜像(升级extend分区,只需要使用这个镜像)
|
||
----------------------------------------------------------------
|
||
\*0*/ $ ll bin/sunxi/ota/*_sys/
|
||
bin/sunxi/ota/ramdisk_sys/:
|
||
-rw-r--r-- 1 heweihong heweihong 7340032 4月 16 12:50 boot_initramfs.img
|
||
|
||
bin/sunxi/ota/target_sys/:
|
||
-rw-r--r-- 1 heweihong heweihong 3145728 4月 16 12:49 boot.img
|
||
-rw-r--r-- 1 heweihong heweihong 2883584 4月 16 12:49 rootfs.img
|
||
|
||
bin/sunxi/ota/usr_sys/:
|
||
-rw-r--r-- 1 heweihong heweihong 2752512 4月 16 12:49 usr.img
|
||
|
||
这四个镜像包为不压缩的img包。
|
||
|
||
4. 小机端OTA升级命令:
|
||
必选参数:-f -p 二选一
|
||
aw_upgrade_process.sh -f 升级完整系统(内核分区、rootfs分区、extend分区)
|
||
aw_upgrade_process.sh -p 升级应用分区(extend分区)
|
||
注:对于大容量,用aw_upgrade_normal.sh替代aw_upgrade_process.sh
|
||
可选参数: -l,-d -u, -n
|
||
|
||
a)对于大容量flash方案可以使用本地镜像,如主程序下载校验好三个镜像后(ramdisk_sys.tar.gz,target_sys.tar.gz、usr_sys.tar.gz),
|
||
存在/mnt/UDISK/misc-upgrade中,调用上的命令,对于自动烧写分区,就算期间掉电,重启后升级程序也能自动完成烧写,不需要依赖网络。
|
||
-l arg,带路径参数。
|
||
如:aw_upgrade_process.sh -p(-f) -l /mnt/UDISK/misc-upgrade (注:mnt前的根目录"/"最好带上,misc-upgrade后不要带"/")
|
||
(-l参数,其他-d、-u、-n参数无效,使用压缩镜像包)
|
||
|
||
b)对于小容量flash方案不能使用-l参数,升级区间出错重启后,还需要根据相关的联网下载程序获取镜像(见第5点说明)
|
||
|
||
-d arg -u arg,同时使用,-d 参数为可以ping通的OTA服务器的地址、-u 参数为镜像的下载地址
|
||
-n 一些小ddr的方案(如剩余可使用内存在20m以下的方案),可以使用这个参数,shell会直接请求下载不压缩的4个img文件,这样子设备下载后不需要tar解压,减少内存使用。
|
||
|
||
如:aw_upgrade_process -f -d 192.168.1.140 -u http://192.168.1.140/
|
||
升级shell会先ping -d 参数(ping 192.168.1.140),ping通过后,会根据升级命令和系统当前场景请求下载:
|
||
无-n参数:
|
||
http://192.168.1.140/ramdisk_sys.tar.gz
|
||
http://192.168.1.140/target_sys.tar.gz
|
||
http://192.168.1.140/usr_sys.tar.gz
|
||
有-n参数:
|
||
http://192.168.1.140/boot_initramfs.img
|
||
http://192.168.1.140/boot.img
|
||
http://192.168.1.140/rootfs.img
|
||
http://192.168.1.140/usr.img
|
||
|
||
使用-n参数的方案需要部署上服务器上的镜像是:boot_initramfs.img, boot.img, rootfs.img, usr.img
|
||
不使用-n参数的方案需要部署上服务器上的镜像是:ramdisk_sys.tar.gz, target_sys.tar.gz, usr_sys.tar.gz
|
||
|
||
5. 脚本接口说明:
|
||
对于小容量flash的方案,没有空间存储镜像,相关镜像只会存在ram中,断电就会丢失。
|
||
假如升级过程断电,需要在重启后重新下载镜像。
|
||
aw_upgrade_vendor.sh设计为各个厂家实现的钩子,SDK上只是个demo可以随意修改。
|
||
|
||
实现联网逻辑
|
||
check_network_vendor(){
|
||
return 0 联网成功(如:可以ping通OTA镜像服务器)
|
||
return 1 联网失败
|
||
}
|
||
|
||
请求下载目标镜像, $1:ramdisk_sys.tar.gz $2:/tmp
|
||
download_image_vendor(){
|
||
# $1 image name $2 DIR $@ others
|
||
rm -rf $2/$1
|
||
echo "wget $ADDR/$1"
|
||
wget $ADDR/$1 -P $2
|
||
}
|
||
|
||
开始烧写分区状态:
|
||
aw_upgrade_process.sh -p 主动升级应用分区的模式下,返回0开始写分区 1不写分区
|
||
aw_upgrade_process.sh -f 不理会这个返回值
|
||
upgrade_start_vendor(){
|
||
# $1 mode: upgrade_pre,boot-recovery,upgrade_post
|
||
#return 0 -> start upgrade; 1 -> no upgrade
|
||
#reutrn value only work in nornal mode
|
||
#nornal mode: $NORMAL_MODE
|
||
echo upgrade_start_vendor $1
|
||
return 0
|
||
}
|
||
|
||
写分区完成
|
||
upgrade_finish_vendor(){
|
||
#set version or others
|
||
reboot -f
|
||
}
|
||
|
||
-f (-n)调用顺序:
|
||
check_network_vendor ->
|
||
upgrade_start_vendor ->
|
||
download_image_vendor (ramdisk_sys.tar.gz, -n 为 boot_initramfs.img)->
|
||
内部烧写、清除镜像逻辑(不让已经使用镜像占用内存) ->
|
||
download_image_vendor(target_sys.tar.gz, -n 为 boot.img rootfs.img) ->
|
||
内部烧写、清除镜像逻辑(不让已经使用镜像占用内存) ->
|
||
download_image_vendor(usr_sys.tar.gz, -n 为 usr.img) ->
|
||
内部烧写、清除镜像逻辑(不让已经使用镜像占用内存) ->
|
||
upgrade_finish_vendor
|
||
-p调用顺序
|
||
check_network_vendor ->
|
||
download_image_vendor (usr_sys.tar.gz) ->
|
||
upgrade_start_vendor ->
|
||
检测返回值,烧写 ->
|
||
upgrade_finish_vendor
|
||
|
||
6. 相关系统状态读写
|
||
相关的信息存储在misc分区,OTA升级不会清除这个分区(重新烧写镜像会擦除)
|
||
|
||
读 read_misc [command] [status] [version]
|
||
command 表示升级的系统状态(shell脚本处理使用)
|
||
status 自由使用,表示用户自定义状态
|
||
version 自由使用,表示用户自定义状态
|
||
|
||
写 write_misc [ -c command ] [ -s status ] [ -v version ]
|
||
-c 不能随意修改,只能有aw-upgrade shell修改
|
||
-s -v 自定义使用
|