menu

Linux Camera的小研究(Android, Linux, ChromeOS)

  • date_range    info
    sort

注:开发中

最近稀里糊涂的就开始写上的ISP的Kernel Driver,然而接触Camera的开发不过才几个月而已. 很多原理上,Camera和GPU相差不大,但Camera也有很多他特有的东西,比较有意思。 这里我列下一些我自己收集的信息,来整理下思路。

Status

反正我们都是搞开源的,多说点背景应该也没什么关系吧。。。。。。

下面是我自己的背景理解:

  • rockchip目前在Android上使用的是一个userspace based的Camera HAl驱动框架,HAL1? 应该是借鉴自别家的吧。
  • 后来rockchip和intel合作搞什么sofia,这时候也写了个驱动,cif_isp10什么的,这个方案intel上应该也写了gstreamer plugin和Android HAL3。 这个驱动后来被RK用在了RV1108这样的产品线上。
  • 在ChromeOS项目上,google对驱动质量有要求,所以其实不管是RK还是Intel,都是被要求重写驱动。(也挺好的

Userspace

Camera Hal3

Android还有ChromeOS对接Camera的都是需要HAL,这意味我们写完了驱动,还需要实现相对应的HAL。

https://source.android.com/devices/camera/camera3#overview

待续

Gstreamer Plugin

在Linux上我们就不需要这样一个HAL,而且我们可以最大限度的利用别人写好的东西,但这也意味着从user的角度,要用好的话,是需要对你所用的驱动有一定的理解的,包括ISP和sensor。 原来交互的对象是一整个完整的HAL,在Linux上可能就是好几个分离的Block。

Linux我是打算把所有的东西都塞到一个gstreamer plugin里,设计思路为:

media-ctl + gstreamer v4l2src + 3A daemon

在每次启动的时候:

  • meida-ctl配置media controller的参数,使整个pipeline参数正确
  • v4l2src就当isp为一个普通的capture device做输出输出获取buffer
  • 启动一个3A daemon,获取stats,跑算法,输出params

相比Android\ChromeOS来说,Linux上自己需要处理的东西会更多。
HAL上会处理很多情景,比如说预览的时候怎么拍照,会有速度的要求。在Linux上,不会关注这个,你写程序如果需要拍照,自己停掉预览的gstreamer pipeline,然后配置一个高分辨率的拍照 gstreamer pipeline,拿一帧的数据。

如果不想使用gstreamer,那就更好的了,全自己用ioctl搞吧。 ;-p

Demo:
https://github.com/rockchip-linux/gstreamer-rockchip-extra

Driver

见See Also

See Also

Rockchip的isp驱动有好几套, 其中, v4l2驱动分两套.

https://linuxtv.org/downloads/presentations/summit_jun_2010/20100614-v4l2_summit-media.pdf

cif_isp10

用于rv系列和sofia系列的linux系统, 这个应该主要是由intel开发的, 驱动里比较大量的使用的自己定义的结构。

rockchip-isp1

最早在chromeos项目上开发的, 符合linux standard的驱动(其实也是被google push的),其实也是改自上面那套驱动.

主要是删减了代码以及修改成media controller的方式。

未来可能会用于所有的Linux-kernel based OS上,比如Linux,Android,ChromeOS。

遵守标准的结构,好处很多,比如:

  • community会帮忙review,确保代码的clean
  • 可以利用别人写好的sensor driver
  • 文档多,community会提供高质量的文档。

关于rockchip-isp1驱动,有兴趣可以追踪一下mail List,里面也会有一些驱动的设计思路
https://www.mail-archive.com/linux-media@vger.kernel.org/msg121884.html

Hardware

这个的datasheet是不对外开放的, 但是。。。反正我就贴个链接。。
http://rockchip.fr/RK3288%20TRM/rk3288-chapter-31-image-signal-processing-(isp).pdf

当然这只是datasheet, 不是完整的Manual, 只是看看Blocks结构, 寄存器说明也不包含在里面。 但我想你也不会有兴趣去看寄存器的。

Tips

sensor

调试sensor的技巧:

第一步是在rkisp1_mipi_isr里加中断, 确认mipi phy的信号有出来. mipi phy有信号, 可以验证以下事情: mipi phy/controler可以接收输入, sensor信号有了输出. 反之如果没有, 原因也就是这个两个, 可以用下面的命令来验证.

io -4 -l 0x100 0xff911c00(rk3288)

出来的数据, 第2个部分代表mipi status, 多输入几次, 看看有没有变化, bit 8:11代表data lane0-3的stop state, bit12代表clock lane stop state. 如果有所的stop bit没变, 需要检查sensor是不是正确输出了, 如果只是clock lane, 需要看下sensor的clock lane是不是在s_stream前没在lp11模式.

第二步, 如果mipi_isr有中断了, 但是有sync_error的错误, 表示mipi接收的图像和isp配置的信息不一致, 可以有以下原因: mipi接收的图形大小和isp配置的不一致, mipi接收的信号有问题.
第一个原因,检查下是不是sensor配置了1080p输出, 但是设置的软件size确是720p.
第二个原因,检查下是不是bitrate设置的有问题, lane num设置的有问题, 硬件信号有问题.

See Also