本文结合项目实际需求做一个关于设备驱动的分析,如何新加一个Camera设备
这个项目使用了一个并口摄像头信号到MCU。具体原理框图如下
Camera数据流向是 sensor -->913串行器----->914解串器------>并口数据--->imx6q
在设备树上的配置如下:
&i2c2{ #address-cells = <1>; #size-cells = <0>; status = "okay"; ds914desilizer:ds914desilizer@0x60{ compatible = "ds914dseilizer,TI"; ipu=<1>; csi=<1>; reg=<0x60>; pinctrl-names = "default"; pinctrl-0 = <&pinctl_ipu_ds914>; width = <1280>; height = <720>; denominator = <25>; numerator =<1>; }; };
因为是一个i2c设备,于是挂载在i2c这个设备树下,并且使能这个i2c,在里面使能复用并口数据IO,设置分辨率等。
那么看设备驱动做了什么。
内核有一个OV5640的例子,于是对其改改就成我们自己的了。
国际惯例,是一个i2c驱动,注册一个i2c_driver .
设备驱动probe做的主要事情就是填充一个sensor_data 结构体并将其放入 v4l2_int_device 的 私有数据里。这个私有数据以后被master 所用 ,也就是mxc_v4l2_capture.c的 cam_data
这个v4l2_int_device 是一个从类型设备(代表具体的sensor)
然后 调用注册函数 将其注册,就是放入我第二篇说的那个链表中,用来与具体的master匹配,匹配成功后调用attach函数。
可见,写一个设备驱动的话,最主要的就是生成一个v4l2_int_device 和 sensor_data 。
还有
v4l2_int_ioctl_desc 这个 数组里面的函数,在一定情况时会被mxc_v4l2_capture.c所调用。
这么做的原因是为了更好的实现设备与驱动的分离,驱动只要调接口,随你设备是如何做的。
具体代码不放出来了,不方便透露。
原文:https://www.cnblogs.com/coversky/p/10886168.html