Kaynağa Gözat

*** EFM32 branch ***
Fix the bug in USART write, which is introduced by changing SPI write format

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1884 bbd45198-f89e-11dd-88c7-29a3b14d5316

onelife.real 13 yıl önce
ebeveyn
işleme
3f0b614ad3
1 değiştirilmiş dosya ile 72 ekleme ve 64 silme
  1. 72 64
      bsp/efm32/drv_usart.c

+ 72 - 64
bsp/efm32/drv_usart.c

@@ -505,7 +505,7 @@ static rt_size_t rt_usart_read (
                 while (!(usart_device->STATUS & rx_flag));
                 *((rt_uint32_t *)0x00) = usart_device->RXDATA;
             }
-
+            /* Read data */
             while (((rt_uint32_t)ptr - (rt_uint32_t)rx_buf) < size)
             {
                 /* dummy write */
@@ -573,11 +573,9 @@ static rt_size_t rt_usart_write (
     rt_size_t       size)
 {
     rt_err_t err_code;
-    rt_size_t write_size    = 0;
+    rt_size_t write_size = 0;
     struct efm32_usart_device_t* usart = (struct efm32_usart_device_t*)(dev->user_data);
-    rt_uint8_t inst_len     = *((rt_uint8_t *)buffer);
-    rt_uint8_t *inst_ptr    = (rt_uint8_t *)(buffer + 1);
-    rt_uint8_t *tx_buf      = *((rt_uint8_t **)(buffer + inst_len + 1));
+    rt_uint8_t *tx_buf;
     rt_uint32_t tx_flag, b8_flag;
 
 #if defined(UART_PRESENT)
@@ -608,74 +606,84 @@ static rt_size_t rt_usart_write (
         return 0;
     }
 
-    if (dev->flag & RT_DEVICE_FLAG_STREAM)
-    {
-        if (*(tx_buf + size - 1) == '\n')
-        {
-            *(tx_buf + size - 1) = '\r';
-            *(tx_buf + size++) = '\n';
-            *(tx_buf + size) = 0;
-        }
-    }
+    if (usart->state & USART_STATE_SYNC)
+    {   /* SPI write */
+        rt_uint8_t inst_len     = *((rt_uint8_t *)buffer);
+        rt_uint8_t *inst_ptr    = (rt_uint8_t *)(buffer + 1);
+        tx_buf = *((rt_uint8_t **)(buffer + inst_len + 1));
 
-    /* Write instructions */
-    if (inst_len)
-    {
-        if (usart->state & USART_STATE_9BIT)
+        /* Write instructions */
+        if (inst_len)
         {
-            usart->usart_device->CTRL &= ~b8_flag;
-        }
-        if ((dev->flag & RT_DEVICE_FLAG_DMA_TX) && (inst_len > 2))
-        {   /* DMA mode Tx */
-            struct efm32_usart_dma_mode_t *dma_tx;
-
-            usart_debug("USART: DMA TX INS (%d)\n", inst_len);
-            dma_tx = (struct efm32_usart_dma_mode_t *)(usart->tx_mode);
-            dma_tx->data_ptr = (rt_uint32_t *)inst_ptr;
-            dma_tx->data_size = inst_len;
-
-            usart->state |= USART_STATE_TX_BUSY;
-            DMA_ActivateBasic(
-                dma_tx->dma_channel,
-                true,
-                false,
-                (void *)&(usart->usart_device->TXDATA),
-                (void *)inst_ptr,
-                (rt_uint32_t)(inst_len - 1));
-            /* Wait, otherwise the TX buffer is overwrite */
-            // TODO: This function blocks the process => goto low power mode?
-    //      if (usart->state & USART_STATE_CONSOLE)
-    //      {
-                while(usart->state & USART_STATE_TX_BUSY);
-    //      }
-    //      else
-    //      {
-    //          while(usart->state & USART_STATE_TX_BUSY)
-    //          {
-    //              rt_thread_sleep(USART_WAIT_TIME_TX);
-    //          }
-    //      }
-        }
-        else
-        {   /* polling mode */
-            rt_uint8_t *ptr = (rt_uint8_t *)inst_ptr;
-            rt_size_t len = inst_len;
+            if (usart->state & USART_STATE_9BIT)
+            {
+                usart->usart_device->CTRL &= ~b8_flag;
+            }
+            if ((dev->flag & RT_DEVICE_FLAG_DMA_TX) && (inst_len > 2))
+            {   /* DMA mode Tx */
+                struct efm32_usart_dma_mode_t *dma_tx;
+
+                usart_debug("USART: DMA TX INS (%d)\n", inst_len);
+                dma_tx = (struct efm32_usart_dma_mode_t *)(usart->tx_mode);
+                dma_tx->data_ptr = (rt_uint32_t *)inst_ptr;
+                dma_tx->data_size = inst_len;
+
+                usart->state |= USART_STATE_TX_BUSY;
+                DMA_ActivateBasic(
+                    dma_tx->dma_channel,
+                    true,
+                    false,
+                    (void *)&(usart->usart_device->TXDATA),
+                    (void *)inst_ptr,
+                    (rt_uint32_t)(inst_len - 1));
+                /* Wait, otherwise the TX buffer is overwrite */
+                // TODO: This function blocks the process => goto low power mode?
+        //      if (usart->state & USART_STATE_CONSOLE)
+        //      {
+                    while(usart->state & USART_STATE_TX_BUSY);
+        //      }
+        //      else
+        //      {
+        //          while(usart->state & USART_STATE_TX_BUSY)
+        //          {
+        //              rt_thread_sleep(USART_WAIT_TIME_TX);
+        //          }
+        //      }
+            }
+            else
+            {   /* polling mode */
+                rt_uint8_t *ptr = (rt_uint8_t *)inst_ptr;
+                rt_size_t len = inst_len;
 
-            usart_debug("USART: Polling TX INS (%d)\n", inst_len);
-            while (len)
+                usart_debug("USART: Polling TX INS (%d)\n", inst_len);
+                while (len)
+                {
+                    while (!(usart->usart_device->STATUS & tx_flag));
+                    usart->usart_device->TXDATA = (rt_uint32_t)*ptr;
+                    ++ptr; --len;
+                }
+            }
+            if (usart->state & USART_STATE_9BIT)
             {
-                while (!(usart->usart_device->STATUS & tx_flag));
-                usart->usart_device->TXDATA = (rt_uint32_t)*ptr;
-                ++ptr; --len;
+                usart->usart_device->CTRL |= b8_flag;
             }
         }
-        if (usart->state & USART_STATE_9BIT)
-        {
-            usart->usart_device->CTRL |= b8_flag;
-        }
+    }
+    else
+    {
+        tx_buf = (rt_uint8_t *)buffer;
     }
 
     /* Write data */
+    if (dev->flag & RT_DEVICE_FLAG_STREAM)
+    {
+        if (*(tx_buf + size - 1) == '\n')
+        {
+            *(tx_buf + size - 1) = '\r';
+            *(tx_buf + size++) = '\n';
+            *(tx_buf + size) = 0;
+        }
+    }
     if ((dev->flag & RT_DEVICE_FLAG_DMA_TX) && (size > 2))
     {   /* DMA mode Tx */
         struct efm32_usart_dma_mode_t *dma_tx;