我这边需要实现200帧以上的灰度图抓取,所以选用了OV9281摄像头。但是由于没买到引脚顺序一致的摄像头,所以自己用扩展板焊了一个,飞线确实可能影响信号完整性,正经的等长板子在打了,需要几天才能寄来。暂时先用这个测。
驱动的部分是用默认的GC2053改的,参考了Rockchip的OV9281驱动。附上DTS和驱动文件(没改完):
ov9281_mipi.c
board.dts
目前/dev/video0出现了,使用camerademo也能看到I2C通讯和MIPI输出。
但是报错
[CAMERA_ERR] camera0 select timeout,end capture thread!
帧率显示为0
我尝试观察了MIPI的输出,把逻辑分析仪挂到FPC连接器17,18脚,即DP0,DN0。能看到LP向HS转换时的LP01状态,所以正反应该没接错。另外通过修改传感器寄存器,可以让DP1,DN1不输出,也可以让CP和CN进入Gated clock观察到LP01。所以接线应该没有错。
我怀疑问题还是在时序上,目前寄存器配置PLL1 pix clk为800M,PLL1 sys clk为80M。所以我猜测像素时钟是80M,每lane的输出是800Mbps (初次调MIPI不一定对)。
Rockchip里对于1280x800x30fps的设置是:
#define OV9282_VTS_30_FPS 0xe48
#define OV9282_HTS_30_FPS 0x2d8
那3656(E48)*728(2D8)*30 = 79.84M,似乎和80M的时钟能对上。
只是728比800还少,不太明白为什么,但很多驱动都是用这个数。
突发的数据传输每33.3ms一次,应该对应是30帧。
其中突发的传输是7.4ms,802个下降沿,应该对应800的分辨率。至于7.4ms,我实在算不出这个数据是和什么对应。
进一步放大图像,这应该是每一行的传输。
空闲为14.3us,传输为8.4us。这两个数据我也没有算出对应的设置。
另外摄像头卖家提供的驱动似乎来自君正,
hts 0x5b0=1456
vts 0x71c=1820
此时800个LP模式的空闲为14.56ms,占33.33ms的比例与800/1280基本一致。
但是每个LP为9.8us,后面高速数据为8.3us,这个数据我也没有算出对应的设置。
这两种hts和vts设置都有camera0 select timeout错误。还烦请有经验的前辈分享一下经验和建议。