RDK_X5上开发mipi摄像头AR0234开发心得

  • ar0234目前已经点亮成功,中间经历了不少的波折,其中涉及到硬件底层原理图,i2c通信,示波器,mipi协议,以及linux内核和地平线的一套hobot框架,因此记录点亮过程

阶段一(错误的方向),在linux内核代码上直接进行驱动移植,尝试用v4l2框架来点亮sensor

  • 有这个方向本身第一点是因为开始并没有嵌入式的开发经验,然后网上大部分的教程都是在瑞芯微的板子上也就是rk的那些板子上进行驱动移植,然后他们都是直接去在linux的kernel源码中去加的,导致我产生了一些误解,不过这段时期的开发过程我也写了一篇博客来具体的解析驱动代码,从读代码的角度来说还是可以参考的
  • 然后关于为什么不能用原生v4l2来去做,我来解释一下,其实Hobot也就是地平线的这一套框架,将图像io,图像处理isp的那些内容,在内核上层又集成了一层api,并且配合硬件上的连接,形成了一套非常高效的图像接收处理的链条,后续也可以直接进行算法或者深度学习的内容
  • 在这里插入图片描述
    如图,一套自己的框架,传统的media或者是dev都被这个vin模块覆盖掉了,将这些模块统一成vin_node然后再串起来形成vflow,每个vin_node都提供了很多的接口来进一步使用,我的理解来讲,到这里就浅尝辄止了,单纯bringup阶段,并不需要更多的深入,只需要知道原生是行不通的,因为他是覆盖掉了原生的v4l2。

阶段二,找到文档的正确位置,开始初步调试sensor

  1. 调试i2c通信,首先在这一步就已经卡了很久,我先把摄像头接口贴出来
    在这里插入图片描述
    对于i2c通信来说,只要pin1,2,3能够正常接通,摄像头能够正常上电,无论有没有安装驱动,都能在板端通过I2c的命令检测到sensor,但是从一开始我就没有办法检测到摄像头的芯片0x10,后来发现问题如下

在这一步进行完之后,i2c通信成功可以用i2c transfer和i2c get之类的来去验证一下,成功就可以进行下一步了

  1. 驱动的编写和示例代码config的添加
    这里就需要去阅读他的框架是怎么写的了,不过好在开发板的文档还是相当详细的,只需要按照上面一步一来
    在这里插入图片描述
    我们要修改的有
  • platform_source_code\hbre\camsys\libcam\src\sensor下需要新建一个文件夹,模仿这其他的驱动代码来写
  • platform_source_code\app\samples\platform_samples\vp_sensors下需要新建摄像头的文件夹和配置文件,并且在vp_sensor.c中添加配置,具体代码的解析这篇文章就先不做赘述,可以等下一篇博客
  1. 烧录上板,然后尝试调用sample下的get_vin_data 来获取单帧图像或者多帧
  • 这一步也是遇到了很多的问题,文档错误码的问题基本上全部都遇到了一遍
  • 首先遇到过lane数不匹配的问题,这一步就没什么可说的,看好i2c的lane数和摄像头需要的lane数做好匹配就行了
  • 然后是关于mclk的问题,部分摄像头有两种时钟提供方式,一种是通过模组上的内部晶振,一种是主板提供,这两种对应的摄像头的工作模式是不一样的,分别是触发和主控模式,不同的工作模式在测试的时候也是不同的,我是需要主控,所以需要调整模组上的电阻位置来让主板提供mclk
  • 然后就是mipi信号不通的问题,这一步可能遇到各种各样的报错,比如hs recepiton 然后 比如lane phy fail之类的,只要你的驱动Init已经完成了,然后你也确定好了寄存器写的值都是正确的,开流之后没收到就基本上是mipi信号物理层的问题,这个时候你就需要去检查首先是线接没接对,然后设备树有没有配置的不对的的房(就是我上面i2c那里说的),这里对了就完事大吉了,你就可以看到raw图像了

总结

总的来说,虽然看着不难,但是其中会遇到各种各样的问题,比如bsp源码也有几个小错误,这些小错误就会卡很久很久,比如我的板级配置的ddr就是不匹配的,这直接导致了一开始差点烧成砖了,用了一天才救回来,然后设备树的层层嵌套,要很细致的检查才能发现他的源码有几个数字是错误的,诸如此来的问题,实则代码层面是最简单得了

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