转自地平线论坛经验
1. I²C通讯失败的问题以及排查方法。
外界的图像数据一般是通过sensor感知,然后通过mipi接口进入到地平线X3M这款AI芯片的视频处理模块,模块对视频图像做比如放大、缩小、旋转等处理。
问题:I²C通讯失败,错误log如下:
run_time = 100000
cam_index = 0
pipe_num = 1
loop = 4
need_m_thread = 0
need_free = 0
need_get = 0
need_display = 0
unable open camera with addr 0xaa ioctl I2C_SLAVE_FORCE error
[ERROR]["LOG"][imx415_utility.c:101] 101 : init imx415 -- 2:0xaa 0: 0x3000 = 0x1 fail
[ERROR]["LOG"][imx415_utility.c:421] 421 : init imx415 fail
[ERROR]["LOG"][utility/hb_cam_utility.c:909] sensor_init fail
出现 I²C 通讯失败错误,一般需要从如下三种情况来排查:
1、检查sensor是否需要gpio拉低拉高
针对有些sensor配置有gpio的拉低拉高的管脚需要复位后才能写sensor的I²C寄存器,点亮sensor时候需要跟硬件工程师或者自行查看硬件原理图check清楚,X3系统支持GPIO子系统,因此可以通过操作sys节点的方式来做,以gpio111为例,命令如下:
echo 111 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio111/direction
echo 0 > /sys/class/gpio/gpio111/value
sleep 0.2
echo 1 > /sys/class/gpio/gpio111/value
2、hb_x3player.json文件对于sensor I²C bus配置错误,检查bus_num字段,以imx415 sensor为例,参考如下:
"config_0":{
"interface_type":"mipi",
"port_number":1,
"port_0":{
"bus_type":0,
"bus_num":2,
"entry_num":1,
"sensor_addr":"0x1a",
"sensor_name":"imx415",
"reg_width":16,
"sensor_mode":1,
"fps":30,
"resolution":2160,
"gpio_pin":[ 118 ],
"gpio_level":[ 0 ],
"deserial_index":0,
"deserial_port":0,
"config_path":"hb_mipi_imx415_raw10_%dfps_%dP.json"
}
},
3、sensor没有正确接入,需要检测I²C是否能够探测到,包括是否给sensor的mclk和mipiclk给时钟,对于sensor使用X3提供mclk时,需要先开启mclk,使用I²C命令才能正常探测到sensor, X3系统可以通过如下命令给mipi host0 mclk 24Mhz时钟,注意检查使用的mipi rx是0,1,还是2,对应需要修改命令为mipi_host0,mipi_host1,mipi_host2示波器实际量下在X3端的mclk和mipiclk波形是否跟配置的一致:
echo 1 > /sys/class/vps/mipi_host0/param/snrclk_en
echo 24000000 > /sys/class/vps/mipi_host0/param/snrclk_freq
2. mipi初始化时序问题以及排查方法
地平线X3M与sensor通过mipi接口连接,时钟由X3M提供,一般情况下是24Mhz,硬件上需要确保时钟线和数据线的连接正常,这是后面sensor能点亮的前提。
[INFO][][mipi/mipi_group.c:269] mipiclk 442
[INFO][][mipi/mipi_group.c:270] settle 65
[INFO][][mipi/mipi_group.c:271] entry_info->host_enable 1
[INFO][][mipi/hb_mipi_host.c:384] entry_info->host_path /dev/mipi_host0
[INFO][][mipi/hb_mipi_host.c:385] entry_info->dev_path /dev/mipi_dev-1
[INFO][camera][src/hb_vin_mipi_host.c:256] mipi host0 init begin
[ERROR][camera][src/hb_vin_mipi_host.c:273] !!! host1 MIPIHOSTIOC_START error, ret = -1
[ERROR][camera][src/hb_vin.c:112] mipi_host 0 init error!
[ERROR][][mipi/hb_mipi_api.c:388] hb_vin_init fail
[ERROR][][vio_vin.cpp:(hb_vin_init:506)] HB_MIPI_SetMipiAttr error!
hb_vin_init failed, -37
对于上图的报错,需要做如下几步的配置自查:
1、因为X3对mipi stop状态检查默认在mipi init阶段进行的,但并非所有sensor上电后都默认处于stop状态,对于此类sensor(例如sony系列),需要在sensor init中将sensor配置为stop状态,并将mipi stop check配置到mipi start阶段。配置命令如下,注意使用的是mipi rx是0,1,还是2,对应需要修改命令为mipi_host0,mipi_host1,mipi_host2:
echo 1 > /sys/class/vps/mipi_host1/param/stop_check_instart
2、检查settle值(范围是0-127),以imx415 sensor为例,settle值是10,如代码块1
3、检查sensor的lane数是否配置的跟mipi里面的lane一致,sensor的lane数需要从厂家的初始化配置里面获取,如果没有需要咨询sensor厂家获得,以imx415 sensor为例,如下图是sensor厂家给出的初始化的lane数,lane数如代码块2
4、sensor的输出宽高是否跟mipi配置的宽高一致。
5、sensor init后状态必须是stop,不能有流输出,等sensor start后才可以输出流(kernel的报错日志 会有wait phy stop state error!!!错误)
6、确定sensor的时钟是否正常,mipi参数里面的mclk跟sensor时钟是否填的一致。
7、sensor的framelenth和linelength是否配置正常。
3. mipi启动报错的错误log以及排查方法。
出现该错误时,说明mipi LP to HS切换失败,一般有如下两种情况:
1、hb_x3player.json文件中对于mipi host的通道配置错误,需要检查entry_num字段,以imx415 sensor为例,entry_num字段如代码块1所示:
2、检查下硬件的mipi接线有没有搞错,硬件接口对应如下图
3、sensor开流失败,没有进入HS模式,串口会出现mipi的hs reception check error 0x10000 hs reception state error!!!错误,可能的原因是sensor写寄存器初始化序列没有写对,导致sensor没有正常出流,可以使用i2ctransfer命令把写到sensor的寄存器读出来跟写入对比是否一致,i2ctransfer读命令如下截图,如果sensor寄存器初始化读出和写入一致,需要检查下硬件接线和模组是否有异常,可以使用示波器量下X3端对应得mipiclk,mclk和数据的波形是否正常:
4. 串口无任何报错,应用程序报错(ipu get buf failed type(0) !!! )
嵌入式开发过程中会碰到各种问题,软件方面的问题一般是通过查看log打印信息来分析。本文介绍地平线SOC X3M开发板在点亮sensor过程中碰到的问题。
错误log如下:
此种情况一般是由于VIO配置文件中对于mipi host通道号配置有误,确认mipi_rx_index字段,以imx415 sensor为例,配置如代码块1和代码块3:
- 代码块1
"config_0":{
"interface_type":"mipi",
"port_number":1,
"port_0":{
"bus_type":0,
"bus_num":2,
"entry_num":1,
"sensor_addr":"0x1a",
"sensor_name":"imx415",
"reg_width":16,
"sensor_mode":1,
"fps":30,
"resolution":2160,
"gpio_pin":[ 118 ],
"gpio_level":[ 0 ],
"deserial_index":0,
"deserial_port":0,
"config_path":"hb_mipi_imx415_raw10_%dfps_%dP.json"
}
},
- 代码块3
"mipi": {
"enable": 1,
"ipi_channels": 1,
"mipi_rx_index": 1,
"width": 3840,
"height": 2160,
"format": 0,
"pix_length": 1,/*需要跟代码块1的entry_num保持一致*/
"enable_mux_out": 1,
"enable_pattern": 0,
"enable_frame_id": 1,
"enable_bypass": 0,
"enable_line_shift": 0,
"enable_id_decoder": 0,
"set_init_frame_id": 0,
"set_line_shift_count": 0,
"set_bypass_channels": 1,
"set_mux_out_index": 0
},
4.1 Hobotplayer注意事项
如上图所示,如果ipu_ds_config
下面的ds0_roi_en
设置1,hobotplayer
需要使用的channel_id
是0,如果是ds1_roi_en
设置1,那hobotplayer需要使用的channel_id
是1,如果ds2_roi_en
设置的是1,那么hobotplayer需要使用的channel_id
是2,如下图
5. 图像锯齿感(isp->online->ipu)
现象:
地平线X3M SoC系统平台能正常点亮sensor,调试工作就已经成功了一半,剩下的工作就是对图像细节做优化。下面介绍出图后图像部分地方出现锯齿状现象及解决方法。
sensor出图后,一般是通过hobotplayer这款软件来显示图像,yuv图像有锯齿的现象,如下图所示:
原因分析:
IPU输入需要16字节对齐,因为是 isp->online->ipu,如果是sensor输入的宽度不是16字节对齐,到ipu后因为字节不对齐所以出现锯齿
解决方法:
-
建议sensor端宽度输入改成16字节对齐,比如1080改成1088
-
可以把isp->online->ipu改成isp->offline->ipu,以1080对齐到1088为例,cfg_size改成如下
"cfg_size": {
"source_width": 1088,
"source_height": 1280,
"source_stride_y": 1088,
"source_stride_uv": 1088,
如果改成offline,对pipeline通路的带宽和延时性能方面都有影响