make CFG_TUH_CDC_LINE_CODING_ON_ENUM optional for ch34x
This commit is contained in:
@@ -85,13 +85,17 @@ void tuh_cdc_mount_cb(uint8_t idx) {
|
|||||||
itf_info.desc.bInterfaceNumber);
|
itf_info.desc.bInterfaceNumber);
|
||||||
|
|
||||||
#ifdef CFG_TUH_CDC_LINE_CODING_ON_ENUM
|
#ifdef CFG_TUH_CDC_LINE_CODING_ON_ENUM
|
||||||
// CFG_TUH_CDC_LINE_CODING_ON_ENUM must be defined for line coding is set by tinyusb in enumeration
|
// If CFG_TUH_CDC_LINE_CODING_ON_ENUM is defined, line coding will be set by tinyusb stack
|
||||||
// otherwise you need to call tuh_cdc_set_line_coding() first
|
// while eneumerating new cdc device
|
||||||
cdc_line_coding_t line_coding = {0};
|
cdc_line_coding_t line_coding = {0};
|
||||||
if (tuh_cdc_get_local_line_coding(idx, &line_coding)) {
|
if (tuh_cdc_get_local_line_coding(idx, &line_coding)) {
|
||||||
printf(" Baudrate: %lu, Stop Bits : %u\r\n", line_coding.bit_rate, line_coding.stop_bits);
|
printf(" Baudrate: %lu, Stop Bits : %u\r\n", line_coding.bit_rate, line_coding.stop_bits);
|
||||||
printf(" Parity : %u, Data Width: %u\r\n", line_coding.parity, line_coding.data_bits);
|
printf(" Parity : %u, Data Width: %u\r\n", line_coding.parity, line_coding.data_bits);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
// Set Line Coding upon mounted
|
||||||
|
cdc_line_coding_t new_line_coding = { 115200, CDC_LINE_CODING_STOP_BITS_1, CDC_LINE_CODING_PARITY_NONE, 8 };
|
||||||
|
tuh_cdc_set_line_coding(idx, &new_line_coding, NULL, 0);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1510,10 +1510,11 @@ static void ch34x_process_config(tuh_xfer_t* xfer) {
|
|||||||
uint8_t const idx = tuh_cdc_itf_get_index(xfer->daddr, itf_num);
|
uint8_t const idx = tuh_cdc_itf_get_index(xfer->daddr, itf_num);
|
||||||
cdch_interface_t* p_cdc = get_itf(idx);
|
cdch_interface_t* p_cdc = get_itf(idx);
|
||||||
uintptr_t const state = xfer->user_data;
|
uintptr_t const state = xfer->user_data;
|
||||||
cdc_line_coding_t const line_coding = CFG_TUH_CDC_LINE_CODING_ON_ENUM_CH34X;
|
|
||||||
uint8_t buffer[2]; // TODO remove
|
uint8_t buffer[2]; // TODO remove
|
||||||
TU_ASSERT (p_cdc,);
|
TU_ASSERT (p_cdc,);
|
||||||
|
|
||||||
|
// TODO check xfer->result
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case CONFIG_CH34X_READ_VERSION:
|
case CONFIG_CH34X_READ_VERSION:
|
||||||
TU_LOG_DRV("[%u] CDCh CH34x attempt to read Chip Version\r\n", p_cdc->daddr);
|
TU_LOG_DRV("[%u] CDCh CH34x attempt to read Chip Version\r\n", p_cdc->daddr);
|
||||||
@@ -1527,20 +1528,28 @@ static void ch34x_process_config(tuh_xfer_t* xfer) {
|
|||||||
// only versions >= 0x30 are tested, below 0x30 seems having other programming, see drivers from WCH vendor, Linux kernel and FreeBSD
|
// only versions >= 0x30 are tested, below 0x30 seems having other programming, see drivers from WCH vendor, Linux kernel and FreeBSD
|
||||||
TU_ASSERT (version >= 0x30,);
|
TU_ASSERT (version >= 0x30,);
|
||||||
|
|
||||||
|
#ifdef CFG_TUH_CDC_LINE_CODING_ON_ENUM
|
||||||
|
cdc_line_coding_t const line_coding = CFG_TUH_CDC_LINE_CODING_ON_ENUM;
|
||||||
|
uint8_t const lcr = ch34x_get_lcr(line_coding.stop_bits, line_coding.parity, line_coding.data_bits);
|
||||||
|
uint16_t const first_arg = tu_u16(lcr, 0x9c);
|
||||||
uint16_t const div_ps = ch34x_get_divisor_prescaler(line_coding.bit_rate);
|
uint16_t const div_ps = ch34x_get_divisor_prescaler(line_coding.bit_rate);
|
||||||
TU_ASSERT(div_ps != 0, );
|
TU_ASSERT(div_ps != 0, );
|
||||||
|
#else
|
||||||
uint8_t const lcr = ch34x_get_lcr(line_coding.stop_bits, line_coding.parity, line_coding.data_bits);
|
uint16_t const first_arg = 0;
|
||||||
|
uint16_t const div_ps = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Init CH34x with line coding
|
// Init CH34x with line coding
|
||||||
TU_ASSERT (ch34x_control_out(p_cdc, CH34X_REQ_SERIAL_INIT, tu_u16(lcr, 0x9c), div_ps,
|
TU_ASSERT (ch34x_control_out(p_cdc, CH34X_REQ_SERIAL_INIT, first_arg, div_ps,
|
||||||
ch34x_process_config, CONFIG_CH34X_SPECIAL_REG_WRITE),);
|
ch34x_process_config, CONFIG_CH34X_SPECIAL_REG_WRITE),);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case CONFIG_CH34X_SPECIAL_REG_WRITE:
|
case CONFIG_CH34X_SPECIAL_REG_WRITE:
|
||||||
// do special reg write, purpose unknown, overtaken from WCH driver
|
// do special reg write, purpose unknown, overtaken from WCH driver
|
||||||
p_cdc->line_coding = line_coding;
|
#ifdef CFG_TUH_CDC_LINE_CODING_ON_ENUM
|
||||||
|
p_cdc->line_coding = ((cdc_line_coding_t) CFG_TUH_CDC_LINE_CODING_ON_ENUM);
|
||||||
|
#endif
|
||||||
TU_ASSERT (ch34x_write_reg(p_cdc, 0x0f2c, 0x0007, ch34x_process_config, CONFIG_CH34X_FLOW_CONTROL),);
|
TU_ASSERT (ch34x_write_reg(p_cdc, 0x0f2c, 0x0007, ch34x_process_config, CONFIG_CH34X_FLOW_CONTROL),);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@@ -27,21 +27,11 @@
|
|||||||
#ifndef _CH34X_H_
|
#ifndef _CH34X_H_
|
||||||
#define _CH34X_H_
|
#define _CH34X_H_
|
||||||
|
|
||||||
// For simplicity, only the name CH34X is used here,
|
// There is no official documentation for the CH34x (CH340, CH341) chips. Reference can be found
|
||||||
// but specifically only CH340 and CH341 are supported.
|
|
||||||
|
|
||||||
// There is no official documentation for the CH34x chips. Reference can be found
|
|
||||||
// - https://github.com/WCHSoftGroup/ch341ser_linux
|
// - https://github.com/WCHSoftGroup/ch341ser_linux
|
||||||
// - https://github.com/torvalds/linux/blob/master/drivers/usb/serial/ch341.c
|
// - https://github.com/torvalds/linux/blob/master/drivers/usb/serial/ch341.c
|
||||||
// - https://github.com/freebsd/freebsd-src/blob/main/sys/dev/usb/serial/uchcom.c
|
// - https://github.com/freebsd/freebsd-src/blob/main/sys/dev/usb/serial/uchcom.c
|
||||||
|
|
||||||
// set line_coding @ enumeration
|
|
||||||
#ifdef CFG_TUH_CDC_LINE_CODING_ON_ENUM
|
|
||||||
#define CFG_TUH_CDC_LINE_CODING_ON_ENUM_CH34X CFG_TUH_CDC_LINE_CODING_ON_ENUM
|
|
||||||
#else // this default is necessary to work properly
|
|
||||||
#define CFG_TUH_CDC_LINE_CODING_ON_ENUM_CH34X { 9600, CDC_LINE_CONDING_STOP_BITS_1, CDC_LINE_CODING_PARITY_NONE, 8 }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// USB requests
|
// USB requests
|
||||||
#define CH34X_REQ_READ_VERSION 0x5F // dec 95
|
#define CH34X_REQ_READ_VERSION 0x5F // dec 95
|
||||||
#define CH34X_REQ_WRITE_REG 0x9A // dec 154
|
#define CH34X_REQ_WRITE_REG 0x9A // dec 154
|
||||||
|
Reference in New Issue
Block a user