Переглянути джерело

fix bluetrum uart1 and uart2 cannot recv data

yaoyufan 4 роки тому
батько
коміт
e2d4a912be
1 змінених файлів з 30 додано та 9 видалено
  1. 30 9
      bsp/bluetrum/libraries/hal_drivers/drv_usart.c

+ 30 - 9
bsp/bluetrum/libraries/hal_drivers/drv_usart.c

@@ -221,18 +221,39 @@ void uart_irq_process(struct rt_serial_device *serial)
         rt_hw_interrupt_enable(level);
     }
 
-    rt_size_t rx_length;
+    if(serial == &uart_obj[0].serial)
+    {
+        rt_size_t rx_length;
 
-    /* get rx length */
-    level = rt_hw_interrupt_disable();
-    rx_length = (rx_fifo->put_index >= rx_fifo->get_index)? (rx_fifo->put_index - rx_fifo->get_index):
-        (serial->config.bufsz - (rx_fifo->get_index - rx_fifo->put_index));
-    rt_hw_interrupt_enable(level);
+        /* get rx length */
+        level = rt_hw_interrupt_disable();
+        rx_length = (rx_fifo->put_index >= rx_fifo->get_index)? (rx_fifo->put_index - rx_fifo->get_index):
+            (serial->config.bufsz - (rx_fifo->get_index - rx_fifo->put_index));
+        rt_hw_interrupt_enable(level);
 
-    if (rx_length)
-    {
-        shell_rx_ind();
+        if (rx_length)
+        {
+            shell_rx_ind();
+        }
+    }else {
+        /* invoke callback */
+        if (serial->parent.rx_indicate != RT_NULL)
+        {
+            rt_size_t rx_length;
+
+            /* get rx length */
+            level = rt_hw_interrupt_disable();
+            rx_length = (rx_fifo->put_index >= rx_fifo->get_index)? (rx_fifo->put_index - rx_fifo->get_index):
+                (serial->config.bufsz - (rx_fifo->get_index - rx_fifo->put_index));
+            rt_hw_interrupt_enable(level);
+
+            if (rx_length)
+            {
+                serial->parent.rx_indicate(&serial->parent, rx_length);
+            }
+        }
     }
+
 }
 
 RT_SECTION(".irq.usart")