海思Hi3519AV100实战:从IMX291到IMX307的Sensor移植避坑指南
在嵌入式视觉项目开发中,更换图像传感器是常有的事,尤其是在产品迭代或成本优化时。最近接手一个项目,需要将原有的索尼IMX291传感器替换为IMX307,平台是海思的Hi3519AV100。本以为两者同属索尼的星光级系列,寄存器配置应该大同小异,直接改改地址和时序就能跑起来。结果一脚踩进去,才发现从驱动修改、ISP适配到系统配置,处处是坑。折腾了快一周,总算把图像稳定地跑出来了,中间遇到的编译错误、图像异常、时钟配置不对等问题,现在回想起来都是宝贵的经验。这篇文章,我就把这次IMX307移植的完整过程,以及那些容易让人栽跟头的地方,系统地梳理一遍,希望能给正在做类似工作的朋友一些参考。
1. 移植前的准备工作与环境搭建
在动手修改代码之前,充分的准备工作能避免很多不必要的麻烦。这次移植的目标平台是Hi3519AV100,这是一颗面向高端智能视觉应用的SoC,集成了双核A53、NNIE神经网络引擎和强大的ISP。我们手头的SDK版本是V2.0.2.0,开发环境是Ubuntu 18.04。
首先,确保你的交叉编译工具链已经正确安装并配置好环境变量。海思官方提供的通常是arm-himix200-linux,你可以通过以下命令验证:
arm-himix200-linux-gcc -v
如果正确安装,你会看到类似下面的输出:
gcc version 6.3.0 (Hisilicon_v610)
接下来,需要理清SDK中与Sensor驱动相关的目录结构。对于Hi3519AV100,Sensor驱动主要位于以下路径:
Hi3519AV100_SDK_V2.0.2.0/mpp/component/isp/user/sensor/hi3519av100/
在这个目录下,你会看到已经适配好的各种Sensor驱动文件夹,比如sony_imx290、sony_imx334等。我们的策略是基于最接近的IMX291驱动进行修改,因为IMX307和IMX291在像素尺寸、接口类型(都是MIPI)和基础架构上非常相似。
提示:在开始修改前,强烈建议备份原始的IMX291驱动文件夹。你可以直接复制一份,重命名为
sony_imx307,这样即使改错了也能快速回滚。
还需要准备好IMX307的官方数据手册。虽然海思的驱动框架已经封装了大部分底层操作,但一些关键的寄存器配置,如曝光时间、增益控制、数据输出格式等,仍然需要参照Sensor的Datasheet来设置。特别是初始化序列(Init Sequence),这是驱动Sensor正常工作的核心。
最后,检查硬件连接。确认开发板上IMX307的供电(AVDD、DVDD、DOVDD)、时钟(MCLK)、复位(RESET)以及I2C和MIPI数据线都已正确连接。有时候图像出不来,不是软件问题,而是硬件没焊好或者时钟没给对。
2. 驱动层核心修改:从IMX291到IMX307
驱动层的修改是整个移植工作的核心,主要集中在imx291_sensor_ctl.c(我们复制后重命名为imx307_sensor_ctl.c)和imx291_cmos.c(重命名为imx307_cmos.c)这两个文件。
第一步是修改I2C地址和位宽。 打开imx307_sensor_ctl.c,找到以下定义:
const unsigned char imx291_i2c_addr = 0x34; /* I2C Address of imx291 */
const unsigned int imx291_addr_byte = 2;
const unsigned int imx291_data_byte = 1;
根据IMX307的数据手册,其I2C地址通常是0x1a(7位地址)。但这里需要注意,海思的驱动代码中,这个地址有时是作为8位地址(包含读写位)来使用的,也可能直接就是7位地址。最稳妥的方法是参考SDK中其他已适配的Sensor(如IMX334)的写法,或者查看硬件原理图上I2C地址线的连接。假设我们确认是0x1a,则修改为:
const unsigned char imx307_i2c_addr = 0x1a; /* I2C Address of imx307 */
const unsigned int imx307_addr_byte = 2;

5876

被折叠的 条评论
为什么被折叠?



