add routines to set flow control
This commit is contained in:
parent
b3e2f30674
commit
731272c240
|
@ -154,6 +154,7 @@ static volatile struct UART_struct * const UART2 = (void *) (UART2_BASE);
|
||||||
|
|
||||||
void uart_init(volatile struct UART_struct * uart, uint32_t baud);
|
void uart_init(volatile struct UART_struct * uart, uint32_t baud);
|
||||||
void uart_setbaud(volatile struct UART_struct * uart, uint32_t baud);
|
void uart_setbaud(volatile struct UART_struct * uart, uint32_t baud);
|
||||||
|
void uart_flowctl(volatile struct UART_struct * uart, uint8_t on);
|
||||||
|
|
||||||
extern volatile uint32_t u1_head, u1_tail;
|
extern volatile uint32_t u1_head, u1_tail;
|
||||||
void uart1_putc(char c);
|
void uart1_putc(char c);
|
||||||
|
|
75
lib/uart.c
75
lib/uart.c
|
@ -40,7 +40,6 @@
|
||||||
#define CLK 24000000
|
#define CLK 24000000
|
||||||
#define DIV 16 /* uart->CON.XTIM = 0 is 16x oversample (datasheet is incorrect) */
|
#define DIV 16 /* uart->CON.XTIM = 0 is 16x oversample (datasheet is incorrect) */
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
void uart_setbaud(volatile struct UART_struct * uart, uint32_t baud) {
|
void uart_setbaud(volatile struct UART_struct * uart, uint32_t baud) {
|
||||||
uint64_t inc;
|
uint64_t inc;
|
||||||
|
|
||||||
|
@ -65,6 +64,49 @@ void uart_setbaud(volatile struct UART_struct * uart, uint32_t baud) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void uart_flowctl(volatile struct UART_struct * uart, uint8_t on) {
|
||||||
|
if (on) {
|
||||||
|
if( uart == UART1 ) {
|
||||||
|
/* CTS and RTS directions */
|
||||||
|
GPIO->PAD_DIR_SET.U1CTS = 1;
|
||||||
|
GPIO->PAD_DIR_RESET.U1RTS = 1;
|
||||||
|
/* function select to uart */
|
||||||
|
GPIO->FUNC_SEL.U1CTS = 1;
|
||||||
|
GPIO->FUNC_SEL.U1RTS = 1;
|
||||||
|
} else {
|
||||||
|
/* UART 2 */
|
||||||
|
/* CTS and RTS directions */
|
||||||
|
GPIO->PAD_DIR_SET.U2CTS = 1;
|
||||||
|
GPIO->PAD_DIR_RESET.U2RTS = 1;
|
||||||
|
/* function select to uart */
|
||||||
|
GPIO->FUNC_SEL.U2CTS = 1;
|
||||||
|
GPIO->FUNC_SEL.U2RTS = 1;
|
||||||
|
}
|
||||||
|
/* enable flow control */
|
||||||
|
uart->CONbits.FCE = 1;
|
||||||
|
} else {
|
||||||
|
/* off */
|
||||||
|
/* disable flow control */
|
||||||
|
uart->CONbits.FCE = 0;
|
||||||
|
if( uart == UART1 ) {
|
||||||
|
/* CTS and RTS to inputs */
|
||||||
|
GPIO->PAD_DIR_RESET.U1CTS = 1;
|
||||||
|
GPIO->PAD_DIR_RESET.U1RTS = 1;
|
||||||
|
/* function select to gpio */
|
||||||
|
GPIO->FUNC_SEL.U1CTS = 3;
|
||||||
|
GPIO->FUNC_SEL.U1RTS = 3;
|
||||||
|
} else {
|
||||||
|
/* UART 2 */
|
||||||
|
/* CTS and RTS to inputs */
|
||||||
|
GPIO->PAD_DIR_RESET.U2CTS = 1;
|
||||||
|
GPIO->PAD_DIR_RESET.U2RTS = 1;
|
||||||
|
/* function select to gpio */
|
||||||
|
GPIO->FUNC_SEL.U2CTS = 3;
|
||||||
|
GPIO->FUNC_SEL.U2RTS = 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void uart_init(volatile struct UART_struct * uart, uint32_t baud) {
|
void uart_init(volatile struct UART_struct * uart, uint32_t baud) {
|
||||||
/* enable the uart so we can set the gpio mode */
|
/* enable the uart so we can set the gpio mode */
|
||||||
/* see Section 11.5.1.2 Alternate Modes */
|
/* see Section 11.5.1.2 Alternate Modes */
|
||||||
|
@ -79,17 +121,13 @@ void uart_init(volatile struct UART_struct * uart, uint32_t baud) {
|
||||||
uart->TXCON = 16;
|
uart->TXCON = 16;
|
||||||
|
|
||||||
if( uart == UART1 ) {
|
if( uart == UART1 ) {
|
||||||
/* TX and CTS as outputs */
|
/* TX and RX directions */
|
||||||
GPIO->PAD_DIR_SET.GPIO_14 = 1;
|
GPIO->PAD_DIR_SET.U1TX = 1;
|
||||||
GPIO->PAD_DIR_SET.GPIO_16 = 1;
|
GPIO->PAD_DIR_RESET.U1RX = 1;
|
||||||
|
|
||||||
/* RX and RTS as inputs */
|
/* set func sel to UART */
|
||||||
GPIO->PAD_DIR_RESET.GPIO_15 = 1;
|
GPIO->FUNC_SEL.U1TX = 1;
|
||||||
GPIO->PAD_DIR_RESET.GPIO_17 = 1;
|
GPIO->FUNC_SEL.U1RX = 1;
|
||||||
|
|
||||||
/* set GPIO15-14 to UART (UART1 TX and RX)*/
|
|
||||||
GPIO->FUNC_SEL.GPIO_14 = 1;
|
|
||||||
GPIO->FUNC_SEL.GPIO_15 = 1;
|
|
||||||
|
|
||||||
u1_head = 0; u1_tail = 0;
|
u1_head = 0; u1_tail = 0;
|
||||||
|
|
||||||
|
@ -99,15 +137,14 @@ void uart_init(volatile struct UART_struct * uart, uint32_t baud) {
|
||||||
enable_irq(UART1);
|
enable_irq(UART1);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
/* do the same as above but for UART2 */
|
/* UART2 */
|
||||||
GPIO->PAD_DIR_SET.GPIO_18 = 1;
|
/* TX and RX directions */
|
||||||
GPIO->PAD_DIR_SET.GPIO_19 = 1;
|
GPIO->PAD_DIR_SET.U2TX = 1;
|
||||||
|
GPIO->PAD_DIR_RESET.U1RX = 1;
|
||||||
|
|
||||||
GPIO->PAD_DIR_RESET.GPIO_20 = 1;
|
/* set func sel to UART */
|
||||||
GPIO->PAD_DIR_RESET.GPIO_21 = 1;
|
GPIO->FUNC_SEL.U2TX = 1;
|
||||||
|
GPIO->FUNC_SEL.U2RX = 1;
|
||||||
GPIO->FUNC_SEL.GPIO_18 = 1;
|
|
||||||
GPIO->FUNC_SEL.GPIO_19 = 1;
|
|
||||||
|
|
||||||
u2_head = 0; u2_tail = 0;
|
u2_head = 0; u2_tail = 0;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue