@@ -125,6 +125,8 @@ static int serial_fops_ioctl(struct dfs_file *fd, int cmd, void *args)
125125 fd -> flags &= ~mask ;
126126 fd -> flags |= flags ;
127127 break ;
128+ default :
129+ break ;
128130 }
129131
130132 return rt_device_control (device , cmd , args );
@@ -204,13 +206,10 @@ static ssize_t serial_fops_write(struct dfs_file *fd, const void *buf, size_t co
204206
205207static int serial_fops_flush (struct dfs_file * fd )
206208{
207- rt_device_t device ;
208- struct rt_serial_device * serial ;
209-
209+ rt_device_t device ;
210210 device = (rt_device_t )fd -> vnode -> data ;
211211 RT_ASSERT (device != RT_NULL );
212212
213- serial = (struct rt_serial_device * )device ;
214213 rt_device_control (device , RT_SERIAL_CTRL_TX_FLUSH , (void * )RT_NULL );
215214 rt_device_control (device , RT_SERIAL_CTRL_RX_FLUSH , (void * )RT_NULL );
216215
@@ -379,8 +378,8 @@ rt_ssize_t _serial_poll_rx(struct rt_device *dev,
379378 int getc_element ; /* Gets one byte of data received */
380379 rt_uint8_t * getc_buffer ; /* Pointer to the receive data buffer */
381380
382- if (size == 0 ) return 0 ;
383381 RT_ASSERT (dev != RT_NULL && buffer != RT_NULL );
382+ if (size == 0 ) return 0 ;
384383
385384 serial = (struct rt_serial_device * )dev ;
386385 getc_buffer = (rt_uint8_t * )buffer ;
@@ -482,15 +481,16 @@ static rt_ssize_t _serial_fifo_rx(struct rt_device *dev,
482481 if (dev -> open_flag & RT_SERIAL_RX_BLOCKING )
483482 {
484483 rt_size_t data_len ;
485- rt_tick_t now_tick ;
484+ rt_tick_t delta_tick ;
486485 rt_size_t rx_bufsz_third = serial -> config .rx_bufsz / 2 ;
487486 rt_int32_t base_rx_timeout = rt_atomic_load (& rx_fifo -> rx_timeout );
488- rt_int32_t rx_timeout = base_rx_timeout ;
487+ rt_int32_t rx_timeout_left = base_rx_timeout ;
489488 rt_tick_t begin_tick = rt_tick_get ();
490489
490+
491491 while (1 )
492492 {
493- if (rx_timeout != RT_WAITING_NO )
493+ if (rx_timeout_left != RT_WAITING_NO )
494494 {
495495 level = rt_spin_lock_irqsave (& serial -> spinlock );
496496 data_len = rt_ringbuffer_data_len (& rx_fifo -> rb );
@@ -512,26 +512,21 @@ static rt_ssize_t _serial_fifo_rx(struct rt_device *dev,
512512 level = RT_SERIAL_FIFO_LOCK (& serial -> spinlock );
513513 recv_size += rt_ringbuffer_get (& rx_fifo -> rb , (rt_uint8_t * )buffer + recv_size , size - recv_size );
514514 RT_SERIAL_FIFO_UNLOCK (& serial -> spinlock , level );
515- if (recv_size == size || rx_timeout == RT_WAITING_NO )
515+ if (recv_size == size || rx_timeout_left == RT_WAITING_NO )
516516 {
517517 break ;
518518 }
519519
520- rt_completion_wait (& rx_fifo -> rx_cpt , rx_timeout );
521- if (rx_timeout != RT_WAITING_FOREVER )
520+ rt_completion_wait (& rx_fifo -> rx_cpt , rx_timeout_left );
521+ if (rx_timeout_left != RT_WAITING_FOREVER )
522522 {
523- now_tick = rt_tick_get ( );
524- if (now_tick - begin_tick >= base_rx_timeout )
523+ delta_tick = rt_tick_get_delta ( begin_tick );
524+ if (delta_tick >= base_rx_timeout )
525525 {
526526 return - RT_ETIMEOUT ;
527527 }
528- else
529- {
530- if (now_tick > begin_tick )
531- rx_timeout = base_rx_timeout - (now_tick - begin_tick );
532- else
533- rx_timeout = begin_tick + base_rx_timeout - now_tick + 1 ;
534- }
528+
529+ rx_timeout_left = base_rx_timeout - delta_tick ;
535530 }
536531 }
537532 }
@@ -595,7 +590,7 @@ static rt_ssize_t _serial_fifo_tx_blocking_nbuf(struct rt_device *dev,
595590 size ,
596591 RT_SERIAL_TX_BLOCKING );
597592
598- if (rt_atomic_load (& tx_fifo -> tx_timeout ) == RT_WAITING_NO )
593+ if (send_size == 0 || rt_atomic_load (& tx_fifo -> tx_timeout ) == RT_WAITING_NO )
599594 {
600595 return send_size ;
601596 }
@@ -608,10 +603,8 @@ static rt_ssize_t _serial_fifo_tx_blocking_nbuf(struct rt_device *dev,
608603 {
609604 return ret ;
610605 }
611- else
612- {
613- return 0 ;
614- }
606+
607+ return 0 ;
615608 }
616609
617610 /* Inactive tx mode flag */
@@ -657,9 +650,9 @@ static rt_ssize_t _serial_fifo_tx_blocking_buf(struct rt_device *dev,
657650 return 0 ;
658651 }
659652
660- rt_tick_t now_tick ;
653+ rt_tick_t delta_tick ;
661654 rt_int32_t base_tx_timeout = rt_atomic_load (& tx_fifo -> tx_timeout );
662- rt_int32_t tx_timeout = base_tx_timeout ;
655+ rt_int32_t tx_timeout_left = base_tx_timeout ;
663656 rt_tick_t begin_tick = rt_tick_get ();
664657 rt_size_t send_size = 0 ;
665658
@@ -686,27 +679,22 @@ static rt_ssize_t _serial_fifo_tx_blocking_buf(struct rt_device *dev,
686679
687680 send_size += tx_fifo -> put_size ;
688681
689- if (tx_timeout == RT_WAITING_NO )
682+ if (tx_timeout_left == RT_WAITING_NO )
690683 {
691684 break ;
692685 }
693686
694687 /* Waiting for the transmission to complete */
695- rt_completion_wait (& tx_fifo -> tx_cpt , tx_timeout );
696- if (tx_timeout != RT_WAITING_FOREVER )
688+ rt_completion_wait (& tx_fifo -> tx_cpt , tx_timeout_left );
689+ if (tx_timeout_left != RT_WAITING_FOREVER )
697690 {
698- now_tick = rt_tick_get ( );
699- if (now_tick - begin_tick >= base_tx_timeout )
691+ delta_tick = rt_tick_get_delta ( begin_tick );
692+ if (delta_tick >= base_tx_timeout )
700693 {
701694 return - RT_ETIMEOUT ;
702695 }
703- else
704- {
705- if (now_tick > begin_tick )
706- tx_timeout = base_tx_timeout - (now_tick - begin_tick );
707- else
708- tx_timeout = begin_tick + base_tx_timeout - now_tick + 1 ;
709- }
696+
697+ tx_timeout_left = base_tx_timeout - delta_tick ;
710698 }
711699 }
712700
@@ -732,9 +720,9 @@ static rt_ssize_t _serial_fifo_tx_nonblocking(struct rt_device *dev,
732720{
733721 struct rt_serial_device * serial ;
734722 struct rt_serial_tx_fifo * tx_fifo ;
735- rt_uint8_t * put_ptr ;
723+ rt_uint8_t * put_ptr = RT_NULL ;
736724 rt_base_t level ;
737- rt_size_t send_size = 0 ;
725+ rt_size_t send_size ;
738726
739727 if (size == 0 ) return 0 ;
740728 RT_ASSERT (dev != RT_NULL && buffer != RT_NULL );
@@ -1252,15 +1240,14 @@ static rt_err_t _serial_get_unread_bytes_count(struct rt_serial_device *serial,
12521240 * unread_bytes = -1 ;
12531241 return - RT_EPERM ;
12541242 }
1255- else
1256- {
1257- rx_fifo = (struct rt_serial_rx_fifo * )serial -> serial_rx ;
1258- RT_ASSERT (rx_fifo != RT_NULL );
12591243
1260- level = RT_SERIAL_FIFO_LOCK (& serial -> spinlock );
1261- * unread_bytes = rt_ringbuffer_data_len (& rx_fifo -> rb );
1262- RT_SERIAL_FIFO_UNLOCK (& serial -> spinlock , level );
1263- }
1244+ rx_fifo = (struct rt_serial_rx_fifo * )serial -> serial_rx ;
1245+ RT_ASSERT (rx_fifo != RT_NULL );
1246+
1247+ level = RT_SERIAL_FIFO_LOCK (& serial -> spinlock );
1248+ * unread_bytes = rt_ringbuffer_data_len (& rx_fifo -> rb );
1249+ RT_SERIAL_FIFO_UNLOCK (& serial -> spinlock , level );
1250+
12641251 return RT_EOK ;
12651252}
12661253
@@ -1384,6 +1371,17 @@ static rt_err_t rt_serial_control(struct rt_device *dev,
13841371 serial -> ops -> configure (serial , (struct serial_configure * )args );
13851372 }
13861373 break ;
1374+ case RT_SERIAL_CTRL_GET_CONFIG :
1375+ if (args == RT_NULL )
1376+ {
1377+ ret = - RT_EINVAL ;
1378+ }
1379+ else
1380+ {
1381+ struct serial_configure * pconfig = (struct serial_configure * )args ;
1382+ * pconfig = serial -> config ;
1383+ }
1384+ break ;
13871385 case RT_DEVICE_CTRL_NOTIFY_SET :
13881386 if (args == RT_NULL )
13891387 {
@@ -1944,21 +1942,17 @@ void rt_hw_serial_isr(struct rt_serial_device *serial, int event)
19441942#ifdef RT_SERIAL_BUF_STRATEGY_DROP
19451943 rt_uint8_t * ptr ;
19461944 rt_size_t size ;
1947- rt_size_t space_len ;
1945+ rt_size_t put_len ;
19481946 /* UART_IT_IDLE and dma isr */
19491947 level = rt_spin_lock_irqsave (& serial -> spinlock );
19501948 do
19511949 {
1952- space_len = rt_ringbuffer_space_len (& rx_fifo -> rb );
1953- if (space_len == 0 )
1954- break ;
1955-
19561950 rt_serial_update_write_index (& rx_fifo -> dma_ping_rb , rx_length );
19571951
19581952 size = rt_ringbuffer_peek (& rx_fifo -> dma_ping_rb , & ptr );
19591953
1960- space_len - = rt_ringbuffer_put (& rx_fifo -> rb , ptr , size );
1961- if (space_len == 0 )
1954+ put_len = rt_ringbuffer_put (& rx_fifo -> rb , ptr , size );
1955+ if (put_len != size )
19621956 break ;
19631957
19641958 size = rt_ringbuffer_peek (& rx_fifo -> dma_ping_rb , & ptr );
@@ -1973,9 +1967,10 @@ void rt_hw_serial_isr(struct rt_serial_device *serial, int event)
19731967 rt_size_t size ;
19741968 /* UART_IT_IDLE and dma isr */
19751969 level = rt_spin_lock_irqsave (& serial -> spinlock );
1976- rt_serial_update_write_index (& rx_fifo -> dma_ping_rb , rx_length );
19771970 do
19781971 {
1972+ rt_serial_update_write_index (& rx_fifo -> dma_ping_rb , rx_length );
1973+
19791974 size = rt_ringbuffer_peek (& rx_fifo -> dma_ping_rb , & ptr );
19801975
19811976 rt_ringbuffer_put_force (& rx_fifo -> rb , ptr , size );
@@ -2022,8 +2017,8 @@ void rt_hw_serial_isr(struct rt_serial_device *serial, int event)
20222017 /* Interrupt transmit event */
20232018 case RT_SERIAL_EVENT_TX_DONE : {
20242019 struct rt_serial_tx_fifo * tx_fifo ;
2025- rt_size_t tx_length = 0 ;
2026- tx_fifo = (struct rt_serial_tx_fifo * )serial -> serial_tx ;
2020+ rt_size_t tx_length ;
2021+ tx_fifo = (struct rt_serial_tx_fifo * )serial -> serial_tx ;
20272022 RT_ASSERT (tx_fifo != RT_NULL );
20282023
20292024 /* Get the length of the data from the ringbuffer */
@@ -2059,12 +2054,13 @@ void rt_hw_serial_isr(struct rt_serial_device *serial, int event)
20592054#ifdef RT_SERIAL_USING_DMA
20602055 case RT_SERIAL_EVENT_TX_DMADONE : {
20612056 struct rt_serial_tx_fifo * tx_fifo ;
2062- rt_size_t tx_length = 0 ;
2063- tx_fifo = (struct rt_serial_tx_fifo * )serial -> serial_tx ;
2057+ rt_size_t tx_length ;
2058+ tx_fifo = (struct rt_serial_tx_fifo * )serial -> serial_tx ;
20642059 RT_ASSERT (tx_fifo != RT_NULL );
2065- if ((serial -> parent .open_flag & RT_SERIAL_TX_BLOCKING ) != RT_SERIAL_TX_BLOCKING || rt_ringbuffer_get_size (& tx_fifo -> rb ) != 0 )
2060+ /* nonblock */
2061+ if ((serial -> parent .open_flag & RT_SERIAL_TX_BLOCKING ) != RT_SERIAL_TX_BLOCKING )
20662062 {
2067- // 每次进来中断就说明之前的put_size已经被发送完毕了
2063+ /* Each interruption upon entry indicates that the previous `put_size` has already been sent completely */
20682064 rt_serial_update_read_index (& tx_fifo -> rb , tx_fifo -> put_size );
20692065
20702066 /* Get the length of the data from the ringbuffer */
0 commit comments