From e729db5942f8853a08a1b8ef22703b7e83a8af44 Mon Sep 17 00:00:00 2001 From: narvalotech Date: Thu, 28 Apr 2022 09:29:32 +0200 Subject: [PATCH] Add hardware flow-control --- CMakeLists.txt | 6 ++++++ README.md | 26 ++++++++++++++++++++------ uart-bridge.c | 20 ++++++++++++++++++++ 3 files changed, 46 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index eda4f18..72c2301 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,6 +2,8 @@ cmake_minimum_required(VERSION 3.13) +option(FLOW_CONTROL "Enable Hardware Flow-control on the UARTs" FALSE) + include(pico-sdk/pico_sdk_init.cmake) project(pico_uart_bridge) @@ -19,4 +21,8 @@ target_link_libraries(uart_bridge pico_stdlib tinyusb_device) +if(FLOW_CONTROL) +target_compile_definitions(uart_bridge PUBLIC FLOW_CONTROL=1) +endif() + pico_add_extra_outputs(uart_bridge) diff --git a/README.md b/README.md index c6a3967..c3c5436 100644 --- a/README.md +++ b/README.md @@ -11,9 +11,23 @@ This software is provided without warranty, according to the MIT License, and sh Raspberry Pi Pico Pinout ------------------------ -| Raspberry Pi Pico GPIO | Function | -|:----------------------:|:--------:| -| GPIO0 (Pin 1) | UART0 TX | -| GPIO1 (Pin 2) | UART0 RX | -| GPIO4 (Pin 6) | UART1 TX | -| GPIO5 (Pin 7) | UART1 RX | +| 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 | + +Optional Hardware Flow-control +------------------------------ + +Hardware Flow-control is disabled by default, but can be compiled in by running: + +``` bash +cmake -DFLOW_CONTROL . +make +``` diff --git a/uart-bridge.c b/uart-bridge.c index aebbdf6..a472299 100644 --- a/uart-bridge.c +++ b/uart-bridge.c @@ -28,6 +28,10 @@ typedef struct { uart_inst_t *const inst; uint8_t tx_pin; uint8_t rx_pin; +#ifdef FLOW_CONTROL + uint8_t rts_pin; + uint8_t cts_pin; +#endif } uart_id_t; typedef struct { @@ -47,10 +51,18 @@ const uart_id_t UART_ID[CFG_TUD_CDC] = { .inst = uart0, .tx_pin = 0, .rx_pin = 1, +#ifdef FLOW_CONTROL + .cts_pin = 2, + .rts_pin = 3, +#endif }, { .inst = uart1, .tx_pin = 4, .rx_pin = 5, +#ifdef FLOW_CONTROL + .cts_pin = 6, + .rts_pin = 7, +#endif } }; @@ -233,6 +245,10 @@ void init_uart_data(uint8_t itf) { /* Pinmux */ gpio_set_function(ui->tx_pin, GPIO_FUNC_UART); gpio_set_function(ui->rx_pin, GPIO_FUNC_UART); +#ifdef FLOW_CONTROL + gpio_set_function(ui->rts_pin, GPIO_FUNC_UART); + gpio_set_function(ui->cts_pin, GPIO_FUNC_UART); +#endif /* USB CDC LC */ ud->usb_lc.bit_rate = DEF_BIT_RATE; @@ -257,7 +273,11 @@ void init_uart_data(uint8_t itf) { /* UART start */ uart_init(ui->inst, ud->usb_lc.bit_rate); +#ifdef FLOW_CONTROL + uart_set_hw_flow(ui->inst, true, true); +#else uart_set_hw_flow(ui->inst, false, false); +#endif uart_set_format(ui->inst, databits_usb2uart(ud->usb_lc.data_bits), stopbits_usb2uart(ud->usb_lc.stop_bits), parity_usb2uart(ud->usb_lc.parity));