diff --git a/CMakeLists.txt b/CMakeLists.txt index 72c2301..7794adf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,4 +25,8 @@ if(FLOW_CONTROL) target_compile_definitions(uart_bridge PUBLIC FLOW_CONTROL=1) endif() +if(LINE_CONTROL) +target_compile_definitions(uart_bridge PUBLIC LINE_CONTROL=1) +endif() + pico_add_extra_outputs(uart_bridge) diff --git a/README.md b/README.md index c3c5436..e4fae4e 100644 --- a/README.md +++ b/README.md @@ -11,23 +11,45 @@ This software is provided without warranty, according to the MIT License, and sh Raspberry Pi Pico Pinout ------------------------ +UART0: | Raspberry Pi Pico GPIO | Function | |:----------------------:|:---------:| -| GPIO0 (Pin 1) | UART0 TX | -| GPIO1 (Pin 2) | UART0 RX | -| GPIO2 (Pin 4) | UART0 CTS | -| GPIO3 (Pin 5) | UART0 RTS | -| GPIO4 (Pin 6) | UART1 TX | -| GPIO5 (Pin 7) | UART1 RX | -| GPIO6 (Pin 9) | UART1 CTS | -| GPIO7 (Pin 10) | UART1 RTS | +| GPIO0 (Pin 1) | TX | +| GPIO1 (Pin 2) | RX | +| GPIO2 (Pin 4) | CTS | +| GPIO3 (Pin 5) | RTS | +| GPIO4 (Pin 6) | DTR | +| GPIO5 (Pin 7) | DSR | -Optional Hardware Flow-control +UART1: +| Raspberry Pi Pico GPIO | Function | +|:----------------------:|:---------:| +| GPIO8 (Pin 11) | TX | +| GPIO9 (Pin 12) | RX | +| GPIO10 (Pin 14) | CTS | +| GPIO11 (Pin 15) | RTS | +| GPIO12 (Pin 16) | DTR | +| GPIO13 (Pin 17) | DSR | + +Optional Hardware Flow and Line control ------------------------------ -Hardware Flow-control is disabled by default, but can be compiled in by running: +Hardware Flow-control (RTS/CTS) is disabled by default, but can be compiled in by running: ``` bash cmake -DFLOW_CONTROL . make ``` + +Line control (DTR/DSR) is disabled by default, but can be compiled in by running: + +``` bash +cmake -DLINE_CONTROL . +make +``` + +To enable both: +``` bash +cmake -DLINE_CONTROL -DFLOW_CONTROL . +make +``` diff --git a/uart-bridge.c b/uart-bridge.c index a472299..913188e 100644 --- a/uart-bridge.c +++ b/uart-bridge.c @@ -32,6 +32,10 @@ typedef struct { uint8_t rts_pin; uint8_t cts_pin; #endif +#ifdef LINE_CONTROL + uint8_t dtr_pin; + uint8_t dsr_pin; +#endif } uart_id_t; typedef struct { @@ -54,14 +58,22 @@ const uart_id_t UART_ID[CFG_TUD_CDC] = { #ifdef FLOW_CONTROL .cts_pin = 2, .rts_pin = 3, +#endif +#ifdef LINE_CONTROL + .dtr_pin = 4, + .dsr_pin = 5, #endif }, { .inst = uart1, - .tx_pin = 4, - .rx_pin = 5, + .tx_pin = 8, + .rx_pin = 9, #ifdef FLOW_CONTROL - .cts_pin = 6, - .rts_pin = 7, + .cts_pin = 10, + .rts_pin = 11, +#endif +#ifdef LINE_CONTROL + .dtr_pin = 12, + .dsr_pin = 13, #endif } }; @@ -250,6 +262,13 @@ void init_uart_data(uint8_t itf) { gpio_set_function(ui->cts_pin, GPIO_FUNC_UART); #endif +#ifdef LINE_CONTROL + gpio_init(ui->dtr_pin); + gpio_set_dir(ui->dtr_pin, GPIO_OUT); + gpio_init(ui->dsr_pin); + gpio_set_dir(ui->dsr_pin, GPIO_IN); +#endif + /* USB CDC LC */ ud->usb_lc.bit_rate = DEF_BIT_RATE; ud->usb_lc.data_bits = DEF_DATA_BITS; @@ -283,6 +302,16 @@ void init_uart_data(uint8_t itf) { parity_usb2uart(ud->usb_lc.parity)); } +#ifdef LINE_CONTROL +/* Invoked when line state has changed */ +void tud_cdc_line_state_cb(uint8_t itf, bool dtr, bool rts) +{ + const uart_id_t *ui = &UART_ID[itf]; + + gpio_put(ui->dtr_pin, dtr); +} +#endif + int main(void) { int itf;