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. 编译配置

SSD210/212/222/222D都是可以做fastboot功能的,公版也都有添加如下defconfig。Fastboot功能需要的内存比较大,因为公版行为和UI比较多,实际在222D(128M内存)上进行的开发测试,如下表蓝色的。客户的UI和行为比较简单的话,也可以在64M chip上开发。

后续实际举例都是在dispcam_p3_spinand.glibc-9.1.0-ramfs-s01a.128.qfn128.demo_camera_wifi_defconfig进行的。

Chip Packaging Memory Flash Toolchain Other Defconfig
SSD210 QFN68 64M NOR glibc NA dispcam_p3_nor.glibc-9.1.0-ramfs.s01a.64.qfn68.demo_defconfig
SSD212 QFN128 64M NOR glibc NA dispcam_p3_nor.glibc-9.1.0-ramfs.s01a.64.qfn128.demo_defconfig
SSD222D QFN128 128M NOR glibc NA dispcam_p3_nor.glibc-9.1.0-ramfs.s01a.128.qfn128.demo_camera_defconfig
SSD222D QFN128 128M NOR glibc sdio wifi dispcam_p3_nor.glibc-9.1.0-ramfs.s01a.128.qfn128.demo_camera_wifi_defconfig
SSD210 QFN68 64M NAND glibc NA dispcam_p3_spinand.glibc-9.1.0-ramfs-s01a.64.qfn68.demo_defconfig
SSD212 QFN128 64M NAND glibc NA dispcam_p3_spinand.glibc-9.1.0-ramfs-s01a.64.qfn128_demo_defconfig
SSD222D QFN128 128M NAND glibc NA dispcam_p3_spinand.glibc-9.1.0-ramfs-s01a.128.qfn128.demo_camera_defconfig
SSD222D QFN128 128M NAND glibc sdio wifi dispcam_p3_spinand.glibc-9.1.0-ramfs-s01a.128.qfn128.demo_camera_wifi_defconfig

2.2. 后启动流程介绍

Fastboot功能除了启动流程跳过uboot减少开机时间,还有一个快速显示画面的方法是通过把原来的ko初始化的地方分为两部分:

\1. 点屏和UI必须的部分放在init阶段。

\2. 其他部分还在原来的demo阶段。

后续2.2到2.4章节都是介绍这部分原理和方法。

正常版本的lib和ko都是放在如下路径:

Lib:/config/lib

Ko:/config/modules/4.9.84/

Fastboot版本可以看到被拆分了,如下:

Ko相关被拆分到:/lib/modules/4.9.84/和/config/modules/4.9.84/

Lib:相关被拆分到/lib 和/config/lib

我们再来看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. 模块装载配置

本小节讲解模块的装载相应的配置文件,可以根据需求灵活配置。

init阶段:

  • 特点

    模块存放于ramfs分区,系统运行时存放于dram中(lib/modules/4.9.84)

  • 配置文件存放目录

    ./project/kbuild/customize/4.9.84/p3/disp-fastboot/kernel_mod_list
    
    ./project/release/disp-fastboot/p3/common/glibc/9.1.0/modules/4.9.84/misc_mod_list
    
    ./project/release/disp-fastboot/p3/common/glibc/9.1.0/modules/4.9.84/.mods_depend
    
    ./project/release/disp-fastboot/p3/common/glibc/9.1.0/modules/4.9.84/mi_mod_list_late
    

    ./project/kbuild/customize/4.9.84/p3/dispcam-fastboot/kernel_mod_list
    
    ./project/release/dispcam-fastboot/p3/common/glibc/9.1.0/modules/4.9.84/misc_mod_list
    
    ./project/release/dispcam-fastboot/p3/common/glibc/9.1.0/modules/4.9.84/.mods_depend
    
    ./project/release/dispcam-fastboot/p3/common/glibc/9.1.0/modules/4.9.84/mi_mod_list_late
    
  • 配置文件

    用于配置各阶段装载的驱动,将驱动名添加到相应文件即可

    kernel_mod_list:系统初始化的kernel驱动,例如nls_utf8.ko

    misc_mod_list:系统初始化的misc驱动,例如mhal.ko

    mi_mod_list:系统初始化的mi驱动,例如mi_sys.ko,这个文件SSD21X/SSD22X是没有的,是通过.mods_depend和mi_mod_list_late做减法,得到的结果。

  • 配置文件使用方式

    将相应驱动的驱动名添加到对应配置文件

