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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Driver for USB Scanners (linux-2.4.12)
  3.  *
  4.  * Copyright (C) 1999, 2000, 2001 David E. Nelson
  5.  *
  6.  * David E. Nelson (dnelson@jump.net)
  7.  *
  8.  * This program is free software; you can redistribute it and/or
  9.  * modify it under the terms of the GNU General Public License as
  10.  * published by the Free Software Foundation; either version 2 of the
  11.  * License, or (at your option) any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful, but
  14.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16.  * General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program; if not, write to the Free Software
  20.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  *
  22.  */ 
  23. #include <linux/module.h>
  24. #include <linux/kernel.h>
  25. #include <linux/errno.h>
  26. #include <asm/uaccess.h>
  27. #include <linux/init.h>
  28. #include <linux/slab.h>
  29. #include <linux/delay.h>
  30. #include <linux/ioctl.h>
  31. #include <linux/sched.h>
  32. #include <linux/smp_lock.h>
  33. #include <linux/devfs_fs_kernel.h>
  34. // #define DEBUG
  35. /* Enable this to support the older ioctl interfaces scanners that
  36.  * a PV8630 Scanner-On-Chip.  The prefered method is the
  37.  * SCANNER_IOCTL_CTRLMSG ioctl.
  38.  */
  39. // #define PV8630 
  40. #define DRIVER_VERSION "0.4.6"
  41. #define DRIVER_DESC "USB Scanner Driver"
  42. #include <linux/usb.h>
  43. static __s32 vendor=-1, product=-1, read_timeout=0;
  44. MODULE_AUTHOR("David E. Nelson, dnelson@jump.net, http://www.jump.net/~dnelson");
  45. MODULE_DESCRIPTION(DRIVER_DESC" "DRIVER_VERSION);
  46. MODULE_LICENSE("GPL");
  47. MODULE_PARM(vendor, "i");
  48. MODULE_PARM_DESC(vendor, "User specified USB idVendor");
  49. MODULE_PARM(product, "i");
  50. MODULE_PARM_DESC(product, "User specified USB idProduct");
  51. MODULE_PARM(read_timeout, "i");
  52. MODULE_PARM_DESC(read_timeout, "User specified read timeout in seconds");
  53. /* WARNING: These DATA_DUMP's can produce a lot of data. Caveat Emptor. */
  54. // #define RD_DATA_DUMP /* Enable to dump data - limited to 24 bytes */
  55. // #define WR_DATA_DUMP /* DEBUG does not have to be defined. */
  56. static struct usb_device_id scanner_device_ids [] = {
  57. /* Acer */
  58. { USB_DEVICE(0x04a5, 0x2060) }, /* Prisa Acerscan 620U & 640U (!)*/
  59. { USB_DEVICE(0x04a5, 0x2040) }, /* Prisa AcerScan 620U (!) */
  60. { USB_DEVICE(0x04a5, 0x20c0) },  /* Prisa AcerScan 1240UT */
  61. { USB_DEVICE(0x04a5, 0x2022) }, /* Vuego Scan Brisa 340U */
  62. { USB_DEVICE(0x04a5, 0x1a20) }, /* Unknown - Oliver Schwartz */
  63. { USB_DEVICE(0x04a5, 0x1a2a) }, /* Unknown - Oliver Schwartz */
  64. { USB_DEVICE(0x04a5, 0x207e) }, /* Prisa 640BU */
  65. { USB_DEVICE(0x04a5, 0x20be) }, /* Unknown - Oliver Schwartz */
  66. { USB_DEVICE(0x04a5, 0x20c0) }, /* Unknown - Oliver Schwartz */
  67. { USB_DEVICE(0x04a5, 0x20de) }, /* S2W 3300U */
  68. { USB_DEVICE(0x04a5, 0x20b0) }, /* Unknown - Oliver Schwartz */
  69. { USB_DEVICE(0x04a5, 0x20fe) }, /* Unknown - Oliver Schwartz */
  70. /* Agfa */
  71. { USB_DEVICE(0x06bd, 0x0001) }, /* SnapScan 1212U */
  72. { USB_DEVICE(0x06bd, 0x0002) }, /* SnapScan 1236U */
  73. { USB_DEVICE(0x06bd, 0x2061) }, /* Another SnapScan 1212U (?)*/
  74. { USB_DEVICE(0x06bd, 0x0100) }, /* SnapScan Touch */
  75. { USB_DEVICE(0x06bd, 0x2091) }, /* SnapScan e20 */
  76. { USB_DEVICE(0x06bd, 0x2095) }, /* SnapScan e25 */
  77. { USB_DEVICE(0x06bd, 0x2097) }, /* SnapScan e26 */
  78. { USB_DEVICE(0x06bd, 0x208d) }, /* Snapscan e40 */
  79. /* Canon */
  80. { USB_DEVICE(0x04a9, 0x2202) }, /* FB620U */
  81. { USB_DEVICE(0x04a9, 0x220b) }, /* D646U */
  82. { USB_DEVICE(0x04a9, 0x2207) }, /* 1220U */
  83. /* Colorado -- See Primax/Colorado below */
  84. /* Epson -- See Seiko/Epson below */
  85. /* Genius */
  86. { USB_DEVICE(0x0458, 0x2001) }, /* ColorPage-Vivid Pro */
  87. { USB_DEVICE(0x0458, 0x2007) }, /* ColorPage HR6 V2 */
  88. { USB_DEVICE(0x0458, 0x2008) }, /* Unknown */
  89. { USB_DEVICE(0x0458, 0x2009) }, /* Unknown */
  90. { USB_DEVICE(0x0458, 0x2013) }, /* Unknown */
  91. { USB_DEVICE(0x0458, 0x2015) }, /* Unknown  */
  92. { USB_DEVICE(0x0458, 0x2016) }, /* Unknown  */
  93. /* Hewlett Packard */
  94. { USB_DEVICE(0x03f0, 0x0205) }, /* 3300C */
  95. { USB_DEVICE(0x03f0, 0x0405) }, /* 3400C */
  96. { USB_DEVICE(0x03f0, 0x0101) }, /* 4100C */
  97. { USB_DEVICE(0x03f0, 0x0105) }, /* 4200C */
  98. { USB_DEVICE(0x03f0, 0x0305) }, /* 4300C */
  99. { USB_DEVICE(0x03f0, 0x0102) }, /* PhotoSmart S20 */
  100. { USB_DEVICE(0x03f0, 0x0401) }, /* 5200C */
  101. // { USB_DEVICE(0x03f0, 0x0701) }, /* 5300C - NOT SUPPORTED - see http://www.neatech.nl/oss/HP5300C/ */
  102. { USB_DEVICE(0x03f0, 0x0201) }, /* 6200C */
  103. { USB_DEVICE(0x03f0, 0x0601) }, /* 6300C */
  104. { USB_DEVICE(0x03f0, 0x605) }, /* 2200C */
  105. /* iVina */
  106. { USB_DEVICE(0x0638, 0x0268) }, /* 1200U */
  107. /* Lifetec */
  108. { USB_DEVICE(0x05d8, 0x4002) }, /* Lifetec LT9385 */
  109. /* Memorex */
  110. { USB_DEVICE(0x0461, 0x0346) }, /* 6136u - repackaged Primax ? */
  111. /* Microtek -- No longer supported - Enable SCSI and USB Microtek in kernel config */
  112. // { USB_DEVICE(0x05da, 0x0099) }, /* ScanMaker X6 - X6U */
  113. // { USB_DEVICE(0x05da, 0x0094) }, /* Phantom 336CX - C3 */
  114. // { USB_DEVICE(0x05da, 0x00a0) }, /* Phantom 336CX - C3 #2 */
  115. // { USB_DEVICE(0x05da, 0x009a) }, /* Phantom C6 */
  116. // { USB_DEVICE(0x05da, 0x00a3) }, /* ScanMaker V6USL */
  117. // { USB_DEVICE(0x05da, 0x80a3) }, /* ScanMaker V6USL #2 */
  118. // { USB_DEVICE(0x05da, 0x80ac) }, /* ScanMaker V6UL - SpicyU */
  119. /* Minolta */
  120. // { USB_DEVICE(0x0638,0x026a) }, /* Minolta Dimage Scan Dual II */
  121. /* Mustek */
  122. { USB_DEVICE(0x055f, 0x0001) }, /* 1200 CU */
  123. { USB_DEVICE(0x0400, 0x1000) }, /* BearPaw 1200 */
  124. { USB_DEVICE(0x055f, 0x0002) }, /* 600 CU */
  125. { USB_DEVICE(0x055f, 0x0873) }, /* 600 USB */
  126. { USB_DEVICE(0x055f, 0x0003) }, /* 1200 USB */
  127. { USB_DEVICE(0x055f, 0x0006) }, /* 1200 UB */
  128. { USB_DEVICE(0x0400, 0x1001) }, /* BearPaw 2400 */
  129. { USB_DEVICE(0x055f, 0x0008) }, /* 1200 CU Plus */
  130. { USB_DEVICE(0x0ff5, 0x0010) }, /* BearPaw 1200F */
  131. /* Plustek */
  132. { USB_DEVICE(0x07b3, 0x0017) }, /* OpticPro UT12 */
  133. { USB_DEVICE(0x07b3, 0x0011) }, /* OpticPro UT24 */
  134. { USB_DEVICE(0x07b3, 0x0005) }, /* Unknown */
  135. { USB_DEVICE(0x07b3, 0x0007) }, /* Unknown */
  136. { USB_DEVICE(0x07b3, 0x000F) }, /* Unknown */
  137. { USB_DEVICE(0x07b3, 0x0010) }, /* Unknown */
  138. { USB_DEVICE(0x07b3, 0x0012) }, /* Unknown */
  139. { USB_DEVICE(0x07b3, 0x0013) }, /* Unknown */
  140. { USB_DEVICE(0x07b3, 0x0014) }, /* Unknown */
  141. { USB_DEVICE(0x07b3, 0x0015) }, /* Unknown */
  142. { USB_DEVICE(0x07b3, 0x0016) }, /* Unknown */
  143. { USB_DEVICE(0x07b3, 0x0012) }, /* Unknown */
  144. /* Primax/Colorado */
  145. { USB_DEVICE(0x0461, 0x0300) }, /* G2-300 #1 */
  146. { USB_DEVICE(0x0461, 0x0380) }, /* G2-600 #1 */
  147. { USB_DEVICE(0x0461, 0x0301) }, /* G2E-300 #1 */
  148. { USB_DEVICE(0x0461, 0x0381) }, /* ReadyScan 636i */
  149. { USB_DEVICE(0x0461, 0x0302) }, /* G2-300 #2 */
  150. { USB_DEVICE(0x0461, 0x0382) }, /* G2-600 #2 */
  151. { USB_DEVICE(0x0461, 0x0303) }, /* G2E-300 #2 */
  152. { USB_DEVICE(0x0461, 0x0383) }, /* G2E-600 */
  153. { USB_DEVICE(0x0461, 0x0340) }, /* Colorado USB 9600 */
  154. // { USB_DEVICE(0x0461, 0x0360) }, /* Colorado USB 19200 - undetected endpoint */
  155. { USB_DEVICE(0x0461, 0x0341) }, /* Colorado 600u */
  156. { USB_DEVICE(0x0461, 0x0361) }, /* Colorado 1200u */
  157. /* Relisis */
  158. // { USB_DEVICE(0x0475, 0x0103) }, /* Episode - undetected endpoint */
  159. /* Seiko/Epson Corp. */
  160. { USB_DEVICE(0x04b8, 0x0101) }, /* Perfection 636U and 636Photo */
  161. { USB_DEVICE(0x04b8, 0x0103) }, /* Perfection 610 */
  162. { USB_DEVICE(0x04b8, 0x0104) }, /* Perfection 1200U and 1200Photo*/
  163. { USB_DEVICE(0x04b8, 0x0106) }, /* Stylus Scan 2500 */
  164. { USB_DEVICE(0x04b8, 0x0107) }, /* Expression 1600 */
  165. { USB_DEVICE(0x04b8, 0x010a) }, /* Perfection 1640SU and 1640SU Photo */
  166. { USB_DEVICE(0x04b8, 0x010b) }, /* Perfection 1240U */
  167. { USB_DEVICE(0x04b8, 0x010c) }, /* Perfection 640U */
  168. { USB_DEVICE(0x04b8, 0x010e) }, /* Expression 1680 */
  169. { USB_DEVICE(0x04b8, 0x0110) }, /* Perfection 1650 */
  170. { USB_DEVICE(0x04b8, 0x0112) }, /* Perfection 2450 - GT-9700 for the Japanese mkt */
  171. /* Umax */
  172. { USB_DEVICE(0x1606, 0x0010) }, /* Astra 1220U */
  173. { USB_DEVICE(0x1606, 0x0030) }, /* Astra 2000U */
  174. { USB_DEVICE(0x1606, 0x0130) }, /* Astra 2100U */
  175. { USB_DEVICE(0x1606, 0x0230) }, /* Astra 2200U */
  176. /* Visioneer */
  177. { USB_DEVICE(0x04a7, 0x0221) }, /* OneTouch 5300 USB */
  178. { USB_DEVICE(0x04a7, 0x0211) }, /* OneTouch 7600 USB */
  179. { USB_DEVICE(0x04a7, 0x0231) }, /* 6100 USB */
  180. { USB_DEVICE(0x04a7, 0x0311) }, /* 6200 EPP/USB */
  181. { USB_DEVICE(0x04a7, 0x0321) }, /* OneTouch 8100 EPP/USB */
  182. { USB_DEVICE(0x04a7, 0x0331) }, /* OneTouch 8600 EPP/USB */
  183. { } /* Terminating entry */
  184. };
  185. MODULE_DEVICE_TABLE (usb, scanner_device_ids);
  186. #define IS_EP_BULK(ep)  ((ep).bmAttributes == USB_ENDPOINT_XFER_BULK ? 1 : 0)
  187. #define IS_EP_BULK_IN(ep) (IS_EP_BULK(ep) && ((ep).bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN)
  188. #define IS_EP_BULK_OUT(ep) (IS_EP_BULK(ep) && ((ep).bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT)
  189. #define IS_EP_INTR(ep) ((ep).bmAttributes == USB_ENDPOINT_XFER_INT ? 1 : 0)
  190. #define USB_SCN_MINOR(X) MINOR((X)->i_rdev) - SCN_BASE_MNR
  191. #ifdef DEBUG
  192. #define SCN_DEBUG(X) X
  193. #else
  194. #define SCN_DEBUG(X)
  195. #endif
  196. #define IBUF_SIZE 32768
  197. #define OBUF_SIZE 4096
  198. /* read_scanner timeouts -- RD_NAK_TIMEOUT * RD_EXPIRE = Number of seconds */
  199. #define RD_NAK_TIMEOUT (10*HZ) /* Default number of X seconds to wait */
  200. #define RD_EXPIRE 12 /* Number of attempts to wait X seconds */
  201. /* FIXME: These are NOT registered ioctls()'s */
  202. #ifdef PV8630
  203. #define PV8630_IOCTL_INREQUEST 69
  204. #define PV8630_IOCTL_OUTREQUEST 70
  205. #endif /* PV8630 */
  206. /* read vendor and product IDs from the scanner */
  207. #define SCANNER_IOCTL_VENDOR _IOR('U', 0x20, int)
  208. #define SCANNER_IOCTL_PRODUCT _IOR('U', 0x21, int)
  209. /* send/recv a control message to the scanner */
  210. #define SCANNER_IOCTL_CTRLMSG _IOWR('U', 0x22, devrequest )
  211. #define SCN_MAX_MNR 16 /* We're allocated 16 minors */
  212. #define SCN_BASE_MNR 48 /* USB Scanners start at minor 48 */
  213. static DECLARE_MUTEX (scn_mutex); /* Initializes to unlocked */
  214. struct scn_usb_data {
  215. struct usb_device *scn_dev;
  216. devfs_handle_t devfs; /* devfs device */
  217. struct urb scn_irq;
  218. unsigned int ifnum; /* Interface number of the USB device */
  219. kdev_t scn_minor; /* Scanner minor - used in disconnect() */
  220. unsigned char button; /* Front panel buffer */
  221. char isopen; /* Not zero if the device is open */
  222. char present; /* Not zero if device is present */
  223. char *obuf, *ibuf; /* transfer buffers */
  224. char bulk_in_ep, bulk_out_ep, intr_ep; /* Endpoint assignments */
  225. wait_queue_head_t rd_wait_q; /* read timeouts */
  226. struct semaphore sem; /* lock to prevent concurrent reads or writes */
  227. unsigned int rd_nak_timeout; /* Seconds to wait before read() timeout. */
  228. };
  229. extern devfs_handle_t usb_devfs_handle;
  230. static struct scn_usb_data *p_scn_table[SCN_MAX_MNR] = { NULL, /* ... */};
  231. static struct usb_driver scanner_driver;