1、说明
前面一篇文章 fastboot sensor 驱动移植 里面大概介绍了一下快起上面的驱动移植,提及了自己手动移植驱动时,需要修改的一些地方,如果顺利的话可以初步点亮sensor出图,但具体不是太详细,所以想着重新写一篇专门说sensor驱动修改方面的文,这篇也算是驱动移植了,可以实际套用在全志平台(我也没接触过过全志很多其他平台,具体是不是都一样也不晓得),如果不适用,那你再瞅瞅其他人的文章,我这个做个了解好了。
本文讲一下整体的sensor移植过程,重点在驱动修改方面,然后用 ov02b10 这个驱动做例子分析。这个sensor其实不太友好,也不是非常不友好,就是寄存器设置什么的有一点麻烦,还有曝光增益逻辑也有点麻烦,但是具体阐述这个方法而已,你也不一定面对的就是这种sensor。
然后,没然后了,让我们go起来
2、驱动修改要点一(点亮基础修改)
调试sensor第一步,管他什么花里花哨的,我首先得先把sensor点亮,至于颜色,翻转曝光啊之类的功能,那都是后面的事情,不先点亮,其余的全没用。
2.1、硬件管脚等信息
拿到sensor第一步,首先配置硬件信息,这里配置,基本上重点在设备树里面,其他地方涉及的不多。我们配置的话,就看看硬件关键和当前原理图是否一致,然后就是管脚配置时候注意功能复用,最基础的i2c总线、mipi clk的管脚是否正确、mipi管脚是否正确、sensor最重要的pwdn和reset引脚配置。注意,配完之后,确保正确的前提下,一定要确认在其他地方一定没有管脚复用冲突,因为有的时候,在内核上面包含的dtsi文件里面,是会有引脚冲突存在的可能的,不能只查找当前 board.dts。
列举个别引脚:
mipi clk等管脚:这里mipi接口,i2c,clk,pwdn都有了,在设备树里面各个查询配置,不过多截图了
sensor节点配置:注意自己使用的i2c总线编号,pwdn引脚,设备地址。有的摄像头reset和pwdn只有一个也可正常工作,这个sensor就是
硬件就看原理图改就行,没多少难度。最基础的就是你首先要硬件上识别到i2c设备,然后才是软件上面驱动探测,两者i2c通讯读取id比对,所以先保证i2c引脚正确,然后sensor节点i2c配的也正确,这时候就可以先使用i2cdetect 工具查看总线了,能探测到i2c设备才能有以后。刚开始排查问题一定是有没有识别到硬件设备,如果i2c配置正确没有识别到设备,这里你就可以停下来了,让硬件帮忙看看是不是哪里有啥问题
2.2、上电时序
引脚配置顺利,且i2cdetect 识别到设备,就可以搞驱动了。驱动搞好放进去,i2c探测成功,probe函数执行,小机端就有设备了,功能好不好起码有设备了。所以第二步的目标是成功加载驱动。
这部分最重要的大头在上电时序上面,然后就是一些基础的寄存器配置,比如驱动刚开始,里面的id 寄存器地址,然后寄存器里面需要匹配的id值;再然后是你上一步设备树里面配置的设备地址,这些都需要自己去查找sensor手册查找,包括那个重要的上电时序。
注意看手册上面各个顺序和时值,都正确的话,上电这个sensor驱动的探测函数,对比id应该是能成功的,也就是probe那一步,成功的话,你开机加载sensor驱动的log里面,是不会打印错误log的。如果probe函数对比id报错,根据驱动代码那一部分排查问题,看到底是读id的寄存器不对;还是寄存器正确,然而读出来的id值和自己要对比的sensor id不对应。自己看下什么问题,前面都顺利的情况下,这里基本上没啥问题。(一定要注意是之前的都顺利,要是前面步骤i2c都没通,或者i2c总线设置出错,那疯狂折腾也没啥用)
2.3、初始化参数
然后就是填充驱动里面的初始化参数,这部分需要模组厂提供,自己也可以向模组厂提出要求,比如什么分辨率的,多少fps的初始化参数,我的初始化参数是这样的(不全,后面一大串,全是初始化数组)
文件名字有时候也包含很多重要信息(包含raw bit,分辨率,mclk,lane之类的信息):
这个初始化参数具体在驱动中,这样使用:
你可以创建多组自己的参数,在sensor_win_size 中引用(每个大括号是一个分辨率的初始化参数,这里举例是1600 1200 30fps 的初始化参数;你也可以复制一份,里面填写你15fps的另一份初始化参数):
hts vts pclk mipi_bps fps 这些都可以在模组厂提供的参数文件中找,找不到的可以自己计算, hts vts 有的可以在手册中找到,或者可以根据手册找对应的寄存器,然后对比模组厂提供的参数中对应寄存器的值,也可以得到 vts hts
pclk = hts * vts * fps
mipi_bps = pclk * raw_bit / lane_num
从上面模组厂提供的文件名字能看出来,用的是raw10, 1 lane的。不必强求模组厂提供的数据和自己计算的不一样,可以根据提供的参数尝试,如果不行再尝试计算数据
2.4、sensor raw bit
这个参数在上面提及到了,sensor手册可以查询到支持的 raw bit,一般sensor支持多种,可以向模组厂索要不同的raw bit初始化参数,看自己具体需求
有的sensor手册说明很详细,比如这种:
这个参数在驱动中需要根据实际情况设置rgb顺序宏,如:
(如果是raw12的,可能这里宏就是 MEDIA_BUS_FMT_SRGGB12_1X12,这个宏要是自己不确定,就在内核里搜一下定义这个宏的地方,看看其他raw bit宏怎么写)
2.5、sensor lane num
参数同上 raw bit 可以在手册中查找,有的初始化参数文件里面也有说明,确认了 1 lane 还是2 lane,修改驱动:(2line的应该也是把数字1改成2就行,还是那句话,不知道的查一下定义的地方,看看是不是,我之前就把CSI后面数字也改了..)
2.6、i2c地址和数据位宽
i2c数据和地址位宽也需要重视,如果设置不正确,可能刚开始的id匹配都会失败,地址位宽基本上都是8bit,数据位宽有8bit (0xff) 有16 bit (0xffff),看具体的sensor,或者看厂家提供的初始化数据,基本就能看出来地址位宽和数据位宽。驱动中设置这里的参数:
这些修改完应该就可以出图点亮了,中间的一些针对自己的sensor具体修改的,一定要注意
3、驱动修改要点二(点亮之后驱动完善)
sensor初步点亮之后还有其他很多问题,比如曝光,翻转,增益,颜色等需要调整和调试。
3.1、颜色,rgb顺序
若出图之后画面整体颜色不对,可调整rgb顺序看看有没有好转。技巧还是上篇文章中提到的,最好自己百度一张色卡,然后放在sensor下面看色块,如果色块颜色就不对,那就需要调整rgb顺序,如果只主观看到画面全是紫的,或者其他颜色,就去盲目改rgb顺序,大概率是没有多大效果的,因为这时候的isp效果文件没有匹配的,画面不一定就正常显示,有的你调整好了rgb顺序,只是色块颜色都正确了,其实整体画面他就是紫色的,需要后面加载和调试isp效果文件的。
技巧就是:单看颜色对不对应就行了,不要看整体画面色彩正不正。有的碰巧加载的效果文件也能凑合使用,那它显示的颜色就正常。重点看rgb色块,要是明显看出来绿色和蓝色和手里色卡上面翻了,那就调换绿和蓝颜色顺序。
rgb顺序在这里设置,初始的rgb顺序(注意这里的宏,不清楚的还是自己去查定义的地方):
3.2、左右上下翻转
然后就是翻转功能,根据sensor手册,查找对应的寄存器地址,改驱动
注意翻转函数修改完之后,翻转之后的颜色问题也要修改(这里的寄存器和里面数值代表的那个位是什么翻转,都参考书册来改):
如果你不知道翻转之后颜色顺序是啥,你可以根据手册这种信息:
结合上面翻转的手册截图,利用初始的rgb顺序翻转得到翻转后的颜色顺序。或者实在搞不懂,就一个一个试试,总有对的,颜色顺序就那几个。
3.3、曝光、增益函数
上面都修改好了,最重要的曝光增益就来了。首先还是手册查找增益的寄存器和相关说明:
曝光很大程度上和vts是直接相关的,手册这边介绍了曝光的最大值和最小值,这个数据是要在驱动初始化数据那边做修改的:
曝光和增益在函数中设置,增益逻辑相对复杂,曝光简单,基本上就是设置寄存器,一般的sensor就是直接写对应的寄存器就好了,这个sensor设置寄存器操作比较麻烦,还有生效,所以开头说这个sensor不太友好,曝光如下:
增益函数比较复杂,里面还牵扯了曝光增益逻辑,这个逻辑往往伴随一些参数,曝光增益逻辑有两种方法,查表法和计算法,基本都需要模组厂提供,有个会提供一个表,有的会把整个表和参考代码或者计算代码都提供给你,这种情况就很nice,你逻辑代码直接放进这个增益函数里面用就可以了:
没有给你参考代码的,那你自己参考其他的驱动,写一个,用模组厂提供的表就好了,就这个数组,必要的时候做一下取整什么的(取整思路参考另一篇,这里代码没截全,不单纯乘1024就完了):
然后就差不多可以了,后续交给 isp tuning工程师调一下效果文件,中间有什么细节小问题,你再改驱动就好了。
打完收工