【地平线X3M平台点亮sensor出现问题的分析】

转自地平线论坛经验

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

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以及排查方法。

3
出现该错误时,说明mipi LP to HS切换失败,一般有如下两种情况:

1、hb_x3player.json文件中对于mipi host的通道配置错误,需要检查entry_num字段,以imx415 sensor为例,entry_num字段如代码块1所示:

2、检查下硬件的mipi接线有没有搞错,硬件接口对应如下图

3.1
3.2
3、sensor开流失败,没有进入HS模式,串口会出现mipi的hs reception check error 0x10000 hs reception state error!!!错误,可能的原因是sensor写寄存器初始化序列没有写对,导致sensor没有正常出流,可以使用i2ctransfer命令把写到sensor的寄存器读出来跟写入对比是否一致,i2ctransfer读命令如下截图,如果sensor寄存器初始化读出和写入一致,需要检查下硬件接线和模组是否有异常,可以使用示波器量下X3端对应得mipiclk,mclk和数据的波形是否正常:
3.3

4. 串口无任何报错,应用程序报错(ipu get buf failed type(0) !!! )

嵌入式开发过程中会碰到各种问题,软件方面的问题一般是通过查看log打印信息来分析。本文介绍地平线SOC X3M开发板在点亮sensor过程中碰到的问题。

错误log如下:

4

此种情况一般是由于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注意事项

4.1
如上图所示,如果ipu_ds_config下面的ds0_roi_en设置1hobotplayer需要使用的channel_id0,如果是ds1_roi_en设置1,那hobotplayer需要使用的channel_id1,如果ds2_roi_en设置的是1,那么hobotplayer需要使用的channel_id2,如下图
4.2

5. 图像锯齿感(isp->online->ipu)

现象:

地平线X3M SoC系统平台能正常点亮sensor,调试工作就已经成功了一半,剩下的工作就是对图像细节做优化。下面介绍出图后图像部分地方出现锯齿状现象及解决方法。

sensor出图后,一般是通过hobotplayer这款软件来显示图像,yuv图像有锯齿的现象,如下图所示:

5
原因分析:

IPU输入需要16字节对齐,因为是 isp->online->ipu,如果是sensor输入的宽度不是16字节对齐,到ipu后因为字节不对齐所以出现锯齿

解决方法:

  1. 建议sensor端宽度输入改成16字节对齐,比如1080改成1088

  2. 可以把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通路的带宽和延时性能方面都有影响

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

千北@

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

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

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

打赏作者

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

抵扣说明:

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

余额充值