00001
00039 #ifndef UART_UART_XMEGA_H_INCLUDED
00040 #define UART_UART_XMEGA_H_INCLUDED
00041
00042 #include <assert.h>
00043 #include <types.h>
00044 #include <chip/uart.h>
00045 #include <regs/xmega_usart.h>
00046
00052 typedef uint8_t uart_flags_t;
00053 typedef void *uart_t;
00054
00055 #define UART_FLAG_TX (1 << 0)
00056 #define UART_FLAG_RX (1 << 1)
00057
00058 #define uart_transmit_is_complete(uart_id) \
00059 uart_transmit_is_complete_priv(uart_t uart)
00060 #define uart_tx_buffer_is_empty(uart_id) \
00061 uart_tx_buffer_is_empty_priv(uart_get_regs(uart_id))
00062 #define uart_send_byte(uart_id, data) \
00063 uart_send_byte_priv(uart_get_regs(uart_id), data)
00064 #define uart_put_byte(uart_id, data)\
00065 uart_put_byte_priv(uart_get_regs(uart_id), data)
00066
00067 #define uart_rx_buffer_is_full(uart_id) \
00068 uart_rx_buffer_is_full_priv(uart_get_regs(uart_id))
00069 #define uart_get_byte(uart_id, data) \
00070 uart_get_byte_priv(uart_get_regs(uart_id), data)
00071
00072 #define uart_enable(uart_id, flags) \
00073 do { \
00074 uint8_t ctrlb; \
00075 uint8_t _flags = (flags); \
00076 void *regs = uart_get_regs(uart_id); \
00077 ctrlb = usart_read_reg(regs, CTRLB); \
00078 if (_flags & UART_FLAG_TX) \
00079 ctrlb |= USART_BIT(TXEN); \
00080 if (_flags & UART_FLAG_RX) \
00081 ctrlb |= USART_BIT(RXEN); \
00082 usart_write_reg(regs, CTRLB, ctrlb); \
00083 } while (0)
00084
00085
00093 extern void uart_init_priv(uart_t uart, uart_flags_t flags);
00094
00105 static inline bool uart_transmit_is_complete_priv(uart_t uart)
00106 {
00107 if (usart_read_reg(uart, STATUS) & USART_BIT(TXCIF))
00108 return true;
00109 else
00110 return false;
00111 }
00112
00121 static inline bool uart_tx_buffer_is_empty_priv(uart_t uart)
00122 {
00123 if (usart_read_reg(uart, STATUS) & USART_BIT(DREIF))
00124 return true;
00125 else
00126 return false;
00127 }
00128
00137 static inline bool uart_rx_buffer_is_full_priv(uart_t uart)
00138 {
00139 if (usart_read_reg(uart, STATUS) & USART_BIT(RXCIF))
00140 return true;
00141 else
00142 return false;
00143 }
00144
00151 static inline void uart_send_byte_priv(uart_t uart, uint8_t data)
00152 {
00153 usart_write_reg(uart, DATA, data);
00154 }
00155
00168 static inline bool uart_put_byte_priv(uart_t uart, uint8_t data)
00169 {
00170 if (usart_read_reg(uart, STATUS) & USART_BIT(DREIF)) {
00171 usart_write_reg(uart, DATA, data);
00172 return true;
00173 }else {
00174 return false;
00175 }
00176 }
00177
00190 static inline bool uart_get_byte_priv(uart_t uart, uint8_t *data)
00191 {
00192 if (usart_read_reg(uart, STATUS) & USART_BIT(RXCIF)) {
00193 *data = usart_read_reg(uart, DATA);
00194 return true;
00195 } else {
00196 return false;
00197 }
00198 }
00199
00201
00202 #endif