一、软件条件
1.所需环境:
1.1 虚拟机与主机之间的交互的环境:VMware17.6 + Ubantu22.04
1.2 开发板与主机之间的交互环境:MobaXterm
2.其他软件工具:
2.1 Visual Studio Code:采用SSH方式与虚拟机进行链接,方便对相关SDK文件的修改
2.2 Xshell:可以进行相关版级命令操作
3.本文参考文档
1.图像质量调试工具使用指南.pdf
2.Sensor调试指南.pdf
3.MIPI使用指南
4.本文参考资源链接
1.C16DV5-IPC-38E 使用PQTOOLS:C16DV5-IPC-38E 使用PQTOOLS_专栏_易百纳技术社区
2.详细记录海思相机适配新的sensor(IMX585)(一)——Hi3519DV500:详细记录海思相机适配新的sensor(IMX585)(一)——Hi3519DV500-CSDN博客
3.详细记录海思相机适配新的sensor(IMX585)(二)——Hi3519DV500:详细记录海思相机适配新的sensor(IMX585)(二)——Hi3519DV500-CSDN博客
4.Hi3519dv500 PQTools工具使用:Hi3519dv500 PQTools工具使用-CSDN博客
5.使用 Shell 调试 I2C 设备:使用 Shell 调试 I2C 设备 - 派大海星 - 博客园
5.开发前的准备
5.1 确认主芯片规格
支持Master模式,支持的线程,WDR接口模式,支持频率上限
5.2 Sensor datasheet
确认图像传输接口模式,输出频率
7Dh | MIPI_CNTL1 | 7 | 0Fh | MIPI控制1 |
7Eh | MIPI_CNTL2 | 7 | 10h | MIPI控制2 |
MIPI单通道输出(支持8/10位Bayer原始数据)
分辨率:UXGA(1600×1200)@30fps
确认曝光时间,增益如何设置,帧率如何修改
6Bh | INT_TIME_H | 8 | 02h | 曝光时间高位 |
6Ch | INT_TIME_L | 8 | A2h | 曝光时间低位 |
确认在WDR模式下的以上两项
LVDS接口,需要确认同步码
5.3 Intialize Settings
获取Sensor Initial Settings,一般需要准备最大规格和标准分辨率两种序列,以对接os08a20 sensor为例,当前需要对接4K@30fps线性模式和4K@30fps WDR模式两个模式,当前MIPI的lane数为4lane,sensor工作时钟为24MHZ,I2C设备的地址为0x6c,这些信息都需要与原厂的技术支持进行沟通获取。
PTS921 通过 I²C 从机接口(Two-Wire Serial Interface Slave)实现寄存器读写。
- 时钟控制:主机驱动 SCLK(Serial Clock) 信号线。
- 数据传输:通过 SDA(Serial Data) 信号线双向通信(需外接 2kΩ 上拉电阻至 VDDIO)。
- 设备地址:
- 当 ID_SEL=0:0x3E(7位地址 0b0111110)
- 当 ID_SEL=1:0x6E(7位地址 0b1101110)
注:地址不包含 R/W 位,实际传输时需在地址末尾追加读写位(写=0/读=1)。
寄存器写入流程
mermaid
图片代码
sequenceDiagram
主机->>从机: [Start] + 地址(写模式) + ACK
主机->>从机: 8位寄存器地址 + ACK
主机->>从机: 8位数据 + ACK
主机->>从机: [Stop] 或 [Start](连续写入)
从机主机从机主机[Start] + 地址(写模式) + ACK8位寄存器地址 + ACK8位数据 + ACK[Stop] 或 [Start](连续写入)
自动递增:写入数据后寄存器地址自动递增,实现连续写入
关键信号定义
信号 | 描述 |
起始位 (Start Bit) | SCL=高电平时,SDA 发生高→低跳变。 |
停止位 (Stop Bit) | SCL=高电平时,SDA 发生低→高跳变。 |
应答位 (ACK) | 接收方在第9个时钟周期将 SDA 拉低以示确认。 |
非应答位 (NACK) | 接收方在第9个时钟周期保持 SDA 高电平(用于终止读取)。 |
数据传输规则
- 单字节传输:每个 SCLK 脉冲传输1位数据,SDA 数据在 SCLK=高电平时必须保持稳定。
- 数据包结构:每次传输 8位数据 + 1位ACK/NACK。
硬件准备就绪首先验证是否可以读写sensor寄存器。
利用i2c_read/i2c_wirte命令,或ssp_read/ssp_wirte命令测试Sensor寄存器读写。该命令集成在默认的文件系统中,可直接调用。
i2c_num
:I2C控制器编号(如0x0
、0x1
)。dev_addr
:I2C设备地址(7位格式,如0x56
)。reg_addr
:寄存器起始地址。reg_addr_end
:寄存器结束地址(连续读时需指定范围)。reg_width
:寄存器地址位宽(1或2字节,默认1)。data_width
:数据位宽(1或2字节,默认1)。reg_step
:连续读步长(默认1,表示连续读)i2c_read 0x1 0x56 0x0 0x10 2 2 # 读16位寄存器,数据位宽2字节 i2c_read 0x1 0x56 0x0 0x10 # 简化版(默认位宽1字节)
i2c_write 0x1 0x56 0x0 0x28 2 2 # 向16位地址寄存器写入16位数据0x28
i2c_write 0x1 0x56 0x0 0x28 # 简化版(默认位宽1字节)
spi_num
:SPI控制器编号(如0x0
)。csn
:片选号(如0x0
)。dev_addr
:设备地址(如0x2
)。reg_addr
:寄存器地址。num_reg
:读取的寄存器数量(默认1)。dev_width
/reg_width
/data_width
:地址/寄存器/数据位宽(默认1字节)。reg_order
/data_order
:地址/数据传输顺序(默认1,通常为大端)
ssp_read 0x0 0x0 0x2 0x0 0x10 0x1 0x1 0x1 0x1 0x1 # 完整参数
ssp_read 0x0 0x0 0x2 0x0 # 简化版(默认位宽和数量为1)
ssp_write 0x0 0x0 0x2 0x0 0x65 0x1 0x1 0x1 0x1 0x1 # 完整参数
ssp_write 0x0 0x0 0x2 0x0 0x65 # 简化版
注:do errro
提示**:
- 所有命令后均输出
do errro
,表明参数输入不完整或格式错误。 - 例如:仅输入
i2c_read
而不带参数,工具会打印用法说明并报错
参数速查表
命令 | 必选参数 | 可选参数默认值 |
---|---|---|
i2c_read | <i2c_num> <dev_addr> <reg_addr> <reg_addr_end> | reg_width=1, data_width=1, reg_step=1 |
i2c_write | <i2c_num> <dev_addr> <reg_addr> <value> | reg_width=1, data_width=1 |
ssp_read | <spi_num> <csn> <dev_addr> <reg_addr> | num_reg=1, dev_width=1, reg_width=1, data_width=1, reg_order=1, data_order=1 |
ssp_write | <spi_num> <csn> <dev_addr> <reg_addr> <data> | dev_width=1, reg_width=1, data_width=1, reg_order=1, data_order=1 |
1.首先需要将官方给出的SDK包从主机端传输到虚拟机端,可以将主机文件夹复制后在虚拟机端直接进行粘贴或者可以通过建立虚拟机与主机之间的共享文件夹进行文件的传输,可以借助copy to操作。在Home目录下,执行以下命令对hi3519dv500.tar.tgz文件进行解压缩,进入SDK工程目录下展开SDK包内容。
tar xf hi3519dv500.tar.gz
cd Hi3519DV500_SDK_V2.0.2.0/
./sdk.unpack
初始化序列,建议参考版本发布包里面的sensor驱动,以便快速开发。为了方便调试,此时要排除AE配置以及帧率配置的干扰
准备sensor驱动
可以基于一款规格相近Sensor(master/slave, i2c/spi, wdr/linear)驱动修改,尝试编译出sensor库。具体可以参看isp/.../sensor/ssxxx/xxx目录下的xxx_cmos.c、xxx_cmos.h和xxx_sensor_ctl.c文件进行修改。
修改cmos_set_image_mode函数,及cmos_get_isp_default中相应的sensor图像宽高,帧率和模式等参数。使该sensor分辨率、帧率可以被正确设置。
在sys_cfg.c中修改sensor时钟配置,I2C/SPI接口pin mux, vi时钟、isp时钟等寄存器。适配时,可基于相似规格的sensor修改,对于从模式的sensor要增加判断分支实现函数的调用来正确配置从模式的pin mux.
sensor初始化序列
实现void sensor_init()函数,参考sensor手册或则sensor厂家提供的sensor序列实现这个函数。对于从模式snesor,在sensor_init()函数中需要调用ss_mipi_isp_get_sns_slave_attr接口来实现从模式寄存器的配置。
在xxx_sensor_ctl.c或xxx_cmos.h填写sensor寄存器的基地址sensor_i2c_addr,地址的比特位宽sensor_addr_byte,寄存器的比特位宽信息sensor_data_byte
在xxx_cmos.c文件中注释掉全部sensor_write_register,并在cmos_get_sns_regs_info/cmos_comm_sns_reg_info_init函数里,把reg_num配置为0,以使AE不配置sensor,排除干扰
Sensor 输出
本部分是基于mpp目录下的sample做整个通路的输出说明。主要在已完成了sensor序列的前提下做的。其步骤主要包括: MIPI、 VI、 ISP以及VPSS的配置。这些配置可以参考已有sensor的配置进行简单修改即可。如果已经有集成的环境直接配置参数就可以运行,比如PQTool的启动脚本,对应sensor的目录有启动的配置文件,只需要配置正确即可。
步骤1 在完成初始化的配置之后,可在ISP目录下编译即可生成新的Sensor的库,新库的路径为mpp/lib/ libsns_xxx.a和mpp/lib/libsns_xxx.so。
步骤2 基于mpp的sample对新Sensor进行验证。在sample/Makefile.param文件中新增一款Sensor的编译配置SENSOR_TYPE,然后添加对应的libsns_xxx.a文件。
步骤3 在sample_comm.h中的sample_sns_type 中添加该sensor类型,注意和sample/Makefile.param文件中新增的SENSOR_TYPE一致。然后再sample_comm_isp.c中sample_comm_isp_get_pub_attr_by_sns 函数中添加这个sensor类型的属性,如: Bayer pattern,帧率,宽高信息。
步骤4 配置MIPI属性,在sample_comm_vi.c中sample_comm_vi_get_mipi_attr 添加MIPI属性,调试MIPI/LVDS部分参考《 MIPI 使用指南》。
步骤5 配置VI属性。在sample_comm_vi.c中sample_comm_vi_get_default_dev_info 添加VI属性。
步骤6 编译并运行相应的应用程序sample_vio,如果一切顺利,此时整个系统已经运行。可
以通过cat /proc/umap/isp或者cat /proc/umap/mipi_rx等查看信息。
步骤7 如果ISP没有中断,请先检查Sensor输入时钟、输出信号及Sensor寄存器配置是否正常。具体操作请查阅芯片手册。
步骤8 若发现MIPI、 VI、 ISP等都正常,并想进行图像质量调节,可以把上述的配置移植到
PQTool的对应sensor 配置文件中(在config目录下新建一个sensor目录,参考类似sensor的配置做相应的修改即可),点播看图。
——《Sensor调试指南》
二、序列初始化详细过程
2.1 修改sensor驱动
在“Hi3519DV500_SDK_V2.0.2.0/smp/a55_linux/source/mpp/cbb/isp/user/sensor/hi3519dv500”中找到各个版本sensor的驱动文件夹
寻找与目标sensor详尽的sensor驱动进行修改,这里以os08a20sensor为例进行修改,将oso8a20文件夹,重新复制一份,命名为sensor_pts001。以后的修改直接在sensor_pts001文件夹中进行。
修改过程中遵循非必要不修改的原则,重点是修改寄存器数值和一些参数值,如果所选传感器与新传感器的差异较大的时候,还需修改相应的函数值。(对于自研sensor来说,改动的往往比较多)
首先看一下目录结构,一共有以下5个文件,我们依次对相关文件进行解析,分析其中需要修改和需要重点关注的部分
2.1.1 os08a20_cmos_ex.h文件
可以看出os08a20_coms_ex.h程序,大部分函数都与ISP有关,如果要求先出图,则该部分可暂时忽略。
2.1.2 对于os08a20_cmos.c主要是对以下部分内容的修改:
对照sensor的.ini文件对方框内参数进行修改,ID暂不修改(主要是对ID的修改规则还不明晰,建议将多个sensor的ID进行对比发现规律)
修改后的代码如下:
对于曝光时间的寄存器地址定义:
曝光控制寄存器
寄存器地址 | 功能说明 | 位宽设计原理 |
---|---|---|
OS08A20_EXPO_H_ADDR (0x3501) | 曝光时间高8位 控制曝光时长的高字节部分,与低字节组合形成16位曝光值 | 高位寄存器存储曝光值的高权重比特 |
OS08A20_EXPO_L_ADDR (0x3502) | 曝光时间低8位 存储曝光时长的低字节,值域0-255调节精细度 | 低位寄存器存储低权重比特 |
OS08A20_SHORT_EXPO_H_ADDR (0x3511) | 短帧曝光高8位 WDR模式下短帧曝光的高字节控制(用于高亮区域) | 支持宽动态范围的双曝光控制 |
OS08A20_SHORT_EXPO_L_ADDR (0x3512) | 短帧曝光低8位 配合高字节实现短帧曝光的精细调节 | 双曝光机制需独立 |
增益控制寄存器
寄存器地址 | 功能说明 |
---|---|
OS08A20_AGAIN_H_ADDR (0x3508) | 模拟增益高8位 控制传感器模拟放大电路增益(直接影响信噪比) |
OS08A20_AGAIN_L_ADDR (0x3509) | 模拟增益低8位 提供模拟增益的精细调节步进(典型值0.125dB/步) |
OS08A20_DGAIN_H_ADDR (0x350a) | 数字增益高8位 控制ISP数字放大系数(会引入量化噪声) |
OS08A20_DGAIN_L_ADDR (0x350b) | 数字增益低8位 实现数字增益的平滑过渡 |
OS08A20_SHORT_AGAIN_H_ADDR (0x350c) | 短帧模拟增益高8位 WDR短帧专用模拟增益控制 |
OS08A20_SHORT_AGAIN_L_ADDR (0x350d) | 短帧模拟增益低8位 短帧模式下的增益微调 |
OS08A20_SHORT_DGAIN_H_ADDR (0x350e) | 短帧数字增益高8位 避免长/短帧增益干扰的双寄存器设计 |
OS08A20_SHORT_DGAIN_L_ADDR (0x350f) | 短帧数字增益低8位 保证WDR模式下两帧图像增益独立可调 |
帧同步控制寄存器
寄存器地址 | 功能说明 |
---|---|
OS08A20_VMAX_H_ADDR (0x380e) | 垂直帧长高8位 设定帧总行数的高字节(决定帧率:Frame Rate = 时钟基准 / VMAX) |
OS08A20_VMAX_L_ADDR (0x380f) | 垂直帧长低8位 提供帧长的精细调节(最小步进=1行) |
#define OS08A20_MARGIN 4 // 曝光安全边界值
//作用:曝光时间设置上限 = VMAX - MARGIN
//原理:预留4行时间作为消隐区(Blanking),防止曝光跨越帧边界导致图像撕裂
可以发现os08a20参数,主要在以下三个函数中进行了使用
这个函数名为cmos_inttime_update_linear,看起来是用于设置图像传感器的曝光时间。先看一下函数参数:vi_pipe应该是指视频输入管道,int_time是曝光时间值。函数开头通过os08a20_sensor_get_ctx获取传感器上下文,如果获取失败则直接返回,这里有个sns_check_pointer_void_return宏应该是做空指针检查。接着看到value = int_time,这里直接保存传入的曝光时间值。然后函数分成两个分支:如果g_quick_start_en[vi_pipe]为真,表示需要快速更新,就直接调用os08a20_write_register函数向传感器的两个寄存器地址(OS08A20_EXPO_L_ADDR和OS08A20_EXPO_H_ADDR)写入曝光时间的低8位和高8位。如果不走快速更新路径,就将曝光时间值写入到sns_state->regs_info数组的对应位置(EXPO_L_IDX和EXPO_H_IDX),这里是先缓存起来,可能后续会批量写入。这个函数主要实现了对图像传感器曝光时间的设置,根据不同的工作模式选择立即写入或缓存设置。其中曝光时间被拆分为高低8位分别存储,符合常见图像传感器寄存器设计。
这个函数明显是用于图像传感器控制的底层代码,涉及到CMOS传感器的参数配置。从函数名和内容来看,这应该是用于设置像素检测模式的函数,可能在图像质量校准或测试时使用。函数有两个参数,vi_pipe表示视频输入管道,enable表示是否启用像素检测模式。函数内部首先获取传感器上下文,然后根据传感器的工作模式计算特定参数,最后根据enable的值分别配置两组不同的寄存器设置。当enable为真时,函数配置了增益寄存器(AGAIN和DGAIN)、垂直最大值寄存器(VMAX)和曝光寄存器(EXPO)。这些值被硬编码为特定值或基于fps计算的值。当enable为假时,函数恢复"正常模式"的设置,使用保存在传感器状态中的标准值。
函数开头获取了传感器上下文sns_state,这是操作传感器的基础。然后检查传感器是否处于线性WDR模式(OT_WDR_MODE_2To1_LINE),如果是则直接返回,说明此模式不支持该功能。接着判断传感器是否处于特定的8M 30fps线性模式,如果是则计算5fps对应的全行数(full_lines_5fps)。当enable为真时,设置固定的模拟增益(0x8000,即128倍)和数字增益(0x0400,即4倍),这可能是为了校准目的而设置的固定增益值。然后设置VMAX寄存器为full_lines_5fps,这控制了帧率。设置EXPO寄存器为full_lines_5fps - 10,确保曝光时间略小于帧周期。当enable为假时,恢复正常的VMAX设置,并从sns_state中获取标准值,同时重置同步初始化标志。
这个函数的主要作用是在需要执行像素级校准或测试时,将传感器配置到一个特定的工作状态(固定增益、固定曝光、低帧率),以便进行精确测量或校准。完成后又能恢复正常的拍摄模式。
先看函数名cmos_comm_sns_reg_info_init,拆解后可知这是用于初始化传感器寄存器信息的函数。参数vi_pipe指定视频输入通道,sns_state是传感器状态结构体指针。
函数首先设置传感器类型为I2C(OT_ISP_SNS_TYPE_I2C),符合CMOS传感器常见的控制接口。通过g_os08a20_bus_info获取对应通道的I2C设备信息,这里体现了多路摄像头支持的设计。
注意到有个关键标志g_quick_start_en,这决定配置生效速度:快速模式延迟帧数设为1(立即生效),常规模式为2(等待两帧)。这种设计在需要实时调整参数的场景很重要,比如高速连拍时曝光必须即时响应。
随后处理WDR(宽动态范围)模式的特殊逻辑:当处于OT_WDR_MODE_2To1_LINE时,寄存器数量增多(WDR_REG_MAX_IDX),且强制延迟帧数为2。这是因为WDR需要多帧合成,寄存器更新时序更复杂。
循环初始化部分值得关注:为每个寄存器设置update标志(TD_TRUE允许更新)、I2C地址(OS08A20_I2C_ADDR)及地址/数据字节数。这里采用统一初始化模板提高效率,避免重复代码。
重点在于具体寄存器的定制化配置:
- 曝光(EXPO)和增益(AGAIN/DGAIN)寄存器delay_frame_num=0,说明这些关键参数需要立即生效
- 帧长寄存器(VMAX)却设为1,因为修改垂直消隐会影响帧时序,延迟一帧生效可避免画面撕裂
这种差异化的延迟策略非常专业——实时参数立即生效,影响时序的参数等待垂直同步。类似设计在显示驱动中也常见,比如修改分辨率需要等待vblank。
而在新的sensor的.ini文件中,与曝光时间相关的寄存器配置仅有以下两个,即曝光时间高位与曝光时间低位地址的赋值。
这部分的代码修改后的结果为
对于短曝光设置,仅有一个函数进行了调用,如下所示
初始化 OS08A20 传感器在 2:1 线性 WDR 模式 下的关键寄存器配置表,构建宽动态场景的底层控制框架。
先看函数参数:vi_pipe表示视频输入管道,用于多路摄像头区分;sns_state是传感器状态结构体指针,用于存储寄存器配置信息。有趣的是第一行就调用了ot_unused(vi_pipe),这说明在这个特定函数里vi_pipe参数未被使用。
接下来是核心的寄存器配置部分。这里分为几个关键组:
曝光控制部分设置了短帧曝光的寄存器和生效策略。OS08A20_SHORT_EXPO_L_ADDR(0x3512)和OS08A20_SHORT_EXPO_H_ADDR(0x3511)分别对应短帧曝光的低8位和高8位地址。delay_frame_num=0表示这些参数修改后立即生效,这对需要快速响应光照变化的场景很关键。增益控制部分配置了短帧的模拟增益和数字增益寄存器。OS08A20_SHORT_AGAIN_L_ADDR(0x350d)等地址是WDR模式特有的,与普通线性模式的分开。同样设置0帧延迟,确保增益调整实时生效。帧长控制部分比较特殊,VMAX寄存器(0x380e/0x380f)被设置为1帧延迟生效。这是为了防止画面撕裂,因为改变帧长会影响整个传感器的时序,需要等待垂直同步周期结束后再切换。注意到所有配置都放在regs_info[0]这个数组的第一个元素里,结合之前海思平台的信息,这应该对应mipi0接口的配置。在WDR模式下,短帧参数和长帧参数是分开控制的,这也是为什么需要这么多专用寄存器。
WDR (宽动态范围,Wide Dynamic Range)模式专用控制(这几个寄存器在新sensor的.ini文件中并未出现,暂时不予修改)
参数类型 | 寄存器地址 | 作用 | 生效策略 |
---|---|---|---|
短曝光时间 | 0x3511/0x3512 | 控制短帧曝光时长(捕捉高亮区域) | 立即生效 |
短曝光模拟增益 | 0x350c/0x350d | 独立调节短帧模拟放大系数(抑制高光噪声) | 立即生效 |
短曝光数字增益 | 0x350e/0x350f | 独立调节短帧数字放大系数(避免长/短帧干扰) | 立即生效 |
帧长 (VMAX) | 0x380e/0x380f | 控制总帧行数(决定帧率) | 延迟1帧生效 |
这里有全局增益和帧长那个,但是无法与上面定义参数进行匹配。
目前仅修改了图像的长宽以及曝光时间,其它的参数暂时不进行修改。
2.1.3 对于os08a20_cmos.h函数
这里需要修改的是I2C地址:
由sensor的Datasheet手册可知,此处I2C_ADDR要修改为0x3e
修改后的代码如下:
2.1.4 对于os08a20_sensor_ctl.c函数来说:
os08a20_linear_8m30_12bit_init_part5
是 OS08A20 图像传感器驱动初始化流程的第五阶段,专用于配置 8M分辨率、30FPS帧率、12bit线性模式 的关键寄存器参数。其核心作用是通过寄存器写入完成传感器启动前的最终配置,并激活传感器输出图像数据。
同理,利用新sensor的.ini文件,完成该部分寄存器的初始化,初始化文件如下:
修改后的代码如下所示:
到这基本改完了。下面就是生成so文件
在该文件夹下执行make命令,即可库文件.a和.so文件。
将lib文件从虚拟机传到主机然后加载到开发板中
三、板端开发详细过程
记得也要把虚拟机中的ko文件拷贝到卡发版中
将Hi3519DV500_PQ_V2.0.2.0通过MobaXterm软件传输到开发板中再进行解压操作,解压后包的目录结构如上图所示。
1.configs目录,包含ittb_stream运行各种业务场景的sensor配置文件(如果不需要运行ittb_stream,可删除该目录以节省板端空间;如果只运行个别场景,可删除该目录下其他场景的sensor配置文件以节省板端空间)
2.libs目录,包含ittb_control和ittb_stream运行的动态库文件(默认提供所有已支持场景的sensor库,如果只运行个别场景,可删除该目录下其他场景的sensor库以节省板端空间)
3.config.cfg是ittb_control和ittb_stream运行所需要的配置文件
4.PQtool.sh是运行ittb_control和ittb_stream的脚本文件
5.ittb_control和ittb_stream是业务程序文件
6.StratControl.sh是快速重启ittb_control的脚本文件
在SDK文件夹中,修改这两个文件的初始化程序。
这里的i2C根据开发板P1口的版图进行修改,这里是4不用进行修改
将Hi3519DV500_SDK_V2.0.2.0中smp/a55_linux/source/out目录下的ko文件传送到开发板上
运行ko目录中的./load3519dv500 -sensor xxx脚本,运行前需要设置load3519脚本mem_process_isolation参数为0,关闭进程隔离。
板端的工具使用./PQtools.sh -s运行stream进程,使用./PQTools.sh -c运行control进程,使用./PQTools.sh -a运行stream和control进程。
脚本分为两个部分:
运行前准备:
killall ittb_stream;#杀死ittb_stream进程
DLL_PATH=${LD_LIBRARY}:${PWD}/libs;指定库路径
export LD_LIBRARY_PATH=${DLL_PATH}#export 库
LD_LIBRARY_PATH即Linux环境变量名,该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径(该路径在默认路径之前查找)。
工具里使用了自己编译好的动态库,而这些动态库放在发布包的libs文件夹下。当前执行函数链接时,如果此文件不在目录‘/lib'和’usr/lib'下,那么就需要指定环境变量
运行可执行程序
./ittb_stream &
说明:如果外部的点播工具已经配置了LD_LIBRARY_PATH,则字节运行ittb_stream可执行程序即可。
——《图像质量调试工具使用指南.pdf》
运行上述脚本
打开PQstream软件与开发板建立连接,连接成功但没出图
PQTools也是异常
./load3519dv500 -a -sensor0 imx385 -vo_intf mipitx -board dmeb
是用于加载海思Hi3519DV500芯片驱动模块的Shell脚本命令,其核心功能是配置视频输入传感器、输出接口及硬件平台参数。
命令参数解析
参数 | 含义 | 技术说明 |
---|---|---|
**-a ** | 卸载后重新加载所有驱动模块 | 先执行rmmod 移除旧驱动,再执行insmod 加载新驱动,确保配置完全刷新 |
**-sensor0 imx385 ** | 指定主传感器型号为IMX385 | 配置MIPI接口的Sensor 0为索尼IMX385图像传感器(支持4K分辨率) |
**-vo_intf mipitx ** | 设置视频输出接口为MIPI TX模式 | 使用MIPI DSI接口输出视频信号(默认输出接口为BT1120) |
**-board dmeb ** | 指定硬件平台为DMEB开发板 | 加载适配DMEB板型的硬件配置(如I2C总线、时钟、GPIO等) |
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/PQTool/Hi3519DV500_PQ_V2.0.1.0/libs
这行命令用于在 Linux 系统中临时扩展动态链接库的搜索路径,具体含义分解如下:
-
LD_LIBRARY_PATH
- Linux 环境变量,用于指定程序运行时查找动态链接库(
.so
文件)的路径。 - 系统默认搜索路径为
/lib
和/usr/lib
,此变量可添加自定义路径。
- Linux 环境变量,用于指定程序运行时查找动态链接库(
-
LD_LIBRARY_PATH:
- 引用当前已存在的路径值,避免覆盖原有配置。
- 例如原值为
/usr/local/lib
,则新路径会追加到其后。
-
/PQTool/Hi3519DV500_PQ_V2.0.1.0/libs
- 冒号
:
是路径分隔符,用于连接多个路径。 - 新增路径为
/PQTool/Hi3519DV500_PQ_V2.0.1.0/libs
,通常存放海思 Hi3519DV500 芯片的 PQ(图像质量调校)库文件。
- 冒号
-
export
- 将修改后的路径设置为环境变量,对当前终端会话生效。
⚙️ 实际作用
- 程序运行时会优先在新增路径中搜索依赖的动态库,再查找系统默认路径。
- 此处目的是让程序能正确调用海思芯片的 PQ 优化库(如
libpq.so
),避免报错error while loading shared libraries
。
./PQTools.sh -a imx385
是用于启动海思Hi3519DV500芯片平台的图像质量调校工具的命令,专为索尼IMX385传感器配置。其具体含义和作用如下:
命令结构解析
组件 | 含义 | 技术说明 |
---|---|---|
**./PQTools.sh ** | 执行当前目录下的脚本文件 PQTools.sh | 该脚本是海思SDK中用于启动图像调校工具的核心脚本,负责加载传感器驱动和图像处理模块 |
**-a ** | 指定操作模式为 “启动工具并连接传感器” | -a 是 action 的缩写,表示执行完整初始化流程(包括加载驱动、启动服务) |
**imx385 ** | 指定传感器型号为 索尼IMX385 | 告知脚本需加载适配IMX385的配置文件和动态库(如 libsns_imx385.so ) |
底层行为详解
-
传感器驱动加载
- 根据
imx385
参数,加载对应的传感器驱动(libsns_imx385.so
),并应用预定义的ISP参数(如分辨率、帧率、WDR模式)。 - 配置I²C总线(需与硬件连接一致,例如总线号在
config_entry.ini
中定义)。
- 根据
-
服务启动
- 启动两个核心进程:
- **
ittb_control
**:提供HTTP接口(默认80端口),供PC端调参工具(如PQTools
)连接。 - **
ittb_stream
**:生成实时视频流,供PQStream
工具查看调参效果。
- **
- 启动两个核心进程:
-
动态库依赖
- 脚本依赖海思PQ动态库(路径需通过
export LD_LIBRARY_PATH=.../libs
提前设置),否则可能报错error while loading shared libraries
- 脚本依赖海思PQ动态库(路径需通过
./StartControl.sh -c
是一个在 Linux 系统中执行 Shell 脚本的命令,其含义和功能分解如下:
命令结构解析
组件 | 含义 | 技术说明 |
---|---|---|
**./ ** | 表示当前工作目录 | 指定脚本文件位于用户当前所在的目录(而非系统路径如 /bin ) |
**StartControl.sh ** | Shell 脚本文件名 | 通常以 .sh 后缀标识,包含一系列 Shell 命令,用于控制服务或应用程序的启动逻辑 |
**-c ** | 命令行选项 | 指示脚本以 “从字符串中读取命令” 的模式运行(需配合后续命令字符串),但在此命令中单独使用可能表示特定启动模式(如“配置模式”或“控制台模式”) |
四、寄语
作为一个嵌入式开发小白,目前仅做到了以上的程度。如果各位道友能够对上面我遇到的问题提出建议,我将十分感谢。也希望各位能从上面我踩的坑中得到些许启发。希望大家多多交流,共同进步。