@@ -60,7 +60,6 @@ static void uart5_er_irq(void);
60
60
static void uart6_er_irq (void );
61
61
static void uart7_er_irq (void );
62
62
63
- static void serial_put_prepare (serial_t * obj );
64
63
static void serial_put_done (serial_t * obj );
65
64
static uint8_t serial_available_buffer (serial_t * obj );
66
65
static void serial_irq_err_set (serial_t * obj , uint32_t enable );
@@ -127,7 +126,7 @@ serial_t stdio_uart;
127
126
struct serial_global_data_s {
128
127
uint32_t serial_irq_id ;
129
128
gpio_t sw_rts , sw_cts ;
130
- uint8_t count , rx_irq_set_flow , rx_irq_set_api ;
129
+ uint8_t rx_irq_set_flow , rx_irq_set_api ;
131
130
serial_t * tranferring_obj , * receiving_obj ;
132
131
uint32_t async_tx_callback , async_rx_callback ;
133
132
int event , wanted_rx_events ;
@@ -296,7 +295,7 @@ void serial_init(serial_t *obj, PinName tx, PinName rx) {
296
295
297
296
/* ---- Serial control register (SCSCR) setting ---- */
298
297
/* Setting the TE and RE bits enables the TxD and RxD pins to be used. */
299
- obj -> serial .uart -> SCSCR = 0x00F0 ;
298
+ obj -> serial .uart -> SCSCR = 0x0070 ;
300
299
301
300
is_stdio_uart = (uart == STDIO_UART ) ? (1 ) : (0 );
302
301
@@ -399,7 +398,7 @@ void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_b
399
398
break ;
400
399
}
401
400
402
- obj -> serial .uart -> SCSMR = data_bits << 6
401
+ obj -> serial .uart -> SCSMR = data_bits << 6
403
402
| parity_enable << 5
404
403
| parity_select << 4
405
404
| stop_bits << 3 ;
@@ -413,7 +412,7 @@ static void uart_tx_irq(IRQn_Type irq_num, uint32_t index) {
413
412
__IO uint16_t * dmy_rd_scscr ;
414
413
__IO uint16_t * dmy_rd_scfsr ;
415
414
serial_t * obj ;
416
- size_t i ;
415
+ int i ;
417
416
418
417
dmy_rd_scscr = SCSCR_MATCH [index ];
419
418
* dmy_rd_scscr &= 0x007B ; // Clear TIE and Write to bit15~8,2 is always 0
@@ -422,10 +421,8 @@ static void uart_tx_irq(IRQn_Type irq_num, uint32_t index) {
422
421
423
422
obj = uart_data [index ].tranferring_obj ;
424
423
if (obj ) {
425
- serial_put_done (obj );
426
424
i = obj -> tx_buff .length - obj -> tx_buff .pos ;
427
425
if (0 < i ) {
428
- serial_put_prepare (obj );
429
426
if (serial_available_buffer (obj ) < i ) {
430
427
i = serial_available_buffer (obj );
431
428
}
@@ -435,12 +432,12 @@ static void uart_tx_irq(IRQn_Type irq_num, uint32_t index) {
435
432
++ obj -> tx_buff .pos ;
436
433
obj -> serial .uart -> SCFTDR = c ;
437
434
} while (-- i );
435
+ serial_put_done (obj );
438
436
} else {
439
437
uart_data [index ].tranferring_obj = NULL ;
440
438
uart_data [index ].event = SERIAL_EVENT_TX_COMPLETE ;
441
439
((void (* )())uart_data [index ].async_tx_callback )();
442
440
}
443
- __v7_inv_icache_all ();
444
441
}
445
442
446
443
irq_handler (uart_data [index ].serial_irq_id , TxIrq );
@@ -492,7 +489,6 @@ static void uart_rx_irq(IRQn_Type irq_num, uint32_t index) {
492
489
((void (* )())uart_data [index ].async_rx_callback )();
493
490
}
494
491
}
495
- __v7_inv_icache_all ();
496
492
} else {
497
493
serial_rx_abort_asynch (obj );
498
494
if (uart_data [index ].wanted_rx_events & (SERIAL_EVENT_RX_PARITY_ERROR | SERIAL_EVENT_RX_FRAMING_ERROR )) {
@@ -718,40 +714,25 @@ int serial_getc(serial_t *obj) {
718
714
return data ;
719
715
}
720
716
721
- static void serial_put_prepare (serial_t * obj )
722
- {
723
- int was_masked ;
724
-
725
- #if defined ( __ICCARM__ )
726
- was_masked = __disable_irq_iar ();
727
- #else
728
- was_masked = __disable_irq ();
729
- #endif /* __ICCARM__ */
730
- obj -> serial .uart -> SCSCR |= 0x0080 ; // Set TIE
731
- if (!was_masked ) {
732
- __enable_irq ();
733
- }
734
- while (!serial_writable (obj ));
735
- }
736
-
737
717
void serial_putc (serial_t * obj , int c ) {
738
- serial_put_prepare ( obj );
718
+ while (! serial_writable ( obj ) );
739
719
obj -> serial .uart -> SCFTDR = c ;
740
720
serial_put_done (obj );
741
- uart_data [obj -> serial .index ].count ++ ;
742
721
}
743
722
744
723
static void serial_put_done (serial_t * obj )
745
724
{
746
725
int was_masked ;
747
- uint16_t dummy_read ;
726
+ volatile uint16_t dummy_read ;
727
+
748
728
#if defined ( __ICCARM__ )
749
729
was_masked = __disable_irq_iar ();
750
730
#else
751
731
was_masked = __disable_irq ();
752
732
#endif /* __ICCARM__ */
753
733
dummy_read = obj -> serial .uart -> SCFSR ;
754
734
obj -> serial .uart -> SCFSR = (dummy_read & 0xff9f ); // Clear TEND/TDFE
735
+ obj -> serial .uart -> SCSCR |= 0x0080 ; // Set TIE
755
736
if (!was_masked ) {
756
737
__enable_irq ();
757
738
}
@@ -884,7 +865,7 @@ int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length, uint8_t tx
884
865
data -> async_tx_callback = handler ;
885
866
serial_irq_set (obj , TxIrq , 1 );
886
867
887
- serial_put_prepare ( obj );
868
+ while (! serial_writable ( obj ) );
888
869
i = buf -> length ;
889
870
if (serial_available_buffer (obj ) < i ) {
890
871
i = serial_available_buffer (obj );
@@ -895,6 +876,7 @@ int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length, uint8_t tx
895
876
++ buf -> pos ;
896
877
obj -> serial .uart -> SCFTDR = c ;
897
878
} while (-- i );
879
+ serial_put_done (obj );
898
880
899
881
return buf -> length ;
900
882
}
0 commit comments