MTK Sensor porting 流程

和你一起终身学习,这里是程序员Android

经典好文推荐,通过阅读本文,您将收获以下知识点:

一、Camera Sensor Porting 要修改的文件
二、Porting 验证

一、 Camera Sensor Porting 要修改的文件

1.1 ProjectConfig.mk 修改

  • device/mediatek/{project}/ProjectConfig.mk

修改点: 在 CUSTOM_HAL_IMGSENSOR CUSTOM_KERNEL_IMGSENSOR 中添加Sensor name
比如:

CUSTOM_HAL_IMGSENSOR = XXX_mipi_raw
CUSTOM_HAL_MAIN_IMGSENSOR =XXX_mipi_raw 
CUSTOM_HAL_SUB_IMGSENSOR = XXX_mipi_raw

CUSTOM_KERNEL_IMGSENSOR = XXX_mipi_raw
CUSTOM_KERNEL_MAIN_IMGSENSOR =  XXX_mipi_raw
CUSTOM_KERNEL_SUB_IMGSENSOR =  XXX_mipi_raw

1.2 mgk_64_k61_defconfig 修改

  • kernel/kernel_device_modules-6.1/arch/arm64/configs/mgk_64_k61_defconfig

修改点:CONFIG_CUSTOM_KERNEL_IMGSENSOR 中添加Sensor name
比如:

CUSTOM_KERNEL_IMGSENSOR = XXX_mipi_raw

1.3 kd_imgsensor.h sensor id sensor name配置修改

1.3.1 Kernel space

  • kernel/kernel_device_modules-6.1/drivers/misc/mediatek/imgsensor/inc/kd_imgsensor.h

修改点: kernel 侧添加 Sensor id 和Sensor name
比如:

#define XXX_MIPI_RAW_SENSOR_ID 0x6666
#define SENSOR_DRVNAME_XXX_MIPI_RAW  "XXX_mipi_raw"

1.3.2 User space

  • device/mediatek/common/kernel-headers/kd_imgsensor.h

修改点: User 侧添加 Sensor id 和Sensor name,需要跟Kernel 侧保持一致。
比如:

#define XXX_MIPI_RAW_SENSOR_ID 0x6666
#define SENSOR_DRVNAME_XXX_MIPI_RAW  "XXX_mipi_raw"

1.4 custom_platform_camera.dtsi 设备树修改

  • kernel/kernel_device_modules-6.1/arch/arm64/boot/dts/mediatek/custom_platform_camera.dtsi

修改点:添加sensor 设备树的sensor name, clk,rst,avdd,dvdd等

  • cam%_enable_sensor客制化

如果需要指定某个sensor index 对应的search list,可以在cam%_enable_sensor中客制化,比如主摄只在cam0_enable_sensor 中搜索,减少搜索匹配时间。

cam0_enable_sensor ="xxx_mipi_raw"
cam1_enable_sensor ="xxx_mipi_raw"
cam2_enable_sensor ="xxx_mipi_raw"

  • PMIC 供电节点修改
PMIC 供电节点修改
  • GPIO 供电节点修改
GPIO 供电节点修改

1.5 sensor init 修改

1.5.1 imgsensor_sensor_list.h 声明

  • kernel/kernel_device_modules-6.1/drivers/misc/mediatek/imgsensor/src/common/v1/imgsensor_sensor_list.h
    修改点:添加sensor的 init 函数声明

比如:

UINT32 XXX_MIPI_RAW_SensorInit(struct SENSOR_FUNCTION_STRUCT **pfFunc)

1.5.2 imgsensor_sensor_list.c 函数调用

  • kernel/kernel_device_modules-6.1/drivers/misc/mediatek/imgsensor/src /imgsensor_sensor_list.c
    修改点:添加sensor的 init 函数实现
    第一个参数对应 Camera Snesor ID
    第二个参数对应 Camera Sensor name
    第三个参数对应 Camera Sensor init Function,这里会调用到 sensor.cpp 驱动文件中的init 函数
struct IMGSENSOR_INIT_FUNC_LIST kdSensorList[MAX_NUM_OF_SUPPORT_SENSOR] ={
#if define(XXX_MIPI_RAW)
{
  XXX_MIPI_RAW_SENSOR_ID,  //第一个参数对应 Camera Snesor ID
  SENSOR_DRVNAME_XXX_MIPI_RAW,//第二个参数对应 Camera Sensor name
  XXX_MIPI_RAW_SensorInit//第三个参数对应 Camera Sensor init Function 这里会调用到 sensor.cpp 驱动文件中的init 函数
},
#endif
}

