Browse Source

add: airlink,spi从机实现基础devinfo的获取

??? 7 months ago
parent
commit
1489cf26d6

+ 6 - 1
components/airlink/binding/luat_lib_airlink.c

@@ -553,7 +553,12 @@ log.info("airlink", "从机固件版本号", airlink.sver())
 */
 static int l_airlink_sversion(lua_State *L) {
     uint32_t version = 0;
-    memcpy(&version, g_airlink_ext_dev_info.wifi.version, 4);
+    if (g_airlink_ext_dev_info.tp == 0x01) {
+        memcpy(&version, g_airlink_ext_dev_info.wifi.version, 4);
+    }
+    else if (g_airlink_ext_dev_info.tp == 0x02) {
+        memcpy(&version, g_airlink_ext_dev_info.cat1.version, 4);
+    }
     lua_pushinteger(L, version);
     return 1;
 }

+ 8 - 1
components/airlink/include/luat_airlink.h

@@ -89,6 +89,9 @@ typedef int (*luat_airlink_cmd_exec)(luat_airlink_cmd_t* cmd, void* userdata);
 
 typedef int (*luat_airlink_link_data_cb)(airlink_link_data_t* link);
 
+#include "luat_mobile.h"
+typedef void (*luat_airlink_mobile_evt_cb)(LUAT_MOBILE_EVENT_E event, uint8_t index, uint8_t status, void* ptr);
+
 typedef struct luat_airlink_cmd_reg
 {
     uint16_t id;
@@ -151,7 +154,7 @@ typedef struct luat_airlink_dev_cat_info {
     uint8_t version[4];
     uint8_t fw_type[4];
     uint8_t unique_id_len;
-    uint8_t unique_id[24];
+    uint8_t unique_id[32];
 }luat_airlink_dev_wifi_cat_t;
 
 typedef struct luat_airlink_dev_info
@@ -264,6 +267,10 @@ int luat_airlink_drv_uart_write(int uart_id, void* data, size_t length);
 int luat_airlink_drv_uart_read(int uart_id, void* buffer, size_t length);
 int luat_airlink_drv_uart_close(int uart_id);
 
+// mobile类
+#include "luat_mobile.h"
+int luat_airlink_drv_mobile_event_callback(LUAT_MOBILE_EVENT_E event, uint8_t index, uint8_t status, void* ptr);
+
 extern uint32_t g_airlink_debug;
 
 int luat_airlink_syspub_addstring(const char* str, size_t len, uint8_t *dst, uint32_t limit);

+ 15 - 0
components/airlink/include/luat_airlink_drv_mobile.h

@@ -0,0 +1,15 @@
+#ifndef LUAT_AIRLINK_DRV_MOBILE_H
+#define LUAT_AIRLINK_DRV_MOBILE_H
+
+
+#ifndef LUAT_AIRLINK_H
+#error "include luat_airlink.h first"
+#endif
+
+// mobile 操作
+#include "luat_mobile.h"
+
+
+int luat_airlink_drv_mobile_event_callback(LUAT_MOBILE_EVENT_E event, uint8_t index, uint8_t status, void* ptr);
+
+#endif

+ 28 - 0
components/airlink/src/driver/luat_airlink_drv_mobile.c

@@ -0,0 +1,28 @@
+#include "luat_base.h"
+#include "luat_spi.h"
+#include "luat_airlink.h"
+
+
+#include "luat_rtos.h"
+#include "luat_debug.h"
+#include "luat_spi.h"
+#include "luat_gpio.h"
+#include "luat_mem.h"
+#include "luat_airlink.h"
+#include "luat_mobile.h"
+
+#define LUAT_LOG_TAG "airlink"
+#include "luat_log.h"
+
+#undef LLOGD
+#define LLOGD(...) 
+luat_airlink_mobile_evt_cb g_airlink_mobile_evt_cb;
+
+extern luat_airlink_dev_info_t g_airlink_ext_dev_info;
+
+int luat_airlink_drv_mobile_event_callback(LUAT_MOBILE_EVENT_E event, uint8_t index, uint8_t status, void* ptr) {
+	if (g_airlink_mobile_evt_cb) {
+		g_airlink_mobile_evt_cb(event, index, status, ptr);
+	}
+    return 0;
+}

+ 70 - 0
components/airlink/src/exec/luat_airlink_cmd_exec_mobile.c

@@ -0,0 +1,70 @@
+#include "luat_base.h"
+#include "luat_spi.h"
+#include "luat_airlink.h"
+
+
+#include "luat_rtos.h"
+#include "luat_debug.h"
+#include "luat_spi.h"
+#include "luat_pm.h"
+#include "luat_gpio.h"
+#include "luat_airlink.h"
+#include "luat_mobile.h"
+
+#define LUAT_LOG_TAG "airlink"
+#include "luat_log.h"
+
+extern luat_airlink_dev_info_t g_airlink_ext_dev_info;
+
+int luat_airlink_cmd_exec_mobile_imei(luat_airlink_cmd_t* cmd, void* userdata) {
+    int ret = 0;
+    uint8_t index = cmd->data[8];
+    
+    char imei[16] = {0};
+    ret = luat_mobile_get_imei(index, imei, 16);
+    if (ret > 0) {
+        memcpy(g_airlink_ext_dev_info.cat1.imei, imei, 16);
+    }
+
+    return 0;
+}
+
+int luat_airlink_cmd_exec_mobile_imsi(luat_airlink_cmd_t* cmd, void* userdata) {
+    int ret = 0;
+    uint8_t index = cmd->data[8];
+    
+    char imsi[16] = {0};
+    ret = luat_mobile_get_imsi(index, imsi, 16);
+    if (ret > 0) {
+        memcpy(g_airlink_ext_dev_info.cat1.imsi, imsi, 16);
+    }
+
+    return 0;
+}
+
+int luat_airlink_cmd_exec_mobile_iccid(luat_airlink_cmd_t* cmd, void* userdata) {
+    int ret = 0;
+    uint8_t index = cmd->data[8];
+    
+    char iccid[20] = {0};
+    ret = luat_mobile_get_imei(index, iccid, 20);
+    if (ret > 0) {
+        memcpy(g_airlink_ext_dev_info.cat1.iccid, iccid, 20);
+    }
+
+    return 0;
+}
+
+int luat_airlink_cmd_exec_mobile_muid(luat_airlink_cmd_t* cmd, void* userdata) {
+    int ret = 0;
+    
+    char muid[33] = {0};
+    ret = luat_mobile_get_muid(muid, 32);
+    // 暂时先不传
+    // if (ret > 0) {
+    //     g_airlink_ext_dev_info.cat1.unique_id_len = 32;
+    //     memcpy(g_airlink_ext_dev_info.cat1.unique_id, muid, g_airlink_ext_dev_info.cat1.unique_id_len);
+    // }
+
+    return 0;
+}

+ 7 - 1
components/airlink/src/luat_airlink.c

@@ -558,6 +558,12 @@ int luat_airlink_has_wifi(void) {
 
 uint32_t luat_airlink_sversion(void) {
     uint32_t version = 0;
-    memcpy(&version, g_airlink_ext_dev_info.wifi.version, 4);
+
+    if (g_airlink_ext_dev_info.tp == 0x01) {
+        memcpy(&version, g_airlink_ext_dev_info.wifi.version, 4);
+    }
+    else if (g_airlink_ext_dev_info.tp == 0x02) {
+        memcpy(&version, g_airlink_ext_dev_info.cat1.version, 4);
+    }
     return version;
 }

+ 234 - 7
components/airlink/src/task/luat_airlink_spi_slave_task.c

@@ -3,6 +3,8 @@
 #include "luat_airlink.h"
 
 #include "luat_rtos.h"
+#include "luat_mobile.h"
+#include "luat_network_adapter.h"
 #include "luat_debug.h"
 #include "luat_spi.h"
 #include "luat_pm.h"
@@ -123,8 +125,7 @@ static void slave_irq_mode_startup(airlink_link_data_t* link) {
     // is_irq_mode = 1;
 }
 
-static void spi_gpio_setup(void)
-{
+static void spi_gpio_setup(void) {
     // LLOGD("spi_gpio_setup");
     // LLOGD("g_airlink_spi_conf %p", &g_airlink_spi_conf);
     // int ret = 0;
@@ -189,7 +190,232 @@ static void spi_gpio_setup(void)
     }
 }
 
-static uint32_t sta_ap_info_update_tm;
+extern luat_airlink_mobile_evt_cb g_airlink_mobile_evt_cb;
+static int mobile_evt_handler(LUAT_MOBILE_EVENT_E event, uint8_t index, uint8_t status, void* ptr) {
+    // luat_airlink_cmd_t *cmd = (luat_airlink_cmd_t *)basic_info;
+    luat_airlink_dev_info_t *devinfo = self_devinfo();
+	// LLOGD("mobile_evt_handler event:%d, index:%d, status:%d", event, index, status);
+	switch(event)
+	{
+	case LUAT_MOBILE_EVENT_CFUN:
+		break;
+	case LUAT_MOBILE_EVENT_SIM:
+/*
+@sys_pub mobile
+sim卡状态变化
+SIM_IND
+@usage
+sys.subscribe("SIM_IND", function(status, value)
+    -- status的取值有:
+    -- RDY SIM卡就绪, value为nil
+    -- NORDY 无SIM卡, value为nil
+    -- SIM_PIN 需要输入PIN, value为nil
+    -- GET_NUMBER 获取到电话号码(不一定有值), value为nil
+    -- SIM_WC SIM卡的写入次数统计,掉电归0, value为统计值
+    log.info("sim status", status, value)
+end)
+*/
+        LLOGD("SIM_IND -> status %d", status);
+        devinfo->cat1.sim_state = status;
+        switch (status)
+        {
+        case LUAT_MOBILE_SIM_READY:
+            luat_mobile_get_iccid(0, (char*)devinfo->cat1.iccid, 20);
+            luat_mobile_get_imsi(0, (char*)devinfo->cat1.imsi, 16);
+            LLOGD("SIM_READY -> ICCID %s", devinfo->cat1.iccid);
+            LLOGD("SIM_READY -> IMSI %s", devinfo->cat1.imsi);
+            send_devinfo_update_evt();
+            break;
+        case LUAT_MOBILE_NO_SIM:
+            memset(devinfo->cat1.iccid, 0, 20);
+            memset(devinfo->cat1.imsi, 0, 16);
+            send_devinfo_update_evt();
+            break;
+        case LUAT_MOBILE_SIM_NEED_PIN:
+            break;
+        case LUAT_MOBILE_SIM_NUMBER:
+            break;
+        case LUAT_MOBILE_SIM_WC:
+            break;
+        default:
+            break;
+        }
+		break;
+	case LUAT_MOBILE_EVENT_REGISTER_STATUS:
+		break;
+	case LUAT_MOBILE_EVENT_CELL_INFO:
+        switch (status)
+        {
+        case LUAT_MOBILE_CELL_INFO_UPDATE:
+/*
+@sys_pub mobile
+基站数据已更新
+CELL_INFO_UPDATE
+@usage
+-- 订阅式
+sys.subscribe("CELL_INFO_UPDATE", function()
+    log.info("cell", json.encode(mobile.getCellInfo()))
+end)
+*/
+
+		    break;
+        case LUAT_MOBILE_SERVICE_CELL_UPDATE:
+/*
+@sys_pub mobile
+服务小区额外信息更新
+SCELL_INFO
+@usage
+-- 订阅式
+sys.subscribe("SCELL_INFO", function()
+    log.info("service cell", mobile.scell()))
+end)
+*/
+
+        default:
+            break;
+        }
+		break;
+	case LUAT_MOBILE_EVENT_PDP:
+		LLOGD("cid%d, state%d", index, status);
+		break;
+	case LUAT_MOBILE_EVENT_NETIF:
+		switch (status)
+		{
+		case LUAT_MOBILE_NETIF_LINK_ON: {
+        devinfo->cat1.cat_state = 1;
+        send_devinfo_update_evt();
+        LLOGD("NETIF_LINK_ON -> IP_READY cat1.cat_state %d ipv4 %d.%d.%d.%d", devinfo->cat1.cat_state, devinfo->cat1.ipv4[0], devinfo->cat1.ipv4[1], devinfo->cat1.ipv4[2], devinfo->cat1.ipv4[3]);
+/*
+@sys_pub mobile
+已联网
+IP_READY
+@usage
+-- 联网后会发一次这个消息
+sys.subscribe("IP_READY", function(ip, adapter)
+    log.info("mobile", "IP_READY", ip, (adapter or -1) == socket.LWIP_GP)
+end)
+*/
+			break;
+        }
+        case LUAT_MOBILE_NETIF_LINK_OFF:
+        devinfo->cat1.cat_state = 0;
+        send_devinfo_update_evt();
+        LLOGD("NETIF_LINK_OFF -> IP_LOSE cat1.cat_state %d", devinfo->cat1.cat_state); 
+/*
+@sys_pub mobile
+已断网
+IP_LOSE
+@usage
+-- 断网后会发一次这个消息
+sys.subscribe("IP_LOSE", function(adapter)
+    log.info("mobile", "IP_LOSE", (adapter or -1) == socket.LWIP_GP)
+end)
+*/
+            break;
+		default:
+			break;
+		}
+		break;
+	case LUAT_MOBILE_EVENT_TIME_SYNC:
+/*
+@sys_pub mobile
+时间已经同步
+NTP_UPDATE
+@usage
+-- 对于电信/移动的卡, 联网后,基站会下发时间,但联通卡不会,务必留意
+sys.subscribe("NTP_UPDATE", function()
+    log.info("mobile", "time", os.date())
+end)
+*/
+
+		break;
+	case LUAT_MOBILE_EVENT_CSCON:
+//		LLOGD("CSCON %d", status);
+/*
+@sys_pub mobile
+RRC状态
+CSCON
+@usage
+-- state 1 CONNECT 0 IDLE
+sys.subscribe("CSCON", function(state)
+	log.info("mobile", "CSCON", state)
+end)
+*/
+
+		break;
+	case LUAT_MOBILE_EVENT_BEARER:
+		LLOGD("bearer act %d, result %d",status, index);
+		break;
+	case LUAT_MOBILE_EVENT_SMS:
+		switch(status)
+		{
+		case LUAT_MOBILE_SMS_READY:
+			LLOGI("sim%d sms ready", index);
+			break;
+		case LUAT_MOBILE_NEW_SMS:
+			break;
+		case LUAT_MOBILE_SMS_SEND_DONE:
+			break;
+		case LUAT_MOBILE_SMS_ACK:
+			break;
+		}
+		break;
+	case LUAT_MOBILE_EVENT_IMS_REGISTER_STATUS:
+        LLOGD("ims reg state %d", status);
+		break;
+    case LUAT_MOBILE_EVENT_CC:
+        LLOGD("LUAT_MOBILE_EVENT_CC status %d",status);
+/*
+@sys_pub mobile
+通话状态变化
+CC_IND
+@usage
+sys.subscribe("CC_IND", function(status, value)
+    log.info("cc status", status, value)
+end)
+*/
+        switch(status){
+        case LUAT_MOBILE_CC_READY:
+            LLOGD("LUAT_MOBILE_CC_READY");
+            break;
+        case LUAT_MOBILE_CC_INCOMINGCALL:
+            break;
+        case LUAT_MOBILE_CC_CALL_NUMBER:
+            // lua_pushstring(L, "CC_IND");
+            // lua_pushstring(L, "CALL_NUMBER");
+            // lua_call(L, 2, 0);
+            break;
+        case LUAT_MOBILE_CC_CONNECTED_NUMBER:
+            // lua_pushstring(L, "CC_IND");
+            // lua_pushstring(L, "CONNECTED_NUMBER");
+            // lua_call(L, 2, 0);
+            break;
+        case LUAT_MOBILE_CC_CONNECTED:
+            break;
+        case LUAT_MOBILE_CC_DISCONNECTED:
+            break;
+        case LUAT_MOBILE_CC_SPEECH_START:
+            break;
+        case LUAT_MOBILE_CC_MAKE_CALL_OK:
+            break;
+        case LUAT_MOBILE_CC_MAKE_CALL_FAILED:
+            break;
+        case LUAT_MOBILE_CC_ANSWER_CALL_DONE:
+            break;
+        case LUAT_MOBILE_CC_HANGUP_CALL_DONE:
+            break;
+        case LUAT_MOBILE_CC_LIST_CALL_RESULT:
+            break;
+        case LUAT_MOBILE_CC_PLAY:// 最先
+            break;
+        }
+        break;
+	default:
+		break;
+	}
+    send_devinfo_update_evt();
+    return 0;
+}
 
 __USER_FUNC_IN_RAM__ static void start_spi_trans(void) {
     // 首先, 把rxbuff填0, 不要收到老数据的干扰
@@ -230,15 +456,16 @@ __USER_FUNC_IN_RAM__ static void spi_slave_task(void *param)
     
     luat_airlink_dev_info_t *devinfo = self_devinfo();
     devinfo->tp = 0x02;
-    // uint32_t fw_version = 3;
-    // memcpy(devinfo->cat1.version, &fw_version, sizeof(uint32_t));
-
-    // luat_mobile_event_register_handler(cat1_evt_handler);
+    uint32_t fw_version = 3;
+    memcpy(devinfo->cat1.version, &fw_version, sizeof(uint32_t));   // 版本
+    luat_mobile_get_sn(devinfo->cat1.unique_id, 32);                // 唯一ID
+    luat_mobile_get_imei(0, devinfo->cat1.imei, 16);                // IMEI
 
 
     // // 执行主循环
     g_airlink_link_data_cb = link_data_cb;
     g_airlink_newdata_notify_cb = on_newdata_notify;
+    g_airlink_mobile_evt_cb = mobile_evt_handler;
 
     // 告知已经就绪
     self_ready = 1;

+ 12 - 0
components/airlink/src/task/luat_airlink_task.c

@@ -57,6 +57,13 @@ __USER_FUNC_IN_RAM__ void luat_airlink_on_data_recv(uint8_t *data, size_t len) {
         return;
     }
     #endif
+    #ifdef LUAT_USE_DRV_MOBILE
+    luat_airlink_cmd_t* cmd = (luat_airlink_cmd_t*)data;
+    if (cmd->cmd >= 0x800) {
+        LLOGD("收到指令/回复 cmd %d len %d", cmd->cmd, cmd->len);
+        return;
+    }
+    #endif
     void* ptr = luat_heap_opt_malloc(AIRLINK_MEM_TYPE, len);
     if (ptr == NULL) {
         LLOGE("airlink分配内存失败!!! %d", len);
@@ -97,6 +104,11 @@ __USER_FUNC_IN_RAM__ static int luat_airlink_task(void *param) {
                     memcpy(&tmpv, g_airlink_ext_dev_info.wifi.version, 4);
                     LLOGI("AIRLINK_READY %ld version %ld", (uint32_t)g_airlink_last_cmd_timestamp, tmpv);
                 }
+                else if (g_airlink_ext_dev_info.tp == 0x02) {
+                    uint32_t tmpv = 0;
+                    memcpy(&tmpv, g_airlink_ext_dev_info.cat1.version, 4);
+                    LLOGI("AIRLINK_READY %ld version %ld", (uint32_t)g_airlink_last_cmd_timestamp, tmpv);
+                }
                 else {
                     LLOGI("AIRLINK_READY %ld", (uint32_t)g_airlink_last_cmd_timestamp);
                 }

+ 7 - 0
components/mobile/luat_lib_mobile.c

@@ -36,6 +36,10 @@ log.info("simid", mobile.simid())
 #include "luat_log.h"
 extern void luat_cc_start_speech(uint32_t param);
 extern void luat_cc_play_tone(uint32_t param);
+
+#ifdef LUAT_USE_AIRLINK
+#include "luat_airlink.h"
+#endif
 /**
 获取IMEI
 @api mobile.imei(index)
@@ -1574,6 +1578,9 @@ void luat_mobile_event_cb(LUAT_MOBILE_EVENT_E event, uint8_t index, uint8_t stat
     default:
         break;
 	}
+#endif
+#if defined LUAT_USE_AIRLINK
+    luat_airlink_drv_mobile_event_callback(event, index, status, ptr);
 #endif
     rtos_msg_t msg = {
         .handler = l_mobile_event_handle,

+ 2 - 2
components/network/netdrv/src/luat_netdrv_whale.c

@@ -91,12 +91,12 @@ void luat_netdrv_whale_boot(luat_netdrv_t* drv, void* userdata) {
     netif_add(netdrv->netif, IP4_ADDR_ANY, IP4_ADDR_ANY, IP4_ADDR_ANY, netdrv, luat_netif_init, luat_netdrv_netif_input_main);
 
     // 网卡设置成半可用状态
-    if (netdrv->id == NW_ADAPTER_INDEX_LWIP_WIFI_STA || netdrv->id == NW_ADAPTER_INDEX_LWIP_WIFI_AP) {
+    if (netdrv->id == NW_ADAPTER_INDEX_LWIP_WIFI_STA || netdrv->id == NW_ADAPTER_INDEX_LWIP_WIFI_AP || netdrv->id == NW_ADAPTER_INDEX_LWIP_GP_GW) {
     }
     else {
         netif_set_up(netdrv->netif);
     }
-    if (netdrv->id == NW_ADAPTER_INDEX_LWIP_WIFI_STA) {
+    if (netdrv->id == NW_ADAPTER_INDEX_LWIP_WIFI_STA || netdrv->id == NW_ADAPTER_INDEX_LWIP_GP_GW) {
         cfg->dhcp = 1;
         cfg->ulwip.dhcp_enable = 1;
     }