From 084b9a6bc0810dda24012ee54efb906a3cc9e6b5 Mon Sep 17 00:00:00 2001 From: xuyanghang Date: Wed, 29 Nov 2023 18:33:45 +0800 Subject: [PATCH 1/6] add 4G module EC200A --- APP_Framework/Framework/connection/4g/Kconfig | 24 +- .../Framework/connection/4g/Makefile | 36 +- .../Framework/connection/4g/ec200a/Kconfig | 103 +++++ .../Framework/connection/4g/ec200a/Make.defs | 6 + .../Framework/connection/4g/ec200a/Makefile | 14 + .../Framework/connection/4g/ec200a/SConscript | 10 + .../Framework/connection/4g/ec200a/ec200a.c | 400 ++++++++++++++++++ APP_Framework/lib/lorawan/lora_radio_driver | 2 +- 8 files changed, 570 insertions(+), 25 deletions(-) create mode 100755 APP_Framework/Framework/connection/4g/ec200a/Kconfig create mode 100755 APP_Framework/Framework/connection/4g/ec200a/Make.defs create mode 100755 APP_Framework/Framework/connection/4g/ec200a/Makefile create mode 100755 APP_Framework/Framework/connection/4g/ec200a/SConscript create mode 100755 APP_Framework/Framework/connection/4g/ec200a/ec200a.c diff --git a/APP_Framework/Framework/connection/4g/Kconfig b/APP_Framework/Framework/connection/4g/Kconfig index 17e05a974..b07cbb4ed 100644 --- a/APP_Framework/Framework/connection/4g/Kconfig +++ b/APP_Framework/Framework/connection/4g/Kconfig @@ -1,8 +1,16 @@ -config ADAPTER_EC200T - bool "Using 4G adapter device EC200T" - default y - -if ADAPTER_EC200T - source "$APP_DIR/Framework/connection/4g/ec200t/Kconfig" -endif - +config ADAPTER_EC200T + bool "Using 4G adapter device EC200T" + default y + +if ADAPTER_EC200T + source "$APP_DIR/Framework/connection/4g/ec200t/Kconfig" +endif + +config ADAPTER_EC200A + bool "Using 4G adapter device EC200A" + default y + +if ADAPTER_EC200A + source "$APP_DIR/Framework/connection/4g/ec200a/Kconfig" +endif + diff --git a/APP_Framework/Framework/connection/4g/Makefile b/APP_Framework/Framework/connection/4g/Makefile index df607fbb6..960402136 100644 --- a/APP_Framework/Framework/connection/4g/Makefile +++ b/APP_Framework/Framework/connection/4g/Makefile @@ -1,17 +1,21 @@ -include $(KERNEL_ROOT)/.config -ifeq ($(CONFIG_ADD_NUTTX_FEATURES),y) - include $(APPDIR)/Make.defs - CSRCS += adapter_4g.c - include $(APPDIR)/Application.mk - -endif - -ifeq ($(CONFIG_ADD_XIZI_FEATURES),y) - SRC_FILES := adapter_4g.c - - ifeq ($(CONFIG_ADAPTER_EC200T),y) - SRC_DIR += ec200t - endif - - include $(KERNEL_ROOT)/compiler.mk +include $(KERNEL_ROOT)/.config +ifeq ($(CONFIG_ADD_NUTTX_FEATURES),y) + include $(APPDIR)/Make.defs + CSRCS += adapter_4g.c + include $(APPDIR)/Application.mk + +endif + +ifeq ($(CONFIG_ADD_XIZI_FEATURES),y) + SRC_FILES := adapter_4g.c + + ifeq ($(CONFIG_ADAPTER_EC200T),y) + SRC_DIR += ec200t + endif + + ifeq ($(CONFIG_ADAPTER_EC200A),y) + SRC_DIR += ec200a + endif + + include $(KERNEL_ROOT)/compiler.mk endif \ No newline at end of file diff --git a/APP_Framework/Framework/connection/4g/ec200a/Kconfig b/APP_Framework/Framework/connection/4g/ec200a/Kconfig new file mode 100755 index 000000000..a552303a8 --- /dev/null +++ b/APP_Framework/Framework/connection/4g/ec200a/Kconfig @@ -0,0 +1,103 @@ +config ADAPTER_4G_EC200A + string "EC200A adapter name" + default "ec200a" + +if ADD_XIZI_FEATURES + config ADAPTER_EC200A_USING_PWRKEY + bool "EC200A using PWRKEY pin number" + default n + + if ADAPTER_EC200A_USING_PWRKEY + config ADAPTER_EC200A_PWRKEY + int "EC200A PWRKEY pin number" + default "144" + + config ADAPTER_EC200A_PIN_DRIVER + string "EC200A device pin driver path" + default "/dev/pin_dev" + endif + + config ADAPTER_EC200A_DRIVER_EXTUART + bool "Using extra uart to support 4G" + default n + + config ADAPTER_EC200A_DRIVER + string "EC200A device uart driver path" + default "/dev/usart6_dev6" + depends on !ADAPTER_EC200A_DRIVER_EXTUART + + if ADAPTER_EC200A_DRIVER_EXTUART + config ADAPTER_EC200A_DRIVER + string "EC200A device extra uart driver path" + default "/dev/extuart_dev5" + + config ADAPTER_EC200A_DRIVER_EXT_PORT + int "if EC200A device using extuart, choose port" + default "5" + endif +endif + +if ADD_NUTTX_FEATURES + config ADAPTER_EC200A_USING_PWRKEY + bool "EC200A using PWRKEY pin number" + default n + + if ADAPTER_EC200A_USING_PWRKEY + config ADAPTER_EC200A_PWRKEY + int "EC200A PWRKEY pin number" + default "97" + + config ADAPTER_EC200A_PIN_DRIVER + string "EC200A device pin driver path" + default "/dev/gpio3" + endif + + config ADAPTER_EC200A_DRIVER_EXTUART + bool "Using extra uart to support 4G" + default n + + config ADAPTER_EC200A_DRIVER + string "EC200A device uart driver path" + default "/dev/ttyS8" + depends on !ADAPTER_EC200A_DRIVER_EXTUART + + if ADAPTER_EC200A_DRIVER_EXTUART + config ADAPTER_EC200A_DRIVER + string "EC200A device extra uart driver path" + default "/dev/extuart_dev5" + + config ADAPTER_EC200A_DRIVER_EXT_PORT + int "if EC200A device using extuart, choose port" + default "5" + endif +endif + +if ADD_RTTHREAD_FEATURES + config ADAPTER_EC200A_PWRKEY + int "EC200A PWRKEY pin number" + default "97" + config ADAPTER_EC200A_PIN_DRIVER + string "EC200A device pin driver path" + default "/dev/pin_dev" + + config ADAPTER_EC200A_DRIVER_EXTUART + bool "Using extra uart to support 4G" + default n + + config ADAPTER_EC200A_DRIVER + string "EC200A device uart driver path" + default "/dev/usart8" + depends on !ADAPTER_EC200A_DRIVER_EXTUART + + if ADAPTER_EC200A_DRIVER_EXTUART + config ADAPTER_EC200A_DRIVER + string "EC200A device extra uart driver path" + default "/dev/extuart_dev5" + + config ADAPTER_EC200A_DRIVER_EXT_PORT + int "if EC200A device using extuart, choose port" + default "5" + endif + + +endif diff --git a/APP_Framework/Framework/connection/4g/ec200a/Make.defs b/APP_Framework/Framework/connection/4g/ec200a/Make.defs new file mode 100755 index 000000000..906a7f786 --- /dev/null +++ b/APP_Framework/Framework/connection/4g/ec200a/Make.defs @@ -0,0 +1,6 @@ +############################################################################ +# APP_Framework/Framework/connection/4g/ec200a/Make.defs +############################################################################ +ifneq ($(CONFIG_ADAPTER_4G_EC200A),) +CONFIGURED_APPS += $(APPDIR)/../../../APP_Framework/Framework/connection/4g/ec200a +endif diff --git a/APP_Framework/Framework/connection/4g/ec200a/Makefile b/APP_Framework/Framework/connection/4g/ec200a/Makefile new file mode 100755 index 000000000..9e8014f21 --- /dev/null +++ b/APP_Framework/Framework/connection/4g/ec200a/Makefile @@ -0,0 +1,14 @@ +include $(KERNEL_ROOT)/.config +ifeq ($(CONFIG_ADD_NUTTX_FEATURES),y) + include $(APPDIR)/Make.defs + CSRCS += ec200a.c + include $(APPDIR)/Application.mk + +endif + +ifeq ($(CONFIG_ADD_XIZI_FEATURES),y) + SRC_FILES := ec200a.c + + include $(KERNEL_ROOT)/compiler.mk + +endif diff --git a/APP_Framework/Framework/connection/4g/ec200a/SConscript b/APP_Framework/Framework/connection/4g/ec200a/SConscript new file mode 100755 index 000000000..acfe33a0c --- /dev/null +++ b/APP_Framework/Framework/connection/4g/ec200a/SConscript @@ -0,0 +1,10 @@ +from building import * +import os + +cwd = GetCurrentDir() +src = [] +if GetDepend(['ADAPTER_EC200A']): + src += ['ec200a.c'] +group = DefineGroup('connection 4g ec200a', src, depend = [], CPPPATH = [cwd]) + +Return('group') \ No newline at end of file diff --git a/APP_Framework/Framework/connection/4g/ec200a/ec200a.c b/APP_Framework/Framework/connection/4g/ec200a/ec200a.c new file mode 100755 index 000000000..10d3ecf48 --- /dev/null +++ b/APP_Framework/Framework/connection/4g/ec200a/ec200a.c @@ -0,0 +1,400 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** + * @file ec200a.c + * @brief Implement the connection 4G adapter function, using EC200A device + * @version 1.0 + * @author AIIT XUOS Lab + * @date 2023.11.23 + */ + +#include +#include + +#define EC200A_AT_MODE_CMD "+++" +#define EC200A_GET_CCID_CMD "AT+CCID\r\n" +#define EC200A_GET_CPIN_CMD "AT+CPIN?\r\n" +#define EC200A_GET_CREG_CMD "AT+CREG?\r\n" +#define EC200A_OPEN_SOCKET_CMD "AT+QIOPEN=1,%u" +#define EC200A_CLOSE_SOCKET_CMD "AT+QICLOSE=%u\r\n" +#define EC200A_ACTIVE_PDP_CMD "AT+QIACT=1\r\n" +#define EC200A_DEACTIVE_PDP_CMD "AT+QIDEACT=1\r\n" +#define EC200A_CFG_TCP_CMD "AT+QICSGP" + +#define EC200A_OK_REPLY "OK" +#define EC200A_READY_REPLY "READY" +#define EC200A_CREG_REPLY ",1" +#define EC200A_CONNECT_REPLY "CONNECT" + +#define TRY_TIMES 10 + +static void Ec200aPowerSet(void) +{ +#ifdef ADAPTER_EC200A_USING_PWRKEY + int pin_fd; + pin_fd = PrivOpen(ADAPTER_EC200A_PIN_DRIVER, O_RDWR); + if (pin_fd < 0) { + printf("open %s error\n", ADAPTER_EC200A_PIN_DRIVER); + return; + } + + struct PinParam pin_param; + pin_param.cmd = GPIO_CONFIG_MODE; + pin_param.mode = GPIO_CFG_OUTPUT; + pin_param.pin = ADAPTER_EC200A_PWRKEY; + + struct PrivIoctlCfg ioctl_cfg; + ioctl_cfg.ioctl_driver_type = PIN_TYPE; + ioctl_cfg.args = &pin_param; + PrivIoctl(pin_fd, OPE_CFG, &ioctl_cfg); + + struct PinStat pin_stat; + pin_stat.pin = ADAPTER_EC200A_PWRKEY; + pin_stat.val = GPIO_HIGH; + PrivWrite(pin_fd, &pin_stat, 1); + + PrivTaskDelay(600);//at least 500ms + + pin_stat.val = GPIO_LOW; + PrivWrite(pin_fd, &pin_stat, 1); + + PrivClose(pin_fd); + + PrivTaskDelay(10000); +#endif +} + +static int Ec200aOpen(struct Adapter *adapter) +{ + /*step1: open ec200a serial port*/ + adapter->fd = PrivOpen(ADAPTER_EC200A_DRIVER, O_RDWR); + if (adapter->fd < 0) { + printf("Ec200aOpen get serial %s fd error\n", ADAPTER_EC200A_DRIVER); + return -1; + } + + /*step2: init AT agent*/ + if (!adapter->agent) { + char *agent_name = "4G_uart_client"; + if (0 != InitATAgent(agent_name, adapter->fd, 512)) { + printf("at agent init failed !\n"); + return -1; + } + ATAgentType at_agent = GetATAgent(agent_name); + + adapter->agent = at_agent; + } + + PrivTaskDelay(2500); + + ADAPTER_DEBUG("Ec200a open done\n"); + + return 0; +} + +static int Ec200aClose(struct Adapter *adapter) +{ + int ret = 0; + uint8_t ec200a_cmd[64]; + + if (!adapter->agent) { + printf("Ec200aClose AT agent NULL\n"); + return -1; + } + + AtSetReplyEndChar(adapter->agent, 0x4F, 0x4B); + + /*step1: serial write "+++", quit transparent mode*/ + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "+++"); + + /*step2: serial write "AT+QICLOSE", close socket connect before open socket*/ + memset(ec200a_cmd, 0, sizeof(ec200a_cmd)); + sprintf(ec200a_cmd, EC200A_CLOSE_SOCKET_CMD, adapter->socket.socket_id); + + ret = AtCmdConfigAndCheck(adapter->agent, ec200a_cmd, EC200A_OK_REPLY); + if (ret < 0) { + goto out; + } + + /*step3: serial write "AT+QIDEACT", close TCP net before open socket*/ + ret = AtCmdConfigAndCheck(adapter->agent, EC200A_DEACTIVE_PDP_CMD, EC200A_OK_REPLY); + if (ret < 0) { + goto out; + } + +out: + /*step4: close ec200a serial port*/ + PrivClose(adapter->fd); + + /*step5: power down ec200a*/ + Ec200aPowerSet(); + + return ret; +} + +#ifdef ADD_RTTHREAD_FEATURES +static int Ec200aIoctl(struct Adapter *adapter, int cmd, void *args){ return 0;} +#else +static int Ec200aIoctl(struct Adapter *adapter, int cmd, void *args) +{ + if (OPE_INT != cmd) { + printf("Ec200aIoctl only support OPE_INT, do not support %d\n", cmd); + return -1; + } + + uint32_t baud_rate = *((uint32_t *)args); + + struct SerialDataCfg serial_cfg; + memset(&serial_cfg, 0 ,sizeof(struct SerialDataCfg)); + serial_cfg.serial_baud_rate = baud_rate; + serial_cfg.serial_data_bits = DATA_BITS_8; + serial_cfg.serial_stop_bits = STOP_BITS_1; + serial_cfg.serial_buffer_size = SERIAL_RB_BUFSZ; + serial_cfg.serial_parity_mode = PARITY_NONE; + serial_cfg.serial_bit_order = STOP_BITS_1; + serial_cfg.serial_invert_mode = NRZ_NORMAL; +#ifdef TOOL_USING_OTA + serial_cfg.serial_timeout = OTA_RX_TIMEOUT; +#else + //serial receive timeout 10s + serial_cfg.serial_timeout = 100000; +#endif + serial_cfg.is_ext_uart = 0; +#ifdef ADAPTER_EC200A_DRIVER_EXT_PORT + serial_cfg.is_ext_uart = 1; + serial_cfg.ext_uart_no = ADAPTER_EC200A_DRIVER_EXT_PORT; + serial_cfg.port_configure = PORT_CFG_INIT; +#endif + + struct PrivIoctlCfg ioctl_cfg; + ioctl_cfg.ioctl_driver_type = SERIAL_TYPE; + ioctl_cfg.args = &serial_cfg; + PrivIoctl(adapter->fd, OPE_INT, &ioctl_cfg); + + Ec200aPowerSet(); + + return 0; +} +#endif + +static int Ec200aConnect(struct Adapter *adapter, enum NetRoleType net_role, const char *ip, const char *port, enum IpType ip_type) +{ + int ret = 0; + int try = 0; + uint8_t ec200a_cmd[64]; + + AtSetReplyEndChar(adapter->agent, 0x4F, 0x4B); + + /*step1: serial write "+++", quit transparent mode*/ + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "+++"); + + /*step2: serial write "AT+CCID", get SIM ID*/ + for(try = 0; try < TRY_TIMES; try++){ + ret = AtCmdConfigAndCheck(adapter->agent, EC200A_GET_CCID_CMD, EC200A_OK_REPLY); + if (ret == 0) { + break; + } + } + if (ret < 0) { + goto out; + } + + /*step3: serial write "AT+CPIN?", check SIM status*/ + for(try = 0; try < TRY_TIMES; try++){ + ret = AtCmdConfigAndCheck(adapter->agent, EC200A_GET_CPIN_CMD, EC200A_READY_REPLY); + if (ret == 0) { + break; + } + } + if (ret < 0) { + goto out; + } + + /*step4: serial write "AT+CREG?", check whether registered to GSM net*/ + for(try = 0; try < TRY_TIMES; try++){ + ret = AtCmdConfigAndCheck(adapter->agent, EC200A_GET_CREG_CMD, EC200A_CREG_REPLY); + if (ret == 0) { + break; + } + } + if (ret < 0) { + goto out; + } + + /*step5: serial write "AT+QICSGP", connect to China Mobile using ipv4 or ipv6*/ + memset(ec200a_cmd, 0, sizeof(ec200a_cmd)); + + if (IPV4 == ip_type) { + strcpy(ec200a_cmd, "AT+QICSGP=1,1,\"CMNET\",\"\",\"\",1\r\n"); + } else if (IPV6 == ip_type) { + strcpy(ec200a_cmd, "AT+QICSGP=1,2,\"CMNET\",\"\",\"\",1\r\n"); + } + + for(try = 0; try < TRY_TIMES; try++){ + ret = AtCmdConfigAndCheck(adapter->agent, ec200a_cmd, EC200A_OK_REPLY); + if (ret == 0) { + break; + } + } + if (ret < 0) { + goto out; + } + + /*step6: serial write "AT+QICLOSE", close socket connect before open socket*/ + memset(ec200a_cmd, 0, sizeof(ec200a_cmd)); + sprintf(ec200a_cmd, EC200A_CLOSE_SOCKET_CMD, adapter->socket.socket_id); + for(try = 0; try < TRY_TIMES; try++){ + ret = AtCmdConfigAndCheck(adapter->agent, ec200a_cmd, EC200A_OK_REPLY); + if (ret == 0) { + break; + } + } + if (ret < 0) { + goto out; + } + + /*step7: serial write "AT+QIDEACT", close TCP net before open socket*/ + for(try = 0; try < TRY_TIMES; try++){ + ret = AtCmdConfigAndCheck(adapter->agent, EC200A_DEACTIVE_PDP_CMD, EC200A_OK_REPLY); + if (ret == 0) { + break; + } + } + if (ret < 0) { + goto out; + } + + /*step8: serial write "AT+QIACT", open TCP net*/ + for(try = 0; try < TRY_TIMES; try++){ + ret = AtCmdConfigAndCheck(adapter->agent, EC200A_ACTIVE_PDP_CMD, EC200A_OK_REPLY); + if (ret == 0) { + break; + } + } + if (ret < 0) { + goto out; + } + + /*step9: serial write "AT+QIOPEN", connect socket using TCP*/ + memset(ec200a_cmd, 0, sizeof(ec200a_cmd)); + sprintf(ec200a_cmd, EC200A_OPEN_SOCKET_CMD, adapter->socket.socket_id); + strcat(ec200a_cmd, ",\"TCP\",\""); + strcat(ec200a_cmd, ip); + strcat(ec200a_cmd, "\","); + strcat(ec200a_cmd, port); + strcat(ec200a_cmd, ",0,2\r\n"); + + AtSetReplyEndChar(adapter->agent, 0x43, 0x54); + + for(try = 0; try < TRY_TIMES; try++){ + ret = AtCmdConfigAndCheck(adapter->agent, ec200a_cmd, EC200A_CONNECT_REPLY); + if (ret == 0) { + break; + } + } + if (ret < 0) { + goto out; + } + + ADAPTER_DEBUG("Ec200a connect TCP done\n"); + + return 0; + +out: + ADAPTER_DEBUG("Ec200a connect TCP failed. Power down\n"); + Ec200aPowerSet(); + return -1; +} + +static int Ec200aSend(struct Adapter *adapter, const void *buf, size_t len) +{ + if (adapter->agent) { + EntmSend(adapter->agent, (const char *)buf, len); + } else { + printf("Ec200aSend can not find agent\n"); + } + return 0; +} + +static int Ec200aRecv(struct Adapter *adapter, void *buf, size_t len) +{ + if (adapter->agent) { + return EntmRecv(adapter->agent, (char *)buf, len, 6); + } else { + printf("Ec200aRecv can not find agent\n"); + } + + return -1; +} + +static int Ec200aDisconnect(struct Adapter *adapter) +{ + int ret = 0; + uint8_t ec200a_cmd[64]; + + AtSetReplyEndChar(adapter->agent, 0x4F, 0x4B); + + /*step1: serial write "+++", quit transparent mode*/ + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "+++"); + + /*step2: serial write "AT+QICLOSE", close socket connect before open socket*/ + memset(ec200a_cmd, 0, sizeof(ec200a_cmd)); + sprintf(ec200a_cmd, EC200A_CLOSE_SOCKET_CMD, adapter->socket.socket_id); + ret = AtCmdConfigAndCheck(adapter->agent, ec200a_cmd, EC200A_OK_REPLY); + if (ret < 0) { + goto out; + } + + ADAPTER_DEBUG("Ec200a disconnect TCP done\n"); + + return 0; + +out: + ADAPTER_DEBUG("Ec200a disconnect TCP failed. Power down\n"); + Ec200aPowerSet(); + return -1; +} + +static const struct IpProtocolDone ec200a_done = +{ + .open = Ec200aOpen, + .close = Ec200aClose, + .ioctl = Ec200aIoctl, + .setup = NULL, + .setdown = NULL, + .setaddr = NULL, + .setdns = NULL, + .setdhcp = NULL, + .ping = NULL, + .netstat = NULL, + .connect = Ec200aConnect, + .send = Ec200aSend, + .recv = Ec200aRecv, + .disconnect = Ec200aDisconnect, +}; + +AdapterProductInfoType Ec200aAttach(struct Adapter *adapter) +{ + struct AdapterProductInfo *product_info = PrivMalloc(sizeof(struct AdapterProductInfo)); + if (!product_info) { + printf("Ec200aAttach malloc product_info error\n"); + PrivFree(product_info); + return NULL; + } + + strcpy(product_info->model_name, ADAPTER_4G_EC200A); + + product_info->model_done = (void *)&ec200a_done; + + return product_info; +} diff --git a/APP_Framework/lib/lorawan/lora_radio_driver b/APP_Framework/lib/lorawan/lora_radio_driver index 2d8abd3ef..a94c007cb 160000 --- a/APP_Framework/lib/lorawan/lora_radio_driver +++ b/APP_Framework/lib/lorawan/lora_radio_driver @@ -1 +1 @@ -Subproject commit 2d8abd3eff2a2d5257e17c7f59acb2ba938cb90e +Subproject commit a94c007cb4ee726cc29b10626f8bbfc19c989b89 From 337264d599c52e4e5cd11a7f13a7edbd3678d801 Mon Sep 17 00:00:00 2001 From: xuyanghang Date: Mon, 11 Dec 2023 10:06:39 +0800 Subject: [PATCH 2/6] merge upstream --- APP_Framework/Framework/connection/4g/Kconfig | 10 +- .../Framework/connection/4g/Makefile | 4 + .../Framework/connection/4g/adapter_4g.c | 42 +- .../Framework/connection/4g/ec200a/Kconfig | 103 +++++ .../Framework/connection/4g/ec200a/Make.defs | 6 + .../Framework/connection/4g/ec200a/Makefile | 14 + .../Framework/connection/4g/ec200a/SConscript | 10 + .../Framework/connection/4g/ec200a/ec200a.c | 400 ++++++++++++++++++ APP_Framework/lib/lorawan/lora_radio_driver | 2 +- 9 files changed, 587 insertions(+), 4 deletions(-) create mode 100644 APP_Framework/Framework/connection/4g/ec200a/Kconfig create mode 100644 APP_Framework/Framework/connection/4g/ec200a/Make.defs create mode 100644 APP_Framework/Framework/connection/4g/ec200a/Makefile create mode 100644 APP_Framework/Framework/connection/4g/ec200a/SConscript create mode 100644 APP_Framework/Framework/connection/4g/ec200a/ec200a.c diff --git a/APP_Framework/Framework/connection/4g/Kconfig b/APP_Framework/Framework/connection/4g/Kconfig index 17e05a974..144b4e810 100644 --- a/APP_Framework/Framework/connection/4g/Kconfig +++ b/APP_Framework/Framework/connection/4g/Kconfig @@ -1,8 +1,16 @@ config ADAPTER_EC200T bool "Using 4G adapter device EC200T" - default y + default n if ADAPTER_EC200T source "$APP_DIR/Framework/connection/4g/ec200t/Kconfig" endif + +config ADAPTER_EC200A + bool "Using 4G adapter device EC200A" + default y + +if ADAPTER_EC200A + source "$APP_DIR/Framework/connection/4g/ec200a/Kconfig" +endif diff --git a/APP_Framework/Framework/connection/4g/Makefile b/APP_Framework/Framework/connection/4g/Makefile index df607fbb6..2f2769065 100644 --- a/APP_Framework/Framework/connection/4g/Makefile +++ b/APP_Framework/Framework/connection/4g/Makefile @@ -13,5 +13,9 @@ ifeq ($(CONFIG_ADD_XIZI_FEATURES),y) SRC_DIR += ec200t endif + ifeq ($(CONFIG_ADAPTER_EC200A),y) + SRC_DIR += ec200a + endif + include $(KERNEL_ROOT)/compiler.mk endif \ No newline at end of file diff --git a/APP_Framework/Framework/connection/4g/adapter_4g.c b/APP_Framework/Framework/connection/4g/adapter_4g.c index 57fbf0718..8a27a01f5 100644 --- a/APP_Framework/Framework/connection/4g/adapter_4g.c +++ b/APP_Framework/Framework/connection/4g/adapter_4g.c @@ -24,6 +24,10 @@ extern AdapterProductInfoType Ec200tAttach(struct Adapter *adapter); #endif +#ifdef ADAPTER_EC200A +extern AdapterProductInfoType Ec200aAttach(struct Adapter *adapter); +#endif + static int Adapter4GRegister(struct Adapter *adapter) { int ret = 0; @@ -74,6 +78,20 @@ int Adapter4GInit(void) adapter->info = product_info; adapter->done = product_info->model_done; +#endif + +#ifdef ADAPTER_EC200A + AdapterProductInfoType product_info = Ec200aAttach(adapter); + if (!product_info) { + printf("Adapter4GInit ec200a attach error\n"); + PrivFree(adapter); + return -1; + } + + adapter->product_info_flag = 1; + adapter->info = product_info; + adapter->done = product_info->model_done; + #endif return ret; @@ -86,7 +104,7 @@ int Adapter4GTest(void) char recv_msg[256] = {0}; int baud_rate = BAUD_RATE_115200; - struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_4G_NAME); + struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_4G_NAME); #ifdef ADAPTER_EC200T /* Using Public TCP server to test 4G Socket connection */ @@ -108,6 +126,26 @@ int Adapter4GTest(void) } #endif +#ifdef ADAPTER_EC200A + /* Using Public TCP server to test 4G Socket connection */ + uint8 server_addr[64] = "120.76.100.197"; + uint8 server_port[64] = "10002"; + + adapter->socket.socket_id = 0; + + AdapterDeviceOpen(adapter); + AdapterDeviceControl(adapter, OPE_INT, &baud_rate); + + AdapterDeviceConnect(adapter, CLIENT, server_addr, server_port, IPV4); + + while (1) { + AdapterDeviceSend(adapter, send_msg, strlen(send_msg)); + AdapterDeviceRecv(adapter, recv_msg, 256); + printf("4G recv msg %s\n", recv_msg); + memset(recv_msg, 0, 256); + } +#endif + return 0; } -PRIV_SHELL_CMD_FUNCTION(Adapter4GTest, a EC200T adpter sample, PRIV_SHELL_CMD_FUNC_ATTR); +PRIV_SHELL_CMD_FUNCTION(Adapter4GTest, a EC200T or EC200A adpter sample, PRIV_SHELL_CMD_FUNC_ATTR); diff --git a/APP_Framework/Framework/connection/4g/ec200a/Kconfig b/APP_Framework/Framework/connection/4g/ec200a/Kconfig new file mode 100644 index 000000000..d46a3515f --- /dev/null +++ b/APP_Framework/Framework/connection/4g/ec200a/Kconfig @@ -0,0 +1,103 @@ +config ADAPTER_4G_EC200A + string "EC200A adapter name" + default "ec200a" + +if ADD_XIZI_FEATURES + config ADAPTER_EC200A_USING_PWRKEY + bool "EC200A using PWRKEY pin number" + default n + + if ADAPTER_EC200A_USING_PWRKEY + config ADAPTER_EC200A_PWRKEY + int "EC200A PWRKEY pin number" + default "144" + + config ADAPTER_EC200A_PIN_DRIVER + string "EC200A device pin driver path" + default "/dev/pin_dev" + endif + + config ADAPTER_EC200A_DRIVER_EXTUART + bool "Using extra uart to support 4G" + default n + + config ADAPTER_EC200A_DRIVER + string "EC200A device uart driver path" + default "/dev/usart6_dev6" + depends on !ADAPTER_EC200A_DRIVER_EXTUART + + if ADAPTER_EC200A_DRIVER_EXTUART + config ADAPTER_EC200A_DRIVER + string "EC200A device extra uart driver path" + default "/dev/extuart_dev5" + + config ADAPTER_EC200A_DRIVER_EXT_PORT + int "if EC200A device using extuart, choose port" + default "5" + endif +endif + +if ADD_NUTTX_FEATURES + config ADAPTER_EC200A_USING_PWRKEY + bool "EC200A using PWRKEY pin number" + default n + + if ADAPTER_EC200A_USING_PWRKEY + config ADAPTER_EC200A_PWRKEY + int "EC200A PWRKEY pin number" + default "97" + + config ADAPTER_EC200A_PIN_DRIVER + string "EC200A device pin driver path" + default "/dev/gpio3" + endif + + config ADAPTER_EC200A_DRIVER_EXTUART + bool "Using extra uart to support 4G" + default n + + config ADAPTER_EC200A_DRIVER + string "EC200A device uart driver path" + default "/dev/ttyS8" + depends on !ADAPTER_EC200A_DRIVER_EXTUART + + if ADAPTER_EC200A_DRIVER_EXTUART + config ADAPTER_EC200A_DRIVER + string "EC200A device extra uart driver path" + default "/dev/extuart_dev5" + + config ADAPTER_EC200A_DRIVER_EXT_PORT + int "if EC200A device using extuart, choose port" + default "5" + endif +endif + +if ADD_RTTHREAD_FEATURES + config ADAPTER_EC200A_PWRKEY + int "EC200A PWRKEY pin number" + default "97" + config ADAPTER_EC200A_PIN_DRIVER + string "EC200A device pin driver path" + default "/dev/pin_dev" + + config ADAPTER_EC200A_DRIVER_EXTUART + bool "Using extra uart to support 4G" + default n + + config ADAPTER_EC200A_DRIVER + string "EC200A device uart driver path" + default "/dev/usart8" + depends on !ADAPTER_EC200A_DRIVER_EXTUART + + if ADAPTER_EC200A_DRIVER_EXTUART + config ADAPTER_EC200A_DRIVER + string "EC200A device extra uart driver path" + default "/dev/extuart_dev5" + + config ADAPTER_EC200A_DRIVER_EXT_PORT + int "if EC200A device using extuart, choose port" + default "5" + endif + + +endif diff --git a/APP_Framework/Framework/connection/4g/ec200a/Make.defs b/APP_Framework/Framework/connection/4g/ec200a/Make.defs new file mode 100644 index 000000000..38e23a6d4 --- /dev/null +++ b/APP_Framework/Framework/connection/4g/ec200a/Make.defs @@ -0,0 +1,6 @@ +############################################################################ +# APP_Framework/Framework/connection/4g/ec200a/Make.defs +############################################################################ +ifneq ($(CONFIG_ADAPTER_4G_EC200A),) +CONFIGURED_APPS += $(APPDIR)/../../../APP_Framework/Framework/connection/4g/ec200a +endif diff --git a/APP_Framework/Framework/connection/4g/ec200a/Makefile b/APP_Framework/Framework/connection/4g/ec200a/Makefile new file mode 100644 index 000000000..e9e545acb --- /dev/null +++ b/APP_Framework/Framework/connection/4g/ec200a/Makefile @@ -0,0 +1,14 @@ +include $(KERNEL_ROOT)/.config +ifeq ($(CONFIG_ADD_NUTTX_FEATURES),y) + include $(APPDIR)/Make.defs + CSRCS += ec200a.c + include $(APPDIR)/Application.mk + +endif + +ifeq ($(CONFIG_ADD_XIZI_FEATURES),y) + SRC_FILES := ec200a.c + + include $(KERNEL_ROOT)/compiler.mk + +endif diff --git a/APP_Framework/Framework/connection/4g/ec200a/SConscript b/APP_Framework/Framework/connection/4g/ec200a/SConscript new file mode 100644 index 000000000..84aeebc1e --- /dev/null +++ b/APP_Framework/Framework/connection/4g/ec200a/SConscript @@ -0,0 +1,10 @@ +from building import * +import os + +cwd = GetCurrentDir() +src = [] +if GetDepend(['ADAPTER_EC200A']): + src += ['ec200a.c'] +group = DefineGroup('connection 4g ec200a', src, depend = [], CPPPATH = [cwd]) + +Return('group') \ No newline at end of file diff --git a/APP_Framework/Framework/connection/4g/ec200a/ec200a.c b/APP_Framework/Framework/connection/4g/ec200a/ec200a.c new file mode 100644 index 000000000..51254dbd1 --- /dev/null +++ b/APP_Framework/Framework/connection/4g/ec200a/ec200a.c @@ -0,0 +1,400 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** + * @file ec200a.c + * @brief Implement the connection 4G adapter function, using EC200A device + * @version 1.0 + * @author AIIT XUOS Lab + * @date 2023.11.23 + */ + +#include +#include + +#define EC200A_AT_MODE_CMD "+++" +#define EC200A_GET_QCCID_CMD "AT+QCCID\r\n" +#define EC200A_GET_CPIN_CMD "AT+CPIN?\r\n" +#define EC200A_GET_CEREG_CMD "AT+CEREG?\r\n" +#define EC200A_OPEN_SOCKET_CMD "AT+QIOPEN=1,%u" +#define EC200A_CLOSE_SOCKET_CMD "AT+QICLOSE=%u\r\n" +#define EC200A_ACTIVE_PDP_CMD "AT+QIACT=1\r\n" +#define EC200A_DEACTIVE_PDP_CMD "AT+QIDEACT=1\r\n" +#define EC200A_CFG_TCP_CMD "AT+QICSGP" + +#define EC200A_OK_REPLY "OK" +#define EC200A_READY_REPLY "READY" +#define EC200A_CREG_REPLY ",1" +#define EC200A_CONNECT_REPLY "CONNECT" + +#define TRY_TIMES 10 + +static void Ec200aPowerSet(void) +{ +#ifdef ADAPTER_EC200A_USING_PWRKEY + int pin_fd; + pin_fd = PrivOpen(ADAPTER_EC200A_PIN_DRIVER, O_RDWR); + if (pin_fd < 0) { + printf("open %s error\n", ADAPTER_EC200A_PIN_DRIVER); + return; + } + + struct PinParam pin_param; + pin_param.cmd = GPIO_CONFIG_MODE; + pin_param.mode = GPIO_CFG_OUTPUT; + pin_param.pin = ADAPTER_EC200A_PWRKEY; + + struct PrivIoctlCfg ioctl_cfg; + ioctl_cfg.ioctl_driver_type = PIN_TYPE; + ioctl_cfg.args = &pin_param; + PrivIoctl(pin_fd, OPE_CFG, &ioctl_cfg); + + struct PinStat pin_stat; + pin_stat.pin = ADAPTER_EC200A_PWRKEY; + pin_stat.val = GPIO_HIGH; + PrivWrite(pin_fd, &pin_stat, 1); + + PrivTaskDelay(600);//at least 500ms + + pin_stat.val = GPIO_LOW; + PrivWrite(pin_fd, &pin_stat, 1); + + PrivClose(pin_fd); + + PrivTaskDelay(10000); +#endif +} + +static int Ec200aOpen(struct Adapter *adapter) +{ + /*step1: open ec200a serial port*/ + adapter->fd = PrivOpen(ADAPTER_EC200A_DRIVER, O_RDWR); + if (adapter->fd < 0) { + printf("Ec200aOpen get serial %s fd error\n", ADAPTER_EC200A_DRIVER); + return -1; + } + + /*step2: init AT agent*/ + if (!adapter->agent) { + char *agent_name = "4G_uart_client"; + if (0 != InitATAgent(agent_name, adapter->fd, 512)) { + printf("at agent init failed !\n"); + return -1; + } + ATAgentType at_agent = GetATAgent(agent_name); + + adapter->agent = at_agent; + } + + PrivTaskDelay(2500); + + ADAPTER_DEBUG("Ec200a open done\n"); + + return 0; +} + +static int Ec200aClose(struct Adapter *adapter) +{ + int ret = 0; + uint8_t ec200a_cmd[64]; + + if (!adapter->agent) { + printf("Ec200aClose AT agent NULL\n"); + return -1; + } + + AtSetReplyEndChar(adapter->agent, 0x4F, 0x4B); + + /*step1: serial write "+++", quit transparent mode*/ + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "+++"); + + /*step2: serial write "AT+QICLOSE", close socket connect before open socket*/ + memset(ec200a_cmd, 0, sizeof(ec200a_cmd)); + sprintf(ec200a_cmd, EC200A_CLOSE_SOCKET_CMD, adapter->socket.socket_id); + + ret = AtCmdConfigAndCheck(adapter->agent, ec200a_cmd, EC200A_OK_REPLY); + if (ret < 0) { + goto out; + } + + /*step3: serial write "AT+QIDEACT", close TCP net before open socket*/ + ret = AtCmdConfigAndCheck(adapter->agent, EC200A_DEACTIVE_PDP_CMD, EC200A_OK_REPLY); + if (ret < 0) { + goto out; + } + +out: + /*step4: close ec200a serial port*/ + PrivClose(adapter->fd); + + /*step5: power down ec200a*/ + Ec200aPowerSet(); + + return ret; +} + +#ifdef ADD_RTTHREAD_FEATURES +static int Ec200aIoctl(struct Adapter *adapter, int cmd, void *args){ return 0;} +#else +static int Ec200aIoctl(struct Adapter *adapter, int cmd, void *args) +{ + if (OPE_INT != cmd) { + printf("Ec200aIoctl only support OPE_INT, do not support %d\n", cmd); + return -1; + } + + uint32_t baud_rate = *((uint32_t *)args); + + struct SerialDataCfg serial_cfg; + memset(&serial_cfg, 0 ,sizeof(struct SerialDataCfg)); + serial_cfg.serial_baud_rate = baud_rate; + serial_cfg.serial_data_bits = DATA_BITS_8; + serial_cfg.serial_stop_bits = STOP_BITS_1; + serial_cfg.serial_buffer_size = SERIAL_RB_BUFSZ; + serial_cfg.serial_parity_mode = PARITY_NONE; + serial_cfg.serial_bit_order = STOP_BITS_1; + serial_cfg.serial_invert_mode = NRZ_NORMAL; +#ifdef TOOL_USING_OTA + serial_cfg.serial_timeout = OTA_RX_TIMEOUT; +#else + //serial receive timeout 10s + serial_cfg.serial_timeout = 100000; +#endif + serial_cfg.is_ext_uart = 0; +#ifdef ADAPTER_EC200A_DRIVER_EXT_PORT + serial_cfg.is_ext_uart = 1; + serial_cfg.ext_uart_no = ADAPTER_EC200A_DRIVER_EXT_PORT; + serial_cfg.port_configure = PORT_CFG_INIT; +#endif + + struct PrivIoctlCfg ioctl_cfg; + ioctl_cfg.ioctl_driver_type = SERIAL_TYPE; + ioctl_cfg.args = &serial_cfg; + PrivIoctl(adapter->fd, OPE_INT, &ioctl_cfg); + + Ec200aPowerSet(); + + return 0; +} +#endif + +static int Ec200aConnect(struct Adapter *adapter, enum NetRoleType net_role, const char *ip, const char *port, enum IpType ip_type) +{ + int ret = 0; + int try = 0; + uint8_t ec200a_cmd[64]; + + AtSetReplyEndChar(adapter->agent, 0x4F, 0x4B); + + /*step1: serial write "+++", quit transparent mode*/ + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "+++"); + + /*step2: serial write "AT+CCID", get SIM ID*/ + for(try = 0; try < TRY_TIMES; try++){ + ret = AtCmdConfigAndCheck(adapter->agent, EC200A_GET_CCID_CMD, EC200A_OK_REPLY); + if (ret == 0) { + break; + } + } + if (ret < 0) { + goto out; + } + + /*step3: serial write "AT+CPIN?", check SIM status*/ + for(try = 0; try < TRY_TIMES; try++){ + ret = AtCmdConfigAndCheck(adapter->agent, EC200A_GET_CPIN_CMD, EC200A_READY_REPLY); + if (ret == 0) { + break; + } + } + if (ret < 0) { + goto out; + } + + /*step4: serial write "AT+CREG?", check whether registered to GSM net*/ + for(try = 0; try < TRY_TIMES; try++){ + ret = AtCmdConfigAndCheck(adapter->agent, EC200A_GET_CREG_CMD, EC200A_CREG_REPLY); + if (ret == 0) { + break; + } + } + if (ret < 0) { + goto out; + } + + /*step5: serial write "AT+QICSGP", connect to China Mobile using ipv4 or ipv6*/ + memset(ec200a_cmd, 0, sizeof(ec200a_cmd)); + + if (IPV4 == ip_type) { + strcpy(ec200a_cmd, "AT+QICSGP=1,1,\"CMNET\",\"\",\"\",1\r\n"); + } else if (IPV6 == ip_type) { + strcpy(ec200a_cmd, "AT+QICSGP=1,2,\"CMNET\",\"\",\"\",1\r\n"); + } + + for(try = 0; try < TRY_TIMES; try++){ + ret = AtCmdConfigAndCheck(adapter->agent, ec200a_cmd, EC200A_OK_REPLY); + if (ret == 0) { + break; + } + } + if (ret < 0) { + goto out; + } + + /*step6: serial write "AT+QICLOSE", close socket connect before open socket*/ + memset(ec200a_cmd, 0, sizeof(ec200a_cmd)); + sprintf(ec200a_cmd, EC200A_CLOSE_SOCKET_CMD, adapter->socket.socket_id); + for(try = 0; try < TRY_TIMES; try++){ + ret = AtCmdConfigAndCheck(adapter->agent, ec200a_cmd, EC200A_OK_REPLY); + if (ret == 0) { + break; + } + } + if (ret < 0) { + goto out; + } + + /*step7: serial write "AT+QIDEACT", close TCP net before open socket*/ + for(try = 0; try < TRY_TIMES; try++){ + ret = AtCmdConfigAndCheck(adapter->agent, EC200A_DEACTIVE_PDP_CMD, EC200A_OK_REPLY); + if (ret == 0) { + break; + } + } + if (ret < 0) { + goto out; + } + + /*step8: serial write "AT+QIACT", open TCP net*/ + for(try = 0; try < TRY_TIMES; try++){ + ret = AtCmdConfigAndCheck(adapter->agent, EC200A_ACTIVE_PDP_CMD, EC200A_OK_REPLY); + if (ret == 0) { + break; + } + } + if (ret < 0) { + goto out; + } + + /*step9: serial write "AT+QIOPEN", connect socket using TCP*/ + memset(ec200a_cmd, 0, sizeof(ec200a_cmd)); + sprintf(ec200a_cmd, EC200A_OPEN_SOCKET_CMD, adapter->socket.socket_id); + strcat(ec200a_cmd, ",\"TCP\",\""); + strcat(ec200a_cmd, ip); + strcat(ec200a_cmd, "\","); + strcat(ec200a_cmd, port); + strcat(ec200a_cmd, ",0,2\r\n"); + + AtSetReplyEndChar(adapter->agent, 0x43, 0x54); + + for(try = 0; try < TRY_TIMES; try++){ + ret = AtCmdConfigAndCheck(adapter->agent, ec200a_cmd, EC200A_CONNECT_REPLY); + if (ret == 0) { + break; + } + } + if (ret < 0) { + goto out; + } + + ADAPTER_DEBUG("Ec200a connect TCP done\n"); + + return 0; + +out: + ADAPTER_DEBUG("Ec200a connect TCP failed. Power down\n"); + Ec200aPowerSet(); + return -1; +} + +static int Ec200aSend(struct Adapter *adapter, const void *buf, size_t len) +{ + if (adapter->agent) { + EntmSend(adapter->agent, (const char *)buf, len); + } else { + printf("Ec200aSend can not find agent\n"); + } + return 0; +} + +static int Ec200aRecv(struct Adapter *adapter, void *buf, size_t len) +{ + if (adapter->agent) { + return EntmRecv(adapter->agent, (char *)buf, len, 6); + } else { + printf("Ec200aRecv can not find agent\n"); + } + + return -1; +} + +static int Ec200aDisconnect(struct Adapter *adapter) +{ + int ret = 0; + uint8_t ec200a_cmd[64]; + + AtSetReplyEndChar(adapter->agent, 0x4F, 0x4B); + + /*step1: serial write "+++", quit transparent mode*/ + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "+++"); + + /*step2: serial write "AT+QICLOSE", close socket connect before open socket*/ + memset(ec200a_cmd, 0, sizeof(ec200a_cmd)); + sprintf(ec200a_cmd, EC200A_CLOSE_SOCKET_CMD, adapter->socket.socket_id); + ret = AtCmdConfigAndCheck(adapter->agent, ec200a_cmd, EC200A_OK_REPLY); + if (ret < 0) { + goto out; + } + + ADAPTER_DEBUG("Ec200a disconnect TCP done\n"); + + return 0; + +out: + ADAPTER_DEBUG("Ec200a disconnect TCP failed. Power down\n"); + Ec200aPowerSet(); + return -1; +} + +static const struct IpProtocolDone ec200a_done = +{ + .open = Ec200aOpen, + .close = Ec200aClose, + .ioctl = Ec200aIoctl, + .setup = NULL, + .setdown = NULL, + .setaddr = NULL, + .setdns = NULL, + .setdhcp = NULL, + .ping = NULL, + .netstat = NULL, + .connect = Ec200aConnect, + .send = Ec200aSend, + .recv = Ec200aRecv, + .disconnect = Ec200aDisconnect, +}; + +AdapterProductInfoType Ec200aAttach(struct Adapter *adapter) +{ + struct AdapterProductInfo *product_info = PrivMalloc(sizeof(struct AdapterProductInfo)); + if (!product_info) { + printf("Ec200aAttach malloc product_info error\n"); + PrivFree(product_info); + return NULL; + } + + strcpy(product_info->model_name, ADAPTER_4G_EC200A); + + product_info->model_done = (void *)&ec200a_done; + + return product_info; +} diff --git a/APP_Framework/lib/lorawan/lora_radio_driver b/APP_Framework/lib/lorawan/lora_radio_driver index 2d8abd3ef..a94c007cb 160000 --- a/APP_Framework/lib/lorawan/lora_radio_driver +++ b/APP_Framework/lib/lorawan/lora_radio_driver @@ -1 +1 @@ -Subproject commit 2d8abd3eff2a2d5257e17c7f59acb2ba938cb90e +Subproject commit a94c007cb4ee726cc29b10626f8bbfc19c989b89 From c6b57ed8266dbcfaed07c8c5690331eec8d2665d Mon Sep 17 00:00:00 2001 From: xuyanghang Date: Fri, 29 Dec 2023 13:51:01 +0800 Subject: [PATCH 3/6] modify reset pin number --- APP_Framework/Framework/connection/4g/ec200a/Kconfig | 5 +++-- APP_Framework/Framework/connection/4g/ec200a/ec200a.c | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/APP_Framework/Framework/connection/4g/ec200a/Kconfig b/APP_Framework/Framework/connection/4g/ec200a/Kconfig index d46a3515f..fd7ca98a9 100644 --- a/APP_Framework/Framework/connection/4g/ec200a/Kconfig +++ b/APP_Framework/Framework/connection/4g/ec200a/Kconfig @@ -45,7 +45,7 @@ if ADD_NUTTX_FEATURES if ADAPTER_EC200A_USING_PWRKEY config ADAPTER_EC200A_PWRKEY int "EC200A PWRKEY pin number" - default "97" + default "144" config ADAPTER_EC200A_PIN_DRIVER string "EC200A device pin driver path" @@ -75,7 +75,8 @@ endif if ADD_RTTHREAD_FEATURES config ADAPTER_EC200A_PWRKEY int "EC200A PWRKEY pin number" - default "97" + default "144" + config ADAPTER_EC200A_PIN_DRIVER string "EC200A device pin driver path" default "/dev/pin_dev" diff --git a/APP_Framework/Framework/connection/4g/ec200a/ec200a.c b/APP_Framework/Framework/connection/4g/ec200a/ec200a.c index 51254dbd1..7d9e4f440 100644 --- a/APP_Framework/Framework/connection/4g/ec200a/ec200a.c +++ b/APP_Framework/Framework/connection/4g/ec200a/ec200a.c @@ -63,7 +63,7 @@ static void Ec200aPowerSet(void) pin_stat.val = GPIO_HIGH; PrivWrite(pin_fd, &pin_stat, 1); - PrivTaskDelay(600);//at least 500ms + PrivTaskDelay(600); //at least 500ms pin_stat.val = GPIO_LOW; PrivWrite(pin_fd, &pin_stat, 1); @@ -112,7 +112,7 @@ static int Ec200aClose(struct Adapter *adapter) return -1; } - AtSetReplyEndChar(adapter->agent, 0x4F, 0x4B); + AtSetReplyEndChar(adapter->agent, 0x4F, 0x4B); //'O', 'K' /*step1: serial write "+++", quit transparent mode*/ ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "+++"); @@ -200,7 +200,7 @@ static int Ec200aConnect(struct Adapter *adapter, enum NetRoleType net_role, con /*step2: serial write "AT+CCID", get SIM ID*/ for(try = 0; try < TRY_TIMES; try++){ - ret = AtCmdConfigAndCheck(adapter->agent, EC200A_GET_CCID_CMD, EC200A_OK_REPLY); + ret = AtCmdConfigAndCheck(adapter->agent, EC200A_GET_QCCID_CMD, EC200A_OK_REPLY); if (ret == 0) { break; } @@ -222,7 +222,7 @@ static int Ec200aConnect(struct Adapter *adapter, enum NetRoleType net_role, con /*step4: serial write "AT+CREG?", check whether registered to GSM net*/ for(try = 0; try < TRY_TIMES; try++){ - ret = AtCmdConfigAndCheck(adapter->agent, EC200A_GET_CREG_CMD, EC200A_CREG_REPLY); + ret = AtCmdConfigAndCheck(adapter->agent, EC200A_GET_CEREG_CMD, EC200A_CREG_REPLY); if (ret == 0) { break; } From 49259b08a323e9925e7509e0509b30178b52a874 Mon Sep 17 00:00:00 2001 From: xuyanghang Date: Tue, 9 Jan 2024 14:50:37 +0800 Subject: [PATCH 4/6] 4G module EC200A TCP connection --- .../Framework/connection/4g/adapter_4g.c | 4 +- .../Framework/connection/4g/ec200a/ec200a.c | 36 +++++++++------- .../connection/4g/ec200a/ec200a_mqtt.c | 42 +++++++++++++++++++ 3 files changed, 66 insertions(+), 16 deletions(-) create mode 100644 APP_Framework/Framework/connection/4g/ec200a/ec200a_mqtt.c diff --git a/APP_Framework/Framework/connection/4g/adapter_4g.c b/APP_Framework/Framework/connection/4g/adapter_4g.c index 8a27a01f5..d3a6085d5 100644 --- a/APP_Framework/Framework/connection/4g/adapter_4g.c +++ b/APP_Framework/Framework/connection/4g/adapter_4g.c @@ -128,8 +128,8 @@ int Adapter4GTest(void) #ifdef ADAPTER_EC200A /* Using Public TCP server to test 4G Socket connection */ - uint8 server_addr[64] = "120.76.100.197"; - uint8 server_port[64] = "10002"; + uint8 server_addr[64] = "xyheqmx.e3.luyouxia.net"; + uint8 server_port[64] = "13333"; adapter->socket.socket_id = 0; diff --git a/APP_Framework/Framework/connection/4g/ec200a/ec200a.c b/APP_Framework/Framework/connection/4g/ec200a/ec200a.c index 05141bced..38def6ddf 100644 --- a/APP_Framework/Framework/connection/4g/ec200a/ec200a.c +++ b/APP_Framework/Framework/connection/4g/ec200a/ec200a.c @@ -24,12 +24,13 @@ #define EC200A_AT_MODE_CMD "+++" #define EC200A_GET_QCCID_CMD "AT+QCCID\r\n" #define EC200A_GET_CPIN_CMD "AT+CPIN?\r\n" -#define EC200A_GET_CEREG_CMD "AT+CEREG?\r\n" -#define EC200A_OPEN_SOCKET_CMD "AT+QIOPEN=1,%u" -#define EC200A_CLOSE_SOCKET_CMD "AT+QICLOSE=%u\r\n" +#define EC200A_GET_CREG_CMD "AT+CREG?\r\n" +#define EC200A_CFG_TCP_CMD "AT+QICSGP" #define EC200A_ACTIVE_PDP_CMD "AT+QIACT=1\r\n" #define EC200A_DEACTIVE_PDP_CMD "AT+QIDEACT=1\r\n" -#define EC200A_CFG_TCP_CMD "AT+QICSGP" +#define EC200A_OPEN_SOCKET_CMD "AT+QIOPEN=1,%u" +#define EC200A_CLOSE_SOCKET_CMD "AT+QICLOSE=%u\r\n" +#define EC200A_CLOSE "AT+QPOWD" #define EC200A_OK_REPLY "OK" #define EC200A_READY_REPLY "READY" @@ -60,12 +61,12 @@ static void Ec200aPowerSet(void) struct PinStat pin_stat; pin_stat.pin = ADAPTER_EC200A_PWRKEY; - pin_stat.val = GPIO_HIGH; + pin_stat.val = GPIO_LOW; //put power key at low-level state PrivWrite(pin_fd, &pin_stat, 1); - PrivTaskDelay(600); //at least 500ms + PrivTaskDelay(2500); //wait at least 2s - pin_stat.val = GPIO_LOW; + pin_stat.val = GPIO_HIGH; //put power key at high-level state PrivWrite(pin_fd, &pin_stat, 1); PrivClose(pin_fd); @@ -133,11 +134,12 @@ static int Ec200aClose(struct Adapter *adapter) } out: - /*step4: close ec200a serial port*/ - PrivClose(adapter->fd); + /*step4: power down ec200a*/ + ret = AtCmdConfigAndCheck(adapter->agent, EC200A_CLOSE, EC200A_OK_REPLY); + PrivTaskDelay(12500); //wait at least 12s - /*step5: power down ec200a*/ - Ec200aPowerSet(); + /*step5: close ec200a serial port*/ + PrivClose(adapter->fd); return ret; } @@ -196,7 +198,9 @@ static int Ec200aConnect(struct Adapter *adapter, enum NetRoleType net_role, con AtSetReplyEndChar(adapter->agent, 0x4F, 0x4B); /*step1: serial write "+++", quit transparent mode*/ + PrivTaskDelay(1500); //before +++ command, wait at least 1s ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "+++"); + PrivTaskDelay(1500); //after +++ command, wait at least 1s /*step2: serial write "AT+CCID", get SIM ID*/ for(try = 0; try < TRY_TIMES; try++){ @@ -221,8 +225,10 @@ static int Ec200aConnect(struct Adapter *adapter, enum NetRoleType net_role, con } /*step4: serial write "AT+CREG?", check whether registered to GSM net*/ + PrivTaskDelay(1000); //before CREG command, wait 1s + for(try = 0; try < TRY_TIMES; try++){ - ret = AtCmdConfigAndCheck(adapter->agent, EC200A_GET_CEREG_CMD, EC200A_CREG_REPLY); + ret = AtCmdConfigAndCheck(adapter->agent, EC200A_GET_CREG_CMD, EC200A_CREG_REPLY); if (ret == 0) { break; } @@ -312,7 +318,7 @@ static int Ec200aConnect(struct Adapter *adapter, enum NetRoleType net_role, con out: ADAPTER_DEBUG("Ec200a connect TCP failed. Power down\n"); - Ec200aPowerSet(); + ret = AtCmdConfigAndCheck(adapter->agent, EC200A_CLOSE, EC200A_OK_REPLY); return -1; } @@ -345,7 +351,9 @@ static int Ec200aDisconnect(struct Adapter *adapter) AtSetReplyEndChar(adapter->agent, 0x4F, 0x4B); /*step1: serial write "+++", quit transparent mode*/ + PrivTaskDelay(1500); //before +++ command, wait at least 1s ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "+++"); + PrivTaskDelay(1500); //after +++ command, wait at least 1s /*step2: serial write "AT+QICLOSE", close socket connect before open socket*/ memset(ec200a_cmd, 0, sizeof(ec200a_cmd)); @@ -361,7 +369,7 @@ static int Ec200aDisconnect(struct Adapter *adapter) out: ADAPTER_DEBUG("Ec200a disconnect TCP failed. Power down\n"); - Ec200aPowerSet(); + ret = AtCmdConfigAndCheck(adapter->agent, EC200A_CLOSE, EC200A_OK_REPLY); return -1; } diff --git a/APP_Framework/Framework/connection/4g/ec200a/ec200a_mqtt.c b/APP_Framework/Framework/connection/4g/ec200a/ec200a_mqtt.c new file mode 100644 index 000000000..5f5a42e8e --- /dev/null +++ b/APP_Framework/Framework/connection/4g/ec200a/ec200a_mqtt.c @@ -0,0 +1,42 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** + * @file ec200a.c + * @brief Implement the connection 4G adapter function, using EC200A device + * @version 3.0 + * @author AIIT XUOS Lab + * @date 2024.1.5 + */ + + +static int Ec200aMqttOpen() { + +} + + +static int Ec200aMqttClose() { + +} + +static int Ec200aMqttConnect() { + +} + +static int Ec200aMqttSend() { + +} + + +static int Ec200aMqttRecv() { + +} \ No newline at end of file From 3e93d2e173262195863d079147ba71335ba82247 Mon Sep 17 00:00:00 2001 From: xuyanghang Date: Tue, 9 Jan 2024 17:55:16 +0800 Subject: [PATCH 5/6] 4G module EC200A TCP connection --- APP_Framework/Framework/connection/4g/ec200a/ec200a.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/APP_Framework/Framework/connection/4g/ec200a/ec200a.c b/APP_Framework/Framework/connection/4g/ec200a/ec200a.c index 38def6ddf..d19f9b008 100644 --- a/APP_Framework/Framework/connection/4g/ec200a/ec200a.c +++ b/APP_Framework/Framework/connection/4g/ec200a/ec200a.c @@ -30,7 +30,10 @@ #define EC200A_DEACTIVE_PDP_CMD "AT+QIDEACT=1\r\n" #define EC200A_OPEN_SOCKET_CMD "AT+QIOPEN=1,%u" #define EC200A_CLOSE_SOCKET_CMD "AT+QICLOSE=%u\r\n" -#define EC200A_CLOSE "AT+QPOWD" +#define EC200A_CLOSE "AT+QPOWD\r\n" +#define EC200A_GET_COPS_CMD "AT+COPS?\r\n" +#define EC200A_GET_CSQ_CMD "AT+CSQ\r\n" +#define EC200A_GET_POP_IP "AT+CGPADDR=1\r\n" #define EC200A_OK_REPLY "OK" #define EC200A_READY_REPLY "READY" @@ -373,6 +376,10 @@ out: return -1; } +static int Ec200aNetstat() { + +} + static const struct IpProtocolDone ec200a_done = { .open = Ec200aOpen, @@ -384,7 +391,7 @@ static const struct IpProtocolDone ec200a_done = .setdns = NULL, .setdhcp = NULL, .ping = NULL, - .netstat = NULL, + .netstat = Ec200aNetstat, .connect = Ec200aConnect, .send = Ec200aSend, .recv = Ec200aRecv, From e5802dc0f304c0368cce5a2e4f47351a837790ea Mon Sep 17 00:00:00 2001 From: xuyanghang Date: Tue, 9 Jan 2024 17:59:12 +0800 Subject: [PATCH 6/6] merge upstream --- APP_Framework/Framework/connection/4g/ec200a/Kconfig | 8 -------- 1 file changed, 8 deletions(-) diff --git a/APP_Framework/Framework/connection/4g/ec200a/Kconfig b/APP_Framework/Framework/connection/4g/ec200a/Kconfig index 4f36d58c0..fd7ca98a9 100644 --- a/APP_Framework/Framework/connection/4g/ec200a/Kconfig +++ b/APP_Framework/Framework/connection/4g/ec200a/Kconfig @@ -3,7 +3,6 @@ config ADAPTER_4G_EC200A default "ec200a" if ADD_XIZI_FEATURES -<<<<<<< HEAD config ADAPTER_EC200A_USING_PWRKEY bool "EC200A using PWRKEY pin number" default n @@ -103,10 +102,3 @@ if ADD_RTTHREAD_FEATURES endif -======= - config ADAPTER_EC200A_DRIVER - string "EC200A device uart driver path" - default "/dev/usart6_dev6" -endif - ->>>>>>> upstream/prepare_for_master