1.5.3 添加Sensor到sensor List 中

-vendor/mediatek/proprietary/custom/{Platform}/hal/imgsensor_src/sensorlist.cpp

修改点: 将sensor 添加到sensor init 函数的 SensorList数组中

注意点:SensorList 中sensor 的顺序必须跟 Kernel中的 kdSensorList的顺序一致。否则 user space 和Kernel space 在通过ioctl 传递命令时候会出错。
比如:

MSDK_SENSOR_INIT_FUNCITON_STUTCT SensorList[]={
#if defined(XXX_MIPI_RAW)
    RAW_INIFO(XXX_MIPI_RAW_SENSOR_ID,SENSOR_DRVNAME_XXX_MIPI_RAW,NULL);
#end if
}

1.5.4 sensor.cpp XXX_MIPI_RAW_SensorInit 实现

  • kernel/kernel_device_modules-6.1/drivers/misc/mediatek/imgsensor/src/XXX_mipi_raw/sensor.cpp

修改点: Sensor 驱动 .cpp .h源文件

// 在Sensor.c 文件中可以接收Kernel 侧的sensor init 函数
UINT32 XXX_MIPI_RAW_SensorInit(struct SENSOR_FUNCTION_STRUCT **pfFunc)
{
    /* Check Sensor status here */
    if (pfFunc != NULL)
        *pfFunc = &sensor_func;
    return ERROR_NONE;
}

1.6 sensor 上下电等配置

GPIO:(英语:General-purpose input/output),通用型之输入输出的简称,功能类似8051的P0—P3,其接脚可以供使用者由程控自由使用,PIN脚依现实考量可作为通用输入(GPI)或通用输出(GPO)或通用输入与输出(GPIO),如当clk generator, chip select等。既然一个引脚可以用于输入、输出或其他特殊功能,那么一定有寄存器用来选择这些功能。对于输入,一定可以通过读取某个寄存器来确定引脚电位的高低;对于输出,一定可以通过写入某个寄存器来让这个引脚输出高电位或者低电位;对于其他特殊功能,则有另外的寄存器来控制它们。

PMIC(Power Management IC)又称电源管理IC,是一种特定用途的集成电路 ,其功能是为主系统作管理电源等工作。

  • kernel/kernel_device_modules-6.1/drivers/misc/mediatek/imgsensor/src/camera_hw/imgsensor_cfg_table.c
    配置sensor 上下电
// 确认上电引脚是GPIO 供电还是PMIC 供电
// 0. imgsensor_platform_driver(imgsensor.c ) --->
// 1. imgsensor_probe --> 
// 2. imgsensor_hw_init ---> 
// 3.imgsensor_custom_config
struct IMGSENSOR_HW_CFG imgsensor_custom_config[] = {

