* Copyright 2022, Gerasim Troeglazov <3dEyes@gmail.com>
* Distributed under the terms of the MIT License.
*/
#ifndef _USB_WINCHIPHEAD_H_
#define _USB_WINCHIPHEAD_H_
#include "SerialDevice.h"
#define CH34X_DEFAULT_BAUD_RATE 9600
#define CH34X_INPUT_BUF_SIZE 8
#define CH34X_VER_20 0x20
#define CH34X_VER_30 0x30
#define CH34X_BPS_PRE_IMM 0x80
#define CH34X_BIT_CTS 0x01
#define CH34X_BIT_DSR 0x02
#define CH34X_BIT_RI 0x04
#define CH34X_BIT_DCD 0x08
#define CH34X_BIT_DTR 0x20
#define CH34X_BIT_RTS 0x40
#define CH34X_BITS_MODEM_STAT 0x0f
#define CH34X_MULT_STAT 0x04
#define CH34X_REQ_READ_VERSION 0x5F
#define CH34X_REQ_WRITE_REG 0x9A
#define CH34X_REQ_READ_REG 0x95
#define CH34X_REQ_SERIAL_INIT 0xA1
#define CH34X_REQ_MODEM_CTRL 0xA4
#define CH34X_REG_BREAK 0x05
#define CH34X_REG_STAT1 0x06
#define CH34X_REG_STAT2 0x07
#define CH34X_REG_BPS_PRE 0x12
#define CH34X_REG_BPS_DIV 0x13
#define CH34X_REG_LCR 0x18
#define CH34X_REG_LCR2 0x25
#define CH34X_LCR_CS5 0x00
#define CH34X_LCR_CS6 0x01
#define CH34X_LCR_CS7 0x02
#define CH34X_LCR_CS8 0x03
#define CH34X_LCR_STOP_BITS_2 0x04
#define CH34X_LCR_ENABLE_PAR 0x08
#define CH34X_LCR_PAR_EVEN 0x10
#define CH34X_LCR_MARK_SPACE 0x20
#define CH34X_LCR_ENABLE_TX 0x40
#define CH34X_LCR_ENABLE_RX 0x80
#define CH34X_SIO_600 0x6401
#define CH34X_SIO_1200 0xB201
#define CH34X_SIO_1800 0xCC01
#define CH34X_SIO_2400 0xD901
#define CH34X_SIO_4800 0x6402
#define CH34X_SIO_9600 0xB202
#define CH34X_SIO_19200 0xD902
#define CH34X_SIO_31250 0x4003
#define CH34X_SIO_38400 0x6403
#define CH34X_SIO_57600 0xF302
#define CH34X_SIO_115200 0xCC03
#define CH34X_SIO_230400 0xE603
#define VENDOR_WCH 0x4348 // WinChipHead
#define VENDOR_QIN_HENG 0x1a86 // QinHeng Electronics
#define VENDOR_GW_INSTEK 0x2184 // GW Instek
const usb_serial_device kWCHDevices[] = {
{VENDOR_WCH, 0x5523, "CH341 serial converter"},
{VENDOR_QIN_HENG, 0x5523, "QinHeng CH341A serial converter"},
{VENDOR_QIN_HENG, 0x7522, "QinHeng CH340 serial converter"},
{VENDOR_QIN_HENG, 0x7523, "QinHeng CH340 serial converter"},
{VENDOR_GW_INSTEK, 0x0057, "GW Instek Oscilloscope"}
};
class WCHDevice : public SerialDevice {
public:
WCHDevice(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:
status_t WriteConfig(uint16 dataRate, uint8 lcr, uint8 mcr);
uint8 fChipVersion;
uint8 fStatusMCR;
uint8 fStatusLCR;
uint16 fDataRate;
};
#endif