summaryrefslogtreecommitdiffstats
path: root/drivers/usb/serial/keyspan.h
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/serial/keyspan.h')
-rw-r--r--drivers/usb/serial/keyspan.h326
1 files changed, 326 insertions, 0 deletions
diff --git a/drivers/usb/serial/keyspan.h b/drivers/usb/serial/keyspan.h
new file mode 100644
index 000000000..ce966dc4f
--- /dev/null
+++ b/drivers/usb/serial/keyspan.h
@@ -0,0 +1,326 @@
+/*
+ Keyspan USB to Serial Converter driver
+
+ (C) Copyright (C) 2000
+ Hugh Blemings <hugh@linuxcare.com>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ See http://www.linuxcare.com.au/hugh/keyspan.html for more
+ information on this driver.
+
+ Code in this driver inspired by and in a number of places taken
+ from Brian Warner's original Keyspan-PDA driver.
+
+ This driver has been put together with the support of Innosys, Inc.
+ and Keyspan, Inc the manufacturers of the Keyspan USB-serial products.
+ Thanks Guys :)
+
+ Tip 'o the hat to Linuxcare for supporting staff in their work on
+ open source projects.
+
+ See keyspan.c for update history.
+
+*/
+
+#ifndef __LINUX_USB_SERIAL_KEYSPAN_H
+#define __LINUX_USB_SERIAL_KEYSPAN_H
+
+
+ /* Function prototypes for Keyspan serial converter */
+static int keyspan_open (struct usb_serial_port *port,
+ struct file *filp);
+static void keyspan_close (struct usb_serial_port *port,
+ struct file *filp);
+static int keyspan_startup (struct usb_serial *serial);
+static void keyspan_shutdown (struct usb_serial *serial);
+static void keyspan_rx_throttle (struct usb_serial_port *port);
+static void keyspan_rx_unthrottle (struct usb_serial_port *port);
+static int keyspan_write_room (struct usb_serial_port *port);
+static int keyspan_write (struct usb_serial_port *port,
+ int from_user,
+ const unsigned char *buf,
+ int count);
+static void keyspan_write_bulk_callback (struct urb *urb);
+static void keyspan_read_bulk_callback (struct urb *urb);
+static int keyspan_chars_in_buffer (struct usb_serial_port *port);
+static int keyspan_ioctl (struct usb_serial_port *port,
+ struct file *file,
+ unsigned int cmd,
+ unsigned long arg);
+static void keyspan_set_termios (struct usb_serial_port *port,
+ struct termios *old);
+static void keyspan_break_ctl (struct usb_serial_port *port,
+ int break_state);
+static int keyspan_fake_startup (struct usb_serial *serial);
+
+static int keyspan_usa19_calc_baud (u32 baud_rate, u8 *rate_hi,
+ u8 *rate_low);
+static void keyspan_usa19_setup_urbs (struct usb_serial *serial);
+static int keyspan_usa19_send_setup (struct usb_serial *serial,
+ struct usb_serial_port *port);
+
+
+ /* Functions from usbserial.c for ezusb firmware handling */
+extern int ezusb_set_reset (struct usb_serial *serial, unsigned char reset_bit);
+extern int ezusb_writememory (struct usb_serial *serial, int address, unsigned char *data, int length, __u8 bRequest);
+
+ /* Struct used for firmware */
+struct ezusb_hex_record {
+ __u16 address;
+ __u8 data_size;
+ __u8 data[16];
+};
+ /* Conditionally include firmware images, if they aren't
+ included create a null pointer instead. Current
+ firmware images aren't optimised to remove duplicate
+ addresses. */
+#ifdef CONFIG_USB_SERIAL_KEYSPAN_USA28
+ #include "keyspan_usa28_fw.h"
+#else
+ static const struct ezusb_hex_record *keyspan_usa28_firmware = NULL;
+#endif
+
+#ifdef CONFIG_USB_SERIAL_KEYSPAN_USA28X
+ #include "keyspan_usa28x_fw.h"
+#else
+ static const struct ezusb_hex_record *keyspan_usa28x_firmware = NULL;
+#endif
+
+#ifdef CONFIG_USB_SERIAL_KEYSPAN_USA19
+ #include "keyspan_usa19_fw.h"
+#else
+ static const struct ezusb_hex_record *keyspan_usa19_firmware = NULL;
+#endif
+
+#ifdef CONFIG_USB_SERIAL_KEYSPAN_USA18X
+ #include "keyspan_usa18x_fw.h"
+#else
+ static const struct ezusb_hex_record *keyspan_usa18x_firmware = NULL;
+#endif
+
+#ifdef CONFIG_USB_SERIAL_KEYSPAN_USA19W
+ #include "keyspan_usa19w_fw.h"
+#else
+ static const struct ezusb_hex_record *keyspan_usa19w_firmware = NULL;
+#endif
+
+
+ /* Values used for baud rate calculation - device specific */
+#define KEYSPAN_INVALID_BAUD_RATE (-1)
+#define KEYSPAN_BAUD_RATE_OK (0)
+#define USA19_BAUDCLK (12000000L)
+
+ /* Device info for the Keyspan serial converter */
+#define KEYSPAN_VENDOR_ID (0x06cd)
+static __u16 keyspan_vendor_id = KEYSPAN_VENDOR_ID;
+
+ /* Product IDs for the five products supported, pre-renumeration */
+static __u16 keyspan_usa18x_pre_product_id = 0x0105;
+static __u16 keyspan_usa19_pre_product_id = 0x0103;
+static __u16 keyspan_usa19w_pre_product_id = 0x0106;
+static __u16 keyspan_usa28_pre_product_id = 0x0101;
+static __u16 keyspan_usa28x_pre_product_id = 0x0102;
+
+ /* Product IDs post-renumeration */
+static __u16 keyspan_usa18x_product_id = 0x0112;
+static __u16 keyspan_usa19_product_id = 0x0107;
+static __u16 keyspan_usa19w_product_id = 0x0108;
+static __u16 keyspan_usa28_product_id = 0x010f;
+static __u16 keyspan_usa28x_product_id = 0x0110;
+
+ /* Structs for the devices, pre and post renumeration.
+ These are incomplete at present - HAB 20000708 */
+struct usb_serial_device_type keyspan_usa18x_pre_device = {
+ name: "Keyspan USA18X - (prerenumeration)",
+ idVendor: &keyspan_vendor_id,
+ idProduct: &keyspan_usa18x_pre_product_id,
+ needs_interrupt_in: DONT_CARE,
+ needs_bulk_in: DONT_CARE,
+ needs_bulk_out: DONT_CARE,
+ num_interrupt_in: NUM_DONT_CARE,
+ num_bulk_in: NUM_DONT_CARE,
+ num_bulk_out: NUM_DONT_CARE,
+ num_ports: 1,
+ startup: keyspan_fake_startup
+};
+
+struct usb_serial_device_type keyspan_usa19_pre_device = {
+ name: "Keyspan USA19 - (prerenumeration)",
+ idVendor: &keyspan_vendor_id,
+ idProduct: &keyspan_usa19_pre_product_id,
+ needs_interrupt_in: DONT_CARE,
+ needs_bulk_in: DONT_CARE,
+ needs_bulk_out: DONT_CARE,
+ num_interrupt_in: NUM_DONT_CARE,
+ num_bulk_in: NUM_DONT_CARE,
+ num_bulk_out: NUM_DONT_CARE,
+ num_ports: 1,
+ startup: keyspan_fake_startup
+};
+
+
+struct usb_serial_device_type keyspan_usa19w_pre_device = {
+ name: "Keyspan USA19W - (prerenumeration)",
+ idVendor: &keyspan_vendor_id,
+ idProduct: &keyspan_usa19w_pre_product_id,
+ needs_interrupt_in: DONT_CARE,
+ needs_bulk_in: DONT_CARE,
+ needs_bulk_out: DONT_CARE,
+ num_interrupt_in: NUM_DONT_CARE,
+ num_bulk_in: NUM_DONT_CARE,
+ num_bulk_out: NUM_DONT_CARE,
+ num_ports: 1,
+ startup: keyspan_fake_startup
+};
+
+
+struct usb_serial_device_type keyspan_usa28_pre_device = {
+ name: "Keyspan USA28 - (prerenumeration)",
+ idVendor: &keyspan_vendor_id,
+ idProduct: &keyspan_usa28_pre_product_id,
+ needs_interrupt_in: DONT_CARE,
+ needs_bulk_in: DONT_CARE,
+ needs_bulk_out: DONT_CARE,
+ num_interrupt_in: NUM_DONT_CARE,
+ num_bulk_in: NUM_DONT_CARE,
+ num_bulk_out: NUM_DONT_CARE,
+ num_ports: 2,
+ startup: keyspan_fake_startup
+};
+
+struct usb_serial_device_type keyspan_usa28x_pre_device = {
+ name: "Keyspan USA28X - (prerenumeration)",
+ idVendor: &keyspan_vendor_id,
+ idProduct: &keyspan_usa28x_pre_product_id,
+ needs_interrupt_in: DONT_CARE,
+ needs_bulk_in: DONT_CARE,
+ needs_bulk_out: DONT_CARE,
+ num_interrupt_in: NUM_DONT_CARE,
+ num_bulk_in: NUM_DONT_CARE,
+ num_bulk_out: NUM_DONT_CARE,
+ num_ports: 2,
+ startup: keyspan_fake_startup
+};
+
+
+struct usb_serial_device_type keyspan_usa18x_device = {
+ name: "Keyspan USA18X",
+ idVendor: &keyspan_vendor_id,
+ idProduct: &keyspan_usa18x_product_id,
+ needs_interrupt_in: DONT_CARE,
+ needs_bulk_in: DONT_CARE,
+ needs_bulk_out: DONT_CARE,
+ num_interrupt_in: NUM_DONT_CARE,
+ num_bulk_in: NUM_DONT_CARE,
+ num_bulk_out: NUM_DONT_CARE,
+ num_ports: 1,
+ open: keyspan_open,
+ close: keyspan_close,
+ throttle: keyspan_rx_throttle,
+ unthrottle: keyspan_rx_unthrottle,
+ set_termios: keyspan_set_termios,
+};
+
+struct usb_serial_device_type keyspan_usa19_device = {
+ name: "Keyspan USA19",
+ idVendor: &keyspan_vendor_id,
+ idProduct: &keyspan_usa19_product_id,
+ needs_interrupt_in: DONT_CARE,
+ needs_bulk_in: MUST_HAVE,
+ needs_bulk_out: MUST_HAVE,
+ num_interrupt_in: NUM_DONT_CARE,
+ num_bulk_in: 3,
+ num_bulk_out: 4,
+ num_ports: 1,
+ open: keyspan_open,
+ close: keyspan_close,
+ write: keyspan_write,
+ write_room: keyspan_write_room,
+ write_bulk_callback: keyspan_write_bulk_callback,
+ read_int_callback: keyspan_read_bulk_callback,
+ chars_in_buffer: keyspan_chars_in_buffer,
+ throttle: keyspan_rx_throttle,
+ unthrottle: keyspan_rx_unthrottle,
+ ioctl: keyspan_ioctl,
+ set_termios: keyspan_set_termios,
+ break_ctl: keyspan_break_ctl,
+ startup: keyspan_startup,
+ shutdown: keyspan_shutdown,
+};
+
+
+struct usb_serial_device_type keyspan_usa19w_device = {
+ name: "Keyspan USA19W",
+ idVendor: &keyspan_vendor_id,
+ idProduct: &keyspan_usa19w_product_id,
+ needs_interrupt_in: DONT_CARE,
+ needs_bulk_in: DONT_CARE,
+ needs_bulk_out: DONT_CARE,
+ num_interrupt_in: NUM_DONT_CARE,
+ num_bulk_in: NUM_DONT_CARE,
+ num_bulk_out: NUM_DONT_CARE,
+ num_ports: 1,
+ open: keyspan_open,
+ close: keyspan_close,
+ throttle: keyspan_rx_throttle,
+ unthrottle: keyspan_rx_unthrottle,
+ set_termios: keyspan_set_termios,
+};
+
+
+struct usb_serial_device_type keyspan_usa28_device = {
+ name: "Keyspan USA28",
+ idVendor: &keyspan_vendor_id,
+ idProduct: &keyspan_usa28_product_id,
+ needs_interrupt_in: DONT_CARE,
+ needs_bulk_in: DONT_CARE,
+ needs_bulk_out: DONT_CARE,
+ num_interrupt_in: NUM_DONT_CARE,
+ num_bulk_in: NUM_DONT_CARE,
+ num_bulk_out: NUM_DONT_CARE,
+ num_ports: 2,
+ open: keyspan_open,
+ close: keyspan_close,
+ throttle: keyspan_rx_throttle,
+ unthrottle: keyspan_rx_unthrottle,
+ set_termios: keyspan_set_termios,
+};
+
+
+struct usb_serial_device_type keyspan_usa28x_device = {
+ name: "Keyspan USA28X",
+ idVendor: &keyspan_vendor_id,
+ idProduct: &keyspan_usa28x_product_id,
+ needs_interrupt_in: DONT_CARE,
+ needs_bulk_in: DONT_CARE,
+ needs_bulk_out: DONT_CARE,
+ num_interrupt_in: NUM_DONT_CARE,
+ num_bulk_in: NUM_DONT_CARE,
+ num_bulk_out: NUM_DONT_CARE,
+ num_ports: 2,
+ open: keyspan_open,
+ close: keyspan_close,
+ write: keyspan_write,
+ write_room: keyspan_write_room,
+ write_bulk_callback: keyspan_write_bulk_callback,
+ read_int_callback: keyspan_read_bulk_callback,
+ chars_in_buffer: keyspan_chars_in_buffer,
+ throttle: keyspan_rx_throttle,
+ unthrottle: keyspan_rx_unthrottle,
+ ioctl: keyspan_ioctl,
+ set_termios: keyspan_set_termios,
+ break_ctl: keyspan_break_ctl,
+ startup: keyspan_startup,
+ shutdown: keyspan_shutdown,
+
+
+
+};
+
+
+
+#endif