    {
        IMGSENSOR_SENSOR_IDX_MAIN, 
        IMGSENSOR_I2C_DEV_0, // I2C_DEV 保持默认不用修改
        {
            {IMGSENSOR_HW_PIN_MCLK,  IMGSENSOR_HW_ID_MCLK},
            {IMGSENSOR_HW_PIN_AVDD,  IMGSENSOR_HW_ID_GPIO},//GPIO上电逻辑
            {IMGSENSOR_HW_PIN_DOVDD, IMGSENSOR_HW_ID_REGULATOR},
            {IMGSENSOR_HW_PIN_DVDD,  IMGSENSOR_HW_ID_GPIO},
            {IMGSENSOR_HW_PIN_PDN,   IMGSENSOR_HW_ID_GPIO},
            {IMGSENSOR_HW_PIN_RST,   IMGSENSOR_HW_ID_GPIO},
            {IMGSENSOR_HW_PIN_NONE,  IMGSENSOR_HW_ID_NONE},
        },
    },
    {
        IMGSENSOR_SENSOR_IDX_SUB,
        IMGSENSOR_I2C_DEV_1, // I2C_DEV 保持默认不用修改
        {
            {IMGSENSOR_HW_PIN_MCLK,  IMGSENSOR_HW_ID_MCLK},
            {IMGSENSOR_HW_PIN_AVDD,  IMGSENSOR_HW_ID_GPIO},
            {IMGSENSOR_HW_PIN_DOVDD, IMGSENSOR_HW_ID_REGULATOR},
            {IMGSENSOR_HW_PIN_DVDD,  IMGSENSOR_HW_ID_GPIO},
            {IMGSENSOR_HW_PIN_PDN,   IMGSENSOR_HW_ID_GPIO},
            {IMGSENSOR_HW_PIN_RST,   IMGSENSOR_HW_ID_GPIO},
            {IMGSENSOR_HW_PIN_NONE, IMGSENSOR_HW_ID_NONE},
        },
    },
}
struct IMGSENSOR_HW_POWER_SEQ platform_power_sequence[] = {
#ifdef MIPI_SWITCH
    {
        IMGSENSOR_TOSTRING(IMGSENSOR_SENSOR_IDX_SUB),
        {
            {
                IMGSENSOR_HW_PIN_MIPI_SWITCH_EN, // EN 管脚
                IMGSENSOR_HW_PIN_STATE_LEVEL_0, //上电拉低
                0,  //上电延时
                IMGSENSOR_HW_PIN_STATE_LEVEL_HIGH, //上电拉高
                0  //上电延时
            },
            {
                IMGSENSOR_HW_PIN_MIPI_SWITCH_SEL, //SEL 管脚
                IMGSENSOR_HW_PIN_STATE_LEVEL_HIGH, //上电拉高
                0,  //上电延时
                IMGSENSOR_HW_PIN_STATE_LEVEL_0, //上电拉低
                0  //上电延时
            },
        }
    },
#endif
 

//配置sensor的上下电 sensor_power_sequence
// 1.imgsensor_sensor_open/close() --->
// 2.sensor_power_sequence -->
// 3.imgsensor_hw_power_sequence -->
// 4.sensor_power_sequence
struct IMGSENSOR_HW_POWER_SEQ sensor_power_sequence[] = {
    //...
    /*
    第一个参数对应 PowerType
    第二个参数对应 Voltage
    第三个参数对应 Delay Time in ms
    DVDD/DOVDD/AVDD/AFVDD 的电压支持情况可以参考 specific pmic datasheet 进行设置
    */
    #if defined(XXX_MIPI_RAW)
    {
        SENSOR_DRVNAME_GC8034_MIPI_RAW,
        {
            {PDN, Vol_Low, 0},
            {RST, Vol_Low, 1},
            {DOVDD, Vol_1800, 1},
            {DVDD, Vol_1200, 1},
            {AVDD, Vol_2800, 1},
            {SensorMCLK, Vol_High, 2},
            {PDN, Vol_High, 0},
            {RST, Vol_High, 2}
        },
    },
#endif
//**************************************
/* add new sensor before this line*/
{NULL,},
};

1.7 Tunning && metadata 修改

  • vendor/mediatek/proprietary/scripts/soong/mtkcam/mtkcamvars.go
    修改点:Tunning 相关so配置修改

  • camera metadata :vendor/mediatek/proprietary/custom/{Platform}/hal/imgsensor_metadata/XXX_mipi_raw/
    修改点:客制化的metadata

  • camera metadata:vendor/mediatek/proprietary/custom/common/hal/imgsensor_metadata/XXX_mipi_raw/
    修改点:客制化的metadata

