empeg.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:15k
源码类别:

Linux/Unix编程

开发平台:

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