demo阶段:

  • 特点

    模块存放于config分区(flash),不占用内存空间(/config/modules/4.9.84)

  • 配置文件存放目录

    ./project/kbuild/customize/4.9.84/p3/disp-fastboot/kernel_mod_list_late
    
    ./project/kbuild/customize/4.9.84/p3/disp-fastboot/kernel_mod_list_late_nand(nand实际要修改这里,编译的时候会拷贝到kernel_mod_list_late)
    
    ./project/kbuild/customize/4.9.84/p3/disp-fastboot/kernel_mod_list_late_nor(nor实际要修改这里,编译的时候会拷贝到kernel_mod_list_late)
    
    ./project/release/disp-fastboot/p3/common/glibc/9.1.0/modules/4.9.84/misc_mod_list_late
    
    ./project/release/disp-fastboot/p3/common/glibc/9.1.0/modules/4.9.84/mi_mod_list_late
    

    ./project/kbuild/customize/4.9.84/p3/dispcam-fastboot/kernel_mod_list_late
    
    ./project/kbuild/customize/4.9.84/p3/dispcam-fastboot/kernel_mod_list_late_nand(nand实际要修改这里,编译的时候会拷贝到kernel_mod_list_late)
    
    ./project/kbuild/customize/4.9.84/p3/dispcam-fastboot/kernel_mod_list_late_nor (nor实际要修改这里,编译的时候会拷贝到kernel_mod_list_late)
    
    ./project/release/dispcam-fastboot/p3/common/glibc/9.1.0/modules/4.9.84/misc_mod_list_late
    
    ./project/release/dispcam-fastboot/p3/common/glibc/9.1.0/modules/4.9.84/mi_mod_list_late
    
  • 配置文件

    用于配置各阶段装载的驱动,将驱动名添加到相应文件即可

    kernel_mod_list_late:demo运行需要的kernel驱动, 例如:usb-storage.ko

    misc_mod_list_late:demo运行需要的misc驱动,例如:fbdev.ko

    mi_mod_list_late:demo运行需要的mi驱动,例如:mi_ai.ko

  • 配置文件使用方式

    将相应驱动的驱动名添加到对应配置文件


2.4. 动态链接库的存放分区配置

动态链接库可以存放到ramfs分区与config分区,前者占用内存空间,后者存放于flash。

存放于ramfs分区:

  • 配置文件名

    mi_lib_list/ex_lib_list

  • 配置文件路径

    ./project/release/disp-fastboot/p3/common/glibc/9.1.0/ex_libs/dynamic/ex_lib_list
    
    ./project/release/disp-fastboot/p3/common/glibc/9.1.0/mi_libs/dynamic/mi_lib_list
    
    ./project/release/dispcam-fastboot/p3/common/glibc/9.1.0/mi_libs/dynamic/.libs_depend
    

    ./project/release/dispcam-fastboot/p3/common/glibc/9.1.0/ex_libs/dynamic/ex_lib_list
    
    ./project/release/dispcam-fastboot/p3/common/glibc/9.1.0/mi_libs/dynamic/mi_lib_list
    
    ./project/release/disp-fastboot/p3/common/glibc/9.1.0/mi_libs/dynamic/.libs_depend
    
  • 使用方式

    将对应库名添加到配置文件

