J5 Camera 诊断功能 副本
摄像头诊断代码路径
hbre/camera/utility/camera_diag/
支持诊断有如下类型:
默认已集成2种框架:i2c轮询框架 和 errb中断监控框架,用户拿到开发板和底软后可以在地平线已有的诊断框架下根据项目需求添加对应的诊断项。

使用方法:
对于 I2C方式,默认支持,对于err中断方式,需要修改hb_j5dev.json文件,增加sensor_errb参数使能sensor errb诊断功能。
JSON
Json配置
{
"config_number":1,
"board_name":"j5dvb",
"config_0":{
"comment": "ovx3c rggb 1920x1280 pwl raw12 30fps on host2 max96712",
"interface_type": "mipi",
"deserial_num":1,
"monitor_period_ms":500, //客制化更改i2c轮询周期,不设置默认周期500ms
"deserial_0":{
"deserial_name":"max96712",
"deserial_addr":"0x29",
"bus_type":0,
"bus_num":3,
"ccd_poll":1, //配置解串器I2C轮询开关
"power_mode":1,
"gpio_pin":[442,377],
"gpio_level":[0,0]
},
"port_number":4,
"port_mask":15,
"port_0":{
"dev_port":0,
"bus_type":0,
"bus_num":3,
"entry_num":2,
"serial_addr":"0x41",
"sensor_addr":"0x11",
"eeprom_addr": "0x51",
"sensor_name":"ovx3c",
"reg_width":16,
"extra_mode":14,
"config_index":1540,
"sensor_mode":5,
"fps":25,
"resolution":1280,
"deserial_index":0,
"deserial_port":0,
"sensor_errb":422, //配置Sensor对应的gpio引脚,不设置默认不开启sensor errb监控
"diag_mask":"0x16", //诊断状态enable,不设置默认也是0x07只开vol,temp,fps
"data_path":"./cim_config.json",
"config_path":"./hb_mipi_ovx3c_raw12_%dfps_%dP.json"
},
"port_1":{
"dev_port":1,
"bus_type":0,
"bus_num":3,
"entry_num":2,
"serial_addr":"0x42",
"sensor_addr":"0x12",
"eeprom_addr": "0x52",
"sensor_name":"ovx3c",
"reg_width":16,
"extra_mode":14,
"config_index":1540,
"sensor_mode":5,
"fps":25,
"resolution":1280,
"deserial_index":0,
"deserial_port":1,
"sensor_errb":423,
"diag_mask":"0x16",
"data_path":"./cim_config.json",
"config_path":"./hb_mipi_ovx3c_raw12_%dfps_%dP.json"
},
"port_2":{
"dev_port":2,
"bus_type":0,
"bus_num":3,
"entry_num":2,
"serial_addr":"0x43",
"sensor_addr":"0x13",
"eeprom_addr": "0x53",
"sensor_name":"ovx3c",
"reg_width":16,
"extra_mode":14,
"config_index":1540,
"sensor_mode":5,
"fps":25,
"resolution":1280,
"deserial_index":0,
"deserial_port":2,
"sensor_errb":424,
"diag_mask":"0x16",
"data_path":"./cim_config.json",
"config_path":"./hb_mipi_ovx3c_raw12_%dfps_%dP.json"
},
"port_3":{
"dev_port":3,
"bus_type":0,
"bus_num":3,
"entry_num":2,
"serial_addr":"0x44",
"sensor_addr":"0x14",
"eeprom_addr": "0x54",
"sensor_name":"ovx3c",
"reg_width":16,
"extra_mode":14,
"config_index":1540,
"sensor_mode":5,
"fps":25,
"resolution":1280,
"deserial_index":0,
"deserial_port":3,
"sensor_errb":425,
"diag_mask":"0x16",
"data_path":"./cim_config.json",
"config_path":"./hb_mipi_ovx3c_raw12_%dfps_%dP.json"
}
}
}
JSON
diag_mask说明如下,默认为0x16
uint32_t value;
struct {
uint32_t stream_check:1;
uint32_t voltage_check:1;
uint32_t frame_count_check:1;
uint32_t temperature_check:1;
uint32_t row_column_id_check:1;
uint32_t pll_clock_check:1;
uint32_t i2c_crc_check:1;
uint32_t sccb_check:1;
uint32_t ram_crc_check:1;
uint32_t rom_crc_check:1;
uint32_t online_pixel_check:1;
uint32_t test_pattern_check:1;
uint32_t reserved:4;
};
} diag_mask_u;
J5 base code目前默认支持max96712、max96718等deserializer和ov、sony等sensor的I2C轮询诊断,。
用户可以根据项目需求在下图的数组中添加需要轮询的error寄存器,这里主要配置reg和reg默认值val。

这里主要配置fault_clear_reg,module_id,event_id,触发报错后清楚err的寄存器和err上报的错误类型是报错port。

创建轮询线程,轮询逻辑都在对应函数。

添加log后可以使用 logcat | grep "polling thread" 可以查看轮询线程是否开启

sensor轮询逻辑和deserializer类似,用户可自己研究一下代码,下面是创建sensor轮询线程,用户可以根据sensor datasheet检测需要关心的sensor error,调统一接口hb_cam_diagnose上报diag_service。

根据硬件原理图配置errb mapping。
CAM_LOCK_AV_L(1)和CAM_ERR_AV(2)直接连接到J5 GPIO(json中配置的"gpio_pin":[442,377],对应平台的gpio需要客户自己查原理图),当CAM_LOCK_AV_L(1)或CAM_ERR_AV(2)任何一根变低后都会触发J5的诊断检测函数。
每个MAX96712有4个模组,每个模组有sensor和pmic两个ERRB引脚,所以共需8个MFP,其中任何一根变低都会触发sensor诊断检测函数,(注:如果串行器使用的是max96717f,可能会存在转换寄存器不够用的情况,规避方案:和eeprom公用一个转换寄存器)

根据项目需求使能deserializer和sensor的error寄存器,对应寄存器都可以加在max96712_diag_cfg。
deserializer

配置需要检测的寄存器上报数据
同I2C轮询诊断的上报数组一致,添加在register_general_fun_t和register_bit_info_t.


创建deserializer监听线程。

创建sensor监听线程。

3.上述配置都完成后,底层打开诊断编译开关,编译替换J5板端 /system/lib/libcam.so.1.1.0 和/system/lib/sensorlib/下的sensor so后运行camera。

查看关键log

