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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * USB Compaq iPAQ driver
  3.  *
  4.  * Copyright (C) 2001
  5.  *     Ganesh Varadarajan <ganesh@veritas.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.  */
  13. #include <linux/config.h>
  14. #include <linux/kernel.h>
  15. #include <linux/sched.h>
  16. #include <linux/signal.h>
  17. #include <linux/errno.h>
  18. #include <linux/poll.h>
  19. #include <linux/init.h>
  20. #include <linux/slab.h>
  21. #include <linux/fcntl.h>
  22. #include <linux/tty.h>
  23. #include <linux/tty_driver.h>
  24. #include <linux/tty_flip.h>
  25. #include <linux/module.h>
  26. #include <linux/spinlock.h>
  27. #include <linux/usb.h>
  28. #ifdef CONFIG_USB_SERIAL_DEBUG
  29. static int debug = 1;
  30. #else
  31. static int debug = 0;
  32. #endif
  33. #include "usb-serial.h"
  34. #include "ipaq.h"
  35. /*
  36.  * Version Information
  37.  */
  38. #define DRIVER_VERSION "v0.1"
  39. #define DRIVER_AUTHOR "Ganesh Varadarajan <ganesh@veritas.com>"
  40. #define DRIVER_DESC "USB Compaq iPAQ driver"
  41. /* Function prototypes for an ipaq */
  42. static int  ipaq_open (struct usb_serial_port *port, struct file *filp);
  43. static void ipaq_close (struct usb_serial_port *port, struct file *filp);
  44. static int  ipaq_startup (struct usb_serial *serial);
  45. static void ipaq_shutdown (struct usb_serial *serial);
  46. static int ipaq_write(struct usb_serial_port *port, int from_user, const unsigned char *buf,
  47.        int count);
  48. static int ipaq_write_bulk(struct usb_serial_port *port, int from_user, const unsigned char *buf,
  49.    int count);
  50. static int ipaq_write_flush(struct usb_serial_port *port);
  51. static void ipaq_read_bulk_callback (struct urb *urb);
  52. static void ipaq_write_bulk_callback(struct urb *urb);
  53. static int ipaq_write_room(struct usb_serial_port *port);
  54. static int ipaq_chars_in_buffer(struct usb_serial_port *port);
  55. static void ipaq_destroy_lists(struct usb_serial_port *port);
  56. static __devinitdata struct usb_device_id ipaq_id_table [] = {
  57. { USB_DEVICE(IPAQ_VENDOR_ID, IPAQ_PRODUCT_ID) },
  58. { } /* Terminating entry */
  59. };
  60. MODULE_DEVICE_TABLE (usb, ipaq_id_table);
  61. /* All of the device info needed for the Compaq iPAQ */
  62. struct usb_serial_device_type ipaq_device = {
  63. name: "Compaq iPAQ",
  64. id_table: ipaq_id_table,
  65. needs_interrupt_in: MUST_HAVE_NOT,
  66. needs_bulk_in: MUST_HAVE,
  67. needs_bulk_out: MUST_HAVE,
  68. num_interrupt_in: 0,
  69. num_bulk_in: 1,
  70. num_bulk_out: 1,
  71. num_ports: 1,
  72. open: ipaq_open,
  73. close: ipaq_close,
  74. startup: ipaq_startup,
  75. shutdown: ipaq_shutdown,
  76. write: ipaq_write,
  77. write_room: ipaq_write_room,
  78. chars_in_buffer: ipaq_chars_in_buffer,
  79. read_bulk_callback: ipaq_read_bulk_callback,
  80. write_bulk_callback: ipaq_write_bulk_callback,
  81. };
  82. static spinlock_t write_list_lock;
  83. static int bytes_in;
  84. static int bytes_out;
  85. static int ipaq_open(struct usb_serial_port *port, struct file *filp)
  86. {
  87. struct usb_serial *serial = port->serial;
  88. struct ipaq_private *priv;
  89. struct ipaq_packet *pkt;
  90. int i, result = 0;
  91. if (port_paranoia_check(port, __FUNCTION__)) {
  92. return -ENODEV;
  93. }
  94. dbg(__FUNCTION__ " - port %d", port->number);
  95. down(&port->sem);
  96. ++port->open_count;
  97. MOD_INC_USE_COUNT;
  98. if (!port->active) {
  99. port->active = 1;
  100. bytes_in = 0;
  101. bytes_out = 0;
  102. priv = (struct ipaq_private *)kmalloc(sizeof(struct ipaq_private), GFP_KERNEL);
  103. if (priv == NULL) {
  104. err(__FUNCTION__ " - Out of memory");
  105. return -ENOMEM;
  106. }
  107. port->private = (void *)priv;
  108. priv->active = 0;
  109. priv->queue_len = 0;
  110. INIT_LIST_HEAD(&priv->queue);
  111. INIT_LIST_HEAD(&priv->freelist);
  112. for (i = 0; i < URBDATA_QUEUE_MAX / PACKET_SIZE; i++) {
  113. pkt = kmalloc(sizeof(struct ipaq_packet), GFP_KERNEL);
  114. if (pkt == NULL) {
  115. goto enomem;
  116. }
  117. pkt->data = kmalloc(PACKET_SIZE, GFP_KERNEL);
  118. if (pkt->data == NULL) {
  119. kfree(pkt);
  120. goto enomem;
  121. }
  122. pkt->len = 0;
  123. pkt->written = 0;
  124. INIT_LIST_HEAD(&pkt->list);
  125. list_add(&pkt->list, &priv->freelist);
  126. priv->free_len += PACKET_SIZE;
  127. }
  128. /*
  129.  * Force low latency on. This will immediately push data to the line
  130.  * discipline instead of queueing.
  131.  */
  132. port->tty->low_latency = 1;
  133. /*
  134.  * Lose the small buffers usbserial provides. Make larger ones.
  135.  */
  136. kfree(port->bulk_in_buffer);
  137. kfree(port->bulk_out_buffer);
  138. port->bulk_in_buffer = kmalloc(URBDATA_SIZE, GFP_KERNEL);
  139. if (port->bulk_in_buffer == NULL) {
  140. goto enomem;
  141. }
  142. port->bulk_out_buffer = kmalloc(URBDATA_SIZE, GFP_KERNEL);
  143. if (port->bulk_out_buffer == NULL) {
  144. kfree(port->bulk_in_buffer);
  145. goto enomem;
  146. }
  147. port->read_urb->transfer_buffer = port->bulk_in_buffer;
  148. port->write_urb->transfer_buffer = port->bulk_out_buffer;
  149. port->read_urb->transfer_buffer_length = URBDATA_SIZE;
  150. port->bulk_out_size = port->write_urb->transfer_buffer_length = URBDATA_SIZE;
  151. /* Start reading from the device */
  152. FILL_BULK_URB(port->read_urb, serial->dev, 
  153.       usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress),
  154.       port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length,
  155.       ipaq_read_bulk_callback, port);
  156. result = usb_submit_urb(port->read_urb);
  157. if (result) {
  158. err(__FUNCTION__ " - failed submitting read urb, error %d", result);
  159. }
  160. /*
  161.  * Send out two control messages observed in win98 sniffs. Not sure what
  162.  * they do.
  163.  */
  164. result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), 0x22, 0x21,
  165. 0x1, 0, NULL, 0, 5 * HZ);
  166. if (result < 0) {
  167. err(__FUNCTION__ " - failed doing control urb, error %d", result);
  168. }
  169. result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), 0x22, 0x21,
  170. 0x1, 0, NULL, 0, 5 * HZ);
  171. if (result < 0) {
  172. err(__FUNCTION__ " - failed doing control urb, error %d", result);
  173. }
  174. }
  175. up(&port->sem);
  176. return result;
  177. enomem:
  178. ipaq_destroy_lists(port);
  179. kfree(priv);
  180. err(__FUNCTION__ " - Out of memory");
  181. return -ENOMEM;
  182. }
  183. static void ipaq_close(struct usb_serial_port *port, struct file *filp)
  184. {
  185. struct usb_serial *serial;
  186. struct ipaq_private *priv = port->private;
  187. if (port_paranoia_check(port, __FUNCTION__)) {
  188. return; 
  189. }
  190. dbg(__FUNCTION__ " - port %d", port->number);
  191.  
  192. serial = get_usb_serial(port, __FUNCTION__);
  193. if (!serial)
  194. return;
  195. down (&port->sem);
  196. --port->open_count;
  197. if (port->open_count <= 0) {
  198. /*
  199.  * shut down bulk read and write
  200.  */
  201. usb_unlink_urb(port->write_urb);
  202. usb_unlink_urb(port->read_urb);
  203. ipaq_destroy_lists(port);
  204. kfree(priv);
  205. port->private = NULL;
  206. port->active = 0;
  207. port->open_count = 0;
  208. }
  209. up (&port->sem);
  210. /* Uncomment the following line if you want to see some statistics in your syslog */
  211. /* info ("Bytes In = %d  Bytes Out = %d", bytes_in, bytes_out); */
  212. MOD_DEC_USE_COUNT;
  213. }
  214. static void ipaq_read_bulk_callback(struct urb *urb)
  215. {
  216. struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
  217. struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
  218. struct tty_struct *tty;
  219. unsigned char *data = urb->transfer_buffer;
  220. int i, result;
  221. if (port_paranoia_check(port, __FUNCTION__))
  222. return;
  223. dbg(__FUNCTION__ " - port %d", port->number);
  224. if (!serial) {
  225. dbg(__FUNCTION__ " - bad serial pointer, exiting");
  226. return;
  227. }
  228. if (urb->status) {
  229. dbg(__FUNCTION__ " - nonzero read bulk status received: %d", urb->status);
  230. return;
  231. }
  232. usb_serial_debug_data (__FILE__, __FUNCTION__, urb->actual_length, data);
  233. tty = port->tty;
  234. if (urb->actual_length) {
  235. for (i = 0; i < urb->actual_length ; ++i) {
  236. /* if we insert more than TTY_FLIPBUF_SIZE characters, we drop them. */
  237. if(tty->flip.count >= TTY_FLIPBUF_SIZE) {
  238. tty_flip_buffer_push(tty);
  239. }
  240. /* this doesn't actually push the data through unless tty->low_latency is set */
  241. tty_insert_flip_char(tty, data[i], 0);
  242. }
  243. tty_flip_buffer_push(tty);
  244. bytes_in += urb->actual_length;
  245. }
  246. /* Continue trying to always read  */
  247. FILL_BULK_URB(port->read_urb, serial->dev, 
  248.       usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress),
  249.       port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length,
  250.       ipaq_read_bulk_callback, port);
  251. result = usb_submit_urb(port->read_urb);
  252. if (result)
  253. err(__FUNCTION__ " - failed resubmitting read urb, error %d", result);
  254. return;
  255. }
  256. static int ipaq_write(struct usb_serial_port *port, int from_user, const unsigned char *buf,
  257.        int count)
  258. {
  259. const unsigned char *current_position = buf;
  260. int bytes_sent = 0;
  261. int transfer_size;
  262. dbg(__FUNCTION__ " - port %d", port->number);
  263. usb_serial_debug_data(__FILE__, __FUNCTION__, count, buf);
  264. while (count > 0) {
  265. transfer_size = min(count, PACKET_SIZE);
  266. if (ipaq_write_bulk(port, from_user, current_position, transfer_size)) {
  267. break;
  268. }
  269. current_position += transfer_size;
  270. bytes_sent += transfer_size;
  271. count -= transfer_size;
  272. bytes_out += transfer_size;
  273. }
  274. return bytes_sent;
  275. static int ipaq_write_bulk(struct usb_serial_port *port, int from_user, const unsigned char *buf,
  276.    int count)
  277. {
  278. struct ipaq_private *priv = port->private;
  279. struct ipaq_packet *pkt = NULL;
  280. int result = 0;
  281. unsigned long flags;
  282. if (priv->free_len <= 0) {
  283. dbg(__FUNCTION__ " - we're stuffed");
  284. return -EAGAIN;
  285. }
  286. spin_lock_irqsave(&write_list_lock, flags);
  287. if (!list_empty(&priv->freelist)) {
  288. pkt = list_entry(priv->freelist.next, struct ipaq_packet, list);
  289. list_del(&pkt->list);
  290. priv->free_len -= PACKET_SIZE;
  291. }
  292. spin_unlock_irqrestore(&write_list_lock, flags);
  293. if (pkt == NULL) {
  294. dbg(__FUNCTION__ " - we're stuffed");
  295. return -EAGAIN;
  296. }
  297. if (from_user) {
  298. copy_from_user(pkt->data, buf, count);
  299. } else {
  300. memcpy(pkt->data, buf, count);
  301. }
  302. usb_serial_debug_data(__FILE__, __FUNCTION__, count, pkt->data);
  303. pkt->len = count;
  304. pkt->written = 0;
  305. spin_lock_irqsave(&write_list_lock, flags);
  306. list_add_tail(&pkt->list, &priv->queue);
  307. priv->queue_len += count;
  308. if (priv->active == 0) {
  309. priv->active = 1;
  310. result = ipaq_write_flush(port);
  311. }
  312. spin_unlock_irqrestore(&write_list_lock, flags);
  313. return result;
  314. }
  315. static int ipaq_write_flush(struct usb_serial_port *port)
  316. {
  317. struct ipaq_private *priv = (struct ipaq_private *)port->private;
  318. struct usb_serial *serial = port->serial;
  319. int count, room, result;
  320. struct ipaq_packet *pkt;
  321. struct urb *urb = port->write_urb;
  322. struct list_head *tmp;
  323. if (urb->status == -EINPROGRESS) {
  324. /* Should never happen */
  325. err(__FUNCTION__ " - flushing while urb is active !");
  326. return -EAGAIN;
  327. }
  328. room = URBDATA_SIZE;
  329. for (tmp = priv->queue.next; tmp != &priv->queue;) {
  330. pkt = list_entry(tmp, struct ipaq_packet, list);
  331. tmp = tmp->next;
  332. count = min(room, (int)(pkt->len - pkt->written));
  333. memcpy(urb->transfer_buffer + (URBDATA_SIZE - room),
  334.        pkt->data + pkt->written, count);
  335. room -= count;
  336. pkt->written += count;
  337. priv->queue_len -= count;
  338. if (pkt->written == pkt->len) {
  339. list_del(&pkt->list);
  340. list_add(&pkt->list, &priv->freelist);
  341. priv->free_len += PACKET_SIZE;
  342. }
  343. if (room == 0) {
  344. break;
  345. }
  346. }
  347. count = URBDATA_SIZE - room;
  348. FILL_BULK_URB(port->write_urb, serial->dev, 
  349.       usb_sndbulkpipe(serial->dev, port->bulk_out_endpointAddress),
  350.       port->write_urb->transfer_buffer, count, ipaq_write_bulk_callback,
  351.       port);
  352. result = usb_submit_urb(urb);
  353. if (result) {
  354. err(__FUNCTION__ " - failed submitting write urb, error %d", result);
  355. }
  356. return result;
  357. }
  358. static void ipaq_write_bulk_callback(struct urb *urb)
  359. {
  360. struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
  361. struct ipaq_private *priv = (struct ipaq_private *)port->private;
  362. unsigned long flags;
  363. if (port_paranoia_check (port, __FUNCTION__)) {
  364. return;
  365. }
  366. dbg(__FUNCTION__ " - port %d", port->number);
  367. if (urb->status) {
  368. dbg(__FUNCTION__ " - nonzero write bulk status received: %d", urb->status);
  369. }
  370. spin_lock_irqsave(&write_list_lock, flags);
  371. if (!list_empty(&priv->queue)) {
  372. ipaq_write_flush(port);
  373. } else {
  374. priv->active = 0;
  375. }
  376. spin_unlock_irqrestore(&write_list_lock, flags);
  377. queue_task(&port->tqueue, &tq_immediate);
  378. mark_bh(IMMEDIATE_BH);
  379. return;
  380. }
  381. static int ipaq_write_room(struct usb_serial_port *port)
  382. {
  383. struct ipaq_private *priv = (struct ipaq_private *)port->private;
  384. dbg(__FUNCTION__ " - freelen %d", priv->free_len);
  385. return priv->free_len;
  386. }
  387. static int ipaq_chars_in_buffer(struct usb_serial_port *port)
  388. {
  389. struct ipaq_private *priv = (struct ipaq_private *)port->private;
  390. dbg(__FUNCTION__ " - queuelen %d", priv->queue_len);
  391. return priv->queue_len;
  392. }
  393. static void ipaq_destroy_lists(struct usb_serial_port *port)
  394. {
  395. struct ipaq_private *priv = (struct ipaq_private *)port->private;
  396. struct list_head *tmp;
  397. struct ipaq_packet *pkt;
  398. for (tmp = priv->queue.next; tmp != &priv->queue;) {
  399. pkt = list_entry(tmp, struct ipaq_packet, list);
  400. tmp = tmp->next;
  401. kfree(pkt->data);
  402. kfree(pkt);
  403. }
  404. for (tmp = priv->freelist.next; tmp != &priv->freelist;) {
  405. pkt = list_entry(tmp, struct ipaq_packet, list);
  406. tmp = tmp->next;
  407. kfree(pkt->data);
  408. kfree(pkt);
  409. }
  410. return;
  411. }
  412. static int ipaq_startup(struct usb_serial *serial)
  413. {
  414. dbg(__FUNCTION__);
  415. usb_set_configuration(serial->dev, 1);
  416. return 0;
  417. }
  418. static void ipaq_shutdown(struct usb_serial *serial)
  419. {
  420. int i;
  421. dbg (__FUNCTION__);
  422. /* stop reads and writes on all ports */
  423. for (i=0; i < serial->num_ports; ++i) {
  424. while (serial->port[i].open_count > 0) {
  425. ipaq_close(&serial->port[i], NULL);
  426. }
  427. }
  428. }
  429. static int __init ipaq_init(void)
  430. {
  431. usb_serial_register(&ipaq_device);
  432. info(DRIVER_DESC " " DRIVER_VERSION);
  433. return 0;
  434. }
  435. static void __exit ipaq_exit(void)
  436. {
  437. usb_serial_deregister(&ipaq_device);
  438. }
  439. module_init(ipaq_init);
  440. module_exit(ipaq_exit);
  441. MODULE_AUTHOR( DRIVER_AUTHOR );
  442. MODULE_DESCRIPTION( DRIVER_DESC );
  443. MODULE_LICENSE("GPL");
  444. MODULE_PARM(debug, "i");
  445. MODULE_PARM_DESC(debug, "Debug enabled or not");