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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *      Tieman Voyager braille display USB driver.
  3.  *
  4.  *      Copyright 2001-2002 Stephane Dalton <sdalton@videotron.ca>
  5.  *                      and St閜hane Doyon  <s.doyon@videotron.ca>
  6.  *            Maintained by St閜hane Doyon  <s.doyon@videotron.ca>.
  7.  */
  8. /*
  9.  *  This program is free software; you can redistribute it and/or modify
  10.  *  it under the terms of the GNU General Public License as published by
  11.  *  the Free Software Foundation; either version 2 of the License, or
  12.  *  (at your option) any later version.
  13.  *
  14.  *  This program is distributed in the hope that it will be useful,
  15.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  *  GNU General Public License for more details.
  18.  *
  19.  *  You should have received a copy of the GNU General Public License
  20.  *  along with this program; if not, write to the Free Software
  21.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  22.  */
  23. /* History:
  24.  * 0.8 April 2002: Integration into the kernel tree.
  25.  * 0.7 October 2001: First public release as a module, distributed with
  26.  *     the BRLTTY package (beta versions around 2.99y).
  27.  */
  28. #define DRIVER_VERSION "v0.8"
  29. #define DATE "April 2002"
  30. #define DRIVER_AUTHOR 
  31. "Stephane Dalton <sdalton@videotron.ca> " 
  32. "and St閜hane Doyon <s.doyon@videotron.ca>"
  33. #define DRIVER_DESC "Tieman Voyager braille display USB driver for Linux 2.4"
  34. #define DRIVER_SHORTDESC "Voyager"
  35. #define BANNER 
  36. KERN_INFO DRIVER_SHORTDESC " " DRIVER_VERSION " (" DATE ")n" 
  37. KERN_INFO "   by " DRIVER_AUTHOR "n"
  38. static const char longbanner[] = {
  39. DRIVER_DESC ", " DRIVER_VERSION " (" DATE "), by " DRIVER_AUTHOR
  40. };
  41. #include <linux/module.h>
  42. #include <linux/usb.h>
  43. #include <linux/init.h>
  44. #include <linux/slab.h>
  45. #include <linux/sched.h>
  46. #include <asm/uaccess.h>
  47. #include <asm/atomic.h>
  48. #include <linux/poll.h>
  49. #include <linux/devfs_fs_kernel.h>
  50. #include <linux/brlvger.h>
  51. MODULE_AUTHOR( DRIVER_AUTHOR );
  52. MODULE_DESCRIPTION( DRIVER_DESC );
  53. MODULE_LICENSE("GPL");
  54. /* Module parameters */
  55. static int debug = 1;
  56. MODULE_PARM(debug, "i");
  57. MODULE_PARM_DESC(debug, "Debug level, 0-3");
  58. static int write_repeats = 2;
  59. MODULE_PARM(write_repeats, "i");
  60. MODULE_PARM_DESC(write_repeats, "Hack: repetitions for command to "
  61.  "display braille pattern");
  62.  /* to get rid of weird extra dots (perhaps only on
  63.     early hardware versions?) */
  64. static int stall_tries = 3;
  65. MODULE_PARM(stall_tries, "i");
  66. MODULE_PARM_DESC(stall_tries, "Hack: retransmits of stalled USB "
  67.  "control messages");
  68.                  /* broken early hardware versions? */
  69. #define BRLVGER_RAW_VOLTAGE 89
  70. /* from 0->300V to 255->200V, we are told 265V is normal operating voltage,
  71.    but we don't know the scale. Assuming it is linear. */
  72. static int raw_voltage = BRLVGER_RAW_VOLTAGE;
  73. MODULE_PARM(raw_voltage, "i");
  74. MODULE_PARM_DESC(raw_voltage, "Parameter for the call to SET_DISPLAY_VOLTAGE");
  75. /* protocol and display type defines */
  76. #define MAX_BRLVGER_CELLS 72
  77. #define MAX_INTERRUPT_DATA 8
  78. /* control message request types */
  79. #define BRLVGER_READ_REQ 0xC2
  80. #define BRLVGER_WRITE_REQ 0x42
  81. /* control message request codes */
  82. #define BRLVGER_SET_DISPLAY_ON 0
  83. #define BRLVGER_SET_DISPLAY_VOLTAGE 1
  84. #define BRLVGER_GET_SERIAL 3
  85. #define BRLVGER_GET_HWVERSION 4
  86. #define BRLVGER_GET_FWVERSION 5
  87. #define BRLVGER_GET_LENGTH 6
  88. #define BRLVGER_SEND_BRAILLE 7
  89. #define BRLVGER_BEEP 9
  90. #if 0 /* not used and not sure they're working */
  91. #define BRLVGER_GET_DISPLAY_VOLTAGE 2
  92. #define BRLVGER_GET_CURRENT 8
  93. #endif
  94. /* Prototypes */
  95. static void *brlvger_probe (struct usb_device *dev, unsigned ifnum,
  96.     const struct usb_device_id *id);
  97. static void brlvger_disconnect(struct usb_device *dev, void *ptr);
  98. static int brlvger_open(struct inode *inode, struct file *file);
  99. static int brlvger_release(struct inode *inode, struct file *file);
  100. static ssize_t brlvger_write(struct file *file, const char *buffer,
  101.      size_t count, loff_t *pos);
  102. static ssize_t brlvger_read(struct file *file, char *buffer,
  103.     size_t count, loff_t *unused_pos);
  104. static int brlvger_ioctl(struct inode *inode, struct file *file,
  105.  unsigned cmd, unsigned long arg);
  106. static unsigned brlvger_poll(struct file *file, poll_table *wait);
  107. static loff_t brlvger_llseek(struct file * file, loff_t offset, int orig);
  108. static void intr_callback(struct urb *urb);
  109. struct brlvger_priv;
  110. static int brlvger_get_hw_version(struct brlvger_priv *priv,
  111.   unsigned char *verbuf);
  112. static int brlvger_get_fw_version(struct brlvger_priv *priv,
  113.   unsigned char *buf);
  114. static int brlvger_get_serial(struct brlvger_priv *priv,
  115.       unsigned char *buf);
  116. static int brlvger_get_display_length(struct brlvger_priv *priv);
  117. static int brlvger_set_display_on_off(struct brlvger_priv *priv, __u16 on);
  118. static int brlvger_beep(struct brlvger_priv *priv, __u16 duration);
  119. static int brlvger_set_display_voltage(struct brlvger_priv *priv,
  120.        __u16 voltage);
  121. static int mycontrolmsg(const char *funcname,
  122.                         struct brlvger_priv *priv, unsigned pipe_dir,
  123.                         __u8 request, __u8 requesttype, __u16 value,
  124.                         __u16 index, void *data, __u16 size);
  125. #define controlmsg(priv,pipe_dir,a,b,c,d,e,f) 
  126.      mycontrolmsg(__FUNCTION__, priv, pipe_dir, 
  127.                   a,b,c,d,e,f)
  128. #define sndcontrolmsg(priv,a,b,c,d,e,f) 
  129.     controlmsg(priv, 0, a,b,c,d,e,f)
  130. #define rcvcontrolmsg(priv,a,b,c,d,e,f) 
  131.     controlmsg(priv, USB_DIR_IN, a,b,c,d,e,f)
  132. extern devfs_handle_t usb_devfs_handle; /* /dev/usb dir. */
  133. /* ----------------------------------------------------------------------- */
  134. /* Data */
  135. /* key event queue size */
  136. #define MAX_INTERRUPT_BUFFER 10
  137. /* private state */
  138. struct brlvger_priv {
  139. struct usb_device   *dev; /* USB device handle */
  140. struct usb_endpoint_descriptor *in_interrupt;
  141. struct urb *intr_urb;
  142. devfs_handle_t devfs;
  143. int subminor; /* which minor dev #? */
  144. unsigned char hwver[BRLVGER_HWVER_SIZE]; /* hardware version */
  145. unsigned char fwver[BRLVGER_FWVER_SIZE]; /* firmware version */
  146. unsigned char serialnum[BRLVGER_SERIAL_SIZE];
  147. int llength; /* logical length */
  148. int plength; /* physical length */
  149. __u8 obuf[MAX_BRLVGER_CELLS];
  150. __u8 intr_buff[MAX_INTERRUPT_DATA];
  151. __u8 event_queue[MAX_INTERRUPT_BUFFER][MAX_INTERRUPT_DATA];
  152. atomic_t intr_idx, read_idx;
  153. spinlock_t intr_idx_lock; /* protects intr_idx */
  154. wait_queue_head_t read_wait;
  155. int opened;
  156. struct semaphore open_sem; /* protects ->opened */
  157. struct semaphore dev_sem; /* protects ->dev */
  158. };
  159. /* Globals */
  160. /* Table of connected devices, a different minor for each. */
  161. static struct brlvger_priv *display_table[ MAX_NR_BRLVGER_DEVS ];
  162. /* Mutex for the operation of removing a device from display_table */
  163. static DECLARE_MUTEX(disconnect_sem);
  164. /* For blocking open */
  165. static DECLARE_WAIT_QUEUE_HEAD(open_wait);
  166. /* Some print macros */
  167. #ifdef dbg
  168. #undef dbg
  169. #endif
  170. #ifdef info
  171. #undef info
  172. #endif
  173. #ifdef err
  174. #undef err
  175. #endif
  176. #define info(args...) 
  177.     ({ printk(KERN_INFO "Voyager: " args); 
  178.        printk("n"); })
  179. #define err(args...) 
  180.     ({ printk(KERN_ERR "Voyager: " args); 
  181.        printk("n"); })
  182. #define dbgprint(fmt, args...) 
  183.     ({ printk(KERN_DEBUG "Voyager: %s: " fmt, __FUNCTION__ , ##args); 
  184.        printk("n"); })
  185. #define dbg(args...) 
  186.     ({ if(debug >= 1) dbgprint(args); })
  187. #define dbg2(args...) 
  188.     ({ if(debug >= 2) dbgprint(args); })
  189. #define dbg3(args...) 
  190.     ({ if(debug >= 3) dbgprint(args); })
  191. /* ----------------------------------------------------------------------- */
  192. /* Driver registration */
  193. static struct usb_device_id brlvger_ids [] = {
  194. { USB_DEVICE(0x0798, 0x0001) },
  195. { }                     /* Terminating entry */
  196. };
  197. MODULE_DEVICE_TABLE (usb, brlvger_ids);
  198. static struct file_operations brlvger_fops =
  199. {
  200. owner: THIS_MODULE,
  201. llseek: brlvger_llseek,
  202. read: brlvger_read,
  203. write: brlvger_write,
  204. ioctl: brlvger_ioctl,
  205. open: brlvger_open,
  206. release: brlvger_release,
  207. poll: brlvger_poll,
  208. };
  209. static struct usb_driver brlvger_driver =
  210. {
  211. name: "brlvger",
  212. probe: brlvger_probe,
  213. disconnect: brlvger_disconnect,
  214. fops: &brlvger_fops,
  215. minor: BRLVGER_MINOR,
  216. id_table: brlvger_ids,
  217. };
  218. static int
  219. __init brlvger_init (void)
  220. {
  221. printk(BANNER);
  222. if(stall_tries < 1 || write_repeats < 1)
  223.   return -EINVAL;
  224. memset(display_table, 0, sizeof(display_table));
  225. if (usb_register(&brlvger_driver)) {
  226. err("USB registration failed");
  227. return -ENOSYS;
  228. }
  229. return 0;
  230. }
  231. static void
  232. __exit brlvger_cleanup (void)
  233. {
  234. usb_deregister (&brlvger_driver);
  235. dbg("Driver unregistered");
  236. }
  237. module_init (brlvger_init);
  238. module_exit (brlvger_cleanup);
  239. /* ----------------------------------------------------------------------- */
  240. /* Probe and disconnect functions */
  241. static void *
  242. brlvger_probe (struct usb_device *dev, unsigned ifnum,
  243.        const struct usb_device_id *id)
  244. {
  245. struct brlvger_priv *priv = NULL;
  246. int i;
  247. struct usb_endpoint_descriptor *endpoint;
  248. struct usb_interface_descriptor *actifsettings;
  249. /* protects against reentrance: once we've found a free slot
  250.    we reserve it.*/
  251. static DECLARE_MUTEX(reserve_sem);
  252.         char devfs_name[16];
  253. actifsettings = dev->actconfig->interface->altsetting;
  254. if( dev->descriptor.bNumConfigurations != 1
  255. || dev->config->bNumInterfaces != 1 
  256. || actifsettings->bNumEndpoints != 1 ) {
  257. err ("Bogus braille display config info");
  258. return NULL;
  259. }
  260. endpoint = actifsettings->endpoint;
  261. if (!(endpoint->bEndpointAddress & 0x80) ||
  262. ((endpoint->bmAttributes & 3) != 0x03)) {
  263. err ("Bogus braille display config info, wrong endpoints");
  264. return NULL;
  265. }
  266. down(&reserve_sem);
  267. for( i = 0; i < MAX_NR_BRLVGER_DEVS; i++ )
  268. if( display_table[i] == NULL )
  269. break;
  270. if( i == MAX_NR_BRLVGER_DEVS ) {
  271. err( "This driver cannot handle more than %d "
  272. "braille displays", MAX_NR_BRLVGER_DEVS);
  273. goto error;
  274. }
  275. if( !(priv = kmalloc (sizeof *priv, GFP_KERNEL)) ){
  276. err("No more memory");
  277. goto error;
  278. }
  279. memset(priv, 0, sizeof(*priv));
  280. atomic_set(&priv->intr_idx, 0);
  281. atomic_set(&priv->read_idx, MAX_INTERRUPT_BUFFER-1);
  282. spin_lock_init(&priv->intr_idx_lock);
  283. init_waitqueue_head(&priv->read_wait);
  284. /* opened is memset'ed to 0 */
  285. init_MUTEX(&priv->open_sem);
  286. init_MUTEX(&priv->dev_sem);
  287. priv->subminor = i;
  288. /* we found a interrupt in endpoint */
  289. priv->in_interrupt = endpoint;
  290. priv->dev = dev;
  291. if(brlvger_get_hw_version(priv, priv->hwver) <0) {
  292. err("Unable to get hardware version");
  293. goto error;
  294. }
  295. dbg("Hw ver %d.%d", priv->hwver[0], priv->hwver[1]);
  296. if(brlvger_get_fw_version(priv, priv->fwver) <0) {
  297. err("Unable to get firmware version");
  298. goto error;
  299. }
  300. dbg("Fw ver: %s", priv->fwver);
  301. if(brlvger_get_serial(priv, priv->serialnum) <0) {
  302. err("Unable to get serial number");
  303. goto error;
  304. }
  305. dbg("Serial number: %s", priv->serialnum);
  306. if( (priv->llength = brlvger_get_display_length(priv)) <0 ){
  307. err("Unable to get display length");
  308. goto error;
  309. }
  310. switch(priv->llength) {
  311. case 48:
  312. priv->plength = 44;
  313. break;
  314. case 72:
  315. priv->plength = 70;
  316. break;
  317. default:
  318. err("Unsupported display length: %d", priv->llength);
  319. goto error;
  320. };
  321. dbg("Display length: %d", priv->plength);
  322. sprintf(devfs_name, "brlvger%d", priv->subminor);
  323. priv->devfs = devfs_register(usb_devfs_handle, devfs_name,
  324.      DEVFS_FL_DEFAULT, USB_MAJOR,
  325.      BRLVGER_MINOR+priv->subminor,
  326.      S_IFCHR |S_IRUSR|S_IWUSR |S_IRGRP|S_IWGRP,
  327.      &brlvger_fops, NULL);
  328. if (!priv->devfs) {
  329. #ifdef CONFIG_DEVFS_FS
  330. err("devfs node registration failed");
  331. #endif
  332. }
  333. display_table[i] = priv;
  334. info( "Braille display %d is device major %d minor %d",
  335. i, USB_MAJOR, BRLVGER_MINOR + i);
  336. /* Tell anyone waiting on a blocking open */
  337. wake_up_interruptible(&open_wait);
  338. goto out;
  339.  error:
  340. if(priv) {
  341. kfree( priv );
  342. priv = NULL;
  343. }
  344.  out:
  345. up(&reserve_sem);
  346. return priv;
  347. }
  348. static void
  349. brlvger_disconnect(struct usb_device *dev, void *ptr)
  350. {
  351. struct brlvger_priv *priv = (struct brlvger_priv *)ptr;
  352. int r;
  353. if(priv){
  354. info("Display %d disconnecting", priv->subminor);
  355. devfs_unregister(priv->devfs);
  356. down(&disconnect_sem);
  357. display_table[priv->subminor] = NULL;
  358. up(&disconnect_sem);
  359. down(&priv->open_sem);
  360. down(&priv->dev_sem);
  361. if(priv->opened) {
  362. /* Disable interrupts */
  363. if((r = usb_unlink_urb(priv->intr_urb)) <0)
  364. err("usb_unlink_urb returns %d", r);
  365. usb_free_urb(priv->intr_urb);
  366. /* mark device as dead and prevent control
  367.    messages to it */
  368. priv->dev = NULL;
  369. /* Tell anyone hung up on a read that it
  370.    won't be coming */
  371. wake_up_interruptible(&priv->read_wait);
  372. up(&priv->dev_sem);
  373. up(&priv->open_sem);
  374. }else
  375. /* no corresponding up()s */
  376. kfree(priv);
  377. }
  378. }
  379. /* ----------------------------------------------------------------------- */
  380. /* fops implementation */
  381. static int
  382. brlvger_open(struct inode *inode, struct file *file)
  383. {
  384. int devnum = MINOR (inode->i_rdev);
  385. struct brlvger_priv *priv;
  386. int n, ret;
  387. if (devnum < BRLVGER_MINOR
  388.     || devnum >= (BRLVGER_MINOR + MAX_NR_BRLVGER_DEVS))
  389. return -ENXIO;
  390. n = devnum - BRLVGER_MINOR;
  391. MOD_INC_USE_COUNT;
  392. do {
  393. down(&disconnect_sem);
  394. priv = display_table[n];
  395. if(!priv) {
  396. up(&disconnect_sem);
  397. if (file->f_flags & O_NONBLOCK) {
  398. dbg3("Failing non-blocking open: "
  399.      "device %d not connected", n);
  400. MOD_DEC_USE_COUNT;
  401. return -EAGAIN;
  402. }
  403. /* Blocking open. One global wait queue will
  404.    suffice. We wait until a device for the selected
  405.    minor is connected. */
  406. dbg2("Waiting for device %d to be connected", n);
  407. ret = wait_event_interruptible(open_wait,
  408.        display_table[n]
  409.        != NULL);
  410. if(ret) {
  411. dbg2("Interrupted wait for device %d", n);
  412. MOD_DEC_USE_COUNT;
  413. return ret;
  414. }
  415. }
  416. } while(!priv);
  417. /* We grabbed an existing device. */
  418. if(down_interruptible(&priv->open_sem))
  419. return -ERESTARTSYS;
  420. up(&disconnect_sem);
  421. /* Only one process can open each device, no sharing. */
  422. ret = -EBUSY;
  423. if(priv->opened)
  424. goto error;
  425. dbg("Opening display %d", priv->subminor);
  426. /* Setup interrupt handler for receiving key input */
  427. priv->intr_urb = usb_alloc_urb(0);
  428. if(!priv->intr_urb) {
  429. err("Unable to allocate URB");
  430. goto error;
  431. }
  432. FILL_INT_URB( priv->intr_urb, priv->dev,
  433. usb_rcvintpipe(priv->dev,
  434.        priv->in_interrupt->bEndpointAddress),
  435. priv->intr_buff, sizeof(priv->intr_buff),
  436. intr_callback, priv, priv->in_interrupt->bInterval);
  437. if((ret = usb_submit_urb(priv->intr_urb)) <0){
  438. err("Error %d while submitting URB", ret);
  439. goto error;
  440. }
  441. /* Set voltage */
  442. if(brlvger_set_display_voltage(priv, raw_voltage) <0) {
  443. err("Unable to set voltage");
  444. goto error;
  445. }
  446. /* Turn display on */
  447. if((ret = brlvger_set_display_on_off(priv, 1)) <0) {
  448. err("Error %d while turning display on", ret);
  449. goto error;
  450. }
  451. /* Mark as opened, so disconnect cannot free priv. */
  452. priv->opened = 1;
  453. file->private_data = priv;
  454. ret = 0;
  455. goto out;
  456.  error:
  457. MOD_DEC_USE_COUNT;
  458.  out:
  459. up(&priv->open_sem);
  460. return ret;
  461. }
  462. static int
  463. brlvger_release(struct inode *inode, struct file *file)
  464. {
  465. struct brlvger_priv *priv = file->private_data;
  466. int r;
  467. /* Turn display off. Safe even if disconnected. */
  468. brlvger_set_display_on_off(priv, 0);
  469. /* mutex with disconnect and with open */
  470. down(&priv->open_sem);
  471. if(!priv->dev) {
  472. dbg("Releasing disconnected device %d", priv->subminor);
  473. /* no up(&priv->open_sem) */
  474. kfree(priv);
  475. }else{
  476. dbg("Closing display %d", priv->subminor);
  477. /* Disable interrupts */
  478. if((r = usb_unlink_urb(priv->intr_urb)) <0)
  479. err("usb_unlink_urb returns %d", r);
  480. usb_free_urb(priv->intr_urb);
  481. priv->opened = 0;
  482. up(&priv->open_sem);
  483. }
  484. MOD_DEC_USE_COUNT;
  485. return 0;
  486. }
  487. static ssize_t
  488. brlvger_write(struct file *file, const char *buffer,
  489.       size_t count, loff_t *pos)
  490. {
  491. struct brlvger_priv *priv = file->private_data;
  492. char buf[MAX_BRLVGER_CELLS];
  493. int ret;
  494. size_t rs;
  495. loff_t off;
  496. __u16 written;
  497. if(!priv->dev)
  498. return -ENOLINK;
  499. off = *pos;
  500. if(off > priv->plength)
  501. return -ESPIPE;;
  502. rs = priv->plength - off;
  503. if(count > rs)
  504. count = rs;
  505. written = count;
  506. if (copy_from_user (buf, buffer, count ) )
  507. return -EFAULT;
  508. memset(priv->obuf, 0xaa, sizeof(priv->obuf));
  509. /* Firmware supports multiples of 8cells, so some cells are absent
  510.    and for some reason there actually are holes! euurkkk! */
  511. if( priv->plength == 44 ) {
  512. /* Two ghost cells at the beginning of the display, plus
  513.    two more after the sixth physical cell. */
  514. if(off > 5) {
  515. off +=4;
  516. memcpy(priv->obuf, buf, count);
  517. }else{
  518. int firstpart = 6 - off;
  519. #ifdef WRITE_DEBUG
  520. dbg3("off: %d, rs: %d, count: %d, firstpart: %d",
  521.      off, rs, count, firstpart);
  522. #endif
  523. firstpart = (firstpart < count) ? firstpart : count;
  524. #ifdef WRITE_DEBUG
  525. dbg3("off: %d", off);
  526. dbg3("firstpart: %d", firstpart);
  527. #endif
  528. memcpy(priv->obuf, buf, firstpart);
  529. if(firstpart != count) {
  530. int secondpart = count - firstpart;
  531. #ifdef WRITE_DEBUG
  532. dbg3("secondpart: %d", secondpart);
  533. #endif
  534. memcpy(priv->obuf+(firstpart+2),
  535.        buf+firstpart, secondpart);
  536. written +=2;
  537. }
  538. off +=2;
  539. #ifdef WRITE_DEBUG
  540. dbg3("off: %d, rs: %d, count: %d, firstpart: %d, "
  541. "written: %d",  off, rs, count, firstpart, written);
  542. #endif
  543. }
  544. }else{
  545. /* Two ghost cells at the beginningg of the display. */
  546. memcpy(priv->obuf, buf, count);
  547. off += 2;
  548. }
  549. {
  550. int repeat = write_repeats;
  551. /* Dirty hack: sometimes some of the dots are wrong and somehow
  552.    right themselves if the command is repeated. */
  553. while(repeat--) {
  554. ret = sndcontrolmsg(priv,
  555. BRLVGER_SEND_BRAILLE, BRLVGER_WRITE_REQ, 0,
  556. off, priv->obuf, written);
  557. if(ret <0)
  558. return ret;
  559. }
  560. }
  561. return count;
  562. }
  563. static int
  564. read_index(struct brlvger_priv *priv)
  565. {
  566. int intr_idx, read_idx;
  567. read_idx = atomic_read(&priv->read_idx);
  568. read_idx = ++read_idx == MAX_INTERRUPT_BUFFER ? 0 : read_idx;
  569. intr_idx = atomic_read(&priv->intr_idx);
  570. return(read_idx == intr_idx ? -1 : read_idx);
  571. }
  572. static ssize_t
  573. brlvger_read(struct file *file, char *buffer,
  574.      size_t count, loff_t *unused_pos)
  575. {
  576. struct brlvger_priv *priv = file->private_data;
  577. int read_idx;
  578. if(count != MAX_INTERRUPT_DATA)
  579. return -EINVAL;
  580. if(!priv->dev)
  581. return -ENOLINK;
  582. if((read_idx = read_index(priv)) == -1) {
  583. /* queue empty */
  584. if (file->f_flags & O_NONBLOCK)
  585. return -EAGAIN;
  586. else{
  587. int r = wait_event_interruptible(priv->read_wait,
  588.  (!priv->dev || (read_idx = read_index(priv)) != -1));
  589. if(!priv->dev)
  590. return -ENOLINK;
  591. if(r)
  592. return r;
  593. if(read_idx == -1)
  594. /* should not happen */
  595. return 0;
  596. }
  597. }
  598. if (copy_to_user (buffer, priv->event_queue[read_idx], count) )
  599. return( -EFAULT);
  600. atomic_set(&priv->read_idx, read_idx);
  601. /* Multiple opens are not allowed. Yet on SMP, two processes could
  602.    read at the same time (on a shared file descriptor); then it is not
  603.    deterministic whether or not they will get duplicates of a key
  604.    event. */
  605. return MAX_INTERRUPT_DATA;
  606. }
  607. static int
  608. brlvger_ioctl(struct inode *inode, struct file *file,
  609.       unsigned cmd, unsigned long arg)
  610. {
  611. struct brlvger_priv *priv = file->private_data;
  612. if(!priv->dev)
  613. return -ENOLINK;
  614. switch(cmd) {
  615. case BRLVGER_GET_INFO: {
  616. struct brlvger_info vi;
  617. strncpy(vi.driver_version, DRIVER_VERSION,
  618. sizeof(vi.driver_version));
  619. vi.driver_version[sizeof(vi.driver_version)-1] = 0;
  620. strncpy(vi.driver_banner, longbanner,
  621. sizeof(vi.driver_banner));
  622. vi.driver_banner[sizeof(vi.driver_banner)-1] = 0;
  623. vi.display_length = priv->plength;
  624. memcpy(&vi.hwver, priv->hwver, BRLVGER_HWVER_SIZE);
  625. memcpy(&vi.fwver, priv->fwver, BRLVGER_FWVER_SIZE);
  626. memcpy(&vi.serialnum, priv->serialnum, BRLVGER_SERIAL_SIZE);
  627. if(copy_to_user((void *)arg, &vi, sizeof(vi)))
  628. return -EFAULT;
  629. return 0;
  630. }
  631. case BRLVGER_DISPLAY_ON:
  632. return brlvger_set_display_on_off(priv, 1);
  633. case BRLVGER_DISPLAY_OFF:
  634. return brlvger_set_display_on_off(priv, 0);
  635. case BRLVGER_BUZZ: {
  636. __u16 duration;
  637. if(get_user(duration, (__u16 *)arg))
  638. return -EFAULT;
  639. return brlvger_beep(priv, duration);
  640. }
  641. #if 0 /* Underlying commands don't seem to work for some reason; not clear if
  642.  we'd want to export these anyway. */
  643. case BRLVGER_SET_VOLTAGE: {
  644. __u16 voltage;
  645. if(get_user(voltage, (__u16 *)arg))
  646. return -EFAULT;
  647. return brlvger_set_display_voltage(priv, voltage);
  648. }
  649. case BRLVGER_GET_VOLTAGE: {
  650. __u8 voltage;
  651. int r = brlvger_get_display_voltage(priv);
  652. if(r <0)
  653. return r;
  654. voltage = r;
  655. if(put_user(voltage, (__u8 *)arg))
  656. return -EFAULT;
  657. return 0;
  658. }
  659. #endif
  660. default:
  661. return -EINVAL;
  662. };
  663. }
  664. static loff_t
  665. brlvger_llseek(struct file *file, loff_t offset, int orig)
  666. {
  667. struct brlvger_priv *priv = file->private_data;
  668. if(!priv->dev)
  669. return -ENOLINK;
  670. switch (orig) {
  671. case 0:
  672. /*  nothing to do */
  673. break;
  674. case 1:
  675. offset +=file->f_pos;
  676. break;
  677. case 2:
  678. offset += priv->plength;
  679. default:
  680. return -EINVAL;
  681. }
  682. if((offset >= priv->plength) || (offset < 0))
  683. return -EINVAL;
  684. return (file->f_pos = offset);
  685. }
  686. static unsigned
  687. brlvger_poll(struct file *file, poll_table *wait) 
  688. {
  689. struct brlvger_priv *priv = file->private_data;
  690. if(!priv->dev)
  691. return POLLERR | POLLHUP;
  692. poll_wait(file, &priv->read_wait, wait);
  693. if(!priv->dev)
  694. return POLLERR | POLLHUP;
  695. if(read_index(priv) != -1)
  696. return POLLIN | POLLRDNORM;
  697. return 0;
  698. }
  699. static void
  700. intr_callback(struct urb *urb)
  701. {
  702. struct brlvger_priv *priv = urb->context;
  703. int intr_idx, read_idx;
  704. if( urb->status ) {
  705. if(urb->status == -ETIMEDOUT)
  706. dbg2("Status -ETIMEDOUT, "
  707.      "probably disconnected");
  708. else if(urb->status != -ENOENT)
  709. err("Status: %d", urb->status);
  710. return;
  711. }
  712. read_idx = atomic_read(&priv->read_idx);
  713. spin_lock(&priv->intr_idx_lock);
  714. intr_idx = atomic_read(&priv->intr_idx);
  715. if(read_idx == intr_idx) {
  716. dbg2("Queue full, dropping braille display input");
  717. spin_unlock(&priv->intr_idx_lock);
  718. return; /* queue full */
  719. }
  720. memcpy(priv->event_queue[intr_idx], urb->transfer_buffer,
  721.        MAX_INTERRUPT_DATA);
  722. intr_idx = (++intr_idx == MAX_INTERRUPT_BUFFER)? 0 : intr_idx;
  723. atomic_set(&priv->intr_idx, intr_idx);
  724. spin_unlock(&priv->intr_idx_lock);
  725. wake_up_interruptible(&priv->read_wait);
  726. }
  727. /* ----------------------------------------------------------------------- */
  728. /* Hardware access functions */
  729. static int
  730. mycontrolmsg(const char *funcname,
  731.      struct brlvger_priv *priv, unsigned pipe_dir,
  732.      __u8 request, __u8 requesttype, __u16 value,
  733.      __u16 index, void *data, __u16 size)
  734. {
  735. int ret=0, tries = stall_tries;
  736. /* Make sure the device was not disconnected */
  737. if(down_interruptible(&priv->dev_sem))
  738. return -ERESTARTSYS;
  739. if(!priv->dev) {
  740. up(&priv->dev_sem);
  741. return -ENOLINK;
  742. }
  743. /* Dirty hack for retransmission: stalls and fails all the time
  744.    without this on the hardware we tested. */
  745. while(tries--) {
  746. ret = usb_control_msg(priv->dev,
  747.     usb_sndctrlpipe(priv->dev,0) |pipe_dir,
  748.     request, requesttype, value,
  749.     index, data, size,
  750.     HZ);
  751. if(ret != -EPIPE)
  752. break;
  753. dbg2("Stalled, remaining %d tries", tries);
  754. }
  755. up(&priv->dev_sem);
  756. if(ret <0) {
  757. err("%s: usb_control_msg returns %d",
  758. funcname, ret);
  759. return -EIO;
  760. }
  761. return 0;
  762. }
  763. static int
  764. brlvger_get_hw_version(struct brlvger_priv *priv, unsigned char *verbuf)
  765. {
  766. return rcvcontrolmsg(priv,
  767.     BRLVGER_GET_HWVERSION, BRLVGER_READ_REQ, 0,
  768.     0, verbuf, BRLVGER_HWVER_SIZE);
  769. /* verbuf should be 2 bytes */
  770. }
  771. static int
  772. brlvger_get_fw_version(struct brlvger_priv *priv, unsigned char *buf)
  773. {
  774. unsigned char rawbuf[(BRLVGER_FWVER_SIZE-1)*2+2];
  775. int i, len;
  776. int r = rcvcontrolmsg(priv,
  777.       BRLVGER_GET_FWVERSION, BRLVGER_READ_REQ, 0,
  778.       0, rawbuf, sizeof(rawbuf));
  779. if(r<0)
  780. return r;
  781. /* If I guess correctly: succession of 16bit words, the string is
  782.            formed of the first byte of each of these words. First byte in
  783.            buffer indicates total length of data; not sure what second byte is
  784.            for. */
  785. len = rawbuf[0]-2;
  786. if(len<0)
  787. len = 0;
  788. else if(len+1 > BRLVGER_FWVER_SIZE)
  789. len = BRLVGER_FWVER_SIZE-1;
  790. for(i=0; i<len; i++)
  791. buf[i] = rawbuf[2+2*i];
  792. buf[i] = 0;
  793. return 0;
  794. }
  795. static int
  796. brlvger_get_serial(struct brlvger_priv *priv, unsigned char *buf)
  797. {
  798. unsigned char rawserial[BRLVGER_SERIAL_BIN_SIZE];
  799. int i;
  800. int r = rcvcontrolmsg(priv,
  801.       BRLVGER_GET_SERIAL, BRLVGER_READ_REQ, 0,
  802.       0, rawserial, sizeof(rawserial));
  803. if(r<0)
  804. return r;
  805. for(i=0; i<BRLVGER_SERIAL_BIN_SIZE; i++) {
  806. #define NUM_TO_HEX(n) (((n)>9) ? (n)+'A' : (n)+'0')
  807. buf[2*i] = NUM_TO_HEX(rawserial[i] >>4);
  808. buf[2*i+1] = NUM_TO_HEX(rawserial[i] &0xf);
  809. }
  810. buf[2*i] = 0;
  811. return 0;
  812. }
  813. static int
  814. brlvger_get_display_length(struct brlvger_priv *priv)
  815. {
  816. unsigned char data[2];
  817. int ret = rcvcontrolmsg(priv,
  818.     BRLVGER_GET_LENGTH, BRLVGER_READ_REQ, 0,
  819.     0, data, 2);
  820. if(ret<0)
  821. return ret;
  822. return data[1];
  823. }
  824. static int
  825. brlvger_beep(struct brlvger_priv *priv, __u16 duration)
  826. {
  827. return sndcontrolmsg(priv,
  828.     BRLVGER_BEEP, BRLVGER_WRITE_REQ, duration,
  829.     0, NULL, 0);
  830. }
  831. static int
  832. brlvger_set_display_on_off(struct brlvger_priv *priv, __u16 on)
  833. {
  834. dbg2("Turning display %s", ((on) ? "on" : "off"));
  835. return sndcontrolmsg(priv,
  836.     BRLVGER_SET_DISPLAY_ON, BRLVGER_WRITE_REQ, on,
  837.     0, NULL, 0);
  838. }
  839. static int
  840. brlvger_set_display_voltage(struct brlvger_priv *priv, __u16 voltage)
  841. {
  842. dbg("SET_DISPLAY_VOLTAGE to %u", voltage);
  843.         return sndcontrolmsg(priv,
  844.      BRLVGER_SET_DISPLAY_VOLTAGE, BRLVGER_WRITE_REQ, voltage,
  845.      0, NULL, 0);
  846. }
  847. #if 0 /* Had problems testing these commands. Not particularly useful anyway.*/
  848. static int
  849. brlvger_get_display_voltage(struct brlvger_priv *priv)
  850. {
  851. __u8 voltage = 0;
  852. int ret = rcvcontrolmsg(priv,
  853.     BRLVGER_GET_DISPLAY_VOLTAGE, BRLVGER_READ_REQ, 0,
  854.     0, &voltage, 1);
  855. if(ret<0)
  856. return ret;
  857. return voltage;
  858. }
  859. static int
  860. brlvger_get_current(struct brlvger_priv *priv)
  861. {
  862. unsigned char data;
  863. int ret = rcvcontrolmsg(priv,
  864.     BRLVGER_GET_CURRENT, BRLVGER_READ_REQ, 0,
  865.     0, &data, 1);
  866. if(ret<0)
  867. return ret;
  868. return data;
  869. }
  870. #endif