SSD_FASTBOOT使用参考
1. 基本介绍¶
1.1. 概述¶
本文档将介绍快速启动的配置以及使用。
FASTBOOT主要原理是把点屏相关的必要模块和用户app放到ramdisk提前启动,实现快速亮屏的功能。
-
优点
可以实现快速亮屏。
-
缺点
制作ramdisk需要占用额外内存,app size越大,制作的ramdisk就越大,吃的内存越多。所以在确定使用fastboot前,先要评估内存是否够用。
注:用户app如果很大,不建议使用fastboot。
1.2. 启动流程¶
-
默认情况,快速启动将跳过uboot,直接启动kernel
-
需要进入uboot可以长按enter,重新开机直到进入uboot
-
后启动流程是指系统起来之后profile执行阶段
1.3. 关键字说明¶
-
RAMFS
RAMFS是linux下的基于ram的文件系统,所以ramfs会有比较高的效率。
ramfs有一个缺陷就是占用许多的内存,因为把这个rootfs都放到内存区,即使你mount的时候指定了大小。
-
dlopen
Linux提供了一套API来动态装载库。下面列出了这些API:
dlopen,打开一个库,并为使用该库做些准备。
dlsym,在打开的库中查找符号的值。
dlclose,关闭库。
dlerror,返回一个描述最后一次调用dlopen、dlsym,或dlclose的错误信息的字符串。
2. 公版相关说明¶
2.1. 编译配置¶
SSD201/SSD202公版有添加如下表defconfig。
*Fastboot功能需要的内存比较大,因为公版行为和UI比较多,实际在202(128M内存)上进行的开发测试,如下表蓝色的。
后续实际举例都是在configs/nvr/i2m/8.2.1/spinand.ram-glibc-squashfs.011a.128进行的。
2.2. 后启动流程介绍¶
Fastboot功能除了启动流程跳过uboot减少开机时间,还有一个快速显示画面的方法是通过把原来的ko初始化的地方分为两部分:
-
点屏和UI必须的部分放在init阶段。
-
其他部分还在原来的demo阶段。
打包差异:
-
Normal版本的lib/ko都是打包在miservice分区,然后kernel起来后在mount到/config目录的,对应的ko会在分区挂载后再insmod
-
FastBoot版本lib/ko会根据实际需要,一部分是快启应用需要快速依赖的,就会打包到rootfs分区,一部分是可以延后执行的还是会打包到miservice,其中rootfs中的ko会在init.sh阶段就被insmod起来,省去了挂载等待的时间,达到加速效果
我们再来看init.sh的实现就对后面内容容易了解:
后启动流程这个阶段包括分区的挂载与modules的装载,大致分为两个阶段:init 阶段 与 demo 阶段:
init 阶段:(refer to /etc/init.sh)
该阶段进行系统必要的环境配置
-
装载系统环境配置必要驱动
依次装载kernel,misc,mi驱动
-
app 运行
该demo需在后台运行,存放于dram
demo阶段:(refer to demo.sh)
该阶段进行demo运行的其它操作
-
装载次要驱动
依次装载kernel,misc,mi驱动
-
demo 运行
该demo 存放于flash
2.3. 模块装载配置¶
本小节讲解模块的装载相应的配置文件,可以根据需求灵活配置。
Fastbot版本rootfs打包参考:project\image\configs\i2m\rootfs_fastboot.mk 中的做法,将需要提前启动的ko/lib打包到rootfs分区,然后将对应insmod ko/启动app的操作集成到init.sh文件即可
如下,将.mod_depend中指定的mi相关ko的insmod动作放到init.sh去做:
3. 客制化说明¶
3.1. fastboot内存统计¶
以zk_mini_sercurity_fastboot为例统计公版fastboot内存使用情况。
ramdisk占用内存:
对应占用的内存:0x67ffff = 6.66M,实际这里应该对应的是rootfs分区大小。
所以linux可用内存 = MemTotal - Ramdisk Memory
注:DDR SIZE = MMA SIZE + MemTotal + kernel txt + MMAP IP
3.2. 主要实现流程¶
fastboot实现的方式主要体现在:project\image\configs\i2m\rootfs_fastboot.mk
这个mk里面把开机的行为全部放到/etc/profile下面,大概流程如下:
-
将开机必须用到的模块(ko/bin等资源)放到/etc/init.sh下执行
-
在init.sh最后启动app,sdk\verify\application\zk_mini_sercurity_fastboot\image.mk
注:app启动显示第一张画面必须的res放在rootfs的customer_app中,其他的res放在customer下,这样做的好处是可以减少rootfs的大小,加快启动速度。
-
app起来后,再去mount非必要的分区和挂载
3.3. 软件客制化内容¶
客户在导入fastboot时,主要需要考虑以下几个地方。
3.3.1 客户的app大小跟公版不同¶
app的大小对fastboot至关重要,因为app越大,制作出来的ramdisk越大,rootfs的分区越大,使用的内存也越大,同时解压ramdisk花的时间也就越长。所以如果客户的app很大,fastboot并不能发挥它的优势。
目前app是放在rootfs下面,所以如果客户的app大小跟公版不同,可以通过修改如下分区文件来更改rootfs分区的大小:
Nand:project\image\configs\i2m\spinand.ramfs-squashfs.p2.partition.config
Nor:project\image\configs\i2m\nor.ramfs.partition.config
注:分区总大小不能超过flash的总大小,所以rootfs增大后,需要从其他分区相应的减少;同时分区大小必须nor 64kb对齐,nand 128k对齐。
3.3.2 客户的app内存使用跟公版不同¶
目前我们DDR的内存主要由mma和linux memory组成:
DDR SIZE ~= MMA SIZE + linux MemTotal
所以客户可以根据实际mma的使用情况,增大或减少mma的大小来调整内存使用,实际mma的使用可以在最大使用场景通过如下命令dump出来:
3.3.3 客户的app行为跟公版不同¶
fastboot跟正常启动最大的区别在于fastboot有些非必要的模块是延迟启动的,所以画面刚出来不能马上使用usb或者wifi等没有启动的模块,需要在app的ui做等待处理。
3.3.4 dlopen的处理方式¶
编译app时只保留必须的动态库,其他动态库使用dlopen的方式加载:减小rootfs的大小。这就要求做好规划哪些放到init.sh,哪些放到demo.sh。
公版举例Zk Demo如下:
Makefile如下内容是必须保留的动态库,其他使用dlopen的方式加载。
dlopen的使用示例:
3.4. Flash驱动客制化内容¶
公版flash驱动默认没有跑到104M,如果公版默认软件(54M)不能满足开机时间,需要专门调整对应flash驱动默认的速度。同时需要按照如下硬件内容PCB需要找原厂专门check。
3.5. 客制化内容¶
-
Fastboot开机速度提高,需要flash跑到104M,才能开机更快。这就需要FLASH相关的PCB需要找原厂专门check。
-
不同Flash厂家的速度差异比较大。
-
Fastboot如需打开bootlogo,开bootlogo必须要运行uboot,具体改动如下:
a. setenv ota_upgrade_status 1,通过ota_upgrade_status控制是否运行uboot
b. setenv autoestart 0,关闭uboot网络功能,加快开机时间
c. 打开Flash Quad Read Mode: CONFIG_MS_SPINAND_QUAD_READ (需要flash支持)
4. 开机时间统计¶
启动阶段 | 耗时(ms) |
---|---|
IPL~UBOOT IPL gbf78c2e - runUBOOT() |
65 |
UBOOT~KERNEL runUBOOT() - Starting kernel |
1168 |
KERNEL~KO INSMOD FINISH Starting kernel - mknod: /dev/mi_poll: File exists |
2061 |
INSMOD FINISH - APP START DONE mknod: /dev/mi_poll: File exists - FB_AllocHWSurface 1303 |
667 |
Total: | 3961 |
测试环境:
-
flash型号:MX35LF1GE4AB[128M](C2-12)
-
软件版本:TAKOYAKI_DLS00V008
测试条件:
-
打开开机logo: setenv ota_upgrade_status 1
-
uboot打开quadmode: #define SUPPORT_SPINAND_QUAD (1)
-
关闭uart eth:setenv autoestart 0