lkml.org 
[lkml]   [2009]   [Aug]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    SubjectRe: [PATCH] [RFC] ark3116: add IrDA support (for Gembird UIR-22)
    Date
    On Monday 27 July 2009 12:15:15 Alan Cox wrote:
    > > The next step was usbsnoop to find what windows driver does with the
    > > device. The result is the patch below. Now the device works after
    > > plugging and running "irattach /dev/ttyUSB0 -s".
    > >
    > > But how to make it appear as a real IrDA device by itself? Another
    > > problem is mixing IrDA with USB serial driver. Is a separate driver
    > > (something like ark3116-irda) needed?
    >
    > For standard devices using serial/tty then irattach is the right way to
    > do it. Nothing else should be needed.
    >
    > > + irda = le16_to_cpu(serial->dev->descriptor.idProduct) == 0x3118;
    > > + if (irda)
    > > + dbg("IrDA mode");
    > > +
    >
    > I would split this out into
    >
    > static int is_irda(serial) { }
    >
    > just so that anyone who needs to add more irda adapters can find it
    > easily and do so neatly.

    Something like this?



    Add IrDA support to ark3116 driver. This makes Gembird UIR-22 USB to
    IrDA adapter work (vendor ID 0x18ec, device ID 0x3118). This adapter
    contains ARK3116T USB serial chip and an IrDA transceiver, thus
    a command like "irattach /dev/ttyUSB0 -s" is needed.

    All magic numbers were captured using usbsnoop from windows driver
    that came with the device.


    Signed-off-by: Ondrej Zary <linux@rainbow-software.org>

    --- linux-2.6.30-orig/drivers/usb/serial/ark3116.c 2009-07-19 19:21:54.000000000 +0200
    +++ linux/drivers/usb/serial/ark3116.c 2009-08-01 22:04:48.000000000 +0200
    @@ -31,10 +31,20 @@

    static struct usb_device_id id_table [] = {
    { USB_DEVICE(0x6547, 0x0232) },
    + { USB_DEVICE(0x18ec, 0x3118) }, /* USB to IrDA adapter */
    { },
    };
    MODULE_DEVICE_TABLE(usb, id_table);

    +static int is_irda(struct usb_serial *serial)
    +{
    + struct usb_device *dev = serial->dev;
    + if (le16_to_cpu(dev->descriptor.idVendor) == 0x18ec &&
    + le16_to_cpu(dev->descriptor.idProduct) == 0x3118)
    + return 1;
    + return 0;
    +}
    +
    struct ark3116_private {
    spinlock_t lock;
    u8 termios_initialized;
    @@ -100,11 +110,21 @@
    goto cleanup;
    }

    + if (is_irda(serial))
    + dbg("IrDA mode");
    +
    /* 3 */
    ARK3116_SND(serial, 3, 0xFE, 0x40, 0x0008, 0x0002);
    ARK3116_SND(serial, 4, 0xFE, 0x40, 0x0008, 0x0001);
    ARK3116_SND(serial, 5, 0xFE, 0x40, 0x0000, 0x0008);
    - ARK3116_SND(serial, 6, 0xFE, 0x40, 0x0000, 0x000B);
    + ARK3116_SND(serial, 6, 0xFE, 0x40, is_irda(serial) ? 0x0001 : 0x0000,
    + 0x000B);
    +
    + if (is_irda(serial)) {
    + ARK3116_SND(serial, 1001, 0xFE, 0x40, 0x0000, 0x000C);
    + ARK3116_SND(serial, 1002, 0xFE, 0x40, 0x0041, 0x000D);
    + ARK3116_SND(serial, 1003, 0xFE, 0x40, 0x0001, 0x000A);
    + }

    /* <-- seq7 */
    ARK3116_RCV(serial, 7, 0xFE, 0xC0, 0x0000, 0x0003, 0x00, buf);
    @@ -141,6 +161,8 @@
    ARK3116_SND(serial, 147, 0xFE, 0x40, 0x0083, 0x0003);
    ARK3116_SND(serial, 148, 0xFE, 0x40, 0x0038, 0x0000);
    ARK3116_SND(serial, 149, 0xFE, 0x40, 0x0001, 0x0001);
    + if (is_irda(serial))
    + ARK3116_SND(serial, 1004, 0xFE, 0x40, 0x0000, 0x0009);
    ARK3116_SND(serial, 150, 0xFE, 0x40, 0x0003, 0x0003);
    ARK3116_RCV(serial, 151, 0xFE, 0xC0, 0x0000, 0x0004, 0x03, buf);
    ARK3116_SND(serial, 152, 0xFE, 0x40, 0x0000, 0x0003);


    --
    Ondrej Zary


    \
     
     \ /
      Last update: 2009-08-01 22:39    [from the cache]
    ©2003-2014 Jasper Spaans. hosted at Digital Ocean