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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * cpia_usb CPiA USB driver
  3.  *
  4.  * Supports CPiA based parallel port Video Camera's.
  5.  *
  6.  * Copyright (C) 1999        Jochen Scharrlach <Jochen.Scharrlach@schwaben.de>
  7.  * Copyright (C) 1999, 2000  Johannes Erdfelt <johannes@erdfelt.com>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  22.  */
  23. #include <linux/module.h>
  24. #include <linux/kernel.h>
  25. #include <linux/init.h>
  26. #include <linux/wait.h>
  27. #include <linux/sched.h>
  28. #include <linux/list.h>
  29. #include <linux/slab.h>
  30. #include <linux/vmalloc.h>
  31. #include <linux/usb.h>
  32. #include "cpia.h"
  33. #define USB_REQ_CPIA_GRAB_FRAME 0xC1
  34. #define USB_REQ_CPIA_UPLOAD_FRAME 0xC2
  35. #define  WAIT_FOR_NEXT_FRAME 0
  36. #define  FORCE_FRAME_UPLOAD 1
  37. #define FRAMES_PER_DESC 10
  38. #define FRAME_SIZE_PER_DESC 960 /* Shouldn't be hardcoded */
  39. #define CPIA_NUMSBUF 2
  40. #define STREAM_BUF_SIZE (PAGE_SIZE * 4)
  41. #define SCRATCH_BUF_SIZE (STREAM_BUF_SIZE * 2)
  42. struct cpia_sbuf {
  43. char *data;
  44. urb_t *urb;
  45. };
  46. #define FRAMEBUF_LEN (CPIA_MAX_FRAME_SIZE+100)
  47. enum framebuf_status {
  48. FRAME_EMPTY,
  49. FRAME_READING,
  50. FRAME_READY,
  51. FRAME_ERROR,
  52. };
  53. struct framebuf {
  54. int length;
  55. enum framebuf_status status;
  56. u8 data[FRAMEBUF_LEN];
  57. struct framebuf *next;
  58. };
  59. struct usb_cpia {
  60. /* Device structure */
  61. struct usb_device *dev;
  62. unsigned char iface;
  63. wait_queue_head_t wq_stream;
  64. int cursbuf; /* Current receiving sbuf */
  65. struct cpia_sbuf sbuf[CPIA_NUMSBUF]; /* Double buffering */
  66. int streaming;
  67. int open;
  68. int present;
  69. struct framebuf *buffers[3];
  70. struct framebuf *curbuff, *workbuff;
  71. };
  72. static int cpia_usb_open(void *privdata);
  73. static int cpia_usb_registerCallback(void *privdata, void (*cb) (void *cbdata),
  74.              void *cbdata);
  75. static int cpia_usb_transferCmd(void *privdata, u8 *command, u8 *data);
  76. static int cpia_usb_streamStart(void *privdata);
  77. static int cpia_usb_streamStop(void *privdata);
  78. static int cpia_usb_streamRead(void *privdata, u8 *frame, int noblock);
  79. static int cpia_usb_close(void *privdata);
  80. #define ABOUT "USB driver for Vision CPiA based cameras"
  81. static struct cpia_camera_ops cpia_usb_ops = {
  82. cpia_usb_open,
  83. cpia_usb_registerCallback,
  84. cpia_usb_transferCmd,
  85. cpia_usb_streamStart,
  86. cpia_usb_streamStop,
  87. cpia_usb_streamRead,
  88. cpia_usb_close,
  89. 0
  90. };
  91. static struct cam_data *cam_list;
  92. static spinlock_t cam_list_lock_usb;
  93. static void cpia_usb_complete(struct urb *urb)
  94. {
  95. int i;
  96. char *cdata;
  97. struct usb_cpia *ucpia;
  98. if (!urb || !urb->context)
  99. return;
  100. ucpia = (struct usb_cpia *) urb->context;
  101. if (!ucpia->dev || !ucpia->streaming || !ucpia->present || !ucpia->open)
  102. return;
  103. if (ucpia->workbuff->status == FRAME_EMPTY) {
  104. ucpia->workbuff->status = FRAME_READING;
  105. ucpia->workbuff->length = 0;
  106. }
  107.     
  108. for (i = 0; i < urb->number_of_packets; i++) {
  109. int n = urb->iso_frame_desc[i].actual_length;
  110. int st = urb->iso_frame_desc[i].status;
  111. cdata = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
  112. if (st)
  113. printk(KERN_DEBUG "cpia data error: [%d] len=%d, status=%Xn", i, n, st);
  114. if (FRAMEBUF_LEN < ucpia->workbuff->length + n) {
  115. printk(KERN_DEBUG "cpia: scratch buf overflow!scr_len: %d, n: %dn", ucpia->workbuff->length, n);
  116. return;
  117. }
  118.     
  119. if (n) {
  120. if ((ucpia->workbuff->length > 0) || 
  121.     (0x19 == cdata[0] && 0x68 == cdata[1])) {
  122. memcpy(ucpia->workbuff->data + ucpia->workbuff->length, cdata, n);
  123. ucpia->workbuff->length += n;
  124. } else
  125. DBG("Ignoring packet!n");
  126. } else {
  127. if (ucpia->workbuff->length > 4 &&
  128.     0xff == ucpia->workbuff->data[ucpia->workbuff->length-1] &&
  129.     0xff == ucpia->workbuff->data[ucpia->workbuff->length-2] &&
  130.     0xff == ucpia->workbuff->data[ucpia->workbuff->length-3] &&
  131.     0xff == ucpia->workbuff->data[ucpia->workbuff->length-4]) {
  132. ucpia->workbuff->status = FRAME_READY;
  133. ucpia->curbuff = ucpia->workbuff;
  134. ucpia->workbuff = ucpia->workbuff->next;
  135. ucpia->workbuff->status = FRAME_EMPTY;
  136. ucpia->workbuff->length = 0;
  137.   
  138. if (waitqueue_active(&ucpia->wq_stream))
  139. wake_up_interruptible(&ucpia->wq_stream);
  140. }
  141. }
  142. }
  143. }
  144. static int cpia_usb_open(void *privdata)
  145. {
  146. struct usb_cpia *ucpia = (struct usb_cpia *) privdata;
  147. urb_t *urb;
  148. int ret, retval = 0, fx, err;
  149.   
  150. if (!ucpia)
  151. return -EINVAL;
  152. ucpia->sbuf[0].data = kmalloc(FRAMES_PER_DESC * FRAME_SIZE_PER_DESC, GFP_KERNEL);
  153. if (!ucpia->sbuf[0].data)
  154. return -EINVAL;
  155. ucpia->sbuf[1].data = kmalloc(FRAMES_PER_DESC * FRAME_SIZE_PER_DESC, GFP_KERNEL);
  156. if (!ucpia->sbuf[1].data) {
  157. retval = -EINVAL;
  158. goto error_0;
  159. }
  160. ret = usb_set_interface(ucpia->dev, ucpia->iface, 3);
  161. if (ret < 0) {
  162. printk(KERN_ERR "cpia_usb_open: usb_set_interface error (ret = %d)n", ret);
  163. retval = -EBUSY;
  164. goto error_1;
  165. }
  166. ucpia->buffers[0]->status = FRAME_EMPTY;
  167. ucpia->buffers[0]->length = 0;
  168. ucpia->buffers[1]->status = FRAME_EMPTY;
  169. ucpia->buffers[1]->length = 0;
  170. ucpia->buffers[2]->status = FRAME_EMPTY;
  171. ucpia->buffers[2]->length = 0;
  172. ucpia->curbuff = ucpia->buffers[0];
  173. ucpia->workbuff = ucpia->buffers[1];
  174. /* We double buffer the Iso lists */
  175. urb = usb_alloc_urb(FRAMES_PER_DESC);
  176. if (!urb) {
  177. printk(KERN_ERR "cpia_init_isoc: usb_alloc_urb 0n");
  178. retval = -ENOMEM;
  179. goto error_1;
  180. }
  181. ucpia->sbuf[0].urb = urb;
  182. urb->dev = ucpia->dev;
  183. urb->context = ucpia;
  184. urb->pipe = usb_rcvisocpipe(ucpia->dev, 1);
  185. urb->transfer_flags = USB_ISO_ASAP;
  186. urb->transfer_buffer = ucpia->sbuf[0].data;
  187. urb->complete = cpia_usb_complete;
  188. urb->number_of_packets = FRAMES_PER_DESC;
  189. urb->transfer_buffer_length = FRAME_SIZE_PER_DESC * FRAMES_PER_DESC;
  190. for (fx = 0; fx < FRAMES_PER_DESC; fx++) {
  191. urb->iso_frame_desc[fx].offset = FRAME_SIZE_PER_DESC * fx;
  192. urb->iso_frame_desc[fx].length = FRAME_SIZE_PER_DESC;
  193. }
  194. urb = usb_alloc_urb(FRAMES_PER_DESC);
  195. if (!urb) {
  196. printk(KERN_ERR "cpia_init_isoc: usb_alloc_urb 1n");
  197. retval = -ENOMEM;
  198. goto error_urb0;
  199. }
  200. ucpia->sbuf[1].urb = urb;
  201. urb->dev = ucpia->dev;
  202. urb->context = ucpia;
  203. urb->pipe = usb_rcvisocpipe(ucpia->dev, 1);
  204. urb->transfer_flags = USB_ISO_ASAP;
  205. urb->transfer_buffer = ucpia->sbuf[1].data;
  206. urb->complete = cpia_usb_complete;
  207. urb->number_of_packets = FRAMES_PER_DESC;
  208. urb->transfer_buffer_length = FRAME_SIZE_PER_DESC * FRAMES_PER_DESC;
  209. for (fx = 0; fx < FRAMES_PER_DESC; fx++) {
  210. urb->iso_frame_desc[fx].offset = FRAME_SIZE_PER_DESC * fx;
  211. urb->iso_frame_desc[fx].length = FRAME_SIZE_PER_DESC;
  212. }
  213. ucpia->sbuf[1].urb->next = ucpia->sbuf[0].urb;
  214. ucpia->sbuf[0].urb->next = ucpia->sbuf[1].urb;
  215. err = usb_submit_urb(ucpia->sbuf[0].urb);
  216. if (err) {
  217. printk(KERN_ERR "cpia_init_isoc: usb_submit_urb 0 ret %dn",
  218. err);
  219. goto error_urb1;
  220. }
  221. err = usb_submit_urb(ucpia->sbuf[1].urb);
  222. if (err) {
  223. printk(KERN_ERR "cpia_init_isoc: usb_submit_urb 1 ret %dn",
  224. err);
  225. goto error_urb1;
  226. }
  227. ucpia->streaming = 1;
  228. ucpia->open = 1;
  229. return 0;
  230. error_urb1: /* free urb 1 */
  231. usb_free_urb(ucpia->sbuf[1].urb);
  232. error_urb0: /* free urb 0 */
  233. usb_free_urb(ucpia->sbuf[0].urb);
  234. error_1:
  235. kfree (ucpia->sbuf[1].data);
  236. error_0:
  237. kfree (ucpia->sbuf[0].data);
  238. return retval;
  239. }
  240. //
  241. // convenience functions
  242. //
  243. /****************************************************************************
  244.  *
  245.  *  WritePacket
  246.  *
  247.  ***************************************************************************/
  248. static int WritePacket(struct usb_device *udev, const u8 *packet, u8 *buf, size_t size)
  249. {
  250. if (!packet)
  251. return -EINVAL;
  252. return usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
  253.  packet[1] + (packet[0] << 8),
  254.  USB_TYPE_VENDOR | USB_RECIP_DEVICE,
  255.  packet[2] + (packet[3] << 8), 
  256.  packet[4] + (packet[5] << 8), buf, size, HZ);
  257. }
  258. /****************************************************************************
  259.  *
  260.  *  ReadPacket
  261.  *
  262.  ***************************************************************************/
  263. static int ReadPacket(struct usb_device *udev, u8 *packet, u8 *buf, size_t size)
  264. {
  265. if (!packet || size <= 0)
  266. return -EINVAL;
  267. return usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
  268.  packet[1] + (packet[0] << 8),
  269.  USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
  270.  packet[2] + (packet[3] << 8), 
  271.  packet[4] + (packet[5] << 8), buf, size, HZ);
  272. }
  273. static int cpia_usb_transferCmd(void *privdata, u8 *command, u8 *data)
  274. {
  275. int err = 0;
  276. int databytes;
  277. struct usb_cpia *ucpia = (struct usb_cpia *)privdata;
  278. struct usb_device *udev = ucpia->dev;
  279. if (!udev) {
  280. DBG("Internal driver error: udev is NULLn");
  281. return -EINVAL;
  282. }
  283. if (!command) {
  284. DBG("Internal driver error: command is NULLn");
  285. return -EINVAL;
  286. }
  287. databytes = (((int)command[7])<<8) | command[6];
  288. if (command[0] == DATA_IN) {
  289. u8 buffer[8];
  290. if (!data) {
  291. DBG("Internal driver error: data is NULLn");
  292. return -EINVAL;
  293. }
  294. err = ReadPacket(udev, command, buffer, 8);
  295. if (err < 0)
  296. return err;
  297. memcpy(data, buffer, databytes);
  298. } else if(command[0] == DATA_OUT)
  299. WritePacket(udev, command, data, databytes);
  300. else {
  301. DBG("Unexpected first byte of command: %xn", command[0]);
  302. err = -EINVAL;
  303. }
  304. return 0;
  305. }
  306. static int cpia_usb_registerCallback(void *privdata, void (*cb) (void *cbdata),
  307. void *cbdata)
  308. {
  309. return -ENODEV;
  310. }
  311. static int cpia_usb_streamStart(void *privdata)
  312. {
  313. return -ENODEV;
  314. }
  315. static int cpia_usb_streamStop(void *privdata)
  316. {
  317. return -ENODEV;
  318. }
  319. static int cpia_usb_streamRead(void *privdata, u8 *frame, int noblock)
  320. {
  321. struct usb_cpia *ucpia = (struct usb_cpia *) privdata;
  322. struct framebuf *mybuff;
  323. if (!ucpia || !ucpia->present)
  324. return -1;
  325.   
  326. if (ucpia->curbuff->status != FRAME_READY)
  327. interruptible_sleep_on(&ucpia->wq_stream);
  328. else
  329. DBG("Frame already waiting!n");
  330. mybuff = ucpia->curbuff;
  331. if (!mybuff)
  332. return -1;
  333.   
  334. if (mybuff->status != FRAME_READY || mybuff->length < 4) {
  335. DBG("Something went wrong!n");
  336. return -1;
  337. }
  338. memcpy(frame, mybuff->data, mybuff->length);
  339. mybuff->status = FRAME_EMPTY;
  340.   
  341. /*   DBG("read done, %d bytes, Header: %x/%x, Footer: %x%x%x%xn",  */
  342. /*       mybuff->length, frame[0], frame[1], */
  343. /*       frame[mybuff->length-4], frame[mybuff->length-3],  */
  344. /*       frame[mybuff->length-2], frame[mybuff->length-1]); */
  345. return mybuff->length;
  346. }
  347. static void cpia_usb_free_resources(struct usb_cpia *ucpia, int try)
  348. {
  349. if (!ucpia->streaming)
  350. return;
  351. ucpia->streaming = 0;
  352. /* Set packet size to 0 */
  353. if (try) {
  354. int ret;
  355. ret = usb_set_interface(ucpia->dev, ucpia->iface, 0);
  356. if (ret < 0) {
  357. printk(KERN_ERR "usb_set_interface error (ret = %d)n", ret);
  358. return;
  359. }
  360. }
  361. /* Unschedule all of the iso td's */
  362. if (ucpia->sbuf[1].urb) {
  363. usb_unlink_urb(ucpia->sbuf[1].urb);
  364. usb_free_urb(ucpia->sbuf[1].urb);
  365. ucpia->sbuf[1].urb = NULL;
  366. }
  367. if (ucpia->sbuf[1].data) {
  368. kfree(ucpia->sbuf[1].data);
  369. ucpia->sbuf[1].data = NULL;
  370. }
  371.  
  372. if (ucpia->sbuf[0].urb) {
  373. usb_unlink_urb(ucpia->sbuf[0].urb);
  374. usb_free_urb(ucpia->sbuf[0].urb);
  375. ucpia->sbuf[0].urb = NULL;
  376. }
  377. if (ucpia->sbuf[0].data) {
  378. kfree(ucpia->sbuf[0].data);
  379. ucpia->sbuf[0].data = NULL;
  380. }
  381. }
  382. static int cpia_usb_close(void *privdata)
  383. {
  384. struct usb_cpia *ucpia = (struct usb_cpia *) privdata;
  385. ucpia->open = 0;
  386. cpia_usb_free_resources(ucpia, 1);
  387. if (!ucpia->present)
  388. kfree(ucpia);
  389. return 0;
  390. }
  391. int cpia_usb_init(void)
  392. {
  393. /* return -ENODEV; */
  394. return 0;
  395. }
  396. /* Probing and initializing */
  397. static void *cpia_probe(struct usb_device *udev, unsigned int ifnum,
  398. const struct usb_device_id *id)
  399. {
  400. struct usb_interface_descriptor *interface;
  401. struct usb_cpia *ucpia;
  402. struct cam_data *cam;
  403. int ret;
  404.   
  405. /* A multi-config CPiA camera? */
  406. if (udev->descriptor.bNumConfigurations != 1)
  407. return NULL;
  408. interface = &udev->actconfig->interface[ifnum].altsetting[0];
  409. printk(KERN_INFO "USB CPiA camera foundn");
  410. ucpia = kmalloc(sizeof(*ucpia), GFP_KERNEL);
  411. if (!ucpia) {
  412. printk(KERN_ERR "couldn't kmalloc cpia structn");
  413. return NULL;
  414. }
  415. memset(ucpia, 0, sizeof(*ucpia));
  416. ucpia->dev = udev;
  417. ucpia->iface = interface->bInterfaceNumber;
  418. init_waitqueue_head(&ucpia->wq_stream);
  419. ucpia->buffers[0] = vmalloc(sizeof(*ucpia->buffers[0]));
  420. if (!ucpia->buffers[0]) {
  421. printk(KERN_ERR "couldn't vmalloc frame buffer 0n");
  422. goto fail_alloc_0;
  423. }
  424. ucpia->buffers[1] = vmalloc(sizeof(*ucpia->buffers[1]));
  425. if (!ucpia->buffers[1]) {
  426. printk(KERN_ERR "couldn't vmalloc frame buffer 1n");
  427. goto fail_alloc_1;
  428. }
  429. ucpia->buffers[2] = vmalloc(sizeof(*ucpia->buffers[2]));
  430. if (!ucpia->buffers[2]) {
  431. printk(KERN_ERR "couldn't vmalloc frame buffer 2n");
  432. goto fail_alloc_2;
  433. }
  434. ucpia->buffers[0]->next = ucpia->buffers[1];
  435. ucpia->buffers[1]->next = ucpia->buffers[2];
  436. ucpia->buffers[2]->next = ucpia->buffers[0];
  437. ret = usb_set_interface(udev, ucpia->iface, 0);
  438. if (ret < 0) {
  439. printk(KERN_ERR "cpia_probe: usb_set_interface error (ret = %d)n", ret);
  440. /* goto fail_all; */
  441. }
  442. /* Before register_camera, important */
  443. ucpia->present = 1;
  444.   
  445. cam = cpia_register_camera(&cpia_usb_ops, ucpia);
  446. if (!cam) {
  447. LOG("failed to cpia_register_cameran");
  448. goto fail_all;
  449. }
  450. spin_lock( &cam_list_lock_usb );
  451. cpia_add_to_list(cam_list, cam);
  452. spin_unlock( &cam_list_lock_usb );
  453. return cam;
  454. fail_all:
  455. vfree(ucpia->buffers[2]);
  456. ucpia->buffers[2] = NULL;
  457. fail_alloc_2:
  458. vfree(ucpia->buffers[1]);
  459. ucpia->buffers[1] = NULL;
  460. fail_alloc_1:
  461. vfree(ucpia->buffers[0]);
  462. ucpia->buffers[0] = NULL;
  463. fail_alloc_0:
  464. return NULL;
  465. }
  466. static void cpia_disconnect(struct usb_device *dev, void *ptr);
  467. static struct usb_device_id cpia_id_table [] = {
  468. { USB_DEVICE(0x0553, 0x0002) },
  469. { USB_DEVICE(0x0813, 0x0001) },
  470. { } /* Terminating entry */
  471. };
  472. MODULE_DEVICE_TABLE (usb, cpia_id_table);
  473. MODULE_LICENSE("GPL");
  474. static struct usb_driver cpia_driver = {
  475. name: "cpia",
  476. probe: cpia_probe,
  477. disconnect: cpia_disconnect,
  478. id_table: cpia_id_table,
  479. };
  480. /* don't use dev, it may be NULL! (see usb_cpia_cleanup) */
  481. /* _disconnect from usb_cpia_cleanup is not necessary since usb_deregister */
  482. /* will do it for us as well as passing a udev structure - jerdfelt */
  483. static void cpia_disconnect(struct usb_device *udev, void *ptr)
  484. {
  485. struct cam_data *cam = (struct cam_data *) ptr;
  486. struct usb_cpia *ucpia = (struct usb_cpia *) cam->lowlevel_data;
  487.   
  488. spin_lock( &cam_list_lock_usb );
  489. cpia_remove_from_list(cam);
  490. spin_unlock( &cam_list_lock_usb );
  491. /* Don't even try to reset the altsetting if we're disconnected */
  492. cpia_usb_free_resources(ucpia, 0);
  493. ucpia->present = 0;
  494. cpia_unregister_camera(cam);
  495. ucpia->curbuff->status = FRAME_ERROR;
  496. if (waitqueue_active(&ucpia->wq_stream))
  497. wake_up_interruptible(&ucpia->wq_stream);
  498. usb_driver_release_interface(&cpia_driver,
  499.      &udev->actconfig->interface[0]);
  500. ucpia->curbuff = ucpia->workbuff = NULL;
  501. if (ucpia->buffers[2]) {
  502. vfree(ucpia->buffers[2]);
  503. ucpia->buffers[2] = NULL;
  504. }
  505. if (ucpia->buffers[1]) {
  506. vfree(ucpia->buffers[1]);
  507. ucpia->buffers[1] = NULL;
  508. }
  509. if (ucpia->buffers[0]) {
  510. vfree(ucpia->buffers[0]);
  511. ucpia->buffers[0] = NULL;
  512. }
  513. if (!ucpia->open)
  514. kfree(ucpia);
  515. }
  516. static int __init usb_cpia_init(void)
  517. {
  518. cam_list = NULL;
  519. spin_lock_init(&cam_list_lock_usb);
  520. return usb_register(&cpia_driver);
  521. }
  522. static void __exit usb_cpia_cleanup(void)
  523. {
  524. /*
  525. struct cam_data *cam;
  526. while ((cam = cam_list) != NULL)
  527. cpia_disconnect(NULL, cam);
  528. */
  529. usb_deregister(&cpia_driver);
  530. }
  531. module_init (usb_cpia_init);
  532. module_exit (usb_cpia_cleanup);