存放于config分区:

  • 配置文件名:没有配置文件

  • 配置文件路径

    ./project/release/disp-fastboot/p3/common/glibc/9.1.0/ex_libs/dynamic/ex_lib_list
    
    ./project/release/disp-fastboot/p3/common/glibc/9.1.0/mi_libs/dynamic/mi_lib_list
    
    ./project/release/dispcam-fastboot/p3/common/glibc/9.1.0/mi_libs/dynamic/.libs_depend
    

    ./project/release/dispcam-fastboot/p3/common/glibc/9.1.0/ex_libs/dynamic/ex_lib_list
    
    ./project/release/dispcam-fastboot/p3/common/glibc/9.1.0/mi_libs/dynamic/mi_lib_list
    
    ./project/release/disp-fastboot/p3/common/glibc/9.1.0/mi_libs/dynamic/.libs_depend
    
  • 使用方式

    通过.libs_depend和mi_lib_list做减法得到mi_lib需要放到config的结果。

    通过ex_libs默认放的文件和ex_lib_list做减法得到ex_libs需要放到config的结果。


3. 驱动与库的使用

3.1. 简介

本章将根据所需功能介绍所需要的驱动和一些动态链接库的使用。


3.2. 按驱动分类

所属分类 驱动 备注
usb 基础驱动 usb-comon.ko usb 基础驱动
usb-core.ko usb host 基础驱动
ehci-hcd.ko usb2.0 host控制器驱动
xhci-hcd.ko usb3.0 host控制器驱动
u 盘 usb-storage.ko usb 盘驱动 (依赖usb基础驱动)
鼠标 mousedev.ko 鼠标输入驱动
usbhid.ko usb 鼠标(依赖usb基础驱动)
网卡 of_mdio.ko 依赖文件
kdrv_emac.ko 平台相关底层网卡驱动
sstar_100_phy.ko
sunrpc.ko 用于远程命令执行的远程过程调用(RPC)协议,被网络文件系统(NFS)使用
libphy.ko 网络基础驱动
fixed_phy.ko
mtd 设备 ubi.ko ubi驱动
mmc card mmc_core.ko mmc 基础驱动
mmc_block.ko
kdrv_sdmmc.ko sd 卡驱动
看门狗 mdrv_wdt.ko 看门狗驱动
字体 nls_utf8.ko utf8 字体驱动
硬盘 sd_mod.ko scsi 接口磁盘支持
libahci.ko 串行ata接口相关驱动
ahci_platform.ko
libahci_platform.ko
libata.ko
mdrv-sata-host.ko sata底层驱动
iic mii.ko i2c 驱动
文件系统 grace.ko, nfs.ko nfs网络文件系统
grace.ko, nfsv2.ko nfs网络文件系统(version2)
ubifs.ko ubi文件系统(flash)
jffs2.ko jffs2文件系统(flash)
squashfs 压缩只读文件系统
fat.ko fat 文件系统
vfat.ko vfat 文件系统(u 盘)
cifs.ko cifs文件系统(samba)
ntfs.ko ntfs文件系统

3.3. 按库分类

toolchain相关 librt-2.28.so 实时扩展库,包含信号量,同步io等
libm-2.28.so 数学相关库
ld-2.28.so 链接库,
libresolv-2.28.so 提供网络域名包解析相关功能
libdl-2.28.so 加载动态
libstdc++.so 标准库
libc-2.28.so
libpcprofile.so
libpthread-2.28.so 线程相关库
MI相关 libmi_common.so mi 必备基础库
libmi_sys.so mi 必备基础库,负责搭建基础mi框架,提供buf管理,
libmi_sensor.so sensor 相关库
libmi_vif.so vif 相关库
libmi_vpe.so vpe相关库
libmi_venc.so 提供视频解码功能
libmi_rgn.so 提供画图功能
libmi_disp.so 提供视频拼接,视频输出功能,对接panel,hdmi等
libmi_vdec.so 提供视频解码功能
libmi_vdf.so 提供视频算法功能,包括移动监测,遮挡检测,虚拟围栏等
libmi_shadow.so 提供vdf对接接口
libmi_iqserver.so 提供网络调试iq的功能,对接isp模块
libmi_ldc.so 提供鱼眼镜头回正支持
libmi_ive.so 提供硬件算子的使用
libmi_isp.so 提供高级图像调试接口
libmi_ai.so audio 输入相关库
libmi_ao.so audio 输出相关库
libmi_gfx.so 提供数据搬移功能
libmi_hdmi.so hdmi相关库
libmi_panel.so panel相关库
libmi_fb.so 提供fb设备支持
libmi_cipher.so 提供数据加密解密功能
others libcus3a.so 提供isp高级功能,如自动对焦
libMD_LINUX.so vdf 相关库,提供移动监测功能
libOD_LINUX.so vdf 相关库,提供遮挡检测功能
libVG_LINUX.so vdf 相关库,提供虚拟围栏功能
libAEC_LINUX.so audio算法库,提供aec功能
libAED_LINUX.so audio算法库,提供babycry检测,高分贝检测
libAPC_LINUX.so audio算法库,提供降噪,均衡化,自动增益控制,高通滤波
libSRC_LINUX.so audio算法库,提供重采样功能
libg711.so audio算法库,提供g711编解码
libg726.so audio算法库,提供g726编解码

