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下面,大概流程如下:

  1. 将开机必须用到的模块(ko/bin等资源)放到/etc/init.sh下执行

  2. 在init.sh最后启动app,sdk\verify\application\zk_mini_sercurity_fastboot\image.mk

    注:app启动显示第一张画面必须的res放在rootfs的customer_app中,其他的res放在customer下,这样做的好处是可以减少rootfs的大小,加快启动速度。

  3. 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. 客制化内容

  1. Fastboot开机速度提高,需要flash跑到104M,才能开机更快。这就需要FLASH相关的PCB需要找原厂专门check。

  2. 不同Flash厂家的速度差异比较大。

  3. 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