@@ -122,7 +122,8 @@ struct serial_global_data_s {
122
122
123
123
static struct serial_global_data_s uart_data [UART_NUM ];
124
124
125
- void serial_init (serial_t * obj , PinName tx , PinName rx ) {
125
+ void serial_init (serial_t * obj , PinName tx , PinName rx )
126
+ {
126
127
int is_stdio_uart = 0 ;
127
128
128
129
// determine the UART to use
@@ -144,23 +145,23 @@ void serial_init(serial_t *obj, PinName tx, PinName rx) {
144
145
obj -> stopBits = UART_STOP_ONE ;
145
146
obj -> parityType = UART_PAR_NONE ;
146
147
147
- switch (uart ) {
148
+ switch (uart ) {
148
149
case UART_0 : {
149
- obj -> index = 0 ;
150
- obj -> baseAddr = CC3220SF_UARTA0_BASE ;
151
- obj -> powerMgrId = 12 ; /*!< Resource ID: UART 0 */
152
- obj -> intNum = INT_UARTA0_IRQn ;
153
- obj -> peripheralId = PRCM_UARTA0 ;
154
- }
155
- break ;
150
+ obj -> index = 0 ;
151
+ obj -> baseAddr = CC3220SF_UARTA0_BASE ;
152
+ obj -> powerMgrId = 12 ; /*!< Resource ID: UART 0 */
153
+ obj -> intNum = INT_UARTA0_IRQn ;
154
+ obj -> peripheralId = PRCM_UARTA0 ;
155
+ }
156
+ break ;
156
157
case UART_1 : {
157
- obj -> index = 1 ;
158
- obj -> baseAddr = CC3220SF_UARTA1_BASE ;
159
- obj -> powerMgrId = 13 ; /*!< Resource ID: UART 1 */
160
- obj -> intNum = INT_UARTA1_IRQn ;
161
- obj -> peripheralId = PRCM_UARTA1 ;
162
- }
163
- break ;
158
+ obj -> index = 1 ;
159
+ obj -> baseAddr = CC3220SF_UARTA1_BASE ;
160
+ obj -> powerMgrId = 13 ; /*!< Resource ID: UART 1 */
161
+ obj -> intNum = INT_UARTA1_IRQn ;
162
+ obj -> peripheralId = PRCM_UARTA1 ;
163
+ }
164
+ break ;
164
165
}
165
166
166
167
PRCMPeripheralClkEnable (obj -> peripheralId , PRCM_RUN_MODE_CLK );
@@ -199,87 +200,125 @@ void serial_init(serial_t *obj, PinName tx, PinName rx) {
199
200
}
200
201
}
201
202
202
- void serial_free (serial_t * obj ) {
203
+ void serial_free (serial_t * obj )
204
+ {
203
205
uart_data [obj -> index ].serial_irq_id = 0 ;
204
206
}
205
207
206
- void serial_baud (serial_t * obj , int baudrate ) {
208
+ void serial_baud (serial_t * obj , int baudrate )
209
+ {
207
210
obj -> baudRate = baudrate ;
208
211
209
212
MAP_UARTConfigSetExpClk (obj -> baseAddr , MAP_PRCMPeripheralClockGet (obj -> peripheralId ),
210
213
obj -> baudRate , (dataLength [obj -> dataLength ] |
211
- stopBits [obj -> stopBits ] | parityType [obj -> parityType ]));
214
+ stopBits [obj -> stopBits ] | parityType [obj -> parityType ]));
212
215
}
213
216
214
- void serial_format (serial_t * obj , int data_bits , SerialParity parity , int stop_bits ) {
217
+ void serial_format (serial_t * obj , int data_bits , SerialParity parity , int stop_bits )
218
+ {
215
219
MBED_ASSERT ((stop_bits == 1 ) || (stop_bits == 2 )); // 0: 1 stop bits, 1: 2 stop bits
216
220
MBED_ASSERT ((data_bits > 4 ) && (data_bits < 9 )); // 0: 5 data bits ... 3: 8 data bits
217
221
MBED_ASSERT ((parity == ParityNone ) || (parity == ParityOdd ) || (parity == ParityEven ) ||
218
- (parity == ParityForced1 ) || (parity == ParityForced0 ));
222
+ (parity == ParityForced1 ) || (parity == ParityForced0 ));
219
223
220
224
stop_bits -= 1 ;
221
225
data_bits -= 5 ;
222
226
223
227
switch (parity ) {
224
- case ParityNone : obj -> parityType = UART_PAR_NONE ; break ;
225
- case ParityOdd : obj -> parityType = UART_PAR_ODD ; break ;
226
- case ParityEven : obj -> parityType = UART_PAR_EVEN ; break ;
227
- case ParityForced1 : obj -> parityType = UART_PAR_ONE ; break ;
228
- case ParityForced0 : obj -> parityType = UART_PAR_ZERO ; break ;
229
- default : obj -> parityType = UART_PAR_NONE ; break ;
228
+ case ParityNone :
229
+ obj -> parityType = UART_PAR_NONE ;
230
+ break ;
231
+ case ParityOdd :
232
+ obj -> parityType = UART_PAR_ODD ;
233
+ break ;
234
+ case ParityEven :
235
+ obj -> parityType = UART_PAR_EVEN ;
236
+ break ;
237
+ case ParityForced1 :
238
+ obj -> parityType = UART_PAR_ONE ;
239
+ break ;
240
+ case ParityForced0 :
241
+ obj -> parityType = UART_PAR_ZERO ;
242
+ break ;
243
+ default :
244
+ obj -> parityType = UART_PAR_NONE ;
245
+ break ;
230
246
}
231
247
232
- switch (data_bits ) {
233
- case 0 : obj -> dataLength = UART_LEN_5 ; break ;
234
- case 1 : obj -> dataLength = UART_LEN_6 ; break ;
235
- case 2 : obj -> dataLength = UART_LEN_7 ; break ;
236
- case 3 : obj -> dataLength = UART_LEN_8 ; break ;
237
- default : obj -> dataLength = UART_LEN_8 ; break ;
248
+ switch (data_bits ) {
249
+ case 0 :
250
+ obj -> dataLength = UART_LEN_5 ;
251
+ break ;
252
+ case 1 :
253
+ obj -> dataLength = UART_LEN_6 ;
254
+ break ;
255
+ case 2 :
256
+ obj -> dataLength = UART_LEN_7 ;
257
+ break ;
258
+ case 3 :
259
+ obj -> dataLength = UART_LEN_8 ;
260
+ break ;
261
+ default :
262
+ obj -> dataLength = UART_LEN_8 ;
263
+ break ;
238
264
}
239
265
240
- switch (stop_bits ) {
241
- case 0 : obj -> stopBits = UART_STOP_ONE ; break ;
242
- case 1 : obj -> stopBits = UART_STOP_TWO ; break ;
243
- default : obj -> stopBits = UART_STOP_ONE ; break ;
266
+ switch (stop_bits ) {
267
+ case 0 :
268
+ obj -> stopBits = UART_STOP_ONE ;
269
+ break ;
270
+ case 1 :
271
+ obj -> stopBits = UART_STOP_TWO ;
272
+ break ;
273
+ default :
274
+ obj -> stopBits = UART_STOP_ONE ;
275
+ break ;
244
276
}
245
277
246
278
MAP_UARTConfigSetExpClk (obj -> baseAddr , MAP_PRCMPeripheralClockGet (obj -> peripheralId ),
247
279
obj -> baudRate , (dataLength [obj -> dataLength ] |
248
- stopBits [obj -> stopBits ] | parityType [obj -> parityType ]));
280
+ stopBits [obj -> stopBits ] | parityType [obj -> parityType ]));
249
281
}
250
282
251
283
/******************************************************************************
252
284
* INTERRUPTS HANDLING
253
285
******************************************************************************/
254
- static inline void uart_irq (uint32_t intstatus , uint32_t index , CC3220SF_UART_TypeDef * puart ) {
255
- puart -> IM &= ~(UART_INT_RX | UART_INT_RT ); // disable RX interrupt
256
- (void )puart -> DR ;
257
- uint32_t rxErrors = puart -> RSR & 0x0000000F ;
258
- if (rxErrors ) {
259
- puart -> ECR = 0 ;
286
+ static inline void uart_irq (uint32_t intstatus , uint32_t index , CC3220SF_UART_TypeDef * puart )
287
+ {
288
+ SerialIrq irq_type ;
289
+ if (intstatus & UART_INT_TX ) {
290
+ irq_type = TxIrq ;
291
+ } else {
292
+ irq_type = RxIrq ;
260
293
}
261
- if (uart_data [index ].serial_irq_id != 0 ) {
262
- if ( intstatus & UART_INT_TX )
263
- irq_handler ( uart_data [ index ]. serial_irq_id , TxIrq );
264
- else
265
- irq_handler ( uart_data [ index ]. serial_irq_id , RxIrq );
294
+ if (( RxIrq == irq_type ) && ( NC != uart_data [index ].sw_rts . pin ) ) {
295
+ gpio_write ( & uart_data [ index ]. sw_rts , 1 );
296
+ // Disable interrupt if it wasn't enabled by other part of the application
297
+ if (! uart_data [ index ]. rx_irq_set_api )
298
+ puart -> IM &= ~( UART_INT_RX | UART_INT_RT );
266
299
}
267
- puart -> IM |= (UART_INT_RX | UART_INT_RT ); // enable RX interrupt
300
+ if (uart_data [index ].serial_irq_id != 0 )
301
+ if ((irq_type != RxIrq ) || (uart_data [index ].rx_irq_set_api ))
302
+ irq_handler (uart_data [index ].serial_irq_id , irq_type );
268
303
}
269
304
270
- void uart0_irq () {
305
+ void uart0_irq ()
306
+ {
271
307
uart_irq (CC3220SF_UART0 -> MIS , 0 , (CC3220SF_UART_TypeDef * )CC3220SF_UART0 );
272
308
}
273
- void uart1_irq () {
309
+ void uart1_irq ()
310
+ {
274
311
uart_irq (CC3220SF_UART1 -> MIS , 1 , (CC3220SF_UART_TypeDef * )CC3220SF_UART1 );
275
312
}
276
313
277
- void serial_irq_handler (serial_t * obj , uart_irq_handler handler , uint32_t id ) {
314
+ void serial_irq_handler (serial_t * obj , uart_irq_handler handler , uint32_t id )
315
+ {
278
316
irq_handler = handler ;
279
317
uart_data [obj -> index ].serial_irq_id = id ;
280
318
}
281
319
282
- void serial_irq_set_internal (serial_t * obj , SerialIrq irq , uint32_t enable ) {
320
+ void serial_irq_set_internal (serial_t * obj , SerialIrq irq , uint32_t enable )
321
+ {
283
322
IRQn_Type irq_n = (IRQn_Type )0 ;
284
323
uint32_t vector = 0 ;
285
324
@@ -288,8 +327,14 @@ void serial_irq_set_internal(serial_t *obj, SerialIrq irq, uint32_t enable) {
288
327
MAP_UARTIntClear (obj -> baseAddr , status );
289
328
290
329
switch ((int )obj -> uart ) {
291
- case UART_0 : irq_n = INT_UARTA0_IRQn ; vector = (uint32_t )& uart0_irq ; break ;
292
- case UART_1 : irq_n = INT_UARTA1_IRQn ; vector = (uint32_t )& uart1_irq ; break ;
330
+ case UART_0 :
331
+ irq_n = INT_UARTA0_IRQn ;
332
+ vector = (uint32_t )& uart0_irq ;
333
+ break ;
334
+ case UART_1 :
335
+ irq_n = INT_UARTA1_IRQn ;
336
+ vector = (uint32_t )& uart1_irq ;
337
+ break ;
293
338
}
294
339
295
340
if (enable ) {
@@ -307,54 +352,66 @@ void serial_irq_set_internal(serial_t *obj, SerialIrq irq, uint32_t enable) {
307
352
}
308
353
}
309
354
310
- void serial_irq_set (serial_t * obj , SerialIrq irq , uint32_t enable ) {
355
+ void serial_irq_set (serial_t * obj , SerialIrq irq , uint32_t enable )
356
+ {
357
+ if (RxIrq == irq ) uart_data [obj -> index ].rx_irq_set_api = enable ;
311
358
serial_irq_set_internal (obj , irq , enable );
312
359
}
313
360
314
- static void serial_flow_irq_set (serial_t * obj , uint32_t enable ) {
361
+ static void serial_flow_irq_set (serial_t * obj , uint32_t enable )
362
+ {
315
363
uart_data [obj -> index ].rx_irq_set_flow = enable ;
316
364
serial_irq_set_internal (obj , RxIrq , enable );
317
365
}
318
366
319
367
/******************************************************************************
320
368
* READ/WRITE
321
369
******************************************************************************/
322
- int serial_getc (serial_t * obj ) {
323
- while (!serial_readable (obj ));
324
- return obj -> uart -> DR ;
370
+ int serial_getc (serial_t * obj )
371
+ {
372
+ while (!serial_readable (obj ));
373
+ return obj -> uart -> DR ;
325
374
}
326
375
327
- void serial_putc (serial_t * obj , int c ) {
328
- while (!serial_writable (obj ));
329
- obj -> uart -> DR = c ;
376
+ void serial_putc (serial_t * obj , int c )
377
+ {
378
+ while (!serial_writable (obj ));
379
+ obj -> uart -> DR = c ;
330
380
}
331
381
332
- int serial_readable (serial_t * obj ) {
333
- return ((obj -> uart -> FR & UART_FR_RXFE ) ? 0 : 1 );
382
+ int serial_readable (serial_t * obj )
383
+ {
384
+ return ((obj -> uart -> FR & UART_FR_RXFE ) ? 0 : 1 );
334
385
}
335
386
336
- int serial_writable (serial_t * obj ) {
337
- return ((obj -> uart -> FR & UART_FR_TXFF ) ? 0 : 1 );
387
+ int serial_writable (serial_t * obj )
388
+ {
389
+ return ((obj -> uart -> FR & UART_FR_TXFF ) ? 0 : 1 );
338
390
}
339
391
340
- void serial_clear (serial_t * obj ) {
341
- obj -> uart -> DR = 0x00 ;
392
+ void serial_clear (serial_t * obj )
393
+ {
394
+ obj -> uart -> DR = 0x00 ;
342
395
}
343
396
344
- void serial_pinout_tx (PinName tx ) {
345
- pinmap_pinout (tx , PinMap_UART_TX );
397
+ void serial_pinout_tx (PinName tx )
398
+ {
399
+ pinmap_pinout (tx , PinMap_UART_TX );
346
400
}
347
401
348
- void serial_break_set (serial_t * obj ) {
349
- MAP_UARTBreakCtl (obj -> baseAddr , true);
402
+ void serial_break_set (serial_t * obj )
403
+ {
404
+ MAP_UARTBreakCtl (obj -> baseAddr , true);
350
405
}
351
406
352
- void serial_break_clear (serial_t * obj ) {
353
- MAP_UARTBreakCtl (obj -> baseAddr , false);
407
+ void serial_break_clear (serial_t * obj )
408
+ {
409
+ MAP_UARTBreakCtl (obj -> baseAddr , false);
354
410
}
355
411
356
- void serial_set_flow_control (serial_t * obj , FlowControl type , PinName rxflow , PinName txflow ) {
357
- switch (type ) {
412
+ void serial_set_flow_control (serial_t * obj , FlowControl type , PinName rxflow , PinName txflow )
413
+ {
414
+ switch (type ) {
358
415
case FlowControlRTS :
359
416
pinmap_pinout (rxflow , PinMap_UART_RTS );
360
417
MAP_UARTFlowControlSet (obj -> baseAddr , UART_FLOWCONTROL_RX );
0 commit comments