MTK camera drv]如何实现同Sensor IC不同摸组的Driver和参数的兼容

OV5647模组区分配置
本文介绍如何通过软件配置区分不同模组厂生产的OV5647摄像头模组,包括定义Sensor_ID、注册sensor、修改驱动及验证模组参数等步骤。

 

 

如下以 OV5647 为例

假设 OV5647AB OV5647BC 是两个不同模组厂的模组。

 

1:在kd_imgsensor.h 內定义不同的Sensor_ID

#define OV5647AB_SENSOR_ID                        0x5647

#define OV5647BC_SENSOR_ID                        0x5648

 

2ProjectConfig.mk  中加入 OV5647AB OV5647BC sensor 注册。

可以参考如下部分。

CUSTOM_HAL_IMGSENSOR=ov5647AC_raw ov5647BC_raw

CUSTOM_HAL_MAIN_IMGSENSOR=ov5647AC_raw

CUSTOM_HAL_MAIN_BACKUP_IMGSENSOR=ov5647BC_raw

 

CUSTOM_KERNEL_IMGSENSOR=ov5647AC_raw ov5647BC_raw ov7690_yuv

CUSTOM_KERNEL_MAIN_BACKUP_IMGSENSOR=ov5647BC_raw

CUSTOM_KERNEL_MAIN_IMGSENSOR=ov5647AC_raw

 

3Driver 部分的修改

mediatek\custom\common\kernel\imgsensor 这个目录下之前的 OV5647 分别命名为OV5647AB OV5647BCDriver 里面的函数也做同步修改。

 

4:在 mediatek\custom\common\kernel\imgsensor 目录下的 ov5647AC_Sensor .c ov5647BC_Sensor.c 中的 OV5647GetSensorID_BC 这个函数中做如下修改。

 

*sensorID=((OV5647BC_read_cmos_sensor(0x300A) << 8) | OV5647BC_read_cmos_sensor(0x300B));

sensorID +=1;

在这个函数中再加入判读模组信息的判断。

加入 AC 模组的 MID 也就是模组厂的标志位 的读取可以参考如下说明。具体的地址寄存器可以参考对应的sensor DataSheet  。模组厂的MID可以请模组厂帮忙提供。

static UINT32 OV5647AC_OTP_combination_read(void)

{

       kal_int8 mid = 0x00;

      

    OV5647AC_write_cmos_sensor (0x3D21, 0x01);

    Sleep(50); // 50ms

  

    mid = OV5647AC_read_cmos_sensor (0x3D05); 

    mid &= 0x7F;

       printk("*********************************************MID = %d\n",mid);

    OV5647AC_write_cmos_sensor (0x3D21, 0x00);

    if (2 == mid)

    {

        return TRUE;

    }

    else

    {

        return FALSE;

    }

}

 

然后在OV5647GetSensorID_AC 这个函数中加入如下部分。关键是如果sensor MID 不对的话此时需要将 sensorID 设置为0xFFFFFFFF

if (!OV5647AC_OTP_combination_read())

{

      *sensorID = 0xFFFFFFFF;

      SENSORDB("OV5647ACOpen, MID != 0 \n");

 

      return ERROR_SENSOR_CONNECT_FAIL;

}

 

OV5647GetSensorID_BC 也做类似的修改。

 

5:最后一步判断是否真正的区分了对应模组的参数。

mediatek\custom\common\hal\imgsensor\ov5647AC_raw 或者

mediatek\custom\common\hal\imgsensor\ov5647BC_raw 文件中的

camera_isp_regs_ov5647AC_mt65XX.c 中的 CCM 部分修改成

CCM:{

    {set:{//00

        0x01000000, 0x00000000, 0x01000000, 0x00000000, 0x01000000,

    }},

    {set:{//01

        0x01000000, 0x00000000, 0x01000000, 0x00000000, 0x01000000,

    }},

    {set:{//02

        0x01000000, 0x00000000, 0x01000000, 0x00000000, 0x01000000,

    }}

},

重新build 。确认两颗模组的色彩表现是否不同。如果一个色彩比较暗淡,则修改OK

