<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>SyntekUSBVideoCamera: stk11xx-v4l.c Source File</title> <link href="tabs.css" rel="stylesheet" type="text/css"> <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> <!-- Generated by Doxygen 1.5.9 --> <div class="navigation" id="top"> <div class="tabs"> <ul> <li><a href="index.html"><span>Main Page</span></a></li> <li class="current"><a href="files.html"><span>Files</span></a></li> </ul> </div> <div class="tabs"> <ul> <li><a href="files.html"><span>File List</span></a></li> <li><a href="globals.html"><span>Globals</span></a></li> </ul> </div> <h1>stk11xx-v4l.c</h1><a href="stk11xx-v4l_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <a name="l00034"></a>00034 <span class="preprocessor">#include <linux/module.h></span> <a name="l00035"></a>00035 <span class="preprocessor">#include <linux/init.h></span> <a name="l00036"></a>00036 <span class="preprocessor">#include <linux/kernel.h></span> <a name="l00037"></a>00037 <span class="preprocessor">#include <linux/version.h></span> <a name="l00038"></a>00038 <span class="preprocessor">#include <linux/errno.h></span> <a name="l00039"></a>00039 <span class="preprocessor">#include <linux/slab.h></span> <a name="l00040"></a>00040 <span class="preprocessor">#include <linux/kref.h></span> <a name="l00041"></a>00041 <span class="preprocessor">#include <linux/vmalloc.h></span> <a name="l00042"></a>00042 <span class="preprocessor">#include <linux/mm.h></span> <a name="l00043"></a>00043 <span class="preprocessor">#include <linux/videodev.h></span> <a name="l00044"></a>00044 <a name="l00045"></a>00045 <a name="l00046"></a>00046 <span class="preprocessor">#include <linux/usb.h></span> <a name="l00047"></a>00047 <span class="preprocessor">#include <media/v4l2-common.h></span> <a name="l00048"></a>00048 <span class="preprocessor">#include <media/v4l2-ioctl.h></span> <a name="l00049"></a>00049 <a name="l00050"></a>00050 <span class="preprocessor">#include "<a class="code" href="stk11xx_8h.html" title="Driver for Syntek USB video camera.">stk11xx.h</a>"</span> <a name="l00051"></a>00051 <a name="l00052"></a>00052 <a name="l00053"></a><a class="code" href="stk11xx-v4l_8c.html#00a41f99999840e48ab4ae826e53b569">00053</a> <span class="keyword">static</span> <span class="keyword">struct </span>v4l2_file_operations <a class="code" href="stk11xx-v4l_8c.html#00a41f99999840e48ab4ae826e53b569">v4l_stk11xx_fops</a>; <a name="l00054"></a>00054 <a name="l00055"></a>00055 <a name="l00060"></a><a class="code" href="stk11xx_8h.html#4977da08718c28052dab2096023754e2">00060</a> <span class="keyword">const</span> <span class="keyword">struct </span>stk11xx_coord <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_NBR_SIZES] = { <a name="l00061"></a>00061 { 80, 60 }, <a name="l00062"></a>00062 { 128, 96 }, <a name="l00063"></a>00063 { 160, 120 }, <a name="l00064"></a>00064 { 213, 160 }, <a name="l00065"></a>00065 { 320, 240 }, <a name="l00066"></a>00066 { 640, 480 }, <a name="l00067"></a>00067 { 800, 600 }, <a name="l00068"></a>00068 { 1024, 768 }, <a name="l00069"></a>00069 { 1280, 1024 } <a name="l00070"></a>00070 }; <a name="l00071"></a>00071 <a name="l00072"></a>00072 <a name="l00077"></a><a class="code" href="stk11xx-v4l_8c.html#3aef683028a48feea4df78904b903e81">00077</a> <span class="keyword">static</span> <span class="keyword">struct </span>v4l2_queryctrl <a class="code" href="stk11xx-v4l_8c.html#3aef683028a48feea4df78904b903e81">stk11xx_controls</a>[] = { <a name="l00078"></a>00078 { <a name="l00079"></a>00079 .id = V4L2_CID_BRIGHTNESS, <a name="l00080"></a>00080 .type = V4L2_CTRL_TYPE_INTEGER, <a name="l00081"></a>00081 .name = <span class="stringliteral">"Brightness"</span>, <a name="l00082"></a>00082 .minimum = 0, <a name="l00083"></a>00083 .maximum = 0xff00, <a name="l00084"></a>00084 .step = 1, <a name="l00085"></a>00085 .default_value = 0x7f00, <a name="l00086"></a>00086 }, <a name="l00087"></a>00087 { <a name="l00088"></a>00088 .id = V4L2_CID_WHITENESS, <a name="l00089"></a>00089 .type = V4L2_CTRL_TYPE_INTEGER, <a name="l00090"></a>00090 .name = <span class="stringliteral">"Whiteness"</span>, <a name="l00091"></a>00091 .minimum = 0, <a name="l00092"></a>00092 .maximum = 0xff00, <a name="l00093"></a>00093 .step = 1, <a name="l00094"></a>00094 .default_value = 0x7f00, <a name="l00095"></a>00095 }, <a name="l00096"></a>00096 { <a name="l00097"></a>00097 .id = V4L2_CID_SATURATION, <a name="l00098"></a>00098 .type = V4L2_CTRL_TYPE_INTEGER, <a name="l00099"></a>00099 .name = <span class="stringliteral">"Saturation"</span>, <a name="l00100"></a>00100 .minimum = 0, <a name="l00101"></a>00101 .maximum = 0xff00, <a name="l00102"></a>00102 .step = 1, <a name="l00103"></a>00103 .default_value = 0x7f00, <a name="l00104"></a>00104 }, <a name="l00105"></a>00105 { <a name="l00106"></a>00106 .id = V4L2_CID_CONTRAST, <a name="l00107"></a>00107 .type = V4L2_CTRL_TYPE_INTEGER, <a name="l00108"></a>00108 .name = <span class="stringliteral">"Contrast"</span>, <a name="l00109"></a>00109 .minimum = 0, <a name="l00110"></a>00110 .maximum = 0xff00, <a name="l00111"></a>00111 .step = 1, <a name="l00112"></a>00112 .default_value = 0x7f00, <a name="l00113"></a>00113 }, <a name="l00114"></a>00114 }; <a name="l00115"></a>00115 <a name="l00116"></a>00116 <a name="l00128"></a><a class="code" href="stk11xx_8h.html#ee51a96a13692d189e6d91bd781afa7f">00128</a> <span class="keywordtype">int</span> <a class="code" href="stk11xx-v4l_8c.html#627028fbe327bdeb1589d74109e9ae77" title="Select a video mode.">v4l_stk11xx_select_video_mode</a>(<span class="keyword">struct</span> usb_stk11xx *dev, <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height) <a name="l00129"></a>00129 { <a name="l00130"></a>00130 <span class="keywordtype">int</span> i; <a name="l00131"></a>00131 <span class="keywordtype">int</span> find; <a name="l00132"></a>00132 <a name="l00133"></a>00133 <a name="l00134"></a>00134 <span class="comment">// Check width and height</span> <a name="l00135"></a>00135 <span class="comment">// Notice : this test is usefull for the Kopete application !</span> <a name="l00136"></a>00136 <a name="l00137"></a>00137 <span class="comment">// Driver can't build an image smaller than the minimal resolution !</span> <a name="l00138"></a>00138 <span class="keywordflow">if</span> ((width < <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[0].x) <a name="l00139"></a>00139 || (height < <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[0].y)) { <a name="l00140"></a>00140 width = <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[0].x; <a name="l00141"></a>00141 height = <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[0].y; <a name="l00142"></a>00142 } <a name="l00143"></a>00143 <a name="l00144"></a>00144 <span class="comment">// Driver can't build an image bigger than the maximal resolution !</span> <a name="l00145"></a>00145 <span class="keywordflow">switch</span> (dev->webcam_type) { <a name="l00146"></a>00146 <span class="keywordflow">case</span> <a class="code" href="stk11xx_8h.html#5400cbd98f5ec8f3d24ec55313e274f13f5de5bc8e126ddba84831bfdf8fdaa8">STK11XX_SXGA</a>: <a name="l00147"></a>00147 <span class="keywordflow">if</span> ((width > <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_NBR_SIZES-1].x) <a name="l00148"></a>00148 || (height > <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_NBR_SIZES-1].y)) { <a name="l00149"></a>00149 width = <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_NBR_SIZES-1].x; <a name="l00150"></a>00150 height = <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_NBR_SIZES-1].y; <a name="l00151"></a>00151 } <a name="l00152"></a>00152 <span class="keywordflow">break</span>; <a name="l00153"></a>00153 <a name="l00154"></a>00154 <span class="keywordflow">case</span> <a class="code" href="stk11xx_8h.html#5400cbd98f5ec8f3d24ec55313e274f1896c4ee082ee0fa3eed44795b4a78e9e">STK11XX_VGA</a>: <a name="l00155"></a>00155 <span class="keywordflow">if</span> ((width > <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_NBR_SIZES-3-1].x) <a name="l00156"></a>00156 || (height > <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_NBR_SIZES-3-1].y)) { <a name="l00157"></a>00157 width = <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_NBR_SIZES-3-1].x; <a name="l00158"></a>00158 height = <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_NBR_SIZES-3-1].y; <a name="l00159"></a>00159 } <a name="l00160"></a>00160 <span class="keywordflow">break</span>; <a name="l00161"></a>00161 <a name="l00162"></a>00162 <span class="keywordflow">default</span>: <a name="l00163"></a>00163 <span class="keywordflow">return</span> -1; <a name="l00164"></a>00164 } <a name="l00165"></a>00165 <a name="l00166"></a>00166 <a name="l00167"></a>00167 <span class="comment">// Seek the best resolution</span> <a name="l00168"></a>00168 <span class="keywordflow">switch</span> (dev->webcam_type) { <a name="l00169"></a>00169 <span class="keywordflow">case</span> <a class="code" href="stk11xx_8h.html#5400cbd98f5ec8f3d24ec55313e274f13f5de5bc8e126ddba84831bfdf8fdaa8">STK11XX_SXGA</a>: <a name="l00170"></a>00170 <span class="keywordflow">for</span> (i=0, find=0; i<STK11XX_NBR_SIZES; i++) { <a name="l00171"></a>00171 <span class="keywordflow">if</span> (<a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[i].x <= width && <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[i].y <= height) <a name="l00172"></a>00172 find = i; <a name="l00173"></a>00173 } <a name="l00174"></a>00174 <span class="keywordflow">break</span>; <a name="l00175"></a>00175 <a name="l00176"></a>00176 <span class="keywordflow">case</span> <a class="code" href="stk11xx_8h.html#5400cbd98f5ec8f3d24ec55313e274f1896c4ee082ee0fa3eed44795b4a78e9e">STK11XX_VGA</a>: <a name="l00177"></a>00177 <span class="keywordflow">for</span> (i=0, find=0; i<STK11XX_NBR_SIZES-3; i++) { <a name="l00178"></a>00178 <span class="keywordflow">if</span> (<a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[i].x <= width && <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[i].y <= height) <a name="l00179"></a>00179 find = i; <a name="l00180"></a>00180 } <a name="l00181"></a>00181 <span class="keywordflow">break</span>; <a name="l00182"></a>00182 <a name="l00183"></a>00183 <span class="keywordflow">default</span>: <a name="l00184"></a>00184 <span class="keywordflow">return</span> -1; <a name="l00185"></a>00185 } <a name="l00186"></a>00186 <a name="l00187"></a>00187 <span class="comment">// Save the new resolution</span> <a name="l00188"></a>00188 dev->resolution = find; <a name="l00189"></a>00189 <a name="l00190"></a>00190 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"Set mode %d [%dx%d]\n"</span>, dev->resolution, <a name="l00191"></a>00191 <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[dev->resolution].x, <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[dev->resolution].y); <a name="l00192"></a>00192 <a name="l00193"></a>00193 <span class="comment">// Save the new size</span> <a name="l00194"></a>00194 dev->view.x = width; <a name="l00195"></a>00195 dev->view.y = height; <a name="l00196"></a>00196 <a name="l00197"></a>00197 <a name="l00198"></a>00198 <span class="comment">// Calculate the frame size</span> <a name="l00199"></a>00199 <span class="keywordflow">switch</span> (dev->resolution) { <a name="l00200"></a>00200 <span class="keywordflow">case</span> STK11XX_80x60: <a name="l00201"></a>00201 <span class="keywordflow">case</span> STK11XX_128x96: <a name="l00202"></a>00202 <span class="keywordflow">case</span> STK11XX_160x120: <a name="l00203"></a>00203 <span class="keywordflow">case</span> STK11XX_213x160: <a name="l00204"></a>00204 <span class="keywordflow">case</span> STK11XX_320x240: <a name="l00205"></a>00205 <span class="keywordflow">case</span> STK11XX_640x480: <a name="l00206"></a>00206 dev->image.x = <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_640x480].x; <a name="l00207"></a>00207 dev->image.y = <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_640x480].y; <a name="l00208"></a>00208 dev->frame_size = dev->image.x * dev->image.y; <a name="l00209"></a>00209 <span class="keywordflow">break</span>; <a name="l00210"></a>00210 <a name="l00211"></a>00211 <span class="keywordflow">case</span> STK11XX_800x600: <a name="l00212"></a>00212 <span class="keywordflow">case</span> STK11XX_1024x768: <a name="l00213"></a>00213 <span class="keywordflow">case</span> STK11XX_1280x1024: <a name="l00214"></a>00214 dev->image.x = <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_1280x1024].x; <a name="l00215"></a>00215 dev->image.y = <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_1280x1024].y; <a name="l00216"></a>00216 dev->frame_size = dev->image.x * dev->image.y; <a name="l00217"></a>00217 <span class="keywordflow">break</span>; <a name="l00218"></a>00218 } <a name="l00219"></a>00219 <a name="l00220"></a>00220 <a name="l00221"></a>00221 <span class="comment">// Calculate the image size</span> <a name="l00222"></a>00222 <span class="keywordflow">switch</span> (dev->vsettings.palette) { <a name="l00223"></a>00223 <span class="keywordflow">case</span> STK11XX_PALETTE_RGB24: <a name="l00224"></a>00224 <span class="keywordflow">case</span> STK11XX_PALETTE_BGR24: <a name="l00225"></a>00225 dev->view_size = 3 * dev->view.x * dev->view.y; <a name="l00226"></a>00226 dev->image_size = 3 * dev->frame_size; <a name="l00227"></a>00227 <span class="keywordflow">break</span>; <a name="l00228"></a>00228 <a name="l00229"></a>00229 <span class="keywordflow">case</span> STK11XX_PALETTE_RGB32: <a name="l00230"></a>00230 <span class="keywordflow">case</span> STK11XX_PALETTE_BGR32: <a name="l00231"></a>00231 dev->view_size = 3 * dev->view.x * dev->view.y; <a name="l00232"></a>00232 dev->image_size = 4 * dev->frame_size; <a name="l00233"></a>00233 <span class="keywordflow">break</span>; <a name="l00234"></a>00234 <a name="l00235"></a>00235 <span class="keywordflow">case</span> STK11XX_PALETTE_UYVY: <a name="l00236"></a>00236 <span class="keywordflow">case</span> STK11XX_PALETTE_YUYV: <a name="l00237"></a>00237 dev->view_size = 2 * dev->view.x * dev->view.y; <a name="l00238"></a>00238 dev->image_size = 2 * dev->frame_size; <a name="l00239"></a>00239 <span class="keywordflow">break</span>; <a name="l00240"></a>00240 } <a name="l00241"></a>00241 <a name="l00242"></a>00242 <span class="keywordflow">return</span> 0; <a name="l00243"></a>00243 } <a name="l00244"></a>00244 <a name="l00245"></a>00245 <a name="l00255"></a><a class="code" href="stk11xx-v4l_8c.html#a2127105dfc03d43fd4ce48f8e0417ac">00255</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="stk11xx-v4l_8c.html#a2127105dfc03d43fd4ce48f8e0417ac" title="Open the video device.">v4l_stk11xx_open</a>(<span class="keyword">struct</span> file *fp) <a name="l00256"></a>00256 { <a name="l00257"></a>00257 <span class="keywordtype">int</span> err; <a name="l00258"></a>00258 <a name="l00259"></a>00259 <span class="keyword">struct </span>usb_stk11xx *dev; <a name="l00260"></a>00260 <span class="keyword">struct </span>video_device *vdev; <a name="l00261"></a>00261 <a name="l00262"></a>00262 vdev = video_devdata(fp); <a name="l00263"></a>00263 dev = video_get_drvdata(video_devdata(fp)); <a name="l00264"></a>00264 <a name="l00265"></a>00265 <span class="keywordflow">if</span> (dev == NULL) { <a name="l00266"></a>00266 <a class="code" href="stk11xx_8h.html#2548285f2eade14f8e93c9b611e622d7">STK_ERROR</a>(<span class="stringliteral">"Device not initialized !!!\n"</span>); <a name="l00267"></a>00267 BUG(); <a name="l00268"></a>00268 } <a name="l00269"></a>00269 <a name="l00270"></a>00270 <span class="keywordflow">if</span> (dev->vopen) { <a name="l00271"></a>00271 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"Device is busy, someone is using the device\n"</span>); <a name="l00272"></a>00272 <span class="keywordflow">return</span> -EBUSY; <a name="l00273"></a>00273 } <a name="l00274"></a>00274 <a name="l00275"></a>00275 mutex_lock(&dev->modlock); <a name="l00276"></a>00276 <a name="l00277"></a>00277 <span class="comment">// Allocate memory</span> <a name="l00278"></a>00278 err = <a class="code" href="stk11xx-buf_8c.html#a04b5e0d601d6e4bd6a5dd53579b9628" title="Allocate all ISOC buffers.">stk11xx_allocate_buffers</a>(dev); <a name="l00279"></a>00279 <a name="l00280"></a>00280 <span class="keywordflow">if</span> (err < 0) { <a name="l00281"></a>00281 <a class="code" href="stk11xx_8h.html#2548285f2eade14f8e93c9b611e622d7">STK_ERROR</a>(<span class="stringliteral">"Failed to allocate buffer memory !\n"</span>); <a name="l00282"></a>00282 mutex_unlock(&dev->modlock); <a name="l00283"></a>00283 <span class="keywordflow">return</span> err; <a name="l00284"></a>00284 } <a name="l00285"></a>00285 <a name="l00286"></a>00286 <span class="comment">// Reset buffers and parameters</span> <a name="l00287"></a>00287 <a class="code" href="stk11xx-buf_8c.html#0440ed10dc62dfbe7cec72e328dec04f" title="Reset all ISOC buffers.">stk11xx_reset_buffers</a>(dev); <a name="l00288"></a>00288 <a name="l00289"></a>00289 <span class="comment">// Settings</span> <a name="l00290"></a>00290 dev->error_status = 0; <a name="l00291"></a>00291 dev->visoc_errors = 0; <a name="l00292"></a>00292 dev->vframes_error = 0; <a name="l00293"></a>00293 dev->vframes_dumped = 0; <a name="l00294"></a>00294 dev->vsettings.hue = 0xffff; <a name="l00295"></a>00295 dev->vsettings.depth = 24; <a name="l00296"></a>00296 dev->vsettings.palette = STK11XX_PALETTE_BGR24; <a name="l00297"></a>00297 <a name="l00298"></a>00298 <span class="comment">// Select the resolution by default</span> <a name="l00299"></a>00299 <a class="code" href="stk11xx-v4l_8c.html#627028fbe327bdeb1589d74109e9ae77" title="Select a video mode.">v4l_stk11xx_select_video_mode</a>(dev, 640, 480); <a name="l00300"></a>00300 <a name="l00301"></a>00301 <span class="comment">// Initialize the device</span> <a name="l00302"></a>00302 <a class="code" href="stk11xx-dev_8c.html#e3ca760fb15d38628de5bfd1e43d6f29" title="This function initializes the device for the stream.">dev_stk11xx_init_camera</a>(dev); <a name="l00303"></a>00303 <a class="code" href="stk11xx-dev_8c.html#e978d7adfeabe3e7c31076fddee9a744" title="This function switchs on the camera.">dev_stk11xx_camera_on</a>(dev); <a name="l00304"></a>00304 <a class="code" href="stk11xx-dev_8c.html#5c487b95ff9a43ca810016c688052bfa" title="Reconfigure the camera before the stream.">dev_stk11xx_reconf_camera</a>(dev); <a name="l00305"></a>00305 <a name="l00306"></a>00306 <span class="comment">// Init Isoc and URB</span> <a name="l00307"></a>00307 err = <a class="code" href="stk11xx-usb_8c.html#e7d7590e86071e46320dc3238eb03ef8" title="Initilize an isochronous pipe.">usb_stk11xx_isoc_init</a>(dev); <a name="l00308"></a>00308 <a name="l00309"></a>00309 <span class="keywordflow">if</span> (err) { <a name="l00310"></a>00310 <a class="code" href="stk11xx_8h.html#2548285f2eade14f8e93c9b611e622d7">STK_ERROR</a>(<span class="stringliteral">"Failed to init ISOC stuff !\n"</span>); <a name="l00311"></a>00311 <a class="code" href="stk11xx-usb_8c.html#7d77d101c0b0a8bc6100dc6665f3c3f5" title="Clean-up all the ISOC buffers.">usb_stk11xx_isoc_cleanup</a>(dev); <a name="l00312"></a>00312 <a class="code" href="stk11xx-buf_8c.html#3bc8bb033fc9697ba1e8b42be11a6efe" title="Release all buffers.">stk11xx_free_buffers</a>(dev); <a name="l00313"></a>00313 mutex_unlock(&dev->modlock); <a name="l00314"></a>00314 <span class="keywordflow">return</span> err; <a name="l00315"></a>00315 } <a name="l00316"></a>00316 <a name="l00317"></a>00317 <span class="comment">// Start the video stream</span> <a name="l00318"></a>00318 <a class="code" href="stk11xx-dev_8c.html#b21443fb38d3de22db64c6d4435babbc" title="This function sets the device to start the stream.">dev_stk11xx_start_stream</a>(dev); <a name="l00319"></a>00319 <a name="l00320"></a>00320 <span class="comment">// Video settings</span> <a name="l00321"></a>00321 <a class="code" href="stk11xx-dev_8c.html#9421e6bf87f9bef9f468acfd60a11562" title="This function permits to modify the settings of the camera.">dev_stk11xx_camera_settings</a>(dev); <a name="l00322"></a>00322 <a name="l00323"></a>00323 <span class="comment">// Register interface on power management</span> <a name="l00324"></a>00324 <span class="comment">// usb_autopm_get_interface(dev->interface);</span> <a name="l00325"></a>00325 <a name="l00326"></a>00326 dev->vopen++; <a name="l00327"></a>00327 fp->private_data = vdev; <a name="l00328"></a>00328 <a name="l00329"></a>00329 mutex_unlock(&dev->modlock); <a name="l00330"></a>00330 <a name="l00331"></a>00331 <span class="keywordflow">return</span> 0; <a name="l00332"></a>00332 } <a name="l00333"></a>00333 <a name="l00334"></a>00334 <a name="l00344"></a><a class="code" href="stk11xx-v4l_8c.html#d19987ae823d30d119e857b2719a74f2">00344</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="stk11xx-v4l_8c.html#d19987ae823d30d119e857b2719a74f2" title="Release an opened file.">v4l_stk11xx_release</a>(<span class="keyword">struct</span> file *fp) <a name="l00345"></a>00345 { <a name="l00346"></a>00346 <span class="keyword">struct </span>usb_stk11xx *dev; <a name="l00347"></a>00347 <span class="keyword">struct </span>video_device *vdev; <a name="l00348"></a>00348 <a name="l00349"></a>00349 vdev = video_devdata(fp); <a name="l00350"></a>00350 dev = video_get_drvdata(video_devdata(fp)); <a name="l00351"></a>00351 <a name="l00352"></a>00352 <span class="keywordflow">if</span> (dev->vopen == 0) <a name="l00353"></a>00353 <a class="code" href="stk11xx_8h.html#2548285f2eade14f8e93c9b611e622d7">STK_ERROR</a>(<span class="stringliteral">"v4l_release called on closed device\n"</span>); <a name="l00354"></a>00354 <a name="l00355"></a>00355 <span class="comment">// Stop the video stream</span> <a name="l00356"></a>00356 <a class="code" href="stk11xx-dev_8c.html#939f02cad30ad386080f8024741237bd" title="This function sets the device to stop the stream.">dev_stk11xx_stop_stream</a>(dev); <a name="l00357"></a>00357 <a name="l00358"></a>00358 <span class="comment">// ISOC and URB cleanup</span> <a name="l00359"></a>00359 <a class="code" href="stk11xx-usb_8c.html#7d77d101c0b0a8bc6100dc6665f3c3f5" title="Clean-up all the ISOC buffers.">usb_stk11xx_isoc_cleanup</a>(dev); <a name="l00360"></a>00360 <a name="l00361"></a>00361 <span class="comment">// Free memory</span> <a name="l00362"></a>00362 <a class="code" href="stk11xx-buf_8c.html#3bc8bb033fc9697ba1e8b42be11a6efe" title="Release all buffers.">stk11xx_free_buffers</a>(dev); <a name="l00363"></a>00363 <a name="l00364"></a>00364 <span class="comment">// Switch off the camera</span> <a name="l00365"></a>00365 <a class="code" href="stk11xx-dev_8c.html#865eb05993bb42c88ce5c73fb39b210d" title="This function switchs off the camera.">dev_stk11xx_camera_off</a>(dev); <a name="l00366"></a>00366 <a name="l00367"></a>00367 <a class="code" href="stk11xx-dev_8c.html#33117e9ffbc424c68d29dad93f6675c2" title="Wake-up the camera.">dev_stk11xx_camera_asleep</a>(dev); <a name="l00368"></a>00368 <a name="l00369"></a>00369 <span class="comment">// Unregister interface on power management</span> <a name="l00370"></a>00370 <span class="comment">// usb_autopm_put_interface(dev->interface);</span> <a name="l00371"></a>00371 <a name="l00372"></a>00372 dev->vopen--; <a name="l00373"></a>00373 <a name="l00374"></a>00374 <span class="keywordflow">return</span> 0; <a name="l00375"></a>00375 } <a name="l00376"></a>00376 <a name="l00377"></a>00377 <a name="l00391"></a><a class="code" href="stk11xx-v4l_8c.html#e125a26fc4f36a4b64418acb87b958a4">00391</a> <span class="keyword">static</span> ssize_t <a class="code" href="stk11xx-v4l_8c.html#e125a26fc4f36a4b64418acb87b958a4" title="Read the video device.">v4l_stk11xx_read</a>(<span class="keyword">struct</span> file *fp, <span class="keywordtype">char</span> __user *buf, <a name="l00392"></a>00392 <span class="keywordtype">size_t</span> count, loff_t *f_pos) <a name="l00393"></a>00393 { <a name="l00394"></a>00394 <span class="keywordtype">int</span> noblock = fp->f_flags & O_NONBLOCK; <a name="l00395"></a>00395 <a name="l00396"></a>00396 <span class="keyword">struct </span>usb_stk11xx *dev; <a name="l00397"></a>00397 <span class="keyword">struct </span>video_device *vdev; <a name="l00398"></a>00398 <a name="l00399"></a>00399 <span class="keywordtype">int</span> bytes_to_read; <a name="l00400"></a>00400 <span class="keywordtype">void</span> *image_buffer_addr; <a name="l00401"></a>00401 <a name="l00402"></a>00402 DECLARE_WAITQUEUE(wait, current); <a name="l00403"></a>00403 <a name="l00404"></a>00404 vdev = video_devdata(fp); <a name="l00405"></a>00405 dev = video_get_drvdata(video_devdata(fp)); <a name="l00406"></a>00406 <a name="l00407"></a>00407 <a class="code" href="stk11xx_8h.html#649dee4d247234a95351c9d56205623b">STK_STREAM</a>(<span class="stringliteral">"Read vdev=0x%p, buf=0x%p, count=%zd\n"</span>, vdev, buf, count); <a name="l00408"></a>00408 <a name="l00409"></a>00409 <span class="keywordflow">if</span> (dev == NULL) <a name="l00410"></a>00410 <span class="keywordflow">return</span> -EFAULT; <a name="l00411"></a>00411 <a name="l00412"></a>00412 <span class="keywordflow">if</span> (vdev == NULL) <a name="l00413"></a>00413 <span class="keywordflow">return</span> -EFAULT; <a name="l00414"></a>00414 <a name="l00415"></a>00415 mutex_lock(&dev->modlock); <a name="l00416"></a>00416 <a name="l00417"></a>00417 <span class="keywordflow">if</span> (dev->image_read_pos == 0) { <a name="l00418"></a>00418 add_wait_queue(&dev->wait_frame, &wait); <a name="l00419"></a>00419 <a name="l00420"></a>00420 <span class="keywordflow">while</span> (dev->full_frames == NULL) { <a name="l00421"></a>00421 <span class="keywordflow">if</span> (dev->error_status) { <a name="l00422"></a>00422 remove_wait_queue(&dev->wait_frame, &wait); <a name="l00423"></a>00423 set_current_state(TASK_RUNNING); <a name="l00424"></a>00424 mutex_unlock(&dev->modlock); <a name="l00425"></a>00425 <span class="keywordflow">return</span> -dev->error_status ; <a name="l00426"></a>00426 } <a name="l00427"></a>00427 <a name="l00428"></a>00428 <span class="keywordflow">if</span> (noblock) { <a name="l00429"></a>00429 remove_wait_queue(&dev->wait_frame, &wait); <a name="l00430"></a>00430 set_current_state(TASK_RUNNING); <a name="l00431"></a>00431 mutex_unlock(&dev->modlock); <a name="l00432"></a>00432 <span class="keywordflow">return</span> -EWOULDBLOCK; <a name="l00433"></a>00433 } <a name="l00434"></a>00434 <a name="l00435"></a>00435 <span class="keywordflow">if</span> (signal_pending(current)) { <a name="l00436"></a>00436 remove_wait_queue(&dev->wait_frame, &wait); <a name="l00437"></a>00437 set_current_state(TASK_RUNNING); <a name="l00438"></a>00438 mutex_unlock(&dev->modlock); <a name="l00439"></a>00439 <span class="keywordflow">return</span> -ERESTARTSYS; <a name="l00440"></a>00440 } <a name="l00441"></a>00441 <a name="l00442"></a>00442 schedule(); <a name="l00443"></a>00443 set_current_state(TASK_INTERRUPTIBLE); <a name="l00444"></a>00444 } <a name="l00445"></a>00445 <a name="l00446"></a>00446 remove_wait_queue(&dev->wait_frame, &wait); <a name="l00447"></a>00447 set_current_state(TASK_RUNNING); <a name="l00448"></a>00448 <a name="l00449"></a>00449 <span class="keywordflow">if</span> (<a class="code" href="stk11xx-buf_8c.html#21bfe8791f1f53fcd64a185dc6fdc686" title="Handler frame.">stk11xx_handle_frame</a>(dev)) { <a name="l00450"></a>00450 mutex_unlock(&dev->modlock); <a name="l00451"></a>00451 <span class="keywordflow">return</span> -EFAULT; <a name="l00452"></a>00452 } <a name="l00453"></a>00453 } <a name="l00454"></a>00454 <a name="l00455"></a>00455 bytes_to_read = dev->view_size; <a name="l00456"></a>00456 <a name="l00457"></a>00457 <span class="keywordflow">if</span> (count + dev->image_read_pos > bytes_to_read) <a name="l00458"></a>00458 count = bytes_to_read - dev->image_read_pos; <a name="l00459"></a>00459 <a name="l00460"></a>00460 image_buffer_addr = dev->image_data; <a name="l00461"></a>00461 image_buffer_addr += dev->images[dev->fill_image].offset; <a name="l00462"></a>00462 image_buffer_addr += dev->image_read_pos; <a name="l00463"></a>00463 <a name="l00464"></a>00464 <span class="keywordflow">if</span> (copy_to_user(buf, image_buffer_addr, count)) { <a name="l00465"></a>00465 mutex_unlock(&dev->modlock); <a name="l00466"></a>00466 <span class="keywordflow">return</span> -EFAULT; <a name="l00467"></a>00467 } <a name="l00468"></a>00468 <a name="l00469"></a>00469 dev->image_read_pos += count; <a name="l00470"></a>00470 <a name="l00471"></a>00471 <span class="keywordflow">if</span> (dev->image_read_pos >= bytes_to_read) { <a name="l00472"></a>00472 dev->image_read_pos = 0; <a name="l00473"></a>00473 <a class="code" href="stk11xx-buf_8c.html#5805bf7c1173f7f6063c1c5934c73e1b" title="Prepare the next image.">stk11xx_next_image</a>(dev); <a name="l00474"></a>00474 } <a name="l00475"></a>00475 <a name="l00476"></a>00476 mutex_unlock(&dev->modlock); <a name="l00477"></a>00477 <a name="l00478"></a>00478 <span class="keywordflow">return</span> count; <a name="l00479"></a>00479 } <a name="l00480"></a>00480 <a name="l00481"></a>00481 <a name="l00490"></a><a class="code" href="stk11xx-v4l_8c.html#159e3f9cb0b7adb3d1b9e64298d2b42b">00490</a> <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="stk11xx-v4l_8c.html#159e3f9cb0b7adb3d1b9e64298d2b42b" title="Polling function.">v4l_stk11xx_poll</a>(<span class="keyword">struct</span> file *fp, poll_table *wait) <a name="l00491"></a>00491 { <a name="l00492"></a>00492 <span class="keyword">struct </span>usb_stk11xx *dev; <a name="l00493"></a>00493 <span class="keyword">struct </span>video_device *vdev; <a name="l00494"></a>00494 <a name="l00495"></a>00495 vdev = video_devdata(fp); <a name="l00496"></a>00496 dev = video_get_drvdata(video_devdata(fp)); <a name="l00497"></a>00497 <a name="l00498"></a>00498 <a class="code" href="stk11xx_8h.html#649dee4d247234a95351c9d56205623b">STK_STREAM</a>(<span class="stringliteral">"Poll\n"</span>); <a name="l00499"></a>00499 <a name="l00500"></a>00500 <span class="keywordflow">if</span> (vdev == NULL) <a name="l00501"></a>00501 <span class="keywordflow">return</span> -EFAULT; <a name="l00502"></a>00502 <a name="l00503"></a>00503 <span class="keywordflow">if</span> (dev == NULL) <a name="l00504"></a>00504 <span class="keywordflow">return</span> -EFAULT; <a name="l00505"></a>00505 <a name="l00506"></a>00506 poll_wait(fp, &dev->wait_frame, wait); <a name="l00507"></a>00507 <a name="l00508"></a>00508 <span class="keywordflow">if</span> (dev->error_status) <a name="l00509"></a>00509 <span class="keywordflow">return</span> POLLERR; <a name="l00510"></a>00510 <a name="l00511"></a>00511 <span class="keywordflow">if</span> (dev->full_frames != NULL) <a name="l00512"></a>00512 <span class="keywordflow">return</span> (POLLIN | POLLRDNORM); <a name="l00513"></a>00513 <a name="l00514"></a>00514 <span class="keywordflow">return</span> 0; <a name="l00515"></a>00515 } <a name="l00516"></a>00516 <a name="l00517"></a>00517 <a name="l00528"></a><a class="code" href="stk11xx-v4l_8c.html#1baaafe560fe7466c7062aacd02aff8c">00528</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="stk11xx-v4l_8c.html#1baaafe560fe7466c7062aacd02aff8c" title="Memory map.">v4l_stk11xx_mmap</a>(<span class="keyword">struct</span> file *fp, <span class="keyword">struct</span> vm_area_struct *vma) <a name="l00529"></a>00529 { <a name="l00530"></a>00530 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i; <a name="l00531"></a>00531 <a name="l00532"></a>00532 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> size; <a name="l00533"></a>00533 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> start; <a name="l00534"></a>00534 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> pos; <a name="l00535"></a>00535 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> page; <a name="l00536"></a>00536 <a name="l00537"></a>00537 <span class="keyword">struct </span>usb_stk11xx *dev; <a name="l00538"></a>00538 <a name="l00539"></a>00539 <span class="keyword">struct </span>video_device *vdev; <a name="l00540"></a>00540 <a name="l00541"></a>00541 vdev = video_devdata(fp); <a name="l00542"></a>00542 dev = video_get_drvdata(video_devdata(fp)); <a name="l00543"></a>00543 <a name="l00544"></a>00544 <a class="code" href="stk11xx_8h.html#649dee4d247234a95351c9d56205623b">STK_STREAM</a>(<span class="stringliteral">"mmap\n"</span>); <a name="l00545"></a>00545 <a name="l00546"></a>00546 start = vma->vm_start; <a name="l00547"></a>00547 size = vma->vm_end - vma->vm_start; <a name="l00548"></a>00548 <a name="l00549"></a>00549 <span class="comment">// Find the buffer for this mapping...</span> <a name="l00550"></a>00550 <span class="keywordflow">for</span> (i=0; i<dev->nbuffers; i++) { <a name="l00551"></a>00551 pos = dev->images[i].offset; <a name="l00552"></a>00552 <a name="l00553"></a>00553 <span class="keywordflow">if</span> ((pos >> PAGE_SHIFT) == vma->vm_pgoff) <a name="l00554"></a>00554 <span class="keywordflow">break</span>; <a name="l00555"></a>00555 } <a name="l00556"></a>00556 <a name="l00557"></a>00557 <span class="comment">// If no buffer found !</span> <a name="l00558"></a>00558 <span class="keywordflow">if</span> (i == <a class="code" href="stk11xx_8h.html#aece77d67ce4d8f6c8e27269d33c9d89">STK11XX_MAX_IMAGES</a>) { <a name="l00559"></a>00559 <a class="code" href="stk11xx_8h.html#2548285f2eade14f8e93c9b611e622d7">STK_ERROR</a>(<span class="stringliteral">"mmap no buffer found !\n"</span>); <a name="l00560"></a>00560 <span class="keywordflow">return</span> -EINVAL; <a name="l00561"></a>00561 } <a name="l00562"></a>00562 <a name="l00563"></a>00563 <span class="keywordflow">if</span> (i == 0) { <a name="l00564"></a>00564 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> total_size; <a name="l00565"></a>00565 <a name="l00566"></a>00566 total_size = dev->nbuffers * dev->len_per_image; <a name="l00567"></a>00567 <a name="l00568"></a>00568 <span class="keywordflow">if</span> (size != dev->len_per_image && size != total_size) { <a name="l00569"></a>00569 <a class="code" href="stk11xx_8h.html#2548285f2eade14f8e93c9b611e622d7">STK_ERROR</a>(<span class="stringliteral">"Wrong size (%lu) needed to be len_per_image=%d or total_size=%lu\n"</span>, <a name="l00570"></a>00570 size, dev->len_per_image, total_size); <a name="l00571"></a>00571 <a name="l00572"></a>00572 <span class="keywordflow">return</span> -EINVAL; <a name="l00573"></a>00573 } <a name="l00574"></a>00574 } <a name="l00575"></a>00575 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (size > dev->len_per_image) <a name="l00576"></a>00576 <span class="keywordflow">return</span> -EINVAL; <a name="l00577"></a>00577 <a name="l00578"></a>00578 vma->vm_flags |= VM_IO; <a name="l00579"></a>00579 <a name="l00580"></a>00580 pos = (<span class="keywordtype">unsigned</span> long) dev->image_data; <a name="l00581"></a>00581 <a name="l00582"></a>00582 while (size > 0) { <a name="l00583"></a>00583 page = vmalloc_to_pfn((<span class="keywordtype">void</span> *) pos); <a name="l00584"></a>00584 <a name="l00585"></a>00585 <span class="keywordflow">if</span> (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED)) <a name="l00586"></a>00586 <span class="keywordflow">return</span> -EAGAIN; <a name="l00587"></a>00587 <a name="l00588"></a>00588 start += PAGE_SIZE; <a name="l00589"></a>00589 pos += PAGE_SIZE; <a name="l00590"></a>00590 <a name="l00591"></a>00591 <span class="keywordflow">if</span> (size > PAGE_SIZE) <a name="l00592"></a>00592 size -= PAGE_SIZE; <a name="l00593"></a>00593 <span class="keywordflow">else</span> <a name="l00594"></a>00594 size = 0; <a name="l00595"></a>00595 } <a name="l00596"></a>00596 <a name="l00597"></a>00597 <span class="keywordflow">return</span> 0; <a name="l00598"></a>00598 } <a name="l00599"></a>00599 <a name="l00600"></a>00600 <a name="l00612"></a><a class="code" href="stk11xx-v4l_8c.html#d0d6bb014a12b34811e18f02002b3c81">00612</a> <span class="keyword">static</span> <span class="keywordtype">long</span> <a class="code" href="stk11xx-v4l_8c.html#d0d6bb014a12b34811e18f02002b3c81" title="Manage IOCTL.">v4l_stk11xx_do_ioctl</a>(<span class="keyword">struct</span> file *fp, <a name="l00613"></a>00613 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> cmd, <span class="keywordtype">void</span> __user *arg) <a name="l00614"></a>00614 { <a name="l00615"></a>00615 <span class="keyword">struct </span>usb_stk11xx *dev; <a name="l00616"></a>00616 <span class="keyword">struct </span>video_device *vdev; <a name="l00617"></a>00617 <a name="l00618"></a>00618 DECLARE_WAITQUEUE(wait, current); <a name="l00619"></a>00619 <a name="l00620"></a>00620 vdev = video_devdata(fp); <a name="l00621"></a>00621 dev = video_get_drvdata(video_devdata(fp)); <a name="l00622"></a>00622 <a name="l00623"></a>00623 <span class="preprocessor">#if (CONFIG_STK11XX_DEBUG == 1)</span> <a name="l00624"></a>00624 <span class="preprocessor"></span> v4l_printk_ioctl(cmd); <a name="l00625"></a>00625 <span class="preprocessor">#endif</span> <a name="l00626"></a>00626 <span class="preprocessor"></span> <a name="l00627"></a>00627 <span class="keywordflow">switch</span> (cmd) { <a name="l00628"></a>00628 <span class="comment">// Video 4 Linux v1</span> <a name="l00629"></a>00629 <a name="l00630"></a>00630 <span class="keywordflow">case</span> VIDIOCGCAP: <a name="l00631"></a>00631 { <a name="l00632"></a>00632 <span class="keyword">struct </span>video_capability *cap = arg; <a name="l00633"></a>00633 <a name="l00634"></a>00634 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"VIDIOCGCAP\n"</span>); <a name="l00635"></a>00635 <a name="l00636"></a>00636 memset(cap, 0, <span class="keyword">sizeof</span>(*cap)); <a name="l00637"></a>00637 strlcpy(cap->name, <span class="stringliteral">"stk11xx"</span>, <span class="keyword">sizeof</span>(cap->name)); <a name="l00638"></a>00638 cap->type = VID_TYPE_CAPTURE; <a name="l00639"></a>00639 cap->channels = 1; <a name="l00640"></a>00640 cap->audios = 0; <a name="l00641"></a>00641 <a name="l00642"></a>00642 <span class="keywordflow">switch</span> (dev->webcam_type) { <a name="l00643"></a>00643 <span class="keywordflow">case</span> <a class="code" href="stk11xx_8h.html#5400cbd98f5ec8f3d24ec55313e274f13f5de5bc8e126ddba84831bfdf8fdaa8">STK11XX_SXGA</a>: <a name="l00644"></a>00644 cap->minwidth = <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_80x60].x; <a name="l00645"></a>00645 cap->minheight = <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_80x60].y; <a name="l00646"></a>00646 cap->maxwidth = <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_1280x1024].x; <a name="l00647"></a>00647 cap->maxheight = <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_1280x1024].y; <a name="l00648"></a>00648 <span class="keywordflow">break</span>; <a name="l00649"></a>00649 <a name="l00650"></a>00650 <span class="keywordflow">case</span> <a class="code" href="stk11xx_8h.html#5400cbd98f5ec8f3d24ec55313e274f1896c4ee082ee0fa3eed44795b4a78e9e">STK11XX_VGA</a>: <a name="l00651"></a>00651 cap->minwidth = <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_80x60].x; <a name="l00652"></a>00652 cap->minheight = <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_80x60].y; <a name="l00653"></a>00653 cap->maxwidth = <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_640x480].x; <a name="l00654"></a>00654 cap->maxheight = <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_640x480].y; <a name="l00655"></a>00655 <span class="keywordflow">break</span>; <a name="l00656"></a>00656 } <a name="l00657"></a>00657 } <a name="l00658"></a>00658 <span class="keywordflow">break</span>; <a name="l00659"></a>00659 <a name="l00660"></a>00660 <span class="keywordflow">case</span> VIDIOCGCHAN: <a name="l00661"></a>00661 { <a name="l00662"></a>00662 <span class="keyword">struct </span>video_channel *v = arg; <a name="l00663"></a>00663 <a name="l00664"></a>00664 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"VIDIOCGCHAN\n"</span>); <a name="l00665"></a>00665 <a name="l00666"></a>00666 <span class="keywordflow">if</span> (v->channel != 0) <a name="l00667"></a>00667 <span class="keywordflow">return</span> -EINVAL; <a name="l00668"></a>00668 <a name="l00669"></a>00669 v->flags = 0; <a name="l00670"></a>00670 v->tuners = 0; <a name="l00671"></a>00671 v->type = VIDEO_TYPE_CAMERA; <a name="l00672"></a>00672 strcpy(v->name, <span class="stringliteral">"Webcam"</span>); <a name="l00673"></a>00673 } <a name="l00674"></a>00674 <span class="keywordflow">break</span>; <a name="l00675"></a>00675 <a name="l00676"></a>00676 <span class="keywordflow">case</span> VIDIOCSCHAN: <a name="l00677"></a>00677 { <a name="l00678"></a>00678 <span class="keyword">struct </span>video_channel *v = arg; <a name="l00679"></a>00679 <a name="l00680"></a>00680 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"VIDIOCSCHAN\n"</span>); <a name="l00681"></a>00681 <a name="l00682"></a>00682 <span class="keywordflow">if</span> (v->channel != 0) <a name="l00683"></a>00683 <span class="keywordflow">return</span> -EINVAL; <a name="l00684"></a>00684 } <a name="l00685"></a>00685 <span class="keywordflow">break</span>; <a name="l00686"></a>00686 <a name="l00687"></a>00687 <span class="keywordflow">case</span> VIDIOCGPICT: <a name="l00688"></a>00688 { <a name="l00689"></a>00689 <span class="keyword">struct </span>video_picture *p = arg; <a name="l00690"></a>00690 <a name="l00691"></a>00691 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"VIDIOCGPICT\n"</span>); <a name="l00692"></a>00692 <a name="l00693"></a>00693 p->brightness = dev->vsettings.brightness; <a name="l00694"></a>00694 p->contrast = dev->vsettings.contrast; <a name="l00695"></a>00695 p->whiteness = dev->vsettings.whiteness; <a name="l00696"></a>00696 p->colour = dev->vsettings.colour; <a name="l00697"></a>00697 p->depth = dev->vsettings.depth; <a name="l00698"></a>00698 p->palette = dev->vsettings.palette; <a name="l00699"></a>00699 p->hue = dev->vsettings.hue; <a name="l00700"></a>00700 <a name="l00701"></a>00701 <span class="keywordflow">switch</span> (dev->vsettings.palette) { <a name="l00702"></a>00702 <span class="keywordflow">case</span> STK11XX_PALETTE_BGR24: <a name="l00703"></a>00703 p->palette = VIDEO_PALETTE_RGB24; <a name="l00704"></a>00704 <span class="keywordflow">break</span>; <a name="l00705"></a>00705 <a name="l00706"></a>00706 <span class="keywordflow">case</span> STK11XX_PALETTE_BGR32: <a name="l00707"></a>00707 p->palette = VIDEO_PALETTE_RGB32; <a name="l00708"></a>00708 <span class="keywordflow">break</span>; <a name="l00709"></a>00709 <a name="l00710"></a>00710 <span class="keywordflow">case</span> STK11XX_PALETTE_UYVY: <a name="l00711"></a>00711 p->palette = VIDEO_PALETTE_UYVY; <a name="l00712"></a>00712 <span class="keywordflow">break</span>; <a name="l00713"></a>00713 <a name="l00714"></a>00714 <span class="keywordflow">case</span> STK11XX_PALETTE_YUYV: <a name="l00715"></a>00715 p->palette = VIDEO_PALETTE_YUYV; <a name="l00716"></a>00716 <span class="keywordflow">break</span>; <a name="l00717"></a>00717 } <a name="l00718"></a>00718 } <a name="l00719"></a>00719 <span class="keywordflow">break</span>; <a name="l00720"></a>00720 <a name="l00721"></a>00721 <span class="keywordflow">case</span> VIDIOCSPICT: <a name="l00722"></a>00722 { <a name="l00723"></a>00723 <span class="keyword">struct </span>video_picture *p = arg; <a name="l00724"></a>00724 <a name="l00725"></a>00725 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"VIDIOCSPICT\n"</span>); <a name="l00726"></a>00726 <a name="l00727"></a>00727 dev->vsettings.brightness = p->brightness; <a name="l00728"></a>00728 dev->vsettings.contrast = p->contrast; <a name="l00729"></a>00729 dev->vsettings.whiteness = p->whiteness; <a name="l00730"></a>00730 dev->vsettings.colour = p->colour; <a name="l00731"></a>00731 dev->vsettings.hue = p->hue; <a name="l00732"></a>00732 <a name="l00733"></a>00733 <span class="keywordflow">if</span> (p->palette && p->palette != dev->vsettings.palette) { <a name="l00734"></a>00734 <span class="keywordflow">switch</span> (p->palette) { <a name="l00735"></a>00735 <span class="keywordflow">case</span> VIDEO_PALETTE_RGB24: <a name="l00736"></a>00736 dev->vsettings.depth = 24; <a name="l00737"></a>00737 dev->vsettings.palette = STK11XX_PALETTE_BGR24; <a name="l00738"></a>00738 <span class="keywordflow">break</span>; <a name="l00739"></a>00739 <a name="l00740"></a>00740 <span class="keywordflow">case</span> VIDEO_PALETTE_RGB32: <a name="l00741"></a>00741 dev->vsettings.depth = 32; <a name="l00742"></a>00742 dev->vsettings.palette = STK11XX_PALETTE_BGR32; <a name="l00743"></a>00743 <span class="keywordflow">break</span>; <a name="l00744"></a>00744 <a name="l00745"></a>00745 <span class="keywordflow">case</span> VIDEO_PALETTE_UYVY: <a name="l00746"></a>00746 dev->vsettings.depth = 16; <a name="l00747"></a>00747 dev->vsettings.palette = STK11XX_PALETTE_UYVY; <a name="l00748"></a>00748 <span class="keywordflow">break</span>; <a name="l00749"></a>00749 <a name="l00750"></a>00750 <span class="keywordflow">case</span> VIDEO_PALETTE_YUYV: <a name="l00751"></a>00751 dev->vsettings.depth = 16; <a name="l00752"></a>00752 dev->vsettings.palette = STK11XX_PALETTE_YUYV; <a name="l00753"></a>00753 <span class="keywordflow">break</span>; <a name="l00754"></a>00754 <a name="l00755"></a>00755 <span class="keywordflow">default</span>: <a name="l00756"></a>00756 <span class="keywordflow">return</span> -EINVAL; <a name="l00757"></a>00757 } <a name="l00758"></a>00758 } <a name="l00759"></a>00759 <a name="l00760"></a>00760 <a class="code" href="stk11xx-dev_8c.html#9421e6bf87f9bef9f468acfd60a11562" title="This function permits to modify the settings of the camera.">dev_stk11xx_camera_settings</a>(dev); <a name="l00761"></a>00761 <a name="l00762"></a>00762 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"VIDIOCSPICT done\n"</span>); <a name="l00763"></a>00763 } <a name="l00764"></a>00764 <span class="keywordflow">break</span>; <a name="l00765"></a>00765 <a name="l00766"></a>00766 <span class="keywordflow">case</span> VIDIOCGWIN: <a name="l00767"></a>00767 { <a name="l00768"></a>00768 <span class="keyword">struct </span>video_window *vw = arg; <a name="l00769"></a>00769 <a name="l00770"></a>00770 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"VIDIOCGWIN\n"</span>); <a name="l00771"></a>00771 <a name="l00772"></a>00772 vw->x = 0; <a name="l00773"></a>00773 vw->y = 0; <a name="l00774"></a>00774 vw->width = dev->view.x; <a name="l00775"></a>00775 vw->height = dev->view.y; <a name="l00776"></a>00776 vw->chromakey = 0; <a name="l00777"></a>00777 } <a name="l00778"></a>00778 <span class="keywordflow">break</span>; <a name="l00779"></a>00779 <a name="l00780"></a>00780 <span class="keywordflow">case</span> VIDIOCSWIN: <a name="l00781"></a>00781 { <a name="l00782"></a>00782 <span class="keyword">struct </span>video_window *vw = arg; <a name="l00783"></a>00783 <a name="l00784"></a>00784 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"VIDIOCSWIN\n"</span>); <a name="l00785"></a>00785 <a name="l00786"></a>00786 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"Set x=%d, y=%d\n"</span>, vw->x, vw->y); <a name="l00787"></a>00787 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"Set width=%d, height=%d\n"</span>, vw->width, vw->height); <a name="l00788"></a>00788 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"Flags = %X\n"</span>, vw->flags); <a name="l00789"></a>00789 <a name="l00790"></a>00790 <span class="comment">// Stop the video stream</span> <a name="l00791"></a>00791 <a class="code" href="stk11xx-dev_8c.html#939f02cad30ad386080f8024741237bd" title="This function sets the device to stop the stream.">dev_stk11xx_stop_stream</a>(dev); <a name="l00792"></a>00792 <a name="l00793"></a>00793 <span class="comment">// ISOC and URB cleanup</span> <a name="l00794"></a>00794 <a class="code" href="stk11xx-usb_8c.html#7d77d101c0b0a8bc6100dc6665f3c3f5" title="Clean-up all the ISOC buffers.">usb_stk11xx_isoc_cleanup</a>(dev); <a name="l00795"></a>00795 <a name="l00796"></a>00796 <span class="comment">// Switch off the camera</span> <a name="l00797"></a>00797 <a class="code" href="stk11xx-dev_8c.html#865eb05993bb42c88ce5c73fb39b210d" title="This function switchs off the camera.">dev_stk11xx_camera_off</a>(dev); <a name="l00798"></a>00798 <a name="l00799"></a>00799 <a class="code" href="stk11xx-dev_8c.html#33117e9ffbc424c68d29dad93f6675c2" title="Wake-up the camera.">dev_stk11xx_camera_asleep</a>(dev); <a name="l00800"></a>00800 <a name="l00801"></a>00801 <span class="comment">// Select the new video mode</span> <a name="l00802"></a>00802 <span class="keywordflow">if</span> (<a class="code" href="stk11xx-v4l_8c.html#627028fbe327bdeb1589d74109e9ae77" title="Select a video mode.">v4l_stk11xx_select_video_mode</a>(dev, vw->width, vw->height)) { <a name="l00803"></a>00803 <a class="code" href="stk11xx_8h.html#2548285f2eade14f8e93c9b611e622d7">STK_ERROR</a>(<span class="stringliteral">"Select video mode failed !\n"</span>); <a name="l00804"></a>00804 <span class="keywordflow">return</span> -EAGAIN; <a name="l00805"></a>00805 } <a name="l00806"></a>00806 <a name="l00807"></a>00807 <span class="comment">// Clear the buffers</span> <a name="l00808"></a>00808 <a class="code" href="stk11xx-buf_8c.html#cd7e46aba32bcbb5d429b21878d44845" title="Clear current buffers.">stk11xx_clear_buffers</a>(dev); <a name="l00809"></a>00809 <a name="l00810"></a>00810 <span class="comment">// Initialize the device</span> <a name="l00811"></a>00811 <a class="code" href="stk11xx-dev_8c.html#e3ca760fb15d38628de5bfd1e43d6f29" title="This function initializes the device for the stream.">dev_stk11xx_init_camera</a>(dev); <a name="l00812"></a>00812 <a class="code" href="stk11xx-dev_8c.html#e978d7adfeabe3e7c31076fddee9a744" title="This function switchs on the camera.">dev_stk11xx_camera_on</a>(dev); <a name="l00813"></a>00813 <a class="code" href="stk11xx-dev_8c.html#5c487b95ff9a43ca810016c688052bfa" title="Reconfigure the camera before the stream.">dev_stk11xx_reconf_camera</a>(dev); <a name="l00814"></a>00814 <a name="l00815"></a>00815 <span class="comment">// ISOC and URB init</span> <a name="l00816"></a>00816 <a class="code" href="stk11xx-usb_8c.html#e7d7590e86071e46320dc3238eb03ef8" title="Initilize an isochronous pipe.">usb_stk11xx_isoc_init</a>(dev); <a name="l00817"></a>00817 <a name="l00818"></a>00818 <span class="comment">// Re-start the stream</span> <a name="l00819"></a>00819 <a class="code" href="stk11xx-dev_8c.html#b21443fb38d3de22db64c6d4435babbc" title="This function sets the device to start the stream.">dev_stk11xx_start_stream</a>(dev); <a name="l00820"></a>00820 <a name="l00821"></a>00821 <span class="comment">// Video settings</span> <a name="l00822"></a>00822 <a class="code" href="stk11xx-dev_8c.html#9421e6bf87f9bef9f468acfd60a11562" title="This function permits to modify the settings of the camera.">dev_stk11xx_camera_settings</a>(dev); <a name="l00823"></a>00823 } <a name="l00824"></a>00824 <span class="keywordflow">break</span>; <a name="l00825"></a>00825 <a name="l00826"></a>00826 <span class="keywordflow">case</span> VIDIOCGFBUF: <a name="l00827"></a>00827 { <a name="l00828"></a>00828 <span class="keyword">struct </span>video_buffer *vb = arg; <a name="l00829"></a>00829 <a name="l00830"></a>00830 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"VIDIOCGFBUF\n"</span>); <a name="l00831"></a>00831 <a name="l00832"></a>00832 memset(vb, 0, <span class="keyword">sizeof</span>(*vb)); <a name="l00833"></a>00833 } <a name="l00834"></a>00834 <span class="keywordflow">break</span>; <a name="l00835"></a>00835 <a name="l00836"></a>00836 <span class="keywordflow">case</span> VIDIOCGMBUF: <a name="l00837"></a>00837 { <a name="l00838"></a>00838 <span class="keywordtype">int</span> i; <a name="l00839"></a>00839 <span class="keyword">struct </span>video_mbuf *vm = arg; <a name="l00840"></a>00840 <a name="l00841"></a>00841 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"VIDIOCGMBUF\n"</span>); <a name="l00842"></a>00842 <a name="l00843"></a>00843 memset(vm, 0, <span class="keyword">sizeof</span>(*vm)); <a name="l00844"></a>00844 <a name="l00845"></a>00845 vm->size = dev->nbuffers * dev->len_per_image; <a name="l00846"></a>00846 vm->frames = dev->nbuffers; <a name="l00847"></a>00847 <a name="l00848"></a>00848 <span class="keywordflow">for</span> (i=0; i<dev->nbuffers; i++) <a name="l00849"></a>00849 vm->offsets[i] = i * dev->len_per_image; <a name="l00850"></a>00850 } <a name="l00851"></a>00851 <span class="keywordflow">break</span>; <a name="l00852"></a>00852 <a name="l00853"></a>00853 <span class="keywordflow">case</span> VIDIOCMCAPTURE: <a name="l00854"></a>00854 { <a name="l00855"></a>00855 <span class="keyword">struct </span>video_mmap *vm = arg; <a name="l00856"></a>00856 <a name="l00857"></a>00857 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"VIDIOCMCAPTURE format=%d\n"</span>, vm->format); <a name="l00858"></a>00858 <a name="l00859"></a>00859 <span class="keywordflow">if</span> (vm->frame < 0 || vm->frame >= dev->nbuffers) <a name="l00860"></a>00860 <span class="keywordflow">return</span> -EINVAL; <a name="l00861"></a>00861 <a name="l00862"></a>00862 <span class="keywordflow">if</span> (vm->format) { <a name="l00863"></a>00863 <span class="keywordflow">switch</span> (vm->format) { <a name="l00864"></a>00864 <span class="keywordflow">case</span> VIDEO_PALETTE_RGB32: <a name="l00865"></a>00865 <span class="keywordflow">break</span>; <a name="l00866"></a>00866 <a name="l00867"></a>00867 <span class="keywordflow">case</span> VIDEO_PALETTE_RGB24: <a name="l00868"></a>00868 <span class="keywordflow">break</span>; <a name="l00869"></a>00869 <a name="l00870"></a>00870 <span class="keywordflow">case</span> VIDEO_PALETTE_UYVY: <a name="l00871"></a>00871 <span class="keywordflow">break</span>; <a name="l00872"></a>00872 <a name="l00873"></a>00873 <span class="keywordflow">case</span> VIDEO_PALETTE_YUYV: <a name="l00874"></a>00874 <span class="keywordflow">break</span>; <a name="l00875"></a>00875 <a name="l00876"></a>00876 <span class="keywordflow">default</span>: <a name="l00877"></a>00877 <span class="keywordflow">return</span> -EINVAL; <a name="l00878"></a>00878 } <a name="l00879"></a>00879 } <a name="l00880"></a>00880 <a name="l00881"></a>00881 <span class="keywordflow">if</span> ((vm->width != dev->view.x) || (vm->height != dev->view.y)) <a name="l00882"></a>00882 <span class="keywordflow">return</span> -EAGAIN; <a name="l00883"></a>00883 <a name="l00884"></a>00884 <span class="keywordflow">if</span> (dev->image_used[vm->frame]) <a name="l00885"></a>00885 <span class="keywordflow">return</span> -EBUSY; <a name="l00886"></a>00886 <a name="l00887"></a>00887 dev->image_used[vm->frame] = 1; <a name="l00888"></a>00888 <a name="l00889"></a>00889 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"VIDIOCMCAPTURE done\n"</span>); <a name="l00890"></a>00890 } <a name="l00891"></a>00891 <span class="keywordflow">break</span>; <a name="l00892"></a>00892 <a name="l00893"></a>00893 <span class="keywordflow">case</span> VIDIOCSYNC: <a name="l00894"></a>00894 { <a name="l00895"></a>00895 <span class="keywordtype">int</span> ret; <a name="l00896"></a>00896 <span class="keywordtype">int</span> *mbuf = arg; <a name="l00897"></a>00897 <a name="l00898"></a>00898 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"VIDIOCSYNC\n"</span>); <a name="l00899"></a>00899 <a name="l00900"></a>00900 <span class="keywordflow">if</span> (*mbuf < 0 || *mbuf >= dev->nbuffers) <a name="l00901"></a>00901 <span class="keywordflow">return</span> -EINVAL; <a name="l00902"></a>00902 <a name="l00903"></a>00903 <span class="keywordflow">if</span> (dev->image_used[*mbuf] == 0) <a name="l00904"></a>00904 <span class="keywordflow">return</span> -EINVAL; <a name="l00905"></a>00905 <a name="l00906"></a>00906 add_wait_queue(&dev->wait_frame, &wait); <a name="l00907"></a>00907 <a name="l00908"></a>00908 <span class="keywordflow">while</span> (dev->full_frames == NULL) { <a name="l00909"></a>00909 <span class="keywordflow">if</span> (dev->error_status) { <a name="l00910"></a>00910 remove_wait_queue(&dev->wait_frame, &wait); <a name="l00911"></a>00911 set_current_state(TASK_RUNNING); <a name="l00912"></a>00912 <span class="keywordflow">return</span> -dev->error_status; <a name="l00913"></a>00913 } <a name="l00914"></a>00914 <a name="l00915"></a>00915 <span class="keywordflow">if</span> (signal_pending(current)) { <a name="l00916"></a>00916 remove_wait_queue(&dev->wait_frame, &wait); <a name="l00917"></a>00917 set_current_state(TASK_RUNNING); <a name="l00918"></a>00918 <span class="keywordflow">return</span> -ERESTARTSYS; <a name="l00919"></a>00919 } <a name="l00920"></a>00920 <a name="l00921"></a>00921 schedule(); <a name="l00922"></a>00922 set_current_state(TASK_INTERRUPTIBLE); <a name="l00923"></a>00923 } <a name="l00924"></a>00924 <a name="l00925"></a>00925 remove_wait_queue(&dev->wait_frame, &wait); <a name="l00926"></a>00926 set_current_state(TASK_RUNNING); <a name="l00927"></a>00927 <a name="l00928"></a>00928 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"VIDIOCSYNC: frame ready\n"</span>); <a name="l00929"></a>00929 <a name="l00930"></a>00930 dev->fill_image = *mbuf; <a name="l00931"></a>00931 <a name="l00932"></a>00932 ret = <a class="code" href="stk11xx-buf_8c.html#21bfe8791f1f53fcd64a185dc6fdc686" title="Handler frame.">stk11xx_handle_frame</a>(dev); <a name="l00933"></a>00933 <a name="l00934"></a>00934 <span class="keywordflow">if</span> (ret != 0) <a name="l00935"></a>00935 <a class="code" href="stk11xx_8h.html#2548285f2eade14f8e93c9b611e622d7">STK_ERROR</a>(<span class="stringliteral">"VIDIOCSYNC error !\n"</span>); <a name="l00936"></a>00936 <a name="l00937"></a>00937 dev->image_used[*mbuf] = 0; <a name="l00938"></a>00938 } <a name="l00939"></a>00939 <span class="keywordflow">break</span>; <a name="l00940"></a>00940 <a name="l00941"></a>00941 <span class="keywordflow">case</span> VIDIOCGAUDIO: <a name="l00942"></a>00942 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"VIDIOCGAUDIO\n"</span>); <a name="l00943"></a>00943 <span class="keywordflow">return</span> -EINVAL; <a name="l00944"></a>00944 <span class="keywordflow">break</span>; <a name="l00945"></a>00945 <a name="l00946"></a>00946 <span class="keywordflow">case</span> VIDIOCSAUDIO: <a name="l00947"></a>00947 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"VIDIOCSAUDIO\n"</span>); <a name="l00948"></a>00948 <span class="keywordflow">return</span> -EINVAL; <a name="l00949"></a>00949 <span class="keywordflow">break</span>; <a name="l00950"></a>00950 <a name="l00951"></a>00951 <span class="keywordflow">case</span> VIDIOCGUNIT: <a name="l00952"></a>00952 { <a name="l00953"></a>00953 <span class="keyword">struct </span>video_unit *vu = arg; <a name="l00954"></a>00954 <a name="l00955"></a>00955 vu->video = dev->vdev->minor & 0x3f; <a name="l00956"></a>00956 vu->audio = -1; <a name="l00957"></a>00957 vu->vbi = -1; <a name="l00958"></a>00958 vu->radio = -1; <a name="l00959"></a>00959 vu->teletext = -1; <a name="l00960"></a>00960 } <a name="l00961"></a>00961 <span class="keywordflow">break</span>; <a name="l00962"></a>00962 <a name="l00963"></a>00963 <a name="l00964"></a>00964 <span class="comment">// Video 4 Linux v2</span> <a name="l00965"></a>00965 <a name="l00966"></a>00966 <span class="keywordflow">case</span> VIDIOC_QUERYCAP: <a name="l00967"></a>00967 { <a name="l00968"></a>00968 <span class="keyword">struct </span>v4l2_capability *cap = arg; <a name="l00969"></a>00969 <a name="l00970"></a>00970 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"VIDIOC_QUERYCAP\n"</span>); <a name="l00971"></a>00971 <a name="l00972"></a>00972 memset(cap, 0, <span class="keyword">sizeof</span>(*cap)); <a name="l00973"></a>00973 strlcpy(cap->driver, <span class="stringliteral">"stk11xx"</span>, <span class="keyword">sizeof</span>(cap->driver)); <a name="l00974"></a>00974 <a name="l00975"></a>00975 cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE | V4L2_CAP_STREAMING; <a name="l00976"></a>00976 cap->version = (__u32) <a class="code" href="stk11xx_8h.html#deb97232a92a9bf74cc96d45637116ae">DRIVER_VERSION_NUM</a>, strlcpy(cap->card, dev->vdev->name, <span class="keyword">sizeof</span>(cap->card)); <a name="l00977"></a>00977 <a name="l00978"></a>00978 <span class="keywordflow">if</span> (usb_make_path(dev->udev, cap->bus_info, <span class="keyword">sizeof</span>(cap->bus_info)) < 0) <a name="l00979"></a>00979 strlcpy(cap->bus_info, dev->vdev->name, <span class="keyword">sizeof</span>(cap->bus_info)); <a name="l00980"></a>00980 } <a name="l00981"></a>00981 <span class="keywordflow">break</span>; <a name="l00982"></a>00982 <a name="l00983"></a>00983 <span class="keywordflow">case</span> VIDIOC_ENUMINPUT: <a name="l00984"></a>00984 { <a name="l00985"></a>00985 <span class="keyword">struct </span>v4l2_input *i = arg; <a name="l00986"></a>00986 <a name="l00987"></a>00987 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"VIDIOC_ENUMINPUT %d\n"</span>, i->index); <a name="l00988"></a>00988 <a name="l00989"></a>00989 <span class="keywordflow">if</span> (i->index) <a name="l00990"></a>00990 <span class="keywordflow">return</span> -EINVAL; <a name="l00991"></a>00991 <a name="l00992"></a>00992 strlcpy(i->name, <span class="stringliteral">"USB"</span>, <span class="keyword">sizeof</span>(i->name)); <a name="l00993"></a>00993 i->type = V4L2_INPUT_TYPE_CAMERA; <a name="l00994"></a>00994 } <a name="l00995"></a>00995 <span class="keywordflow">break</span>; <a name="l00996"></a>00996 <a name="l00997"></a>00997 <span class="keywordflow">case</span> VIDIOC_G_INPUT: <a name="l00998"></a>00998 { <a name="l00999"></a>00999 <span class="keyword">struct </span>v4l2_input *i = arg; <a name="l01000"></a>01000 <a name="l01001"></a>01001 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"GET INPUT %d\n"</span>, i->index); <a name="l01002"></a>01002 <a name="l01003"></a>01003 <span class="keywordflow">if</span> (i->index) <a name="l01004"></a>01004 <span class="keywordflow">return</span> -EINVAL; <a name="l01005"></a>01005 } <a name="l01006"></a>01006 <span class="keywordflow">break</span>; <a name="l01007"></a>01007 <a name="l01008"></a>01008 <span class="keywordflow">case</span> VIDIOC_S_INPUT: <a name="l01009"></a>01009 { <a name="l01010"></a>01010 <span class="keyword">struct </span>v4l2_input *i = arg; <a name="l01011"></a>01011 <a name="l01012"></a>01012 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"SET INPUT %d\n"</span>, i->index); <a name="l01013"></a>01013 <a name="l01014"></a>01014 <span class="keywordflow">if</span> (i->index != 0) <a name="l01015"></a>01015 <span class="keywordflow">return</span> -EINVAL; <a name="l01016"></a>01016 } <a name="l01017"></a>01017 <span class="keywordflow">break</span>; <a name="l01018"></a>01018 <a name="l01019"></a>01019 <span class="keywordflow">case</span> VIDIOC_QUERYCTRL: <a name="l01020"></a>01020 { <a name="l01021"></a>01021 <span class="keywordtype">int</span> i; <a name="l01022"></a>01022 <span class="keywordtype">int</span> nbr; <a name="l01023"></a>01023 <span class="keyword">struct </span>v4l2_queryctrl *c = arg; <a name="l01024"></a>01024 <a name="l01025"></a>01025 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"VIDIOC_QUERYCTRL id = %d\n"</span>, c->id); <a name="l01026"></a>01026 <a name="l01027"></a>01027 nbr = <span class="keyword">sizeof</span>(<a class="code" href="stk11xx-v4l_8c.html#3aef683028a48feea4df78904b903e81">stk11xx_controls</a>)/<span class="keyword">sizeof</span>(<span class="keyword">struct</span> v4l2_queryctrl); <a name="l01028"></a>01028 <a name="l01029"></a>01029 <span class="keywordflow">for</span> (i=0; i<nbr; i++) { <a name="l01030"></a>01030 <span class="keywordflow">if</span> (<a class="code" href="stk11xx-v4l_8c.html#3aef683028a48feea4df78904b903e81">stk11xx_controls</a>[i].<span class="keywordtype">id</span> == c->id) { <a name="l01031"></a>01031 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"VIDIOC_QUERYCTRL found\n"</span>); <a name="l01032"></a>01032 memcpy(c, &<a class="code" href="stk11xx-v4l_8c.html#3aef683028a48feea4df78904b903e81">stk11xx_controls</a>[i], <span class="keyword">sizeof</span>(<span class="keyword">struct</span> v4l2_queryctrl)); <a name="l01033"></a>01033 <span class="keywordflow">break</span>; <a name="l01034"></a>01034 } <a name="l01035"></a>01035 } <a name="l01036"></a>01036 <a name="l01037"></a>01037 <span class="keywordflow">if</span> (i >= nbr) <a name="l01038"></a>01038 <span class="keywordflow">return</span> -EINVAL; <a name="l01039"></a>01039 } <a name="l01040"></a>01040 <span class="keywordflow">break</span>; <a name="l01041"></a>01041 <a name="l01042"></a>01042 <span class="keywordflow">case</span> VIDIOC_G_CTRL: <a name="l01043"></a>01043 { <a name="l01044"></a>01044 <span class="keyword">struct </span>v4l2_control *c = arg; <a name="l01045"></a>01045 <a name="l01046"></a>01046 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"GET CTRL id=%d\n"</span>, c->id); <a name="l01047"></a>01047 <a name="l01048"></a>01048 <span class="keywordflow">switch</span> (c->id) { <a name="l01049"></a>01049 <span class="keywordflow">case</span> V4L2_CID_BRIGHTNESS: <a name="l01050"></a>01050 c->value = dev->vsettings.brightness; <a name="l01051"></a>01051 <span class="keywordflow">break</span>; <a name="l01052"></a>01052 <a name="l01053"></a>01053 <span class="keywordflow">case</span> V4L2_CID_WHITENESS: <a name="l01054"></a>01054 c->value = dev->vsettings.whiteness; <a name="l01055"></a>01055 <span class="keywordflow">break</span>; <a name="l01056"></a>01056 <a name="l01057"></a>01057 <span class="keywordflow">case</span> V4L2_CID_SATURATION: <a name="l01058"></a>01058 c->value = dev->vsettings.colour; <a name="l01059"></a>01059 <span class="keywordflow">break</span>; <a name="l01060"></a>01060 <a name="l01061"></a>01061 <span class="keywordflow">case</span> V4L2_CID_CONTRAST: <a name="l01062"></a>01062 c->value = dev->vsettings.contrast; <a name="l01063"></a>01063 <span class="keywordflow">break</span>; <a name="l01064"></a>01064 <a name="l01065"></a>01065 <span class="keywordflow">default</span>: <a name="l01066"></a>01066 <span class="keywordflow">return</span> -EINVAL; <a name="l01067"></a>01067 } <a name="l01068"></a>01068 } <a name="l01069"></a>01069 <span class="keywordflow">break</span>; <a name="l01070"></a>01070 <a name="l01071"></a>01071 <span class="keywordflow">case</span> VIDIOC_S_CTRL: <a name="l01072"></a>01072 { <a name="l01073"></a>01073 <span class="keyword">struct </span>v4l2_control *c = arg; <a name="l01074"></a>01074 <a name="l01075"></a>01075 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"SET CTRL id=%d value=%d\n"</span>, c->id, c->value); <a name="l01076"></a>01076 <a name="l01077"></a>01077 <span class="keywordflow">switch</span> (c->id) { <a name="l01078"></a>01078 <span class="keywordflow">case</span> V4L2_CID_BRIGHTNESS: <a name="l01079"></a>01079 dev->vsettings.brightness = (0xff00 & c->value); <a name="l01080"></a>01080 <span class="keywordflow">break</span>; <a name="l01081"></a>01081 <a name="l01082"></a>01082 <span class="keywordflow">case</span> V4L2_CID_WHITENESS: <a name="l01083"></a>01083 dev->vsettings.whiteness = (0xff00 & c->value); <a name="l01084"></a>01084 <span class="keywordflow">break</span>; <a name="l01085"></a>01085 <a name="l01086"></a>01086 <span class="keywordflow">case</span> V4L2_CID_SATURATION: <a name="l01087"></a>01087 dev->vsettings.colour = (0xff00 & c->value); <a name="l01088"></a>01088 <span class="keywordflow">break</span>; <a name="l01089"></a>01089 <a name="l01090"></a>01090 <span class="keywordflow">case</span> V4L2_CID_CONTRAST: <a name="l01091"></a>01091 dev->vsettings.contrast = (0xff00 & c->value); <a name="l01092"></a>01092 <span class="keywordflow">break</span>; <a name="l01093"></a>01093 <a name="l01094"></a>01094 <span class="keywordflow">default</span>: <a name="l01095"></a>01095 <span class="keywordflow">return</span> -EINVAL; <a name="l01096"></a>01096 } <a name="l01097"></a>01097 <a name="l01098"></a>01098 <a class="code" href="stk11xx-dev_8c.html#9421e6bf87f9bef9f468acfd60a11562" title="This function permits to modify the settings of the camera.">dev_stk11xx_camera_settings</a>(dev); <a name="l01099"></a>01099 } <a name="l01100"></a>01100 <span class="keywordflow">break</span>; <a name="l01101"></a>01101 <a name="l01102"></a>01102 <span class="keywordflow">case</span> VIDIOC_ENUM_FMT: <a name="l01103"></a>01103 { <a name="l01104"></a>01104 <span class="keywordtype">int</span> index; <a name="l01105"></a>01105 <span class="keyword">struct </span>v4l2_fmtdesc *fmtd = arg; <a name="l01106"></a>01106 <a name="l01107"></a>01107 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"VIDIOC_ENUM_FMT %d\n"</span>, fmtd->index); <a name="l01108"></a>01108 <a name="l01109"></a>01109 <span class="keywordflow">if</span> (fmtd->index != 0) <a name="l01110"></a>01110 <span class="keywordflow">return</span> -EINVAL; <a name="l01111"></a>01111 <a name="l01112"></a>01112 index = fmtd->index; <a name="l01113"></a>01113 <a name="l01114"></a>01114 memset(fmtd, 0, <span class="keyword">sizeof</span>(*fmtd)); <a name="l01115"></a>01115 <a name="l01116"></a>01116 fmtd->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; <a name="l01117"></a>01117 fmtd->index = index; <a name="l01118"></a>01118 <a name="l01119"></a>01119 <span class="keywordflow">switch</span> (index) { <a name="l01120"></a>01120 <span class="keywordflow">case</span> 0: <a name="l01121"></a>01121 fmtd->flags = 0; <a name="l01122"></a>01122 fmtd->pixelformat = V4L2_PIX_FMT_RGB24; <a name="l01123"></a>01123 <a name="l01124"></a>01124 strcpy(fmtd->description, <span class="stringliteral">"rgb24"</span>); <a name="l01125"></a>01125 <span class="keywordflow">break</span>; <a name="l01126"></a>01126 <a name="l01127"></a>01127 <span class="keywordflow">case</span> 1: <a name="l01128"></a>01128 fmtd->flags = 0; <a name="l01129"></a>01129 fmtd->pixelformat = V4L2_PIX_FMT_RGB32; <a name="l01130"></a>01130 <a name="l01131"></a>01131 strcpy(fmtd->description, <span class="stringliteral">"rgb32"</span>); <a name="l01132"></a>01132 <span class="keywordflow">break</span>; <a name="l01133"></a>01133 <a name="l01134"></a>01134 <span class="keywordflow">case</span> 2: <a name="l01135"></a>01135 fmtd->flags = 0; <a name="l01136"></a>01136 fmtd->pixelformat = V4L2_PIX_FMT_BGR24; <a name="l01137"></a>01137 <a name="l01138"></a>01138 strcpy(fmtd->description, <span class="stringliteral">"bgr24"</span>); <a name="l01139"></a>01139 <span class="keywordflow">break</span>; <a name="l01140"></a>01140 <a name="l01141"></a>01141 <span class="keywordflow">case</span> 3: <a name="l01142"></a>01142 fmtd->flags = 0; <a name="l01143"></a>01143 fmtd->pixelformat = V4L2_PIX_FMT_BGR32; <a name="l01144"></a>01144 <a name="l01145"></a>01145 strcpy(fmtd->description, <span class="stringliteral">"bgr32"</span>); <a name="l01146"></a>01146 <span class="keywordflow">break</span>; <a name="l01147"></a>01147 <a name="l01148"></a>01148 <span class="keywordflow">case</span> 4: <a name="l01149"></a>01149 fmtd->flags = 0; <a name="l01150"></a>01150 fmtd->pixelformat = V4L2_PIX_FMT_UYVY; <a name="l01151"></a>01151 <a name="l01152"></a>01152 strcpy(fmtd->description, <span class="stringliteral">"uyvy"</span>); <a name="l01153"></a>01153 <span class="keywordflow">break</span>; <a name="l01154"></a>01154 <a name="l01155"></a>01155 <span class="keywordflow">case</span> 5: <a name="l01156"></a>01156 fmtd->flags = 0; <a name="l01157"></a>01157 fmtd->pixelformat = V4L2_PIX_FMT_YUYV; <a name="l01158"></a>01158 <a name="l01159"></a>01159 strcpy(fmtd->description, <span class="stringliteral">"yuyv"</span>); <a name="l01160"></a>01160 <span class="keywordflow">break</span>; <a name="l01161"></a>01161 <a name="l01162"></a>01162 <span class="keywordflow">default</span>: <a name="l01163"></a>01163 <span class="keywordflow">return</span> -EINVAL; <a name="l01164"></a>01164 } <a name="l01165"></a>01165 } <a name="l01166"></a>01166 <span class="keywordflow">break</span>; <a name="l01167"></a>01167 <a name="l01168"></a>01168 <span class="keywordflow">case</span> VIDIOC_G_FMT: <a name="l01169"></a>01169 { <a name="l01170"></a>01170 <span class="keyword">struct </span>v4l2_format *fmtd = arg; <a name="l01171"></a>01171 <span class="keyword">struct </span>v4l2_pix_format pix_format; <a name="l01172"></a>01172 <a name="l01173"></a>01173 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"GET FMT %d\n"</span>, fmtd->type); <a name="l01174"></a>01174 <a name="l01175"></a>01175 <span class="keywordflow">if</span> (fmtd->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) <a name="l01176"></a>01176 <span class="keywordflow">return</span> -EINVAL; <a name="l01177"></a>01177 <a name="l01178"></a>01178 pix_format.width = dev->view.x; <a name="l01179"></a>01179 pix_format.height = dev->view.y; <a name="l01180"></a>01180 pix_format.field = V4L2_FIELD_NONE; <a name="l01181"></a>01181 pix_format.colorspace = V4L2_COLORSPACE_SRGB; <a name="l01182"></a>01182 pix_format.priv = 0; <a name="l01183"></a>01183 <a name="l01184"></a>01184 <span class="keywordflow">switch</span> (dev->vsettings.palette) { <a name="l01185"></a>01185 <span class="keywordflow">case</span> STK11XX_PALETTE_RGB24: <a name="l01186"></a>01186 pix_format.pixelformat = V4L2_PIX_FMT_RGB24; <a name="l01187"></a>01187 pix_format.sizeimage = pix_format.width * pix_format.height * 3; <a name="l01188"></a>01188 pix_format.bytesperline = 3 * pix_format.width; <a name="l01189"></a>01189 <span class="keywordflow">break</span>; <a name="l01190"></a>01190 <a name="l01191"></a>01191 <span class="keywordflow">case</span> STK11XX_PALETTE_RGB32: <a name="l01192"></a>01192 pix_format.pixelformat = V4L2_PIX_FMT_RGB32; <a name="l01193"></a>01193 pix_format.sizeimage = pix_format.width * pix_format.height * 4; <a name="l01194"></a>01194 pix_format.bytesperline = 4 * pix_format.width; <a name="l01195"></a>01195 <span class="keywordflow">break</span>; <a name="l01196"></a>01196 <a name="l01197"></a>01197 <span class="keywordflow">case</span> STK11XX_PALETTE_BGR24: <a name="l01198"></a>01198 pix_format.pixelformat = V4L2_PIX_FMT_BGR24; <a name="l01199"></a>01199 pix_format.sizeimage = pix_format.width * pix_format.height * 3; <a name="l01200"></a>01200 pix_format.bytesperline = 3 * pix_format.width; <a name="l01201"></a>01201 <span class="keywordflow">break</span>; <a name="l01202"></a>01202 <a name="l01203"></a>01203 <span class="keywordflow">case</span> STK11XX_PALETTE_BGR32: <a name="l01204"></a>01204 pix_format.pixelformat = V4L2_PIX_FMT_BGR32; <a name="l01205"></a>01205 pix_format.sizeimage = pix_format.width * pix_format.height * 4; <a name="l01206"></a>01206 pix_format.bytesperline = 4 * pix_format.width; <a name="l01207"></a>01207 <span class="keywordflow">break</span>; <a name="l01208"></a>01208 <a name="l01209"></a>01209 <span class="keywordflow">case</span> STK11XX_PALETTE_UYVY: <a name="l01210"></a>01210 pix_format.pixelformat = V4L2_PIX_FMT_UYVY; <a name="l01211"></a>01211 pix_format.sizeimage = pix_format.width * pix_format.height * 2; <a name="l01212"></a>01212 pix_format.bytesperline = 2 * pix_format.width; <a name="l01213"></a>01213 <span class="keywordflow">break</span>; <a name="l01214"></a>01214 <a name="l01215"></a>01215 <span class="keywordflow">case</span> STK11XX_PALETTE_YUYV: <a name="l01216"></a>01216 pix_format.pixelformat = V4L2_PIX_FMT_YUYV; <a name="l01217"></a>01217 pix_format.sizeimage = pix_format.width * pix_format.height * 2; <a name="l01218"></a>01218 pix_format.bytesperline = 2 * pix_format.width; <a name="l01219"></a>01219 <span class="keywordflow">break</span>; <a name="l01220"></a>01220 } <a name="l01221"></a>01221 <a name="l01222"></a>01222 memcpy(&(fmtd->fmt.pix), &pix_format, <span class="keyword">sizeof</span>(pix_format)); <a name="l01223"></a>01223 } <a name="l01224"></a>01224 <span class="keywordflow">break</span>; <a name="l01225"></a>01225 <a name="l01226"></a>01226 <span class="keywordflow">case</span> VIDIOC_TRY_FMT: <a name="l01227"></a>01227 { <a name="l01228"></a>01228 <span class="keyword">struct </span>v4l2_format *fmtd = arg; <a name="l01229"></a>01229 <a name="l01230"></a>01230 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"TRY FMT %d\n"</span>, fmtd->type); <a name="l01231"></a>01231 <a name="l01232"></a>01232 <span class="keywordflow">if</span> (fmtd->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) <a name="l01233"></a>01233 <span class="keywordflow">return</span> -EINVAL; <a name="l01234"></a>01234 <a name="l01235"></a>01235 <span class="keywordflow">switch</span> (fmtd->fmt.pix.pixelformat) { <a name="l01236"></a>01236 <span class="keywordflow">case</span> V4L2_PIX_FMT_RGB24: <a name="l01237"></a>01237 <span class="keywordflow">case</span> V4L2_PIX_FMT_BGR24: <a name="l01238"></a>01238 dev->vsettings.depth = 24; <a name="l01239"></a>01239 <span class="keywordflow">break</span>; <a name="l01240"></a>01240 <a name="l01241"></a>01241 <span class="keywordflow">case</span> V4L2_PIX_FMT_RGB32: <a name="l01242"></a>01242 <span class="keywordflow">case</span> V4L2_PIX_FMT_BGR32: <a name="l01243"></a>01243 dev->vsettings.depth = 32; <a name="l01244"></a>01244 <span class="keywordflow">break</span>; <a name="l01245"></a>01245 <a name="l01246"></a>01246 <span class="keywordflow">case</span> V4L2_PIX_FMT_UYVY: <a name="l01247"></a>01247 <span class="keywordflow">case</span> V4L2_PIX_FMT_YUYV: <a name="l01248"></a>01248 dev->vsettings.depth = 16; <a name="l01249"></a>01249 <span class="keywordflow">break</span>; <a name="l01250"></a>01250 <a name="l01251"></a>01251 <span class="keywordflow">default</span>: <a name="l01252"></a>01252 <span class="keywordflow">return</span> -EINVAL; <a name="l01253"></a>01253 } <a name="l01254"></a>01254 <a name="l01255"></a>01255 <span class="keywordflow">switch</span> (dev->webcam_type) { <a name="l01256"></a>01256 <span class="keywordflow">case</span> <a class="code" href="stk11xx_8h.html#5400cbd98f5ec8f3d24ec55313e274f13f5de5bc8e126ddba84831bfdf8fdaa8">STK11XX_SXGA</a>: <a name="l01257"></a>01257 <span class="keywordflow">if</span> (fmtd->fmt.pix.width > <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_NBR_SIZES-1].x) <a name="l01258"></a>01258 fmtd->fmt.pix.width = <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_NBR_SIZES-1].x; <a name="l01259"></a>01259 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (fmtd->fmt.pix.width < <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[0].x) <a name="l01260"></a>01260 fmtd->fmt.pix.width = <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[0].x; <a name="l01261"></a>01261 <a name="l01262"></a>01262 <span class="keywordflow">if</span> (fmtd->fmt.pix.height > <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_NBR_SIZES-1].y) <a name="l01263"></a>01263 fmtd->fmt.pix.height = <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_NBR_SIZES-1].y; <a name="l01264"></a>01264 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (fmtd->fmt.pix.height < <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[0].y) <a name="l01265"></a>01265 fmtd->fmt.pix.height = <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[0].y; <a name="l01266"></a>01266 <span class="keywordflow">break</span>; <a name="l01267"></a>01267 <a name="l01268"></a>01268 <span class="keywordflow">case</span> <a class="code" href="stk11xx_8h.html#5400cbd98f5ec8f3d24ec55313e274f1896c4ee082ee0fa3eed44795b4a78e9e">STK11XX_VGA</a>: <a name="l01269"></a>01269 <span class="keywordflow">if</span> (fmtd->fmt.pix.width > <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_NBR_SIZES-1-3].x) <a name="l01270"></a>01270 fmtd->fmt.pix.width = <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_NBR_SIZES-1-3].x; <a name="l01271"></a>01271 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (fmtd->fmt.pix.width < <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[0].x) <a name="l01272"></a>01272 fmtd->fmt.pix.width = <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[0].x; <a name="l01273"></a>01273 <a name="l01274"></a>01274 <span class="keywordflow">if</span> (fmtd->fmt.pix.height > <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_NBR_SIZES-1-3].y) <a name="l01275"></a>01275 fmtd->fmt.pix.height = <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[STK11XX_NBR_SIZES-1-3].y; <a name="l01276"></a>01276 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (fmtd->fmt.pix.height < <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[0].y) <a name="l01277"></a>01277 fmtd->fmt.pix.height = <a class="code" href="stk11xx-sysfs_8c.html#b9b23c97c63356e4db4c0f40448ed109">stk11xx_image_sizes</a>[0].y; <a name="l01278"></a>01278 <span class="keywordflow">break</span>; <a name="l01279"></a>01279 } <a name="l01280"></a>01280 <a name="l01281"></a>01281 } <a name="l01282"></a>01282 <span class="keywordflow">break</span>; <a name="l01283"></a>01283 <a name="l01284"></a>01284 <span class="keywordflow">case</span> VIDIOC_S_FMT: <a name="l01285"></a>01285 { <a name="l01286"></a>01286 <span class="keyword">struct </span>v4l2_format *fmtd = arg; <a name="l01287"></a>01287 <a name="l01288"></a>01288 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"SET FMT %d : %d\n"</span>, fmtd->type, fmtd->fmt.pix.pixelformat); <a name="l01289"></a>01289 <a name="l01290"></a>01290 <span class="keywordflow">if</span> (fmtd->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) <a name="l01291"></a>01291 <span class="keywordflow">return</span> -EINVAL; <a name="l01292"></a>01292 <a name="l01293"></a>01293 <span class="keywordflow">switch</span> (fmtd->fmt.pix.pixelformat) { <a name="l01294"></a>01294 <span class="keywordflow">case</span> V4L2_PIX_FMT_RGB24: <a name="l01295"></a>01295 dev->vsettings.depth = 24; <a name="l01296"></a>01296 dev->vsettings.palette = STK11XX_PALETTE_RGB24; <a name="l01297"></a>01297 <span class="keywordflow">break</span>; <a name="l01298"></a>01298 <a name="l01299"></a>01299 <span class="keywordflow">case</span> V4L2_PIX_FMT_RGB32: <a name="l01300"></a>01300 dev->vsettings.depth = 32; <a name="l01301"></a>01301 dev->vsettings.palette = STK11XX_PALETTE_RGB32; <a name="l01302"></a>01302 <span class="keywordflow">break</span>; <a name="l01303"></a>01303 <a name="l01304"></a>01304 <span class="keywordflow">case</span> V4L2_PIX_FMT_BGR24: <a name="l01305"></a>01305 dev->vsettings.depth = 24; <a name="l01306"></a>01306 dev->vsettings.palette = STK11XX_PALETTE_BGR24; <a name="l01307"></a>01307 <span class="keywordflow">break</span>; <a name="l01308"></a>01308 <a name="l01309"></a>01309 <span class="keywordflow">case</span> V4L2_PIX_FMT_BGR32: <a name="l01310"></a>01310 dev->vsettings.depth = 32; <a name="l01311"></a>01311 dev->vsettings.palette = STK11XX_PALETTE_BGR32; <a name="l01312"></a>01312 <span class="keywordflow">break</span>; <a name="l01313"></a>01313 <a name="l01314"></a>01314 <span class="keywordflow">case</span> V4L2_PIX_FMT_UYVY: <a name="l01315"></a>01315 dev->vsettings.depth = 16; <a name="l01316"></a>01316 dev->vsettings.palette = STK11XX_PALETTE_UYVY; <a name="l01317"></a>01317 <span class="keywordflow">break</span>; <a name="l01318"></a>01318 <a name="l01319"></a>01319 <span class="keywordflow">case</span> V4L2_PIX_FMT_YUYV: <a name="l01320"></a>01320 dev->vsettings.depth = 16; <a name="l01321"></a>01321 dev->vsettings.palette = STK11XX_PALETTE_YUYV; <a name="l01322"></a>01322 <span class="keywordflow">break</span>; <a name="l01323"></a>01323 <a name="l01324"></a>01324 <span class="keywordflow">default</span>: <a name="l01325"></a>01325 <span class="keywordflow">return</span> -EINVAL; <a name="l01326"></a>01326 } <a name="l01327"></a>01327 <a name="l01328"></a>01328 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"Set width=%d, height=%d\n"</span>, fmtd->fmt.pix.width, fmtd->fmt.pix.height); <a name="l01329"></a>01329 <a name="l01330"></a>01330 <span class="comment">// Stop the video stream</span> <a name="l01331"></a>01331 <a class="code" href="stk11xx-dev_8c.html#939f02cad30ad386080f8024741237bd" title="This function sets the device to stop the stream.">dev_stk11xx_stop_stream</a>(dev); <a name="l01332"></a>01332 <a name="l01333"></a>01333 <span class="comment">// ISOC and URB cleanup</span> <a name="l01334"></a>01334 <a class="code" href="stk11xx-usb_8c.html#7d77d101c0b0a8bc6100dc6665f3c3f5" title="Clean-up all the ISOC buffers.">usb_stk11xx_isoc_cleanup</a>(dev); <a name="l01335"></a>01335 <a name="l01336"></a>01336 <span class="comment">// Switch off the camera</span> <a name="l01337"></a>01337 <a class="code" href="stk11xx-dev_8c.html#865eb05993bb42c88ce5c73fb39b210d" title="This function switchs off the camera.">dev_stk11xx_camera_off</a>(dev); <a name="l01338"></a>01338 <a name="l01339"></a>01339 <a class="code" href="stk11xx-dev_8c.html#33117e9ffbc424c68d29dad93f6675c2" title="Wake-up the camera.">dev_stk11xx_camera_asleep</a>(dev); <a name="l01340"></a>01340 <a name="l01341"></a>01341 <span class="comment">// Select the new video mode</span> <a name="l01342"></a>01342 <span class="keywordflow">if</span> (<a class="code" href="stk11xx-v4l_8c.html#627028fbe327bdeb1589d74109e9ae77" title="Select a video mode.">v4l_stk11xx_select_video_mode</a>(dev, fmtd->fmt.pix.width, fmtd->fmt.pix.height)) { <a name="l01343"></a>01343 <a class="code" href="stk11xx_8h.html#2548285f2eade14f8e93c9b611e622d7">STK_ERROR</a>(<span class="stringliteral">"Select video mode failed !\n"</span>); <a name="l01344"></a>01344 <span class="keywordflow">return</span> -EAGAIN; <a name="l01345"></a>01345 } <a name="l01346"></a>01346 <a name="l01347"></a>01347 <span class="comment">// Clear the buffers</span> <a name="l01348"></a>01348 <a class="code" href="stk11xx-buf_8c.html#cd7e46aba32bcbb5d429b21878d44845" title="Clear current buffers.">stk11xx_clear_buffers</a>(dev); <a name="l01349"></a>01349 <a name="l01350"></a>01350 <span class="comment">// Initialize the device</span> <a name="l01351"></a>01351 <a class="code" href="stk11xx-dev_8c.html#e3ca760fb15d38628de5bfd1e43d6f29" title="This function initializes the device for the stream.">dev_stk11xx_init_camera</a>(dev); <a name="l01352"></a>01352 <a class="code" href="stk11xx-dev_8c.html#e978d7adfeabe3e7c31076fddee9a744" title="This function switchs on the camera.">dev_stk11xx_camera_on</a>(dev); <a name="l01353"></a>01353 <a class="code" href="stk11xx-dev_8c.html#5c487b95ff9a43ca810016c688052bfa" title="Reconfigure the camera before the stream.">dev_stk11xx_reconf_camera</a>(dev); <a name="l01354"></a>01354 <a name="l01355"></a>01355 <span class="comment">// ISOC and URB init</span> <a name="l01356"></a>01356 <a class="code" href="stk11xx-usb_8c.html#e7d7590e86071e46320dc3238eb03ef8" title="Initilize an isochronous pipe.">usb_stk11xx_isoc_init</a>(dev); <a name="l01357"></a>01357 <a name="l01358"></a>01358 <span class="comment">// Re-start the stream</span> <a name="l01359"></a>01359 <a class="code" href="stk11xx-dev_8c.html#b21443fb38d3de22db64c6d4435babbc" title="This function sets the device to start the stream.">dev_stk11xx_start_stream</a>(dev); <a name="l01360"></a>01360 <a name="l01361"></a>01361 <span class="comment">// Video settings</span> <a name="l01362"></a>01362 <a class="code" href="stk11xx-dev_8c.html#9421e6bf87f9bef9f468acfd60a11562" title="This function permits to modify the settings of the camera.">dev_stk11xx_camera_settings</a>(dev); <a name="l01363"></a>01363 } <a name="l01364"></a>01364 <span class="keywordflow">break</span>; <a name="l01365"></a>01365 <a name="l01366"></a>01366 <span class="keywordflow">case</span> VIDIOC_QUERYSTD: <a name="l01367"></a>01367 { <a name="l01368"></a>01368 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"QUERY STD\n"</span>); <a name="l01369"></a>01369 <span class="keywordflow">return</span> -EINVAL; <a name="l01370"></a>01370 } <a name="l01371"></a>01371 <span class="keywordflow">break</span>; <a name="l01372"></a>01372 <a name="l01373"></a>01373 <span class="keywordflow">case</span> VIDIOC_G_STD: <a name="l01374"></a>01374 { <a name="l01375"></a>01375 v4l2_std_id *std = arg; <a name="l01376"></a>01376 <a name="l01377"></a>01377 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"GET STD\n"</span>); <a name="l01378"></a>01378 <a name="l01379"></a>01379 *std = V4L2_STD_UNKNOWN; <a name="l01380"></a>01380 } <a name="l01381"></a>01381 <span class="keywordflow">break</span>; <a name="l01382"></a>01382 <a name="l01383"></a>01383 <span class="keywordflow">case</span> VIDIOC_S_STD: <a name="l01384"></a>01384 { <a name="l01385"></a>01385 v4l2_std_id *std = arg; <a name="l01386"></a>01386 <a name="l01387"></a>01387 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"SET STD\n"</span>); <a name="l01388"></a>01388 <a name="l01389"></a>01389 <span class="keywordflow">if</span> (*std != V4L2_STD_UNKNOWN) <a name="l01390"></a>01390 <span class="keywordflow">return</span> -EINVAL; <a name="l01391"></a>01391 } <a name="l01392"></a>01392 <span class="keywordflow">break</span>; <a name="l01393"></a>01393 <a name="l01394"></a>01394 <span class="keywordflow">case</span> VIDIOC_ENUMSTD: <a name="l01395"></a>01395 { <a name="l01396"></a>01396 <span class="keyword">struct </span>v4l2_standard *std = arg; <a name="l01397"></a>01397 <a name="l01398"></a>01398 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"VIDIOC_ENUMSTD\n"</span>); <a name="l01399"></a>01399 <a name="l01400"></a>01400 <span class="keywordflow">if</span> (std->index != 0) <a name="l01401"></a>01401 <span class="keywordflow">return</span> -EINVAL; <a name="l01402"></a>01402 <a name="l01403"></a>01403 std->id = V4L2_STD_UNKNOWN; <a name="l01404"></a>01404 strncpy(std->name, <span class="stringliteral">"webcam"</span>, <span class="keyword">sizeof</span>(std->name)); <a name="l01405"></a>01405 <a name="l01406"></a>01406 <span class="keywordflow">break</span>; <a name="l01407"></a>01407 } <a name="l01408"></a>01408 <a name="l01409"></a>01409 <span class="keywordflow">case</span> VIDIOC_REQBUFS: <a name="l01410"></a>01410 { <a name="l01411"></a>01411 <span class="keywordtype">int</span> nbuffers; <a name="l01412"></a>01412 <span class="keyword">struct </span>v4l2_requestbuffers *rb = arg; <a name="l01413"></a>01413 <a name="l01414"></a>01414 <span class="keywordflow">if</span> (rb->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) <a name="l01415"></a>01415 <span class="keywordflow">return</span> -EINVAL; <a name="l01416"></a>01416 <a name="l01417"></a>01417 <span class="keywordflow">if</span> (rb->memory != V4L2_MEMORY_MMAP) <a name="l01418"></a>01418 <span class="keywordflow">return</span> -EINVAL; <a name="l01419"></a>01419 <a name="l01420"></a>01420 nbuffers = rb->count; <a name="l01421"></a>01421 <a name="l01422"></a>01422 <span class="keywordflow">if</span> (nbuffers < 2) <a name="l01423"></a>01423 nbuffers = 2; <a name="l01424"></a>01424 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (nbuffers > dev->nbuffers) <a name="l01425"></a>01425 nbuffers = dev->nbuffers; <a name="l01426"></a>01426 <a name="l01427"></a>01427 rb->count = dev->nbuffers; <a name="l01428"></a>01428 } <a name="l01429"></a>01429 <span class="keywordflow">break</span>; <a name="l01430"></a>01430 <a name="l01431"></a>01431 <span class="keywordflow">case</span> VIDIOC_QUERYBUF: <a name="l01432"></a>01432 { <a name="l01433"></a>01433 <span class="keywordtype">int</span> index; <a name="l01434"></a>01434 <span class="keyword">struct </span>v4l2_buffer *buf = arg; <a name="l01435"></a>01435 <a name="l01436"></a>01436 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"QUERY BUFFERS %d %d\n"</span>, buf->index, dev->nbuffers); <a name="l01437"></a>01437 <a name="l01438"></a>01438 <span class="keywordflow">if</span> (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) <a name="l01439"></a>01439 <span class="keywordflow">return</span> -EINVAL; <a name="l01440"></a>01440 <a name="l01441"></a>01441 <span class="keywordflow">if</span> (buf->memory != V4L2_MEMORY_MMAP) <a name="l01442"></a>01442 <span class="keywordflow">return</span> -EINVAL; <a name="l01443"></a>01443 <a name="l01444"></a>01444 index = buf->index; <a name="l01445"></a>01445 <a name="l01446"></a>01446 <span class="keywordflow">if</span> (index < 0 || index >= dev->nbuffers) <a name="l01447"></a>01447 <span class="keywordflow">return</span> -EINVAL; <a name="l01448"></a>01448 <a name="l01449"></a>01449 memset(buf, 0, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> v4l2_buffer)); <a name="l01450"></a>01450 <a name="l01451"></a>01451 buf->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; <a name="l01452"></a>01452 buf->index = index; <a name="l01453"></a>01453 buf->m.offset = index * dev->len_per_image; <a name="l01454"></a>01454 buf->bytesused = dev->view_size; <a name="l01455"></a>01455 buf->field = V4L2_FIELD_NONE; <a name="l01456"></a>01456 buf->memory = V4L2_MEMORY_MMAP; <a name="l01457"></a>01457 buf->length = dev->len_per_image; <a name="l01458"></a>01458 } <a name="l01459"></a>01459 <span class="keywordflow">break</span>; <a name="l01460"></a>01460 <a name="l01461"></a>01461 <span class="keywordflow">case</span> VIDIOC_QBUF: <a name="l01462"></a>01462 { <a name="l01463"></a>01463 <span class="keyword">struct </span>v4l2_buffer *buf = arg; <a name="l01464"></a>01464 <a name="l01465"></a>01465 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"VIDIOC_QBUF\n"</span>); <a name="l01466"></a>01466 <a name="l01467"></a>01467 <span class="keywordflow">if</span> (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) <a name="l01468"></a>01468 <span class="keywordflow">return</span> -EINVAL; <a name="l01469"></a>01469 <a name="l01470"></a>01470 <span class="keywordflow">if</span> (buf->memory != V4L2_MEMORY_MMAP) <a name="l01471"></a>01471 <span class="keywordflow">return</span> -EINVAL; <a name="l01472"></a>01472 <a name="l01473"></a>01473 <span class="keywordflow">if</span> (buf->index < 0 || buf->index >= dev->nbuffers) <a name="l01474"></a>01474 <span class="keywordflow">return</span> -EINVAL; <a name="l01475"></a>01475 <a name="l01476"></a>01476 buf->flags |= V4L2_BUF_FLAG_QUEUED; <a name="l01477"></a>01477 buf->flags &= ~V4L2_BUF_FLAG_DONE; <a name="l01478"></a>01478 } <a name="l01479"></a>01479 <span class="keywordflow">break</span>; <a name="l01480"></a>01480 <a name="l01481"></a>01481 <span class="keywordflow">case</span> VIDIOC_DQBUF: <a name="l01482"></a>01482 { <a name="l01483"></a>01483 <span class="keywordtype">int</span> ret; <a name="l01484"></a>01484 <span class="keyword">struct </span>v4l2_buffer *buf = arg; <a name="l01485"></a>01485 <a name="l01486"></a>01486 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"VIDIOC_DQBUF\n"</span>); <a name="l01487"></a>01487 <a name="l01488"></a>01488 <span class="keywordflow">if</span> (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) <a name="l01489"></a>01489 <span class="keywordflow">return</span> -EINVAL; <a name="l01490"></a>01490 <a name="l01491"></a>01491 add_wait_queue(&dev->wait_frame, &wait); <a name="l01492"></a>01492 <a name="l01493"></a>01493 <span class="keywordflow">while</span> (dev->full_frames == NULL) { <a name="l01494"></a>01494 <span class="keywordflow">if</span> (dev->error_status) { <a name="l01495"></a>01495 remove_wait_queue(&dev->wait_frame, &wait); <a name="l01496"></a>01496 set_current_state(TASK_RUNNING); <a name="l01497"></a>01497 <a name="l01498"></a>01498 <span class="keywordflow">return</span> -dev->error_status; <a name="l01499"></a>01499 } <a name="l01500"></a>01500 <a name="l01501"></a>01501 <span class="keywordflow">if</span> (signal_pending(current)) { <a name="l01502"></a>01502 remove_wait_queue(&dev->wait_frame, &wait); <a name="l01503"></a>01503 set_current_state(TASK_RUNNING); <a name="l01504"></a>01504 <a name="l01505"></a>01505 <span class="keywordflow">return</span> -ERESTARTSYS; <a name="l01506"></a>01506 } <a name="l01507"></a>01507 <a name="l01508"></a>01508 schedule(); <a name="l01509"></a>01509 set_current_state(TASK_INTERRUPTIBLE); <a name="l01510"></a>01510 } <a name="l01511"></a>01511 <a name="l01512"></a>01512 remove_wait_queue(&dev->wait_frame, &wait); <a name="l01513"></a>01513 set_current_state(TASK_RUNNING); <a name="l01514"></a>01514 <a name="l01515"></a>01515 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"VIDIOC_DQBUF : frame ready.\n"</span>); <a name="l01516"></a>01516 <a name="l01517"></a>01517 ret = <a class="code" href="stk11xx-buf_8c.html#21bfe8791f1f53fcd64a185dc6fdc686" title="Handler frame.">stk11xx_handle_frame</a>(dev); <a name="l01518"></a>01518 <a name="l01519"></a>01519 <span class="keywordflow">if</span> (ret) <a name="l01520"></a>01520 <span class="keywordflow">return</span> -EFAULT; <a name="l01521"></a>01521 <a name="l01522"></a>01522 buf->index = dev->fill_image; <a name="l01523"></a>01523 buf->bytesused = dev->view_size; <a name="l01524"></a>01524 buf->flags = V4L2_BUF_FLAG_MAPPED; <a name="l01525"></a>01525 buf->field = V4L2_FIELD_NONE; <a name="l01526"></a>01526 do_gettimeofday(&buf->timestamp); <a name="l01527"></a>01527 buf->sequence = 0; <a name="l01528"></a>01528 buf->memory = V4L2_MEMORY_MMAP; <a name="l01529"></a>01529 buf->m.offset = dev->fill_image * dev->len_per_image; <a name="l01530"></a>01530 buf->length = dev->len_per_image; <span class="comment">//buf->bytesused;</span> <a name="l01531"></a>01531 <a name="l01532"></a>01532 <a class="code" href="stk11xx-buf_8c.html#5805bf7c1173f7f6063c1c5934c73e1b" title="Prepare the next image.">stk11xx_next_image</a>(dev); <a name="l01533"></a>01533 } <a name="l01534"></a>01534 <span class="keywordflow">break</span>; <a name="l01535"></a>01535 <a name="l01536"></a>01536 <span class="keywordflow">case</span> VIDIOC_STREAMON: <a name="l01537"></a>01537 { <a name="l01538"></a>01538 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"VIDIOC_STREAMON\n"</span>); <a name="l01539"></a>01539 <a name="l01540"></a>01540 <a class="code" href="stk11xx-usb_8c.html#e7d7590e86071e46320dc3238eb03ef8" title="Initilize an isochronous pipe.">usb_stk11xx_isoc_init</a>(dev); <a name="l01541"></a>01541 } <a name="l01542"></a>01542 <span class="keywordflow">break</span>; <a name="l01543"></a>01543 <a name="l01544"></a>01544 <span class="keywordflow">case</span> VIDIOC_STREAMOFF: <a name="l01545"></a>01545 { <a name="l01546"></a>01546 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"VIDIOC_STREAMOFF\n"</span>); <a name="l01547"></a>01547 <a name="l01548"></a>01548 <a class="code" href="stk11xx-usb_8c.html#7d77d101c0b0a8bc6100dc6665f3c3f5" title="Clean-up all the ISOC buffers.">usb_stk11xx_isoc_cleanup</a>(dev); <a name="l01549"></a>01549 } <a name="l01550"></a>01550 <span class="keywordflow">break</span>; <a name="l01551"></a>01551 <a name="l01552"></a>01552 <span class="keywordflow">case</span> VIDIOC_G_PARM: <a name="l01553"></a>01553 { <a name="l01554"></a>01554 <span class="keyword">struct </span>v4l2_streamparm *sp = arg; <a name="l01555"></a>01555 <a name="l01556"></a>01556 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"GET PARM %d\n"</span>, sp->type); <a name="l01557"></a>01557 <a name="l01558"></a>01558 <span class="keywordflow">if</span> (sp->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) <a name="l01559"></a>01559 <span class="keywordflow">return</span> -EINVAL; <a name="l01560"></a>01560 <a name="l01561"></a>01561 sp->parm.capture.capability = 0; <a name="l01562"></a>01562 sp->parm.capture.capturemode = 0; <a name="l01563"></a>01563 sp->parm.capture.timeperframe.numerator = 1; <a name="l01564"></a>01564 sp->parm.capture.timeperframe.denominator = 30; <a name="l01565"></a>01565 sp->parm.capture.readbuffers = 2; <a name="l01566"></a>01566 sp->parm.capture.extendedmode = 0; <a name="l01567"></a>01567 } <a name="l01568"></a>01568 <span class="keywordflow">break</span>; <a name="l01569"></a>01569 <a name="l01570"></a>01570 <a name="l01571"></a>01571 <span class="keywordflow">case</span> VIDIOC_G_AUDIO: <a name="l01572"></a>01572 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"GET AUDIO\n"</span>); <a name="l01573"></a>01573 <span class="keywordflow">return</span> -EINVAL; <a name="l01574"></a>01574 <span class="keywordflow">break</span>; <a name="l01575"></a>01575 <a name="l01576"></a>01576 <span class="keywordflow">case</span> VIDIOC_S_AUDIO: <a name="l01577"></a>01577 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"SET AUDIO\n"</span>); <a name="l01578"></a>01578 <span class="keywordflow">return</span> -EINVAL; <a name="l01579"></a>01579 <span class="keywordflow">break</span>; <a name="l01580"></a>01580 <a name="l01581"></a>01581 <span class="keywordflow">case</span> VIDIOC_S_TUNER: <a name="l01582"></a>01582 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"SET TUNER\n"</span>); <a name="l01583"></a>01583 <span class="keywordflow">return</span> -EINVAL; <a name="l01584"></a>01584 <span class="keywordflow">break</span>; <a name="l01585"></a>01585 <a name="l01586"></a>01586 <span class="keywordflow">case</span> VIDIOC_G_FBUF: <a name="l01587"></a>01587 <span class="keywordflow">case</span> VIDIOC_S_FBUF: <a name="l01588"></a>01588 <span class="keywordflow">case</span> VIDIOC_OVERLAY: <a name="l01589"></a>01589 <span class="keywordflow">return</span> -EINVAL; <a name="l01590"></a>01590 <span class="keywordflow">break</span>; <a name="l01591"></a>01591 <a name="l01592"></a>01592 <span class="keywordflow">case</span> VIDIOC_G_TUNER: <a name="l01593"></a>01593 <span class="keywordflow">case</span> VIDIOC_G_FREQUENCY: <a name="l01594"></a>01594 <span class="keywordflow">case</span> VIDIOC_S_FREQUENCY: <a name="l01595"></a>01595 <span class="keywordflow">return</span> -EINVAL; <a name="l01596"></a>01596 <span class="keywordflow">break</span>; <a name="l01597"></a>01597 <a name="l01598"></a>01598 <span class="keywordflow">case</span> VIDIOC_QUERYMENU: <a name="l01599"></a>01599 <span class="keywordflow">return</span> -EINVAL; <a name="l01600"></a>01600 <span class="keywordflow">break</span>; <a name="l01601"></a>01601 <span class="comment">/*</span> <a name="l01602"></a>01602 <span class="comment"> case VIDIOC_CROPCAP:</span> <a name="l01603"></a>01603 <span class="comment"> {</span> <a name="l01604"></a>01604 <span class="comment"> struct v4l2_cropcap cc;</span> <a name="l01605"></a>01605 <span class="comment"></span> <a name="l01606"></a>01606 <span class="comment"> cc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;</span> <a name="l01607"></a>01607 <span class="comment"> cc.pixelaspect.numerator = 1;</span> <a name="l01608"></a>01608 <span class="comment"> cc.pixelaspect.denominator = 1;</span> <a name="l01609"></a>01609 <span class="comment"> cc.bounds.top = 0;</span> <a name="l01610"></a>01610 <span class="comment"> cc.bounds.left = 0;</span> <a name="l01611"></a>01611 <span class="comment"> cc.bounds.width = 640;</span> <a name="l01612"></a>01612 <span class="comment"> cc.bounds.height = 480;</span> <a name="l01613"></a>01613 <span class="comment"> cc.defrect.top = 0;</span> <a name="l01614"></a>01614 <span class="comment"> cc.defrect.left = 0;</span> <a name="l01615"></a>01615 <span class="comment"> cc.defrect.width = 640;</span> <a name="l01616"></a>01616 <span class="comment"> cc.defrect.height = 480;</span> <a name="l01617"></a>01617 <span class="comment"></span> <a name="l01618"></a>01618 <span class="comment"> memcpy(arg, &cc, sizeof(cc));</span> <a name="l01619"></a>01619 <span class="comment"> }</span> <a name="l01620"></a>01620 <span class="comment"> break;</span> <a name="l01621"></a>01621 <span class="comment">*/</span> <a name="l01622"></a>01622 <span class="keywordflow">default</span>: <a name="l01623"></a>01623 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"IOCTL unknown !\n"</span>); <a name="l01624"></a>01624 <span class="keywordflow">return</span> -ENOIOCTLCMD; <a name="l01625"></a>01625 } <a name="l01626"></a>01626 <a name="l01627"></a>01627 <span class="keywordflow">return</span> 0; <a name="l01628"></a>01628 } <a name="l01629"></a>01629 <a name="l01630"></a>01630 <a name="l01642"></a><a class="code" href="stk11xx-v4l_8c.html#b8d6ae85407574b48fd686fe75c74e97">01642</a> <span class="keyword">static</span> <span class="keywordtype">long</span> <a class="code" href="stk11xx-v4l_8c.html#b8d6ae85407574b48fd686fe75c74e97" title="Manage IOCTL.">v4l_stk11xx_ioctl</a>(<span class="keyword">struct</span> file *fp, <a name="l01643"></a>01643 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> cmd, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> arg) <a name="l01644"></a>01644 { <a name="l01645"></a>01645 <span class="keywordtype">long</span> err; <a name="l01646"></a>01646 <span class="keyword">struct </span>usb_stk11xx *dev; <a name="l01647"></a>01647 <span class="keyword">struct </span>video_device *vdev; <a name="l01648"></a>01648 <a name="l01649"></a>01649 vdev = video_devdata(fp); <a name="l01650"></a>01650 dev = video_get_drvdata(video_devdata(fp)); <a name="l01651"></a>01651 <a name="l01652"></a>01652 <a class="code" href="stk11xx_8h.html#6a7ffe6803607fae5d467b1b4f5515f2">STK_DEBUG</a>(<span class="stringliteral">"v4l_stk11xx_ioctl %02X\n"</span>, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>) cmd); <a name="l01653"></a>01653 <a name="l01654"></a>01654 <span class="keywordflow">if</span> (dev == NULL) <a name="l01655"></a>01655 <span class="keywordflow">return</span> -EFAULT; <a name="l01656"></a>01656 <a name="l01657"></a>01657 <span class="keywordflow">if</span> (vdev == NULL) <a name="l01658"></a>01658 <span class="keywordflow">return</span> -EFAULT; <a name="l01659"></a>01659 <a name="l01660"></a>01660 mutex_lock(&dev->modlock); <a name="l01661"></a>01661 <a name="l01662"></a>01662 err = video_usercopy(fp, cmd, arg, <a class="code" href="stk11xx-v4l_8c.html#d0d6bb014a12b34811e18f02002b3c81" title="Manage IOCTL.">v4l_stk11xx_do_ioctl</a>); <a name="l01663"></a>01663 <a name="l01664"></a>01664 mutex_unlock(&dev->modlock); <a name="l01665"></a>01665 <a name="l01666"></a>01666 <span class="keywordflow">return</span> err; <a name="l01667"></a>01667 } <a name="l01668"></a>01668 <a name="l01669"></a>01669 <a name="l01679"></a><a class="code" href="stk11xx_8h.html#ea83cb34e801e4b0470c848174128aeb">01679</a> <span class="keywordtype">int</span> <a class="code" href="stk11xx-v4l_8c.html#5fb1deffc636cce6dffc8b5e971e6115" title="Register the video device.">v4l_stk11xx_register_video_device</a>(<span class="keyword">struct</span> usb_stk11xx *dev) <a name="l01680"></a>01680 { <a name="l01681"></a>01681 <span class="keywordtype">int</span> err; <a name="l01682"></a>01682 <a name="l01683"></a>01683 strcpy(dev->vdev->name, <a class="code" href="stk11xx_8h.html#ae26107a17c06584f8bbd0d6fb91013d">DRIVER_DESC</a>); <a name="l01684"></a>01684 <a name="l01685"></a>01685 dev->vdev->dev = dev->interface->dev; <a name="l01686"></a>01686 dev->vdev->fops = &<a class="code" href="stk11xx-v4l_8c.html#00a41f99999840e48ab4ae826e53b569">v4l_stk11xx_fops</a>; <a name="l01687"></a>01687 dev->vdev->release = video_device_release; <a name="l01688"></a>01688 dev->vdev->minor = -1; <a name="l01689"></a>01689 <a name="l01690"></a>01690 video_set_drvdata(dev->vdev, dev); <a name="l01691"></a>01691 <a name="l01692"></a>01692 err = video_register_device(dev->vdev, VFL_TYPE_GRABBER, -1); <a name="l01693"></a>01693 <a name="l01694"></a>01694 <span class="keywordflow">if</span> (err) <a name="l01695"></a>01695 <a class="code" href="stk11xx_8h.html#2548285f2eade14f8e93c9b611e622d7">STK_ERROR</a>(<span class="stringliteral">"Video register fail !\n"</span>); <a name="l01696"></a>01696 <span class="keywordflow">else</span> <a name="l01697"></a>01697 <a class="code" href="stk11xx_8h.html#55d1b4af8174ee2f44f9ea2e18f6392d">STK_INFO</a>(<span class="stringliteral">"Syntek USB2.0 Camera is now controlling video device /dev/video%d\n"</span>, dev->vdev->minor); <a name="l01698"></a>01698 <a name="l01699"></a>01699 <span class="keywordflow">return</span> err; <a name="l01700"></a>01700 } <a name="l01701"></a>01701 <a name="l01702"></a>01702 <a name="l01712"></a><a class="code" href="stk11xx_8h.html#8abb280daa1010eece7e965f3a6471ba">01712</a> <span class="keywordtype">int</span> <a class="code" href="stk11xx-v4l_8c.html#62bc2469df7a6e1d2fe8c455012bd9ad" title="Unregister the video device.">v4l_stk11xx_unregister_video_device</a>(<span class="keyword">struct</span> usb_stk11xx *dev) <a name="l01713"></a>01713 { <a name="l01714"></a>01714 <a class="code" href="stk11xx_8h.html#55d1b4af8174ee2f44f9ea2e18f6392d">STK_INFO</a>(<span class="stringliteral">"Syntek USB2.0 Camera release resources video device /dev/video%d\n"</span>, dev->vdev->minor); <a name="l01715"></a>01715 <a name="l01716"></a>01716 video_set_drvdata(dev->vdev, NULL); <a name="l01717"></a>01717 video_unregister_device(dev->vdev); <a name="l01718"></a>01718 <a name="l01719"></a>01719 <span class="keywordflow">return</span> 0; <a name="l01720"></a>01720 } <a name="l01721"></a>01721 <a name="l01722"></a>01722 <a name="l01728"></a>01728 <span class="keyword">static</span> <span class="keyword">struct </span>v4l2_file_operations <a class="code" href="stk11xx-v4l_8c.html#00a41f99999840e48ab4ae826e53b569">v4l_stk11xx_fops</a> = { <a name="l01729"></a>01729 .owner = THIS_MODULE, <a name="l01730"></a>01730 .open = <a class="code" href="stk11xx-v4l_8c.html#a2127105dfc03d43fd4ce48f8e0417ac" title="Open the video device.">v4l_stk11xx_open</a>, <a name="l01731"></a>01731 .release = <a class="code" href="stk11xx-v4l_8c.html#d19987ae823d30d119e857b2719a74f2" title="Release an opened file.">v4l_stk11xx_release</a>, <a name="l01732"></a>01732 .read = <a class="code" href="stk11xx-v4l_8c.html#e125a26fc4f36a4b64418acb87b958a4" title="Read the video device.">v4l_stk11xx_read</a>, <a name="l01733"></a>01733 .poll = <a class="code" href="stk11xx-v4l_8c.html#159e3f9cb0b7adb3d1b9e64298d2b42b" title="Polling function.">v4l_stk11xx_poll</a>, <a name="l01734"></a>01734 .mmap = <a class="code" href="stk11xx-v4l_8c.html#1baaafe560fe7466c7062aacd02aff8c" title="Memory map.">v4l_stk11xx_mmap</a>, <a name="l01735"></a>01735 .ioctl = <a class="code" href="stk11xx-v4l_8c.html#b8d6ae85407574b48fd686fe75c74e97" title="Manage IOCTL.">v4l_stk11xx_ioctl</a>, <a name="l01736"></a>01736 }; <a name="l01737"></a>01737 </pre></div></div> <hr size="1"><address style="text-align: right;"><small>Generated on Wed Nov 11 13:36:59 2009 for SyntekUSBVideoCamera by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.9 </small></address> </body> </html>