root/src/add-ons/kernel/drivers/ports/usb_serial/Silicon.h
/*
 * Copyright 2011, Adrien Destugues <pulkomandy@pulkomandy.ath.cx>
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *              Alexander von Gluck IV, kallisti5@unixzen.com
 */
#ifndef _USB_SILICON_H_
#define _USB_SILICON_H_


#include "SerialDevice.h"


/* supported vendor and product ids */
#define VENDOR_RENESAS          0x045B
#define VENDOR_AKATOM           0x0471
#define VENDOR_PIRELLI          0x0489
#define VENDOR_CYPHERLAB        0x0745
#define VENDOR_GEMALTO          0x08E6
#define VENDOR_DIGIANSWER       0x08FD
#define VENDOR_MEI                      0x0BED
#define VENDOR_DYNASTREAM       0x0FCF
#define VENDOR_KNOCKOFF         0x10A6
#define VENDOR_SIEMENS          0x10AB
#define VENDOR_NOKIA            0x10B5
#define VENDOR_SILICON          0x10C4
#define VENDOR_SILICON2         0x10C5
#define VENDOR_SILICON3         0x10CE
#define VENDOR_BALTECH          0x13AD
#define VENDOR_OWEN                     0x1555
#define VENDOR_CLIPSAL          0x166A
#define VENDOR_JABLOTRON        0x16D6
#define VENDOR_WIENER           0x16DC
#define VENDOR_WAVESENSE        0x17F4
#define VENDOR_VAISALA          0x1843
#define VENDOR_ELV                      0x18EF
#define VENDOR_WAGO                     0x1BE3
#define VENDOR_DW700            0x413C

const usb_serial_device kSiliconDevices[] = {
        {VENDOR_RENESAS,        0x0053, "Renesas RX610 RX-Stick"},
        {VENDOR_AKATOM,         0x066A, "AKTAKOM ACE-1001"},
        {VENDOR_PIRELLI,        0xE000, "Pirelli DP-L10 GSM Mobile"},
        {VENDOR_PIRELLI,        0xE003, "Pirelli DP-L10 GSM Mobile"},
        {VENDOR_CYPHERLAB,      0x1000, "Cipherlab CCD Barcode Scanner"},
        {VENDOR_GEMALTO,        0x5501, "Gemalto contactless smartcard reader"},
        {VENDOR_DIGIANSWER,     0x000A, "Digianswer ZigBee MAC device"},
        {VENDOR_MEI,            0x1100, "MEI Acceptor"},
        {VENDOR_MEI,            0x1101, "MEI Acceptor"},
        {VENDOR_DYNASTREAM,     0x1003, "Dynastream ANT development board"},
        {VENDOR_DYNASTREAM,     0x1004, "Dynastream ANT development board"},
        {VENDOR_DYNASTREAM,     0x1006, "Dynastream ANT development board"},
        {VENDOR_KNOCKOFF,       0xAA26, "Knock-off DCU-11"},
        {VENDOR_SIEMENS,        0x10C5, "Siemens MC60"},
        {VENDOR_NOKIA,          0xAC70, "Nokia CA-42"},
        {VENDOR_BALTECH,        0x9999, "Balteck card reader"},
        {VENDOR_OWEN,           0x0004, "Owen AC4 USB-RS485 Converter"},
        {VENDOR_CLIPSAL,        0x0303, "Clipsal 5500PCU C-Bus USB interface"},
        {VENDOR_JABLOTRON,      0x0001, "Jablotron serial interface"},
        {VENDOR_WIENER,         0x0010, "W-IE-NE-R Plein & Baus GmbH device"},
        {VENDOR_WIENER,         0x0011, "W-IE-NE-R Plein & Baus GmbH device"},
        {VENDOR_WIENER,         0x0012, "W-IE-NE-R Plein & Baus GmbH device"},
        {VENDOR_WIENER,         0x0015, "W-IE-NE-R Plein & Baus GmbH device"},
        {VENDOR_WAVESENSE,      0xAAAA, "Wavesense Jazz blood glucose meter"},
        {VENDOR_VAISALA,        0x0200, "Vaisala USB instrument"},
        {VENDOR_ELV,            0xE00F, "ELV USB I²C interface"},
        {VENDOR_WAGO,           0x07A6, "WAGO 750-923 USB Service"},
        {VENDOR_DW700,          0x9500, "DW700 GPS USB interface"},
        {VENDOR_SILICON,        0x0F91, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x1101, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x1601, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x800A, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x803B, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x8044, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x804E, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x8053, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x8054, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x8066, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x806F, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x807A, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x80CA, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x80DD, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x80F6, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x8115, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x813D, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x813F, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x814A, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x814B, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x8156, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x815E, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x818B, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x819F, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x81A6, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x81AC, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x81AD, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x81C8, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x81E2, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x81E7, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x81E8, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x81F2, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x8218, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x822B, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x826B, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x8293, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x82F9, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x8341, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x8382, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x83A8, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x83D8, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x8411, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x8418, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x846E, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x8477, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x85EA, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x85EB, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x8664, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0x8665, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0xEA60, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0xEA61, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0xEA71, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0xF001, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0xF002, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0xF003, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON,        0xF004, "Silicon Labs CP210x USB UART converter"},
        {VENDOR_SILICON2,       0xEA61, "Silicon Labs GPRS USB Modem"},
        {VENDOR_SILICON3,       0xEA6A, "Silicon Labs GPRS USB Modem 100EU"}
};


