@@ -118,7 +118,6 @@ void uart_configure_pin_function(PinName pin, UARTName uart, const PinMap *map);
118
118
*/
119
119
120
120
void serial_init (serial_t * obj , PinName tx , PinName rx ) {
121
- //TODO: we should be able to call this multiple times
122
121
// determine the UART to use
123
122
UARTName uart_tx = (UARTName )pinmap_peripheral (tx , serial_tx_pinmap ());
124
123
UARTName uart_rx = (UARTName )pinmap_peripheral (rx , serial_rx_pinmap ());
@@ -127,41 +126,41 @@ void serial_init(serial_t *obj, PinName tx, PinName rx) {
127
126
obj -> serial .uart_control = & ap3_uart_control [uart ];
128
127
obj -> serial .uart_control -> inst = uart ;
129
128
130
- // ensure that HAL queueing is disabled (we want to use the FIFOs directly)
131
- obj -> serial .uart_control -> cfg .pui8RxBuffer = NULL ;
132
- obj -> serial .uart_control -> cfg .pui8TxBuffer = NULL ;
133
- obj -> serial .uart_control -> cfg .ui32RxBufferSize = 0 ;
134
- obj -> serial .uart_control -> cfg .ui32TxBufferSize = 0 ;
135
-
136
- // memset(obj->serial.uart_control->cfg, 0x00, sizeof(am_hal_uart_config_t)); // ensure config begins zeroed
137
-
138
129
// config uart pins
139
130
pinmap_config (tx , serial_tx_pinmap ());
140
131
pinmap_config (rx , serial_rx_pinmap ());
141
132
142
- // start UART instance
143
- MBED_ASSERT (am_hal_uart_initialize (uart , & (obj -> serial .uart_control -> handle )) == AM_HAL_STATUS_SUCCESS );
144
- MBED_ASSERT (am_hal_uart_power_control (obj -> serial .uart_control -> handle , AM_HAL_SYSCTRL_WAKE , false) == AM_HAL_STATUS_SUCCESS );
145
- MBED_ASSERT (am_hal_uart_configure (obj -> serial .uart_control -> handle , & (obj -> serial .uart_control -> cfg )) == AM_HAL_STATUS_SUCCESS );
133
+ if (!obj -> serial .uart_control -> handle ) {
134
+ // if handle uninitialized this is first time set up
135
+ // ensure that HAL queueing is disabled (we want to use the FIFOs directly)
136
+ obj -> serial .uart_control -> cfg .pui8RxBuffer = NULL ;
137
+ obj -> serial .uart_control -> cfg .pui8TxBuffer = NULL ;
138
+ obj -> serial .uart_control -> cfg .ui32RxBufferSize = 0 ;
139
+ obj -> serial .uart_control -> cfg .ui32TxBufferSize = 0 ;
140
+
141
+ obj -> serial .uart_control -> cfg .ui32FifoLevels = AM_HAL_UART_RX_FIFO_7_8 ;
142
+
143
+ // start UART instance
144
+ MBED_ASSERT (am_hal_uart_initialize (uart , & (obj -> serial .uart_control -> handle )) == AM_HAL_STATUS_SUCCESS );
145
+ MBED_ASSERT (am_hal_uart_power_control (obj -> serial .uart_control -> handle , AM_HAL_SYSCTRL_WAKE , false) == AM_HAL_STATUS_SUCCESS );
146
+ MBED_ASSERT (am_hal_uart_configure_fifo (obj -> serial .uart_control -> handle , & (obj -> serial .uart_control -> cfg ), false) == AM_HAL_STATUS_SUCCESS );
146
147
147
- // set default baud rate and format
148
- serial_baud (obj , 9600 );
149
- serial_format ( obj , 8 , ParityNone , 1 );
148
+ // set default format
149
+ serial_format (obj , 8 , ParityNone , 1 );
150
+ }
150
151
}
151
152
152
- void serial_free (serial_t * obj )
153
- {
153
+ void serial_free (serial_t * obj ) {
154
154
// nothing to do unless resources are allocated for members of the serial_s serial member of obj
155
155
// assuming mbed handles obj and its members
156
156
}
157
157
158
158
void serial_baud (serial_t * obj , int baudrate ) {
159
159
obj -> serial .uart_control -> cfg .ui32BaudRate = (uint32_t )baudrate ;
160
- MBED_ASSERT (am_hal_uart_configure (obj -> serial .uart_control -> handle , & (obj -> serial .uart_control -> cfg )) == AM_HAL_STATUS_SUCCESS );
160
+ MBED_ASSERT (am_hal_uart_configure_fifo (obj -> serial .uart_control -> handle , & (obj -> serial .uart_control -> cfg ), false ) == AM_HAL_STATUS_SUCCESS );
161
161
}
162
162
163
- void serial_format (serial_t * obj , int data_bits , SerialParity parity , int stop_bits )
164
- {
163
+ void serial_format (serial_t * obj , int data_bits , SerialParity parity , int stop_bits ) {
165
164
uint32_t am_hal_data_bits = 0 ;
166
165
switch (data_bits ) {
167
166
case 5 :
@@ -214,36 +213,44 @@ void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_b
214
213
obj -> serial .uart_control -> cfg .ui32DataBits = (uint32_t )am_hal_data_bits ;
215
214
obj -> serial .uart_control -> cfg .ui32Parity = (uint32_t )am_hal_parity ;
216
215
obj -> serial .uart_control -> cfg .ui32StopBits = (uint32_t )am_hal_stop_bits ;
217
- MBED_ASSERT (am_hal_uart_configure (obj -> serial .uart_control -> handle , & (obj -> serial .uart_control -> cfg )) == AM_HAL_STATUS_SUCCESS );
216
+ MBED_ASSERT (am_hal_uart_configure_fifo (obj -> serial .uart_control -> handle , & (obj -> serial .uart_control -> cfg ), false ) == AM_HAL_STATUS_SUCCESS );
218
217
}
219
218
220
- void serial_irq_handler (serial_t * obj , uart_irq_handler handler , uint32_t id )
221
- {
219
+ void serial_irq_handler (serial_t * obj , uart_irq_handler handler , uint32_t id ) {
222
220
irq_handler = handler ;
223
221
obj -> serial .uart_control -> serial_irq_id = id ;
224
222
}
225
223
226
- void serial_irq_set (serial_t * obj , SerialIrq irq , uint32_t enable )
227
- {
228
- MBED_ASSERT (obj -> serial .uart_control != NULL );
229
-
230
- am_hal_uart_interrupt_enable (obj -> serial .uart_control -> handle , (AM_HAL_UART_INT_RX | AM_HAL_UART_INT_TX | AM_HAL_UART_INT_TXCMP ));
231
-
232
- switch (obj -> serial .uart_control -> inst )
233
- {
234
- case 0 :
235
- NVIC_SetVector ((IRQn_Type )UART0_IRQn , (uint32_t )am_uart_isr );
236
- break ;
237
- case 1 :
238
- NVIC_SetVector ((IRQn_Type )UART1_IRQn , (uint32_t )am_uart1_isr );
239
- break ;
224
+ void serial_irq_set (serial_t * obj , SerialIrq irq , uint32_t enable ) {
225
+ MBED_ASSERT (obj -> serial .uart_control -> handle != NULL );
226
+ if (enable ) {
227
+ switch (irq ) {
228
+ case RxIrq :
229
+ MBED_ASSERT (am_hal_uart_interrupt_enable (obj -> serial .uart_control -> handle , AM_HAL_UART_INT_RX ) == AM_HAL_STATUS_SUCCESS );
230
+ break ;
231
+ case TxIrq :
232
+ MBED_ASSERT (am_hal_uart_interrupt_enable (obj -> serial .uart_control -> handle , AM_HAL_UART_INT_TXCMP ) == AM_HAL_STATUS_SUCCESS );
233
+ break ;
234
+ default :
235
+ break ;
236
+ }
237
+ // NVIC_SetVector(uart_irqs[obj->serial.index], vector);
238
+ NVIC_EnableIRQ ((IRQn_Type )(UART0_IRQn + obj -> serial .uart_control -> inst ));
239
+ } else { // disable
240
+ switch (irq ) {
241
+ case RxIrq :
242
+ MBED_ASSERT (am_hal_uart_interrupt_disable (obj -> serial .uart_control -> handle , AM_HAL_UART_INT_RX ) == AM_HAL_STATUS_SUCCESS );
243
+ break ;
244
+ case TxIrq :
245
+ MBED_ASSERT (am_hal_uart_interrupt_disable (obj -> serial .uart_control -> handle , AM_HAL_UART_INT_TXCMP ) == AM_HAL_STATUS_SUCCESS );
246
+ break ;
247
+ default :
248
+ break ;
249
+ }
240
250
}
241
-
242
- NVIC_EnableIRQ ((IRQn_Type )(UART0_IRQn + obj -> serial .uart_control -> inst ));
243
251
}
244
252
245
- int serial_getc (serial_t * obj )
246
- {
253
+ int serial_getc (serial_t * obj ) {
247
254
MBED_ASSERT (obj -> serial .uart_control != NULL );
248
255
249
256
uint8_t rx_c = 0x00 ;
@@ -263,8 +270,7 @@ int serial_getc(serial_t *obj)
263
270
return (int )rx_c ;
264
271
}
265
272
266
- void serial_putc (serial_t * obj , int c )
267
- {
273
+ void serial_putc (serial_t * obj , int c ) {
268
274
MBED_ASSERT (obj -> serial .uart_control != NULL );
269
275
270
276
volatile uint32_t bytes_sent = 0 ;
@@ -343,72 +349,6 @@ const PinMap *serial_rts_pinmap(void) {
343
349
}
344
350
#endif
345
351
346
- #if DEVICE_SERIAL_ASYNCH
347
-
348
- int serial_tx_asynch (serial_t * obj , const void * tx , size_t tx_length , uint8_t tx_width , uint32_t handler , uint32_t event , DMAUsage hint )
349
- {
350
- MBED_ASSERT (obj -> serial .uart_control != NULL );
351
- uint32_t bytes_written = 0 ;
352
-
353
- am_hal_uart_transfer_t am_hal_uart_xfer_write = {
354
- .ui32Direction = AM_HAL_UART_WRITE ,
355
- .pui8Data = (uint8_t * )obj -> tx_buff .buffer ,
356
- .ui32NumBytes = tx_length , // todo: consider maybe this? (uint32_t)obj->tx_buff.length,
357
- .ui32TimeoutMs = 0 ,
358
- .pui32BytesTransferred = & bytes_written ,
359
- };
360
-
361
- am_hal_uart_transfer (obj -> serial .uart_control -> handle , & am_hal_uart_xfer_write );
362
-
363
- return (int )bytes_written ;
364
- }
365
-
366
- void serial_rx_asynch (serial_t * obj , void * rx , size_t rx_length , uint8_t rx_width , uint32_t handler , uint32_t event , uint8_t char_match , DMAUsage hint )
367
- {
368
- // todo: revisit
369
- MBED_ASSERT (obj -> serial .uart_control != NULL );
370
- uint32_t bytes_read = 0 ;
371
-
372
- am_hal_uart_transfer_t am_hal_uart_xfer_read = {
373
- .ui32Direction = AM_HAL_UART_READ ,
374
- .pui8Data = (uint8_t * )obj -> rx_buff .buffer ,
375
- .ui32NumBytes = rx_length , // todo: consider this (uint32_t)obj->rx_buff.length,
376
- .ui32TimeoutMs = 0 ,
377
- .pui32BytesTransferred = & bytes_read ,
378
- };
379
-
380
- am_hal_uart_transfer (obj -> serial .uart_control -> handle , & am_hal_uart_xfer_read );
381
- }
382
-
383
- uint8_t serial_tx_active (serial_t * obj ) {
384
- // todo:
385
- MBED_ASSERT (0 );
386
- }
387
-
388
- uint8_t serial_rx_active (serial_t * obj ) {
389
- // todo:
390
- MBED_ASSERT (0 );
391
- }
392
-
393
- int serial_irq_handler_asynch (serial_t * obj ) {
394
- // todo:
395
- MBED_ASSERT (0 );
396
- }
397
-
398
- void serial_tx_abort_asynch (serial_t * obj ) {
399
- // todo:
400
- MBED_ASSERT (0 );
401
- }
402
-
403
- void serial_rx_abort_asynch (serial_t * obj ) {
404
- // todo:
405
- MBED_ASSERT (0 );
406
- }
407
-
408
- /**@}*/
409
-
410
- #endif
411
-
412
352
static inline void uart_irq (uint32_t instance )
413
353
{
414
354
void * handle = ap3_uart_control [instance ].handle ;
@@ -434,7 +374,6 @@ static inline void uart_irq(uint32_t instance)
434
374
}
435
375
436
376
extern void am_uart_isr (void ) {
437
- am_hal_gpio_output_set (16 ); // todo: this should not be here!
438
377
uart_irq (UART_0 );
439
378
}
440
379
@@ -448,4 +387,4 @@ extern void am_uart1_isr(void) {
448
387
449
388
#endif
450
389
451
- /** @}*/
390
+ /** @}*/
0 commit comments