基于 Hi3516CV610 的立定跳远视频测量系统调研与实施方案
一 项目整体方案与目标
本项目基于 Hi3516CV610 芯片,采用 MIPI 接口连接 SC4336P 图像传感器,通过海思 MPP 框架完成视频采集、ISP 图像处理、VPSS 图像缩放和 VENC 视频编码。项目完成了 U-Boot 移植裁剪和 Wi-Fi 视频传输,开发板通过 RTSP 协议向电脑端发送实时画面。电脑端使用 YOLO11 Pose 提取人体关键点,结合起跳落地状态机、地面单应性标定和起跳线标定,实现立定跳远距离测量、压线判断、最近接触点识别、成绩保存和录像留存。
- 完成 U-Boot 移植与裁剪,根据项目需求裁剪 Linux 内核,保留摄像头、MIPI、I2C、网络、Wi-Fi及 UBIFS 文件系统等必要功能,关闭无关外设驱动、文件系统、网络协议和高级调试选项,重新编译生成 uImage、设备树和内核模块,并完成板端启动及功能验证。
- 完成 SC4336P Sensor 适配,配置 I2C 初始化寄存器、MIPI 接收参数、Sensor 时钟及复位控制,对接海思 ISP 和 VI 模块,并根据跳远场地光照调整曝光、白平衡和降噪参数,实现摄像头稳定出图。
- 根据 SC4336P 硬件,修改 MIPI Lane 映射、RAW 格式、ISP、VPSS、VENC 的参数,搭建 VI-ISP-VPSS-VENC 链路,配置模块绑定;同时完善码流回调,把 H.265 码流做 RTSP 推流,并且做调试、稳定性处理,最终输出可以给电脑端实时解码的码流。
- 完成开发板 RTL8189FS SDIO Wi‑Fi 驱动适配与无线网络配置,搭建 RTSP 服务,实现视频码流无线传输;上位机接入同一局域网后,可通过 VLC读取实时 H.265 视频流。
- 电脑端使用 YOLO11 Pose 检测人体框和脚踝等关键点,通过 PersonTracker 在多人画面中持续锁定当前考生,并使用"等待起跳、腾空、疑似触地、已落地"状态机判断起跳和首次落地过程。
采用地面四点单应性标定,将图像中的像素坐标转换为真实地面坐标;单独标定起跳线,并通过卷尺已知长度完成尺度自检。系统根据首次落地点或落地后的最近身体接触点计算其到起跳线的最短距离。
支持压线犯规判断,以及手撑地、后坐和跪地等接触情况。系统在落地后的结算窗口内比较脚、手、髋和膝等有效接触点,选择距离起跳线最近的接触点作为最终测量依据。
通过 Streamlit 页面完成摄像头连接、场地标定、考生信息录入、测试控制和成绩显示。检测结果保存至 SQLite 数据库,并支持 CSV 导出和标注录像下载,保留起跳帧、落地帧、接触部位和异常原因等信息。
硬件选型
Hi3516CV610主控芯片
CPU:ARM Cortex-A7
操作系统:嵌入式Linux
视频处理:集成VI、ISP、VPSS和VENC模块
视频编码:支持H.264和H.265
主要接口:MIPI、I2C、SDIO、以太网及GPIO
主要用途:网络摄像头、视频监控和智能视觉设备
Hi3516CV610集成了完整的视频采集、图像处理和硬件编码模块,可以直接连接SC4336P Sensor,并通过硬件VENC输出H.264或H.265码流。与使用CPU进行软件编码相比,硬件编码占用资源更少、运行更稳定,适合长时间采集和传输立定跳远视频。项目将AI推理放在电脑端,开发板只负责视频前端,因此Hi3516CV610的性能能够满足需求。
SC4336P图像传感器
有效分辨率:2560×1440
输出帧率:30 fps
输出格式:RAW12
数据接口:MIPI CSI
控制接口:I2C
MIPI配置:2 Lane
Bayer格式:BGGR
工作模式:线性模式
SC4336P能够输出2560×1440@30fps画面,分辨率高于普通1080p,可以保留脚部、起跳线和落地点等细节。30fps能够记录完整的起跳、腾空和落地过程,满足电脑端人体姿态识别和关键帧判断需求。Sensor通过MIPI向Hi3516CV610传输RAW图像,并由板端ISP完成曝光、白平衡和降噪处理,适合固定侧面机位的立定跳远拍摄。
RTL8189FS Wi-Fi模块
核心芯片:Realtek RTL8189FS
接口:SDIO
无线标准:IEEE 802.11b/g/n
工作频段:2.4 GHz
最大理论速率:150 Mbps
天线配置:1T1R单天线
主要用途:嵌入式摄像头和无线视频传输
RTL8189FS采用SDIO接口与Hi3516CV610连接,相比通过UART通信的无线模块,接口带宽更高,适合持续传输视频码流。模块可以作为Linux系统中的wlan0网络接口使用,方便RTSP服务直接通过标准网络协议发送视频。项目H.265码流约为6 Mbps,即使考虑无线协议开销,仍有一定带宽余量,可以满足一路立定跳远实时视频传输需求。
Flash存储器
管理方式:MTD和UBI
根文件系统:UBIFS
主要存储内容:启动镜像、U-Boot环境、Linux内核、根文件系统、驱动和应用程序
主要用途:保存系统固件和板端运行程序
开发板使用Flash存储boot_image.bin、Linux uImage、UBIFS根文件系统、摄像头模块、Wi-Fi驱动和RTSP程序。UBIFS支持坏块管理和擦写均衡,适合嵌入式NAND Flash。根文件系统可以写入,因此能够保存网络配置、启动脚本和应用程序,实现Wi-Fi及RTSP服务开机自动运行。
电脑端处理平台
运行环境:Windows或Ubuntu
主要软件:Python、OpenCV、YOLO11 Pose和Streamlit
网络输入:Wi-Fi RTSP视频流
主要用途:人体姿态识别、动作判断、距离计算和成绩管理
电脑端承担计算量较大的AI推理任务,接收开发板发送的RTSP视频后,使用YOLO11 Pose提取人体关键点,并完成目标锁定、起跳和落地判断、地面标定及距离计算。采用开发板与电脑分工的方式,可以减少板端计算压力,也方便调试算法、保存录像和管理测试成绩。
整体硬件连接
text
SC4336P图像传感器
│ MIPI RAW12
▼
Hi3516CV610主控
│
├─ ISP图像处理
├─ VPSS缩放和格式转换
├─ VENC H.264或H.265编码
└─ Flash系统存储
│
▼
RTL8189FS Wi-Fi模块
│ RTSP视频流
▼
电脑端AI测量系统
对标图像传感器 GR7880750
项目将海康威视GR7880750作为图像传感器对标方案。该Sensor为400万像素CMOS图像传感器,支持2560×1440@30fps、RAW12 BGGR输出,并通过双Lane MIPI CSI接口传输图像,主要面向低照度安防监控场景,适合与海思视频SoC配合使用。
| 参数 | GR7880750 | SC4336P |
|---|---|---|
| 分辨率 | 2560×1440 | 2560×1440 |
| 帧率 | 30fps | 30fps |
| 输出格式 | RAW12 BGGR | RAW12 BGGR |
| 数据接口 | MIPI CSI | MIPI CSI |
| MIPI Lane | 双Lane | 双Lane |
| 主要特点 | 低照度星光成像、驱动调校灵活 | 配置成熟、现有开发板已完成适配 |
| 驱动形式 | 通常提供Sensor_ctl等适配源码 |
当前SDK通过libsns_sc4336p.so提供 |
| 寄存器修改 | 可修改初始化、曝光和增益寄存器 | 当前资料中不能直接修改内部寄存器表 |
GR7880750与SC4336P的基本分辨率、帧率和MIPI输出规格接近,可作为SC4336P适配和图像效果调校的参考。GR7880750驱动通常提供Sensor控制源码,可以修改初始化寄存器、曝光时间、模拟增益和数字增益等参数,便于针对运动模糊和低照度场景进行调校。
本项目最终选择SC4336P,是因为现有Hi3516CV610开发板已提供对应的Sensor库和4M30配置,可以直接建立VI、ISP、VPSS和VENC视频链路,降低前期适配难度。后续若取得SC4336P完整驱动源码,也可以参考GR7880750的驱动结构,进一步调整Sensor寄存器和ISP参数。
系统框图
#mermaid-svg-5kL9fkvoPbmpamZf{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-5kL9fkvoPbmpamZf .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5kL9fkvoPbmpamZf .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5kL9fkvoPbmpamZf .error-icon{fill:#552222;}#mermaid-svg-5kL9fkvoPbmpamZf .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5kL9fkvoPbmpamZf .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5kL9fkvoPbmpamZf .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5kL9fkvoPbmpamZf .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5kL9fkvoPbmpamZf .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5kL9fkvoPbmpamZf .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5kL9fkvoPbmpamZf .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5kL9fkvoPbmpamZf .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5kL9fkvoPbmpamZf .marker.cross{stroke:#333333;}#mermaid-svg-5kL9fkvoPbmpamZf svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5kL9fkvoPbmpamZf p{margin:0;}#mermaid-svg-5kL9fkvoPbmpamZf .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-5kL9fkvoPbmpamZf .cluster-label text{fill:#333;}#mermaid-svg-5kL9fkvoPbmpamZf .cluster-label span{color:#333;}#mermaid-svg-5kL9fkvoPbmpamZf .cluster-label span p{background-color:transparent;}#mermaid-svg-5kL9fkvoPbmpamZf .label text,#mermaid-svg-5kL9fkvoPbmpamZf span{fill:#333;color:#333;}#mermaid-svg-5kL9fkvoPbmpamZf .node rect,#mermaid-svg-5kL9fkvoPbmpamZf .node circle,#mermaid-svg-5kL9fkvoPbmpamZf .node ellipse,#mermaid-svg-5kL9fkvoPbmpamZf .node polygon,#mermaid-svg-5kL9fkvoPbmpamZf .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5kL9fkvoPbmpamZf .rough-node .label text,#mermaid-svg-5kL9fkvoPbmpamZf .node .label text,#mermaid-svg-5kL9fkvoPbmpamZf .image-shape .label,#mermaid-svg-5kL9fkvoPbmpamZf .icon-shape .label{text-anchor:middle;}#mermaid-svg-5kL9fkvoPbmpamZf .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-5kL9fkvoPbmpamZf .rough-node .label,#mermaid-svg-5kL9fkvoPbmpamZf .node .label,#mermaid-svg-5kL9fkvoPbmpamZf .image-shape .label,#mermaid-svg-5kL9fkvoPbmpamZf .icon-shape .label{text-align:center;}#mermaid-svg-5kL9fkvoPbmpamZf .node.clickable{cursor:pointer;}#mermaid-svg-5kL9fkvoPbmpamZf .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-5kL9fkvoPbmpamZf .arrowheadPath{fill:#333333;}#mermaid-svg-5kL9fkvoPbmpamZf .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-5kL9fkvoPbmpamZf .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-5kL9fkvoPbmpamZf .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5kL9fkvoPbmpamZf .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-5kL9fkvoPbmpamZf .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5kL9fkvoPbmpamZf .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-5kL9fkvoPbmpamZf .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5kL9fkvoPbmpamZf .cluster text{fill:#333;}#mermaid-svg-5kL9fkvoPbmpamZf .cluster span{color:#333;}#mermaid-svg-5kL9fkvoPbmpamZf div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-5kL9fkvoPbmpamZf .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-5kL9fkvoPbmpamZf rect.text{fill:none;stroke-width:0;}#mermaid-svg-5kL9fkvoPbmpamZf .icon-shape,#mermaid-svg-5kL9fkvoPbmpamZf .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5kL9fkvoPbmpamZf .icon-shape p,#mermaid-svg-5kL9fkvoPbmpamZf .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-5kL9fkvoPbmpamZf .icon-shape .label rect,#mermaid-svg-5kL9fkvoPbmpamZf .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5kL9fkvoPbmpamZf .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-5kL9fkvoPbmpamZf .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-5kL9fkvoPbmpamZf :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} MIPI CSI
无线网络
Wi-Fi RTSP
系统和程序
规格与驱动结构对标
SC4336P 图像传感器
2560×1440 30fps
MIPI RAW12 双 Lane
Hi3516CV610 主控芯片
VI 视频采集
ISP 图像处理
曝光 白平衡 降噪
VPSS 图像缩放
格式转换
VENC 视频编码
H.264 或 H.265
RTL8189FS Wi-Fi 模块
SDIO 2.4GHz
RTSP 无线视频传输
电脑端 AI 测量系统
YOLO11 Pose
人体关键点检测
起跳落地判断
标定与距离计算
Streamlit 页面
成绩 录像 SQLite CSV
Flash 存储器
U-Boot uImage UBIFS
GR7880750
对标图像传感器
软件流程图
#mermaid-svg-1LfkWhpAYufAE29P{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-1LfkWhpAYufAE29P .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-1LfkWhpAYufAE29P .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-1LfkWhpAYufAE29P .error-icon{fill:#552222;}#mermaid-svg-1LfkWhpAYufAE29P .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-1LfkWhpAYufAE29P .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-1LfkWhpAYufAE29P .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-1LfkWhpAYufAE29P .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-1LfkWhpAYufAE29P .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-1LfkWhpAYufAE29P .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-1LfkWhpAYufAE29P .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-1LfkWhpAYufAE29P .marker{fill:#333333;stroke:#333333;}#mermaid-svg-1LfkWhpAYufAE29P .marker.cross{stroke:#333333;}#mermaid-svg-1LfkWhpAYufAE29P svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-1LfkWhpAYufAE29P p{margin:0;}#mermaid-svg-1LfkWhpAYufAE29P .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-1LfkWhpAYufAE29P .cluster-label text{fill:#333;}#mermaid-svg-1LfkWhpAYufAE29P .cluster-label span{color:#333;}#mermaid-svg-1LfkWhpAYufAE29P .cluster-label span p{background-color:transparent;}#mermaid-svg-1LfkWhpAYufAE29P .label text,#mermaid-svg-1LfkWhpAYufAE29P span{fill:#333;color:#333;}#mermaid-svg-1LfkWhpAYufAE29P .node rect,#mermaid-svg-1LfkWhpAYufAE29P .node circle,#mermaid-svg-1LfkWhpAYufAE29P .node ellipse,#mermaid-svg-1LfkWhpAYufAE29P .node polygon,#mermaid-svg-1LfkWhpAYufAE29P .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-1LfkWhpAYufAE29P .rough-node .label text,#mermaid-svg-1LfkWhpAYufAE29P .node .label text,#mermaid-svg-1LfkWhpAYufAE29P .image-shape .label,#mermaid-svg-1LfkWhpAYufAE29P .icon-shape .label{text-anchor:middle;}#mermaid-svg-1LfkWhpAYufAE29P .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-1LfkWhpAYufAE29P .rough-node .label,#mermaid-svg-1LfkWhpAYufAE29P .node .label,#mermaid-svg-1LfkWhpAYufAE29P .image-shape .label,#mermaid-svg-1LfkWhpAYufAE29P .icon-shape .label{text-align:center;}#mermaid-svg-1LfkWhpAYufAE29P .node.clickable{cursor:pointer;}#mermaid-svg-1LfkWhpAYufAE29P .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-1LfkWhpAYufAE29P .arrowheadPath{fill:#333333;}#mermaid-svg-1LfkWhpAYufAE29P .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-1LfkWhpAYufAE29P .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-1LfkWhpAYufAE29P .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1LfkWhpAYufAE29P .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-1LfkWhpAYufAE29P .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1LfkWhpAYufAE29P .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-1LfkWhpAYufAE29P .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-1LfkWhpAYufAE29P .cluster text{fill:#333;}#mermaid-svg-1LfkWhpAYufAE29P .cluster span{color:#333;}#mermaid-svg-1LfkWhpAYufAE29P div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-1LfkWhpAYufAE29P .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-1LfkWhpAYufAE29P rect.text{fill:none;stroke-width:0;}#mermaid-svg-1LfkWhpAYufAE29P .icon-shape,#mermaid-svg-1LfkWhpAYufAE29P .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1LfkWhpAYufAE29P .icon-shape p,#mermaid-svg-1LfkWhpAYufAE29P .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-1LfkWhpAYufAE29P .icon-shape .label rect,#mermaid-svg-1LfkWhpAYufAE29P .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1LfkWhpAYufAE29P .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-1LfkWhpAYufAE29P .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-1LfkWhpAYufAE29P :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否
是
系统上电
U-Boot 启动
加载 Linux uImage
挂载 UBIFS 根文件系统
执行 rcS 和启动脚本
加载 MPP 和 SC4336P 相关模块
配置 Sensor 时钟 复位和 I2C
配置 MIPI RAW12 双 Lane
初始化 SYS 和 VB 缓冲池
启动 VI 和 ISP
获取 2560×1440 30fps 图像
VPSS 缩放和格式转换
VENC 进行 H.264 或 H.265 编码
启动 RTL8189FS Wi-Fi
启动 RTSP 视频服务
电脑端连接 RTSP
OpenCV 解码和原始帧缓存
YOLO11 Pose 人体关键点检测
PersonTracker 锁定当前考生
起跳落地状态机
是否确认有效落地
回看触地附近原始帧
确定首次落地帧和最近接触点
单应性投影到地面坐标
计算接触点到起跳线距离
判断压线犯规和成绩
页面显示结果
保存 SQLite CSV 和标注录像
继续处理下一帧
系统移植
-
保留项目必需功能 保留 Hi3516CV610 平台、串口、GPIO、I2C、MIPI、摄像头、以太网、Wi-Fi,以及 MTD、UBI、UBIFS 根文件系统支持。
-
删除无关驱动 关闭项目未使用的蓝牙、CAN、触摸屏、显示屏及其他芯片平台和外设驱动。
-
删除无关文件系统和网络协议 保留 UBIFS、FAT、EXT4 和基本 TCP/IP,关闭 BTRFS、XFS、NTFS、IPv6 等未使用功能。
-
关闭高级调试功能 关闭 KGDB、KASAN、Ftrace、内核调试信息等功能,保留串口日志和 dmesg,便于排查启动问题。
驱动适配
这一步主要包括以下工作:
-
确认硬件连接
核对 SC4336P 的 MIPI Lane 数、时钟、复位 GPIO、电源和 I2C 地址。
-
配置 Sensor 寄存器
在
sensor_ctl.c等文件中写入厂家提供的初始化寄存器,包括分辨率、帧率、曝光、增益和工作模式。 -
配置 MIPI 接收参数
设置 MIPI 通道、Lane 顺序、数据类型、输入分辨率和时钟,使开发板能够正确接收图像数据。
-
对接海思 ISP
注册 SC4336P Sensor,配置曝光、自动白平衡、增益、降噪等 ISP 回调和初始参数。
-
建立 VI 图像采集通道
配置 VI 设备和通道的分辨率、像素格式、帧率,将 Sensor 图像送入 ISP 和后续 VPSS。
-
编译并加载驱动
重新编译 Sensor 驱动或适配库,将文件传到开发板,加载相关内核模块和 Sensor 程序。
-
调整图像效果
根据室内跳远场地的光照,调整曝光时间、增益、白平衡、锐度和降噪,避免人物运动模糊、画面过暗或噪点过多。
【补充】
- 分辨率帧率:默认 2560×1440@30fps
- 控制:I2C0 来读写 sensor 寄存器;MIPI 用双 Lane0+2 传输图像
- 图像格式:RAW12,BGGR 拜耳排列
- VI 开启 3D 降噪;VPSS 输出原图尺寸 2560×1440,不缩放
- 编码:H.265,CBR 码率 6M,GOP=50
- 自动曝光 AE、自动白平衡 AWB 打开
- sensor 驱动是预编译库
libsns_sc4336p.so,没有开放 sensor_ctl 源码,没法直接改寄存器。
码流链路
底层 MPP 驱动、ISP 硬件算法、Sensor 驱动 so 库不是你写的;通道创建、参数配置、模块绑定、业务逻辑、码流回调、网络推流、调试排错是你做的;开发方式就是:基于 SDK 自带 sample 示例,读懂、裁剪、改写、适配到当前 SC4336P 硬件。
拆分清楚哪些【不是你写的】(面试一定要拎清楚,显得诚实专业)
- MPP 框架本身、VI/ISP/VPSS/VENC 的硬件驱动:海思原厂提供二进制库 + 头文件,你调用
HI_MPI_XXXAPI,不是你开发硬件驱动 - ISP 内部算法:Demosaic、3DNR、AE/AWB、Gamma 这些硬件 ISP 固件算法,海思固化,你只是打开开关、配置参数,不是你写降噪、白平衡算法
- SC4336P sensor 驱动:
libsns_sc4336p.so是原厂 / 方案商预编译库,没有源码,你只能调用 sns 接口加载,不能修改寄存器驱动逻辑
哪些【是你配置 + 改写 + 开发】(这才是你的工作重点,面试重点讲这块)
基于 SDK 的 mpp sample(一般是 vi_vpss_venc 示例)二次开发:
- 适配硬件:修改 MIPI 配置,改成双 Lane 0/2、RAW12 BGGR,匹配 SC4336P
- 通道参数配置:VI 缓冲区、ISP 参数(开启 3DNR)、VPSS 分辨率配置、VENC 的 H.265、CBR、6M 码率、GOP50
- MPP 模块绑定:VI→ISP→VPSS→VENC 的绑定关系搭建
- 码流回调函数:拿到 VENC 输出的 ES 码流,增加业务代码(RTSP 推流、缓存、发送给上位机)
- 资源管理:顺序启停、异常处理、通道销毁、MPP 去初始化,修复示例里缺少的健壮性逻辑
- 调试工作:解决花屏、丢帧、噪点大、码流卡顿、MIPI 时序不匹配等问题
wifi
SDIO WiFi 驱动是芯片厂商提供
具体做了哪些工作?(分点口述)
- 内核层面:打开 SDIO、Wi‑Fi 相关内核配置,把 RTL8189FS 驱动编译进内核或者编译成 ko 模块,加载驱动,确认 wlan 网卡正常识别;
- 无线网络配置:移植配置 wpa_supplicant,配置 WiFi 账号密码、自动连接脚本,设置静态 IP/DHCP,保证开发板和电脑在同一网段;
- 码流对接:把 VENC 回调出来的 H.265 ES 码流,送入 RTSP 服务
- 上位机验证:调试拉流,分别用 VLC、FFplay 测试播放,同时基于 OpenCV 的 VideoCapture 接口拉取 RTSP 流,做 PC 端姿态识别预览;
- 稳定性调试:排查无线丢包、码流卡顿、弱网下花屏问题。
附件
系统移植
-
保留项目必需功能 保留 Hi3516CV610 平台、串口、GPIO、I2C、MIPI、摄像头、以太网、Wi-Fi,以及
MTD、UBI、UBIFS 根文件系统支持。
-
删除无关驱动 关闭项目未使用的蓝牙、CAN、触摸屏、显示屏及其他芯片平台和外设驱动。
-
删除无关文件系统和网络协议 保留 UBIFS、FAT、EXT4 和基本 TCP/IP,关闭 BTRFS、XFS、NTFS、IPv6
等未使用功能。
-
关闭高级调试功能 关闭 KGDB、KASAN、Ftrace、内核调试信息等功能,保留串口日志和 dmesg,便于排查启动问题。
系统链路大致是:
芯片固化 BootROM → 加载海思 boot_image.bin → 启动 U-Boot、读取启动参数 → 加载 Linux 内核 + 设备树 → 挂载 NAND 上 UBIFS 根文件系统 → busybox init 按 inittab 执行 rcS → 依次跑初始化脚本(创建设备、mdev、网络)→ 最后启动 RTSP 和业务程序。
目前能确认的运行环境:
| 项目 | 当前信息 |
|---|---|
| SoC | Hi3516CV610 |
| CPU 架构 | ARMv7 Cortex-A7 |
| Linux | 5.10.221 |
| C 库 | musl 1.2.3 |
| 基础工具 | BusyBox 1.34.1 |
| 根文件系统 | 可写 UBIFS |
| 内核镜像 | SDK 编译流程输出压缩后的 uImage |
| 启动介质 | 从 UBIFS 判断大概率为 SPI NAND,仍需结合 /proc/mtd 和 U-Boot 输出确认 |
| SDK | Hi3516CV610 SDK V1.0.2.0 |
| 编译模式 | 厂家脚本使用 LIB_TYPE=musl CHIP=hi3516cv610 DEBUG=1 |
SDK 的完整编译会生成:
boot_image.bin:海思启动镜像;uImage:Linux 内核镜像;rootfs_*.ubifs或rootfs_*.ubiimg:NAND 根文件系统镜像;nand_env.bin:U-Boot 环境变量镜像;nand_burn_table.xml:烧录分区表。
一 进入内核配置界面
在 Ubuntu 虚拟机的内核源码目录执行:
bash
cd Hi3516CV610_SDK_V1.0.2.0/open_source/linux/linux-5.10.y
make ARCH=arm \
CROSS_COMPILE=arm-v01c02-linux-musleabi- \
hi3516cv610_defconfig
make ARCH=arm \
CROSS_COMPILE=arm-v01c02-linux-musleabi- \
menuconfig
配置界面中:
text
[*] 编译进内核
<M> 编译为内核模块 .ko
[ ] 不编译
对于启动必需的功能,一般选择 [*]。对于不是启动必需、但运行时需要加载的驱动,可以选择 <M>。
二 必须保留的基础功能
1 ARM 和芯片平台支持
需要保留:
text
System Type
-> ARM system type
-> HiSilicon platform support
主要包括:
- ARMv7 Cortex-A7 支持;
- Hi3516CV610 平台支持;
- 中断控制器;
- 系统时钟;
- 定时器;
- GPIO;
- PinCtrl;
- 电源和复位控制。
这些是系统启动的基础,一般不能随意关闭。
2 串口控制台
需要保留:
text
Device Drivers
-> Character devices
-> Serial drivers
以及:
text
Kernel hacking
-> Generic kernel debugging instruments
-> Early printk
串口相关功能主要用于:
- 输出内核启动日志;
- 进入板端命令行;
- 排查内核启动卡死;
- 查看驱动加载错误。
三 存储和根文件系统
你的板子使用可写 UBIFS 根文件系统,因此以下功能必须保留。
1 MTD 子系统
text
Device Drivers
-> Memory Technology Device MTD support
主要保留:
- MTD 核心支持;
- MTD 分区支持;
- SPI NAND 或 NAND Flash 支持;
- HiSilicon Flash 控制器驱动。
2 UBI
text
Device Drivers
-> Memory Technology Device MTD support
-> Enable UBI
UBI 位于 MTD 与 UBIFS 之间,负责坏块管理、擦写均衡和逻辑卷管理。
3 UBIFS
text
File systems
-> Miscellaneous filesystems
-> UBIFS file system support
因为根文件系统本身就是 UBIFS,所以应将其编进内核,不能只编译成模块。否则系统挂载根文件系统前没有条件加载这个模块。
4 伪文件系统
需要保留:
text
File systems
-> Pseudo filesystems
分别用于:
/proc:查看进程和内核信息;/sys:查看设备和驱动信息;/tmp、/run:临时文件;/dev:自动生成设备节点。
四 摄像头和视频相关功能
Hi3516CV610 的 VI、VPSS、VENC 等功能主要由海思 MPP、内核模块和用户态程序共同提供。
1 I2C
需要保留:
text
Device Drivers
-> I2C support
用于:
- 读取和配置 SC4336P 寄存器;
- 设置曝光、增益和帧率;
- 检查 Sensor 芯片是否响应。
一般保留:
text
CONFIG_I2C=y
CONFIG_I2C_CHARDEV=y
其中 I2C_CHARDEV 可以提供 /dev/i2c-*,便于使用 I2C 工具调试。
2 GPIO 和 PinCtrl
需要保留:
text
Device Drivers
-> GPIO Support
Device Drivers
-> Pin controllers
用于:
- Sensor 复位;
- Sensor 上电控制;
- MIPI 引脚复用;
- Wi-Fi 模块使能;
- 状态灯等外设控制。
3 MIPI 和 Sensor 相关驱动
海思 SDK 中可能以内核模块或厂商驱动形式提供:
- MIPI RX;
- Sensor 时钟;
- ISP;
- VI;
- VENC;
- SYS;
- VB;
- RGN。
这些功能不能只看标准 Linux menuconfig。还要检查:
- 海思 SDK 的驱动编译配置;
komod目录中的.ko;- 板端驱动加载脚本;
- Sensor 初始化程序;
- MPP Sample 的依赖模块。
五 网络和 RTSP 所需功能
1 TCP IP 网络协议栈
需要保留:
text
Networking support
-> Networking options
-> TCP IP networking
它们分别支持:
- 基础网络子系统;
- IPv4 和 TCP/UDP;
- 原始数据包;
- 本地进程间 Unix Socket。
RTSP、RTP、UDP、TCP 都依赖这些功能。
2 以太网
需要保留:
text
Device Drivers
-> Network device support
-> Ethernet driver support
包括:
- HiSilicon MAC 驱动;
- PHY 驱动;
- MDIO 总线;
- 网口链路检测。
如果板端还需要有线网络作为调试或备用链路,就不能关闭以太网驱动。
3 Wi-Fi
如果 Wi-Fi 驱动编进内核,需保留:
text
Device Drivers
-> Network device support
-> Wireless LAN
如果 Wi-Fi 使用 USB 接口,还要保留:
text
Device Drivers
-> USB support
-> USB Host Controller Drivers
六 建议保留的文件系统
根据项目功能决定:
| 文件系统 | 是否建议保留 | 用途 |
|---|---|---|
| UBIFS | 必须 | 板端根文件系统 |
| proc | 必须 | /proc |
| sysfs | 必须 | /sys |
| tmpfs | 必须 | /tmp、/run |
| devtmpfs | 必须 | /dev 设备节点 |
| FAT VFAT | 建议 | TF 卡、SD 卡和U盘 |
| EXT4 | 可选 | Linux 格式的 SD 卡或U盘 |
| NFS Client | 开发期建议 | 从 Ubuntu 挂载目录调试 |
| CIFS | 通常不需要 | Windows 网络共享 |
| SquashFS | 视方案决定 | 只读压缩根文件系统 |
| JFFS2 | SPI NOR 使用时保留 | 当前使用 UBIFS 时通常不需要 |
| NTFS | 通常可裁剪 | 除非需要读取 NTFS U盘 |
| ISO9660 | 可裁剪 | 光盘文件系统 |
| BTRFS | 可裁剪 | 嵌入式小系统通常不用 |
| XFS | 可裁剪 | 本项目通常不用 |
| F2FS | 可裁剪 | 未使用对应存储方案时关闭 |
七 可以考虑裁掉的无关驱动
确认开发板没有这些硬件后,可以关闭:
- 蓝牙;
- NFC;
- CAN;
- FireWire;
- 雷电接口;
- PCMCIA;
- SATA;
- SCSI 磁盘;
- 光驱;
- 软盘;
- 游戏手柄;
- HID 触摸屏;
- 打印机;
- 红外遥控;
- DVB 数字电视;
- 无关音频芯片;
- 无关触摸屏;
- 无关 LCD 面板;
- 无关摄像头 Sensor;
- 不使用的 USB Gadget 功能;
- 不使用的网卡和 Wi-Fi 芯片驱动;
- 其他 ARM 开发板平台驱动。
十一 实际裁剪流程
不要一次性关闭大量选项。建议按下面流程操作。
第一步 保存厂家默认配置
bash
cp .config .config.vendor
第二步 修改少量选项
bash
make ARCH=arm \
CROSS_COMPILE=arm-v01c02-linux-musleabi- \
menuconfig
每次只修改一个类别,例如:
- 第一次裁文件系统;
- 第二次裁网络协议;
- 第三次裁无关外设;
- 最后关闭调试功能。
第三步保存配置
bash
make ARCH=arm \
CROSS_COMPILE=arm-v01c02-linux-musleabi- \
savedefconfig
cp defconfig arch/arm/configs/hi3516cv610_jump_defconfig
第四步查看修改内容
bash
diff -u .config.vendor .config
这样才能准确回答"内核裁剪改了哪些配置"。
第五步重新编译
在 BSP 目录执行:
bash
make KERNEL_CFG=hi3516cv610_jump_defconfig \
LIB_TYPE=musl \
CHIP=hi3516cv610 \
DEBUG=1 \
kernel
第六步检查镜像大小
bash
ls -lh pub/hi3516cv610_image_debug_musl/uImage
记录裁剪前后:
| 版本 | uImage 大小 | 启动结果 |
|---|---|---|
| 厂家默认配置 | 待记录 | 正常 |
| 第一次裁剪 | 待记录 | 正常 |
| 最终配置 | 待记录 | 正常 |
第七步烧写验证
至少验证:
sh
uname -a
cat /proc/cmdline
cat /proc/filesystems
cat /proc/mtd
mount
lsmod
ifconfig -a
dmesg | grep -Ei "ubi|ubifs|mtd|nand"
还要验证:
- 串口正常;
- UBIFS 根文件系统正常挂载;
- 有线网卡正常;
- Wi-Fi 正常;
- SC4336P 正常出图;
- MPP 模块加载成功;
- RTSP 可以通过 Wi-Fi 连续播放;
- 重启后各项功能仍然正常。
可以写进文档的简洁表述
根据立定跳远视频采集与无线传输需求,对 Linux 内核进行功能裁剪:保留 Hi3516CV610 平台、串口、GPIO、I2C、MIPI、MTD、UBI、UBIFS、以太网、Wi-Fi 及 USB 等必要支持;将摄像头、MPP 和无线网卡等非启动必需驱动编译为内核模块;关闭未使用的文件系统、网络协议、外设驱动和高级调试功能,重新生成 uImage、设备树和内核模块,并完成根文件系统挂载、摄像头出图及 Wi-Fi RTSP 传输验证。
SC4336P 源码配置统计与修改位置
1 结论
当前 SDK 已经包含 SC4336P 的运行配置和二进制 Sensor 库。默认 PQ 模式是 4M30,即 2560 × 1440 @ 30 fps。可直接修改的参数位于 INI、JSON 和启动脚本中;Sensor 初始化寄存器、I2C 从地址以及 AE/AWB 内部参数未以 C 源码形式提供,而是封装在 libsns_sc4336p.so 等二进制库中。
因此,基于现有资料可以准确描述为"SC4336P 配置适配和图像链路配置"。如果没有取得 sensor_ctl.c、sc4336p_cmos.c 等源文件,不宜写成"修改了 SC4336P 初始化寄存器源码"。
2 实际使用入口
2.1 开机加载 SC4336P
文件:
text
Hi3516CV610_SDK_V1.0.2.0/overlay/youyan/insmod.sh
第 5 行:
sh
./load3516cv610_20s_debug -i -sensor0 sc4336p
作用:加载 Hi3516CV610 媒体相关模块,并把 sensor0 指定为 sc4336p。
修改位置:更换 Sensor 型号、选择另一个 Sensor 入口时修改这里。SC4336P 不变时不需要改。
开机调用链:
text
/etc/init.d/S90autorun 第 22~23 行
-> /youyan/insmod.sh
-> load3516cv610_20s_debug -i -sensor0 sc4336p
2.2 默认模式选择
文件:
text
overlay/system/Hi3516CV610_PQ_V1.0.2.0/configs/sc4336p/config_entry.ini
真实配置:
| 行号 | 参数 | 当前值 | 含义 |
|---|---|---|---|
| 2 | mode_num |
6 |
提供 6 种视频模式 |
| 3 | use_mode |
0 |
默认使用 mode 0 |
| 6~7 | mode 0 | 4M30 / sc4336p_4M30.ini |
默认 4M 30 fps |
| 9~10 | mode 1 | 4M15_2ch |
双通道 4M 15 fps |
| 12~13 | mode 2 | 4M30_10b |
4M 30 fps 10 bit 模式 |
| 15~16 | mode 3 | 4M30_svc |
4M 30 fps SVC 模式 |
| 18~19 | mode 4 | 3M30_608 |
Hi3516CV608 对应模式 |
| 21~22 | mode 5 | 2M30 |
1920 × 1080 30 fps |
修改位置:切换默认分辨率或模式时修改第 3 行 use_mode,不要只改单个宽高参数。
3 默认 SC4336P 4M30 参数
主配置文件:
text
overlay/system/Hi3516CV610_PQ_V1.0.2.0/configs/sc4336p/sc4336p_4M30.ini
3.1 Sensor 和 ISP 基本配置
| 行号 | 参数 | 当前真实值 | 修改用途 |
|---|---|---|---|
| 5 | dev_id |
0 |
ISP 设备号 |
| 6 | sensor_type |
g_sns_sc4336p_obj |
SC4336P Sensor 对象 |
| 8 | sensor_lib_file |
./libs/libsns_sc4336p.so |
Sensor 二进制库 |
| 10 | mirror_flip_type |
0 |
正常方向 |
| 15 | blc_clamp_en |
TRUE |
开启黑电平钳位 |
| 17 | use_wdr_mode |
0 |
默认线性模式 |
| 34~39 | ISP 窗口和 Sensor 尺寸 | 2560 × 1440 |
输入画面尺寸 |
| 40 | frame_rate |
30 |
30 fps |
| 41 | bayer_format |
3 |
BGGR |
| 46 | sns_mode |
0 |
Sensor 默认模式 |
| 47 | sns_flip_en |
FALSE |
不翻转 |
| 48 | sns_mirror_en |
FALSE |
不镜像 |
| 49 | mipi_crop_en |
FALSE |
不在 MIPI 层裁剪 |
| 55 | sns_type |
0 |
I2C 控制类型 |
| 59 | i2c_dev |
0 |
使用 I2C 总线 0 |
常用修改位置:
- 画面上下颠倒:第 47 行
sns_flip_en。 - 画面左右相反:第 48 行
sns_mirror_en。 - 更换分辨率:不要只改第 34~40 行,应切换
config_entry.ini中已有模式,或者同步修改 ISP、MIPI、VI、VPSS 和 VENC 全链路尺寸。 i2c_dev = 0是 I2C 控制器编号,不是 SC4336P 的从设备地址。
3.2 MIPI 参数
| 行号 | 参数 | 当前真实值 | 含义 |
|---|---|---|---|
| 89 | lane_divide_mode |
1 |
MIPI Lane 划分模式 1,即 2 Lane + 2 Lane |
| 92 | mipi_mode_num |
2 |
配置两个 MIPI 模式 |
| 94 | sns_clk_src |
0 |
Sensor 时钟源 0 |
| 95 | sns_rst_src |
0 |
Sensor 复位源 0 |
| 102 | input_mode |
0 |
MIPI 输入 |
| 107~113 | img_rect |
0,0,2560,1440 |
Sensor 输入区域 |
| 115 | data_rate |
0 |
X1 数据速率模式 |
| 119 | mipi_attr.input_data_type |
2 |
RAW12 |
| 129 | mipi_attr.wdr_mode |
0 |
非 WDR MIPI 模式 |
| 134 | mipi_attr.lane_id |
`2 | 0 |
| 191~231 | MIPI mode 1 | 时钟源 0,RAW12,Lane 1、3 | WDR 模式对应的第二组 Lane |
修改位置:
- 修改 Lane 接线顺序:第 134 行;必须与原理图实际连接一致。
- 修改 Sensor 时钟或复位来源:第 94~95 行。
- 修改 RAW 位宽:第 119 行,同时核对 VI
pixel_format和 Sensor 输出模式。 - 修改 WDR:第 17、27~31、129 行及对应 mode 1 参数必须一致,不能只改一个开关。
3.3 VI 参数
| 行号 | 参数 | 当前真实值 | 含义 |
|---|---|---|---|
| 288 | dev_num |
1 |
1 个 VI 设备 |
| 290 | pipe_num |
1 |
1 条 VI Pipe |
| 292 | dev_id |
0 |
VI 设备 0 |
| 294 | vi_mipi_devno |
0 |
绑定 MIPI 设备 0 |
| 296~297 | Pipe 绑定 | 1 条,Pipe 0 | VI Dev 绑定 Pipe 0 |
| 299 | intf_mode |
4 |
MIPI RAW 接口 |
| 309 | work_mode |
0 |
单路复用模式 |
| 314 | scan_mode |
0 |
逐行扫描 |
| 373~374 | VI 设备尺寸 | 2560 × 1440 |
VI 输入尺寸 |
| 420~421 | VI Pipe 尺寸 | 2560 × 1440 |
Pipe 工作尺寸 |
| 422 | pixel_format |
25 |
RGB Bayer 12 bit |
| 429 | compress_mode |
0 |
不压缩 |
| 440 | nr_enable |
TRUE |
开启 VI 3DNR |
| 441 | nr_type |
0 |
普通视频降噪类型 |
| 454 | nr_motion_mode |
0 |
普通运动模式 |
| 459 | nr_effect_mode |
1 |
高级降噪效果模式 |
| 463 | bnr_buf_num |
2 |
BNR 缓冲数 2 |
| 465 | online_clock_en |
FALSE |
不使用在线时钟配置 |
| 466~468 | 在线时钟参考 | 630 Mbps、2 Lane、10 bit | 当前在线时钟关闭,属于参考值 |
| 472~474 | VI 通道输出 | 2560 × 1440,YVU420 |
VI 输出给后级的格式 |
修改位置:
- 运动场景降噪的直接开关:第 440~463 行。
- 跳远项目不应盲目加大降噪;过强时会把脚部边缘和快速运动细节抹掉。
- 修改输入分辨率时,第 373~374、420~421、472~473 行必须与 MIPI 输入一致。
3.4 VPSS 和编码参数
| 行号 | 参数 | 当前真实值 | 含义 |
|---|---|---|---|
| 514 | vpss_grp_num |
1 |
1 个 VPSS Group |
| 517 | vpss_chn_num |
1 |
1 个 VPSS 通道 |
| 519~520 | VPSS 最大尺寸 | 2560 × 1440 |
Group 最大处理尺寸 |
| 550 | vpss_chn |
0 |
VPSS 通道 0 |
| 554~555 | VPSS 输出 | 2560 × 1440 |
当前不缩放 |
| 601 | payload_type |
265 |
H.265 |
| 609~610 | 编码尺寸 | 2560 × 1440 |
VENC 输出尺寸 |
| 630 | rc_mode |
14 |
H.265 CBR |
| 690 | gop |
50 |
每 50 帧一个 GOP |
| 692~693 | 编码帧率 | 30/30 |
输入输出均 30 fps |
| 694 | bit_rate |
6144 |
6144 kbps |
跳远 RTSP 常用修改位置:
- 改成 H.264:第 601 行改为
96,同时第 630 行必须改为相应 H.264 码控模式,不能只改编码类型。 - 调整无线传输码率:第 694 行。
- 调整关键帧间隔:第 690 行。30 fps 下 GOP 50 约为 1.67 秒。
- 输出 1080p 子码流:优先新增或选择独立 VPSS/VENC 通道,不建议直接破坏 4M 主码流配置。
4 简化运行配置 vi.json
文件:
text
overlay/opt/ceanic/etc/vi.json
真实内容:
| 行号 | 参数 | 当前值 |
|---|---|---|
| 3 | lane_mode |
0 |
| 4 | max_h |
1440 |
| 5 | max_w |
2560 |
| 6 | name |
SC4336P |
| 7 | vi_fr |
30 |
| 8 | wdr_mode |
0 |
这个文件是 /opt/ceanic 应用侧的简化 VI 配置。若实际 RTSP 服务运行的是 ceanic 应用,修改分辨率、帧率或 WDR 时也要同步检查这里。
板端应先用下面的命令确定实际运行路径:
sh
ps | grep -E "ceanic|ittb_stream|PQTools"
cat /opt/ceanic/etc/vi.json
不要同时运行 ceanic 视频业务和 ittb_stream,否则可能竞争 VI、ISP 和 VENC 资源。
5 曝光 白平衡和 ISP 调参的真实边界
文件:
text
overlay/system/Hi3516CV610_PQ_V1.0.2.0/config.cfg
真实配置:
| 行号 | 参数 | 当前值 | 含义 |
|---|---|---|---|
| 29~30 | Use3A |
3a=1 |
启用 3A |
| 33 | AE_En |
1 |
启用自动曝光 |
| 34 | AE_Lib |
./libs/libss_mpi_ae.so |
AE 二进制库 |
| 35 | AWB_En |
1 |
启用自动白平衡 |
| 36 | AWB_Lib |
./libs/libss_mpi_awb.so |
AWB 二进制库 |
| 84~88 | RAW 配置 | RAW12,线性模式 | 抓 RAW 时的模式 |
当前资料没有提供可直接编辑的曝光目标、最大曝光时间、最大增益、白平衡增益曲线等 C 源码参数。这些参数由以下内容提供:
text
libs/libsns_sc4336p.so
libs/libss_mpi_ae.so
libs/libss_mpi_awb.so
PQTools 运行时配置
因此目前可以确认"启用了自动曝光和自动白平衡",不能仅凭这套源码声称已经修改了具体 AE/AWB 算法参数。
如果使用海思 PQ 工具调整图像,应执行:
sh
/system/Hi3516CV610_PQ_V1.0.2.0/PQTools.sh -s sc4336p
调参后需要导出新的 SC4336P 配置或 ISP 参数,并把导出的文件纳入工程,才能形成可复现的曝光、白平衡和降噪修改记录。
6 当前没有源码的位置
在已解压 SDK 中没有发现以下 SC4336P C 源文件:
text
sensor_ctl.c
sc4336p_sensor_ctl.c
sc4336p_cmos.c
sc4336p_cmos_ex.h
SC4336P 目前通过下面的二进制库提供:
text
overlay/system/Hi3516CV610_PQ_V1.0.2.0/libs/libsns_sc4336p.so
因此下面两类数据无法从当前源码中可靠统计:
- SC4336P 的 I2C 从设备地址;
- 上电初始化寄存器表、曝光寄存器、模拟增益和数字增益寄存器地址。
要补齐这些内容,需要厂家提供 SC4336P Sensor 驱动源码,或者提供对应版本的数据手册和寄存器初始化表。不能用网上其他板卡的 SC4336P 数值替代,因为 MIPI Lane、时钟和工作模式可能不同。
7 推荐写入项目文档的准确表述
基于厂家提供的 SC4336P Sensor 库完成摄像头配置适配,选择 2560 × 1440@30fps 线性模式,配置 I2C0、MIPI 双 Lane、RAW12 输入、VI Bayer12 采集及 VI 三维降噪,并建立 VI、VPSS、VENC 链路;结合 Wi-Fi RTSP 传输需求调整编码分辨率、帧率、GOP 和码率。通过海思 PQ 工具启用并调试 AE、AWB 和降噪效果。
如果尚未实际使用 PQ 工具导出参数,应把最后一句改成:
系统已启用海思 AE、AWB 和 VI 降噪功能,后续根据跳远场地光照和运动模糊情况继续标定 ISP 参数。
这一步主要完成"摄像头原始数据 → 编码码流"的整条视频链路。
具体操作
- 初始化 SYS 和 VB
根据 2560×1440 分辨率计算视频缓冲区大小,创建 VB Pool,然后初始化海思媒体系统。
c
ss_mpi_vb_set_cfg();
ss_mpi_vb_init();
ss_mpi_sys_init();
主要配置:
- 分辨率:2560×1440
- VB 对齐:64 字节
- 缓冲块数量
- RAW、YUV帧需要的内存大小
- 启动 VI 和 ISP
VI 接收 SC4336P 通过 MIPI 输出的 RAW12 图像,ISP完成黑电平、曝光、白平衡、去噪和 Bayer 转换。
当前实际配置:
text
SC4336P
MIPI 双 Lane
RAW12 BGGR
2560×1440
30fps
主要工作:
- 注册 SC4336P Sensor;
- 注册 AE、AWB 算法库;
- 初始化 ISP;
- 创建 VI Device、VI Pipe 和 VI Channel;
- 将 MIPI 设备绑定到 VI Pipe;
- 启动 ISP 运行线程。
- 配置 VPSS
VPSS 接收 VI 输出的 YUV 图像,完成缩放、裁剪、帧率转换和格式转换。
当前配置为:
text
输入:2560×1440 YUV420
输出:2560×1440 YUV420
VPSS Group:0
VPSS Channel:0
如果电脑端不需要 4M 画面,可以在这里缩放成:
text
1920×1080
1280×720
这样可以降低编码压力、Wi-Fi 带宽和电脑端解码负担。
- 绑定 VI 和 VPSS
将 VI 通道输出直接送入 VPSS:
c
ss_mpi_sys_bind(&vi_chn, &vpss_grp);
当前配置链路为:
text
VI Device 0
-> VI Pipe 0
-> VI Channel 0
-> VPSS Group 0
- 创建 VENC 编码通道
配置视频编码格式、分辨率、码率、帧率和 GOP。
当前源码默认参数:
text
编码格式:H.265
编码模式:CBR
分辨率:2560×1440
帧率:30fps
码率:6144kbps
GOP:50
VENC Channel:0
如果电脑端更适合 H.264,需要同时修改:
payload_type:H.265 攃成 H.264;rc_mode:H.265 CBR 改为 H.264 CBR;- RTSP 服务中的编码类型;
- SPS、PPS解析和发送逻辑。
- 绑定 VPSS 和 VENC
将 VPSS 输出送给编码器:
c
ss_mpi_sys_bind(&vpss_chn, &venc_chn);
完整链路变为:
text
SC4336P
-> MIPI
-> VI
-> ISP
-> VPSS
-> VENC
- 获取编码码流
启动取流线程,持续从 VENC 获取 H.264 或 H.265 数据包:
c
ss_mpi_venc_query_status();
ss_mpi_venc_get_stream();
处理完成后释放码流:
c
ss_mpi_venc_release_stream();
码流可以:
- 保存成
.h264或.h265文件; - 发送给 RTSP 服务;
- 用 VLC、FFplay 或电脑端 OpenCV 解码。
- 停止和释放资源
程序退出时按照相反顺序停止:
text
停止取流线程
解除 VPSS 与 VENC 绑定
停止 VENC
解除 VI 与 VPSS 绑定
停止 VPSS
停止 VI 和 ISP
退出 SYS
释放 VB
否则程序再次启动时,可能出现设备忙、通道已创建或 VB 重复初始化等问题。
简化表述
基于海思 MPP 框架初始化 SYS 和 VB 视频缓冲池,配置 SC4336P 的 VI、ISP采集链路,将 RAW12 图像转换为 YUV数据;通过 VPSS 完成缩放和格式转换,并绑定 VENC 实现 H.264/H.265 编码。创建独立取流线程获取编码数据,并将码流发送给 RTSP 服务供电脑端实时解码。