class SiliconDevice : public SerialDevice {
public:
                                        SiliconDevice(usb_device device, uint16 vendorID,
                                                uint16 productID, const char *description);

virtual status_t        AddDevice(const usb_configuration_info *config);

virtual status_t        ResetDevice();

virtual status_t        SetLineCoding(usb_cdc_line_coding *coding);
virtual status_t        SetControlLineState(uint16 state);

private:
enum CP210XRequest {
        ENABLE_UART = 0,
                /* 1 to enable the UART function, 0 to disable
                 * (some Silicon Labs chips have other functions such as GPIOs) */


        SET_BAUDRATE_DIVIDER = 1,
        GET_BAUDRATE_DIVIDER = 2,
                /*
                 Baudrate base clock is 3686400

                 3686400 / 32 = 115200
                 ...
                 3686400 / 384 = 9600
                */ 

        SET_LINE_FORMAT = 3,
        GET_LINE_FORMAT = 4,
                /*
                 DataBits << 0x100 | Parity << 0x10 | StopBits

                 Databits in [5,9]
                 Parity :
                        0 = none
                        1 = odd
                        2 = even
                        3 = mark
                        4 = space
                Stop bits:
                        0 = 1 stop bit
                        1 = 1.5 stop bits
                        2 = 2 stop bits
                */

        SET_BREAK = 5,
                /* 1 to enable, 0 to disable */

        IMMEDIATE_CHAR = 6,

        SET_STATUS = 7,
        GET_STATUS = 8,
                /*
                 bit 0 = DTR
                 bit 1 = RTS

                 bit 4 = CTS
                 bit 5 = DSR
                 bit 6 = RING
                 bit 7 = DCD
                 bit 8 = WRITE_DTR (unset to not touch DTR)
                 bit 9 = WRITE_RTS (unset to not touch RTS)
                */

        SET_XON = 9,
        SET_XOFF = 10,
        SET_EVENTMASK = 11,
        GET_EVENTMASK = 12,
        SET_CHAR = 13,
        GET_CHARS = 14,
        GET_PROPS = 15,
        GET_COMM_STATUS = 16,
        RESET = 17,
        PURGE = 18,

        SET_FLOW = 19, 
        GET_FLOW = 20,
                /* Hardware flow control setup */

        EMBED_EVENTS = 21,
        GET_EVENTSTATE = 22,
        SET_CHARS = 0x19
};

private:
status_t                        WriteConfig(CP210XRequest request, uint16_t* data,
                                                size_t size);
};


#endif //_USB_SILICON_H_