stv680.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:45k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  STV0680 USB Camera Driver, by Kevin Sisson (kjsisson@bellsouth.net)
  3.  *  
  4.  * Thanks to STMicroelectronics for information on the usb commands, and 
  5.  * to Steve Miller at STM for his help and encouragement while I was 
  6.  * writing this driver.
  7.  *
  8.  * This driver is based heavily on the 
  9.  * Endpoints (formerly known as AOX) se401 USB Camera Driver
  10.  * Copyright (c) 2000 Jeroen B. Vreeken (pe1rxq@amsat.org)
  11.  *
  12.  * Still somewhat based on the Linux ov511 driver.
  13.  * 
  14.  * This program is free software; you can redistribute it and/or modify it
  15.  * under the terms of the GNU General Public License as published by the
  16.  * Free Software Foundation; either version 2 of the License, or (at your
  17.  * option) any later version.
  18.  *
  19.  * This program is distributed in the hope that it will be useful, but
  20.  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  21.  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  22.  * for more details.
  23.  *
  24.  * You should have received a copy of the GNU General Public License
  25.  * along with this program; if not, write to the Free Software Foundation,
  26.  * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  27.  *
  28.  * History: 
  29.  * ver 0.1 October, 2001. Initial attempt. 
  30.  *
  31.  * ver 0.2 November, 2001. Fixed asbility to resize, added brightness
  32.  *                         function, made more stable (?)
  33.  *
  34.  * ver 0.21 Nov, 2001.     Added gamma correction and white balance, 
  35.  *                         due to Alexander Schwartz. Still trying to 
  36.  *                         improve stablility. Moved stuff into stv680.h
  37.  *
  38.  * ver 0.22 Nov, 2001.    Added sharpen function (by Michael Sweet, 
  39.  *                         mike@easysw.com) from GIMP, also used in pencam. 
  40.  *                         Simple, fast, good integer math routine.
  41.  *
  42.  * ver 0.23 Dec, 2001 (gkh)
  43.  *     Took out sharpen function, ran code through
  44.  *     Lindent, and did other minor tweaks to get
  45.  *     things to work properly with 2.5.1
  46.  *
  47.  * ver 0.24 Jan, 2002 (kjs) 
  48.  *                         Fixed the problem with webcam crashing after
  49.  *                         two pictures. Changed the way pic is halved to 
  50.  *                         improve quality. Got rid of green line around 
  51.  *                         frame. Fix brightness reset when changing size 
  52.  *                         bug. Adjusted gamma filters slightly.
  53.  */
  54. #include <linux/config.h>
  55. #include <linux/module.h>
  56. #include <linux/version.h>
  57. #include <linux/init.h>
  58. #include <linux/fs.h>
  59. #include <linux/vmalloc.h>
  60. #include <linux/slab.h>
  61. #include <linux/proc_fs.h>
  62. #include <linux/pagemap.h>
  63. #include <linux/wrapper.h>
  64. #include <linux/smp_lock.h>
  65. #include <linux/sched.h>
  66. #include <linux/signal.h>
  67. #include <linux/errno.h>
  68. #include <linux/videodev.h>
  69. #include <linux/usb.h>
  70. #include "stv680.h"
  71. static int video_nr = -1;
  72. static int swapRGB = 0;   /* default for auto sleect */
  73. static int swapRGB_on = 0; /* default to allow auto select; -1=swap never, +1= swap always */
  74. static unsigned int debug = 0;
  75. #define PDEBUG(level, fmt, args...) 
  76. do { 
  77. if (debug >= level)
  78. info("[" __PRETTY_FUNCTION__ ":%d] " fmt, __LINE__ , ## args);
  79. } while (0)
  80. /*
  81.  * Version Information
  82.  */
  83. #define DRIVER_VERSION "v0.24"
  84. #define DRIVER_AUTHOR "Kevin Sisson <kjsisson@bellsouth.net>"
  85. #define DRIVER_DESC "STV0680 USB Camera Driver"
  86. MODULE_AUTHOR (DRIVER_AUTHOR);
  87. MODULE_DESCRIPTION (DRIVER_DESC);
  88. MODULE_LICENSE ("GPL");
  89. MODULE_PARM (debug, "i");
  90. MODULE_PARM_DESC (debug, "Debug enabled or not");
  91. MODULE_PARM (swapRGB_on, "i");
  92. MODULE_PARM_DESC (swapRGB_on, "Red/blue swap: 1=always, 0=auto, -1=never");
  93. MODULE_PARM (video_nr, "i");
  94. EXPORT_NO_SYMBOLS;
  95. /********************************************************************
  96.  *
  97.  * Memory management
  98.  *
  99.  * This is a shameless copy from the USB-cpia driver (linux kernel
  100.  * version 2.3.29 or so, I have no idea what this code actually does ;).
  101.  * Actually it seems to be a copy of a shameless copy of the bttv-driver.
  102.  * Or that is a copy of a shameless copy of ... (To the powers: is there
  103.  * no generic kernel-function to do this sort of stuff?)
  104.  *
  105.  * Yes, it was a shameless copy from the bttv-driver. IIRC, Alan says
  106.  * there will be one, but apparentely not yet -jerdfelt
  107.  *
  108.  * So I copied it again for the ov511 driver -claudio
  109.  *
  110.  * Same for the se401 driver -Jeroen
  111.  *
  112.  * And the STV0680 driver - Kevin
  113.  ********************************************************************/
  114. /* Given PGD from the address space's page table, return the kernel
  115.  * virtual mapping of the physical memory mapped at ADR.
  116.  */
  117. static inline unsigned long uvirt_to_kva (pgd_t * pgd, unsigned long adr)
  118. {
  119. unsigned long ret = 0UL;
  120. pmd_t *pmd;
  121. pte_t *ptep, pte;
  122. if (!pgd_none (*pgd)) {
  123. pmd = pmd_offset (pgd, adr);
  124. if (!pmd_none (*pmd)) {
  125. ptep = pte_offset (pmd, adr);
  126. pte = *ptep;
  127. if (pte_present (pte)) {
  128. ret = (unsigned long) page_address (pte_page (pte));
  129. ret |= (adr & (PAGE_SIZE - 1));
  130. }
  131. }
  132. }
  133. return ret;
  134. }
  135. /* Here we want the physical address of the memory. This is used when 
  136.  * initializing the contents of the area and marking the pages as reserved.
  137.  */
  138. static inline unsigned long kvirt_to_pa (unsigned long adr)
  139. {
  140. unsigned long va, kva, ret;
  141. va = VMALLOC_VMADDR (adr);
  142. kva = uvirt_to_kva (pgd_offset_k (va), va);
  143. ret = __pa (kva);
  144. return ret;
  145. }
  146. static void *rvmalloc (unsigned long size)
  147. {
  148. void *mem;
  149. unsigned long adr, page;
  150. /* Round it off to PAGE_SIZE */
  151. size += (PAGE_SIZE - 1);
  152. size &= ~(PAGE_SIZE - 1);
  153. mem = vmalloc_32 (size);
  154. if (!mem)
  155. return NULL;
  156. memset (mem, 0, size); /* Clear the ram out, no junk to the user */
  157. adr = (unsigned long) mem;
  158. while (size > 0) {
  159. page = kvirt_to_pa (adr);
  160. mem_map_reserve (virt_to_page (__va (page)));
  161. adr += PAGE_SIZE;
  162. if (size > PAGE_SIZE)
  163. size -= PAGE_SIZE;
  164. else
  165. size = 0;
  166. }
  167. return mem;
  168. }
  169. static void rvfree (void *mem, unsigned long size)
  170. {
  171. unsigned long adr, page;
  172. if (!mem)
  173. return;
  174. size += (PAGE_SIZE - 1);
  175. size &= ~(PAGE_SIZE - 1);
  176. adr = (unsigned long) mem;
  177. while (size > 0) {
  178. page = kvirt_to_pa (adr);
  179. mem_map_unreserve (virt_to_page (__va (page)));
  180. adr += PAGE_SIZE;
  181. if (size > PAGE_SIZE)
  182. size -= PAGE_SIZE;
  183. else
  184. size = 0;
  185. }
  186. vfree (mem);
  187. }
  188. /*********************************************************************
  189.  * pencam read/write functions
  190.  ********************************************************************/
  191. static int stv_sndctrl (int set, struct usb_stv *stv680, unsigned short req, unsigned short value, unsigned char *buffer, int size)
  192. {
  193. int ret = -1;
  194. switch (set) {
  195. case 0: /*  0xc1  */
  196. ret = usb_control_msg (stv680->udev,
  197.        usb_rcvctrlpipe (stv680->udev, 0),
  198.        req,
  199.        (USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_ENDPOINT),
  200.        value, 0, buffer, size, PENCAM_TIMEOUT);
  201. break;
  202. case 1: /*  0x41  */
  203. ret = usb_control_msg (stv680->udev,
  204.        usb_sndctrlpipe (stv680->udev, 0),
  205.        req,
  206.        (USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_ENDPOINT),
  207.        value, 0, buffer, size, PENCAM_TIMEOUT);
  208. break;
  209. case 2: /*  0x80  */
  210. ret = usb_control_msg (stv680->udev,
  211.        usb_rcvctrlpipe (stv680->udev, 0),
  212.        req,
  213.        (USB_DIR_IN | USB_RECIP_DEVICE),
  214.        value, 0, buffer, size, PENCAM_TIMEOUT);
  215. break;
  216. case 3: /*  0x40  */
  217. ret = usb_control_msg (stv680->udev,
  218.        usb_sndctrlpipe (stv680->udev, 0),
  219.        req,
  220.        (USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE),
  221.        value, 0, buffer, size, PENCAM_TIMEOUT);
  222. break;
  223. }
  224. if ((ret < 0) && (req != 0x0a)) {
  225. PDEBUG (1, "STV(e): usb_control_msg error %i, request = 0x%x, error = %i", set, req, ret);
  226. }
  227. return ret;
  228. }
  229. static int stv_set_config (struct usb_stv *dev, int configuration, int interface, int alternate)
  230. {
  231. if (usb_set_configuration (dev->udev, configuration) < 0) {
  232. PDEBUG (1, "STV(e): FAILED to set configuration %i", configuration);
  233. return -1;
  234. }
  235. if (usb_set_interface (dev->udev, interface, alternate) < 0) {
  236. PDEBUG (1, "STV(e): FAILED to set alternate interface %i", alternate);
  237. return -1;
  238. }
  239. return 0;
  240. }
  241. static int stv_stop_video (struct usb_stv *dev)
  242. {
  243. int i;
  244. unsigned char *buf;
  245. buf = kmalloc (40, GFP_KERNEL);
  246. if (buf == NULL) {
  247. PDEBUG (0, "STV(e): Out of (small buf) memory");
  248. return -1;
  249. }
  250. /* this is a high priority command; it stops all lower order commands */
  251. if ((i = stv_sndctrl (1, dev, 0x04, 0x0000, buf, 0x0)) < 0) {
  252. i = stv_sndctrl (0, dev, 0x80, 0, buf, 0x02); /* Get Last Error; 2 = busy */
  253. PDEBUG (1, "STV(i): last error: %i,  command = 0x%x", buf[0], buf[1]);
  254. } else {
  255. PDEBUG (1, "STV(i): Camera reset to idle mode.");
  256. }
  257. if ((i = stv_set_config (dev, 1, 0, 0)) < 0)
  258. PDEBUG (1, "STV(e): Reset config during exit failed");
  259. /*  get current mode  */
  260. buf[0] = 0xf0;
  261. if ((i = stv_sndctrl (0, dev, 0x87, 0, buf, 0x08)) != 0x08) /* get mode */
  262. PDEBUG (0, "STV(e): Stop_video: problem setting original mode");
  263. if (dev->origMode != buf[0]) {
  264. memset (buf, 0, 8);
  265. buf[0] = (unsigned char) dev->origMode;
  266. if ((i = stv_sndctrl (3, dev, 0x07, 0x0100, buf, 0x08)) != 0x08) {
  267. PDEBUG (0, "STV(e): Stop_video: Set_Camera_Mode failed");
  268. i = -1;
  269. }
  270. buf[0] = 0xf0;
  271. i = stv_sndctrl (0, dev, 0x87, 0, buf, 0x08);
  272. if ((i != 0x08) || (buf[0] != dev->origMode)) {
  273. PDEBUG (0, "STV(e): camera NOT set to original resolution.");
  274. i = -1;
  275. } else
  276. PDEBUG (0, "STV(i): Camera set to original resolution");
  277. }
  278. /* origMode */
  279. kfree (buf);
  280. return i;
  281. }
  282. static int stv_set_video_mode (struct usb_stv *dev)
  283. {
  284. int i, stop_video = 1;
  285. unsigned char *buf;
  286. buf = kmalloc (40, GFP_KERNEL);
  287. if (buf == NULL) {
  288. PDEBUG (0, "STV(e): Out of (small buf) memory");
  289. return -1;
  290. }
  291. if ((i = stv_set_config (dev, 1, 0, 0)) < 0) {
  292. kfree (buf);
  293. return i;
  294. }
  295. i = stv_sndctrl (2, dev, 0x06, 0x0100, buf, 0x12);
  296. if (!(i > 0) && (buf[8] == 0x53) && (buf[9] == 0x05)) {
  297. PDEBUG (1, "STV(e): Could not get descriptor 0100.");
  298. goto error;
  299. }
  300. /*  set alternate interface 1 */
  301. if ((i = stv_set_config (dev, 1, 0, 1)) < 0)
  302. goto error;
  303. if ((i = stv_sndctrl (0, dev, 0x85, 0, buf, 0x10)) != 0x10)
  304. goto error;
  305. PDEBUG (1, "STV(i): Setting video mode.");
  306. /*  Switch to Video mode: 0x0100 = VGA (640x480), 0x0000 = CIF (352x288) 0x0300 = QVGA (320x240)  */
  307. if ((i = stv_sndctrl (1, dev, 0x09, dev->VideoMode, buf, 0x0)) < 0) {
  308. stop_video = 0;
  309. goto error;
  310. }
  311. goto exit;
  312. error:
  313. kfree (buf);
  314. if (stop_video == 1)
  315. stv_stop_video (dev);
  316. return -1;
  317. exit:
  318. kfree (buf);
  319. return 0;
  320. }
  321. static int stv_init (struct usb_stv *stv680)
  322. {
  323. int i = 0;
  324. unsigned char *buffer;
  325. unsigned long int bufsize;
  326. buffer = kmalloc (40, GFP_KERNEL);
  327. if (buffer == NULL) {
  328. PDEBUG (0, "STV(e): Out of (small buf) memory");
  329. return -1;
  330. }
  331. memset (buffer, 0, 40);
  332. udelay (100);
  333. /* set config 1, interface 0, alternate 0 */
  334. if ((i = stv_set_config (stv680, 1, 0, 0)) < 0) {
  335. kfree (buffer);
  336. PDEBUG (0, "STV(e): set config 1,0,0 failed");
  337. return -1;
  338. }
  339. /* ping camera to be sure STV0680 is present */
  340. if ((i = stv_sndctrl (0, stv680, 0x88, 0x5678, buffer, 0x02)) != 0x02)
  341. goto error;
  342. if ((buffer[0] != 0x56) || (buffer[1] != 0x78)) {
  343. PDEBUG (1, "STV(e): camera ping failed!!");
  344. goto error;
  345. }
  346. /* get camera descriptor */
  347. if ((i = stv_sndctrl (2, stv680, 0x06, 0x0200, buffer, 0x09)) != 0x09)
  348. goto error;
  349. i = stv_sndctrl (2, stv680, 0x06, 0x0200, buffer, 0x22);
  350. if (!(i >= 0) && (buffer[7] == 0xa0) && (buffer[8] == 0x23)) {
  351. PDEBUG (1, "STV(e): Could not get descriptor 0200.");
  352. goto error;
  353. }
  354. if ((i = stv_sndctrl (0, stv680, 0x8a, 0, buffer, 0x02)) != 0x02)
  355. goto error;
  356. if ((i = stv_sndctrl (0, stv680, 0x8b, 0, buffer, 0x24)) != 0x24)
  357. goto error;
  358. if ((i = stv_sndctrl (0, stv680, 0x85, 0, buffer, 0x10)) != 0x10)
  359. goto error;
  360. stv680->SupportedModes = buffer[7];
  361. i = stv680->SupportedModes;
  362. stv680->CIF = 0;
  363. stv680->VGA = 0;
  364. stv680->QVGA = 0;
  365. if (i & 1)
  366. stv680->CIF = 1;
  367. if (i & 2)
  368. stv680->VGA = 1;
  369. if (i & 8)
  370. stv680->QVGA = 1;
  371. if (stv680->SupportedModes == 0) {
  372. PDEBUG (0, "STV(e): There are NO supported STV680 modes!!");
  373. i = -1;
  374. goto error;
  375. } else {
  376. if (stv680->CIF)
  377. PDEBUG (0, "STV(i): CIF is supported");
  378. if (stv680->QVGA)
  379. PDEBUG (0, "STV(i): QVGA is supported");
  380. }
  381. /* FW rev, ASIC rev, sensor ID  */
  382. PDEBUG (1, "STV(i): Firmware rev is %i.%i", buffer[0], buffer[1]);
  383. PDEBUG (1, "STV(i): ASIC rev is %i.%i", buffer[2], buffer[3]);
  384. PDEBUG (1, "STV(i): Sensor ID is %i", (buffer[4]*16) + (buffer[5]>>4));
  385. /*  set alternate interface 1 */
  386. if ((i = stv_set_config (stv680, 1, 0, 1)) < 0)
  387. goto error;
  388. if ((i = stv_sndctrl (0, stv680, 0x85, 0, buffer, 0x10)) != 0x10)
  389. goto error;
  390. if ((i = stv_sndctrl (0, stv680, 0x8d, 0, buffer, 0x08)) != 0x08)
  391. goto error;
  392. i = buffer[3];
  393. PDEBUG (0, "STV(i): Camera has %i pictures.", i);
  394. /*  get current mode */
  395. if ((i = stv_sndctrl (0, stv680, 0x87, 0, buffer, 0x08)) != 0x08)
  396. goto error;
  397. stv680->origMode = buffer[0]; /* 01 = VGA, 03 = QVGA, 00 = CIF */
  398. /* This will attemp CIF mode, if supported. If not, set to QVGA  */
  399. memset (buffer, 0, 8);
  400. if (stv680->CIF)
  401. buffer[0] = 0x00;
  402. else if (stv680->QVGA)
  403. buffer[0] = 0x03;
  404. if ((i = stv_sndctrl (3, stv680, 0x07, 0x0100, buffer, 0x08)) != 0x08) {
  405. PDEBUG (0, "STV(i): Set_Camera_Mode failed");
  406. i = -1;
  407. goto error;
  408. }
  409. buffer[0] = 0xf0;
  410. stv_sndctrl (0, stv680, 0x87, 0, buffer, 0x08);
  411. if (((stv680->CIF == 1) && (buffer[0] != 0x00)) || ((stv680->QVGA == 1) && (buffer[0] != 0x03))) {
  412. PDEBUG (0, "STV(e): Error setting camera video mode!");
  413. i = -1;
  414. goto error;
  415. } else {
  416. if (buffer[0] == 0) {
  417. stv680->VideoMode = 0x0000;
  418. PDEBUG (0, "STV(i): Video Mode set to CIF");
  419. }
  420. if (buffer[0] == 0x03) {
  421. stv680->VideoMode = 0x0300;
  422. PDEBUG (0, "STV(i): Video Mode set to QVGA");
  423. }
  424. }
  425. if ((i = stv_sndctrl (0, stv680, 0x8f, 0, buffer, 0x10)) != 0x10)
  426. goto error;
  427. bufsize = (buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | (buffer[3]);
  428. stv680->cwidth = (buffer[4] << 8) | (buffer[5]); /* ->camera = 322, 356, 644  */
  429. stv680->cheight = (buffer[6] << 8) | (buffer[7]); /* ->camera = 242, 292, 484  */
  430. stv680->origGain = buffer[12];
  431. goto exit;
  432. error:
  433. i = stv_sndctrl (0, stv680, 0x80, 0, buffer, 0x02); /* Get Last Error */
  434. PDEBUG (1, "STV(i): last error: %i,  command = 0x%x", buffer[0], buffer[1]);
  435. kfree (buffer);
  436. return -1;
  437. exit:
  438. kfree (buffer);
  439. /* video = 320x240, 352x288 */
  440. if (stv680->CIF == 1) {
  441. stv680->maxwidth = 352;
  442. stv680->maxheight = 288;
  443. stv680->vwidth = 352;
  444. stv680->vheight = 288;
  445. }
  446. if (stv680->QVGA == 1) {
  447. stv680->maxwidth = 320;
  448. stv680->maxheight = 240;
  449. stv680->vwidth = 320;
  450. stv680->vheight = 240;
  451. }
  452. stv680->rawbufsize = bufsize; /* must be ./. by 8 */
  453. stv680->maxframesize = bufsize * 3; /* RGB size */
  454. PDEBUG (2, "STV(i): cwidth = %i, cheight = %i", stv680->cwidth, stv680->cheight);
  455. PDEBUG (1, "STV(i): width = %i, height = %i, rawbufsize = %li", stv680->vwidth, stv680->vheight, stv680->rawbufsize);
  456. /* some default values */
  457. stv680->bulk_in_endpointAddr = 0x82;
  458. stv680->dropped = 0;
  459. stv680->error = 0;
  460. stv680->framecount = 0;
  461. stv680->readcount = 0;
  462. stv680->streaming = 0;
  463. /* bright, white, colour, hue, contrast are set by software, not in stv0680 */
  464. stv680->brightness = 32767;
  465. stv680->chgbright = 0;
  466. stv680->whiteness = 0; /* only for greyscale */
  467. stv680->colour = 32767;
  468. stv680->contrast = 32767;
  469. stv680->hue = 32767;
  470. stv680->palette = STV_VIDEO_PALETTE;
  471. stv680->depth = 24; /* rgb24 bits */
  472. swapRGB = 0;
  473. if ((swapRGB_on == 0) && (swapRGB == 0))
  474. PDEBUG (1, "STV(i): swapRGB is (auto) OFF");
  475. else if ((swapRGB_on == 1) && (swapRGB == 1))
  476. PDEBUG (1, "STV(i): swapRGB is (auto) ON");
  477. else if (swapRGB_on == 1)
  478. PDEBUG (1, "STV(i): swapRGB is (forced) ON");
  479. else if (swapRGB_on == -1)
  480. PDEBUG (1, "STV(i): swapRGB is (forced) OFF");
  481. if (stv_set_video_mode (stv680) < 0) {
  482. PDEBUG (0, "STV(e): Could not set video mode in stv_init");
  483. return -1;
  484. }
  485. return 0;
  486. }
  487. /***************** last of pencam  routines  *******************/
  488. /********************************************************************
  489.  * /proc interface
  490.  *******************************************************************/
  491. #if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
  492. static struct proc_dir_entry *stv680_proc_entry = NULL;
  493. extern struct proc_dir_entry *video_proc_entry;
  494. #define YES_NO(x) ((x) ? "yes" : "no")
  495. #define ON_OFF(x) ((x) ? "(auto) on" : "(auto) off")
  496. static int stv680_read_proc (char *page, char **start, off_t off, int count, int *eof, void *data)
  497. {
  498. char *out = page;
  499. int len;
  500. struct usb_stv *stv680 = data;
  501. /* Stay under PAGE_SIZE or else bla bla bla.... */
  502. out += sprintf (out, "driver_version  : %sn", DRIVER_VERSION);
  503. out += sprintf (out, "model           : %sn", stv680->camera_name);
  504. out += sprintf (out, "in use          : %sn", YES_NO (stv680->user));
  505. out += sprintf (out, "streaming       : %sn", YES_NO (stv680->streaming));
  506. out += sprintf (out, "num_frames      : %dn", STV680_NUMFRAMES);
  507. out += sprintf (out, "Current size    : %ix%in", stv680->vwidth, stv680->vheight);
  508. if (swapRGB_on == 0)
  509. out += sprintf (out, "swapRGB         : %sn", ON_OFF (swapRGB));
  510. else if (swapRGB_on == 1)
  511. out += sprintf (out, "swapRGB         : (forced) onn");
  512. else if (swapRGB_on == -1)
  513. out += sprintf (out, "swapRGB         : (forced) offn");
  514. out += sprintf (out, "Palette         : %i", stv680->palette);
  515. out += sprintf (out, "n");
  516. out += sprintf (out, "Frames total    : %dn", stv680->readcount);
  517. out += sprintf (out, "Frames read     : %dn", stv680->framecount);
  518. out += sprintf (out, "Packets dropped : %dn", stv680->dropped);
  519. out += sprintf (out, "Decoding Errors : %dn", stv680->error);
  520. len = out - page;
  521. len -= off;
  522. if (len < count) {
  523. *eof = 1;
  524. if (len <= 0)
  525. return 0;
  526. } else
  527. len = count;
  528. *start = page + off;
  529. return len;
  530. }
  531. static int create_proc_stv680_cam (struct usb_stv *stv680)
  532. {
  533. char name[9];
  534. struct proc_dir_entry *ent;
  535. if (!stv680_proc_entry || !stv680)
  536. return -1;
  537. sprintf (name, "video%d", stv680->vdev.minor);
  538. ent = create_proc_entry (name, S_IFREG | S_IRUGO | S_IWUSR, stv680_proc_entry);
  539. if (!ent)
  540. return -1;
  541. ent->data = stv680;
  542. ent->read_proc = stv680_read_proc;
  543. stv680->proc_entry = ent;
  544. return 0;
  545. }
  546. static void destroy_proc_stv680_cam (struct usb_stv *stv680)
  547. {
  548. /* One to much, just to be sure :) */
  549. char name[9];
  550. if (!stv680 || !stv680->proc_entry)
  551. return;
  552. sprintf (name, "video%d", stv680->vdev.minor);
  553. remove_proc_entry (name, stv680_proc_entry);
  554. stv680->proc_entry = NULL;
  555. }
  556. static int proc_stv680_create (void)
  557. {
  558. if (video_proc_entry == NULL) {
  559. PDEBUG (0, "STV(e): /proc/video/ doesn't exist!");
  560. return -1;
  561. }
  562. stv680_proc_entry = create_proc_entry ("stv680", S_IFDIR, video_proc_entry);
  563. if (stv680_proc_entry) {
  564. stv680_proc_entry->owner = THIS_MODULE;
  565. } else {
  566. PDEBUG (0, "STV(e): Unable to initialize /proc/video/stv680");
  567. return -1;
  568. }
  569. return 0;
  570. }
  571. static void proc_stv680_destroy (void)
  572. {
  573. if (stv680_proc_entry == NULL)
  574. return;
  575. remove_proc_entry ("stv", video_proc_entry);
  576. }
  577. #endif /* CONFIG_PROC_FS && CONFIG_VIDEO_PROC_FS */
  578. /********************************************************************
  579.  * Camera control
  580.  *******************************************************************/
  581. static int stv680_get_pict (struct usb_stv *stv680, struct video_picture *p)
  582. {
  583. /* This sets values for v4l interface. max/min = 65535/0  */
  584. p->brightness = stv680->brightness;
  585. p->whiteness = stv680->whiteness; /* greyscale */
  586. p->colour = stv680->colour;
  587. p->contrast = stv680->contrast;
  588. p->hue = stv680->hue;
  589. p->palette = stv680->palette;
  590. p->depth = stv680->depth;
  591. return 0;
  592. }
  593. static int stv680_set_pict (struct usb_stv *stv680, struct video_picture *p)
  594. {
  595. /* See above stv680_get_pict  */
  596. if (p->palette != STV_VIDEO_PALETTE) {
  597. PDEBUG (2, "STV(e): Palette set error in _set_pic");
  598. return 1;
  599. }
  600. if (stv680->brightness != p->brightness) {
  601. stv680->chgbright = 1;
  602. stv680->brightness = p->brightness;
  603. stv680->whiteness = p->whiteness; /* greyscale */
  604. stv680->colour = p->colour;
  605. stv680->contrast = p->contrast;
  606. stv680->hue = p->hue;
  607. stv680->palette = p->palette;
  608. stv680->depth = p->depth;
  609. return 0;
  610. }
  611. static void stv680_video_irq (struct urb *urb)
  612. {
  613. struct usb_stv *stv680 = urb->context;
  614. int length = urb->actual_length;
  615. if (length < stv680->rawbufsize)
  616. PDEBUG (2, "STV(i): Lost data in transfer: exp %li, got %i", stv680->rawbufsize, length);
  617. /* ohoh... */
  618. if (!stv680->streaming)
  619. return;
  620. if (!stv680->udev) {
  621. PDEBUG (0, "STV(e): device vapourished in video_irq");
  622. return;
  623. }
  624. /* 0 sized packets happen if we are to fast, but sometimes the camera
  625.    keeps sending them forever...
  626.  */
  627. if (length && !urb->status) {
  628. stv680->nullpackets = 0;
  629. switch (stv680->scratch[stv680->scratch_next].state) {
  630. case BUFFER_READY:
  631. case BUFFER_BUSY:
  632. stv680->dropped++;
  633. break;
  634. case BUFFER_UNUSED:
  635. memcpy (stv680->scratch[stv680->scratch_next].data,
  636.         (unsigned char *) urb->transfer_buffer, length);
  637. stv680->scratch[stv680->scratch_next].state = BUFFER_READY;
  638. stv680->scratch[stv680->scratch_next].length = length;
  639. if (waitqueue_active (&stv680->wq)) {
  640. wake_up_interruptible (&stv680->wq);
  641. }
  642. stv680->scratch_overflow = 0;
  643. stv680->scratch_next++;
  644. if (stv680->scratch_next >= STV680_NUMSCRATCH)
  645. stv680->scratch_next = 0;;
  646. break;
  647. } /* switch  */
  648. } else {
  649. stv680->nullpackets++;
  650. if (stv680->nullpackets > STV680_MAX_NULLPACKETS) {
  651. if (waitqueue_active (&stv680->wq)) {
  652. wake_up_interruptible (&stv680->wq);
  653. }
  654. }
  655. } /*  if - else */
  656. /* Resubmit urb for new data */
  657. urb->status = 0;
  658. urb->dev = stv680->udev;
  659. if (usb_submit_urb (urb))
  660. PDEBUG (0, "STV(e): urb burned down in video irq");
  661. return;
  662. } /*  _video_irq  */
  663. static int stv680_start_stream (struct usb_stv *stv680)
  664. {
  665. urb_t *urb;
  666. int err = 0, i;
  667. stv680->streaming = 1;
  668. /* Do some memory allocation */
  669. for (i = 0; i < STV680_NUMFRAMES; i++) {
  670. stv680->frame[i].data = stv680->fbuf + i * stv680->maxframesize;
  671. stv680->frame[i].curpix = 0;
  672. }
  673. /* packet size = 4096  */
  674. for (i = 0; i < STV680_NUMSBUF; i++) {
  675. stv680->sbuf[i].data = kmalloc (stv680->rawbufsize, GFP_KERNEL);
  676. if (stv680->sbuf[i].data == NULL) {
  677. PDEBUG (0, "STV(e): Could not kmalloc raw data buffer %i", i);
  678. return -1;
  679. }
  680. }
  681. stv680->scratch_next = 0;
  682. stv680->scratch_use = 0;
  683. stv680->scratch_overflow = 0;
  684. for (i = 0; i < STV680_NUMSCRATCH; i++) {
  685. stv680->scratch[i].data = kmalloc (stv680->rawbufsize, GFP_KERNEL);
  686. if (stv680->scratch[i].data == NULL) {
  687. PDEBUG (0, "STV(e): Could not kmalloc raw scratch buffer %i", i);
  688. return -1;
  689. }
  690. stv680->scratch[i].state = BUFFER_UNUSED;
  691. }
  692. for (i = 0; i < STV680_NUMSBUF; i++) {
  693. urb = usb_alloc_urb (0);
  694. if (!urb)
  695. return ENOMEM;
  696. /* sbuf is urb->transfer_buffer, later gets memcpyed to scratch */
  697. usb_fill_bulk_urb (urb, stv680->udev,
  698.    usb_rcvbulkpipe (stv680->udev, stv680->bulk_in_endpointAddr),
  699.    stv680->sbuf[i].data, stv680->rawbufsize,
  700.    stv680_video_irq, stv680);
  701. urb->timeout = PENCAM_TIMEOUT * 2;
  702. urb->transfer_flags |= USB_QUEUE_BULK;
  703. stv680->urb[i] = urb;
  704. err = usb_submit_urb (stv680->urb[i]);
  705. if (err)
  706. PDEBUG (0, "STV(e): urb burned down in start stream");
  707. } /* i STV680_NUMSBUF */
  708. stv680->framecount = 0;
  709. return 0;
  710. }
  711. static int stv680_stop_stream (struct usb_stv *stv680)
  712. {
  713. int i;
  714. if (!stv680->streaming || !stv680->udev)
  715. return 1;
  716. stv680->streaming = 0;
  717. for (i = 0; i < STV680_NUMSBUF; i++)
  718. if (stv680->urb[i]) {
  719. stv680->urb[i]->next = NULL;
  720. usb_unlink_urb (stv680->urb[i]);
  721. usb_free_urb (stv680->urb[i]);
  722. stv680->urb[i] = NULL;
  723. kfree (stv680->sbuf[i].data);
  724. }
  725. for (i = 0; i < STV680_NUMSCRATCH; i++) {
  726. kfree (stv680->scratch[i].data);
  727. stv680->scratch[i].data = NULL;
  728. }
  729. return 0;
  730. }
  731. static int stv680_set_size (struct usb_stv *stv680, int width, int height)
  732. {
  733. int wasstreaming = stv680->streaming;
  734. /* Check to see if we need to change */
  735. if ((stv680->vwidth == width) && (stv680->vheight == height))
  736. return 0;
  737. PDEBUG (1, "STV(i): size request for %i x %i", width, height);
  738. /* Check for a valid mode */
  739. if ((!width || !height) || ((width & 1) || (height & 1))) {
  740. PDEBUG (1, "STV(e): set_size error: request: v.width = %i, v.height = %i  actual: stv.width = %i, stv.height = %i", width, height, stv680->vwidth, stv680->vheight);
  741. return 1;
  742. }
  743. if ((width < (stv680->maxwidth / 2)) || (height < (stv680->maxheight / 2))) {
  744. width = stv680->maxwidth / 2;
  745. height = stv680->maxheight / 2;
  746. } else if ((width >= 158) && (width <= 166)) {
  747. width = 160;
  748. height = 120;
  749. } else if ((width >= 172) && (width <= 180)) {
  750. width = 176;
  751. height = 144;
  752. } else if ((width >= 318) && (width <= 350)) {
  753. width = 320;
  754. height = 240;
  755. } else if ((width >= 350) && (width <= 358)) {
  756. width = 352;
  757. height = 288;
  758. }
  759. /* Stop a current stream and start it again at the new size */
  760. if (wasstreaming)
  761. stv680_stop_stream (stv680);
  762. stv680->vwidth = width;
  763. stv680->vheight = height;
  764. PDEBUG (1, "STV(i): size set to %i x %i", stv680->vwidth, stv680->vheight);
  765. if (wasstreaming)
  766. stv680_start_stream (stv680);
  767. return 0;
  768. }
  769. /**********************************************************************
  770.  * Video Decoding
  771.  **********************************************************************/
  772. /*******  routines from the pencam program; hey, they work!  ********/
  773. /*
  774.  * STV0680 Vision Camera Chipset Driver
  775.  * Copyright (C) 2000 Adam Harrison <adam@antispin.org> 
  776. */
  777. #define RED 0
  778. #define GREEN 1
  779. #define BLUE 2
  780. #define AD(x, y, w) (((y)*(w)+(x))*3)
  781. static void bayer_unshuffle (struct usb_stv *stv680, struct stv680_scratch *buffer)
  782. {
  783. int x, y, i;
  784. int w = stv680->cwidth;
  785. int vw = stv680->cwidth, vh = stv680->cheight;
  786. unsigned int p = 0;
  787. int colour = 0, bayer = 0;
  788. unsigned char *raw = buffer->data;
  789. struct stv680_frame *frame = &stv680->frame[stv680->curframe];
  790. unsigned char *output = frame->data;
  791. unsigned char *temp = frame->data;
  792. int offset = buffer->offset;
  793. if (frame->curpix == 0) {
  794. if (frame->grabstate == FRAME_READY) {
  795. frame->grabstate = FRAME_GRABBING;
  796. }
  797. }
  798. if (offset != frame->curpix) { /* Regard frame as lost :( */
  799. frame->curpix = 0;
  800. stv680->error++;
  801. return;
  802. }
  803. if ((stv680->vwidth == 320) || (stv680->vwidth == 160)) {
  804. vw = 320;
  805. vh = 240;
  806. }
  807. if ((stv680->vwidth == 352) || (stv680->vwidth == 176)) {
  808. vw = 352;
  809. vh = 288;
  810. }
  811. memset (output, 0, 3 * vw * vh); /* clear output matrix. */
  812. for (y = 0; y < vh; y++) {
  813. for (x = 0; x < vw; x++) {
  814. if (x & 1)
  815. p = *(raw + y * w + (x >> 1));
  816. else
  817. p = *(raw + y * w + (x >> 1) + (w >> 1));
  818. if (y & 1)
  819. bayer = 2;
  820. else
  821. bayer = 0;
  822. if (x & 1)
  823. bayer++;
  824. switch (bayer) {
  825. case 0:
  826. case 3:
  827. colour = 1;
  828. break;
  829. case 1:
  830. colour = 0;
  831. break;
  832. case 2:
  833. colour = 2;
  834. break;
  835. }
  836. i = (y * vw + x) * 3;
  837. *(output + i + colour) = (unsigned char) p;
  838. } /* for x */
  839. } /* for y */
  840. /****** gamma correction plus hardcoded white balance */
  841. /* Thanks to Alexander Schwartx <alexander.schwartx@gmx.net> for this code.
  842.    Correction values red[], green[], blue[], are generated by 
  843.    (pow(i/256.0, GAMMA)*255.0)*white balanceRGB where GAMMA=0.55, 1<i<255. 
  844.    White balance (RGB)= 1.0, 1.17, 1.48. Values are calculated as double float and 
  845.    converted to unsigned char. Values are in stv680.h  */
  846. for (y = 0; y < vh; y++) {
  847. for (x = 0; x < vw; x++) {
  848. i = (y * vw + x) * 3;
  849. *(output + i) = red[*(output + i)];
  850. *(output + i + 1) = green[*(output + i + 1)];
  851. *(output + i + 2) = blue[*(output + i + 2)];
  852. }
  853. }
  854. /******  bayer demosaic  ******/
  855. for (y = 1; y < (vh - 1); y++) {
  856. for (x = 1; x < (vw - 1); x++) { /* work out pixel type */
  857. if (y & 1)
  858. bayer = 0;
  859. else
  860. bayer = 2;
  861. if (!(x & 1))
  862. bayer++;
  863. switch (bayer) {
  864. case 0: /* green. blue lr, red tb */
  865. *(output + AD (x, y, vw) + BLUE) = ((int) *(output + AD (x - 1, y, vw) + BLUE) + (int) *(output + AD (x + 1, y, vw) + BLUE)) >> 1;
  866. *(output + AD (x, y, vw) + RED) = ((int) *(output + AD (x, y - 1, vw) + RED) + (int) *(output + AD (x, y + 1, vw) + RED)) >> 1;
  867. break;
  868. case 1: /* blue. green lrtb, red diagonals */
  869. *(output + AD (x, y, vw) + GREEN) = ((int) *(output + AD (x - 1, y, vw) + GREEN) + (int) *(output + AD (x + 1, y, vw) + GREEN) + (int) *(output + AD (x, y - 1, vw) + GREEN) + (int) *(output + AD (x, y + 1, vw) + GREEN)) >> 2;
  870. *(output + AD (x, y, vw) + RED) = ((int) *(output + AD (x - 1, y - 1, vw) + RED) + (int) *(output + AD (x - 1, y + 1, vw) + RED) + (int) *(output + AD (x + 1, y - 1, vw) + RED) + (int) *(output + AD (x + 1, y + 1, vw) + RED)) >> 2;
  871. break;
  872. case 2: /* red. green lrtb, blue diagonals */
  873. *(output + AD (x, y, vw) + GREEN) = ((int) *(output + AD (x - 1, y, vw) + GREEN) + (int) *(output + AD (x + 1, y, vw) + GREEN) + (int) *(output + AD (x, y - 1, vw) + GREEN) + (int) *(output + AD (x, y + 1, vw) + GREEN)) >> 2;
  874. *(output + AD (x, y, vw) + BLUE) = ((int) *(output + AD (x - 1, y - 1, vw) + BLUE) + (int) *(output + AD (x + 1, y - 1, vw) + BLUE) + (int) *(output + AD (x - 1, y + 1, vw) + BLUE) + (int) *(output + AD (x + 1, y + 1, vw) + BLUE)) >> 2;
  875. break;
  876. case 3: /* green. red lr, blue tb */
  877. *(output + AD (x, y, vw) + RED) = ((int) *(output + AD (x - 1, y, vw) + RED) + (int) *(output + AD (x + 1, y, vw) + RED)) >> 1;
  878. *(output + AD (x, y, vw) + BLUE) = ((int) *(output + AD (x, y - 1, vw) + BLUE) + (int) *(output + AD (x, y + 1, vw) + BLUE)) >> 1;
  879. break;
  880. } /* switch */
  881. } /* for x */
  882. } /* for y  - end demosaic  */
  883. /* fix top and bottom row, left and right side */
  884. i = vw * 3;
  885. memcpy (output, (output + i), i);
  886. memcpy ((output + (vh * i)), (output + ((vh - 1) * i)), i);
  887. for (y = 0; y < vh; y++) {
  888. i = y * vw * 3;
  889. memcpy ((output + i), (output + i + 3), 3);
  890. memcpy ((output + i + (vw * 3)), (output + i + (vw - 1) * 3), 3);
  891. }
  892. /*  process all raw data, then trim to size if necessary */
  893. if ((stv680->vwidth == 160) || (stv680->vwidth == 176))  {
  894. i = 0;
  895. for (y = 0; y < vh; y++) {
  896. if (!(y & 1)) {
  897. for (x = 0; x < vw; x++) {
  898. p = (y * vw + x) * 3;
  899. if (!(x & 1)) {
  900. *(output + i) = *(output + p);
  901. *(output + i + 1) = *(output + p + 1);
  902. *(output + i + 2) = *(output + p + 2);
  903. i += 3;
  904. }
  905. }  /* for x */
  906. }
  907. }  /* for y */
  908. }
  909. /* reset to proper width */
  910. if ((stv680->vwidth == 160)) {
  911. vw = 160;
  912. vh = 120;
  913. }
  914. if ((stv680->vwidth == 176)) {
  915. vw = 176;
  916. vh = 144;
  917. }
  918. /* output is RGB; some programs want BGR  */
  919. /* swapRGB_on=0 -> program decides;  swapRGB_on=1, always swap */
  920. /* swapRGB_on=-1, never swap */
  921. if (((swapRGB == 1) && (swapRGB_on != -1)) || (swapRGB_on == 1)) {
  922. for (y = 0; y < vh; y++) {
  923. for (x = 0; x < vw; x++) {
  924. i = (y * vw + x) * 3;
  925. *(temp) = *(output + i);
  926. *(output + i) = *(output + i + 2);
  927. *(output + i + 2) = *(temp);
  928. }
  929. }
  930. }
  931. /* brightness */
  932. if (stv680->chgbright == 1) {
  933. if (stv680->brightness >= 32767) {
  934. p = (stv680->brightness - 32767) / 256;
  935. for (x = 0; x < (vw * vh * 3); x++) {
  936. if ((*(output + x) + (unsigned char) p) > 255)
  937. *(output + x) = 255;
  938. else
  939. *(output + x) += (unsigned char) p;
  940. } /* for */
  941. } else {
  942. p = (32767 - stv680->brightness) / 256;
  943. for (x = 0; x < (vw * vh * 3); x++) {
  944. if ((unsigned char) p > *(output + x))
  945. *(output + x) = 0;
  946. else
  947. *(output + x) -= (unsigned char) p;
  948. } /* for */
  949. } /* else */
  950. }
  951. /* if */
  952. frame->curpix = 0;
  953. frame->curlinepix = 0;
  954. frame->grabstate = FRAME_DONE;
  955. stv680->framecount++;
  956. stv680->readcount++;
  957. if (stv680->frame[(stv680->curframe + 1) & (STV680_NUMFRAMES - 1)].grabstate == FRAME_READY) {
  958. stv680->curframe = (stv680->curframe + 1) & (STV680_NUMFRAMES - 1);
  959. }
  960. } /* bayer_unshuffle */
  961. /*******  end routines from the pencam program  *********/
  962. static int stv680_newframe (struct usb_stv *stv680, int framenr)
  963. {
  964. int errors = 0;
  965. while (stv680->streaming && (stv680->frame[framenr].grabstate == FRAME_READY || stv680->frame[framenr].grabstate == FRAME_GRABBING)) {
  966. if (!stv680->frame[framenr].curpix) {
  967. errors++;
  968. }
  969. wait_event_interruptible (stv680->wq, (stv680->scratch[stv680->scratch_use].state == BUFFER_READY));
  970. if (stv680->nullpackets > STV680_MAX_NULLPACKETS) {
  971. stv680->nullpackets = 0;
  972. PDEBUG (2, "STV(i): too many null length packets, restarting capture");
  973. stv680_stop_stream (stv680);
  974. stv680_start_stream (stv680);
  975. } else {
  976. if (stv680->scratch[stv680->scratch_use].state != BUFFER_READY) {
  977. stv680->frame[framenr].grabstate = FRAME_ERROR;
  978. PDEBUG (2, "STV(e): FRAME_ERROR in _newframe");
  979. return -EIO;
  980. }
  981. stv680->scratch[stv680->scratch_use].state = BUFFER_BUSY;
  982. bayer_unshuffle (stv680, &stv680->scratch[stv680->scratch_use]);
  983. stv680->scratch[stv680->scratch_use].state = BUFFER_UNUSED;
  984. stv680->scratch_use++;
  985. if (stv680->scratch_use >= STV680_NUMSCRATCH)
  986. stv680->scratch_use = 0;
  987. if (errors > STV680_MAX_ERRORS) {
  988. errors = 0;
  989. PDEBUG (2, "STV(i): too many errors, restarting capture");
  990. stv680_stop_stream (stv680);
  991. stv680_start_stream (stv680);
  992. }
  993. } /* else */
  994. } /* while */
  995. return 0;
  996. }
  997. /*********************************************************************
  998.  * Video4Linux
  999.  *********************************************************************/
  1000. static int stv_open (struct video_device *dev, int flags)
  1001. {
  1002. struct usb_stv *stv680 = (struct usb_stv *) dev;
  1003. int err = 0;
  1004. /* we are called with the BKL held */
  1005. MOD_INC_USE_COUNT;
  1006. stv680->user = 1;
  1007. err = stv_init (stv680); /* main initialization routine for camera */
  1008. if (err >= 0) {
  1009. stv680->fbuf = rvmalloc (stv680->maxframesize * STV680_NUMFRAMES);
  1010. if (!stv680->fbuf) {
  1011. PDEBUG (0, "STV(e): Could not rvmalloc frame bufer");
  1012. err = -ENOMEM;
  1013. }
  1014. }
  1015. if (err) {
  1016. MOD_DEC_USE_COUNT;
  1017. stv680->user = 0;
  1018. }
  1019. return err;
  1020. }
  1021. static void stv_close (struct video_device *dev)
  1022. {
  1023. /* called with BKL held */
  1024. struct usb_stv *stv680 = (struct usb_stv *) dev;
  1025. int i;
  1026. for (i = 0; i < STV680_NUMFRAMES; i++)
  1027. stv680->frame[i].grabstate = FRAME_UNUSED;
  1028. if (stv680->streaming)
  1029. stv680_stop_stream (stv680);
  1030. if ((i = stv_stop_video (stv680)) < 0)
  1031. PDEBUG (1, "STV(e): stop_video failed in stv_close");
  1032. rvfree (stv680->fbuf, stv680->maxframesize * STV680_NUMFRAMES);
  1033. stv680->user = 0;
  1034. if (stv680->removed) {
  1035. video_unregister_device (&stv680->vdev);
  1036. kfree (stv680);
  1037. stv680 = NULL;
  1038. PDEBUG (0, "STV(i): device unregistered");
  1039. }
  1040. MOD_DEC_USE_COUNT;
  1041. }
  1042. static long stv680_write (struct video_device *dev, const char *buf, unsigned long count, int noblock)
  1043. {
  1044. return -EINVAL;
  1045. }
  1046. static int stv680_ioctl (struct video_device *vdev, unsigned int cmd, void *arg)
  1047. {
  1048. struct usb_stv *stv680 = (struct usb_stv *) vdev;
  1049. if (!stv680->udev)
  1050. return -EIO;
  1051. switch (cmd) {
  1052. case VIDIOCGCAP:{
  1053. struct video_capability b;
  1054. strcpy (b.name, stv680->camera_name);
  1055. b.type = VID_TYPE_CAPTURE;
  1056. b.channels = 1;
  1057. b.audios = 0;
  1058. b.maxwidth = stv680->maxwidth;
  1059. b.maxheight = stv680->maxheight;
  1060. b.minwidth = stv680->maxwidth / 2;
  1061. b.minheight = stv680->maxheight / 2;
  1062. if (copy_to_user (arg, &b, sizeof (b))) {
  1063. PDEBUG (2, "STV(e): VIDIOCGGAP failed");
  1064. return -EFAULT;
  1065. }
  1066. return 0;
  1067. }
  1068. case VIDIOCGCHAN:{
  1069. struct video_channel v;
  1070. if (copy_from_user (&v, arg, sizeof (v)))
  1071. return -EFAULT;
  1072. if (v.channel != 0)
  1073. return -EINVAL;
  1074. v.flags = 0;
  1075. v.tuners = 0;
  1076. v.type = VIDEO_TYPE_CAMERA;
  1077. strcpy (v.name, "STV Camera");
  1078. if (copy_to_user (arg, &v, sizeof (v))) {
  1079. PDEBUG (2, "STV(e): VIDIOCGCHAN failed");
  1080. return -EFAULT;
  1081. }
  1082. return 0;
  1083. }
  1084. case VIDIOCSCHAN:{
  1085. int v;
  1086. if (copy_from_user (&v, arg, sizeof (v))) {
  1087. PDEBUG (2, "STV(e): VIDIOCSCHAN failed");
  1088. return -EFAULT;
  1089. }
  1090. if (v != 0)
  1091. return -EINVAL;
  1092. return 0;
  1093. }
  1094. case VIDIOCGPICT:{
  1095. struct video_picture p;
  1096. stv680_get_pict (stv680, &p);
  1097. if (copy_to_user (arg, &p, sizeof (p))) {
  1098. PDEBUG (2, "STV(e): VIDIOCGPICT failed");
  1099. return -EFAULT;
  1100. }
  1101. return 0;
  1102. }
  1103. case VIDIOCSPICT:{
  1104. struct video_picture p;
  1105. if (copy_from_user (&p, arg, sizeof (p))) {
  1106. PDEBUG (2, "STV(e): VIDIOCSPICT failed");
  1107. return -EFAULT;
  1108. }
  1109. copy_from_user (&p, arg, sizeof (p));
  1110. PDEBUG (2, "STV(i): palette set to %i in VIDIOSPICT", p.palette);
  1111. if (stv680_set_pict (stv680, &p))
  1112. return -EINVAL;
  1113. return 0;
  1114. }
  1115. case VIDIOCSWIN:{
  1116. struct video_window vw;
  1117. if (copy_from_user (&vw, arg, sizeof (vw)))
  1118. return -EFAULT;
  1119. if (vw.flags)
  1120. return -EINVAL;
  1121. if (vw.clipcount)
  1122. return -EINVAL;
  1123. if (vw.width != stv680->vwidth) {
  1124. if (stv680_set_size (stv680, vw.width, vw.height)) {
  1125. PDEBUG (2, "STV(e): failed (from user) set size in VIDIOCSWIN");
  1126. return -EINVAL;
  1127. }
  1128. }
  1129. return 0;
  1130. }
  1131. case VIDIOCGWIN:{
  1132. struct video_window vw;
  1133. vw.x = 0; /* FIXME */
  1134. vw.y = 0;
  1135. vw.chromakey = 0;
  1136. vw.flags = 0;
  1137. vw.clipcount = 0;
  1138. vw.width = stv680->vwidth;
  1139. vw.height = stv680->vheight;
  1140. if (copy_to_user (arg, &vw, sizeof (vw))) {
  1141. PDEBUG (2, "STV(e): VIDIOCGWIN failed");
  1142. return -EFAULT;
  1143. }
  1144. return 0;
  1145. }
  1146. case VIDIOCGMBUF:{
  1147. struct video_mbuf vm;
  1148. int i;
  1149. memset (&vm, 0, sizeof (vm));
  1150. vm.size = STV680_NUMFRAMES * stv680->maxframesize;
  1151. vm.frames = STV680_NUMFRAMES;
  1152. for (i = 0; i < STV680_NUMFRAMES; i++)
  1153. vm.offsets[i] = stv680->maxframesize * i;
  1154. if (copy_to_user ((void *) arg, (void *) &vm, sizeof (vm))) {
  1155. PDEBUG (2, "STV(e): VIDIOCGMBUF failed");
  1156. return -EFAULT;
  1157. }
  1158. return 0;
  1159. }
  1160. case VIDIOCMCAPTURE:{
  1161. struct video_mmap vm;
  1162. if (copy_from_user (&vm, arg, sizeof (vm))) {
  1163. PDEBUG (2, "STV(e): VIDIOCMCAPTURE failed");
  1164. return -EFAULT;
  1165. }
  1166. if (vm.format != STV_VIDEO_PALETTE) {
  1167. PDEBUG (2, "STV(i): VIDIOCMCAPTURE vm.format (%i) != VIDEO_PALETTE (%i)",
  1168. vm.format, STV_VIDEO_PALETTE);
  1169. if ((vm.format == 3) && (swapRGB_on == 0))  {
  1170. PDEBUG (2, "STV(i): VIDIOCMCAPTURE swapRGB is (auto) ON");
  1171. /* this may fix those apps (e.g., xawtv) that want BGR */
  1172. swapRGB = 1;
  1173. }
  1174. return -EINVAL;
  1175. }
  1176. if (vm.frame >= STV680_NUMFRAMES) {
  1177. PDEBUG (2, "STV(e): VIDIOCMCAPTURE vm.frame > NUMFRAMES");
  1178. return -EINVAL;
  1179. }
  1180. if ((stv680->frame[vm.frame].grabstate == FRAME_ERROR)
  1181.     || (stv680->frame[vm.frame].grabstate == FRAME_GRABBING)) {
  1182. PDEBUG (2, "STV(e): VIDIOCMCAPTURE grabstate (%i) error",
  1183. stv680->frame[vm.frame].grabstate);
  1184. return -EBUSY;
  1185. }
  1186. /* Is this according to the v4l spec??? */
  1187. if (stv680->vwidth != vm.width) {
  1188. if (stv680_set_size (stv680, vm.width, vm.height)) {
  1189. PDEBUG (2, "STV(e): VIDIOCMCAPTURE set_size failed");
  1190. return -EINVAL;
  1191. }
  1192. }
  1193. stv680->frame[vm.frame].grabstate = FRAME_READY;
  1194. if (!stv680->streaming)
  1195. stv680_start_stream (stv680);
  1196. return 0;
  1197. }
  1198. case VIDIOCSYNC:{
  1199. int frame, ret = 0;
  1200. if (copy_from_user ((void *) &frame, arg, sizeof (int))) {
  1201. PDEBUG (2, "STV(e): VIDIOCSYNC failed");
  1202. return -EFAULT;
  1203. }
  1204. if (frame < 0 || frame >= STV680_NUMFRAMES) {
  1205. PDEBUG (2, "STV(e): Bad frame # in VIDIOCSYNC");
  1206. return -EINVAL;
  1207. }
  1208. ret = stv680_newframe (stv680, frame);
  1209. stv680->frame[frame].grabstate = FRAME_UNUSED;
  1210. return ret;
  1211. }
  1212. case VIDIOCGFBUF:{
  1213. struct video_buffer vb;
  1214. memset (&vb, 0, sizeof (vb));
  1215. vb.base = NULL; /* frame buffer not supported, not used */
  1216. if (copy_to_user ((void *) arg, (void *) &vb, sizeof (vb))) {
  1217. PDEBUG (2, "STV(e): VIDIOCSYNC failed");
  1218. return -EFAULT;
  1219. }
  1220. return 0;
  1221. }
  1222. case VIDIOCKEY:
  1223. return 0;
  1224. case VIDIOCCAPTURE:
  1225. {
  1226. PDEBUG (2, "STV(e): VIDIOCCAPTURE failed");
  1227. return -EINVAL;
  1228. }
  1229. case VIDIOCSFBUF:
  1230. return -EINVAL;
  1231. case VIDIOCGTUNER:
  1232. case VIDIOCSTUNER:
  1233. return -EINVAL;
  1234. case VIDIOCGFREQ:
  1235. case VIDIOCSFREQ:
  1236. return -EINVAL;
  1237. case VIDIOCGAUDIO:
  1238. case VIDIOCSAUDIO:
  1239. return -EINVAL;
  1240. default:
  1241. return -ENOIOCTLCMD;
  1242. } /* end switch */
  1243. return 0;
  1244. }
  1245. static int stv680_mmap (struct video_device *dev, const char *adr, unsigned long size)
  1246. {
  1247. struct usb_stv *stv680 = (struct usb_stv *) dev;
  1248. unsigned long start = (unsigned long) adr;
  1249. unsigned long page, pos;
  1250. down (&stv680->lock);
  1251. if (stv680->udev == NULL) {
  1252. up (&stv680->lock);
  1253. return -EIO;
  1254. }
  1255. if (size > (((STV680_NUMFRAMES * stv680->maxframesize) + PAGE_SIZE - 1)
  1256.     & ~(PAGE_SIZE - 1))) {
  1257. up (&stv680->lock);
  1258. return -EINVAL;
  1259. }
  1260. pos = (unsigned long) stv680->fbuf;
  1261. while (size > 0) {
  1262. page = kvirt_to_pa (pos);
  1263. if (remap_page_range (start, page, PAGE_SIZE, PAGE_SHARED)) {
  1264. up (&stv680->lock);
  1265. return -EAGAIN;
  1266. }
  1267. start += PAGE_SIZE;
  1268. pos += PAGE_SIZE;
  1269. if (size > PAGE_SIZE)
  1270. size -= PAGE_SIZE;
  1271. else
  1272. size = 0;
  1273. }
  1274. up (&stv680->lock);
  1275. return 0;
  1276. }
  1277. static long stv680_read (struct video_device *dev, char *buf, unsigned long count, int noblock)
  1278. {
  1279. unsigned long int realcount = count;
  1280. int ret = 0;
  1281. struct usb_stv *stv680 = (struct usb_stv *) dev;
  1282. unsigned long int i;
  1283. if (STV680_NUMFRAMES != 2) {
  1284. PDEBUG (0, "STV(e): STV680_NUMFRAMES needs to be 2!");
  1285. return -1;
  1286. }
  1287. if (stv680->udev == NULL)
  1288. return -EIO;
  1289. if (realcount > (stv680->vwidth * stv680->vheight * 3))
  1290. realcount = stv680->vwidth * stv680->vheight * 3;
  1291. /* Shouldn't happen: */
  1292. if (stv680->frame[0].grabstate == FRAME_GRABBING) {
  1293. PDEBUG (2, "STV(e): FRAME_GRABBING in stv680_read");
  1294. return -EBUSY;
  1295. }
  1296. stv680->frame[0].grabstate = FRAME_READY;
  1297. stv680->frame[1].grabstate = FRAME_UNUSED;
  1298. stv680->curframe = 0;
  1299. if (!stv680->streaming)
  1300. stv680_start_stream (stv680);
  1301. if (!stv680->streaming) {
  1302. ret = stv680_newframe (stv680, 0); /* ret should = 0 */
  1303. }
  1304. ret = stv680_newframe (stv680, 0);
  1305. if (!ret) {
  1306. if ((i = copy_to_user (buf, stv680->frame[0].data, realcount)) != 0) {
  1307. PDEBUG (2, "STV(e): copy_to_user frame 0 failed, ret count = %li", i);
  1308. return -EFAULT;
  1309. }
  1310. } else {
  1311. realcount = ret;
  1312. }
  1313. stv680->frame[0].grabstate = FRAME_UNUSED;
  1314. return realcount;
  1315. } /* stv680_read */
  1316. static int stv_init_done (struct video_device *dev)
  1317. {
  1318. #if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
  1319. if (create_proc_stv680_cam ((struct usb_stv *) dev) < 0)
  1320. return -1;
  1321. #endif
  1322. return 0;
  1323. }
  1324. static struct video_device stv680_template = {
  1325. owner: THIS_MODULE,
  1326. name: "STV0680 USB camera",
  1327. type: VID_TYPE_CAPTURE,
  1328. hardware: VID_HARDWARE_SE401,
  1329. open: stv_open,
  1330. close: stv_close,
  1331. read: stv680_read,
  1332. write: stv680_write,
  1333. ioctl: stv680_ioctl,
  1334. mmap: stv680_mmap,
  1335. initialize: stv_init_done,
  1336. };
  1337. static void *__devinit stv680_probe (struct usb_device *dev, unsigned int ifnum, const struct usb_device_id *id)
  1338. {
  1339. struct usb_interface_descriptor *interface;
  1340. struct usb_stv *stv680;
  1341. char *camera_name = NULL;
  1342. /* We don't handle multi-config cameras */
  1343. if (dev->descriptor.bNumConfigurations != 1) {
  1344. PDEBUG (0, "STV(e): Number of Configurations != 1");
  1345. return NULL;
  1346. }
  1347. interface = &dev->actconfig->interface[ifnum].altsetting[0];
  1348. /* Is it a STV680? */
  1349. if ((dev->descriptor.idVendor == USB_PENCAM_VENDOR_ID) && (dev->descriptor.idProduct == USB_PENCAM_PRODUCT_ID)) {
  1350. camera_name = "STV0680";
  1351. PDEBUG (0, "STV(i): STV0680 camera found.");
  1352. } else {
  1353. PDEBUG (0, "STV(e): Vendor/Product ID do not match STV0680 values.");
  1354. PDEBUG (0, "STV(e): Check that the STV0680 camera is connected to the computer.");
  1355. return NULL;
  1356. }
  1357. /* We found one */
  1358. if ((stv680 = kmalloc (sizeof (*stv680), GFP_KERNEL)) == NULL) {
  1359. PDEBUG (0, "STV(e): couldn't kmalloc stv680 struct.");
  1360. return NULL;
  1361. }
  1362. memset (stv680, 0, sizeof (*stv680));
  1363. stv680->udev = dev;
  1364. stv680->camera_name = camera_name;
  1365. memcpy (&stv680->vdev, &stv680_template, sizeof (stv680_template));
  1366. memcpy (stv680->vdev.name, stv680->camera_name, strlen (stv680->camera_name));
  1367. init_waitqueue_head (&stv680->wq);
  1368. init_MUTEX (&stv680->lock);
  1369. wmb ();
  1370. if (video_register_device (&stv680->vdev, VFL_TYPE_GRABBER, video_nr) == -1) {
  1371. kfree (stv680);
  1372. PDEBUG (0, "STV(e): video_register_device failed");
  1373. return NULL;
  1374. }
  1375. PDEBUG (0, "STV(i): registered new video device: video%d", stv680->vdev.minor);
  1376. return stv680;
  1377. }
  1378. static inline void usb_stv680_remove_disconnected (struct usb_stv *stv680)
  1379. {
  1380. int i;
  1381. stv680->udev = NULL;
  1382. stv680->frame[0].grabstate = FRAME_ERROR;
  1383. stv680->frame[1].grabstate = FRAME_ERROR;
  1384. stv680->streaming = 0;
  1385. wake_up_interruptible (&stv680->wq);
  1386. for (i = 0; i < STV680_NUMSBUF; i++)
  1387. if (stv680->urb[i]) {
  1388. stv680->urb[i]->next = NULL;
  1389. usb_unlink_urb (stv680->urb[i]);
  1390. usb_free_urb (stv680->urb[i]);
  1391. stv680->urb[i] = NULL;
  1392. kfree (stv680->sbuf[i].data);
  1393. }
  1394. for (i = 0; i < STV680_NUMSCRATCH; i++)
  1395. if (stv680->scratch[i].data) {
  1396. kfree (stv680->scratch[i].data);
  1397. }
  1398. PDEBUG (0, "STV(i): %s disconnected", stv680->camera_name);
  1399. #if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
  1400. destroy_proc_stv680_cam (stv680);
  1401. #endif
  1402. /* Free the memory */
  1403. kfree (stv680);
  1404. }
  1405. static void stv680_disconnect (struct usb_device *dev, void *ptr)
  1406. {
  1407. struct usb_stv *stv680 = (struct usb_stv *) ptr;
  1408. lock_kernel ();
  1409. /* We don't want people trying to open up the device */
  1410. if (!stv680->user) {
  1411. video_unregister_device (&stv680->vdev);
  1412. usb_stv680_remove_disconnected (stv680);
  1413. } else {
  1414. stv680->removed = 1;
  1415. }
  1416. unlock_kernel ();
  1417. }
  1418. static struct usb_driver stv680_driver = {
  1419. name: "stv680",
  1420. probe: stv680_probe,
  1421. disconnect: stv680_disconnect,
  1422. id_table: device_table
  1423. };
  1424. /********************************************************************
  1425.  *  Module routines
  1426.  ********************************************************************/
  1427. static int __init usb_stv680_init (void)
  1428. {
  1429. #if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
  1430. if (proc_stv680_create () < 0)
  1431. return -1;
  1432. #endif
  1433. if (usb_register (&stv680_driver) < 0) {
  1434. PDEBUG (0, "STV(e): Could not setup STV0680 driver");
  1435. return -1;
  1436. }
  1437. PDEBUG (0, "STV(i): usb camera driver version %s registering", DRIVER_VERSION);
  1438. info(DRIVER_DESC " " DRIVER_VERSION);
  1439. return 0;
  1440. }
  1441. static void __exit usb_stv680_exit (void)
  1442. {
  1443. usb_deregister (&stv680_driver);
  1444. PDEBUG (0, "STV(i): driver deregistered");
  1445. #if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
  1446. proc_stv680_destroy ();
  1447. #endif
  1448. }
  1449. module_init (usb_stv680_init);
  1450. module_exit (usb_stv680_exit);