1 /* 2 * Copyright 2022, Gerasim Troeglazov <3dEyes@gmail.com> 3 * Distributed under the terms of the MIT License. 4 */ 5 6 #ifndef _USB_WINCHIPHEAD_H_ 7 #define _USB_WINCHIPHEAD_H_ 8 9 #include "SerialDevice.h" 10 11 #define CH34X_DEFAULT_BAUD_RATE 9600 12 13 #define CH34X_INPUT_BUF_SIZE 8 14 15 #define CH34X_VER_20 0x20 16 #define CH34X_VER_30 0x30 17 18 #define CH34X_BPS_PRE_IMM 0x80 19 20 #define CH34X_BIT_CTS 0x01 21 #define CH34X_BIT_DSR 0x02 22 #define CH34X_BIT_RI 0x04 23 #define CH34X_BIT_DCD 0x08 24 #define CH34X_BIT_DTR 0x20 25 #define CH34X_BIT_RTS 0x40 26 #define CH34X_BITS_MODEM_STAT 0x0f 27 28 #define CH34X_MULT_STAT 0x04 29 30 #define CH34X_REQ_READ_VERSION 0x5F 31 #define CH34X_REQ_WRITE_REG 0x9A 32 #define CH34X_REQ_READ_REG 0x95 33 #define CH34X_REQ_SERIAL_INIT 0xA1 34 #define CH34X_REQ_MODEM_CTRL 0xA4 35 36 #define CH34X_REG_BREAK 0x05 37 #define CH34X_REG_STAT1 0x06 38 #define CH34X_REG_STAT2 0x07 39 #define CH34X_REG_BPS_PRE 0x12 40 #define CH34X_REG_BPS_DIV 0x13 41 #define CH34X_REG_LCR 0x18 42 #define CH34X_REG_LCR2 0x25 43 44 #define CH34X_LCR_CS5 0x00 45 #define CH34X_LCR_CS6 0x01 46 #define CH34X_LCR_CS7 0x02 47 #define CH34X_LCR_CS8 0x03 48 #define CH34X_LCR_STOP_BITS_2 0x04 49 #define CH34X_LCR_ENABLE_PAR 0x08 50 #define CH34X_LCR_PAR_EVEN 0x10 51 #define CH34X_LCR_MARK_SPACE 0x20 52 #define CH34X_LCR_ENABLE_TX 0x40 53 #define CH34X_LCR_ENABLE_RX 0x80 54 55 #define CH34X_SIO_600 0x6401 56 #define CH34X_SIO_1200 0xB201 57 #define CH34X_SIO_1800 0xCC01 58 #define CH34X_SIO_2400 0xD901 59 #define CH34X_SIO_4800 0x6402 60 #define CH34X_SIO_9600 0xB202 61 #define CH34X_SIO_19200 0xD902 62 #define CH34X_SIO_31250 0x4003 63 #define CH34X_SIO_38400 0x6403 64 #define CH34X_SIO_57600 0xF302 65 #define CH34X_SIO_115200 0xCC03 66 #define CH34X_SIO_230400 0xE603 67 68 /* supported vendor and product ids */ 69 #define VENDOR_WCH 0x4348 // WinChipHead 70 #define VENDOR_QIN_HENG 0x1a86 // QinHeng Electronics 71 #define VENDOR_GW_INSTEK 0x2184 // GW Instek 72 73 const usb_serial_device kWCHDevices[] = { 74 {VENDOR_WCH, 0x5523, "CH341 serial converter"}, 75 {VENDOR_QIN_HENG, 0x5523, "QinHeng CH341A serial converter"}, 76 {VENDOR_QIN_HENG, 0x7522, "QinHeng CH340 serial converter"}, 77 {VENDOR_QIN_HENG, 0x7523, "QinHeng CH340 serial converter"}, 78 {VENDOR_GW_INSTEK, 0x0057, "GW Instek Oscilloscope"} 79 }; 80 81 class WCHDevice : public SerialDevice { 82 public: 83 WCHDevice(usb_device device, uint16 vendorID, 84 uint16 productID, const char *description); 85 86 virtual status_t AddDevice(const usb_configuration_info *config); 87 88 virtual status_t ResetDevice(); 89 90 virtual status_t SetLineCoding(usb_cdc_line_coding *coding); 91 virtual status_t SetControlLineState(uint16 state); 92 93 private: 94 status_t WriteConfig(uint16 dataRate, uint8 lcr, uint8 mcr); 95 96 uint8 fChipVersion; 97 uint8 fStatusMCR; 98 uint8 fStatusLCR; 99 uint16 fDataRate; 100 }; 101 102 103 #endif //_USB_WINCHIPHEAD_H_ 104