Merge pull request #7709 from smlng/cpu/sam0_common/enh_uart

cpu, sam0 common: adapt periph-uart to use read-only bit-fields
This commit is contained in:
Kaspar Schleiser 2017-12-15 12:45:10 +01:00 committed by GitHub
commit c1e20f8231
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -71,7 +71,7 @@ int uart_init(uart_t uart, uint32_t baudrate, uart_rx_cb_t rx_cb, void *arg)
/* reset the UART device */
dev(uart)->CTRLA.reg = SERCOM_USART_CTRLA_SWRST;
while (dev(uart)->SYNCBUSY.reg & SERCOM_USART_SYNCBUSY_SWRST) {}
while (dev(uart)->SYNCBUSY.bit.SWRST) {}
/* configure clock generator */
sercom_set_gen(dev(uart), uart_config[uart].gclk_src);
@ -94,7 +94,7 @@ int uart_init(uart_t uart, uint32_t baudrate, uart_rx_cb_t rx_cb, void *arg)
dev(uart)->BAUD.FRAC.BAUD = (baud / 10);
/* enable transmitter, and configure 8N1 mode */
dev(uart)->CTRLB.reg = (SERCOM_USART_CTRLB_TXEN);
dev(uart)->CTRLB.reg = SERCOM_USART_CTRLB_TXEN;
/* enable receiver and RX interrupt if configured */
if ((rx_cb) && (uart_config[uart].rx_pin != GPIO_UNDEF)) {
uart_ctx[uart].rx_cb = rx_cb;
@ -107,7 +107,7 @@ int uart_init(uart_t uart, uint32_t baudrate, uart_rx_cb_t rx_cb, void *arg)
dev(uart)->CTRLB.reg |= SERCOM_USART_CTRLB_SFDE;
}
}
while (dev(uart)->SYNCBUSY.reg & SERCOM_USART_SYNCBUSY_CTRLB) {}
while (dev(uart)->SYNCBUSY.bit.CTRLB) {}
/* and finally enable the device */
dev(uart)->CTRLA.reg |= SERCOM_USART_CTRLA_ENABLE;
@ -118,10 +118,10 @@ int uart_init(uart_t uart, uint32_t baudrate, uart_rx_cb_t rx_cb, void *arg)
void uart_write(uart_t uart, const uint8_t *data, size_t len)
{
for (size_t i = 0; i < len; i++) {
while (!(dev(uart)->INTFLAG.reg & SERCOM_USART_INTFLAG_DRE)) {}
while (!dev(uart)->INTFLAG.bit.DRE) {}
dev(uart)->DATA.reg = data[i];
}
while (!(dev(uart)->INTFLAG.reg & SERCOM_USART_INTFLAG_TXC)) {}
while (!dev(uart)->INTFLAG.bit.TXC) {}
}
void uart_poweron(uart_t uart)
@ -138,12 +138,12 @@ void uart_poweroff(uart_t uart)
static inline void irq_handler(unsigned uartnum)
{
if (dev(uartnum)->INTFLAG.reg & SERCOM_USART_INTFLAG_RXC) {
if (dev(uartnum)->INTFLAG.bit.RXC) {
/* interrupt flag is cleared by reading the data register */
uart_ctx[uartnum].rx_cb(uart_ctx[uartnum].arg,
(uint8_t)(dev(uartnum)->DATA.reg));
}
else if (dev(uartnum)->INTFLAG.reg & SERCOM_USART_INTFLAG_ERROR) {
else if (dev(uartnum)->INTFLAG.bit.ERROR) {
/* clear error flag */
dev(uartnum)->INTFLAG.reg = SERCOM_USART_INTFLAG_ERROR;
}