Linux camera驱动开发(开篇)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

我们要想看到这个世界,camera是最直接的方法。早前靠胶片相机、数码相机、单反,现在有了手机、运动相机之后,几乎可以很容易地通过camera感受到这个世界。另外,camera应用的地方也很多,比如工业、消费、汽车、医疗等等,它出现的地方远比大家想的要多得多。但是怎么驱动camera、怎么开发camera,很多人不了解,特别是在linux环境下面怎么开发camera。

1、usb camera和mipi camera

如果我们不想自己标定camera,那么使用usb camera是一个很好的选择。低一点分辨率的camera,用usb2就可以,如果是高分辨率的camera,就需要usb3了。用usb有一个好处,就是拿到的图像就是标定好的图像,因为关于isp所有的标定工作,usb mcu controller都帮我们完成了。但是如果想利用soc的isp,对输入图像进行处理,这个时候只能自己标定camera图像了。而且,很多的4k/30、4k/60、8k/30 sensor,几乎只有mipi这一条路了。

2、mipi vs dvp

mipi和dvp没有本质上的区别,前者是i2c+mipi总线的格式,后者是i2c+8位数据并行的格式。mipi总线一般采用差分的形式,比如1对clk+2对lane,或者是1对clk+4对lane。整体速度非常快,所以可以传递很高分辨率、很高帧率的数据,这是mipi的优势。而dvp呢,控制部分还是i2c总线,数据传输部分,则用并行数据的格式来完成,并没有使用差分总线。

3、带isp sensor和不带isp的sensor

较早的时候,很多sensor都是带isp的,比如大家所熟知的ov5640。不过,后期随着isp在soc上面越来越普及,sensor的isp功能就被拿掉了。这是因为sensor上面虽然可以做isp,但是都是基础的isp,由于成本和大小的限制,sensor上面的isp不可能做的很复杂。另外,不同的客户,对于isp要求差异很大,这些本就不是sensor厂擅长的内容。

4、sensor驱动

早期sensor,大部分都是国外的品牌居多,尤其是高端一点的sensor,一般都是三星、sony,或者是安森美。现在由于国产化的替代,ov、思特微、格科微,国产品牌的sensor越来越多,市场份额也越来越大。目前不管是手机消费,还是医疗、车载,国产sensor用的是越来越多,越来越普遍。所以,如果可能的话,大家最好多学习一下sensor驱动,大部分sensor驱动都是i2c驱动,所以这部分的代码其实没有大家想象的那么难。

5、mipi驱动

mipi驱动和sensor驱动不大相同。如果说不同的sensor,大家可能还需要自己编写驱动代码,或者说自己从类似的sensor拷贝驱动,修改驱动。那么mipi驱动,基本上就是以文件配置为主,比如说用了几条lane,10bit还是12bit,这些通常不需要自己写代码,就是纯配置,或者是在驱动代码里面找到对应的位置,把参数找到、修改一下即可。很多视频资料、或者是教学资料把mipi解释得很复杂,但是这部分在实际使用起来,往往是一带而过的。

6、isp标定

isp的输入是bayer图像,中间经过rgb图像,输出是yuv图像,这是一般的规律。就像usb camera输出是mjpeg,或者是yuyv一个道理。最初拿到的bayer图像,如果直接转换成rgb,或者是yuv,几乎是不能用的。这个时候就要通过isp,做一些blc、去马赛克、awb、ae、色彩校正、gamma矫正、sharp的操作,经过这些处理好了,基本上就是能用的图像了。

标定的时候,软件部分就是板子跑一个server程序,电脑跑一个上位机程序,通过一些道具,类似于棋盘格、色卡、灰度卡、灯箱、模特假人等等,来对图像进行标定处理。

7、v4l2驱动

linux上面camera处理的接口是v4l2,但是怎么把v4l2接口和不同的soc绑定在一起,这就是soc驱动的意义所在。所以这里面其实有三部分需要协调在一起,一个是sensor、一个是linux v4l2,还有一个就是soc,理解了这三部分,其实就可以慢慢了解了linux camera驱动开发的意义了。

不仅如此,linux驱动还涉及到修改menuconfig、配置dts、ko驱动编译,本身用到什么学什么的立场,慢慢去学就好了。之前说的sensor驱动、mipi驱动只告知sensor属性如何配置、什么时候可以发送frame、格式是什么,而v4l2驱动的工作就多了,一方面要完成上层app的接口,一方面还要涉及到中断、dma、内存以及isp,把报文正确地拿到,并且放到queue里面。

8、soc sdk

很多工具,或者代码是没有办法通过开源代码拿到的。**不同的soc,需要通过不同的代理商,或者是购买他们的开发板,才能拿到对应soc的sdk,不然是没有办法进行交叉编译开发的,很多内容也是开源代码根本没有的。**并不是所有的代码都是以open source的形式发布出来的,这一点需要注意下。商业是商业,技术是技术,你觉得是技术的东西,别人眼里只有有利可图,才能和你进一步接洽和合作的。

再比如图像之后的编解码、图像处理、音频编解码,这部分的驱动代码都是不给的,都会以ko形式提供sdk。哪怕是上层的编解码库,很多时候也是不给源代码的,只有demo,没有sdk的源代码。这部分也需要适应一下。

这里说的sdk,是广义上的sdk,里面包含了芯片资料、demo板原理图、uboot、kernel、busybox、音视频ko驱动、音视频so库等等。不仅如此,很多sdk还报了很多调试工具、下载工具、交互工具,内容非常丰富。

9、屏幕驱动

很多应用除了camera之外,还需要实时显示,或者是低延时显示。所以如果有可能的话,最好把常用的几种screen接口一起学一下,比如说rgb屏幕、hdmi屏幕、mipi屏幕等等,相信学完之后,对自己的发展大有裨益。

屏幕的种类也非常多,有接口的不同,有形状的不同,还有分辨率、帧率的不同,这里面的学问也很大。所以它其实和sensor一样,本身也是一个巨大的市场。

相关推荐
XMAIPC_Robot2 小时前
软硬协同实时控制|RK3588业务调度+FPGA硬件时序,ethercat实现半导体设备微秒级响应(125us)
linux·arm开发·人工智能·fpga开发
AOwhisky3 小时前
Python 学习笔记(第十五期)——运维自动化(下·后篇):堡垒机实战——paramiko高阶篇
运维·python·学习·云原生·自动化·运维开发
重生的黑客3 小时前
Linux 进程优先级、切换与调度:从孤儿进程到 O(1) 调度模型
linux·运维·服务器·进程优先级·nice
Urbano3 小时前
夹克与商务单西口袋工序自动化技改研究报告
运维·自动化
骑上单车去旅行4 小时前
MD5校验对比脚本
linux·服务器·windows
平生幻4 小时前
Linux 常用命令
linux
期待着20134 小时前
docker 安装 ,在centos7.9
运维·docker·容器
踏月的造梦星球5 小时前
DM8 DSC 单机双实例部署
运维·开发语言·数据库
MXsoft6185 小时前
平台化是智能运维发展的必然趋势吗?
运维
ShirleyWang0126 小时前
让headlamp控制台能访问
linux·服务器·python·k8s·k3s