@@ -40,14 +40,18 @@ static int s_uart_debug_nr = 0;
40
40
41
41
struct uart_struct_t {
42
42
uart_dev_t * dev ;
43
+ xSemaphoreHandle lock ;
43
44
uint8_t num ;
44
45
xQueueHandle queue ;
45
46
};
46
47
48
+ #define UART_MUTEX_LOCK () do {} while (xSemaphoreTake(uart->lock, portMAX_DELAY) != pdPASS)
49
+ #define UART_MUTEX_UNLOCK () xSemaphoreGive(uart->lock)
50
+
47
51
static uart_t _uart_bus_array [3 ] = {
48
- {(volatile uart_dev_t * )(DR_REG_UART_BASE ), 0 , NULL },
49
- {(volatile uart_dev_t * )(DR_REG_UART1_BASE ), 1 , NULL },
50
- {(volatile uart_dev_t * )(DR_REG_UART2_BASE ), 2 , NULL }
52
+ {(volatile uart_dev_t * )(DR_REG_UART_BASE ), NULL , 0 , NULL },
53
+ {(volatile uart_dev_t * )(DR_REG_UART1_BASE ), NULL , 1 , NULL },
54
+ {(volatile uart_dev_t * )(DR_REG_UART2_BASE ), NULL , 2 , NULL }
51
55
};
52
56
53
57
static void IRAM_ATTR _uart_isr (void * arg )
@@ -88,6 +92,7 @@ void uartDisableGlobalInterrupt()
88
92
89
93
void uartEnableInterrupt (uart_t * uart )
90
94
{
95
+ UART_MUTEX_LOCK ();
91
96
uart -> dev -> conf1 .rxfifo_full_thrhd = 112 ;
92
97
uart -> dev -> conf1 .rx_tout_thrhd = 2 ;
93
98
uart -> dev -> conf1 .rx_tout_en = 1 ;
@@ -97,13 +102,16 @@ void uartEnableInterrupt(uart_t* uart)
97
102
uart -> dev -> int_clr .val = 0xffffffff ;
98
103
99
104
intr_matrix_set (xPortGetCoreID (), UART_INTR_SOURCE (uart -> num ), ETS_UART_INUM );
105
+ UART_MUTEX_UNLOCK ();
100
106
}
101
107
102
108
void uartDisableInterrupt (uart_t * uart )
103
109
{
110
+ UART_MUTEX_LOCK ();
104
111
uart -> dev -> conf1 .val = 0 ;
105
112
uart -> dev -> int_ena .val = 0 ;
106
113
uart -> dev -> int_clr .val = 0xffffffff ;
114
+ UART_MUTEX_UNLOCK ();
107
115
}
108
116
109
117
void uartDetachRx (uart_t * uart )
@@ -154,7 +162,14 @@ uart_t* uartBegin(uint8_t uart_nr, uint32_t baudrate, uint32_t config, int8_t rx
154
162
}
155
163
156
164
uart_t * uart = & _uart_bus_array [uart_nr ];
157
-
165
+
166
+ if (uart -> lock == NULL ) {
167
+ uart -> lock = xSemaphoreCreateMutex ();
168
+ if (uart -> lock == NULL ) {
169
+ return NULL ;
170
+ }
171
+ }
172
+
158
173
if (queueLen && uart -> queue == NULL ) {
159
174
uart -> queue = xQueueCreate (queueLen , sizeof (uint8_t )); //initialize the queue
160
175
if (uart -> queue == NULL ) {
@@ -164,7 +179,9 @@ uart_t* uartBegin(uint8_t uart_nr, uint32_t baudrate, uint32_t config, int8_t rx
164
179
165
180
uartFlush (uart );
166
181
uartSetBaudRate (uart , baudrate );
182
+ UART_MUTEX_LOCK ();
167
183
uart -> dev -> conf0 .val = config ;
184
+ UART_MUTEX_UNLOCK ();
168
185
169
186
if (rxPin != -1 ) {
170
187
uartAttachRx (uart , rxPin , inverted );
@@ -183,6 +200,7 @@ void uartEnd(uart_t* uart)
183
200
return ;
184
201
}
185
202
203
+ UART_MUTEX_LOCK ();
186
204
if (uart -> queue != NULL ) {
187
205
vQueueDelete (uart -> queue );
188
206
}
@@ -191,6 +209,7 @@ void uartEnd(uart_t* uart)
191
209
uartDetachTx (uart );
192
210
193
211
uart -> dev -> conf0 .val = 0 ;
212
+ UART_MUTEX_UNLOCK ();
194
213
}
195
214
196
215
uint32_t uartAvailable (uart_t * uart )
@@ -230,21 +249,25 @@ void uartWrite(uart_t* uart, uint8_t c)
230
249
if (uart == NULL ) {
231
250
return ;
232
251
}
252
+ UART_MUTEX_LOCK ();
233
253
while (uart -> dev -> status .rxfifo_cnt == 0x7F );
234
254
uart -> dev -> fifo .rw_byte = c ;
255
+ UART_MUTEX_UNLOCK ();
235
256
}
236
257
237
258
void uartWriteBuf (uart_t * uart , const uint8_t * data , size_t len )
238
259
{
239
260
if (uart == NULL ) {
240
261
return ;
241
262
}
263
+ UART_MUTEX_LOCK ();
242
264
while (len ) {
243
265
while (len && uart -> dev -> status .rxfifo_cnt < 0x7F ) {
244
266
uart -> dev -> fifo .rw_byte = * data ++ ;
245
267
len -- ;
246
268
}
247
269
}
270
+ UART_MUTEX_UNLOCK ();
248
271
}
249
272
250
273
void uartFlush (uart_t * uart )
@@ -253,23 +276,27 @@ void uartFlush(uart_t* uart)
253
276
return ;
254
277
}
255
278
279
+ UART_MUTEX_LOCK ();
256
280
while (uart -> dev -> status .txfifo_cnt );
257
281
258
282
uart -> dev -> conf0 .txfifo_rst = 1 ;
259
283
uart -> dev -> conf0 .txfifo_rst = 0 ;
260
284
261
285
uart -> dev -> conf0 .rxfifo_rst = 1 ;
262
286
uart -> dev -> conf0 .rxfifo_rst = 0 ;
287
+ UART_MUTEX_UNLOCK ();
263
288
}
264
289
265
290
void uartSetBaudRate (uart_t * uart , uint32_t baud_rate )
266
291
{
267
292
if (uart == NULL ) {
268
293
return ;
269
294
}
295
+ UART_MUTEX_LOCK ();
270
296
uint32_t clk_div = ((UART_CLK_FREQ <<4 )/baud_rate );
271
297
uart -> dev -> clk_div .div_int = clk_div >>4 ;
272
298
uart -> dev -> clk_div .div_frag = clk_div & 0xf ;
299
+ UART_MUTEX_UNLOCK ();
273
300
}
274
301
275
302
uint32_t uartGetBaudRate (uart_t * uart )
0 commit comments