Great news! The driver seems to work, I'm getting data that looks right.
I'll play with it and make sure it really is getting everything.
Thanks Greg!!!
On Fri, 17 Mar 2006, Greg KH wrote:
> On Fri, Mar 17, 2006 at 09:53:03AM -0800, Warren Lewis wrote:
> > Yes I'll give it a try, I haven't done a kernel compile since the early
> > 2.4 series but it shouldn't be too different.
>
> Ok, here's a patch against 2.6.16-rc6 that might add basic support for
> this device. Can you build it and load it with:
> modprobe navman debug=1
> and let me know if it works for your device or not?
>
> If not, the output of the kernel debug log would be most helpful in
> figuring out what is going on (you can get that by running the 'dmesg'
> program.)
>
> thanks,
>
> greg k-h
>
> From: Greg Kroah-Hartman <[EMAIL PROTECTED]>
> Subject: USB serial: add navman driver
>
>
> Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>
>
> ---
> drivers/usb/serial/Kconfig | 7 +
> drivers/usb/serial/Makefile | 1
> drivers/usb/serial/navman.c | 157
> ++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 165 insertions(+)
>
> --- gregkh-2.6.orig/drivers/usb/serial/Kconfig
> +++ gregkh-2.6/drivers/usb/serial/Kconfig
> @@ -403,6 +403,13 @@ config USB_SERIAL_MCT_U232
> To compile this driver as a module, choose M here: the
> module will be called mct_u232.
>
> +config USB_SERIAL_NAVMAN
> + tristate "USB Navman GPS device"
> + depends on USB_SERIAL
> + help
> + To compile this driver as a module, choose M here: the
> + module will be called navman.
> +
> config USB_SERIAL_PL2303
> tristate "USB Prolific 2303 Single Port Serial Driver"
> depends on USB_SERIAL
> --- gregkh-2.6.orig/drivers/usb/serial/Makefile
> +++ gregkh-2.6/drivers/usb/serial/Makefile
> @@ -32,6 +32,7 @@ obj-$(CONFIG_USB_SERIAL_KEYSPAN_PDA) +=
> obj-$(CONFIG_USB_SERIAL_KLSI) += kl5kusb105.o
> obj-$(CONFIG_USB_SERIAL_KOBIL_SCT) += kobil_sct.o
> obj-$(CONFIG_USB_SERIAL_MCT_U232) += mct_u232.o
> +obj-$(CONFIG_USB_SERIAL_NAVMAN) += navman.o
> obj-$(CONFIG_USB_SERIAL_OMNINET) += omninet.o
> obj-$(CONFIG_USB_SERIAL_OPTION) += option.o
> obj-$(CONFIG_USB_SERIAL_PL2303) += pl2303.o
> --- /dev/null
> +++ gregkh-2.6/drivers/usb/serial/navman.c
> @@ -0,0 +1,157 @@
> +/*
> + * Navman Serial USB driver
> + *
> + * Copyright (C) 2006 Greg Kroah-Hartman <[EMAIL PROTECTED]>
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License
> + * version 2 as published by the Free Software Foundation.
> + */
> +
> +#include <linux/kernel.h>
> +#include <linux/init.h>
> +#include <linux/tty.h>
> +#include <linux/tty_flip.h>
> +#include <linux/module.h>
> +#include <linux/usb.h>
> +#include "usb-serial.h"
> +
> +static int debug;
> +
> +static struct usb_device_id id_table [] = {
> + { USB_DEVICE(0x0a99, 0x0001) }, /* Talon Technology device */
> + { },
> +};
> +MODULE_DEVICE_TABLE(usb, id_table);
> +
> +static struct usb_driver navman_driver = {
> + .name = "navman",
> + .probe = usb_serial_probe,
> + .disconnect = usb_serial_disconnect,
> + .id_table = id_table,
> + .no_dynamic_id = 1,
> +};
> +
> +static void navman_read_int_callback(struct urb *urb, struct pt_regs *regs)
> +{
> + struct usb_serial_port *port = urb->context;
> + unsigned char *data = urb->transfer_buffer;
> + struct tty_struct *tty;
> + int result;
> +
> + switch (urb->status) {
> + case 0:
> + /* success */
> + break;
> + case -ECONNRESET:
> + case -ENOENT:
> + case -ESHUTDOWN:
> + /* this urb is terminated, clean up */
> + dbg("%s - urb shutting down with status: %d",
> + __FUNCTION__, urb->status);
> + return;
> + default:
> + dbg("%s - nonzero urb status received: %d",
> + __FUNCTION__, urb->status);
> + goto exit;
> + }
> +
> + usb_serial_debug_data(debug, &port->dev, __FUNCTION__,
> + urb->actual_length, data);
> +
> + tty = port->tty;
> + if (tty && urb->actual_length) {
> + tty_buffer_request_room(tty, urb->actual_length);
> + tty_insert_flip_string(tty, data, urb->actual_length);
> + tty_flip_buffer_push(tty);
> + }
> +
> +exit:
> + result = usb_submit_urb(urb, GFP_ATOMIC);
> + if (result)
> + dev_err(&urb->dev->dev,
> + "%s - Error %d submitting interrupt urb\n",
> + __FUNCTION__, result);
> +}
> +
> +static int navman_open(struct usb_serial_port *port, struct file *filp)
> +{
> + int result = 0;
> +
> + dbg("%s - port %d", __FUNCTION__, port->number);
> +
> + if (port->interrupt_in_urb) {
> + dbg("%s - adding interrupt input for treo", __FUNCTION__);
> + result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
> + if (result)
> + dev_err(&port->dev,
> + "%s - failed submitting interrupt urb, error
> %d\n",
> + __FUNCTION__, result);
> + }
> + return result;
> +}
> +
> +static void navman_close(struct usb_serial_port *port, struct file *filp)
> +{
> + dbg("%s - port %d", __FUNCTION__, port->number);
> +
> + if (port->interrupt_in_urb)
> + usb_kill_urb(port->interrupt_in_urb);
> +}
> +
> +static int navman_write(struct usb_serial_port *port,
> + const unsigned char *buf, int count)
> +{
> + dbg("%s - port %d", __FUNCTION__, port->number);
> +
> + /*
> + * This device can't write any data, only read from the device
> + * so we just silently eat all data sent to us and say it was
> + * successfully sent.
> + * Evil, I know, but do you have a better idea?
> + */
> +
> + return count;
> +}
> +
> +static struct usb_serial_driver navman_device = {
> + .driver = {
> + .owner = THIS_MODULE,
> + .name = "navman",
> + },
> + .id_table = id_table,
> + .num_interrupt_in = NUM_DONT_CARE,
> + .num_bulk_in = NUM_DONT_CARE,
> + .num_bulk_out = NUM_DONT_CARE,
> + .num_ports = 1,
> + .open = navman_open,
> + .close = navman_close,
> + .write = navman_write,
> + .read_int_callback = navman_read_int_callback,
> +};
> +
> +static int __init navman_init(void)
> +{
> + int retval;
> +
> + retval = usb_serial_register(&navman_device);
> + if (retval)
> + return retval;
> + retval = usb_register(&navman_driver);
> + if (retval)
> + usb_serial_deregister(&navman_device);
> + return retval;
> +}
> +
> +static void __exit navman_exit(void)
> +{
> + usb_deregister(&navman_driver);
> + usb_serial_deregister(&navman_device);
> +}
> +
> +module_init(navman_init);
> +module_exit(navman_exit);
> +MODULE_LICENSE("GPL");
> +
> +module_param(debug, bool, S_IRUGO | S_IWUSR);
> +MODULE_PARM_DESC(debug, "Debug enabled or not");
>
-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-users