agileRTOS (zrtos)  Version 0.8.0 (ghostbuster)
uart0.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_UART0_H
8 #define ZRTOS_VFS_MODULE_AVR_UART_UART0_H
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 
16 
18 
19 ISR(UART0_RECEIVE_INTERRUPT){
20 #if defined(AVR1_USART0)
21 # define ZRTOS_VFS_MODULE_AVR_UART_UART0__STATUS USART0_RXDATAH
22 # define ZRTOS_VFS_MODULE_AVR_UART_UART0__DATA USART0.RXDATAL
23 #else
24 # define ZRTOS_VFS_MODULE_AVR_UART_UART0__STATUS UART0_STATUS
25 # define ZRTOS_VFS_MODULE_AVR_UART_UART0__DATA UART0_DATA
26 #endif
27 
28 #if defined(AT90_UART)
29 # define ZRTOS_VFS_MODULE_AVR_UART_UART0__ERROR\
30  (ZRTOS_VFS_MODULE_AVR_UART_UART0__STATUS & (_BV(FE)|_BV(DOR)|_BV(UPE)))
31 #elif defined(ATMEGA_USART)
32 # define ZRTOS_VFS_MODULE_AVR_UART_UART0__ERROR\
33  (ZRTOS_VFS_MODULE_AVR_UART_UART0__STATUS & (_BV(FE)|_BV(DOR)|_BV(UPE)))
34 #elif defined(ATMEGA_USART0)
35 # define ZRTOS_VFS_MODULE_AVR_UART_UART0__ERROR\
36  (ZRTOS_VFS_MODULE_AVR_UART_UART0__STATUS & (_BV(FE0)|_BV(DOR0)|_BV(UPE0)))
37 #elif defined(ATMEGA_UART)
38 # define ZRTOS_VFS_MODULE_AVR_UART_UART0__ERROR\
39  (ZRTOS_VFS_MODULE_AVR_UART_UART0__STATUS & (_BV(FE)|_BV(DOR)|_BV(UPE)))
40 #elif defined(AVR1_USART0)
41 # define ZRTOS_VFS_MODULE_AVR_UART_UART0__ERROR\
42  (ZRTOS_VFS_MODULE_AVR_UART_UART0__STATUS & (USART_BUFOVF_bm | USART_FERR_bm | USART_PERR_bm))
43 #endif
44 
46  zrtos_vfs_module_avr_uart0
48  ,(
49  ZRTOS_VFS_MODULE_AVR_UART_UART0__ERROR == 0
52  )
53  );
54 
55 #undef ZRTOS_VFS_MODULE_AVR_UART_UART0__STATUS
56 #undef ZRTOS_VFS_MODULE_AVR_UART_UART0__DATA
57 #undef ZRTOS_VFS_MODULE_AVR_UART_UART0__ERROR
58 }
59 
60 ISR(UART0_TRANSMIT_INTERRUPT,ISR_NOBLOCK){
61  uint8_t tmp;
63  zrtos_vfs_module_avr_uart0
64  ,&tmp
65  )){
66 #if defined(AVR1_USART0)
67  USART0_TXDATAL = tmp;
68 #else
69  UART0_DATA = tmp;
70 #endif
71  }else{
72 #if defined(AVR1_USART0)
73  USART0_CTRLA &= ~USART_DREIE_bm;
74 #else
75  UART0_CONTROL &= ~_BV(UART0_UDRIE);
76 #endif
77  }
78 }
79 
81  uint16_t baudrate;
82 
83  zrtos_vfs_module_avr_uart0 = ZRTOS_CAST(
86  thiz
87  )
88  );
89 
91  zrtos_vfs_module_avr_uart0->baudrate
92  );
93 
94 #if defined(AT90_UART)
95  /* set baud rate */
96  UBRR = (uint8_t) baudrate;
97 
98  /* enable UART receiver and transmitter and receive complete interrupt */
99  UART0_CONTROL = _BV(RXCIE)|_BV(RXEN)|_BV(TXEN);
100 
101 #elif defined(ATMEGA_USART)
102  /* Set baud rate */
104  UART0_STATUS = _BV(U2X); //Enable 2x speed
105  baudrate &= ~0x8000;
106  }else{
107  UART0_STATUS &= ~_BV(U2X);
108  }
109  UBRRH = (uint8_t) (baudrate>>8);
110  UBRRL = (uint8_t) baudrate;
111 
112  /* Enable USART receiver and transmitter and receive complete interrupt */
113  UART0_CONTROL = _BV(RXCIE)|_BV(RXEN)|_BV(TXEN);
114 
115  /* Set frame format: asynchronous, 8data, no parity, 1stop bit */
116 #ifdef URSEL
117  UCSRC = _BV(URSEL)|_BV(UCSZ1)|_BV(UCSZ0);
118 #else
119  UCSRC = _BV(UCSZ1)|_BV(UCSZ0);
120 #endif
121 
122 #elif defined(ATMEGA_USART0)
123  /* Set baud rate */
125  UART0_STATUS = _BV(U2X0); //Enable 2x speed
126  baudrate &= ~0x8000;
127  }else{
128  UART0_STATUS &= ~_BV(U2X0);
129  }
130  UBRR0H = (uint8_t)(baudrate>>8);
131  UBRR0L = (uint8_t) baudrate;
132 
133  /* Enable USART receiver and transmitter and receive complete interrupt */
134  UART0_CONTROL = _BV(RXCIE0)|_BV(RXEN0)|_BV(TXEN0);
135 
136  /* Set frame format: asynchronous, 8data, no parity, 1stop bit */
137 #ifdef URSEL0
138  UCSR0C = _BV(URSEL0)|_BV(UCSZ01)|_BV(UCSZ00);
139 #else
140  UCSR0C = _BV(UCSZ01)|_BV(UCSZ00);
141 #endif
142 
143 #elif defined(ATMEGA_UART)
144  /* set baud rate */
146  UART0_STATUS = _BV(U2X); //Enable 2x speed
147  baudrate &= ~0x8000;
148  }else{
149  UART0_STATUS &= ~_BV(U2X);
150  }
151  UBRRHI = (uint8_t) (baudrate>>8);
152  UBRR = (uint8_t) baudrate;
153 
154  /* Enable UART receiver and transmitter and receive complete interrupt */
155  UART0_CONTROL = _BV(RXCIE)|_BV(RXEN)|_BV(TXEN);
156 
157 #elif defined(AVR1_USART0)
158  // set the baud rate
159  USART0.BAUD = USART0_BAUD_RATE(baudrate);
160 
161  USART0.CTRLA = USART_RXCIE_bm;
162  USART0.CTRLB = USART_TXEN_bm | USART_RXEN_bm | USART_RXMODE_NORMAL_gc;
163  // Default configuration of CTRLC is 8N1 in asynchronous mode
164 #endif
165 
166  return ZRTOS_ERROR__SUCCESS;
167 }
168 
170 #if defined(AVR1_USART0)
171  USART0_CTRLA &= ~USART_DREIE_bm;
172 #else
173  UART0_CONTROL &= ~_BV(UART0_UDRIE);
174 #endif
175  return ZRTOS_ERROR__SUCCESS;
176 }
177 
179  zrtos_vfs_file_t *thiz
180  ,char *path
181  ,void *buf
182  ,size_t len
183  ,zrtos_vfs_offset_t offset
184  ,size_t *out
185 ){
187  thiz
188  ,path
189  ,buf
190  ,len
191  ,offset
192  ,out
193  );
194  if(zrtos_error__is_success(ret)){
195 #if defined(AVR1_USART0)
196  USART0_CTRLA |= USART_DREIE_bm;
197 #else
198  UART0_CONTROL |= _BV(UART0_UDRIE);
199 #endif
200  }
201  return ret;
202 }
203 
204 ZRTOS_VFS_PLUGIN__INIT(avr_uart0,
215 );
216 
217 #ifdef __cplusplus
218 }
219 #endif
220 #endif
#define ZRTOS_CAST(type, value)
Definition: cast.h:18
zrtos_vfs_module_uart_baudrate_t baudrate
Definition: uart/uart.h:207
size_t zrtos_vfs_offset_t
Definition: vfs_plugin.h:49
#define ZRTOS_VFS_PLUGIN__0_ON_OPEN_DEFAULT()
Definition: vfs_plugin.h:148
zrtos_error_t zrtos_vfs_module_uart__on_read(zrtos_vfs_file_t *thiz, char *path, void *buf, size_t len, zrtos_vfs_offset_t offset, size_t *out)
Definition: uart/uart.h:295
#define ZRTOS_VFS_MODULE_AVR_UART_UART0__DATA
#define ZRTOS_VFS_PLUGIN__8_ON_SEEK_DEFAULT()
Definition: vfs_plugin.h:294
#define ZRTOS_VFS_PLUGIN__1_ON_CLOSE_DEFAULT()
Definition: vfs_plugin.h:165
zrtos_error_t zrtos_vfs_module_uart__on_can_write(zrtos_vfs_file_t *thiz)
Definition: uart/uart.h:352
#define ZRTOS_VFS_PLUGIN__3_ON_UMOUNT(callback)
Definition: vfs_plugin.h:198
zrtos_error_t zrtos_vfs_module_avr_uart0__on_umount(zrtos_vfs_dentry_t *thiz)
Definition: uart0.h:169
zrtos_error_t zrtos_vfs_module_avr_uart0__on_write(zrtos_vfs_file_t *thiz, char *path, void *buf, size_t len, zrtos_vfs_offset_t offset, size_t *out)
Definition: uart0.h:178
ISR(UART0_RECEIVE_INTERRUPT)
Definition: uart0.h:19
void zrtos_vfs_module_avr_uart__on_receive_interrupt(zrtos_vfs_module_uart_inode_t *thiz, uint8_t data, zrtos_error_t err)
#define ZRTOS_VFS_PLUGIN__2_ON_MOUNT(callback)
Definition: vfs_plugin.h:181
zrtos_error_t zrtos_vfs_module_uart__on_can_read(zrtos_vfs_file_t *thiz)
Definition: uart/uart.h:340
#define ZRTOS_VFS_PLUGIN__4_ON_READ(callback)
Definition: vfs_plugin.h:215
#define ZRTOS_VFS_PLUGIN__6_ON_CAN_READ(callback)
Definition: vfs_plugin.h:259
#define ZRTOS_VFS_MODULE_AVR_UART__IS_DOUBLE_SPEED(baudrate)
#define ZRTOS_VFS_PLUGIN__5_ON_WRITE(callback)
Definition: vfs_plugin.h:237
bool zrtos_error__is_success(zrtos_error_t thiz)
Definition: error.h:152
zrtos_error_t zrtos_vfs_module_uart__on_write(zrtos_vfs_file_t *thiz, char *path, void *buf, size_t len, zrtos_vfs_offset_t offset, size_t *out)
Definition: uart/uart.h:317
#define ZRTOS_VFS_PLUGIN__9_ON_IOCTL(callback)
Definition: vfs_plugin.h:318
Successful program execution status.
Definition: error.h:22
void * zrtos_vfs_dentry__get_inode_data(zrtos_vfs_dentry_t *thiz)
Definition: vfs_dentry.h:196
zrtos_error_t zrtos_vfs_module_avr_uart0__on_mount(zrtos_vfs_dentry_t *thiz)
Definition: uart0.h:80
uint16_t zrtos_vfs_module_avr_uart__baud_select(zrtos_vfs_module_uart_baudrate_t baudrate)
#define ZRTOS_VFS_PLUGIN__7_ON_CAN_WRITE(callback)
Definition: vfs_plugin.h:276
ZRTOS_VFS_PLUGIN__INIT(avr_uart0, ZRTOS_VFS_PLUGIN__0_ON_OPEN_DEFAULT() ZRTOS_VFS_PLUGIN__1_ON_CLOSE_DEFAULT() ZRTOS_VFS_PLUGIN__2_ON_MOUNT(zrtos_vfs_module_avr_uart0__on_mount) ZRTOS_VFS_PLUGIN__3_ON_UMOUNT(zrtos_vfs_module_avr_uart0__on_umount) ZRTOS_VFS_PLUGIN__4_ON_READ(zrtos_vfs_module_uart__on_read) ZRTOS_VFS_PLUGIN__5_ON_WRITE(zrtos_vfs_module_avr_uart0__on_write) ZRTOS_VFS_PLUGIN__6_ON_CAN_READ(zrtos_vfs_module_uart__on_can_read) ZRTOS_VFS_PLUGIN__7_ON_CAN_WRITE(zrtos_vfs_module_uart__on_can_write) ZRTOS_VFS_PLUGIN__8_ON_SEEK_DEFAULT() ZRTOS_VFS_PLUGIN__9_ON_IOCTL(zrtos_vfs_module_uart__on_ioctl))
I/O error.
Definition: error.h:29
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 zrtos_vfs_module_uart__on_ioctl(zrtos_vfs_file_t *thiz, char *path, int request, va_list args)
Definition: uart/uart.h:364
zrtos_error_t
Definition: error.h:20
zrtos_vfs_module_uart_inode_t * zrtos_vfs_module_avr_uart0
Definition: uart0.h:17