Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef USARTS_H
00019 #define USARTS_H
00020
00021 #include <stdint.h>
00022 #include <avr/pgmspace.h>
00023 #include <avr/io.h>
00024
00025 #include "fifo.h"
00026
00037
00038
00039
00041 #define USART_FRAME_ERROR (1<<4)
00042
00043 #define USART_PARITY_ERROR (1<<2)
00044
00046 #define USART_NO_RX (1<<7)
00047
00048 #define USART_TIMESTAMPED (1<<6)
00049
00052 typedef uint32_t baudrate_t;
00053
00056 typedef struct usart_rxdata_s {
00057 uint8_t data;
00058 uint8_t flags;
00059 } usart_rxdata_t;
00060
00063 typedef uint8_t usart_timestamp_t;
00064
00066 typedef struct usart_control_s {
00068 volatile uint8_t * const base;
00070 fifo_t txbuf;
00072 fifo_t rxbuf;
00074 volatile uint8_t * const prr;
00076 uint8_t const prusart;
00077 volatile uint8_t tx_empty;
00079 uint8_t ts_trigger;
00081 usart_timestamp_t timestamp;
00083 const char * const name;
00084 } usart_control_t;
00085
00087 typedef enum {
00088 usart_ext,
00089 usart_mod,
00090 USARTS_NUMBER,
00091 usart_none = -1,
00092 } hlog_usart_t;
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112 usart_control_t * usart_init (hlog_usart_t which,
00113 fifo_item_t * txbuf, fifo_size_t txsize,
00114 fifo_item_t * rxbuf, fifo_size_t rxsize);
00115
00122 baudrate_t usart_set_baudrate (usart_control_t * uc, baudrate_t baud);
00123
00133 baudrate_t usart_change_baudrate (usart_control_t * uc, int8_t incdec);
00134
00139 void usart_disable (usart_control_t *);
00146 void usart_power (usart_control_t *, uint8_t onoff);
00147
00153 void usart_enable (usart_control_t * uc);
00154
00162 usart_rxdata_t usart_recv (usart_control_t * uc);
00163
00169 inline uint8_t usart_can_recv (usart_control_t * uc)
00170 {
00171 return fifo_get_buffer (&uc->rxbuf) && !fifo_is_empty(&uc->rxbuf);
00172 }
00173
00182 void usart_send (usart_control_t * uc, uint8_t b);
00183
00186 void usart_flush (usart_control_t *uc);
00187
00192 uint8_t usart_ext_is_connected (void);
00193
00199 inline uint8_t usart_can_send (usart_control_t * uc)
00200 {
00201 return fifo_get_buffer (&uc->txbuf) && !fifo_is_full(&uc->txbuf);
00202 }
00203
00206 inline size_t usart_send_msg (usart_control_t * uc, uint8_t nonblock,
00207 const uint8_t * msg, const size_t msglen)
00208 {
00209 size_t cnt = msglen;
00210 if (cnt)
00211 do {
00212 if (nonblock && !usart_can_send (uc))
00213 break;
00214 usart_send (uc, *msg++);
00215 } while (--cnt);
00216 return msglen - cnt;
00217 }
00218
00228 inline size_t usart_send_msg_P (usart_control_t * uc, uint8_t nonblock,
00229 const uint8_t * msg, const size_t msglen)
00230 {
00231 size_t cnt = msglen;
00232 if (cnt)
00233 do {
00234 if (nonblock && !usart_can_send (uc))
00235 break;
00236 usart_send (uc, pgm_read_byte (msg++));
00237 } while (--cnt);
00238 return msglen - cnt;
00239 }
00240
00243 inline void usart_timestamp_set_trigger (usart_control_t * uc, uint8_t trigger)
00244 {
00245 uc->ts_trigger = trigger;
00246 }
00247
00250 inline usart_timestamp_t usart_get_timestamp (usart_control_t * uc)
00251 {
00252 return uc->timestamp;
00253 }
00254
00255 #endif