跳转至

SDK阅读指南


1. SDK概述

Alkaid SDK是基于Linux内核的软件开发包,其中包含bootloader、kernel、rootfs以及MI多媒体模块,用户可以通过makefile 配置并编译出一个可以在Sgs平台运行的软件。

Alkaid SDK的架构如下图所示:

整个架构从上到下分为应用层,软件库层,驱动层以及硬件层。

  1. 应用层:即用户开发的Linux 应用程序,运行在Linux用户态;

  2. MI 用户接口层:MI SDK在用户态的接口,应用程序通过该层访问到MI Driver,从而操作硬件;

  3. 驱动层:MI 驱动的具体实现;

  4. 硬件层:Sgs平台的硬件;

2. 模块介绍

简称 全称 职责
SYS System 实现MI系统初始化、内存管理、各个模块之间数据流的管理
SCL Scaler 缩放/裁剪/格式转换等功能
VDISP Virtual Display 软件拼图
DISP Display Engine DISP对VDEC/SCL 处理单元输出的图像做硬件拼图,并连同AO输出音频信号一起编码成HDMI/VGA/CVBS 输出信号的单元
VENC Video Encoder H264/H265/MotionJpeg编码器
AI Audio Input Interface audio input采集单元
AO Audio Output Interface 音频输出
FB FrameBuffer UI显示
SENSOR Sensor 获取摄像头接口信息、调整分辨率和帧率等功能
VIF VIDEO Input Interface MIPI/BT656/BT1120信号采集单元
ISP Image Signal Processing 实现 HDR,3D/2D 降噪,3A 算法,WDR 等相关功能
RGN Region 区域管理模块,对SCL数据进行遮挡或叠加
IVE Intelligent Video Engine 提供图形智能识别算法中的基本算子支援
VDF Video Detection Framework 整合各个视频算法识别库的中间件架构,包括MD/OD/VG
IPU Intelligent Process Unit 智能处理器,模块实现了AI 模型的推演功能加速
CIPHER Cipher 提供数据的加解密功能,包括 AES\RSA\SHA 加解密算法

模块间依赖关系可在kernel下通过lsmod命令查看。

mi_venc、mi_scl依赖mi_rgn。

mi_isp依赖mi_vif。

mi_ai、mi_ao依赖mi_aio。

mi_isp、mi_vif依赖mi_sensor。

mi_debug、mi_venc、mi_vdf、mi_ao、mi_ai、mi_ive、mi_scl、mi_rgn、mi_isp、mi_ipu、mi_vif、mi_dummy、mi_sensor依赖mi_sys。

mi_sys、mi_debug、mi_venc、mi_vdf、mi_ao、mi_ai、mi_ive、mi_scl、mi_rgn、mi_isp、mi_ipu、mi_vif、mi_dummy、mi_sensor依赖mi_common。

3. SDK目录结构

3.1. SDK目录结构详解

具体内容请参考:SDK目录结构详解

3.2. sdk与kernel解耦说明

sdk与kernel不可避免的会有一些耦合,导致客户自行配置和裁剪Kernel时,需要依赖Sgs重新release sdk ko;

为此将sdk部分需要依赖kernel源码的source code,开源到sdk/linux目录,客户在自行配置和裁剪Kernel时,可以自行重新编译sdk ko。

修改kernel后,重新编译ko方式,注意先配置工具链环境变量:

完整编译:

cd project
make clean ;make image -j32

快速编译:

1、配置以下必要路径

export PROJ_DIR=/home/xxx/project
export KDIR=/home/xxx/kernel
export SENSOR_DRIVER_DIR=/home/xxx/sdk/driver/SensorDriver/

这里的PROJ_DIR即project_xxx.tar.gz解压后的目录

这里的KDIR即kernel_xxx.tar.gz解压后的目录

这里的SENSOR_DRIVER_DIR即sdk_xxx.tar.gz解压后的目录下的sdk/driver/SensorDriver目录

2、编译 & 打包

cd sdk/linux
make clean ;make all -j32
make install -j32
cd ../../project
make image-fast -j32

3、编译单个mi_xxx.ko

以mi_ai.ko为例

cd sdk/linux
make ai -j32

4、make all时忽略编译某些模块

编译之前设置变量FILTER_OUT_MODULES

如因某些原因不能或者不想编译mi_shadow.ko,可以设置:

export FILTER_OUT_MODULES=shadow

如想忽略多个,用空格隔开:

export FILTER_OUT_MODULES=shadow ipu

4. menuconfig 配置系统

menuconfig 是一个图形化的配置界面,提供了全面的 SDK 配置选项。通过 make menuconfig 命令可以启动该配置界面。

4.1. 主要配置类别

menuconfig 主要包含以下配置类别:

  • 芯片型号系列名称 - 配置具体的芯片系列型号
  • 产品形态 - 选择 ipc、usbcam、nvr、dispcam 等不同产品形态
  • 开发板 - 配置开发板型号和名称相关软硬件配置
  • 工具链配置 - 设置编译工具链、架构和版本信息
  • Uboot配置 - 配置 Uboot 的构建参数和二进制文件
  • Linux kernel配置 - 设置内核版本和配置文件
  • Image打包相关配置 - 配置分区布局、文件系统等打包选项
  • Sensor摄像头传感器配置 - 配置 IQ 文件和传感器驱动列表
  • 客户功能配置 - 配置 MI debug、电源管理等功能选项
  • DRAM_LAYOUT配置 - 调整各个运行时模块的内存大小和布局
  • RTOS配置 - 配置双系统和 RTOS 相关选项
  • Sdk 配置 - 配置 SDK 中各个模块的编译选项

4.2. 配置流程

  1. 执行 make menuconfig 启动配置界面
  2. 根据需求选择相应的配置选项
  3. 保存配置并退出
  4. 执行 make image -j32 进行编译

详细配置说明请参考:alkaid_defconfig 配置说明

5. 内存管理

5.1. 内存分配方式

详细说明请参考:Memory_layout

6. 基本概念

  • 数据流:各个MI Module 可以看成是一个纯数据处理单元,数据流推送由MI SYS内部统一调度。输入数据流表示该数据单元的input数据,输出数据流表示该处理单元处理过的output数据。

  • 控制流:APP 对各个MI Module 数据处理过程进行参数控制的过程,比如设置MI_VDEC解码参数,启动停止MI_VDEC 通道,设置MI_VDEC通道输出端口之分辨率及format等

  • Channel(通道)

    对于需要处理或者输出stream的MI模组,一个channel代表该MI 模组处理或者输出一路stream的分时复用的上下文(context)及相关控制流设定

    对于可分时复用之模组如MI_VDEC, MI_DIVP, MI_DISP,可支援多个channel

  • Port(端口)

    Port分为2种,input port和output port。input port为channel输入数据流的位置,而output port则是channel输出数据流的位置。

    一个channel可以有多个input port及多个output port.

7. 根文件系统

请参考文档:系统分区

8. 启动流程

请参考文档:启动流程