详解linux 摄像头驱动编写
<p>对于现代嵌入式设备,特别是手机来说,摄像头是很重要的一个设备。很多同学买手机,一看颜值,第二就看摄像头拍照如何。所以,从某个角度来说,摄像头是各个厂家主打的应用功能。那么,linux是如何支持摄像头的,我们可以来看一下?</p>
<p>
1、代码目录地址</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterplain" id="highlighter_618796">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">drivers/media</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
2、v4l2框架</p>
<p>
目前linux上的camera都是按照v4l2框架来设计,它的地址位于drivers/media/v4l2-core</p>
<p>
3、查看三星soc是如何支持camera的,可以查看drviers/media/platform/Kconfig</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterplain" id="highlighter_42445">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">config VIDEO_S3C_CAMIF </code>
</div>
<div class="line number2 index1 alt1">
<code class="plain spaces"> </code><code class="plain plain">tristate "Samsung S3C24XX/S3C64XX SoC Camera Interface driver" </code>
</div>
<div class="line number3 index2 alt2">
<code class="plain spaces"> </code><code class="plain plain">depends on VIDEO_V4L2 && I2C && VIDEO_V4L2_SUBDEV_API </code>
</div>
<div class="line number4 index3 alt1">
<code class="plain spaces"> </code><code class="plain plain">depends on PM </code>
</div>
<div class="line number5 index4 alt2">
<code class="plain spaces"> </code><code class="plain plain">depends on ARCH_S3C64XX || PLAT_S3C24XX || COMPILE_TEST </code>
</div>
<div class="line number6 index5 alt1">
<code class="plain spaces"> </code><code class="plain plain">depends on HAS_DMA </code>
</div>
<div class="line number7 index6 alt2">
<code class="plain spaces"> </code><code class="plain plain">select VIDEOBUF2_DMA_CONTIG </code>
</div>
<div class="line number8 index7 alt1">
<code class="plain spaces"> </code><code class="plain plain">---help--- </code>
</div>
<div class="line number9 index8 alt2">
<code class="plain spaces"> </code><code class="plain plain">This is a v4l2 driver for s3c24xx and s3c64xx SoC series camera </code>
</div>
<div class="line number10 index9 alt1">
<code class="plain spaces"> </code><code class="plain plain">host interface (CAMIF). </code>
</div>
<div class="line number11 index10 alt2">
<code class="plain spaces"> </code>
</div>
<div class="line number12 index11 alt1">
<code class="plain spaces"> </code><code class="plain plain">To compile this driver as a module, choose M here: the module </code>
</div>
<div class="line number13 index12 alt2">
<code class="plain spaces"> </code><code class="plain plain">will be called s3c-camif. </code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
4、从Kconfig确认除了VIDEO_V4L2和VIDEO_V4L2_SUBDEV_API之外,它只依赖自己的目录</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterplain" id="highlighter_290254">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">obj-$(CONFIG_VIDEO_S3C_CAMIF) += s3c-camif/</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
5、继续查看s3c-camif目录的代码结构</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterplain" id="highlighter_71266">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain"># Makefile for s3c244x/s3c64xx CAMIF driver </code>
</div>
<div class="line number2 index1 alt1">
<code class="plain spaces"> </code>
</div>
<div class="line number3 index2 alt2">
<code class="plain plain">s3c-camif-objs := camif-core.o camif-capture.o camif-regs.o </code>
</div>
<div class="line number4 index3 alt1">
<code class="plain spaces"> </code>
</div>
<div class="line number5 index4 alt2">
<code class="plain plain">obj-$(CONFIG_VIDEO_S3C_CAMIF) += s3c-camif.o</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
6、Makefile说的很清楚,它主要依赖camif-*.c三个文件</p>
<p>
通过阅读,确认camif-core.c是注册文件</p>
<p>
camif-regs.c是寄存器读写文件</p>
<p>
camif-capture.c是主要的操作文件、接口文件</p>
<p>
7、确认v4l2的函数操作接口</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightercpp" id="highlighter_995654">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
<div class="line number16 index15 alt1">
16</div>
<div class="line number17 index16 alt2">
17</div>
<div class="line number18 index17 alt1">
18</div>
<div class="line number19 index18 alt2">
19</div>
<div class="line number20 index19 alt1">
20</div>
<div class="line number21 index20 alt2">
21</div>
<div class="line number22 index21 alt1">
22</div>
<div class="line number23 index22 alt2">
23</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="cpp keyword bold">static</code> <code class="cpp keyword bold">const</code> <code class="cpp keyword bold">struct</code> <code class="cpp plain">v4l2_ioctl_ops s3c_camif_ioctl_ops = { </code>
</div>
<div class="line number2 index1 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">.vidioc_querycap = s3c_camif_vidioc_querycap, </code>
</div>
<div class="line number3 index2 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">.vidioc_enum_input = s3c_camif_vidioc_enum_input, </code>
</div>
<div class="line number4 index3 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">.vidioc_g_input = s3c_camif_vidioc_g_input, </code>
</div>
<div class="line number5 index4 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">.vidioc_s_input = s3c_camif_vidioc_s_input, </code>
</div>
<div class="line number6 index5 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">.vidioc_enum_fmt_vid_cap = s3c_camif_vidioc_enum_fmt, </code>
</div>
<div class="line number7 index6 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">.vidioc_try_fmt_vid_cap = s3c_camif_vidioc_try_fmt, </code>
</div>
<div class="line number8 index7 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">.vidioc_s_fmt_vid_cap = s3c_camif_vidioc_s_fmt, </code>
</div>
<div class="line number9 index8 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">.vidioc_g_fmt_vid_cap = s3c_camif_vidioc_g_fmt, </code>
</div>
<div class="line number10 index9 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">.vidioc_g_selection = s3c_camif_g_selection, </code>
</div>
<div class="line number11 index10 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">.vidioc_s_selection = s3c_camif_s_selection, </code>
</div>
<div class="line number12 index11 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">.vidioc_reqbufs = s3c_camif_reqbufs, </code>
</div>
<div class="line number13 index12 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">.vidioc_querybuf = s3c_camif_querybuf, </code>
</div>
<div class="line number14 index13 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">.vidioc_prepare_buf = s3c_camif_prepare_buf, </code>
</div>
<div class="line number15 index14 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">.vidioc_create_bufs = s3c_camif_create_bufs, </code>
</div>
<div class="line number16 index15 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">.vidioc_qbuf = s3c_camif_qbuf, </code>
</div>
<div class="line number17 index16 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">.vidioc_dqbuf = s3c_camif_dqbuf, </code>
</div>
<div class="line number18 index17 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">.vidioc_streamon = s3c_camif_streamon, </code>
</div>
<div class="line number19 index18 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">.vidioc_streamoff = s3c_camif_streamoff, </code>
</div>
<div class="line number20 index19 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">.vidioc_subscribe_event = v4l2_ctrl_subscribe_event, </code>
</div>
<div class="line number21 index20 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">.vidioc_unsubscribe_event = v4l2_event_unsubscribe, </code>
</div>
<div class="line number22 index21 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">.vidioc_log_status = v4l2_ctrl_log_status, </code>
</div>
<div class="line number23 index22 alt2">
<code class="cpp plain">}; </code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
and</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightercpp" id="highlighter_229994">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="cpp plain">649 </code><code class="cpp keyword bold">static</code> <code class="cpp keyword bold">const</code> <code class="cpp keyword bold">struct</code> <code class="cpp plain">v4l2_file_operations s3c_camif_fops = { </code>
</div>
<div class="line number2 index1 alt1">
<code class="cpp plain">650 .owner = THIS_MODULE, </code>
</div>
<div class="line number3 index2 alt2">
<code class="cpp plain">651 .open = s3c_camif_open, </code>
</div>
<div class="line number4 index3 alt1">
<code class="cpp plain">652 .release = s3c_camif_close, </code>
</div>
<div class="line number5 index4 alt2">
<code class="cpp plain">653 .poll = s3c_camif_poll, </code>
</div>
<div class="line number6 index5 alt1">
<code class="cpp plain">654 .unlocked_ioctl = video_ioctl2, </code>
</div>
<div class="line number7 index6 alt2">
<code class="cpp plain">655 .mmap = s3c_camif_mmap, </code>
</div>
<div class="line number8 index7 alt1">
<code class="cpp plain">656 };</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
8、和sd一样,接口比较简单,但是要深入了解camera,v4l2是绕不过去的。</p>
<p>
这一点和sd卡、usb、asoc是一样的。</p>
<p>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。</p>
<p>
原文链接:https://blog.csdn.net/feixiaoxing/article/details/79850268</p>
頁:
[1]