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