Browse Source

[net][at] Using DMA mode first when device is supported.

armink 6 years ago
parent
commit
ccfde36b4d

+ 1 - 1
components/net/at/include/at.h

@@ -27,7 +27,7 @@
 
 #include <rtthread.h>
 
-#define AT_SW_VERSION                  "0.2.1"
+#define AT_SW_VERSION                  "0.2.2"
 
 #define DBG_ENABLE
 #define DBG_SECTION_NAME               "AT"

+ 14 - 5
components/net/at/src/at_client.c

@@ -354,11 +354,12 @@ rt_size_t at_client_send(const char *buf, rt_size_t size)
 static char at_client_getchar(void)
 {
     char ch;
-    at_client_t client = at_client_local;
-
-    rt_sem_take(client->rx_notice, RT_WAITING_FOREVER);
 
-    rt_device_read(client->device, 0, &ch, 1);
+    if (rt_device_read(at_client_local->device, 0, &ch, 1) == 0)
+    {
+        rt_sem_take(at_client_local->rx_notice, RT_WAITING_FOREVER);
+        rt_device_read(at_client_local->device, 0, &ch, 1);
+    }
 
     return ch;
 }
@@ -604,6 +605,7 @@ void at_set_urc_table(const struct at_urc *table, rt_size_t size)
 int at_client_init(void)
 {
     int result = RT_EOK;
+    rt_err_t open_result = RT_EOK;
 
     if (at_client_local)
     {
@@ -651,7 +653,14 @@ int at_client_init(void)
     {
         RT_ASSERT(at_client_local->device->type == RT_Device_Class_Char);
 
-        rt_device_open(at_client_local->device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX);
+        /* using DMA mode first */
+        open_result = rt_device_open(at_client_local->device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_DMA_RX);
+        /* using interrupt mode when DMA mode not supported */
+        if (open_result == -RT_EIO)
+        {
+            open_result = rt_device_open(at_client_local->device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX);
+        }
+        RT_ASSERT(open_result == RT_EOK);
 
         rt_device_set_rx_indicate(at_client_local->device, at_client_rx_ind);
     }

+ 14 - 4
components/net/at/src/at_server.c

@@ -352,9 +352,11 @@ static char at_server_gerchar(void)
 {
     char ch;
 
-    rt_sem_take(at_server_local->rx_notice, RT_WAITING_FOREVER);
-
-    rt_device_read(at_server_local->device, 0, &ch, 1);
+    if (rt_device_read(at_server_local->device, 0, &ch, 1) == 0)
+    {
+        rt_sem_take(at_server_local->rx_notice, RT_WAITING_FOREVER);
+        rt_device_read(at_server_local->device, 0, &ch, 1);
+    }
 
     return ch;
 }
@@ -443,6 +445,7 @@ static rt_err_t at_rx_ind(rt_device_t dev, rt_size_t size)
 int at_server_init(void)
 {
     rt_err_t result = RT_EOK;
+    rt_err_t open_result = RT_EOK;
 
     if (at_server_local)
     {
@@ -493,7 +496,14 @@ int at_server_init(void)
     {
         RT_ASSERT(at_server_local->device->type == RT_Device_Class_Char);
 
-        rt_device_open(at_server_local->device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX);
+        /* using DMA mode first */
+        open_result = rt_device_open(at_server_local->device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_DMA_RX);
+        /* using interrupt mode when DMA mode not supported */
+        if (open_result == -RT_EIO)
+        {
+            open_result = rt_device_open(at_server_local->device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX);
+        }
+        RT_ASSERT(open_result == RT_EOK);
 
         rt_device_set_rx_indicate(at_server_local->device, at_rx_ind);
     }