Add hardware flow-control

This commit is contained in:
narvalotech 2022-04-28 09:29:32 +02:00 committed by Jonathan Rico
parent 05e4815f6b
commit e729db5942
3 changed files with 46 additions and 6 deletions

View file

@ -2,6 +2,8 @@
cmake_minimum_required(VERSION 3.13) cmake_minimum_required(VERSION 3.13)
option(FLOW_CONTROL "Enable Hardware Flow-control on the UARTs" FALSE)
include(pico-sdk/pico_sdk_init.cmake) include(pico-sdk/pico_sdk_init.cmake)
project(pico_uart_bridge) project(pico_uart_bridge)
@ -19,4 +21,8 @@ target_link_libraries(uart_bridge
pico_stdlib pico_stdlib
tinyusb_device) tinyusb_device)
if(FLOW_CONTROL)
target_compile_definitions(uart_bridge PUBLIC FLOW_CONTROL=1)
endif()
pico_add_extra_outputs(uart_bridge) pico_add_extra_outputs(uart_bridge)

View file

@ -11,9 +11,23 @@ This software is provided without warranty, according to the MIT License, and sh
Raspberry Pi Pico Pinout Raspberry Pi Pico Pinout
------------------------ ------------------------
| Raspberry Pi Pico GPIO | Function | | Raspberry Pi Pico GPIO | Function |
|:----------------------:|:--------:| |:----------------------:|:---------:|
| GPIO0 (Pin 1) | UART0 TX | | GPIO0 (Pin 1) | UART0 TX |
| GPIO1 (Pin 2) | UART0 RX | | GPIO1 (Pin 2) | UART0 RX |
| GPIO4 (Pin 6) | UART1 TX | | GPIO2 (Pin 4) | UART0 CTS |
| GPIO5 (Pin 7) | UART1 RX | | 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
```

View file

@ -28,6 +28,10 @@ typedef struct {
uart_inst_t *const inst; uart_inst_t *const inst;
uint8_t tx_pin; uint8_t tx_pin;
uint8_t rx_pin; uint8_t rx_pin;
#ifdef FLOW_CONTROL
uint8_t rts_pin;
uint8_t cts_pin;
#endif
} uart_id_t; } uart_id_t;
typedef struct { typedef struct {
@ -47,10 +51,18 @@ const uart_id_t UART_ID[CFG_TUD_CDC] = {
.inst = uart0, .inst = uart0,
.tx_pin = 0, .tx_pin = 0,
.rx_pin = 1, .rx_pin = 1,
#ifdef FLOW_CONTROL
.cts_pin = 2,
.rts_pin = 3,
#endif
}, { }, {
.inst = uart1, .inst = uart1,
.tx_pin = 4, .tx_pin = 4,
.rx_pin = 5, .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 */ /* Pinmux */
gpio_set_function(ui->tx_pin, GPIO_FUNC_UART); gpio_set_function(ui->tx_pin, GPIO_FUNC_UART);
gpio_set_function(ui->rx_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 */ /* USB CDC LC */
ud->usb_lc.bit_rate = DEF_BIT_RATE; ud->usb_lc.bit_rate = DEF_BIT_RATE;
@ -257,7 +273,11 @@ void init_uart_data(uint8_t itf) {
/* UART start */ /* UART start */
uart_init(ui->inst, ud->usb_lc.bit_rate); 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); uart_set_hw_flow(ui->inst, false, false);
#endif
uart_set_format(ui->inst, databits_usb2uart(ud->usb_lc.data_bits), uart_set_format(ui->inst, databits_usb2uart(ud->usb_lc.data_bits),
stopbits_usb2uart(ud->usb_lc.stop_bits), stopbits_usb2uart(ud->usb_lc.stop_bits),
parity_usb2uart(ud->usb_lc.parity)); parity_usb2uart(ud->usb_lc.parity));