  • camera tunning file:/mediatek/proprietary/custom/{Platform}/hal/imgsensor/ver1/XXX_mipi_raw/
    修改点:客制化的tunning file

二、Porting 验证

1. Sentest

adb root && adb shell sentest

使用 adb shell sentest 验证是否porting 成功
比如:

C:\Users\>adb shell sentest
[main]sizeof long : 8
[show_Sensors]sensorNum 3
[show_Sensors]name:SENSOR_XXX_RAW type:0
[show_Sensors]index:0, SensorDevIdx:1
[show_Sensors]name:SENSOR_XXX_RAW type:0
[show_Sensors]index:1, SensorDevIdx:2
[show_Sensors]name:SENSOR_XXX_RAW type:0
[show_Sensors]index:2, SensorDevIdx:4
[main]Param: 1 <sensorDev> <scenario> <fps>
[main]<sensorDev> : main(1), Sub(2), Main2(4), sub2(8), main3(16)
[main]<scenario>  : Pre(0), Cap(1), VD(2), slim1(3), slim2(4)

C:\Users\>

adb root && adb shell sentest [sensorDev] [ 测试场景]

sensorDev

sensorDev: 1: 主摄 2: 前摄 4:后辐摄
测试场景: 0: 预览 1: 拍照 2:视频

比如:

C:\Users\>adb shell sentest 1 0
[main]sizeof long : 8
[main]argc num:3
[test_SensorInterface]name:SENSOR_XXX_RAW type:0
[test_SensorInterface]index:0, SensorDevIdx:1
[test_SensorInterface]Sensor index:0, scenarioId:0
[test_SensorInterface]crop w:2048, h:1536
[test_SensorInterface]pHalSensor->powerOn start
[test_SensorInterface]main/atv-Continous=1

[test_SensorInterface]main/atv-BypassSensorScenario=0

[test_SensorInterface]TgInfo[0] = 1
[test_SensorInterface]pixelMode[0] = 1
[test_SensorInterface]mipi rate = 600000000
[test_SensorInterface]---------------------------------------------------
[test_SensorInterface]seninf_mux1 horizontal valid count 0x0, horzontal blanking count 0x0
[test_SensorInterface]blanking valid count 0x0, blanking blanking count 0x0, fps =30

[test_SensorInterface]---------------------------------------------------
[test_SensorInterface]seninf_mux1 horizontal valid count 0x42b, horzontal blanking count 0xd6
[test_SensorInterface]blanking valid count 0x1e8745, blanking blanking count 0x801c17, fps =30

[test_SensorInterface]mipi_pixel_rate = 598.651782Mpps
[test_SensorInterface]vertical_blanking = 26.918651ms
[test_SensorInterface]horizontal_blanking = 0.000686ms
[test_SensorInterface]line time = 0.004107ms
[test_SensorInterface]---------------------------------------------------
[test_SensorInterface]seninf_mux1 horizontal valid count 0x42a, horzontal blanking count 0xd6
[test_SensorInterface]blanking valid count 0x1e874b, blanking blanking count 0x801c11, fps =30

至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

点个在看,为大佬点赞!

### IMX135 MTK Android 移植指南 IMX135 是 Sony 推出的一款高性能图像传感器,常用于摄像头模组的开发。在 MTK(联发科)平台上进行 IMX135 的 Android 移植工作,涉及多个模块的适配与配置,包括驱动程序、设备树、电源管理、图像格式支持等。 #### 1. 驱动程序移植 在 MTK 平台上,IMX135 的驱动程序通常位于 Linux 内核的摄像头子系统中。移植时需参考现有模组的实现,例如 dummy_eeprom、imx258_eeprom 或 imx135_otp 等模块路径: - `kernel-3.18\drivers\misc\mediatek\cam_cal\src\legacy\$PLATFORM\` - `kernel-3.18\drivers\misc\mediatek\cam_cal\src\legacy\mt6755\imx135_otp\**`[^2] 需实现 OTP(One-Time Programmable)校准数据的读取与应用,确保图像色彩与白平衡准确。此外,还需在 `kd_imgsensorlist.c` 中注册 IMX135 的 sensor ID 与驱动函数指针。 #### 2. 设备树配置 在 MTK 平台上,IMX135 的 I²C 地址、GPIO 控制、电源域等信息需在设备树中定义。例如: ```dts camera-sensor@1a { compatible = "mediatek,imgsensor"; reg = <0x1a>; device_type = "camera"; pinctrl-names = "default"; pinctrl-0 = <&cam_pdn_pin_default &cam_rst_pin_default>; clocks = <&camsys CLK_CAMTG>; clock-names = "camsys"; power-domains = <&camsys_pd>; status = "okay"; }; ``` 该配置需根据实际硬件连接进行调整,确保主控芯片能正确识别并初始化 IMX135。 #### 3. 电源管理配置 IMX135 通常需要多个电源域供电,包括 AVDD、DVDD、DOVDD 等。这些电源需在设备树中定义,并在驱动中进行控制。例如: ```dts regulator@1 { compatible = "mediatek,camera-regulator"; reg = <1>; regulator-name = "avdd"; regulator-min-microvolt = <2800000>; regulator-max-microvolt = <2800000>; }; ``` 此外,还需在 `mt65xx_bat.c` 中参考 `mt65xx_bat_init()` 函数了解 Power Off Charging 的控制流程,确保摄像头模组在低电量时能正确供电与关闭[^1]。 #### 4. 图像格式与分辨率支持 IMX135 支持多种图像输出格式,如 RAW10、RAW12 等。需在驱动中配置 `enum_mbus_code` 与 `try_mbus_fmt` 函数,确保图像格式与分辨率匹配。例如: ```c static int imx135_enum_mbus_code(struct v4l2_subdev *sd, struct v4l2_subdev_state *state, struct v4l2_subdev_mbus_code_enum *code) { if (code->index >= ARRAY_SIZE(imx135_formats)) return -EINVAL; code->code = imx135_formats[code->index].code; return 0; } ``` 同时需在 `kd_camera_hw.h` 中定义图像分辨率与帧率支持。 #### 5. 调试与验证 完成移植后,可通过 `logcat` 查看摄像头服务的启动日志,确认 IMX135 是否被正确识别。使用 `Camera Hal3Test` 或 `Camera2 API` 应用测试图像采集与预览功能,验证 OTP 校准是否生效。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Android

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值