47
47
48
48
static int s_uart_debug_nr = UART0 ;
49
49
50
+ struct uart_rx_buffer_ {
51
+ size_t size ;
52
+ size_t rpos ;
53
+ size_t wpos ;
54
+ uint8_t * buffer ;
55
+ };
56
+
50
57
struct uart_ {
51
58
int uart_nr ;
52
59
int baud_rate ;
53
60
bool rx_enabled ;
54
61
bool tx_enabled ;
55
62
uint8_t rx_pin ;
56
63
uint8_t tx_pin ;
64
+ struct uart_rx_buffer_ * rx_buffer ;
57
65
};
58
66
59
- void uart_write_char (uart_t * uart , char c )
67
+ size_t uart_resize_rx_buffer (uart_t * uart , size_t new_size )
60
68
{
61
- if (uart == NULL || !uart -> tx_enabled ) {
62
- return ;
69
+ if (uart == NULL || !uart -> rx_enabled ) {
70
+ return 0 ;
63
71
}
64
- while ((USS (uart -> uart_nr ) >> USTXC ) >= 0x7f );
65
- USF (uart -> uart_nr ) = c ;
66
- }
67
-
68
- void uart_write (uart_t * uart , const char * buf , size_t size )
69
- {
70
- if (uart == NULL || !uart -> tx_enabled ) {
71
- return ;
72
+ if (uart -> rx_buffer -> size == new_size ) {
73
+ return uart -> rx_buffer -> size ;
72
74
}
73
- while (size -- ) {
74
- uart_write_char (uart , * buf ++ );
75
+ uint8_t * new_buf = (uint8_t * )malloc (new_size );
76
+ if (!new_buf ) {
77
+ return uart -> rx_buffer -> size ;
75
78
}
79
+ size_t new_wpos = 0 ;
80
+ ETS_UART_INTR_DISABLE ();
81
+ while (uart_rx_available (uart ) && new_wpos < new_size ) {
82
+ new_buf [new_wpos ++ ] = uart_read_char (uart );
83
+ }
84
+ uint8_t * old_buf = uart -> rx_buffer -> buffer ;
85
+ uart -> rx_buffer -> rpos = 0 ;
86
+ uart -> rx_buffer -> wpos = new_wpos ;
87
+ uart -> rx_buffer -> size = new_size ;
88
+ uart -> rx_buffer -> buffer = new_buf ;
89
+ free (old_buf );
90
+ ETS_UART_INTR_ENABLE ();
91
+ return uart -> rx_buffer -> size ;
76
92
}
77
93
78
- int uart_read_char (uart_t * uart )
94
+ int uart_peek_char (uart_t * uart )
79
95
{
80
96
if (uart == NULL || !uart -> rx_enabled ) {
81
97
return -1 ;
82
98
}
83
99
if (!uart_rx_available (uart )) {
84
100
return -1 ;
85
101
}
86
- return USF (uart -> uart_nr ) & 0xff ;
102
+ return uart -> rx_buffer -> buffer [uart -> rx_buffer -> rpos ];
103
+ }
104
+
105
+ int uart_read_char (uart_t * uart )
106
+ {
107
+ int data = uart_peek_char (uart );
108
+ if (data != -1 ) {
109
+ uart -> rx_buffer -> rpos = (uart -> rx_buffer -> rpos + 1 ) % uart -> rx_buffer -> size ;
110
+ }
111
+ return data ;
87
112
}
88
113
89
114
size_t uart_rx_available (uart_t * uart )
90
115
{
91
116
if (uart == NULL || !uart -> rx_enabled ) {
92
- return -1 ;
117
+ return 0 ;
118
+ }
119
+ if (uart -> rx_buffer -> wpos < uart -> rx_buffer -> rpos ) {
120
+ return (uart -> rx_buffer -> wpos + uart -> rx_buffer -> size ) - uart -> rx_buffer -> rpos ;
121
+ }
122
+ return uart -> rx_buffer -> wpos - uart -> rx_buffer -> rpos ;
123
+ }
124
+
125
+
126
+ void ICACHE_RAM_ATTR uart_isr (void * arg )
127
+ {
128
+ uart_t * uart = (uart_t * )arg ;
129
+ if (uart == NULL || !uart -> rx_enabled ) {
130
+ USIC (uart -> uart_nr ) = 0xffff ;
131
+ ETS_UART_INTR_DISABLE ();
132
+ return ;
133
+ }
134
+
135
+ uint32_t int_status = USIS (uart -> uart_nr );
136
+
137
+ if (int_status & (1 << UIFR )) {
138
+ USIC (uart -> uart_nr ) = (1 << UIFR );//clear any frame error
139
+ }
140
+
141
+ if (int_status & (1 << UIFF ) || int_status & (1 << UITO )){
142
+ ETS_UART_INTR_DISABLE ();
143
+ while (((USS (uart -> uart_nr ) >> USRXC ) & 0x7F ) != 0 ){
144
+ uint8_t data = USF (uart -> uart_nr );
145
+ size_t nextPos = (uart -> rx_buffer -> wpos + 1 ) % uart -> rx_buffer -> size ;
146
+ if (nextPos != uart -> rx_buffer -> rpos ) {
147
+ uart -> rx_buffer -> buffer [uart -> rx_buffer -> wpos ] = data ;
148
+ uart -> rx_buffer -> wpos = nextPos ;
149
+ } else {
150
+ //rx buffer OverFlow
151
+ //maybe stop the loop and try later?
152
+ }
153
+ }
154
+ int_status = USIS (uart -> uart_nr );
155
+ if (int_status & (1 << UIFF )) {
156
+ USIC (uart -> uart_nr ) = (1 << UIFF );//clear any FIFO FULL error
157
+ }
158
+ if (int_status & (1 << UITO )) {
159
+ USIC (uart -> uart_nr ) = (1 << UITO );//clear any TimeOut error
160
+ }
161
+ ETS_UART_INTR_ENABLE ();
162
+ }
163
+ }
164
+
165
+ void uart_start_isr (uart_t * uart )
166
+ {
167
+ if (uart == NULL || !uart -> rx_enabled ) {
168
+ return ;
169
+ }
170
+ USC1 (uart -> uart_nr ) = (127 << UCFFT ) | (0x02 << UCTOT ) | (1 <<UCTOE );
171
+ USIC (uart -> uart_nr ) = 0xffff ;
172
+ USIE (uart -> uart_nr ) = (1 << UIFF ) | (1 << UIFR ) | (1 << UITO );
173
+ ETS_UART_INTR_ATTACH (uart_isr , (void * )uart );
174
+ ETS_UART_INTR_ENABLE ();
175
+ }
176
+
177
+ void uart_stop_isr (uart_t * uart )
178
+ {
179
+ if (uart == NULL || !uart -> rx_enabled ) {
180
+ return ;
181
+ }
182
+ ETS_UART_INTR_DISABLE ();
183
+ USC1 (uart -> uart_nr ) = 0 ;
184
+ USIC (uart -> uart_nr ) = 0xffff ;
185
+ USIE (uart -> uart_nr ) = 0 ;
186
+ ETS_UART_INTR_ATTACH (NULL , NULL );
187
+ }
188
+
189
+
190
+ void uart_write_char (uart_t * uart , char c )
191
+ {
192
+ if (uart == NULL || !uart -> tx_enabled ) {
193
+ return ;
194
+ }
195
+ while ((USS (uart -> uart_nr ) >> USTXC ) >= 0x7f );
196
+ USF (uart -> uart_nr ) = c ;
197
+ }
198
+
199
+ void uart_write (uart_t * uart , const char * buf , size_t size )
200
+ {
201
+ if (uart == NULL || !uart -> tx_enabled ) {
202
+ return ;
203
+ }
204
+ while (size -- ) {
205
+ uart_write_char (uart , * buf ++ );
93
206
}
94
- return (USS (uart -> uart_nr ) >> USRXC ) & 0xff ;
95
207
}
96
208
97
209
size_t uart_tx_free (uart_t * uart )
@@ -121,6 +233,10 @@ void uart_flush(uart_t* uart)
121
233
uint32_t tmp = 0x00000000 ;
122
234
if (uart -> rx_enabled ) {
123
235
tmp |= (1 << UCRXRST );
236
+ ETS_UART_INTR_DISABLE ();
237
+ uart -> rx_buffer -> rpos = 0 ;
238
+ uart -> rx_buffer -> wpos = 0 ;
239
+ ETS_UART_INTR_ENABLE ();
124
240
}
125
241
126
242
if (uart -> tx_enabled ) {
@@ -148,7 +264,7 @@ int uart_get_baudrate(uart_t* uart)
148
264
return uart -> baud_rate ;
149
265
}
150
266
151
- uart_t * uart_init (int uart_nr , int baudrate , int config , int mode , int tx_pin )
267
+ uart_t * uart_init (int uart_nr , int baudrate , int config , int mode , int tx_pin , size_t rx_size )
152
268
{
153
269
uart_t * uart = (uart_t * ) malloc (sizeof (uart_t ));
154
270
if (uart == NULL ) {
@@ -159,9 +275,29 @@ uart_t* uart_init(int uart_nr, int baudrate, int config, int mode, int tx_pin)
159
275
160
276
switch (uart -> uart_nr ) {
161
277
case UART0 :
278
+ ETS_UART_INTR_DISABLE ();
279
+ ETS_UART_INTR_ATTACH (NULL , NULL );
162
280
uart -> rx_enabled = (mode != UART_TX_ONLY );
163
281
uart -> tx_enabled = (mode != UART_RX_ONLY );
164
282
uart -> rx_pin = (uart -> rx_enabled )?3 :255 ;
283
+ if (uart -> rx_enabled ) {
284
+ struct uart_rx_buffer_ * rx_buffer = (struct uart_rx_buffer_ * )malloc (sizeof (struct uart_rx_buffer_ ));
285
+ if (rx_buffer == NULL ) {
286
+ free (uart );
287
+ return NULL ;
288
+ }
289
+ rx_buffer -> size = rx_size ;//var this
290
+ rx_buffer -> rpos = 0 ;
291
+ rx_buffer -> wpos = 0 ;
292
+ rx_buffer -> buffer = (uint8_t * )malloc (rx_buffer -> size );
293
+ if (rx_buffer -> buffer == NULL ) {
294
+ free (rx_buffer );
295
+ free (uart );
296
+ return NULL ;
297
+ }
298
+ uart -> rx_buffer = rx_buffer ;
299
+ pinMode (uart -> rx_pin , SPECIAL );
300
+ }
165
301
if (uart -> tx_enabled ) {
166
302
if (tx_pin == 2 ) {
167
303
uart -> tx_pin = 2 ;
@@ -173,9 +309,6 @@ uart_t* uart_init(int uart_nr, int baudrate, int config, int mode, int tx_pin)
173
309
} else {
174
310
uart -> tx_pin = 255 ;
175
311
}
176
- if (uart -> rx_enabled ) {
177
- pinMode (uart -> rx_pin , SPECIAL );
178
- }
179
312
IOSWAP &= ~(1 << IOSWAPU0 );
180
313
break ;
181
314
case UART1 :
@@ -199,6 +332,11 @@ uart_t* uart_init(int uart_nr, int baudrate, int config, int mode, int tx_pin)
199
332
USC0 (uart -> uart_nr ) = config ;
200
333
uart_flush (uart );
201
334
USC1 (uart -> uart_nr ) = 0 ;
335
+ USIC (uart -> uart_nr ) = 0xffff ;
336
+ USIE (uart -> uart_nr ) = 0 ;
337
+ if (uart -> uart_nr == UART0 && uart -> rx_enabled ) {
338
+ uart_start_isr (uart );
339
+ }
202
340
203
341
return uart ;
204
342
}
@@ -230,6 +368,11 @@ void uart_uninit(uart_t* uart)
230
368
break ;
231
369
}
232
370
371
+ if (uart -> rx_enabled ){
372
+ free (uart -> rx_buffer -> buffer );
373
+ free (uart -> rx_buffer );
374
+ //uart_stop_isr(uart);
375
+ }
233
376
free (uart );
234
377
}
235
378
0 commit comments