@@ -40,14 +40,21 @@ 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
+
51
+ #define UART_MUTEX_LOCK_NUM (i ) if(_uart_bus_array[i].lock != NULL) do {} while (xSemaphoreTake(_uart_bus_array[i].lock, portMAX_DELAY) != pdPASS)
52
+ #define UART_MUTEX_UNLOCK_NUM (i ) if(_uart_bus_array[i].lock != NULL) xSemaphoreGive(_uart_bus_array[i].lock)
53
+
47
54
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 }
55
+ {(volatile uart_dev_t * )(DR_REG_UART_BASE ), NULL , 0 , NULL },
56
+ {(volatile uart_dev_t * )(DR_REG_UART1_BASE ), NULL , 1 , NULL },
57
+ {(volatile uart_dev_t * )(DR_REG_UART2_BASE ), NULL , 2 , NULL }
51
58
};
52
59
53
60
static void IRAM_ATTR _uart_isr (void * arg )
@@ -88,6 +95,7 @@ void uartDisableGlobalInterrupt()
88
95
89
96
void uartEnableInterrupt (uart_t * uart )
90
97
{
98
+ UART_MUTEX_LOCK ();
91
99
uart -> dev -> conf1 .rxfifo_full_thrhd = 112 ;
92
100
uart -> dev -> conf1 .rx_tout_thrhd = 2 ;
93
101
uart -> dev -> conf1 .rx_tout_en = 1 ;
@@ -97,13 +105,16 @@ void uartEnableInterrupt(uart_t* uart)
97
105
uart -> dev -> int_clr .val = 0xffffffff ;
98
106
99
107
intr_matrix_set (xPortGetCoreID (), UART_INTR_SOURCE (uart -> num ), ETS_UART_INUM );
108
+ UART_MUTEX_UNLOCK ();
100
109
}
101
110
102
111
void uartDisableInterrupt (uart_t * uart )
103
112
{
113
+ UART_MUTEX_LOCK ();
104
114
uart -> dev -> conf1 .val = 0 ;
105
115
uart -> dev -> int_ena .val = 0 ;
106
116
uart -> dev -> int_clr .val = 0xffffffff ;
117
+ UART_MUTEX_UNLOCK ();
107
118
}
108
119
109
120
void uartDetachRx (uart_t * uart )
@@ -154,7 +165,14 @@ uart_t* uartBegin(uint8_t uart_nr, uint32_t baudrate, uint32_t config, int8_t rx
154
165
}
155
166
156
167
uart_t * uart = & _uart_bus_array [uart_nr ];
157
-
168
+
169
+ if (uart -> lock == NULL ) {
170
+ uart -> lock = xSemaphoreCreateMutex ();
171
+ if (uart -> lock == NULL ) {
172
+ return NULL ;
173
+ }
174
+ }
175
+
158
176
if (queueLen && uart -> queue == NULL ) {
159
177
uart -> queue = xQueueCreate (queueLen , sizeof (uint8_t )); //initialize the queue
160
178
if (uart -> queue == NULL ) {
@@ -164,7 +182,9 @@ uart_t* uartBegin(uint8_t uart_nr, uint32_t baudrate, uint32_t config, int8_t rx
164
182
165
183
uartFlush (uart );
166
184
uartSetBaudRate (uart , baudrate );
185
+ UART_MUTEX_LOCK ();
167
186
uart -> dev -> conf0 .val = config ;
187
+ UART_MUTEX_UNLOCK ();
168
188
169
189
if (rxPin != -1 ) {
170
190
uartAttachRx (uart , rxPin , inverted );
@@ -183,6 +203,7 @@ void uartEnd(uart_t* uart)
183
203
return ;
184
204
}
185
205
206
+ UART_MUTEX_LOCK ();
186
207
if (uart -> queue != NULL ) {
187
208
vQueueDelete (uart -> queue );
188
209
}
@@ -191,6 +212,7 @@ void uartEnd(uart_t* uart)
191
212
uartDetachTx (uart );
192
213
193
214
uart -> dev -> conf0 .val = 0 ;
215
+ UART_MUTEX_UNLOCK ();
194
216
}
195
217
196
218
uint32_t uartAvailable (uart_t * uart )
@@ -230,21 +252,25 @@ void uartWrite(uart_t* uart, uint8_t c)
230
252
if (uart == NULL ) {
231
253
return ;
232
254
}
255
+ UART_MUTEX_LOCK ();
233
256
while (uart -> dev -> status .rxfifo_cnt == 0x7F );
234
257
uart -> dev -> fifo .rw_byte = c ;
258
+ UART_MUTEX_UNLOCK ();
235
259
}
236
260
237
261
void uartWriteBuf (uart_t * uart , const uint8_t * data , size_t len )
238
262
{
239
263
if (uart == NULL ) {
240
264
return ;
241
265
}
266
+ UART_MUTEX_LOCK ();
242
267
while (len ) {
243
268
while (len && uart -> dev -> status .rxfifo_cnt < 0x7F ) {
244
269
uart -> dev -> fifo .rw_byte = * data ++ ;
245
270
len -- ;
246
271
}
247
272
}
273
+ UART_MUTEX_UNLOCK ();
248
274
}
249
275
250
276
void uartFlush (uart_t * uart )
@@ -253,23 +279,27 @@ void uartFlush(uart_t* uart)
253
279
return ;
254
280
}
255
281
282
+ UART_MUTEX_LOCK ();
256
283
while (uart -> dev -> status .txfifo_cnt );
257
284
258
285
uart -> dev -> conf0 .txfifo_rst = 1 ;
259
286
uart -> dev -> conf0 .txfifo_rst = 0 ;
260
287
261
288
uart -> dev -> conf0 .rxfifo_rst = 1 ;
262
289
uart -> dev -> conf0 .rxfifo_rst = 0 ;
290
+ UART_MUTEX_UNLOCK ();
263
291
}
264
292
265
293
void uartSetBaudRate (uart_t * uart , uint32_t baud_rate )
266
294
{
267
295
if (uart == NULL ) {
268
296
return ;
269
297
}
298
+ UART_MUTEX_LOCK ();
270
299
uint32_t clk_div = ((UART_CLK_FREQ <<4 )/baud_rate );
271
300
uart -> dev -> clk_div .div_int = clk_div >>4 ;
272
301
uart -> dev -> clk_div .div_frag = clk_div & 0xf ;
302
+ UART_MUTEX_UNLOCK ();
273
303
}
274
304
275
305
uint32_t uartGetBaudRate (uart_t * uart )
@@ -283,20 +313,26 @@ uint32_t uartGetBaudRate(uart_t* uart)
283
313
284
314
static void IRAM_ATTR uart0_write_char (char c )
285
315
{
316
+ UART_MUTEX_LOCK_NUM (0 );
286
317
while (((ESP_REG (0x01C + DR_REG_UART_BASE ) >> UART_TXFIFO_CNT_S ) & 0x7F ) == 0x7F );
287
318
ESP_REG (DR_REG_UART_BASE ) = c ;
319
+ UART_MUTEX_UNLOCK_NUM (0 );
288
320
}
289
321
290
322
static void IRAM_ATTR uart1_write_char (char c )
291
323
{
324
+ UART_MUTEX_LOCK_NUM (1 );
292
325
while (((ESP_REG (0x01C + DR_REG_UART1_BASE ) >> UART_TXFIFO_CNT_S ) & 0x7F ) == 0x7F );
293
326
ESP_REG (DR_REG_UART1_BASE ) = c ;
327
+ UART_MUTEX_UNLOCK_NUM (1 );
294
328
}
295
329
296
330
static void IRAM_ATTR uart2_write_char (char c )
297
331
{
332
+ UART_MUTEX_LOCK_NUM (2 );
298
333
while (((ESP_REG (0x01C + DR_REG_UART2_BASE ) >> UART_TXFIFO_CNT_S ) & 0x7F ) == 0x7F );
299
334
ESP_REG (DR_REG_UART2_BASE ) = c ;
335
+ UART_MUTEX_UNLOCK_NUM (2 );
300
336
}
301
337
302
338
void uartSetDebug (uart_t * uart )
0 commit comments