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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * copyright (C) 1999/2000 by Henning Zabel <henning@uni-paderborn.de>
  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.  * USB-Kernel Driver for the Mustek MDC800 Digital Camera
  20.  * (c) 1999/2000 Henning Zabel <henning@uni-paderborn.de>
  21.  *
  22.  *
  23.  * The driver brings the USB functions of the MDC800 to Linux.
  24.  * To use the Camera you must support the USB Protocoll of the camera
  25.  * to the Kernel Node.
  26.  * The Driver uses a misc device Node. Create it with :
  27.  * mknod /dev/mustek c 180 32
  28.  *
  29.  * The driver supports only one camera.
  30.  * 
  31.  * Fix: mdc800 used sleep_on and slept with io_lock held.
  32.  * Converted sleep_on to waitqueues with schedule_timeout and made io_lock
  33.  * a semaphore from a spinlock.
  34.  * by Oliver Neukum <520047054719-0001@t-online.de>
  35.  * (02/12/2001)
  36.  * 
  37.  * Identify version on module load.
  38.  * (08/04/2001) gb
  39.  *
  40.  * version 0.7.5
  41.  * Fixed potential SMP races with Spinlocks.
  42.  * Thanks to Oliver Neukum <oliver.neukum@lrz.uni-muenchen.de> who 
  43.  * noticed the race conditions.
  44.  * (30/10/2000)
  45.  *
  46.  * Fixed: Setting urb->dev before submitting urb.
  47.  * by Greg KH <greg@kroah.com>
  48.  * (13/10/2000)
  49.  *
  50.  * version 0.7.3
  51.  * bugfix : The mdc800->state field gets set to READY after the
  52.  * the diconnect function sets it to NOT_CONNECTED. This makes the
  53.  * driver running like the camera is connected and causes some
  54.  * hang ups.
  55.  *
  56.  * version 0.7.1
  57.  * MOD_INC and MOD_DEC are changed in usb_probe to prevent load/unload
  58.  * problems when compiled as Module.
  59.  * (04/04/2000)
  60.  *
  61.  * The mdc800 driver gets assigned the USB Minor 32-47. The Registration
  62.  * was updated to use these values.
  63.  * (26/03/2000)
  64.  *
  65.  * The Init und Exit Module Function are updated.
  66.  * (01/03/2000)
  67.  *
  68.  * version 0.7.0
  69.  * Rewrite of the driver : The driver now uses URB's. The old stuff
  70.  * has been removed.
  71.  *
  72.  * version 0.6.0
  73.  * Rewrite of this driver: The Emulation of the rs232 protocoll
  74.  * has been removed from the driver. A special executeCommand function
  75.  * for this driver is included to gphoto.
  76.  * The driver supports two kind of communication to bulk endpoints.
  77.  * Either with the dev->bus->ops->bulk... or with callback function.
  78.  * (09/11/1999)
  79.  *
  80.  * version 0.5.0:
  81.  * first Version that gets a version number. Most of the needed
  82.  * functions work.
  83.  * (20/10/1999)
  84.  */
  85. #include <linux/version.h>
  86. #include <linux/sched.h>
  87. #include <linux/signal.h>
  88. #include <linux/spinlock.h>
  89. #include <linux/errno.h>
  90. #include <linux/random.h>
  91. #include <linux/poll.h>
  92. #include <linux/init.h>
  93. #include <linux/slab.h>
  94. #include <linux/module.h>
  95. #include <linux/smp_lock.h>
  96. #include <linux/usb.h>
  97. /*
  98.  * Version Information
  99.  */
  100. #define DRIVER_VERSION "v0.7.5 (30/10/2000)"
  101. #define DRIVER_AUTHOR "Henning Zabel <henning@uni-paderborn.de>"
  102. #define DRIVER_DESC "USB Driver for Mustek MDC800 Digital Camera"
  103. /* Vendor and Product Information */
  104. #define MDC800_VENDOR_ID  0x055f
  105. #define MDC800_PRODUCT_ID 0xa800
  106. /* Timeouts (msec) */
  107. #define TO_DOWNLOAD_GET_READY 1500
  108. #define TO_DOWNLOAD_GET_BUSY 1500
  109. #define TO_WRITE_GET_READY 1000
  110. #define TO_DEFAULT_COMMAND 5000
  111. #define TO_READ_FROM_IRQ  TO_DEFAULT_COMMAND
  112. #define TO_GET_READY TO_DEFAULT_COMMAND
  113. /* Minor Number of the device (create with mknod /dev/mustek c 180 32) */
  114. #define MDC800_DEVICE_MINOR_BASE 32
  115. /**************************************************************************
  116. Data and structs
  117. ***************************************************************************/
  118. typedef enum {
  119. NOT_CONNECTED, READY, WORKING, DOWNLOAD
  120. } mdc800_state;
  121. /* Data for the driver */
  122. struct mdc800_data
  123. {
  124. struct usb_device * dev; // Device Data
  125. mdc800_state  state;
  126. unsigned int endpoint [4];
  127. struct urb * irq_urb;
  128. wait_queue_head_t irq_wait;
  129. int                     irq_woken;
  130. char* irq_urb_buffer;
  131. int camera_busy;          // is camera busy ?
  132. int  camera_request_ready; // Status to synchronize with irq
  133. char  camera_response [8];  // last Bytes send after busy
  134. struct urb *    write_urb;
  135. char* write_urb_buffer;
  136. wait_queue_head_t write_wait;
  137. int                     written;
  138. struct urb * download_urb;
  139. char* download_urb_buffer;
  140. wait_queue_head_t download_wait;
  141. int                     downloaded;
  142. int download_left; // Bytes left to download ?
  143. /* Device Data */
  144. char out [64]; // Answer Buffer
  145. int  out_ptr; // Index to the first not readen byte
  146. int out_count; // Bytes in the buffer
  147. int open; // Camera device open ?
  148. struct semaphore io_lock; // IO -lock
  149. char  in [8]; // Command Input Buffer
  150. int   in_count;
  151. int pic_index; // Cache for the Imagesize (-1 for nothing cached )
  152. int pic_len;
  153. };
  154. /* Specification of the Endpoints */
  155. static struct usb_endpoint_descriptor mdc800_ed [4] =
  156. {
  157. { 0,0, 0x01, 0x02,  8, 0,0,0 },
  158. { 0,0, 0x82, 0x03,  8, 0,0,0 },
  159. { 0,0, 0x03, 0x02, 64, 0,0,0 },
  160. { 0,0, 0x84, 0x02, 64, 0,0,0 }
  161. };
  162. /* The Variable used by the driver */
  163. static struct mdc800_data* mdc800=0;
  164. /***************************************************************************
  165. The USB Part of the driver
  166. ****************************************************************************/
  167. static int mdc800_endpoint_equals (struct usb_endpoint_descriptor *a,struct usb_endpoint_descriptor *b)
  168. {
  169. return (
  170.    ( a->bEndpointAddress == b->bEndpointAddress )
  171. && ( a->bmAttributes     == b->bmAttributes     )
  172. && ( a->wMaxPacketSize   == b->wMaxPacketSize   )
  173. );
  174. }
  175. /*
  176.  * Checks wether the camera responds busy
  177.  */
  178. static int mdc800_isBusy (char* ch)
  179. {
  180. int i=0;
  181. while (i<8)
  182. {
  183. if (ch [i] != (char)0x99)
  184. return 0;
  185. i++;
  186. }
  187. return 1;
  188. }
  189. /*
  190.  * Checks wether the Camera is ready
  191.  */
  192. static int mdc800_isReady (char *ch)
  193. {
  194. int i=0;
  195. while (i<8)
  196. {
  197. if (ch [i] != (char)0xbb)
  198. return 0;
  199. i++;
  200. }
  201. return 1;
  202. }
  203. /*
  204.  * USB IRQ Handler for InputLine
  205.  */
  206. static void mdc800_usb_irq (struct urb *urb)
  207. {
  208. int data_received=0, wake_up;
  209. unsigned char* b=urb->transfer_buffer;
  210. struct mdc800_data* mdc800=urb->context;
  211. if (urb->status >= 0)
  212. {
  213. //dbg ("%i %i %i %i %i %i %i %i n",b[0],b[1],b[2],b[3],b[4],b[5],b[6],b[7]);
  214. if (mdc800_isBusy (b))
  215. {
  216. if (!mdc800->camera_busy)
  217. {
  218. mdc800->camera_busy=1;
  219. dbg ("gets busy");
  220. }
  221. }
  222. else
  223. {
  224. if (mdc800->camera_busy && mdc800_isReady (b))
  225. {
  226. mdc800->camera_busy=0;
  227. dbg ("gets ready");
  228. }
  229. }
  230. if (!(mdc800_isBusy (b) || mdc800_isReady (b)))
  231. {
  232. /* Store Data in camera_answer field */
  233. dbg ("%i %i %i %i %i %i %i %i ",b[0],b[1],b[2],b[3],b[4],b[5],b[6],b[7]);
  234. memcpy (mdc800->camera_response,b,8);
  235. data_received=1;
  236. }
  237. }
  238. wake_up= ( mdc800->camera_request_ready > 0 )
  239. &&
  240. (
  241. ((mdc800->camera_request_ready == 1) && (!mdc800->camera_busy))
  242. ||
  243. ((mdc800->camera_request_ready == 2) && data_received)
  244. ||
  245. ((mdc800->camera_request_ready == 3) && (mdc800->camera_busy))
  246. ||
  247. (urb->status < 0)
  248. );
  249. if (wake_up)
  250. {
  251. mdc800->camera_request_ready=0;
  252. mdc800->irq_woken=1;
  253. wake_up_interruptible (&mdc800->irq_wait);
  254. }
  255. }
  256. /*
  257.  * Waits a while until the irq responds that camera is ready
  258.  *
  259.  *  mode : 0: Wait for camera gets ready
  260.  *         1: Wait for receiving data
  261.  *         2: Wait for camera gets busy
  262.  *
  263.  * msec: Time to wait
  264.  */
  265. static int mdc800_usb_waitForIRQ (int mode, int msec)
  266. {
  267.         DECLARE_WAITQUEUE(wait, current);
  268. mdc800->camera_request_ready=1+mode;
  269. add_wait_queue(&mdc800->irq_wait, &wait);
  270. set_current_state(TASK_INTERRUPTIBLE);
  271. if (!mdc800->irq_woken)
  272. {
  273.         schedule_timeout (msec*HZ/1000);
  274. }
  275.         remove_wait_queue(&mdc800->irq_wait, &wait);
  276. set_current_state(TASK_RUNNING);
  277. mdc800->irq_woken = 0;
  278. if (mdc800->camera_request_ready>0)
  279. {
  280. mdc800->camera_request_ready=0;
  281. err ("timeout waiting for camera.");
  282. return -1;
  283. }
  284. if (mdc800->state == NOT_CONNECTED)
  285. {
  286. warn ("Camera gets disconnected during waiting for irq.");
  287. mdc800->camera_request_ready=0;
  288. return -2;
  289. }
  290. return 0;
  291. }
  292. /*
  293.  * The write_urb callback function
  294.  */
  295. static void mdc800_usb_write_notify (struct urb *urb)
  296. {
  297. struct mdc800_data* mdc800=urb->context;
  298. if (urb->status != 0)
  299. {
  300. err ("writing command fails (status=%i)", urb->status);
  301. }
  302. else
  303. {
  304. mdc800->state=READY;
  305. }
  306. mdc800->written = 1;
  307. wake_up_interruptible (&mdc800->write_wait);
  308. }
  309. /*
  310.  * The download_urb callback function
  311.  */
  312. static void mdc800_usb_download_notify (struct urb *urb)
  313. {
  314. struct mdc800_data* mdc800=urb->context;
  315. if (urb->status == 0)
  316. {
  317. /* Fill output buffer with these data */
  318. memcpy (mdc800->out,  urb->transfer_buffer, 64);
  319. mdc800->out_count=64;
  320. mdc800->out_ptr=0;
  321. mdc800->download_left-=64;
  322. if (mdc800->download_left == 0)
  323. {
  324. mdc800->state=READY;
  325. }
  326. }
  327. else
  328. {
  329. err ("request bytes fails (status:%i)", urb->status);
  330. }
  331. mdc800->downloaded = 1;
  332. wake_up_interruptible (&mdc800->download_wait);
  333. }
  334. /***************************************************************************
  335. Probing for the Camera
  336.  ***************************************************************************/
  337. static struct usb_driver mdc800_usb_driver;
  338. /*
  339.  * Callback to search the Mustek MDC800 on the USB Bus
  340.  */
  341. static void* mdc800_usb_probe (struct usb_device *dev ,unsigned int ifnum,
  342.        const struct usb_device_id *id)
  343. {
  344. int i,j;
  345. struct usb_interface_descriptor *intf_desc;
  346. int irq_interval=0;
  347. dbg ("(mdc800_usb_probe) called.");
  348. if (mdc800->dev != 0)
  349. {
  350. warn ("only one Mustek MDC800 is supported.");
  351. return 0;
  352. }
  353. if (dev->descriptor.bNumConfigurations != 1)
  354. {
  355. err ("probe fails -> wrong Number of Configuration");
  356. return 0;
  357. }
  358. intf_desc=&dev->actconfig->interface[ifnum].altsetting[0];
  359. if (
  360. ( intf_desc->bInterfaceClass != 0xff )
  361. || ( intf_desc->bInterfaceSubClass != 0 )
  362. || ( intf_desc->bInterfaceProtocol != 0 )
  363. || ( intf_desc->bNumEndpoints != 4)
  364. )
  365. {
  366. err ("probe fails -> wrong Interface");
  367. return 0;
  368. }
  369. /* Check the Endpoints */
  370. for (i=0; i<4; i++)
  371. {
  372. mdc800->endpoint[i]=-1;
  373. for (j=0; j<4; j++)
  374. {
  375. if (mdc800_endpoint_equals (&intf_desc->endpoint [j],&mdc800_ed [i]))
  376. {
  377. mdc800->endpoint[i]=intf_desc->endpoint [j].bEndpointAddress ;
  378. if (i==1)
  379. {
  380. irq_interval=intf_desc->endpoint [j].bInterval;
  381. }
  382. continue;
  383. }
  384. }
  385. if (mdc800->endpoint[i] == -1)
  386. {
  387. err ("probe fails -> Wrong Endpoints.");
  388. return 0;
  389. }
  390. }
  391. usb_driver_claim_interface (&mdc800_usb_driver, &dev->actconfig->interface[ifnum], mdc800);
  392. if (usb_set_interface (dev, ifnum, 0) < 0)
  393. {
  394. err ("MDC800 Configuration fails.");
  395. return 0;
  396. }
  397. info ("Found Mustek MDC800 on USB.");
  398. down (&mdc800->io_lock);
  399. mdc800->dev=dev;
  400. mdc800->open=0;
  401. /* Setup URB Structs */
  402. FILL_INT_URB (
  403. mdc800->irq_urb,
  404. mdc800->dev,
  405. usb_rcvintpipe (mdc800->dev,mdc800->endpoint [1]),
  406. mdc800->irq_urb_buffer,
  407. 8,
  408. mdc800_usb_irq,
  409. mdc800,
  410. irq_interval
  411. );
  412. FILL_BULK_URB (
  413. mdc800->write_urb,
  414. mdc800->dev,
  415. usb_sndbulkpipe (mdc800->dev, mdc800->endpoint[0]),
  416. mdc800->write_urb_buffer,
  417. 8,
  418. mdc800_usb_write_notify,
  419. mdc800
  420. );
  421. FILL_BULK_URB (
  422. mdc800->download_urb,
  423. mdc800->dev,
  424. usb_rcvbulkpipe (mdc800->dev, mdc800->endpoint [3]),
  425. mdc800->download_urb_buffer,
  426. 64,
  427. mdc800_usb_download_notify,
  428. mdc800
  429. );
  430. mdc800->state=READY;
  431. up (&mdc800->io_lock);
  432. return mdc800;
  433. }
  434. /*
  435.  * Disconnect USB device (maybe the MDC800)
  436.  */
  437. static void mdc800_usb_disconnect (struct usb_device *dev,void* ptr)
  438. {
  439. struct mdc800_data* mdc800=(struct mdc800_data*) ptr;
  440. dbg ("(mdc800_usb_disconnect) called");
  441. if (mdc800->state == NOT_CONNECTED)
  442. return;
  443. mdc800->state=NOT_CONNECTED;
  444. usb_unlink_urb (mdc800->irq_urb);
  445. usb_unlink_urb (mdc800->write_urb);
  446. usb_unlink_urb (mdc800->download_urb);
  447. usb_driver_release_interface (&mdc800_usb_driver, &dev->actconfig->interface[1]);
  448. mdc800->dev=0;
  449. info ("Mustek MDC800 disconnected from USB.");
  450. }
  451. /***************************************************************************
  452. The Misc device Part (file_operations)
  453. ****************************************************************************/
  454. /*
  455.  * This Function calc the Answersize for a command.
  456.  */
  457. static int mdc800_getAnswerSize (char command)
  458. {
  459. switch ((unsigned char) command)
  460. {
  461. case 0x2a:
  462. case 0x49:
  463. case 0x51:
  464. case 0x0d:
  465. case 0x20:
  466. case 0x07:
  467. case 0x01:
  468. case 0x25:
  469. case 0x00:
  470. return 8;
  471. case 0x05:
  472. case 0x3e:
  473. return mdc800->pic_len;
  474. case 0x09:
  475. return 4096;
  476. default:
  477. return 0;
  478. }
  479. }
  480. /*
  481.  * Init the device: (1) alloc mem (2) Increase MOD Count ..
  482.  */
  483. static int mdc800_device_open (struct inode* inode, struct file *file)
  484. {
  485. int retval=0;
  486. int errn=0;
  487. down (&mdc800->io_lock);
  488. if (mdc800->state == NOT_CONNECTED)
  489. {
  490. errn=-EBUSY;
  491. goto error_out;
  492. }
  493. if (mdc800->open)
  494. {
  495. errn=-EBUSY;
  496. goto error_out;
  497. }
  498. mdc800->in_count=0;
  499. mdc800->out_count=0;
  500. mdc800->out_ptr=0;
  501. mdc800->pic_index=0;
  502. mdc800->pic_len=-1;
  503. mdc800->download_left=0;
  504. mdc800->camera_busy=0;
  505. mdc800->camera_request_ready=0;
  506. retval=0;
  507. mdc800->irq_urb->dev = mdc800->dev;
  508. if (usb_submit_urb (mdc800->irq_urb))
  509. {
  510. err ("request USB irq fails (submit_retval=%i urb_status=%i).",retval, mdc800->irq_urb->status);
  511. errn = -EIO;
  512. goto error_out;
  513. }
  514. mdc800->open=1;
  515. dbg ("Mustek MDC800 device opened.");
  516. error_out:
  517. up (&mdc800->io_lock);
  518. return errn;
  519. }
  520. /*
  521.  * Close the Camera and release Memory
  522.  */
  523. static int mdc800_device_release (struct inode* inode, struct file *file)
  524. {
  525. int retval=0;
  526. dbg ("Mustek MDC800 device closed.");
  527. down (&mdc800->io_lock);
  528. if (mdc800->open && (mdc800->state != NOT_CONNECTED))
  529. {
  530. usb_unlink_urb (mdc800->irq_urb);
  531. usb_unlink_urb (mdc800->write_urb);
  532. usb_unlink_urb (mdc800->download_urb);
  533. mdc800->open=0;
  534. }
  535. else
  536. {
  537. retval=-EIO;
  538. }
  539.         up(&mdc800->io_lock);
  540. return retval;
  541. }
  542. /*
  543.  * The Device read callback Function
  544.  */
  545. static ssize_t mdc800_device_read (struct file *file, char *buf, size_t len, loff_t *pos)
  546. {
  547. size_t left=len, sts=len; /* single transfer size */
  548. char* ptr=buf;
  549. DECLARE_WAITQUEUE(wait, current);
  550. down (&mdc800->io_lock);
  551. if (mdc800->state == NOT_CONNECTED)
  552. {
  553. up (&mdc800->io_lock);
  554. return -EBUSY;
  555. }
  556. if (mdc800->state == WORKING)
  557. {
  558. warn ("Illegal State "working" reached during read ?!");
  559. up (&mdc800->io_lock);
  560. return -EBUSY;
  561. }
  562. if (!mdc800->open)
  563. {
  564. up (&mdc800->io_lock);
  565. return -EBUSY;
  566. }
  567. while (left)
  568. {
  569. if (signal_pending (current)) 
  570. {
  571. up (&mdc800->io_lock);
  572. return -EINTR;
  573. }
  574. sts=left > (mdc800->out_count-mdc800->out_ptr)?mdc800->out_count-mdc800->out_ptr:left;
  575. if (sts <= 0)
  576. {
  577. /* Too less Data in buffer */
  578. if (mdc800->state == DOWNLOAD)
  579. {
  580. mdc800->out_count=0;
  581. mdc800->out_ptr=0;
  582. /* Download -> Request new bytes */
  583. mdc800->download_urb->dev = mdc800->dev;
  584. if (usb_submit_urb (mdc800->download_urb))
  585. {
  586. err ("Can't submit download urb (status=%i)",mdc800->download_urb->status);
  587. up (&mdc800->io_lock);
  588. return len-left;
  589. }
  590. add_wait_queue(&mdc800->download_wait, &wait);
  591. set_current_state(TASK_INTERRUPTIBLE);
  592. if (!mdc800->downloaded)
  593. {
  594.         schedule_timeout (TO_DOWNLOAD_GET_READY*HZ/1000);
  595. }
  596.                                 set_current_state(TASK_RUNNING);
  597. remove_wait_queue(&mdc800->download_wait, &wait);
  598. mdc800->downloaded = 0;
  599. if (mdc800->download_urb->status != 0)
  600. {
  601. err ("request download-bytes fails (status=%i)",mdc800->download_urb->status);
  602. up (&mdc800->io_lock);
  603. return len-left;
  604. }
  605. }
  606. else
  607. {
  608. /* No more bytes -> that's an error*/
  609. up (&mdc800->io_lock);
  610. return -EIO;
  611. }
  612. }
  613. else
  614. {
  615. /* memcpy Bytes */
  616. memcpy (ptr, &mdc800->out [mdc800->out_ptr], sts);
  617. ptr+=sts;
  618. left-=sts;
  619. mdc800->out_ptr+=sts;
  620. }
  621. }
  622. up (&mdc800->io_lock);
  623. return len-left;
  624. }
  625. /*
  626.  * The Device write callback Function
  627.  * If a 8Byte Command is received, it will be send to the camera.
  628.  * After this the driver initiates the request for the answer or
  629.  * just waits until the camera becomes ready.
  630.  */
  631. static ssize_t mdc800_device_write (struct file *file, const char *buf, size_t len, loff_t *pos)
  632. {
  633. size_t i=0;
  634. DECLARE_WAITQUEUE(wait, current);
  635. down (&mdc800->io_lock);
  636. if (mdc800->state != READY)
  637. {
  638. up (&mdc800->io_lock);
  639. return -EBUSY;
  640. }
  641. if (!mdc800->open )
  642. {
  643. up (&mdc800->io_lock);
  644. return -EBUSY;
  645. }
  646. while (i<len)
  647. {
  648. if (signal_pending (current)) 
  649. {
  650. up (&mdc800->io_lock);
  651. return -EINTR;
  652. }
  653. /* check for command start */
  654. if (buf [i] == (char) 0x55)
  655. {
  656. mdc800->in_count=0;
  657. mdc800->out_count=0;
  658. mdc800->out_ptr=0;
  659. mdc800->download_left=0;
  660. }
  661. /* save command byte */
  662. if (mdc800->in_count < 8)
  663. {
  664. mdc800->in[mdc800->in_count]=buf[i];
  665. mdc800->in_count++;
  666. }
  667. else
  668. {
  669. err ("Command is to long !n");
  670. up (&mdc800->io_lock);
  671. return -EIO;
  672. }
  673. /* Command Buffer full ? -> send it to camera */
  674. if (mdc800->in_count == 8)
  675. {
  676. int answersize;
  677. if (mdc800_usb_waitForIRQ (0,TO_GET_READY))
  678. {
  679. err ("Camera didn't get ready.n");
  680. up (&mdc800->io_lock);
  681. return -EIO;
  682. }
  683. answersize=mdc800_getAnswerSize (mdc800->in[1]);
  684. mdc800->state=WORKING;
  685. memcpy (mdc800->write_urb->transfer_buffer, mdc800->in,8);
  686. mdc800->write_urb->dev = mdc800->dev;
  687. if (usb_submit_urb (mdc800->write_urb))
  688. {
  689. err ("submitting write urb fails (status=%i)", mdc800->write_urb->status);
  690. up (&mdc800->io_lock);
  691. return -EIO;
  692. }
  693. add_wait_queue(&mdc800->write_wait, &wait);
  694. set_current_state(TASK_INTERRUPTIBLE);
  695. if (!mdc800->written)
  696. {
  697.         schedule_timeout (TO_WRITE_GET_READY*HZ/1000);
  698. }
  699.                         set_current_state(TASK_RUNNING);
  700. remove_wait_queue(&mdc800->write_wait, &wait);
  701. mdc800->written = 0;
  702. if (mdc800->state == WORKING)
  703. {
  704. usb_unlink_urb (mdc800->write_urb);
  705. up (&mdc800->io_lock);
  706. return -EIO;
  707. }
  708. switch ((unsigned char) mdc800->in[1])
  709. {
  710. case 0x05: /* Download Image */
  711. case 0x3e: /* Take shot in Fine Mode (WCam Mode) */
  712. if (mdc800->pic_len < 0)
  713. {
  714. err ("call 0x07 before 0x05,0x3e");
  715. mdc800->state=READY;
  716. up (&mdc800->io_lock);
  717. return -EIO;
  718. }
  719. mdc800->pic_len=-1;
  720. case 0x09: /* Download Thumbnail */
  721. mdc800->download_left=answersize+64;
  722. mdc800->state=DOWNLOAD;
  723. mdc800_usb_waitForIRQ (0,TO_DOWNLOAD_GET_BUSY);
  724. break;
  725. default:
  726. if (answersize)
  727. {
  728. if (mdc800_usb_waitForIRQ (1,TO_READ_FROM_IRQ))
  729. {
  730. err ("requesting answer from irq fails");
  731. up (&mdc800->io_lock);
  732. return -EIO;
  733. }
  734. /* Write dummy data, (this is ugly but part of the USB Protokoll */
  735. /* if you use endpoint 1 as bulk and not as irq */
  736. memcpy (mdc800->out, mdc800->camera_response,8);
  737. /* This is the interpreted answer */
  738. memcpy (&mdc800->out[8], mdc800->camera_response,8);
  739. mdc800->out_ptr=0;
  740. mdc800->out_count=16;
  741. /* Cache the Imagesize, if command was getImageSize */
  742. if (mdc800->in [1] == (char) 0x07)
  743. {
  744. mdc800->pic_len=(int) 65536*(unsigned char) mdc800->camera_response[0]+256*(unsigned char) mdc800->camera_response[1]+(unsigned char) mdc800->camera_response[2];
  745. dbg ("cached imagesize = %i",mdc800->pic_len);
  746. }
  747. }
  748. else
  749. {
  750. if (mdc800_usb_waitForIRQ (0,TO_DEFAULT_COMMAND))
  751. {
  752. err ("Command Timeout.");
  753. up (&mdc800->io_lock);
  754. return -EIO;
  755. }
  756. }
  757. mdc800->state=READY;
  758. break;
  759. }
  760. }
  761. i++;
  762. }
  763. up (&mdc800->io_lock);
  764. return i;
  765. }
  766. /***************************************************************************
  767. Init and Cleanup this driver (Structs and types)
  768. ****************************************************************************/
  769. /* File Operations of this drivers */
  770. static struct file_operations mdc800_device_ops =
  771. {
  772. owner: THIS_MODULE,
  773. read: mdc800_device_read,
  774. write: mdc800_device_write,
  775. open: mdc800_device_open,
  776. release: mdc800_device_release,
  777. };
  778. static struct usb_device_id mdc800_table [] = {
  779. { USB_DEVICE(MDC800_VENDOR_ID, MDC800_PRODUCT_ID) },
  780. { } /* Terminating entry */
  781. };
  782. MODULE_DEVICE_TABLE (usb, mdc800_table);
  783. /*
  784.  * USB Driver Struct for this device
  785.  */
  786. static struct usb_driver mdc800_usb_driver =
  787. {
  788. name: "mdc800",
  789. probe: mdc800_usb_probe,
  790. disconnect: mdc800_usb_disconnect,
  791. fops: &mdc800_device_ops,
  792. minor: MDC800_DEVICE_MINOR_BASE,
  793. id_table: mdc800_table
  794. };
  795. /************************************************************************
  796. Init and Cleanup this driver (Main Functions)
  797. *************************************************************************/
  798. #define try(A)           if ((A) == 0) goto cleanup_on_fail;
  799. #define try_free_mem(A)  if (A != 0) { kfree (A); A=0; }
  800. #define try_free_urb(A)  if (A != 0) { usb_free_urb (A); A=0; }
  801. int __init usb_mdc800_init (void)
  802. {
  803. /* Allocate Memory */
  804. try (mdc800=kmalloc (sizeof (struct mdc800_data), GFP_KERNEL));
  805. memset(mdc800, 0, sizeof(struct mdc800_data));
  806. mdc800->dev=0;
  807. mdc800->open=0;
  808. mdc800->state=NOT_CONNECTED;
  809. init_MUTEX (&mdc800->io_lock);
  810. init_waitqueue_head (&mdc800->irq_wait);
  811. init_waitqueue_head (&mdc800->write_wait);
  812. init_waitqueue_head (&mdc800->download_wait);
  813. mdc800->irq_woken = 0;
  814. mdc800->downloaded = 0;
  815. mdc800->written = 0;
  816. try (mdc800->irq_urb_buffer=kmalloc (8, GFP_KERNEL));
  817. try (mdc800->write_urb_buffer=kmalloc (8, GFP_KERNEL));
  818. try (mdc800->download_urb_buffer=kmalloc (64, GFP_KERNEL));
  819. try (mdc800->irq_urb=usb_alloc_urb (0));
  820. try (mdc800->download_urb=usb_alloc_urb (0));
  821. try (mdc800->write_urb=usb_alloc_urb (0));
  822. /* Register the driver */
  823. if (usb_register (&mdc800_usb_driver) < 0)
  824. goto cleanup_on_fail;
  825. info (DRIVER_VERSION ":" DRIVER_DESC);
  826. return 0;
  827. /* Clean driver up, when something fails */
  828. cleanup_on_fail:
  829. if (mdc800 != 0)
  830. {
  831. err ("can't alloc memory!");
  832. try_free_mem (mdc800->download_urb_buffer);
  833. try_free_mem (mdc800->write_urb_buffer);
  834. try_free_mem (mdc800->irq_urb_buffer);
  835. try_free_urb (mdc800->write_urb);
  836. try_free_urb (mdc800->download_urb);
  837. try_free_urb (mdc800->irq_urb);
  838. kfree (mdc800);
  839. }
  840. mdc800=0;
  841. return -1;
  842. }
  843. void __exit usb_mdc800_cleanup (void)
  844. {
  845. usb_deregister (&mdc800_usb_driver);
  846. usb_free_urb (mdc800->irq_urb);
  847. usb_free_urb (mdc800->download_urb);
  848. usb_free_urb (mdc800->write_urb);
  849. kfree (mdc800->irq_urb_buffer);
  850. kfree (mdc800->write_urb_buffer);
  851. kfree (mdc800->download_urb_buffer);
  852. kfree (mdc800);
  853. mdc800=0;
  854. }
  855. module_init (usb_mdc800_init);
  856. module_exit (usb_mdc800_cleanup);
  857. MODULE_AUTHOR( DRIVER_AUTHOR );
  858. MODULE_DESCRIPTION( DRIVER_DESC );
  859. MODULE_LICENSE("GPL");