Просмотр исходного кода

【修改】SIM800重拨功能

Signed-off-by: liuxianliang <liuxianliang@rt-thread.com>
liuxianliang 6 лет назад
Родитель
Сommit
be3706f907
2 измененных файлов с 37 добавлено и 3 удалено
  1. 34 3
      class/sim800/ppp_device_sim800.c
  2. 3 0
      class/sim800/ppp_device_sim800.h

+ 34 - 3
class/sim800/ppp_device_sim800.c

@@ -10,6 +10,7 @@
 
 #include <ppp_device_sim800.h>
 #include <ppp_chat.h>
+#include <rtdevice.h>
 
 #define DBG_TAG    "ppp.sim800"
 
@@ -18,13 +19,22 @@
 #else
 #define DBG_LVL   DBG_INFO
 #endif
-
 #include <rtdbg.h>
 
+#define SIM800_POWER_ON  PIN_HIGH
+#define SIM800_POWER_OFF PIN_LOW
+#ifndef SIM800_POWER_PIN
+#define SIM800_POWER_PIN -1
+#endif
+
+static const struct modem_chat_data rst_mcd[] =
+{
+    {"+++",          MODEM_CHAT_RESP_NOT_NEED,        30, 1, RT_TRUE},
+    {"ATH",          MODEM_CHAT_RESP_OK,              30, 1, RT_FALSE},
+};
+
 static const struct modem_chat_data mcd[] =
 {
-    {"+++",          MODEM_CHAT_RESP_NOT_NEED,        1,  2, RT_TRUE},
-    {"ATH",          MODEM_CHAT_RESP_OK,              30, 3, RT_FALSE},
     {"AT",           MODEM_CHAT_RESP_OK,              10, 1, RT_FALSE},
     {"ATE0",         MODEM_CHAT_RESP_OK,              1,  1, RT_FALSE},
     {PPP_APN_CMD,    MODEM_CHAT_RESP_OK,              1,  5, RT_FALSE},
@@ -33,6 +43,20 @@ static const struct modem_chat_data mcd[] =
 
 static rt_err_t ppp_sim800_prepare(struct ppp_device *device)
 {
+    struct ppp_sim800 *sim800 = (struct ppp_sim800*)device;
+    if (sim800->power_pin >= 0)
+    {
+        rt_pin_write(sim800->power_pin, SIM800_POWER_OFF);
+        rt_thread_mdelay(SIM800_WARTING_TIME_BASE);
+        rt_pin_write(sim800->power_pin, SIM800_POWER_ON);
+    }
+    else
+    {
+        rt_err_t err;
+        err = modem_chat(device->uart, rst_mcd, sizeof(rst_mcd) / sizeof(rst_mcd[0]));
+        if (err)
+            return err;
+    }
     return modem_chat(device->uart, mcd, sizeof(mcd) / sizeof(mcd[0]));
 }
 
@@ -63,6 +87,13 @@ int ppp_sim800_register(void)
         return -RT_ENOMEM;
     }
 
+    sim800->power_pin = SIM800_POWER_PIN;
+    if (sim800->power_pin >= 0)
+    {
+        rt_pin_mode(sim800->power_pin, PIN_MODE_OUTPUT);
+        rt_pin_write(sim800->power_pin, SIM800_POWER_OFF);
+    }
+
     ppp_device = &(sim800->device);
     ppp_device->ops = &sim800_ops;
 

+ 3 - 0
class/sim800/ppp_device_sim800.h

@@ -13,11 +13,14 @@
 
 #include <ppp_device.h>
 
+#define SIM800_WARTING_TIME_BASE 500
+
 /* ppp_device base from ppp_device */
 struct ppp_sim800
 {
     struct ppp_device  device;          /* ppp_device struct in ppp_sim800 */
     enum ppp_trans_type type;           /* the type is used to establish a ppp connection */
+    rt_base_t power_pin;                /* power pin, if device need hardware reset */
 };
 
 extern int ppp_sim800_register(void);