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

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

点个在看,为大佬点赞!

<think>好的,我现在需要帮助用户查找关于MTK Sensor的DTS配置方法。用户之前提到过引用[1]中的内容,里面提到了驱动添加路径和传感器类型对应的目录,比如加速度陀螺仪在accgyro,光距感在alsps等。现在用户明确询问DTS配置的教程或示例,我需要根据之前的信息进一步展开。 首先,我应该确认MTK SensorHub的DTS配置通常涉及哪些部分。DTS(Device Tree Source)用于描述硬件配置,所以在内核中需要正确配置传感器节点。根据引用[1],不同的传感器类型对应不同的驱动目录,这可能意味着DTS中的兼容性字符串(compatible)需要与驱动匹配。 接下来,我需要回忆或查找MTK平台常见的DTS配置结构。通常,传感器作为I2C或SPI设备挂在总线上,因此DTS中需要在对应的I2C节点下添加子节点。例如,加速度计可能使用i2c地址,并在DTS中指定compatible属性为"mediatek,accgyro"或其他具体型号。 然后,用户可能需要示例代码。例如,对于光距传感器,DTS配置可能包括reg地址、中断引脚、兼容性字符串等。需要确保这些参数与硬件设计一致,比如正确的I2C地址、中断号以及vdd供电配置。 另外,驱动和DTS的匹配是关键。每个传感器驱动会有一个对应的兼容性字符串,DTS中的compatible必须与之匹配,否则无法正确探测设备。例如,如果驱动中定义的是"mediatek,lsm6dsm",那么DTS里也要用这个字符串。 还要考虑时钟和电源管理配置,部分传感器可能需要额外的时钟或稳压器配置。例如,vdd-supply属性引用一个稳压器节点,确保传感器供电正常。 最后,用户可能需要验证配置的方法,比如检查内核日志是否成功探测到设备,或者使用工具读取传感器数据。这部分也可以作为补充建议提供给用户,帮助他们调试DTS配置是否正确。 总结下来,回答应包括DTS配置的基本结构、不同传感器的示例、关键参数说明、兼容性字符串的重要性,以及验证步骤。同时,要提醒用户根据具体硬件调整参数,参考MTK官方文档或驱动源码中的示例。</think>关于MTK Sensor的DTS配置方法,以下是基于MTK SensorHub架构的详细实现步骤和示例: ### 一、DTS配置基础结构 MTK传感器驱动通过`i2c`或`spi`总线注册设备节点,需在对应SOC的DTS文件中添加配置。以`mt6765`平台为例: ```dts &i2c1 { status = "okay"; clock-frequency = <400000>; // 示例:加速度传感器配置 bmi160_acc: bmi160_acc@68 { compatible = "mediatek,bmi160_acc"; reg = <0x68>; status = "okay"; i2c_num = <1>; direction = <6>; // 传感器安装方向 power_id = <0xffff>; power_vol = <0>; firlen = <0>; // 滤波器长度 is_batch_support = <0>; }; // 示例:光感传感器配置 ltr578_als: ltr578_als@53 { compatible = "mediatek,ltr578"; reg = <0x53>; als_level = <0 328 861 1377 3125 7721 7767 12621 23062 28430 33274 47116 57694 57694 65535>; als_value = <0 133 304 502 1004 2005 3058 5005 8008 10010 12000 16000 20000 20000 20000 20000>; polling-mode = <1>; // 中断模式 power-supply = <&mt_pmic_vio28_ldo_reg>; }; }; ``` ### 二、关键参数说明 1. **总线选择**: - 加速度/陀螺仪通常挂载`i2c1`或`i2c2` - 光距感多用`i2c3`总线 - 总线时钟频率建议设为`400kHz`(即`clock-frequency = <400000>`) 2. **寄存器地址**: - `reg`属性必须与硬件设计匹配,如`0x68`对应BMI160的I2C地址 - 需确认传感器是否支持地址切换(通过SA0引脚) 3. **方向校准**: ```dts direction = <6>; // 坐标系映射关系 ``` 取值0-7对应不同安装方向,需参考`mediatek,kernel/drivers/misc/mediatek/sensors-1.0/accelerometer/accel.h`中的方向矩阵定义 4. **电源管理**: ```dts power-supply = <&mt_pmic_vio28_ldo_reg>; // 引用PMIC节点 vdd-supply = <&mt_pmic_vcamio_ldo_reg>; // 独立供电配置 ``` ### 三、传感器类型匹配表 | 传感器类型 | compatible格式 | 驱动路径示例 | |-----------------|-----------------------------|---------------------------------------| | 加速度计 | `mediatek,[sensor_name]` | `drivers/misc/mediatek/accelerometer`| | 陀螺仪 | `mediatek,[sensor_name]_gyro`| `drivers/misc/mediatek/gyroscope` | | 光距感 | `mediatek,[sensor_name]_als`| `drivers/misc/mediatek/alsps` | | 地磁传感器 | `mediatek,[sensor_name]_mag`| `drivers/misc/mediatek/magnetometer` | ### 四、配置验证方法 1. **内核日志检查**: ```bash dmesg | grep -i "sensor" # 预期输出:sensor probe success ``` 2. **sysfs接口验证**: ```bash cat /sys/bus/iio/devices/iio\:device0/name # 应返回传感器型号 ``` 3. **HAL层调试**: 检查`/vendor/etc/sensors/hals.conf`中是否启用对应传感器: ```conf sensor_list: bmi160_accel bmi160_gyro ltr578_als ``` ### 五、常见问题处理 1. **设备未识别**: - 检查I2C地址是否正确(用`i2cdetect`工具扫描) - 确认DTS中`compatible`与驱动代码中的定义完全匹配 2. **数据异常**: - 校准方向参数`direction` - 检查供电电压是否稳定(测量VDD引脚) 建议参考MTK官方文档《MTK Sensor Driver Porting Guide》第4.2节DTS Configuration章节[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员Android

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

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

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

打赏作者

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

抵扣说明:

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

余额充值