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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * USB IR Dongle driver
  3.  *
  4.  * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com)
  5.  * Copyright (C) 2002 Gary Brubaker (xavyer@ix.netcom.com)
  6.  *
  7.  * This program is free software; you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License as published by
  9.  * the Free Software Foundation; either version 2 of the License, or
  10.  * (at your option) any later version.
  11.  *
  12.  * This driver allows a USB IrDA device to be used as a "dumb" serial device.
  13.  * This can be useful if you do not have access to a full IrDA stack on the
  14.  * other side of the connection.  If you do have an IrDA stack on both devices,
  15.  * please use the usb-irda driver, as it contains the proper error checking and
  16.  * other goodness of a full IrDA stack.
  17.  *
  18.  * Portions of this driver were taken from drivers/net/irda/irda-usb.c, which
  19.  * was written by Roman Weissgaerber <weissg@vienna.at>, Dag Brattli
  20.  * <dag@brattli.net>, and Jean Tourrilhes <jt@hpl.hp.com>
  21.  *
  22.  * See Documentation/usb/usb-serial.txt for more information on using this driver
  23.  *
  24.  * 2002_Jan_14  gb
  25.  * Added module parameter to force specific number of XBOFs.
  26.  * Added ir_xbof_change().
  27.  * Reorganized read_bulk_callback error handling.
  28.  * Switched from FILL_BULK_URB() to usb_fill_bulk_urb().
  29.  *
  30.  * 2001_Nov_08  greg kh
  31.  * Changed the irda_usb_find_class_desc() function based on comments and
  32.  * code from Martin Diehl.
  33.  *
  34.  * 2001_Nov_01 greg kh
  35.  * Added support for more IrDA USB devices.
  36.  * Added support for zero packet.  Added buffer override paramater, so
  37.  * users can transfer larger packets at once if they wish.  Both patches
  38.  * came from Dag Brattli <dag@obexcode.com>.
  39.  *
  40.  * 2001_Oct_07 greg kh
  41.  * initial version released.
  42.  */
  43. #include <linux/config.h>
  44. #include <linux/kernel.h>
  45. #include <linux/sched.h>
  46. #include <linux/signal.h>
  47. #include <linux/errno.h>
  48. #include <linux/poll.h>
  49. #include <linux/init.h>
  50. #include <linux/slab.h>
  51. #include <linux/fcntl.h>
  52. #include <linux/tty.h>
  53. #include <linux/tty_driver.h>
  54. #include <linux/tty_flip.h>
  55. #include <linux/module.h>
  56. #include <linux/spinlock.h>
  57. #include <linux/usb.h>
  58. #include <net/irda/irda-usb.h>
  59. #ifdef CONFIG_USB_SERIAL_DEBUG
  60. static int debug = 1;
  61. #else
  62. static int debug;
  63. #endif
  64. #include "usb-serial.h"
  65. /*
  66.  * Version Information
  67.  */
  68. #define DRIVER_VERSION "v0.4"
  69. #define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>"
  70. #define DRIVER_DESC "USB IR Dongle driver"
  71. /* if overridden by the user, then use their value for the size of the read and
  72.  * write urbs */
  73. static int buffer_size = 0;
  74. /* if overridden by the user, then use the specified number of XBOFs */
  75. static int xbof = -1;
  76. static int  ir_startup (struct usb_serial *serial);
  77. static int  ir_open (struct usb_serial_port *port, struct file *filep);
  78. static void ir_close (struct usb_serial_port *port, struct file *filep);
  79. static int  ir_write (struct usb_serial_port *port, int from_user, const unsigned char *buf, int count);
  80. static void ir_write_bulk_callback (struct urb *urb);
  81. static void ir_read_bulk_callback (struct urb *urb);
  82. static void ir_set_termios (struct usb_serial_port *port, struct termios *old_termios);
  83. static u8 ir_baud = 0;
  84. static u8 ir_xbof = 0;
  85. static u8 ir_add_bof = 0;
  86. static __devinitdata struct usb_device_id id_table [] = {
  87. { USB_DEVICE(0x050f, 0x0180) }, /* KC Technology, KC-180 */
  88. { USB_DEVICE(0x08e9, 0x0100) }, /* XTNDAccess */
  89. { USB_DEVICE(0x09c4, 0x0011) }, /* ACTiSys ACT-IR2000U */
  90. { USB_INTERFACE_INFO (USB_CLASS_APP_SPEC, USB_CLASS_IRDA, 0) },
  91. { } /* Terminating entry */
  92. };
  93. MODULE_DEVICE_TABLE (usb, id_table);
  94. struct usb_serial_device_type ir_device = {
  95. name: "IR Dongle",
  96. id_table: id_table,
  97. needs_interrupt_in: MUST_HAVE,
  98. needs_bulk_in: MUST_HAVE,
  99. needs_bulk_out: MUST_HAVE,
  100. num_interrupt_in: 1,
  101. num_bulk_in: 1,
  102. num_bulk_out: 1,
  103. num_ports: 1,
  104. set_termios: ir_set_termios,
  105. startup: ir_startup,
  106. open: ir_open,
  107. close: ir_close,
  108. write: ir_write,
  109. write_bulk_callback: ir_write_bulk_callback,
  110. read_bulk_callback: ir_read_bulk_callback,
  111. };
  112. static inline void irda_usb_dump_class_desc(struct irda_class_desc *desc)
  113. {
  114. dbg("bLength=%x", desc->bLength);
  115. dbg("bDescriptorType=%x", desc->bDescriptorType);
  116. dbg("bcdSpecRevision=%x", desc->bcdSpecRevision); 
  117. dbg("bmDataSize=%x", desc->bmDataSize);
  118. dbg("bmWindowSize=%x", desc->bmWindowSize);
  119. dbg("bmMinTurnaroundTime=%d", desc->bmMinTurnaroundTime);
  120. dbg("wBaudRate=%x", desc->wBaudRate);
  121. dbg("bmAdditionalBOFs=%x", desc->bmAdditionalBOFs);
  122. dbg("bIrdaRateSniff=%x", desc->bIrdaRateSniff);
  123. dbg("bMaxUnicastList=%x", desc->bMaxUnicastList);
  124. }
  125. /*------------------------------------------------------------------*/
  126. /*
  127.  * Function irda_usb_find_class_desc(dev, ifnum)
  128.  *
  129.  *    Returns instance of IrDA class descriptor, or NULL if not found
  130.  *
  131.  * The class descriptor is some extra info that IrDA USB devices will
  132.  * offer to us, describing their IrDA characteristics. We will use that in
  133.  * irda_usb_init_qos()
  134.  *
  135.  * Based on the same function in drivers/net/irda/irda-usb.c
  136.  */
  137. static struct irda_class_desc *irda_usb_find_class_desc(struct usb_device *dev, unsigned int ifnum)
  138. {
  139. struct irda_class_desc *desc;
  140. int ret;
  141. desc = kmalloc(sizeof (struct irda_class_desc), GFP_KERNEL);
  142. if (desc == NULL) 
  143. return NULL;
  144. memset(desc, 0, sizeof(struct irda_class_desc));
  145. ret = usb_control_msg(dev, usb_rcvctrlpipe(dev,0),
  146. IU_REQ_GET_CLASS_DESC,
  147. USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
  148. 0, ifnum, desc, sizeof(*desc), MSECS_TO_JIFFIES(500));
  149. dbg("%s -  ret=%d", __FUNCTION__, ret);
  150. if (ret < sizeof(*desc)) {
  151. dbg("%s - class descriptor read %s (%d)",
  152. __FUNCTION__, 
  153. (ret<0) ? "failed" : "too short",
  154. ret);
  155. goto error;
  156. }
  157. if (desc->bDescriptorType != USB_DT_IRDA) {
  158. dbg("%s - bad class descriptor type", __FUNCTION__);
  159. goto error;
  160. }
  161. irda_usb_dump_class_desc(desc);
  162. return desc;
  163. error:
  164. kfree(desc);
  165. return NULL;
  166. }
  167. static u8 ir_xbof_change(u8 xbof)
  168. {
  169. u8 result;
  170. /* reference irda-usb.c */
  171. switch(xbof) {
  172. case 48: result = 0x10; break;
  173. case 28:
  174. case 24: result = 0x20; break;
  175. default:
  176. case 12: result = 0x30; break;
  177. case  5:
  178. case  6: result = 0x40; break;
  179. case  3: result = 0x50; break;
  180. case  2: result = 0x60; break;
  181. case  1: result = 0x70; break;
  182. case  0: result = 0x80; break;
  183. }
  184. return(result);
  185. }
  186. static int ir_startup (struct usb_serial *serial)
  187. {
  188. struct irda_class_desc *irda_desc;
  189. irda_desc = irda_usb_find_class_desc (serial->dev, 0);
  190. if (irda_desc == NULL) {
  191. err ("IRDA class descriptor not found, device not bound");
  192. return -ENODEV;
  193. }
  194. dbg ("%s - Baud rates supported:%s%s%s%s%s%s%s%s%s",
  195. __FUNCTION__,
  196. (irda_desc->wBaudRate & 0x0001) ? " 2400"    : "",
  197. (irda_desc->wBaudRate & 0x0002) ? " 9600"    : "",
  198. (irda_desc->wBaudRate & 0x0004) ? " 19200"   : "",
  199. (irda_desc->wBaudRate & 0x0008) ? " 38400"   : "",
  200. (irda_desc->wBaudRate & 0x0010) ? " 57600"   : "",
  201. (irda_desc->wBaudRate & 0x0020) ? " 115200"  : "",
  202. (irda_desc->wBaudRate & 0x0040) ? " 576000"  : "",
  203. (irda_desc->wBaudRate & 0x0080) ? " 1152000" : "",
  204. (irda_desc->wBaudRate & 0x0100) ? " 4000000" : "");
  205. switch( irda_desc->bmAdditionalBOFs ) {
  206. case 0x01: ir_add_bof = 48; break;
  207. case 0x02: ir_add_bof = 24; break;
  208. case 0x04: ir_add_bof = 12; break;
  209. case 0x08: ir_add_bof =  6; break;
  210. case 0x10: ir_add_bof =  3; break;
  211. case 0x20: ir_add_bof =  2; break;
  212. case 0x40: ir_add_bof =  1; break;
  213. case 0x80: ir_add_bof =  0; break;
  214. default:
  215. }
  216. kfree (irda_desc);
  217. return 0;
  218. }
  219. static int ir_open (struct usb_serial_port *port, struct file *filp)
  220. {
  221. struct usb_serial *serial = port->serial;
  222. char *buffer;
  223. int result = 0;
  224. if (port_paranoia_check (port, __FUNCTION__))
  225. return -ENODEV;
  226. dbg("%s - port %d", __FUNCTION__, port->number);
  227. down (&port->sem);
  228. ++port->open_count;
  229. MOD_INC_USE_COUNT;
  230. if (!port->active) {
  231. port->active = 1;
  232. if (buffer_size) {
  233. /* override the default buffer sizes */
  234. buffer = kmalloc (buffer_size, GFP_KERNEL);
  235. if (!buffer) {
  236. err ("%s - out of memory.", __FUNCTION__);
  237. return -ENOMEM;
  238. }
  239. kfree (port->read_urb->transfer_buffer);
  240. port->read_urb->transfer_buffer = buffer;
  241. port->read_urb->transfer_buffer_length = buffer_size;
  242. buffer = kmalloc (buffer_size, GFP_KERNEL);
  243. if (!buffer) {
  244. err ("%s - out of memory.", __FUNCTION__);
  245. return -ENOMEM;
  246. }
  247. kfree (port->write_urb->transfer_buffer);
  248. port->write_urb->transfer_buffer = buffer;
  249. port->write_urb->transfer_buffer_length = buffer_size;
  250. port->bulk_out_size = buffer_size;
  251. }
  252. /* Start reading from the device */
  253. usb_fill_bulk_urb (
  254. port->read_urb,
  255. serial->dev, 
  256. usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress),
  257. port->read_urb->transfer_buffer,
  258. port->read_urb->transfer_buffer_length,
  259. ir_read_bulk_callback,
  260. port);
  261. port->read_urb->transfer_flags = USB_QUEUE_BULK;
  262. result = usb_submit_urb(port->read_urb);
  263. if (result)
  264. err("%s - failed submitting read urb, error %d", __FUNCTION__, result);
  265. }
  266. up (&port->sem);
  267. return result;
  268. }
  269. static void ir_close (struct usb_serial_port *port, struct file * filp)
  270. {
  271. struct usb_serial *serial;
  272. if (port_paranoia_check (port, __FUNCTION__))
  273. return;
  274. dbg("%s - port %d", __FUNCTION__, port->number);
  275.  
  276. serial = get_usb_serial (port, __FUNCTION__);
  277. if (!serial)
  278. return;
  279. down (&port->sem);
  280. --port->open_count;
  281. if (port->open_count <= 0) {
  282. if (serial->dev) {
  283. /* shutdown our bulk read */
  284. usb_unlink_urb (port->read_urb);
  285. }
  286. port->active = 0;
  287. port->open_count = 0;
  288. }
  289. up (&port->sem);
  290. MOD_DEC_USE_COUNT;
  291. }
  292. static int ir_write (struct usb_serial_port *port, int from_user, const unsigned char *buf, int count)
  293. {
  294. unsigned char *transfer_buffer;
  295. int result;
  296. int transfer_size;
  297. dbg("%s - port = %d, count = %d", __FUNCTION__, port->number, count);
  298. if (!port->tty) {
  299. err ("%s - no tty???", __FUNCTION__);
  300. return 0;
  301. }
  302. if (count == 0)
  303. return 0;
  304. if (port->write_urb->status == -EINPROGRESS) {
  305. dbg ("%s - already writing", __FUNCTION__);
  306. return 0;
  307. }
  308. transfer_buffer = port->write_urb->transfer_buffer;
  309. transfer_size = min(count, port->bulk_out_size - 1);
  310. /*
  311.  * The first byte of the packet we send to the device contains an
  312.  * inband header which indicates an additional number of BOFs and
  313.  * a baud rate change.
  314.  *
  315.  * See section 5.4.2.2 of the USB IrDA spec.
  316.  */
  317. *transfer_buffer = ir_xbof | ir_baud;
  318. ++transfer_buffer;
  319. if (from_user) {
  320. if (copy_from_user (transfer_buffer, buf, transfer_size))
  321. return -EFAULT;
  322. } else {
  323. memcpy (transfer_buffer, buf, transfer_size);
  324. }
  325. usb_fill_bulk_urb (
  326. port->write_urb,
  327. port->serial->dev,
  328. usb_sndbulkpipe(port->serial->dev,
  329. port->bulk_out_endpointAddress),
  330. port->write_urb->transfer_buffer,
  331. transfer_size + 1,
  332. ir_write_bulk_callback,
  333. port);
  334. port->write_urb->transfer_flags
  335. = USB_QUEUE_BULK
  336. | USB_ZERO_PACKET;
  337. result = usb_submit_urb (port->write_urb);
  338. if (result)
  339. err("%s - failed submitting write urb, error %d", __FUNCTION__, result);
  340. else
  341. result = transfer_size;
  342. return result;
  343. }
  344. static void ir_write_bulk_callback (struct urb *urb)
  345. {
  346. struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
  347. if (port_paranoia_check (port, __FUNCTION__))
  348. return;
  349. dbg("%s - port %d", __FUNCTION__, port->number);
  350. if (urb->status) {
  351. dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status);
  352. return;
  353. }
  354. usb_serial_debug_data (
  355. __FILE__,
  356. __FUNCTION__,
  357. urb->actual_length,
  358. urb->transfer_buffer);
  359. queue_task(&port->tqueue, &tq_immediate);
  360. mark_bh(IMMEDIATE_BH);
  361. return;
  362. }
  363. static void ir_read_bulk_callback (struct urb *urb)
  364. {
  365. struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
  366. struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
  367. struct tty_struct *tty;
  368. unsigned char *data = urb->transfer_buffer;
  369. int result;
  370. if (port_paranoia_check (port, __FUNCTION__))
  371. return;
  372. dbg("%s - port %d", __FUNCTION__, port->number);
  373. if (!serial) {
  374. dbg("%s - bad serial pointer, exiting", __FUNCTION__);
  375. return;
  376. }
  377. if (!port->active) {
  378. dbg("%s - port closed.", __FUNCTION__);
  379. return;
  380. }
  381. switch (urb->status) {
  382. case 0: /* Successful */
  383. /*
  384.  * The first byte of the packet we get from the device
  385.  * contains a busy indicator and baud rate change.
  386.  * See section 5.4.1.2 of the USB IrDA spec.
  387.  */
  388. if((*data & 0x0f) > 0) ir_baud = *data & 0x0f;
  389. usb_serial_debug_data (
  390. __FILE__,
  391. __FUNCTION__,
  392. urb->actual_length,
  393. data);
  394. /*
  395.  * Bypass flip-buffers, and feed the ldisc directly
  396.  * due to our potentally large buffer size.  Since we
  397.  * used to set low_latency, this is exactly what the
  398.  * tty layer did anyway :)
  399.  */
  400. tty = port->tty;
  401. tty->ldisc.receive_buf(
  402. tty,
  403. data+1,
  404. NULL,
  405. urb->actual_length-1);
  406. /*
  407.  * No break here.
  408.  * We want to resubmit the urb so we can read
  409.  * again.
  410.  */
  411. case -EPROTO: /* taking inspiration from pl2303.c */
  412. /* Continue trying to always read */
  413. usb_fill_bulk_urb (
  414. port->read_urb,
  415. serial->dev, 
  416. usb_rcvbulkpipe(serial->dev,
  417. port->bulk_in_endpointAddress),
  418. port->read_urb->transfer_buffer,
  419. port->read_urb->transfer_buffer_length,
  420. ir_read_bulk_callback,
  421. port);
  422. port->read_urb->transfer_flags = USB_QUEUE_BULK;
  423. result = usb_submit_urb(port->read_urb);
  424. if (result)
  425. err("%s - failed resubmitting read urb, error %d",
  426. __FUNCTION__, 
  427. result);
  428. break ;
  429. default:
  430. dbg("%s - nonzero read bulk status received: %d",
  431. __FUNCTION__, 
  432. urb->status);
  433. break ;
  434. }
  435. return;
  436. }
  437. static void ir_set_termios (struct usb_serial_port *port, struct termios *old_termios)
  438. {
  439. unsigned char *transfer_buffer;
  440. unsigned int cflag;
  441. int result;
  442. dbg("%s - port %d", __FUNCTION__, port->number);
  443. if ((!port->tty) || (!port->tty->termios)) {
  444. dbg("%s - no tty structures", __FUNCTION__);
  445. return;
  446. }
  447. cflag = port->tty->termios->c_cflag;
  448. /* check that they really want us to change something */
  449. if (old_termios) {
  450. if ((cflag == old_termios->c_cflag) &&
  451.     (RELEVANT_IFLAG(port->tty->termios->c_iflag) == RELEVANT_IFLAG(old_termios->c_iflag))) {
  452. dbg("%s - nothing to change...", __FUNCTION__);
  453. return;
  454. }
  455. }
  456. /* All we can change is the baud rate */
  457. if (cflag & CBAUD) {
  458. dbg ("%s - asking for baud %d",
  459. __FUNCTION__,
  460. tty_get_baud_rate(port->tty));
  461. /* 
  462.  * FIXME, we should compare the baud request against the
  463.  * capability stated in the IR header that we got in the
  464.  * startup funtion.
  465.  */
  466. switch (cflag & CBAUD) {
  467. case B2400:    ir_baud = SPEED_2400;    break;
  468. default:
  469. case B9600:    ir_baud = SPEED_9600;    break;
  470. case B19200:   ir_baud = SPEED_19200;   break;
  471. case B38400:   ir_baud = SPEED_38400;   break;
  472. case B57600:   ir_baud = SPEED_57600;   break;
  473. case B115200:  ir_baud = SPEED_115200;  break;
  474. case B576000:  ir_baud = SPEED_576000;  break;
  475. case B1152000: ir_baud = SPEED_1152000; break;
  476. case B4000000: ir_baud = SPEED_4000000; break;
  477. }
  478. if (xbof == -1) {
  479. ir_xbof = ir_xbof_change(ir_add_bof);
  480. } else {
  481. ir_xbof = ir_xbof_change(xbof) ;
  482. }
  483. /* Notify the tty driver that the termios have changed. */
  484. port->tty->ldisc.set_termios(port->tty, NULL);
  485. /* FIXME need to check to see if our write urb is busy right
  486.  * now, or use a urb pool.
  487.  *
  488.  * send the baud change out on an "empty" data packet
  489.  */
  490. transfer_buffer = port->write_urb->transfer_buffer;
  491. *transfer_buffer = ir_xbof | ir_baud;
  492. usb_fill_bulk_urb (
  493. port->write_urb,
  494. port->serial->dev,
  495. usb_sndbulkpipe(port->serial->dev,
  496. port->bulk_out_endpointAddress),
  497. port->write_urb->transfer_buffer,
  498. 1,
  499. ir_write_bulk_callback,
  500. port);
  501. port->write_urb->transfer_flags
  502. = USB_QUEUE_BULK
  503. | USB_ZERO_PACKET;
  504. result = usb_submit_urb (port->write_urb);
  505. if (result)
  506. err("%s - failed submitting write urb, error %d", __FUNCTION__, result);
  507. }
  508. return;
  509. }
  510. static int __init ir_init (void)
  511. {
  512. usb_serial_register (&ir_device);
  513. info(DRIVER_DESC " " DRIVER_VERSION);
  514. return 0;
  515. }
  516. static void __exit ir_exit (void)
  517. {
  518. usb_serial_deregister (&ir_device);
  519. }
  520. module_init(ir_init);
  521. module_exit(ir_exit);
  522. MODULE_AUTHOR(DRIVER_AUTHOR);
  523. MODULE_DESCRIPTION(DRIVER_DESC);
  524. MODULE_LICENSE("GPL");
  525. MODULE_PARM(debug, "i");
  526. MODULE_PARM_DESC(debug, "Debug enabled or not");
  527. MODULE_PARM(xbof, "i");
  528. MODULE_PARM_DESC(xbof, "Force specific number of XBOFs");
  529. MODULE_PARM(buffer_size, "i");
  530. MODULE_PARM_DESC(buffer_size, "Size of the transfer buffers");