2 * USB Abstract Control Model based on Brad Keryan's USB busmouse driver
4 * (C) Copyright 1999 Armin Fuerst <fuerst@in.tum.de>
5 * (C) Copyright 1999 Pavel Machek <pavel@suse.cz>
6 * (C) Copyright 1999 Johannes Erdfelt <jerdfelt@valinux.com>
8 * version 0.9: Johanness Erdfelt converted this to urb interface.
10 * version 0.8: Fixed endianity bug, some cleanups. I really hate to have
11 * half of driver in form if (...) { info("x"); return y; }
12 * Pavel Machek <pavel@suse.cz>
14 * version 0.7: Added usb flow control. Fixed bug in uhci.c (what idiot
15 * wrote this code? ...Oops that was me). Fixed module cleanup. Did some
16 * testing at 3Com => zmodem uload+download works, pppd had trouble but
17 * seems to work now. Changed Menuconfig texts "Communications Device
18 * Class (ACM)" might be a bit more intuitive. Ported to 2.3.13-1 prepatch.
21 * version 0.6: Modularized driver, added disconnect code, improved
22 * assignment of device to tty minor number.
25 * version 0.5: Driver now generates a tty instead of a simple character
26 * device. Moved async bulk transfer to 2.3.10 kernel version. fixed a bug
27 * in uhci_td_allocate. Commenetd out getstringtable which causes crash.
30 * version 0.4: Small fixes in the FIFO, cleanup. Updated Bulk transfer in
31 * uhci.c. Should have the correct interface now.
34 * version 0.3: Major changes. Changed Bulk transfer to interrupt based
35 * transfer. Using FIFO Buffers now. Consistent handling of open/close
36 * file state and detected/nondetected device. File operations behave
37 * according to this. Driver is able to send+receive now! Heureka!
40 * version 0.2: Improved Bulk transfer. TX led now flashes every time data is
41 * sent. Send Encapsulated Data is not needed, nor does it do anything.
42 * Why's that ?!? Thanks to Thomas Sailer for his close look at the bulk code.
43 * He told me about some importand bugs. (5/21/99)
45 * version 0.1: Bulk transfer for uhci seems to work now, no dangling tds any
46 * more. TX led of the ISDN TA flashed the first time. Does this mean it works?
47 * The interrupt of the ctrl endpoint crashes the kernel => no read possible
50 * version 0.0: Driver sets up configuration, sets up data pipes, opens misc
51 * device. No actual data transfer is done, since we don't have bulk transfer,
52 * yet. Purely skeleton for now. (5/8/99)
55 #include <linux/kernel.h>
56 #include <linux/sched.h>
57 #include <linux/signal.h>
58 #include <linux/errno.h>
59 #include <linux/poll.h>
60 #include <linux/init.h>
61 #include <linux/malloc.h>
62 #include <linux/fcntl.h>
63 #include <linux/tty_driver.h>
64 #include <linux/tty_flip.h>
65 #include <linux/tty.h>
66 #include <linux/module.h>
71 #define ACM_MAJOR 166 /* Wow, major is now officially allocated */
73 //#define info(message...) printk(KERN_DEBUG message)
74 #define info(message...)
76 #define CTRL_STAT_DTR 1
77 #define CTRL_STAT_RTS 2
79 static struct usb_driver acm_driver
;
81 static int acm_refcount
;
83 static struct tty_driver acm_tty_driver
;
84 static struct tty_struct
*acm_tty
[NR_PORTS
];
85 static struct termios
*acm_termios
[NR_PORTS
];
86 static struct termios
*acm_termios_locked
[NR_PORTS
];
87 static struct acm_state acm_state_table
[NR_PORTS
];
90 struct usb_device
*dev
; //the coresponding usb device
91 int cfgnum
; //configuration number on this device
92 struct tty_struct
*tty
; //the coresponding tty
93 char present
; //a device for this struct was detected => this tty is used
94 char active
; //someone has this acm's device open
95 unsigned int ctrlstate
; //Status of the serial control lines (handshake,...)
96 unsigned int linecoding
; //Status of the line coding (Bits, Stop, Parity)
97 int writesize
, readsize
, ctrlsize
; //size of the usb buffers
98 char *writebuffer
, *readbuffer
, *ctrlbuffer
; //the usb buffers
99 char writing
, reading
; //flag if transfer is running
100 unsigned int readendp
,writeendp
,ctrlendp
; //endpoints and
101 unsigned int readpipe
,writepipe
,ctrlpipe
; //pipes (are one of these obsolete?)
102 urb_t
*readurb
, *writeurb
, *ctrlurb
;
103 unsigned ctrlinterval
; //interval to poll from device
106 #define ACM_READY (acm->present && acm->active)
108 //functions for various ACM requests
110 void Set_Control_Line_Status(unsigned int status
, struct acm_state
*acm
)
112 struct usb_device
*dev
= acm
->dev
;
115 info("Set_control_Line_Status\n");
117 ret
= usb_control_msg(dev
, usb_sndctrlpipe(dev
, 0), 0x22, 0x22,
118 status
, 0, NULL
, 0, HZ
);
120 printk(KERN_ERR
"acm: Set_Control_Line_Status failed\n");
122 acm
->ctrlstate
= status
;
125 void Set_Line_Coding(unsigned int coding
, struct acm_state
*acm
)
127 struct usb_device
*dev
= acm
->dev
;
130 info("Set_Line_Coding\n");
132 ret
= usb_control_msg(dev
, usb_sndctrlpipe(dev
, 0), 0x30, 0x22,
133 coding
, 0, NULL
, 0, HZ
);
135 acm
->linecoding
= coding
;
138 //Interrupt handler for various usb events
139 static void acm_irq(urb_t
*urb
)
141 struct acm_state
*acm
= (struct acm_state
*)urb
->context
;
142 unsigned char *data
= urb
->transfer_buffer
;
145 info("ACM_USB_IRQ\n");
147 if (urb
->status
< 0) {
148 printk(KERN_DEBUG
"acm_irq: strange status received: %d\n", urb
->status
);
157 dr
= (devrequest
*)data
;
161 printk("reqtype: %02X\n",dr
->requesttype
);
162 printk("request: %02X\n",dr
->request
);
163 printk("wValue: %02X\n",dr
->value
);
164 printk("wIndex: %02X\n",dr
->index
);
165 printk("wLength: %02X\n",dr
->length
);
168 switch(dr
->request
) {
169 case 0x00: /* Network connection */
170 printk(KERN_DEBUG
"Network connection: ");
171 if (dr
->request
==0) printk(KERN_DEBUG
"disconnected\n");
172 if (dr
->request
==1) printk(KERN_DEBUG
"connected\n");
175 case 0x01: /* Response available */
176 printk(KERN_DEBUG
"Response available\n");
179 case 0x20: /* Set serial line state */
180 printk(KERN_DEBUG
"acm.c: Set serial control line state\n");
181 if ((dr
->index
==1) && (dr
->length
==2)) {
182 acm
->ctrlstate
= data
[0] || (data
[1] << 16);
183 printk(KERN_DEBUG
"Serstate: %02X\n", acm
->ctrlstate
);
191 static void acm_read_irq(urb_t
*urb
)
193 struct acm_state
*acm
= (struct acm_state
*)urb
->context
;
194 struct tty_struct
*tty
= acm
->tty
;
195 unsigned char *data
= acm
->readbuffer
;
198 info("ACM_READ_IRQ: state %d, %d bytes\n", urb
->status
, urb
->actual_length
);
200 printk("acm_read_irq: strange state received: %d\n", urb
->status
);
207 for (i
=0;i
<urb
->actual_length
;i
++)
208 tty_insert_flip_char(tty
,data
[i
],0);
209 tty_flip_buffer_push(tty
);
216 static void acm_write_irq(urb_t
*urb
)
218 struct acm_state
*acm
= (struct acm_state
*)urb
->context
;
219 struct tty_struct
*tty
= acm
->tty
;
221 info("ACM_WRITE_IRQ\n");
227 if ((tty
->flags
& (1 << TTY_DO_WRITE_WAKEUP
)) && tty
->ldisc
.write_wakeup
)
228 (tty
->ldisc
.write_wakeup
)(tty
);
229 wake_up_interruptible(&tty
->write_wait
);
235 static int rs_open(struct tty_struct
*tty
, struct file
*filp
)
237 struct acm_state
*acm
;
240 info("USB_FILE_OPEN\n");
242 tty
->driver_data
= acm
=
243 &acm_state_table
[MINOR(tty
->device
) - tty
->driver
.minor_start
];
254 /* Start reading from the device */
255 FILL_INT_URB(acm
->ctrlurb
, acm
->dev
, acm
->ctrlpipe
,
256 acm
->ctrlbuffer
, acm
->ctrlsize
,
257 acm_irq
, acm
, acm
->ctrlinterval
);
258 ret
= usb_submit_urb(acm
->ctrlurb
);
260 printk(KERN_ERR
"acm: usb_submit_urb(INT) failed (%d)\n", ret
);
263 FILL_BULK_URB(acm
->readurb
, acm
->dev
, acm
->readpipe
, acm
->readbuffer
,
264 acm
->readsize
, acm_read_irq
, acm
);
265 ret
= usb_submit_urb(acm
->readurb
);
268 printk(KERN_ERR
"acm: usb_submit_urb(READ) failed (%d)\n", ret
);
271 Set_Control_Line_Status(CTRL_STAT_DTR
| CTRL_STAT_RTS
, acm
);
276 static void rs_close(struct tty_struct
*tty
, struct file
*filp
)
278 struct acm_state
*acm
= (struct acm_state
*)tty
->driver_data
;
288 Set_Control_Line_Status(0, acm
);
292 usb_unlink_urb(acm
->writeurb
);
297 usb_unlink_urb(acm
->readurb
);
305 static int rs_write(struct tty_struct
*tty
, int from_user
,
306 const unsigned char *buf
, int count
)
308 struct acm_state
*acm
= (struct acm_state
*)tty
->driver_data
;
317 info("already writing\n");
321 written
= (count
>acm
->writesize
) ? acm
->writesize
: count
;
324 copy_from_user(acm
->writebuffer
, buf
, written
);
326 memcpy(acm
->writebuffer
, buf
, written
);
331 FILL_BULK_URB(acm
->writeurb
, acm
->dev
, acm
->writepipe
, acm
->writebuffer
,
332 written
, acm_write_irq
, acm
);
333 ret
= usb_submit_urb(acm
->writeurb
);
335 printk("acm: usb_submit_urb(WRITE) failed: %d\n", ret
);
340 static void rs_put_char(struct tty_struct
*tty
, unsigned char ch
)
342 printk(KERN_DEBUG
"acm: rs_put_char: Who called this unsupported routine?\n");
346 static int rs_write_room(struct tty_struct
*tty
)
348 struct acm_state
*acm
= (struct acm_state
*)tty
->driver_data
;
350 info("rs_write_room\n");
355 return acm
->writing
? 0 : acm
->writesize
;
358 static int rs_chars_in_buffer(struct tty_struct
*tty
)
360 struct acm_state
*acm
= (struct acm_state
*)tty
->driver_data
;
362 // info("rs_chars_in_buffer\n");
367 return acm
->writing
? acm
->writesize
: 0;
370 static void rs_throttle(struct tty_struct
*tty
)
372 struct acm_state
*acm
= (struct acm_state
*)tty
->driver_data
;
374 info("rs_throttle\n");
380 rs_send_xchar(tty, STOP_CHAR(tty));
382 if (tty
->termios
->c_cflag
& CRTSCTS
)
383 Set_Control_Line_Status(acm
->ctrlstate
& ~CTRL_STAT_RTS
, acm
);
386 static void rs_unthrottle(struct tty_struct
*tty
)
388 struct acm_state
*acm
= (struct acm_state
*) tty
->driver_data
;
390 info("rs_unthrottle\n");
396 rs_send_xchar(tty, STOP_CHAR(tty));
398 if (tty
->termios
->c_cflag
& CRTSCTS
)
399 Set_Control_Line_Status(acm
->ctrlstate
| CTRL_STAT_RTS
, acm
);
402 static int get_free_acm(void)
406 for (i
= 0; i
< NR_PORTS
; i
++) {
407 if (!acm_state_table
[i
].present
)
413 static void * acm_probe(struct usb_device
*dev
, unsigned int ifnum
)
415 struct acm_state
*acm
;
416 struct usb_interface_descriptor
*interface
;
417 struct usb_endpoint_descriptor
*endpoint
;
423 if (0>(acmno
=get_free_acm())) {
424 info("Too many acm devices connected\n");
427 acm
= &acm_state_table
[acmno
];
430 if (dev
->descriptor
.bDeviceClass
!= 2 ||
431 dev
->descriptor
.bDeviceSubClass
!= 0 ||
432 dev
->descriptor
.bDeviceProtocol
!= 0)
435 #define IFCLASS(if) ((if->bInterfaceClass << 24) | (if->bInterfaceSubClass << 16) | (if->bInterfaceProtocol << 8) | (if->bNumEndpoints))
437 /* FIXME: should the driver really be doing the configuration
438 * selecting or should the usbcore? [different configurations
439 * can have different bandwidth requirements] -greg */
441 printk("Acm: found device with right class...\n" );
443 /* Now scan all configs for a ACM configuration */
444 for (cfgnum
=0;cfgnum
<dev
->descriptor
.bNumConfigurations
;cfgnum
++) {
445 /* The first one should be Communications interface? */
446 interface
= &dev
->config
[cfgnum
].interface
[0].altsetting
[0];
447 if (IFCLASS(interface
) != 0x02020101)
450 /* Which uses an interrupt input */
451 endpoint
= &interface
->endpoint
[0];
452 if ((endpoint
->bEndpointAddress
& 0x80) != 0x80 ||
453 (endpoint
->bmAttributes
& 3) != 3)
456 /* The second one should be a Data interface? */
457 interface
= &dev
->config
[cfgnum
].interface
[1].altsetting
[0];
458 if (interface
->bInterfaceClass
!= 10 ||
459 interface
->bNumEndpoints
!= 2)
462 /* make sure both interfaces are available for our use */
463 if (usb_interface_claimed(&dev
->config
[cfgnum
].interface
[0]) ||
464 usb_interface_claimed(&dev
->config
[cfgnum
].interface
[1])) {
465 printk("usb-acm: required interface already has a driver\n");
469 endpoint
= &interface
->endpoint
[0];
470 if ((endpoint
->bEndpointAddress
& 0x80) != 0x80)
473 /*With a bulk input */
474 endpoint
= &interface
->endpoint
[0^swapped
];
475 if ((endpoint
->bEndpointAddress
& 0x80) != 0x80 ||
476 (endpoint
->bmAttributes
& 3) != 2)
479 /*And a bulk output */
480 endpoint
= &interface
->endpoint
[1^swapped
];
481 if ((endpoint
->bEndpointAddress
& 0x80) == 0x80 ||
482 (endpoint
->bmAttributes
& 3) != 2)
485 printk("USB ACM %d found on config %d\n", acmno
, cfgnum
);
486 usb_set_configuration(dev
, dev
->config
[cfgnum
].bConfigurationValue
);
490 acm
->readendp
=dev
->config
[cfgnum
].interface
[1].altsetting
[0].endpoint
[0^swapped
].bEndpointAddress
;
491 acm
->readpipe
=usb_rcvbulkpipe(dev
,acm
->readendp
);
492 acm
->readbuffer
=kmalloc(acm
->readsize
=dev
->config
[cfgnum
].interface
[1].altsetting
[0].endpoint
[0^swapped
].wMaxPacketSize
,GFP_KERNEL
);
494 if (!acm
->readbuffer
) {
495 printk("ACM: Couldn't allocate readbuffer\n");
498 acm
->readurb
= usb_alloc_urb(0);
500 printk("acm: couldn't allocate read urb\n");
504 acm
->writeendp
=dev
->config
[cfgnum
].interface
[1].altsetting
[0].endpoint
[1^swapped
].bEndpointAddress
;
505 acm
->writepipe
=usb_sndbulkpipe(dev
,acm
->writeendp
);
506 acm
->writebuffer
=kmalloc(acm
->writesize
=dev
->config
[cfgnum
].interface
[1].altsetting
[0].endpoint
[1^swapped
].wMaxPacketSize
, GFP_KERNEL
);
508 if (!acm
->writebuffer
) {
509 printk("ACM: Couldn't allocate writebuffer\n");
510 kfree(acm
->readbuffer
);
513 acm
->writeurb
= usb_alloc_urb(0);
514 if (!acm
->writeurb
) {
515 printk("acm: couldn't allocate write urb\n");
519 acm
->ctrlbuffer
=kmalloc(acm
->ctrlsize
=dev
->config
[cfgnum
].interface
[0].altsetting
[0].endpoint
[0].wMaxPacketSize
, GFP_KERNEL
);
520 acm
->ctrlendp
=dev
->config
[cfgnum
].interface
[0].altsetting
[0].endpoint
[0].bEndpointAddress
;
521 acm
->ctrlpipe
=usb_rcvintpipe(acm
->dev
,acm
->ctrlendp
);
522 acm
->ctrlinterval
=dev
->config
[cfgnum
].interface
[0].altsetting
[0].endpoint
[0].bInterval
;
523 if (!acm
->ctrlbuffer
) {
524 printk("acm: couldn't allocate ctrlbuffer\n");
527 acm
->ctrlurb
= usb_alloc_urb(0);
529 printk("acm: couldn't allocate write urb\n");
533 acm
->cfgnum
= cfgnum
;
537 usb_driver_claim_interface(&acm_driver
,
538 &dev
->config
[cfgnum
].interface
[0], acm
);
539 usb_driver_claim_interface(&acm_driver
,
540 &dev
->config
[cfgnum
].interface
[1], acm
);
546 static void acm_disconnect(struct usb_device
*dev
, void *ptr
)
548 struct acm_state
*acm
= ptr
;
550 info("acm_disconnect\n");
563 usb_unlink_urb(acm
->ctrlurb
);
564 usb_free_urb(acm
->ctrlurb
);
568 usb_unlink_urb(acm
->readurb
);
569 usb_free_urb(acm
->readurb
);
573 usb_unlink_urb(acm
->writeurb
);
574 usb_free_urb(acm
->writeurb
);
575 acm
->writeurb
= NULL
;
577 //BUG: What to do if a device is open?? Notify process or not allow cleanup?
578 kfree(acm
->writebuffer
);
579 kfree(acm
->readbuffer
);
580 kfree(acm
->ctrlbuffer
);
582 /* release the interfaces so that other drivers can have at them */
583 usb_driver_release_interface(&acm_driver
,
584 &dev
->config
[acm
->cfgnum
].interface
[0]);
585 usb_driver_release_interface(&acm_driver
,
586 &dev
->config
[acm
->cfgnum
].interface
[1]);
592 static struct usb_driver acm_driver
= {
599 int usb_acm_init(void)
603 info("usb_acm_init\n");
605 //INITIALIZE GLOBAL DATA STRUCTURES
606 for (cnt
= 0; cnt
< NR_PORTS
; cnt
++)
607 memset(&acm_state_table
[cnt
], 0, sizeof(struct acm_state
));
609 //REGISTER TTY DRIVER
610 memset(&acm_tty_driver
, 0, sizeof(struct tty_driver
));
611 acm_tty_driver
.magic
= TTY_DRIVER_MAGIC
;
612 acm_tty_driver
.driver_name
= "usb";
613 acm_tty_driver
.name
= "ttyACM";
614 acm_tty_driver
.major
= ACM_MAJOR
;
615 acm_tty_driver
.minor_start
= 0;
616 acm_tty_driver
.num
= NR_PORTS
;
617 acm_tty_driver
.type
= TTY_DRIVER_TYPE_SERIAL
;
618 acm_tty_driver
.subtype
= SERIAL_TYPE_NORMAL
;
619 acm_tty_driver
.init_termios
= tty_std_termios
;
620 acm_tty_driver
.init_termios
.c_cflag
= B9600
| CS8
| CREAD
| HUPCL
| CLOCAL
;
621 acm_tty_driver
.flags
= TTY_DRIVER_REAL_RAW
;
622 acm_tty_driver
.refcount
= &acm_refcount
;
623 acm_tty_driver
.table
= acm_tty
;
624 acm_tty_driver
.termios
= acm_termios
;
625 acm_tty_driver
.termios_locked
= acm_termios_locked
;
627 acm_tty_driver
.open
= rs_open
;
628 acm_tty_driver
.close
= rs_close
;
629 acm_tty_driver
.write
= rs_write
;
630 acm_tty_driver
.put_char
= rs_put_char
;
631 acm_tty_driver
.flush_chars
= NULL
; //rs_flush_chars;
632 acm_tty_driver
.write_room
= rs_write_room
;
633 acm_tty_driver
.ioctl
= NULL
; //rs_ioctl
634 acm_tty_driver
.set_termios
= NULL
; //rs_set_termios;
635 acm_tty_driver
.set_ldisc
= NULL
;
636 acm_tty_driver
.throttle
= rs_throttle
;
637 acm_tty_driver
.unthrottle
= rs_unthrottle
;
638 acm_tty_driver
.stop
= NULL
; //rs_stop;
639 acm_tty_driver
.start
= NULL
; //rs_start;
640 acm_tty_driver
.hangup
= NULL
; //rs_hangup;
641 acm_tty_driver
.break_ctl
= NULL
; //rs_break;
642 acm_tty_driver
.wait_until_sent
= NULL
; //rs_wait_until_sent;
643 acm_tty_driver
.send_xchar
= NULL
; //rs_send_xchar;
644 acm_tty_driver
.read_proc
= NULL
; //rs_read_proc;
645 acm_tty_driver
.chars_in_buffer
= rs_chars_in_buffer
;
646 acm_tty_driver
.flush_buffer
= NULL
; //rs_flush_buffer;
647 if (tty_register_driver(&acm_tty_driver
)) {
648 printk(KERN_ERR
"acm: failed to register tty driver\n");
652 if (usb_register(&acm_driver
) < 0) {
653 tty_unregister_driver(&acm_tty_driver
);
657 printk(KERN_INFO
"USB ACM registered.\n");
661 void usb_acm_cleanup(void)
664 struct acm_state
*acm
;
666 info("usb_acm_cleanup\n");
668 for (i
=0;i
<NR_PORTS
;i
++) {
669 acm
=&acm_state_table
[i
];
671 printk("disconnecting %d\n",i
);
672 acm_disconnect(acm
->dev
, acm
);
675 tty_unregister_driver(&acm_tty_driver
);
677 usb_deregister(&acm_driver
);
682 int init_module(void)
684 return usb_acm_init();
687 void cleanup_module(void)