RK平台模组Sensor移植心得体会

最近在RK平台上做PMD Sensor的移植,踩了不少坑,终于移植完了,在这里分享下经验。

首先对于模组sensor的移植来说,大致分为这么几步:

1.熟悉平台阶段;

2.阅读模组sensor datasheet 以及硬件原理图;

3.在已有的sensor驱动模板基础上修改,编写对应的驱动函数及相关文件;

4.调试I2C,配置寄存器初始化序列,读取chip ID;

5.配置mipi,出流检测。

看起来很简单,其实也蛮复杂的,因为可能很多地方都存在问题,需要一一去排查。

首先,平台的熟悉,在我看来,分为三部分:应用程序、HAL层(RK平台,其他平台可能叫别的名字)和驱动层。首先要看懂一个demo的运行流程,尤其是与sensor有关的部分,例如:应用程序关于sensor的配置,驱动层的sensor设置函数,寄存器初始化过程,编译文件等等。在我进行移植的过程中,就出现了几次因为应用程序的sensor出图格式的问题导致后续ISP处理,sensor的启动无法正常进行的问题,当然由于RK提供给我的是一个大型的程序(行车记录仪录程序),所以有很多地方会导致sensor启动不了,所以如果有比较小的demo,最好是使用小型的demo去移植,这样会减少应用层的设置,而这些设置往往不是移植的关键点,但会浪费很多时间。

其次,阅读datasheet和硬件原理图。这个真的至关重要好吗。阅读datasheet主要是去了解这个Sensor的启动流程,上电、复位等序列,因为有些平台也许已经为其他类型的sensor已经移植好了,所以对应的这些序列也是针对与那些sensor的,也许你要移植的Sensor序列就是跟这些不一样,所以你要看下。当然和部分看起来可能有些复杂,最好用示波器去测量对应的管脚先去验证,觉得真的有问题再去看代码,这样比较直观。但是也不是一定会不一样,比如我在移植过程中也曾怀疑过是不是OV系列的模组的启动序列和PMD的不一样导致的sensor启动失败,但其实问题并不在这里(顺便吐槽一下PMD的datasheet,写的真的有点恶心,根本没有OV系列的datasheet写的直观)。

至于硬件原理图,主要看三个引脚:时钟引脚,reset引脚,power down引脚。这三个引脚最重要,比如说时钟引脚,虽说一般不会考虑这个引脚,但我这次真真正正遇上了这个问题,硬件小哥哥在做转接板的时候多焊了个电阻,没给sensor供电!所以我压根读取不到chip id,I2C的读写也一直NACK有木有!然后调了一整天有木有!要不是这个小哥哥发现,我估计我是想不起来的。reset引脚主要就是刚刚说的复位序列的问题了,可能有些snsor在除了硬复位之外,还需要进行一次软复位(比如需要先设置某一个寄存器才能再设置其他的寄存器)。power down引脚有些sensor用不到,所以硬件原理图也不会接,但是如果接了就要注意了,在打算出流的时候是不是这个引脚有问题,或者这个在某个序列中这个引脚没设置对。

之后就是参照模板去编写对应的sensor驱动了,这部分反倒比较好写,因为大部分的函数在移植的过程中并不需要完成,少数几个比如开流、关流、读取chip id的按照模板调用对应的函数接口,改改寄存器就可以了。然后就是I2C地址要配对,配不对当然也就不可能正确的设置寄存器了。至于寄存器的初始化序列,可以通过FAE获取,或者把之前其他平台已经配置好的寄存器配置拿过来用。但是要注意一点,那就是I2C读写的问题,要注意平台提供的I2C读写接口参数是否符合要移植的sensor的参数格式,比如寄存器地址(一般16位)、写入的数据(有8位,有16位的),如果不适用,则很有可能没有写进去,或者没有读对(更可恨的是,可能即使没写对读对,但也不会报错,最好自己加打印,看下是不是自己想要的值)。最后,是mipi的配置,其实只要对照datasheet,按照当前出流分辨率对应的mipi配置就可以了,一般包括mipi的LANE数、通道、速率、数据格式这几个选项。

按照上面的几点,至少出图是可以了,最多只是在显示屏上显示的不对,但这就是应用层的问题了。

你可能感兴趣的:(RK平台模组Sensor移植心得体会)