dc2xx.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:14k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (C) 1999-2000 by David Brownell <dbrownell@users.sourceforge.net>
  3.  *
  4.  * This program is free software; you can redistribute it and/or modify it
  5.  * under the terms of the GNU General Public License as published by the
  6.  * Free Software Foundation; either version 2 of the License, or (at your
  7.  * option) any later version.
  8.  *
  9.  * This program is distributed in the hope that it will be useful, but
  10.  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  11.  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12.  * for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software Foundation,
  16.  * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  */
  18.  
  19.  
  20. /*
  21.  * USB driver for Kodak DC-2XX series digital still cameras
  22.  *
  23.  * The protocol here is the same as the one going over a serial line, but
  24.  * it uses USB for speed.  Set up /dev/kodak, get gphoto (www.gphoto.org),
  25.  * and have fun!
  26.  *
  27.  * This should also work for a number of other digital (non-Kodak) cameras,
  28.  * by adding the vendor and product IDs to the table below.  They'll need
  29.  * to be the sort using USB just as a fast bulk data channel.
  30.  */
  31. /*
  32.  * HISTORY
  33.  *
  34.  * 26 August, 1999 -- first release (0.1), works with my DC-240.
  35.  *  The DC-280 (2Mpixel) should also work, but isn't tested.
  36.  * If you use gphoto, make sure you have the USB updates.
  37.  * Lives in a 2.3.14 or so Linux kernel, in drivers/usb.
  38.  * 31 August, 1999 -- minor update to recognize DC-260 and handle
  39.  * its endpoints being in a different order.  Note that as
  40.  * of gPhoto 0.36pre, the USB updates are integrated.
  41.  * 12 Oct, 1999 -- handle DC-280 interface class (0xff not 0x0);
  42.  * added timeouts to bulk_msg calls.  Minor updates, docs.
  43.  * 03 Nov, 1999 -- update for 2.3.25 kernel API changes.
  44.  * 08 Jan, 2000 .. multiple camera support
  45.  * 12 Aug, 2000 .. add some real locking, remove an Oops
  46.  * 10 Oct, 2000 .. usb_device_id table created. 
  47.  * 01 Nov, 2000 .. usb_device_id support added by Adam J. Richter
  48.  * 08 Apr, 2001 .. Identify version on module load. gb
  49.  *
  50.  * Thanks to:  the folk who've provided USB product IDs, sent in
  51.  * patches, and shared their successes!
  52.  */
  53. #include <linux/config.h>
  54. #include <linux/kernel.h>
  55. #include <linux/sched.h>
  56. #include <linux/signal.h>
  57. #include <linux/errno.h>
  58. #include <linux/miscdevice.h>
  59. #include <linux/random.h>
  60. #include <linux/poll.h>
  61. #include <linux/init.h>
  62. #include <linux/slab.h>
  63. #include <linux/module.h>
  64. #include <linux/devfs_fs_kernel.h>
  65. #ifdef CONFIG_USB_DEBUG
  66. #define DEBUG
  67. #else
  68. #undef DEBUG
  69. #endif
  70. #include <linux/usb.h>
  71. /* /dev/usb dir. */
  72. extern devfs_handle_t usb_devfs_handle;
  73. /*
  74.  * Version Information
  75.  */
  76. #define DRIVER_VERSION "v1.0.0"
  77. #define DRIVER_AUTHOR "David Brownell, <dbrownell@users.sourceforge.net>"
  78. #define DRIVER_DESC "USB Camera Driver for Kodak DC-2xx series cameras"
  79. /* current USB framework handles max of 16 USB devices per driver */
  80. #define MAX_CAMERAS 16
  81. /* USB char devs use USB_MAJOR and from USB_CAMERA_MINOR_BASE up */
  82. #define USB_CAMERA_MINOR_BASE 80
  83. // XXX remove packet size limit, now that bulk transfers seem fixed
  84. /* Application protocol limit is 0x8002; USB has disliked that limit! */
  85. #define MAX_PACKET_SIZE 0x2000 /* e.g. image downloading */
  86. #define MAX_READ_RETRY 5 /* times to retry reads */
  87. #define MAX_WRITE_RETRY 5 /* times to retry writes */
  88. #define RETRY_TIMEOUT (HZ) /* sleep between retries */
  89. /* table of cameras that work through this driver */
  90. static struct usb_device_id camera_table [] = {
  91. /* These have the same application level protocol */  
  92. { USB_DEVICE(0x040a, 0x0120) }, // Kodak DC-240
  93. { USB_DEVICE(0x040a, 0x0130) }, // Kodak DC-280
  94. { USB_DEVICE(0x040a, 0x0131) }, // Kodak DC-5000
  95. { USB_DEVICE(0x040a, 0x0132) }, // Kodak DC-3400
  96. /* These have a different application level protocol which
  97.  * is part of the Flashpoint "DigitaOS".  That supports some
  98.  * non-camera devices, and some non-Kodak cameras.
  99.  * Use this driver to get USB and "OpenDis" to talk.
  100.  */  
  101. { USB_DEVICE(0x040a, 0x0100) }, // Kodak DC-220
  102. { USB_DEVICE(0x040a, 0x0110) }, // Kodak DC-260
  103. { USB_DEVICE(0x040a, 0x0111) }, // Kodak DC-265
  104. { USB_DEVICE(0x040a, 0x0112) }, // Kodak DC-290
  105. { USB_DEVICE(0xf003, 0x6002) }, // HP PhotoSmart C500
  106. { USB_DEVICE(0x03f0, 0x4102) }, // HP PhotoSmart C618
  107. { USB_DEVICE(0x0a17, 0x1001) }, // Pentax EI-200
  108. /* Other USB devices may well work here too, so long as they
  109.  * just stick to half duplex bulk packet exchanges.  That
  110.  * means, among other things, no iso or interrupt endpoints.
  111.  */
  112. { } /* Terminating entry */
  113. };
  114. MODULE_DEVICE_TABLE (usb, camera_table);
  115. struct camera_state {
  116. struct usb_device *dev; /* USB device handle */
  117. int inEP; /* read endpoint */
  118. int outEP; /* write endpoint */
  119. const struct usb_device_id *info; /* DC-240, etc */
  120. int subminor; /* which minor dev #? */
  121. struct semaphore sem; /* locks this struct */
  122. /* this is non-null iff the device is open */
  123. char *buf; /* buffer for I/O */
  124. devfs_handle_t devfs; /* devfs device */
  125. /* always valid */
  126. wait_queue_head_t wait; /* for timed waits */
  127. };
  128. /* Support multiple cameras, possibly of different types.  */
  129. static struct camera_state *minor_data [MAX_CAMERAS];
  130. /* make this an rwlock if contention becomes an issue */
  131. static DECLARE_MUTEX (state_table_mutex);
  132. static ssize_t camera_read (struct file *file,
  133. char *buf, size_t len, loff_t *ppos)
  134. {
  135. struct camera_state *camera;
  136. int retries;
  137. int retval = 0;
  138. if (len > MAX_PACKET_SIZE)
  139. return -EINVAL;
  140. camera = (struct camera_state *) file->private_data;
  141. down (&camera->sem);
  142. if (!camera->dev) {
  143. up (&camera->sem);
  144. return -ENODEV;
  145. }
  146. /* Big reads are common, for image downloading.  Smaller ones
  147.  * are also common (even "directory listing" commands don't
  148.  * send very much data).  We preserve packet boundaries here,
  149.  * they matter in the application protocol.
  150.  */
  151. for (retries = 0; retries < MAX_READ_RETRY; retries++) {
  152. int count;
  153. if (signal_pending (current)) {
  154. retval = -EINTR;
  155. break;
  156. }
  157. retval = usb_bulk_msg (camera->dev,
  158.   usb_rcvbulkpipe (camera->dev, camera->inEP),
  159.   camera->buf, len, &count, HZ*10);
  160. dbg ("read (%Zd) - 0x%x %d", len, retval, count);
  161. if (!retval) {
  162. if (copy_to_user (buf, camera->buf, count))
  163. retval = -EFAULT;
  164. else
  165. retval = count;
  166. break;
  167. }
  168. if (retval != USB_ST_TIMEOUT)
  169. break;
  170. interruptible_sleep_on_timeout (&camera->wait, RETRY_TIMEOUT);
  171. dbg ("read (%Zd) - retry", len);
  172. }
  173. up (&camera->sem);
  174. return retval;
  175. }
  176. static ssize_t camera_write (struct file *file,
  177. const char *buf, size_t len, loff_t *ppos)
  178. {
  179. struct camera_state *camera;
  180. ssize_t bytes_written = 0;
  181. if (len > MAX_PACKET_SIZE)
  182. return -EINVAL;
  183. camera = (struct camera_state *) file->private_data;
  184. down (&camera->sem);
  185. if (!camera->dev) {
  186. up (&camera->sem);
  187. return -ENODEV;
  188. }
  189. /* most writes will be small: simple commands, sometimes with
  190.  * parameters.  putting images (like borders) into the camera
  191.  * would be the main use of big writes.
  192.  */
  193. while (len > 0) {
  194. char *obuf = camera->buf;
  195. int maxretry = MAX_WRITE_RETRY;
  196. unsigned long copy_size, thistime;
  197. /* it's not clear that retrying can do any good ... or that
  198.  * fragmenting application packets into N writes is correct.
  199.  */
  200. thistime = copy_size = len;
  201. if (copy_from_user (obuf, buf, copy_size)) {
  202. bytes_written = -EFAULT;
  203. break;
  204. }
  205. while (thistime) {
  206. int result;
  207. int count;
  208. if (signal_pending (current)) {
  209. if (!bytes_written)
  210. bytes_written = -EINTR;
  211. goto done;
  212. }
  213. result = usb_bulk_msg (camera->dev,
  214.  usb_sndbulkpipe (camera->dev, camera->outEP),
  215.  obuf, thistime, &count, HZ*10);
  216. if (result)
  217. dbg ("write USB err - %d", result);
  218. if (count) {
  219. obuf += count;
  220. thistime -= count;
  221. maxretry = MAX_WRITE_RETRY;
  222. continue;
  223. } else if (!result)
  224. break;
  225. if (result == USB_ST_TIMEOUT) { /* NAK - delay a bit */
  226. if (!maxretry--) {
  227. if (!bytes_written)
  228. bytes_written = -ETIME;
  229. goto done;
  230. }
  231.                                 interruptible_sleep_on_timeout (&camera->wait,
  232. RETRY_TIMEOUT);
  233. continue;
  234. if (!bytes_written)
  235. bytes_written = -EIO;
  236. goto done;
  237. }
  238. bytes_written += copy_size;
  239. len -= copy_size;
  240. buf += copy_size;
  241. }
  242. done:
  243. up (&camera->sem);
  244. dbg ("wrote %Zd", bytes_written); 
  245. return bytes_written;
  246. }
  247. static int camera_open (struct inode *inode, struct file *file)
  248. {
  249. struct camera_state *camera = NULL;
  250. int subminor;
  251. int value = 0;
  252. down (&state_table_mutex);
  253. subminor = MINOR (inode->i_rdev) - USB_CAMERA_MINOR_BASE;
  254. if (subminor < 0 || subminor >= MAX_CAMERAS
  255. || !(camera = minor_data [subminor])) {
  256. up (&state_table_mutex);
  257. return -ENODEV;
  258. }
  259. down (&camera->sem);
  260. up (&state_table_mutex);
  261. if (camera->buf) {
  262. value = -EBUSY;
  263. goto done;
  264. }
  265. if (!(camera->buf = (char *) kmalloc (MAX_PACKET_SIZE, GFP_KERNEL))) {
  266. value = -ENOMEM;
  267. goto done;
  268. }
  269. dbg ("open #%d", subminor); 
  270. file->private_data = camera;
  271. done:
  272. up (&camera->sem);
  273. return value;
  274. }
  275. static int camera_release (struct inode *inode, struct file *file)
  276. {
  277. struct camera_state *camera;
  278. int subminor;
  279. camera = (struct camera_state *) file->private_data;
  280. down (&state_table_mutex);
  281. down (&camera->sem);
  282. if (camera->buf) {
  283. kfree (camera->buf);
  284. camera->buf = 0;
  285. }
  286. subminor = camera->subminor;
  287. /* If camera was unplugged with open file ... */
  288. if (!camera->dev) {
  289. minor_data [subminor] = NULL;
  290. kfree (camera);
  291. } else
  292. up (&camera->sem);
  293. up (&state_table_mutex);
  294. dbg ("close #%d", subminor); 
  295. return 0;
  296. }
  297. /* XXX should define some ioctls to expose camera type
  298.  * to applications ... what USB exposes should suffice.
  299.  * apps should be able to see the camera type.
  300.  */
  301. static /* const */ struct file_operations usb_camera_fops = {
  302.     /* Uses GCC initializer extension; simpler to maintain */
  303. owner: THIS_MODULE,
  304. read: camera_read,
  305. write: camera_write,
  306. open: camera_open,
  307. release: camera_release,
  308. };
  309. static void *
  310. camera_probe (struct usb_device *dev, unsigned int ifnum, const struct usb_device_id *camera_info)
  311. {
  312. int i;
  313. struct usb_interface_descriptor *interface;
  314. struct usb_endpoint_descriptor *endpoint;
  315. int direction, ep;
  316. char name[8];
  317. struct camera_state *camera = NULL;
  318. /* these have one config, one interface */
  319. if (dev->descriptor.bNumConfigurations != 1
  320. || dev->config[0].bNumInterfaces != 1) {
  321. dbg ("Bogus camera config info");
  322. return NULL;
  323. }
  324. /* models differ in how they report themselves */
  325. interface = &dev->actconfig->interface[ifnum].altsetting[0];
  326. if ((interface->bInterfaceClass != USB_CLASS_PER_INTERFACE
  327. && interface->bInterfaceClass != USB_CLASS_VENDOR_SPEC)
  328. || interface->bInterfaceSubClass != 0
  329. || interface->bInterfaceProtocol != 0
  330. || interface->bNumEndpoints != 2
  331. ) {
  332. dbg ("Bogus camera interface info");
  333. return NULL;
  334. }
  335. /* select "subminor" number (part of a minor number) */
  336. down (&state_table_mutex);
  337. for (i = 0; i < MAX_CAMERAS; i++) {
  338. if (!minor_data [i])
  339. break;
  340. }
  341. if (i >= MAX_CAMERAS) {
  342. info ("Ignoring additional USB Camera");
  343. goto bye;
  344. }
  345. /* allocate & init camera state */
  346. camera = minor_data [i] = kmalloc (sizeof *camera, GFP_KERNEL);
  347. if (!camera) {
  348. err ("no memory!");
  349. goto bye;
  350. }
  351. init_MUTEX (&camera->sem);
  352. camera->info = camera_info;
  353. camera->subminor = i;
  354. camera->buf = NULL;
  355. init_waitqueue_head (&camera->wait);
  356. /* get input and output endpoints (either order) */
  357. endpoint = interface->endpoint;
  358. camera->outEP = camera->inEP =  -1;
  359. ep = endpoint [0].bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
  360. direction = endpoint [0].bEndpointAddress & USB_ENDPOINT_DIR_MASK;
  361. if (direction == USB_DIR_IN)
  362. camera->inEP = ep;
  363. else
  364. camera->outEP = ep;
  365. ep = endpoint [1].bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
  366. direction = endpoint [1].bEndpointAddress & USB_ENDPOINT_DIR_MASK;
  367. if (direction == USB_DIR_IN)
  368. camera->inEP = ep;
  369. else
  370. camera->outEP = ep;
  371. if (camera->outEP == -1 || camera->inEP == -1
  372. || endpoint [0].bmAttributes != USB_ENDPOINT_XFER_BULK
  373. || endpoint [1].bmAttributes != USB_ENDPOINT_XFER_BULK
  374. ) {
  375. dbg ("Bogus endpoints");
  376. goto error;
  377. }
  378. info ("USB Camera #%d connected, major/minor %d/%d", camera->subminor,
  379. USB_MAJOR, USB_CAMERA_MINOR_BASE + camera->subminor);
  380. camera->dev = dev;
  381. usb_inc_dev_use (dev);
  382. /* If we have devfs, register the device */
  383. sprintf(name, "dc2xx%d", camera->subminor);
  384. camera->devfs = devfs_register(usb_devfs_handle, name,
  385.        DEVFS_FL_DEFAULT, USB_MAJOR,
  386.        USB_CAMERA_MINOR_BASE + camera->subminor,
  387.        S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP |
  388.        S_IWGRP, &usb_camera_fops, NULL);
  389. goto bye;
  390. error:
  391. minor_data [camera->subminor] = NULL;
  392. kfree (camera);
  393. camera = NULL;
  394. bye:
  395. up (&state_table_mutex);
  396. return camera;
  397. }
  398. static void camera_disconnect(struct usb_device *dev, void *ptr)
  399. {
  400. struct camera_state *camera = (struct camera_state *) ptr;
  401. int subminor = camera->subminor;
  402. down (&state_table_mutex);
  403. down (&camera->sem);
  404. devfs_unregister(camera->devfs); 
  405. /* If camera's not opened, we can clean up right away.
  406.  * Else apps see a disconnect on next I/O; the release cleans.
  407.  */
  408. if (!camera->buf) {
  409. minor_data [subminor] = NULL;
  410. kfree (camera);
  411. camera = NULL;
  412. } else
  413. camera->dev = NULL;
  414. info ("USB Camera #%d disconnected", subminor);
  415. usb_dec_dev_use (dev);
  416. if (camera != NULL)
  417. up (&camera->sem);
  418. up (&state_table_mutex);
  419. }
  420. static /* const */ struct usb_driver camera_driver = {
  421. name: "dc2xx",
  422. id_table: camera_table,
  423. probe: camera_probe,
  424. disconnect: camera_disconnect,
  425. fops: &usb_camera_fops,
  426. minor: USB_CAMERA_MINOR_BASE
  427. };
  428. int __init usb_dc2xx_init(void)
  429. {
  430.   if (usb_register (&camera_driver) < 0)
  431.   return -1;
  432. info(DRIVER_VERSION ":" DRIVER_DESC);
  433. return 0;
  434. }
  435. void __exit usb_dc2xx_cleanup(void)
  436. {
  437. usb_deregister (&camera_driver);
  438. }
  439. module_init (usb_dc2xx_init);
  440. module_exit (usb_dc2xx_cleanup);
  441. MODULE_AUTHOR( DRIVER_AUTHOR );
  442. MODULE_DESCRIPTION( DRIVER_DESC );
  443. MODULE_LICENSE("GPL");