agileRTOS (zrtos)  Version 0.8.0 (ghostbuster)
avr/uart/uart.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2024 ykat UG (haftungsbeschraenkt) - All Rights Reserved
3  *
4  * Permission for non-commercial use is hereby granted,
5  * free of charge, without warranty of any kind.
6  */
7 #ifndef ZRTOS_VFS_MODULE_AVR_UART_H
8 #define ZRTOS_VFS_MODULE_AVR_UART_H
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 
14 #include <avr/io.h>
15 #include <avr/interrupt.h>
16 
17 
18 
19 
20 
21 #if defined(__AVR_AT90S2313__) \
22  || defined(__AVR_AT90S4414__) \
23  || defined(__AVR_AT90S4434__) \
24  || defined(__AVR_AT90S8515__) \
25  || defined(__AVR_AT90S8535__) \
26  || defined(__AVR_ATmega103__)
27  /* old AVR classic or ATmega103 with one UART */
28  #define AT90_UART
29  #define UART0_RECEIVE_INTERRUPT UART_RX_vect
30  #define UART0_TRANSMIT_INTERRUPT UART_UDRE_vect
31  #define UART0_STATUS USR
32  #define UART0_CONTROL UCR
33  #define UART0_DATA UDR
34  #define UART0_UDRIE UDRIE
35 #elif defined(__AVR_AT90S2333__) \
36  || defined(__AVR_AT90S4433__)
37  /* old AVR classic with one UART */
38  #define AT90_UART
39  #define UART0_RECEIVE_INTERRUPT UART_RX_vect
40  #define UART0_TRANSMIT_INTERRUPT UART_UDRE_vect
41  #define UART0_STATUS UCSRA
42  #define UART0_CONTROL UCSRB
43  #define UART0_DATA UDR
44  #define UART0_UDRIE UDRIE
45 #elif defined(__AVR_ATmega8__) \
46  || defined(__AVR_ATmega16__) \
47  || defined(__AVR_ATmega32__) \
48  || defined(__AVR_ATmega323__)
49  /* ATmega with one USART */
50  #define ATMEGA_USART
51  #define UART0_RECEIVE_INTERRUPT USART_RXC_vect
52  #define UART0_TRANSMIT_INTERRUPT USART_UDRE_vect
53  #define UART0_STATUS UCSRA
54  #define UART0_CONTROL UCSRB
55  #define UART0_DATA UDR
56  #define UART0_UDRIE UDRIE
57 #elif defined(__AVR_ATmega8U2__) \
58  || defined(__AVR_ATmega16U2__) \
59  || defined(__AVR_ATmega16U4__) \
60  || defined(__AVR_ATmega32U2__) \
61  || defined(__AVR_ATmega32U4__) \
62  || defined(__AVR_ATmega32U6__)
63  /* ATmega with one USART, but is called USART1 (untested) */
64  #define ATMEGA_USART1
65  #define UART1_RECEIVE_INTERRUPT USART1_RX_vect
66  #define UART1_TRANSMIT_INTERRUPT USART1_UDRE_vect
67  #define UART1_STATUS UCSR1A
68  #define UART1_CONTROL UCSR1B
69  #define UART1_DATA UDR1
70  #define UART1_UDRIE UDRIE1
71 #elif defined(__AVR_ATmega8515__) \
72  || defined(__AVR_ATmega8535__)
73  /* ATmega with one USART */
74  #define ATMEGA_USART
75  #define UART0_RECEIVE_INTERRUPT USART_RX_vect
76  #define UART0_TRANSMIT_INTERRUPT USART_UDRE_vect
77  #define UART0_STATUS UCSRA
78  #define UART0_CONTROL UCSRB
79  #define UART0_DATA UDR
80  #define UART0_UDRIE UDRIE
81 #elif defined(__AVR_ATmega163__)
82  /* ATmega163 with one UART */
83  #define ATMEGA_UART
84  #define UART0_RECEIVE_INTERRUPT UART_RX_vect
85  #define UART0_TRANSMIT_INTERRUPT UART_UDRE_vect
86  #define UART0_STATUS UCSRA
87  #define UART0_CONTROL UCSRB
88  #define UART0_DATA UDR
89  #define UART0_UDRIE UDRIE
90 #elif defined(__AVR_ATmega162__)
91  /* ATmega with two USART */
92  #define ATMEGA_USART0
93  #define ATMEGA_USART1
94  #define UART0_RECEIVE_INTERRUPT USART0_RXC_vect
95  #define UART1_RECEIVE_INTERRUPT USART1_RXC_vect
96  #define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect
97  #define UART1_TRANSMIT_INTERRUPT USART1_UDRE_vect
98  #define UART0_STATUS UCSR0A
99  #define UART0_CONTROL UCSR0B
100  #define UART0_DATA UDR0
101  #define UART0_UDRIE UDRIE0
102  #define UART1_STATUS UCSR1A
103  #define UART1_CONTROL UCSR1B
104  #define UART1_DATA UDR1
105  #define UART1_UDRIE UDRIE1
106 #elif defined(__AVR_ATmega64__) \
107  || defined(__AVR_ATmega128__)
108  /* ATmega with two USART */
109  #define ATMEGA_USART0
110  #define ATMEGA_USART1
111  #define UART0_RECEIVE_INTERRUPT USART0_RX_vect
112  #define UART1_RECEIVE_INTERRUPT USART1_RX_vect
113  #define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect
114  #define UART1_TRANSMIT_INTERRUPT USART1_UDRE_vect
115  #define UART0_STATUS UCSR0A
116  #define UART0_CONTROL UCSR0B
117  #define UART0_DATA UDR0
118  #define UART0_UDRIE UDRIE0
119  #define UART1_STATUS UCSR1A
120  #define UART1_CONTROL UCSR1B
121  #define UART1_DATA UDR1
122  #define UART1_UDRIE UDRIE1
123 #elif defined(__AVR_ATmega161__)
124  /* ATmega with UART */
125  #error "AVR ATmega161 currently not supported by this libaray !"
126 #elif defined(__AVR_ATmega169__)
127  /* ATmega with one USART */
128  #define ATMEGA_USART
129  #define UART0_RECEIVE_INTERRUPT USART0_RX_vect
130  #define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect
131  #define UART0_STATUS UCSRA
132  #define UART0_CONTROL UCSRB
133  #define UART0_DATA UDR
134  #define UART0_UDRIE UDRIE
135 #elif defined(__AVR_ATmega48__) \
136  || defined(__AVR_ATmega88__) \
137  || defined(__AVR_ATmega168__) \
138  || defined(__AVR_ATmega48P__) \
139  || defined(__AVR_ATmega88P__) \
140  || defined(__AVR_ATmega168P__) \
141  || defined(__AVR_ATmega328P__)
142  /* TLS-Added 48P/88P/168P/328P */
143  /* ATmega with one USART */
144  #define ATMEGA_USART0
145  #define UART0_RECEIVE_INTERRUPT USART_RX_vect
146  #define UART0_TRANSMIT_INTERRUPT USART_UDRE_vect
147  #define UART0_STATUS UCSR0A
148  #define UART0_CONTROL UCSR0B
149  #define UART0_DATA UDR0
150  #define UART0_UDRIE UDRIE0
151 #elif defined(__AVR_ATtiny2313__) \
152  || defined(__AVR_ATtiny2313A__) \
153  || defined(__AVR_ATtiny4313__)
154  #define ATMEGA_USART
155  #define UART0_RECEIVE_INTERRUPT USART_RX_vect
156  #define UART0_TRANSMIT_INTERRUPT USART_UDRE_vect
157  #define UART0_STATUS UCSRA
158  #define UART0_CONTROL UCSRB
159  #define UART0_DATA UDR
160  #define UART0_UDRIE UDRIE
161 #elif defined(__AVR_ATmega329__) \
162  || defined(__AVR_ATmega649__) \
163  || defined(__AVR_ATmega325__) \
164  || defined(__AVR_ATmega3250__) \
165  || defined(__AVR_ATmega645__) \
166  || defined(__AVR_ATmega6450__)
167  /* ATmega with one USART */
168  #define ATMEGA_USART0
169  #define UART0_RECEIVE_INTERRUPT USART0_RX_vect
170  #define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect
171  #define UART0_STATUS UCSR0A
172  #define UART0_CONTROL UCSR0B
173  #define UART0_DATA UDR0
174  #define UART0_UDRIE UDRIE0
175 #elif defined(__AVR_ATmega3290__) \
176  || defined(__AVR_ATmega6490__)
177  /* TLS-Separated these two from the previous group because of inconsistency in the USART_RX */
178  /* ATmega with one USART */
179  #define ATMEGA_USART0
180  #define UART0_RECEIVE_INTERRUPT USART_RX_vect
181  #define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect
182  #define UART0_STATUS UCSR0A
183  #define UART0_CONTROL UCSR0B
184  #define UART0_DATA UDR0
185  #define UART0_UDRIE UDRIE0
186 #elif defined(__AVR_ATmega2560__) \
187  || defined(__AVR_ATmega1280__) \
188  || defined(__AVR_ATmega640__)
189  /* ATmega with four USART */
190  #define ATMEGA_USART0
191  #define ATMEGA_USART1
192  #define ATMEGA_USART2
193  #define ATMEGA_USART3
194  #define UART0_RECEIVE_INTERRUPT USART0_RX_vect
195  #define UART1_RECEIVE_INTERRUPT USART1_RX_vect
196  #define UART2_RECEIVE_INTERRUPT USART2_RX_vect
197  #define UART3_RECEIVE_INTERRUPT USART3_RX_vect
198  #define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect
199  #define UART1_TRANSMIT_INTERRUPT USART1_UDRE_vect
200  #define UART2_TRANSMIT_INTERRUPT USART2_UDRE_vect
201  #define UART3_TRANSMIT_INTERRUPT USART3_UDRE_vect
202  #define UART0_STATUS UCSR0A
203  #define UART0_CONTROL UCSR0B
204  #define UART0_DATA UDR0
205  #define UART0_UDRIE UDRIE0
206  #define UART1_STATUS UCSR1A
207  #define UART1_CONTROL UCSR1B
208  #define UART1_DATA UDR1
209  #define UART1_UDRIE UDRIE1
210  #define UART2_STATUS UCSR2A
211  #define UART2_CONTROL UCSR2B
212  #define UART2_DATA UDR2
213  #define UART2_UDRIE UDRIE2
214  #define UART3_STATUS UCSR3A
215  #define UART3_CONTROL UCSR3B
216  #define UART3_DATA UDR3
217  #define UART3_UDRIE UDRIE3
218 #elif defined(__AVR_ATmega644__)
219  /* ATmega with one USART */
220  #define ATMEGA_USART0
221  #define UART0_RECEIVE_INTERRUPT USART0_RX_vect
222  #define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect
223  #define UART0_STATUS UCSR0A
224  #define UART0_CONTROL UCSR0B
225  #define UART0_DATA UDR0
226  #define UART0_UDRIE UDRIE0
227 #elif defined(__AVR_ATmega164P__) \
228  || defined(__AVR_ATmega324P__) \
229  || defined(__AVR_ATmega644P__) \
230  || defined(__AVR_ATmega644PA__) \
231  || defined(__AVR_ATmega1284P__)
232  /* ATmega with two USART */
233  #define ATMEGA_USART0
234  #define ATMEGA_USART1
235  #define UART0_RECEIVE_INTERRUPT USART0_RX_vect
236  #define UART1_RECEIVE_INTERRUPT USART1_RX_vect
237  #define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect
238  #define UART1_TRANSMIT_INTERRUPT USART1_UDRE_vect
239  #define UART0_STATUS UCSR0A
240  #define UART0_CONTROL UCSR0B
241  #define UART0_DATA UDR0
242  #define UART0_UDRIE UDRIE0
243  #define UART1_STATUS UCSR1A
244  #define UART1_CONTROL UCSR1B
245  #define UART1_DATA UDR1
246  #define UART1_UDRIE UDRIE1
247 #elif defined(__AVR_ATtiny814__)
248  /* AVR-1 with USART */
249  #define AVR1_USART0
250  #define UART0_RECEIVE_INTERRUPT USART0_RXC_vect
251  #define UART0_TRANSMIT_INTERRUPT USART0_DRE_vect
252  #define USART0_BAUD_RATE(_br_) (uint16_t)((float)(F_CPU * 64 / (16 * (float)(_br_)) + 0.5))
253  #error "AVR ATtiny814 currently not supported by this libaray !"
254 #else
255  #error "no UART definition for MCU available"
256 #endif
257 
258 
259 /** @brief UART Baudrate Expression
260  * @param xtalCpu system clock in Mhz, e.g. 4000000L for 4Mhz
261  * @param baudRate baudrate in bps, e.g. 1200, 2400, 9600
262  */
263 #define UART_BAUD_SELECT(baudRate,xtalCpu) (((xtalCpu)+8UL*(baudRate))/(16UL*(baudRate))-1UL)
264 
265 /** @brief UART Baudrate Expression for ATmega double speed mode
266  * @param xtalCpu system clock in Mhz, e.g. 4000000L for 4Mhz
267  * @param baudRate baudrate in bps, e.g. 1200, 2400, 9600
268  */
269 #define UART_BAUD_SELECT_DOUBLE_SPEED(baudRate,xtalCpu) ((((xtalCpu)+4UL*(baudRate))/(8UL*(baudRate))-1)|0x8000)
270 
271 #ifdef ZRTOS_VFS_MODULE_UART__CFG_ENABLE_DOUBLE_SPEED
272 #define ZRTOS_VFS_MODULE_AVR_UART__IS_DOUBLE_SPEED(baudrate)\
273  (((baudrate) & 0x8000) != 0)
274 #else
275 #define ZRTOS_VFS_MODULE_AVR_UART__IS_DOUBLE_SPEED(baudrate)\
276  (0)
277 #endif
278 
281 ){
282 #ifdef ZRTOS_VFS_MODULE_UART__CFG_ENABLE_DOUBLE_SPEED
283  uint16_t ret;
284  if(baudrate & ZRTOS_VFS_MODULE_UART_BAUDRATE__DOUBLE_SPEED){
286  (baudrate & ZRTOS_VFS_MODULE_UART_BAUDRATE__MASK
287  );
288  ret = UART_BAUD_SELECT_DOUBLE_SPEED(baudrate,F_CPU);
289  }else{
290  ret = UART_BAUD_SELECT(baudrate,F_CPU);
291  }
292  return ret;
293 #else
294  return UART_BAUD_SELECT(baudrate,F_CPU);
295 #endif
296 }
297 
300  ,uint8_t data
301  ,zrtos_error_t err
302 ){
304  thiz
305  );
306 
307  if(zrtos_error__is_error(err)
309  buffer
310  ,data
311  )))
312  || zrtos_error__is_error((err = thiz->on_recv(
313  thiz
314  )))
315  ){
317  &thiz->rx_error_count
318  ,err
319  );
320  }
321 }
322 
325  ,uint8_t *data
326 ){
327  zrtos_error_t err;
329  thiz
330  );
331 
332  if(zrtos_error__is_success((err = thiz->on_send(
333  thiz
334  )))
335  ){
337  return true;
338  }
339  }else{
341  &thiz->tx_error_count
342  ,err
343  );
344  }
345 
346  return false;
347 }
348 
349 #ifdef __cplusplus
350 }
351 #endif
352 #endif
#define UART_BAUD_SELECT_DOUBLE_SPEED(baudRate, xtalCpu)
UART Baudrate Expression for ATmega double speed mode.
zrtos_vfs_module_uart_callback_t on_send
Definition: uart/uart.h:209
zrtos_cbuffer_t * zrtos_vfs_module_uart_inode__get_cbuffer_in(zrtos_vfs_module_uart_inode_t *thiz)
Definition: uart/uart.h:244
zrtos_error_t zrtos_cbuffer__put(zrtos_cbuffer_t *thiz, uint8_t val)
Definition: cbuffer.h:269
zrtos_error_t zrtos_error_count__add(zrtos_error_count_t *thiz, zrtos_error_t err)
Definition: error_count.h:30
zrtos_error_t zrtos_cbuffer__get(zrtos_cbuffer_t *thiz, uint8_t *out)
Definition: cbuffer.h:327
bool zrtos_error__is_error(zrtos_error_t thiz)
Definition: error.h:156
void zrtos_vfs_module_avr_uart__on_receive_interrupt(zrtos_vfs_module_uart_inode_t *thiz, uint8_t data, zrtos_error_t err)
zrtos_error_count_t rx_error_count
Definition: uart/uart.h:205
bool zrtos_error__is_success(zrtos_error_t thiz)
Definition: error.h:152
zrtos_vfs_module_uart_callback_t on_recv
Definition: uart/uart.h:210
#define UART_BAUD_SELECT(baudRate, xtalCpu)
UART Baudrate Expression.
zrtos_vfs_module_uart_baudrate_t
Definition: uart/uart.h:30
uint16_t zrtos_vfs_module_avr_uart__baud_select(zrtos_vfs_module_uart_baudrate_t baudrate)
bool zrtos_vfs_module_avr_uart__on_transmit_interrupt(zrtos_vfs_module_uart_inode_t *thiz, uint8_t *data)
static uint8_t
Definition: mcp2515.h:159
zrtos_error_t
Definition: error.h:20
zrtos_error_count_t tx_error_count
Definition: uart/uart.h:206
zrtos_cbuffer_t * zrtos_vfs_module_uart_inode__get_cbuffer_out(zrtos_vfs_module_uart_inode_t *thiz)
Definition: uart/uart.h:250