Forked.
Fork of mbed-dev by
Revision 116:983bd476082e, committed 2016-04-26
- Comitter:
- mbed_official
- Date:
- Tue Apr 26 19:30:12 2016 +0100
- Parent:
- 115:33c68e1b9487
- Child:
- 117:24bb08393888
- Commit message:
- Synchronized with git revision 0b67bf08c8c2ce634f489a85e1c044812034bca2
Full URL: https://github.com/mbedmicro/mbed/commit/0b67bf08c8c2ce634f489a85e1c044812034bca2/
Our UART doesn't have the ability to send a break, so we make the TX a GPIO and drive it low during the break_set() and then release it back to the UART in the break_clear().
Changed in this revision
--- a/targets/hal/TARGET_Maxim/TARGET_MAX32600/serial_api.c Tue Apr 26 17:30:10 2016 +0100 +++ b/targets/hal/TARGET_Maxim/TARGET_MAX32600/serial_api.c Tue Apr 26 19:30:12 2016 +0100 @@ -35,7 +35,9 @@ #include "mbed_assert.h" #include "cmsis.h" #include "serial_api.h" +#include "gpio_api.h" #include "uart_regs.h" +#include "ioman_regs.h" #include "PeripheralPins.h" #define UART_NUM 2 @@ -290,24 +292,77 @@ obj->uart->ctrl |= (MXC_F_UART_CTRL_TX_FIFO_FLUSH | MXC_F_UART_CTRL_RX_FIFO_FLUSH ); } - //****************************************************************************** void serial_break_set(serial_t *obj) { // Make sure that nothing is being sent - while(obj->uart->status & MXC_F_UART_STATUS_RX_BUSY) {} + while (!(obj->uart->status & MXC_F_UART_STATUS_TX_FIFO_EMPTY)); + while (obj->uart->status & MXC_F_UART_STATUS_TX_BUSY); - // Disable the clock to pause any transmission - obj->uart->ctrl &= ~MXC_F_UART_CTRL_BAUD_CLK_EN ; + // Configure the GPIO to outpu 0 + gpio_t tx_gpio; + switch (((UARTName)(obj->uart))) { + case UART_0: + gpio_init_out(&tx_gpio, UART0_TX); + break; + case UART_1: + gpio_init_out(&tx_gpio, UART1_TX); + break; + default: + gpio_init_out(&tx_gpio, (PinName)NC); + break; + } + + gpio_write(&tx_gpio, 0); + + // GPIO is setup now, but we need to maps gpio to the pin + switch (((UARTName)(obj->uart))) { + case UART_0: + MXC_IOMAN->uart0_req &= ~MXC_F_IOMAN_UART_CORE_IO; + MBED_ASSERT((MXC_IOMAN->uart0_ack & (MXC_F_IOMAN_UART_CORE_IO | MXC_F_IOMAN_UART_CORE_IO)) == 0); + break; + case UART_1: + MXC_IOMAN->uart1_req &= ~MXC_F_IOMAN_UART_CORE_IO; + MBED_ASSERT((MXC_IOMAN->uart1_ack & (MXC_F_IOMAN_UART_CORE_IO | MXC_F_IOMAN_UART_CORE_IO)) == 0); + break; + default: + break; + } } //****************************************************************************** void serial_break_clear(serial_t *obj) { - obj->uart->ctrl |= MXC_F_UART_CTRL_BAUD_CLK_EN; + // Configure the GPIO to output 1 + gpio_t tx_gpio; + switch (((UARTName)(obj->uart))) { + case UART_0: + gpio_init_out(&tx_gpio, UART0_TX); + break; + case UART_1: + gpio_init_out(&tx_gpio, UART1_TX); + break; + default: + gpio_init_out(&tx_gpio, (PinName)NC); + break; + } + + gpio_write(&tx_gpio, 1); + + // Renable UART + switch (((UARTName)(obj->uart))) { + case UART_0: + serial_pinout_tx(UART0_TX); + break; + case UART_1: + serial_pinout_tx(UART1_TX); + break; + default: + serial_pinout_tx((PinName)NC); + break; + } } - //****************************************************************************** void serial_pinout_tx(PinName tx) {
--- a/targets/hal/TARGET_Maxim/TARGET_MAX32610/TARGET_MAXWSNENV/PinNames.h Tue Apr 26 17:30:10 2016 +0100 +++ b/targets/hal/TARGET_Maxim/TARGET_MAX32610/TARGET_MAXWSNENV/PinNames.h Tue Apr 26 19:30:12 2016 +0100 @@ -130,11 +130,16 @@ SW1 = P1_5, // UART Pins - USBTX = P1_3, - USBRX = P1_2, + UART0_RX = P1_0, + UART0_TX = P1_1, + UART1_RX = P1_2, + UART1_TX = P1_3, + USBTX = UART1_TX, + USBRX = UART1_RX, STDIO_UART_TX = USBTX, STDIO_UART_RX = USBRX, + // I2C Pins I2C_SCL = P0_5, I2C_SDA = P0_4,
--- a/targets/hal/TARGET_Maxim/TARGET_MAX32610/serial_api.c Tue Apr 26 17:30:10 2016 +0100 +++ b/targets/hal/TARGET_Maxim/TARGET_MAX32610/serial_api.c Tue Apr 26 19:30:12 2016 +0100 @@ -35,7 +35,9 @@ #include "mbed_assert.h" #include "cmsis.h" #include "serial_api.h" +#include "gpio_api.h" #include "uart_regs.h" +#include "ioman_regs.h" #include "PeripheralPins.h" #define UART_NUM 2 @@ -290,24 +292,77 @@ obj->uart->ctrl |= (MXC_F_UART_CTRL_TX_FIFO_FLUSH | MXC_F_UART_CTRL_RX_FIFO_FLUSH ); } - //****************************************************************************** void serial_break_set(serial_t *obj) { // Make sure that nothing is being sent - while(obj->uart->status & MXC_F_UART_STATUS_RX_BUSY) {} + while (!(obj->uart->status & MXC_F_UART_STATUS_TX_FIFO_EMPTY)); + while (obj->uart->status & MXC_F_UART_STATUS_TX_BUSY); - // Disable the clock to pause any transmission - obj->uart->ctrl &= ~MXC_F_UART_CTRL_BAUD_CLK_EN ; + // Configure the GPIO to outpu 0 + gpio_t tx_gpio; + switch (((UARTName)(obj->uart))) { + case UART_0: + gpio_init_out(&tx_gpio, UART0_TX); + break; + case UART_1: + gpio_init_out(&tx_gpio, UART1_TX); + break; + default: + gpio_init_out(&tx_gpio, (PinName)NC); + break; + } + + gpio_write(&tx_gpio, 0); + + // GPIO is setup now, but we need to maps gpio to the pin + switch (((UARTName)(obj->uart))) { + case UART_0: + MXC_IOMAN->uart0_req &= ~MXC_F_IOMAN_UART_CORE_IO; + MBED_ASSERT((MXC_IOMAN->uart0_ack & (MXC_F_IOMAN_UART_CORE_IO | MXC_F_IOMAN_UART_CORE_IO)) == 0); + break; + case UART_1: + MXC_IOMAN->uart1_req &= ~MXC_F_IOMAN_UART_CORE_IO; + MBED_ASSERT((MXC_IOMAN->uart1_ack & (MXC_F_IOMAN_UART_CORE_IO | MXC_F_IOMAN_UART_CORE_IO)) == 0); + break; + default: + break; + } } //****************************************************************************** void serial_break_clear(serial_t *obj) { - obj->uart->ctrl |= MXC_F_UART_CTRL_BAUD_CLK_EN; + // Configure the GPIO to output 1 + gpio_t tx_gpio; + switch (((UARTName)(obj->uart))) { + case UART_0: + gpio_init_out(&tx_gpio, UART0_TX); + break; + case UART_1: + gpio_init_out(&tx_gpio, UART1_TX); + break; + default: + gpio_init_out(&tx_gpio, (PinName)NC); + break; + } + + gpio_write(&tx_gpio, 1); + + // Renable UART + switch (((UARTName)(obj->uart))) { + case UART_0: + serial_pinout_tx(UART0_TX); + break; + case UART_1: + serial_pinout_tx(UART1_TX); + break; + default: + serial_pinout_tx((PinName)NC); + break; + } } - //****************************************************************************** void serial_pinout_tx(PinName tx) {