pl2303.c
上传用户:wangqikan
上传日期:2016-04-26
资源大小:2216k
文件大小:21k
源码类别:

通讯编程文档

开发平台:

DOS

  1. /*
  2.  * Prolific PL2303 USB to serial adaptor driver
  3.  *
  4.  * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com)
  5.  *
  6.  * Original driver for 2.2.x by anonymous
  7.  *
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License as published by
  10.  * the Free Software Foundation; either version 2 of the License, or
  11.  * (at your option) any later version.
  12.  *
  13.  * See Documentation/usb/usb-serial.txt for more information on using this driver
  14.  *
  15.  * 2001_Oct_06 gkh
  16.  * Added RTS and DTR line control.  Thanks to joe@bndlg.de for parts of it.
  17.  *
  18.  * 2001_Sep_19 gkh
  19.  * Added break support.
  20.  *
  21.  * 2001_Aug_30 gkh
  22.  * fixed oops in write_bulk_callback.
  23.  *
  24.  * 2001_Aug_28 gkh
  25.  * reworked buffer logic to be like other usb-serial drivers.  Hopefully
  26.  * removing some reported problems.
  27.  *
  28.  * 2001_Jun_06 gkh
  29.  * finished porting to 2.4 format.
  30.  *
  31.  */
  32. #include <linux/config.h>
  33. #include <linux/kernel.h>
  34. #include <linux/sched.h>
  35. #include <linux/signal.h>
  36. #include <linux/errno.h>
  37. #include <linux/poll.h>
  38. #include <linux/init.h>
  39. #include <linux/slab.h>
  40. #include <linux/fcntl.h>
  41. #include <linux/tty.h>
  42. #include <linux/tty_driver.h>
  43. #include <linux/tty_flip.h>
  44. #include <linux/serial.h>
  45. #include <linux/module.h>
  46. #include <linux/spinlock.h>
  47. #include <linux/usb.h>
  48. #ifdef CONFIG_USB_SERIAL_DEBUG
  49. static int debug = 1;
  50. #else
  51. static int debug;
  52. #endif
  53. #include "usb-serial.h"
  54. #include "pl2303.h"
  55. /*
  56.  * Version Information
  57.  */
  58. #define DRIVER_VERSION "v0.91"
  59. #define DRIVER_DESC "Prolific PL2303 USB to serial adaptor driver"
  60. static __devinitdata struct usb_device_id id_table [] = {
  61. { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID) },
  62. { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) },
  63. { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
  64. { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) },
  65. { } /* Terminating entry */
  66. };
  67. MODULE_DEVICE_TABLE (usb, id_table);
  68. #define SET_LINE_REQUEST_TYPE 0x21
  69. #define SET_LINE_REQUEST 0x20
  70. #define SET_CONTROL_REQUEST_TYPE 0x21
  71. #define SET_CONTROL_REQUEST 0x22
  72. #define CONTROL_DTR 0x01
  73. #define CONTROL_RTS 0x02
  74. #define BREAK_REQUEST_TYPE 0x21
  75. #define BREAK_REQUEST 0x23
  76. #define BREAK_ON 0xffff
  77. #define BREAK_OFF 0x0000
  78. #define GET_LINE_REQUEST_TYPE 0xa1
  79. #define GET_LINE_REQUEST 0x21
  80. #define VENDOR_WRITE_REQUEST_TYPE 0x40
  81. #define VENDOR_WRITE_REQUEST 0x01
  82. #define VENDOR_READ_REQUEST_TYPE 0xc0
  83. #define VENDOR_READ_REQUEST 0x01
  84. /* function prototypes for a PL2303 serial converter */
  85. static int pl2303_open (struct usb_serial_port *port, struct file *filp);
  86. static void pl2303_close (struct usb_serial_port *port, struct file *filp);
  87. static void pl2303_set_termios (struct usb_serial_port *port,
  88. struct termios *old);
  89. static int pl2303_ioctl (struct usb_serial_port *port, struct file *file,
  90.  unsigned int cmd, unsigned long arg);
  91. static void pl2303_read_int_callback (struct urb *urb);
  92. static void pl2303_read_bulk_callback (struct urb *urb);
  93. static void pl2303_write_bulk_callback (struct urb *urb);
  94. static int pl2303_write (struct usb_serial_port *port, int from_user,
  95.  const unsigned char *buf, int count);
  96. static void pl2303_break_ctl(struct usb_serial_port *port,int break_state);
  97. static int pl2303_startup (struct usb_serial *serial);
  98. static void pl2303_shutdown (struct usb_serial *serial);
  99. /* All of the device info needed for the PL2303 SIO serial converter */
  100. static struct usb_serial_device_type pl2303_device = {
  101. name: "PL-2303",
  102. id_table: id_table,
  103. needs_interrupt_in: DONT_CARE, /* this device must have an interrupt in endpoint */
  104. needs_bulk_in: MUST_HAVE, /* this device must have a bulk in endpoint */
  105. needs_bulk_out: MUST_HAVE, /* this device must have a bulk out endpoint */
  106. num_interrupt_in: NUM_DONT_CARE,
  107. num_bulk_in: 1,
  108. num_bulk_out: 1,
  109. num_ports: 1,
  110. open: pl2303_open,
  111. close: pl2303_close,
  112. write: pl2303_write,
  113. ioctl: pl2303_ioctl,
  114. break_ctl: pl2303_break_ctl,
  115. set_termios: pl2303_set_termios,
  116. read_bulk_callback: pl2303_read_bulk_callback,
  117. read_int_callback: pl2303_read_int_callback,
  118. write_bulk_callback: pl2303_write_bulk_callback,
  119. startup: pl2303_startup,
  120. shutdown: pl2303_shutdown,
  121. };
  122. struct pl2303_private {
  123. u8 line_control;
  124. u8 termios_initialized;
  125.   u8 driverType;
  126. };
  127. static int pl2303_startup (struct usb_serial *serial)
  128. {
  129. struct pl2303_private *priv;
  130. int i;
  131. for (i = 0; i < serial->num_ports; ++i) {
  132. priv = kmalloc (sizeof (struct pl2303_private), GFP_KERNEL);
  133. if (!priv)
  134. return -ENOMEM;
  135. memset (priv, 0x00, sizeof (struct pl2303_private));
  136. serial->port[i].private = priv;
  137. }
  138. return 0;
  139. }
  140. static int set_control_lines (struct usb_device *dev, u8 value)
  141. {
  142. int retval;
  143. retval = usb_control_msg (dev, usb_sndctrlpipe (dev, 0),
  144.   SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE,
  145.   value, 0, NULL, 0, 100);
  146. dbg (__FUNCTION__" - value = %d, retval = %d", value, retval);
  147. return retval;
  148. }
  149. static int pl2303_write (struct usb_serial_port *port, int from_user,  const unsigned char *buf, int count)
  150. {
  151. int result;
  152. dbg (__FUNCTION__ " - port %d, %d bytes", port->number, count);
  153. if (!port->tty) {
  154. err (__FUNCTION__ " - no tty???");
  155. return 0;
  156. }
  157. if (port->write_urb->status == -EINPROGRESS) {
  158. dbg (__FUNCTION__ " - already writing");
  159. return 0;
  160. }
  161. count = (count > port->bulk_out_size) ? port->bulk_out_size : count;
  162. if (from_user) {
  163. if (copy_from_user (port->write_urb->transfer_buffer, buf, count))
  164. return -EFAULT;
  165. } else {
  166. memcpy (port->write_urb->transfer_buffer, buf, count);
  167. }
  168. usb_serial_debug_data (__FILE__, __FUNCTION__, count, port->write_urb->transfer_buffer);
  169. port->write_urb->transfer_buffer_length = count;
  170. port->write_urb->dev = port->serial->dev;
  171. result = usb_submit_urb (port->write_urb);
  172. if (result)
  173. err(__FUNCTION__ " - failed submitting write urb, error %d", result);
  174. else
  175. result = count;
  176. return result;
  177. }
  178. static void pl2303_set_termios (struct usb_serial_port *port, struct termios *old_termios)
  179. {
  180. struct usb_serial *serial = port->serial;
  181. struct pl2303_private *priv = port->private;
  182. unsigned int cflag;
  183. unsigned char *buf;
  184. int baud;
  185. int i;
  186. dbg (__FUNCTION__ " -  port %d, initialized = %d", port->number,
  187.      ((struct pl2303_private *) port->private)->termios_initialized);
  188. if ((!port->tty) || (!port->tty->termios)) {
  189. dbg(__FUNCTION__" - no tty structures");
  190. return;
  191. }
  192. if (!(((struct pl2303_private *)port->private)->termios_initialized)) {
  193. *(port->tty->termios) = tty_std_termios;
  194. port->tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
  195. ((struct pl2303_private *) port->private)->termios_initialized = 1;
  196. }
  197. cflag = port->tty->termios->c_cflag;
  198. /* check that they really want us to change something */
  199. if (old_termios) {
  200. if ((cflag == old_termios->c_cflag) &&
  201.     (RELEVANT_IFLAG(port->tty->termios->c_iflag) == RELEVANT_IFLAG(old_termios->c_iflag))) {
  202.     dbg(__FUNCTION__ " - nothing to change...");
  203.     return;
  204. }
  205. }
  206. buf = kmalloc (7, GFP_KERNEL);
  207. if (!buf) {
  208. err(__FUNCTION__ " - out of memory.");
  209. return;
  210. }
  211. memset (buf, 0x00, 0x07);
  212. i = usb_control_msg (serial->dev, usb_rcvctrlpipe (serial->dev, 0),
  213.      GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
  214.      0, 0, buf, 7, 100);
  215. dbg ("0xa1:0x21:0:0  %d - %x %x %x %x %x %x %x", i,
  216.      buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
  217. i = usb_control_msg (serial->dev, usb_sndctrlpipe (serial->dev, 0),
  218.      VENDOR_WRITE_REQUEST, VENDOR_WRITE_REQUEST_TYPE,
  219.      0, 1, NULL, 0, 100);
  220. dbg ("0x40:1:0:1  %d", i);
  221. if (cflag & CSIZE) {
  222. switch (cflag & CSIZE) {
  223. case CS5: buf[6] = 5; break;
  224. case CS6: buf[6] = 6; break;
  225. case CS7: buf[6] = 7; break;
  226. default:
  227. case CS8: buf[6] = 8; break;
  228. }
  229. dbg (__FUNCTION__ " - data bits = %d", buf[6]);
  230. }
  231. baud = 0;
  232. switch (cflag & CBAUD) {
  233. case B0: baud = 0; break;
  234. case B75: baud = 75; break;
  235. case B150: baud = 150; break;
  236. case B300: baud = 1228800; break;
  237. case B600: baud = 600; break;
  238. case B1200: baud = 1200; break;
  239. case B1800: baud = 1800; break;
  240. case B2400: baud = 2400; break;
  241. case B4800: baud = 4800; break;
  242. case B9600: baud = 9600; break;
  243. case B19200: baud = 19200; break;
  244. case B38400: baud = 38400; break;
  245. case B57600: baud = 57600; break;
  246. case B115200: baud = 115200; break;
  247. case B230400: baud = 230400; break;
  248. case B460800: baud = 460800; break;
  249. default:
  250. err ("pl2303 driver does not support the baudrate requested (fix it)");
  251. break;
  252. }
  253. dbg (__FUNCTION__ " - baud = %d", baud);
  254. if (baud) {
  255. buf[0] = baud & 0xff;
  256. buf[1] = (baud >> 8) & 0xff;
  257. buf[2] = (baud >> 16) & 0xff;
  258. buf[3] = (baud >> 24) & 0xff;
  259. }
  260. /* For reference buf[4]=0 is 1 stop bits */
  261. /* For reference buf[4]=1 is 1.5 stop bits */
  262. /* For reference buf[4]=2 is 2 stop bits */
  263. if (cflag & CSTOPB) {
  264. buf[4] = 2;
  265. dbg(__FUNCTION__ " - stop bits = 2");
  266. } else {
  267. buf[4] = 0;
  268. dbg(__FUNCTION__ " - stop bits = 1");
  269. }
  270. if (cflag & PARENB) {
  271. /* For reference buf[5]=0 is none parity */
  272. /* For reference buf[5]=1 is odd parity */
  273. /* For reference buf[5]=2 is even parity */
  274. /* For reference buf[5]=3 is mark parity */
  275. /* For reference buf[5]=4 is space parity */
  276. if (cflag & PARODD) {
  277. buf[5] = 1;
  278. dbg(__FUNCTION__ " - parity = odd");
  279. } else {
  280. buf[5] = 2;
  281. dbg(__FUNCTION__ " - parity = even");
  282. }
  283. } else {
  284. buf[5] = 0;
  285. dbg(__FUNCTION__ " - parity = none");
  286. }
  287. i = usb_control_msg (serial->dev, usb_sndctrlpipe (serial->dev, 0),
  288.      SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
  289.      0, 0, buf, 7, 100);
  290. dbg ("0x21:0x20:0:0  %d", i);
  291. if (cflag && CBAUD) {
  292. priv = port->private;
  293. if ((cflag && CBAUD) == B0)
  294. priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
  295. else
  296. priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
  297. set_control_lines (serial->dev, priv->line_control);
  298. }
  299. buf[0] = buf[1] = buf[2] = buf[3] = buf[4] = buf[5] = buf[6] = 0;
  300. i = usb_control_msg (serial->dev, usb_rcvctrlpipe (serial->dev, 0),
  301.      GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
  302.      0, 0, buf, 7, 100);
  303. dbg ("0xa1:0x21:0:0  %d - %x %x %x %x %x %x %x", i,
  304.      buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
  305. if (cflag & CRTSCTS) {
  306. if(priv->driverType == 2) {
  307. i = usb_control_msg (serial->dev, usb_sndctrlpipe (serial->dev, 0),
  308. VENDOR_WRITE_REQUEST, VENDOR_WRITE_REQUEST_TYPE, 0x0, 0x61, NULL, 0, 100);
  309. dbg ("0x40:0x1:0x0:0x61  %d", i);
  310. } else {
  311. i = usb_control_msg (serial->dev, usb_sndctrlpipe (serial->dev, 0),
  312. VENDOR_WRITE_REQUEST, VENDOR_WRITE_REQUEST_TYPE, 0x0, 0x41, NULL, 0, 100);
  313. dbg ("0x40:0x1:0x0:0x41  %d", i);
  314. }
  315. }
  316. kfree (buf);
  317. }
  318. static int pl2303_open (struct usb_serial_port *port, struct file *filp)
  319. {
  320. struct termios tmp_termios;
  321. struct usb_serial *serial = port->serial;
  322. unsigned char buf[10];
  323. int result;
  324. struct pl2303_private *priv = port->private;
  325. if (port_paranoia_check (port, __FUNCTION__))
  326. return -ENODEV;
  327. dbg (__FUNCTION__ " -  port %d", port->number);
  328. if(serial->dev->descriptor.bDeviceClass == 0x02)
  329. priv->driverType = 0;
  330. else if(serial->dev->descriptor.bMaxPacketSize0 == 0x40)
  331. priv->driverType = 2;
  332. else if(serial->dev->descriptor.bDeviceClass == 0x00)
  333. priv->driverType = 1;
  334. else if(serial->dev->descriptor.bDeviceClass == 0xFF)
  335. priv->driverType = 1;
  336. info("PL-2303 driver type: %d", priv->driverType);
  337. down (&port->sem);
  338. ++port->open_count;
  339. MOD_INC_USE_COUNT;
  340. if (!port->active) {
  341. port->active = 1;
  342. #define FISH(a,b,c,d)
  343. result=usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev,0),
  344.        b, a, c, d, buf, 1, 100);
  345. dbg("0x%x:0x%x:0x%x:0x%x  %d - %x",a,b,c,d,result,buf[0]);
  346. #define SOUP(a,b,c,d)
  347. result=usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev,0),
  348.        b, a, c, d, NULL, 0, 100);
  349. dbg("0x%x:0x%x:0x%x:0x%x  %d",a,b,c,d,result);
  350. FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
  351. SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0x0404, 0);
  352. FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
  353. FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8383, 0);
  354. FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
  355. SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0x0404, 1);
  356. FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
  357. FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8383, 0);
  358. SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0, 1);
  359. SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 1, 0);
  360. if(priv->driverType == 2) {
  361. SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 2, 0x44);
  362. } else {
  363. SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 2, 0x24);
  364. }
  365. /* Setup termios */
  366. pl2303_set_termios (port, &tmp_termios);
  367. //FIXME: need to assert RTS and DTR if CRTSCTS off
  368. dbg (__FUNCTION__ " - submitting read urb");
  369. port->read_urb->dev = serial->dev;
  370. result = usb_submit_urb (port->read_urb);
  371. if (result) {
  372. err(__FUNCTION__ " - failed submitting read urb, error %d", result);
  373. up (&port->sem);
  374. pl2303_close (port, NULL);
  375. return -EPROTO;
  376. }
  377. dbg (__FUNCTION__ " - submitting interrupt urb");
  378. port->interrupt_in_urb->dev = serial->dev;
  379. result = usb_submit_urb (port->interrupt_in_urb);
  380. if (result) {
  381. err(__FUNCTION__ " - failed submitting interrupt urb, error %d", result);
  382. up (&port->sem);
  383. pl2303_close (port, NULL);
  384. return -EPROTO;
  385. }
  386. }
  387. up (&port->sem);
  388. return 0;
  389. }
  390. static void pl2303_close (struct usb_serial_port *port, struct file *filp)
  391. {
  392. struct usb_serial *serial;
  393. struct pl2303_private *priv;
  394. unsigned int c_cflag;
  395. int result;
  396. if (port_paranoia_check (port, __FUNCTION__))
  397. return;
  398. serial = get_usb_serial (port, __FUNCTION__);
  399. if (!serial)
  400. return;
  401. dbg (__FUNCTION__ " - port %d", port->number);
  402. --port->open_count;
  403. if (port->open_count <= 0) {
  404. if (serial->dev) {
  405. c_cflag = port->tty->termios->c_cflag;
  406. if (c_cflag & HUPCL) {
  407. /* drop DTR and RTS */
  408. priv = port->private;
  409. priv->line_control = 0;
  410. set_control_lines (port->serial->dev,
  411.    priv->line_control);
  412. }
  413. /* shutdown our urbs */
  414. dbg (__FUNCTION__ " - shutting down urbs");
  415. result = usb_unlink_urb (port->write_urb);
  416. if (result)
  417. dbg (__FUNCTION__ " - usb_unlink_urb "
  418.      "(write_urb) failed with reason: %d",
  419.      result);
  420. result = usb_unlink_urb (port->read_urb);
  421. if (result)
  422. dbg (__FUNCTION__ " - usb_unlink_urb "
  423.      "(read_urb) failed with reason: %d",
  424.      result);
  425. result = usb_unlink_urb (port->interrupt_in_urb);
  426. if (result)
  427. dbg (__FUNCTION__ " - usb_unlink_urb "
  428.      "(interrupt_in_urb) failed with reason: %d",
  429.      result);
  430. }
  431. port->active = 0;
  432. port->open_count = 0;
  433. }
  434. MOD_DEC_USE_COUNT;
  435. }
  436. static int set_modem_info (struct usb_serial_port *port, unsigned int cmd, unsigned int *value)
  437. {
  438. struct pl2303_private *priv = port->private;
  439. unsigned int arg;
  440. if (copy_from_user(&arg, value, sizeof(int)))
  441. return -EFAULT;
  442. switch (cmd) {
  443. case TIOCMBIS:
  444. if (arg & TIOCM_RTS)
  445. priv->line_control |= CONTROL_RTS;
  446. if (arg & TIOCM_DTR)
  447. priv->line_control |= CONTROL_DTR;
  448. break;
  449. case TIOCMBIC:
  450. if (arg & TIOCM_RTS)
  451. priv->line_control &= ~CONTROL_RTS;
  452. if (arg & TIOCM_DTR)
  453. priv->line_control &= ~CONTROL_DTR;
  454. break;
  455. case TIOCMSET:
  456. /* turn off RTS and DTR and then only turn
  457.    on what was asked to */
  458. priv->line_control &= ~(CONTROL_RTS | CONTROL_DTR);
  459. priv->line_control |= ((arg & TIOCM_RTS) ? CONTROL_RTS : 0);
  460. priv->line_control |= ((arg & TIOCM_DTR) ? CONTROL_DTR : 0);
  461. break;
  462. }
  463. return set_control_lines (port->serial->dev, priv->line_control);
  464. }
  465. static int get_modem_info (struct usb_serial_port *port, unsigned int *value)
  466. {
  467. struct pl2303_private *priv = port->private;
  468. unsigned int mcr = priv->line_control;
  469. unsigned int result;
  470. result = ((mcr & CONTROL_DTR) ? TIOCM_DTR : 0)
  471.   | ((mcr & CONTROL_RTS) ? TIOCM_RTS : 0);
  472. dbg (__FUNCTION__ " - result = %x", result);
  473. if (copy_to_user(value, &result, sizeof(int)))
  474. return -EFAULT;
  475. return 0;
  476. }
  477. static int pl2303_ioctl (struct usb_serial_port *port, struct file *file, unsigned int cmd, unsigned long arg)
  478. {
  479. dbg (__FUNCTION__" (%d) cmd = 0x%04x", port->number, cmd);
  480. switch (cmd) {
  481. case TIOCMGET:
  482. dbg (__FUNCTION__" (%d) TIOCMGET", port->number);
  483. return get_modem_info (port, (unsigned int *)arg);
  484. case TIOCMBIS:
  485. case TIOCMBIC:
  486. case TIOCMSET:
  487. dbg(__FUNCTION__" (%d) TIOCMSET/TIOCMBIC/TIOCMSET",  port->number);
  488. return set_modem_info(port, cmd, (unsigned int *) arg);
  489. default:
  490. dbg (__FUNCTION__" not supported = 0x%04x", cmd);
  491. break;
  492. }
  493. return -ENOIOCTLCMD;
  494. }
  495. static void pl2303_break_ctl (struct usb_serial_port *port, int break_state)
  496. {
  497. struct usb_serial *serial = port->serial;
  498. u16 state;
  499. int result;
  500. dbg (__FUNCTION__ " - port %d", port->number);
  501. if (break_state == 0)
  502. state = BREAK_OFF;
  503. else
  504. state = BREAK_ON;
  505. dbg (__FUNCTION__" - turning break %s", state==BREAK_OFF ? "off" : "on");
  506. result = usb_control_msg (serial->dev, usb_rcvctrlpipe (serial->dev, 0),
  507.   BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
  508.   0, NULL, 0, 100);
  509. if (result)
  510. dbg (__FUNCTION__" - error sending break = %d", result);
  511. }
  512. static void pl2303_shutdown (struct usb_serial *serial)
  513. {
  514. int i;
  515. dbg (__FUNCTION__);
  516. /* stop everything on all ports */
  517. for (i = 0; i < serial->num_ports; ++i)
  518. while (serial->port[i].open_count > 0) {
  519. pl2303_close (&serial->port[i], NULL);
  520. kfree (serial->port[i].private);
  521. }
  522. }
  523. static void pl2303_read_int_callback (struct urb *urb)
  524. {
  525. struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
  526. struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
  527. //unsigned char *data = urb->transfer_buffer;
  528. //int i;
  529. //ints auto restart...
  530. if (!serial) {
  531. return;
  532. }
  533. if (urb->status) {
  534. urb->status = 0;
  535. return;
  536. }
  537. usb_serial_debug_data (__FILE__, __FUNCTION__, urb->actual_length, urb->transfer_buffer);
  538. #if 0
  539. //FIXME need to update state of terminal lines variable
  540. #endif
  541. return;
  542. }
  543. static void pl2303_read_bulk_callback (struct urb *urb)
  544. {
  545. struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
  546. struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
  547. struct tty_struct *tty;
  548. unsigned char *data = urb->transfer_buffer;
  549. int i;
  550. int result;
  551. if (port_paranoia_check (port, __FUNCTION__))
  552. return;
  553. dbg(__FUNCTION__ " - port %d", port->number);
  554. if (!serial) {
  555. dbg(__FUNCTION__ " - bad serial pointer, exiting");
  556. return;
  557. }
  558. if (urb->status) {
  559. dbg (__FUNCTION__ " - urb->status = %d", urb->status);
  560. if (!port->active) {
  561. dbg (__FUNCTION__ " - port is closed, exiting.");
  562. return;
  563. }
  564. if (urb->status == -EPROTO) {
  565. /* PL2303 mysteriously fails with -EPROTO reschedule the read */
  566. dbg (__FUNCTION__ " - caught -EPROTO, resubmitting the urb");
  567. urb->status = 0;
  568. urb->dev = serial->dev;
  569. result = usb_submit_urb(urb);
  570. if (result)
  571. err(__FUNCTION__ " - failed resubmitting read urb, error %d", result);
  572. return;
  573. }
  574. dbg (__FUNCTION__ " - unable to handle the error, exiting.");
  575. return;
  576. }
  577. usb_serial_debug_data (__FILE__, __FUNCTION__, urb->actual_length, data);
  578. tty = port->tty;
  579. if (urb->actual_length) {
  580. for (i = 0; i < urb->actual_length; ++i) {
  581. if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
  582. tty_flip_buffer_push(tty);
  583. }
  584. tty_insert_flip_char (tty, data[i], 0);
  585. }
  586. tty_flip_buffer_push (tty);
  587. }
  588. /* Schedule the next read _if_ we are still open */
  589. if (port->active) {
  590. urb->dev = serial->dev;
  591. result = usb_submit_urb(urb);
  592. if (result)
  593. err(__FUNCTION__ " - failed resubmitting read urb, error %d", result);
  594. }
  595. return;
  596. }
  597. static void pl2303_write_bulk_callback (struct urb *urb)
  598. {
  599. struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
  600. int result;
  601. if (port_paranoia_check (port, __FUNCTION__))
  602. return;
  603. dbg(__FUNCTION__ " - port %d", port->number);
  604. if (urb->status) {
  605. /* error in the urb, so we have to resubmit it */
  606. if (serial_paranoia_check (port->serial, __FUNCTION__)) {
  607. return;
  608. }
  609. dbg (__FUNCTION__ " - Overflow in write");
  610. dbg (__FUNCTION__ " - nonzero write bulk status received: %d", urb->status);
  611. port->write_urb->transfer_buffer_length = 1;
  612. port->write_urb->dev = port->serial->dev;
  613. result = usb_submit_urb (port->write_urb);
  614. if (result)
  615. err(__FUNCTION__ " - failed resubmitting write urb, error %d", result);
  616. return;
  617. }
  618. queue_task(&port->tqueue, &tq_immediate);
  619. mark_bh(IMMEDIATE_BH);
  620. return;
  621. }
  622. static int __init pl2303_init (void)
  623. {
  624. usb_serial_register (&pl2303_device);
  625. info(DRIVER_DESC " " DRIVER_VERSION);
  626. return 0;
  627. }
  628. static void __exit pl2303_exit (void)
  629. {
  630. usb_serial_deregister (&pl2303_device);
  631. }
  632. module_init(pl2303_init);
  633. module_exit(pl2303_exit);
  634. MODULE_DESCRIPTION(DRIVER_DESC);
  635. MODULE_LICENSE("GPL");
  636. MODULE_PARM(debug, "i");
  637. MODULE_PARM_DESC(debug, "Debug enabled or not");