ā›ļø index : haiku.git

/*
 * 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_