注意:toolchain 相关库为必须库,mi 库请根据需要加载,others 需根据相应mi模块需要加载。

4. 客制化说明

4.1. fastboot内存统计

以zk_full_fastboot为例统计公版fastboot内存使用情况

ramdisk占用内存:

对应占用的内存差不多也是0x77FFFF=7.4M,实际这里应该对应的是rootfs分区大小。

所以linux可用内存 = MemTotal - Ramdisk Memory

注:DDR SIZE = MMA SIZE + MemTotal + kernel txt + MMAP IP


4.2. 主要实现流程

fastboot实现的方式主要体现在:

./project/image/configs/p3/rootfs_fastboot_dispcam.mk

./project/image/configs/p3/rootfs_fastboot_disp.mk

这个makefile里面,这个makefile把开机的行为全部放到/etc/profile下面,大概流程如下:

\1. 将开机必须用到的模块放到/etc/init.sh

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

注:

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

\3. app起来后,再去mount非必要的分区和挂载:


4.3. 软件客制化内容

客户在导入fastboot时,主要需要考虑以下几个地方:

4.3.1 客户的app大小跟公版不同

app的大小对fastboot至关重要,因为app越大,制作出来的ramdisk越大,rootfs的分区越大,使用的内存也越大,同时解压ramdisk花的时间也就越长。所以如果客户的app很大,fastboot并不能发挥它的优势。

目前app是放在rootfs下面,所以如果客户的app大小跟公版不同,可以通过修改如下分区文件来更改rootfs分区的大小:

nand:

./project/image/configs/p3/spinand.ramfs.partition.dispcam.config

nor:

./project/image/configs/p3/nor.ramfs.partition.dispcam.config

注意分区总大小不能超过flash的总大小,所以rootfs增大后,需要从其他分区相应的减少;同时分区大小必须nor 64kb对齐,nand 128k对齐。


4.3.2 客户的app内存使用跟公版不同

目前我们DDR的内存主要由mma和linux memory组成:

DDR SIZE ~= MMA SIZE + linux MemTotal

所以客户可以根据实际mma的使用情况,增大或减少mma的大小来调整内存使用,实际mma的使用可以在最大使用场景通过如下命令dump出来:


4.3.3 客户的app行为跟公版不同

fastboot跟正常启动最大的区别在于fastboot有些非必要的模块是延迟启动的,所以画面刚出来不能马上使用usb或者wifi等没有启动的模块,需要在app的ui做等待处理。


4.3.4 dlopen的处理方式

编译app时只保留必须的动态库,其他动态库使用dlopen的方式加载:减小rootfs的大小。这就要求做好规划哪些放到init.sh,哪些放到demo.sh。

公版举例zk_full_fastboot如下:

Makefile如下内容是必须保留的动态库,其他使用dlopen的方式加载。

dlopen的实现方法:


4.4. Flash驱动客制化内容

公版flash驱动默认没有跑到104M,如果公版默认软件(54M)不能满足开机时间,需要专门调整对应flash驱动默认的速度。同时需要按照如下硬件内容PCB需要找原厂专门check。


4.5. 硬件客制化内容

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

\2. 不同Flash厂家的速度差异比较大,公版测试用的是:

Nor:MX25L12833F

Nand:W25N01GV和MX35LF1GE4AB


5. 开机时间统计

5.1. 统计时间的命令

cat /sys/devices/virtual/mstar/msys/booting_time


5.2. 开机时间数据