### MTK ISP7 平台 Camera Sensor 驱动入口函数分析 在 MTK 平台中,Camera Sensor 的驱动加载与初始化涉及多个层次的代码调用。以下是对 MTK ISP7 平台 Camera Sensor 驱动入口函数的详细解析。 MTKCamera Sensor 驱动入口通常位于 `kernel/drivers/misc/mediatek/imgsensor` 目录下,具体实现可能因 SoC 不同而有所差异。根据提供的引用内容以及相关知识[^1],可以推测驱动入口函数的核心逻辑如下: #### 1. 驱动注册与初始化 驱动入口函数通常是通过 `platform_driver` 结构体进行注册的,例如: ```c static struct platform_driver gc2023mipi_platform_driver = { .probe = gc2023mipi_Sensor_probe, .remove = gc2023mipi_Sensor_remove, .driver = { .name = "gc2023mipi_sensor", .owner = THIS_MODULE, }, }; module_platform_driver(gc2023mipi_platform_driver); ``` 上述代码片段展示了如何通过 `module_platform_driver` 宏注册一个平台驱动。其中,`gc2023mipi_Sensor_probe` 是关键的探针函数,用于初始化 Sensor[^1]。 #### 2. 探针函数 `gc2023mipi_Sensor_probe` 探针函数的主要任务是完成 Sensor 的硬件初始化驱动绑定。以下是其主要功能: - 调用 `kdModulePowerOn` 函数完成 Sensor 的上电操作[^3]。 - 初始化寄存器配置,设置 Sensor 的工作模式。 - 注册中断处理程序(如果需要)。 - 将 Sensor 的信息注册到全局 `imgsensor` 数据结构中。 #### 3. HAL 层调用 在 HAL 层面,Sensor 的初始化通常通过 `imgsensor_set_driver` 函数完成。该函数会根据传入的参数选择对应的驱动,并返回驱动索引值[^2]。例如: ```c drv_idx = imgsensor_set_driver(psensor); ``` 这里的 `psensor` 是指向 Sensor 实例的指针,`drv_idx` 则表示所选驱动的索引。 #### 4. 上层调用流程 根据引用内容[^4],MTK 在 Android 8.1 及以上版本中对 Camera HAL 进行了较大改动。HAL 层通过 HIDL 接口与框架交互,但底层仍保留了 MTK 自己的一套实现逻辑。主摄的调用流程通常包括以下几个阶段: - **Sensor 探测**:通过 `gc2023mipi_Sensor_probe` 函数完成 Sensor 的探测与初始化。 - **Power On/Off**:调用 `kdModulePowerOn` 或 `kdModulePowerOff` 控制 Sensor 的电源状态。 - **参数配置**:通过 HAL 层接口传递参数,调整 Sensor 的工作模式。 #### 5. 入口函数总结 结合以上分析,MTK ISP7 平台 Camera Sensor 驱动的入口函数为: - **驱动注册函数**:`module_platform_driver(gc2023mipi_platform_driver)`[^1]。 - **探针函数**:`gc2023mipi_Sensor_probe`[^1]。 这两个函数共构成了 Sensor 驱动的初始化入口。 --- ### 示例代码 以下是一个简化的驱动注册与探针函数示例: ```c #include <linux/module.h> #include <linux/platform_device.h> static int gc2023mipi_Sensor_probe(struct platform_device *pdev) { // 初始化 Sensor printk(KERN_INFO "GC2023 Sensor probe function called.\n"); return 0; } static int gc2023mipi_Sensor_remove(struct platform_device *pdev) { // 移除 Sensor printk(KERN_INFO "GC2023 Sensor remove function called.\n"); return 0; } static struct platform_driver gc2023mipi_platform_driver = { .probe = gc2023mipi_Sensor_probe, .remove = gc2023mipi_Sensor_remove, .driver = { .name = "gc2023mipi_sensor", .owner = THIS_MODULE, }, }; module_platform_driver(gc2023mipi_platform_driver); MODULE_LICENSE("GPL"); ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值