MTK Camera sensor Bringup 流程学习

和你一起终身学习,这里是程序员 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

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容