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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * USB Empeg empeg-car player driver
  3.  *
  4.  * Copyright (C) 2000, 2001
  5.  *     Gary Brubaker (xavyer@ix.netcom.com)
  6.  *
  7.  * Copyright (C) 1999 - 2001
  8.  *     Greg Kroah-Hartman (greg@kroah.com)
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License, as published by
  12.  * the Free Software Foundation, version 2.
  13.  *
  14.  * See Documentation/usb/usb-serial.txt for more information on using this driver
  15.  * 
  16.  * (07/16/2001) gb
  17.  * remove unused code in empeg_close() (thanks to Oliver Neukum for pointing this
  18.  * out) and rewrote empeg_set_termios().
  19.  * 
  20.  * (05/30/2001) gkh
  21.  * switched from using spinlock to a semaphore, which fixes lots of problems.
  22.  *
  23.  * (04/08/2001) gb
  24.  *      Identify version on module load.
  25.  * 
  26.  * (01/22/2001) gb
  27.  * Added write_room() and chars_in_buffer() support. 
  28.  * 
  29.  * (12/21/2000) gb
  30.  * Moved termio stuff inside the port->active check.
  31.  * Moved MOD_DEC_USE_COUNT to end of empeg_close().
  32.  * 
  33.  * (12/03/2000) gb
  34.  * Added port->tty->ldisc.set_termios(port->tty, NULL) to empeg_open()
  35.  * This notifies the tty driver that the termios have changed.
  36.  * 
  37.  * (11/13/2000) gb
  38.  * Moved tty->low_latency = 1 from empeg_read_bulk_callback() to empeg_open()
  39.  * (It only needs to be set once - Doh!)
  40.  * 
  41.  * (11/11/2000) gb
  42.  * Updated to work with id_table structure.
  43.  * 
  44.  * (11/04/2000) gb
  45.  * Forked this from visor.c, and hacked it up to work with an
  46.  * Empeg ltd. empeg-car player.  Constructive criticism welcomed.
  47.  * I would like to say, 'Thank You' to Greg Kroah-Hartman for the
  48.  * use of his code, and for his guidance, advice and patience. :)
  49.  * A 'Thank You' is in order for John Ripley of Empeg ltd for his
  50.  * advice, and patience too.
  51.  * 
  52.  */
  53. #include <linux/config.h>
  54. #include <linux/kernel.h>
  55. #include <linux/sched.h>
  56. #include <linux/signal.h>
  57. #include <linux/errno.h>
  58. #include <linux/poll.h>
  59. #include <linux/init.h>
  60. #include <linux/slab.h>
  61. #include <linux/fcntl.h>
  62. #include <linux/tty.h>
  63. #include <linux/tty_driver.h>
  64. #include <linux/tty_flip.h>
  65. #include <linux/module.h>
  66. #include <linux/spinlock.h>
  67. #include <linux/usb.h>
  68. #ifdef CONFIG_USB_SERIAL_DEBUG
  69. static int debug = 1;
  70. #else
  71. static int debug;
  72. #endif
  73. #include "usb-serial.h"
  74. /*
  75.  * Version Information
  76.  */
  77. #define DRIVER_VERSION "v1.2"
  78. #define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>, Gary Brubaker <xavyer@ix.netcom.com>"
  79. #define DRIVER_DESC "USB Empeg Mark I/II Driver"
  80. #define EMPEG_VENDOR_ID 0x084f
  81. #define EMPEG_PRODUCT_ID 0x0001
  82. /* function prototypes for an empeg-car player */
  83. static int  empeg_open (struct usb_serial_port *port, struct file *filp);
  84. static void empeg_close (struct usb_serial_port *port, struct file *filp);
  85. static int  empeg_write (struct usb_serial_port *port,
  86. int from_user,
  87. const unsigned char *buf,
  88. int count);
  89. static int  empeg_write_room (struct usb_serial_port *port);
  90. static int  empeg_chars_in_buffer (struct usb_serial_port *port);
  91. static void empeg_throttle (struct usb_serial_port *port);
  92. static void empeg_unthrottle (struct usb_serial_port *port);
  93. static int  empeg_startup (struct usb_serial *serial);
  94. static void empeg_shutdown (struct usb_serial *serial);
  95. static int  empeg_ioctl (struct usb_serial_port *port,
  96. struct file * file,
  97. unsigned int cmd,
  98. unsigned long arg);
  99. static void empeg_set_termios (struct usb_serial_port *port, struct termios *old_termios);
  100. static void empeg_write_bulk_callback (struct urb *urb);
  101. static void empeg_read_bulk_callback (struct urb *urb);
  102. static __devinitdata struct usb_device_id id_table [] = {
  103. { USB_DEVICE(EMPEG_VENDOR_ID, EMPEG_PRODUCT_ID) },
  104. { } /* Terminating entry */
  105. };
  106. MODULE_DEVICE_TABLE (usb, id_table);
  107. static struct usb_serial_device_type empeg_device = {
  108. name: "Empeg",
  109. id_table: id_table,
  110. needs_interrupt_in: MUST_HAVE_NOT, /* must not have an interrupt in endpoint */
  111. needs_bulk_in: MUST_HAVE, /* must have a bulk in endpoint */
  112. needs_bulk_out: MUST_HAVE, /* must have a bulk out endpoint */
  113. num_interrupt_in: 0,
  114. num_bulk_in: 1,
  115. num_bulk_out: 1,
  116. num_ports: 1,
  117. open: empeg_open,
  118. close: empeg_close,
  119. throttle: empeg_throttle,
  120. unthrottle: empeg_unthrottle,
  121. startup: empeg_startup,
  122. shutdown: empeg_shutdown,
  123. ioctl: empeg_ioctl,
  124. set_termios: empeg_set_termios,
  125. write: empeg_write,
  126. write_room: empeg_write_room,
  127. chars_in_buffer: empeg_chars_in_buffer,
  128. write_bulk_callback: empeg_write_bulk_callback,
  129. read_bulk_callback: empeg_read_bulk_callback,
  130. };
  131. #define NUM_URBS 16
  132. #define URB_TRANSFER_BUFFER_SIZE 4096
  133. static struct urb *write_urb_pool[NUM_URBS];
  134. static spinlock_t write_urb_pool_lock;
  135. static int bytes_in;
  136. static int bytes_out;
  137. /******************************************************************************
  138.  * Empeg specific driver functions
  139.  ******************************************************************************/
  140. static int empeg_open (struct usb_serial_port *port, struct file *filp)
  141. {
  142. struct usb_serial *serial = port->serial;
  143. int result = 0;;
  144. if (port_paranoia_check (port, __FUNCTION__))
  145. return -ENODEV;
  146. dbg(__FUNCTION__ " - port %d", port->number);
  147. down (&port->sem);
  148. ++port->open_count;
  149. MOD_INC_USE_COUNT;
  150. if (!port->active) {
  151. /* Force default termio settings */
  152. empeg_set_termios (port, NULL) ;
  153. port->active = 1;
  154. bytes_in = 0;
  155. bytes_out = 0;
  156. /* Start reading from the device */
  157. FILL_BULK_URB(
  158. port->read_urb,
  159. serial->dev, 
  160. usb_rcvbulkpipe(serial->dev,
  161. port->bulk_in_endpointAddress),
  162. port->read_urb->transfer_buffer,
  163. port->read_urb->transfer_buffer_length,
  164. empeg_read_bulk_callback,
  165. port);
  166. port->read_urb->transfer_flags |= USB_QUEUE_BULK;
  167. result = usb_submit_urb(port->read_urb);
  168. if (result)
  169. err(__FUNCTION__ " - failed submitting read urb, error %d", result);
  170. }
  171. up (&port->sem);
  172. return result;
  173. }
  174. static void empeg_close (struct usb_serial_port *port, struct file * filp)
  175. {
  176. struct usb_serial *serial;
  177. if (port_paranoia_check (port, __FUNCTION__))
  178. return;
  179. dbg(__FUNCTION__ " - port %d", port->number);
  180. serial = get_usb_serial (port, __FUNCTION__);
  181. if (!serial)
  182. return;
  183. down (&port->sem);
  184. --port->open_count;
  185. if (port->open_count <= 0) {
  186. if (serial->dev) {
  187. /* shutdown our bulk read */
  188. usb_unlink_urb (port->read_urb);
  189. }
  190. port->active = 0;
  191. port->open_count = 0;
  192. }
  193. up (&port->sem);
  194. /* Uncomment the following line if you want to see some statistics in your syslog */
  195. /* info ("Bytes In = %d  Bytes Out = %d", bytes_in, bytes_out); */
  196. MOD_DEC_USE_COUNT;
  197. }
  198. static int empeg_write (struct usb_serial_port *port, int from_user, const unsigned char *buf, int count)
  199. {
  200. struct usb_serial *serial = port->serial;
  201. struct urb *urb;
  202. const unsigned char *current_position = buf;
  203. unsigned long flags;
  204. int status;
  205. int i;
  206. int bytes_sent = 0;
  207. int transfer_size;
  208. dbg(__FUNCTION__ " - port %d", port->number);
  209. usb_serial_debug_data (__FILE__, __FUNCTION__, count, buf);
  210. while (count > 0) {
  211. /* try to find a free urb in our list of them */
  212. urb = NULL;
  213. spin_lock_irqsave (&write_urb_pool_lock, flags);
  214. for (i = 0; i < NUM_URBS; ++i) {
  215. if (write_urb_pool[i]->status != -EINPROGRESS) {
  216. urb = write_urb_pool[i];
  217. break;
  218. }
  219. }
  220. spin_unlock_irqrestore (&write_urb_pool_lock, flags);
  221. if (urb == NULL) {
  222. dbg (__FUNCTION__ " - no more free urbs");
  223. goto exit;
  224. }
  225. if (urb->transfer_buffer == NULL) {
  226. urb->transfer_buffer = kmalloc (URB_TRANSFER_BUFFER_SIZE, GFP_KERNEL);
  227. if (urb->transfer_buffer == NULL) {
  228. err(__FUNCTION__" no more kernel memory...");
  229. goto exit;
  230. }
  231. }
  232. transfer_size = min (count, URB_TRANSFER_BUFFER_SIZE);
  233. if (from_user) {
  234. if (copy_from_user (urb->transfer_buffer, current_position, transfer_size)) {
  235. bytes_sent = -EFAULT;
  236. break;
  237. }
  238. } else {
  239. memcpy (urb->transfer_buffer, current_position, transfer_size);
  240. }
  241. /* build up our urb */
  242. FILL_BULK_URB (
  243. urb,
  244. serial->dev,
  245. usb_sndbulkpipe(serial->dev,
  246. port->bulk_out_endpointAddress), 
  247. urb->transfer_buffer,
  248. transfer_size,
  249. empeg_write_bulk_callback,
  250. port);
  251. urb->transfer_flags |= USB_QUEUE_BULK;
  252. /* send it down the pipe */
  253. status = usb_submit_urb(urb);
  254. if (status) {
  255. err(__FUNCTION__ " - usb_submit_urb(write bulk) failed with status = %d", status);
  256. bytes_sent = status;
  257. break;
  258. }
  259. current_position += transfer_size;
  260. bytes_sent += transfer_size;
  261. count -= transfer_size;
  262. bytes_out += transfer_size;
  263. }
  264. exit:
  265. return bytes_sent;
  266. static int empeg_write_room (struct usb_serial_port *port)
  267. {
  268. unsigned long flags;
  269. int i;
  270. int room = 0;
  271. dbg(__FUNCTION__ " - port %d", port->number);
  272. spin_lock_irqsave (&write_urb_pool_lock, flags);
  273. /* tally up the number of bytes available */
  274. for (i = 0; i < NUM_URBS; ++i) {
  275. if (write_urb_pool[i]->status != -EINPROGRESS) {
  276. room += URB_TRANSFER_BUFFER_SIZE;
  277. }
  278. spin_unlock_irqrestore (&write_urb_pool_lock, flags);
  279. dbg(__FUNCTION__ " - returns %d", room);
  280. return (room);
  281. }
  282. static int empeg_chars_in_buffer (struct usb_serial_port *port)
  283. {
  284. unsigned long flags;
  285. int i;
  286. int chars = 0;
  287. dbg(__FUNCTION__ " - port %d", port->number);
  288. spin_lock_irqsave (&write_urb_pool_lock, flags);
  289. /* tally up the number of bytes waiting */
  290. for (i = 0; i < NUM_URBS; ++i) {
  291. if (write_urb_pool[i]->status == -EINPROGRESS) {
  292. chars += URB_TRANSFER_BUFFER_SIZE;
  293. }
  294. }
  295. spin_unlock_irqrestore (&write_urb_pool_lock, flags);
  296. dbg (__FUNCTION__ " - returns %d", chars);
  297. return (chars);
  298. }
  299. static void empeg_write_bulk_callback (struct urb *urb)
  300. {
  301. struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
  302. if (port_paranoia_check (port, __FUNCTION__))
  303. return;
  304. dbg(__FUNCTION__ " - port %d", port->number);
  305. if (urb->status) {
  306. dbg(__FUNCTION__ " - nonzero write bulk status received: %d", urb->status);
  307. return;
  308. }
  309. queue_task(&port->tqueue, &tq_immediate);
  310. mark_bh(IMMEDIATE_BH);
  311. return;
  312. }
  313. static void empeg_read_bulk_callback (struct urb *urb)
  314. {
  315. struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
  316. struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
  317. struct tty_struct *tty;
  318. unsigned char *data = urb->transfer_buffer;
  319. int i;
  320. int result;
  321. if (port_paranoia_check (port, __FUNCTION__))
  322. return;
  323. dbg(__FUNCTION__ " - port %d", port->number);
  324. if (!serial) {
  325. dbg(__FUNCTION__ " - bad serial pointer, exiting");
  326. return;
  327. }
  328. if (urb->status) {
  329. dbg(__FUNCTION__ " - nonzero read bulk status received: %d", urb->status);
  330. return;
  331. }
  332. usb_serial_debug_data (__FILE__, __FUNCTION__, urb->actual_length, data);
  333. tty = port->tty;
  334. if (urb->actual_length) {
  335. for (i = 0; i < urb->actual_length ; ++i) {
  336. /* gb - 2000/11/13
  337.  * If we insert too many characters we'll overflow the buffer.
  338.  * This means we'll lose bytes - Decidedly bad.
  339.  */
  340. if(tty->flip.count >= TTY_FLIPBUF_SIZE) {
  341. tty_flip_buffer_push(tty);
  342. }
  343. tty_insert_flip_char(tty, data[i], 0);
  344. }
  345. /* gb - 2000/11/13
  346.  * Goes straight through instead of scheduling - if tty->low_latency is set.
  347.  */
  348. tty_flip_buffer_push(tty);
  349. bytes_in += urb->actual_length;
  350. }
  351. /* Continue trying to always read  */
  352. FILL_BULK_URB(
  353. port->read_urb,
  354. serial->dev, 
  355. usb_rcvbulkpipe(serial->dev,
  356. port->bulk_in_endpointAddress),
  357. port->read_urb->transfer_buffer,
  358. port->read_urb->transfer_buffer_length,
  359. empeg_read_bulk_callback,
  360. port);
  361. port->read_urb->transfer_flags |= USB_QUEUE_BULK;
  362. result = usb_submit_urb(port->read_urb);
  363. if (result)
  364. err(__FUNCTION__ " - failed resubmitting read urb, error %d", result);
  365. return;
  366. }
  367. static void empeg_throttle (struct usb_serial_port *port)
  368. {
  369. dbg(__FUNCTION__ " - port %d", port->number);
  370. down (&port->sem);
  371. usb_unlink_urb (port->read_urb);
  372. up (&port->sem);
  373. return;
  374. }
  375. static void empeg_unthrottle (struct usb_serial_port *port)
  376. {
  377. int result;
  378. dbg(__FUNCTION__ " - port %d", port->number);
  379. down (&port->sem);
  380. port->read_urb->dev = port->serial->dev;
  381. result = usb_submit_urb(port->read_urb);
  382. if (result)
  383. err(__FUNCTION__ " - failed submitting read urb, error %d", result);
  384. up (&port->sem);
  385. return;
  386. }
  387. static int  empeg_startup (struct usb_serial *serial)
  388. {
  389. dbg(__FUNCTION__);
  390. dbg(__FUNCTION__ " - Set config to 1");
  391. usb_set_configuration (serial->dev, 1);
  392. /* continue on with initialization */
  393. return 0;
  394. }
  395. static void empeg_shutdown (struct usb_serial *serial)
  396. {
  397. int i;
  398. dbg (__FUNCTION__);
  399. /* stop reads and writes on all ports */
  400. for (i=0; i < serial->num_ports; ++i) {
  401. while (serial->port[i].open_count > 0) {
  402. empeg_close (&serial->port[i], NULL);
  403. }
  404. }
  405. }
  406. static int empeg_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg)
  407. {
  408. dbg(__FUNCTION__ " - port %d, cmd 0x%.4x", port->number, cmd);
  409. return -ENOIOCTLCMD;
  410. }
  411. static void empeg_set_termios (struct usb_serial_port *port, struct termios *old_termios)
  412. {
  413. dbg(__FUNCTION__ " - port %d", port->number);
  414. if ((!port->tty) || (!port->tty->termios)) {
  415. dbg(__FUNCTION__" - no tty structures");
  416. return;
  417. }
  418. /*
  419.          * The empeg-car player wants these particular tty settings.
  420.          * You could, for example, change the baud rate, however the
  421.          * player only supports 115200 (currently), so there is really
  422.          * no point in support for changes to the tty settings.
  423.          * (at least for now)
  424.          *
  425.          * The default requirements for this device are:
  426.          */
  427. port->tty->termios->c_iflag
  428. &= ~(IGNBRK /* disable ignore break */
  429. | BRKINT /* disable break causes interrupt */
  430. | PARMRK /* disable mark parity errors */
  431. | ISTRIP /* disable clear high bit of input characters */
  432. | INLCR /* disable translate NL to CR */
  433. | IGNCR /* disable ignore CR */
  434. | ICRNL /* disable translate CR to NL */
  435. | IXON); /* disable enable XON/XOFF flow control */
  436. port->tty->termios->c_oflag
  437. &= ~OPOST; /* disable postprocess output characters */
  438. port->tty->termios->c_lflag
  439. &= ~(ECHO /* disable echo input characters */
  440. | ECHONL /* disable echo new line */
  441. | ICANON /* disable erase, kill, werase, and rprnt special characters */
  442. | ISIG /* disable interrupt, quit, and suspend special characters */
  443. | IEXTEN); /* disable non-POSIX special characters */
  444. port->tty->termios->c_cflag
  445. &= ~(CSIZE /* no size */
  446. | PARENB /* disable parity bit */
  447. | CBAUD); /* clear current baud rate */
  448. port->tty->termios->c_cflag
  449. |= (CS8 /* character size 8 bits */
  450. | B115200); /* baud rate 115200 */
  451. /*
  452.  * Force low_latency on; otherwise the pushes are scheduled;
  453.  * this is bad as it opens up the possibility of dropping bytes
  454.  * on the floor.  We don't want to drop bytes on the floor. :)
  455.  */
  456. port->tty->low_latency = 1;
  457. /* Notify the tty driver that the termios have changed. */
  458. port->tty->ldisc.set_termios(port->tty, NULL);
  459. return;
  460. }
  461. static int __init empeg_init (void)
  462. {
  463. struct urb *urb;
  464. int i;
  465. usb_serial_register (&empeg_device);
  466. /* create our write urb pool and transfer buffers */ 
  467. spin_lock_init (&write_urb_pool_lock);
  468. for (i = 0; i < NUM_URBS; ++i) {
  469. urb = usb_alloc_urb(0);
  470. write_urb_pool[i] = urb;
  471. if (urb == NULL) {
  472. err("No more urbs???");
  473. continue;
  474. }
  475. urb->transfer_buffer = NULL;
  476. urb->transfer_buffer = kmalloc (URB_TRANSFER_BUFFER_SIZE, GFP_KERNEL);
  477. if (!urb->transfer_buffer) {
  478. err (__FUNCTION__ " - out of memory for urb buffers.");
  479. continue;
  480. }
  481. }
  482. info(DRIVER_VERSION ":" DRIVER_DESC);
  483. return 0;
  484. }
  485. static void __exit empeg_exit (void)
  486. {
  487. int i;
  488. unsigned long flags;
  489. usb_serial_deregister (&empeg_device);
  490. spin_lock_irqsave (&write_urb_pool_lock, flags);
  491. for (i = 0; i < NUM_URBS; ++i) {
  492. if (write_urb_pool[i]) {
  493. /* FIXME - uncomment the following usb_unlink_urb call when
  494.  * the host controllers get fixed to set urb->dev = NULL after
  495.  * the urb is finished.  Otherwise this call oopses. */
  496. /* usb_unlink_urb(write_urb_pool[i]); */
  497. if (write_urb_pool[i]->transfer_buffer)
  498. kfree(write_urb_pool[i]->transfer_buffer);
  499. usb_free_urb (write_urb_pool[i]);
  500. }
  501. }
  502. spin_unlock_irqrestore (&write_urb_pool_lock, flags);
  503. }
  504. module_init(empeg_init);
  505. module_exit(empeg_exit);
  506. MODULE_AUTHOR( DRIVER_AUTHOR );
  507. MODULE_DESCRIPTION( DRIVER_DESC );
  508. MODULE_LICENSE("GPL");
  509. MODULE_PARM(debug, "i");
  510. MODULE_PARM_DESC(debug, "Debug enabled or not");