和你一起终身学习,这里是程序员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 供电节点修改

- 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/
修改点:客制化的metadatacamera metadata:vendor/mediatek/proprietary/custom/common/hal/imgsensor_metadata/XXX_mipi_raw/
修改点:客制化的metadatacamera 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
至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!
点个在看,为大佬点赞!