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

Merge branch 'master' of https://gitee.com/openLuat/LuatOS

马亚丹 6 месяцев назад
Родитель
Сommit
43cebbce35
100 измененных файлов с 2411 добавлено и 2491 удалено
  1. 7 0
      components/misc/include/luat_misc.h
  2. 20 16
      components/network/httpsrv/src/luat_httpsrv_lwip.c
  3. 40 28
      components/network/iperf/binding/luat_lib_iperf.c
  4. 4 4
      components/network/netdrv/binding/luat_lib_netdrv.c
  5. 2 2
      components/network/netdrv/src/ch390h_api.c
  6. 9 9
      components/network/netdrv/src/luat_netdrv_event.c
  7. 18 0
      components/pins/binding/luat_lib_pins.c
  8. 0 112
      components/pins/meta/Air8000.define.json
  9. 0 112
      components/pins/meta/Air8000A.define.json
  10. 0 100
      components/pins/meta/Air8000D.define.json
  11. 0 112
      components/pins/meta/Air8000G.define.json
  12. 0 100
      components/pins/meta/Air8000T.define.json
  13. 0 112
      components/pins/meta/Air8000W.define.json
  14. 0 132
      components/pins/meta/air780egh.define.json
  15. 0 130
      components/pins/meta/air780ehm.define.json
  16. 0 129
      components/pins/meta/air780ehv.define.json
  17. 0 130
      components/pins/meta/air780epm.define.json
  18. 0 112
      components/pins/meta/define_check.py
  19. 91 3
      luat/demo/netdrv/ch390h/wan.lua
  20. 79 0
      module/Air8000/demo/accessory_board/AirETH_1000/lan.lua
  21. 66 0
      module/Air8000/demo/accessory_board/AirETH_1000/main.lua
  22. 49 0
      module/Air8000/demo/accessory_board/AirETH_1000/netif_app.lua
  23. 125 0
      module/Air8000/demo/accessory_board/AirETH_1000/readme.md
  24. 60 0
      module/Air8000/demo/accessory_board/AirETH_1000/wan.lua
  25. 2 0
      module/Air8000/demo/ble/central/ble_client_sender.lua
  26. 21 6
      module/Air8000/demo/ble/central/ble_timer_app.lua
  27. 2 0
      module/Air8000/demo/ble/peripheral/ble_server_sender.lua
  28. 18 6
      module/Air8000/demo/ble/peripheral/ble_timer_app.lua
  29. 1 1
      module/Air8000/demo/errDump/auto_dump_udp_srv.lua
  30. 7 12
      module/Air8000/demo/errDump/errdump_read.lua
  31. 1 1
      module/Air8000/demo/errDump/errdump_tcp/tcp_client_main.lua
  32. 2 2
      module/Air8000/demo/errDump/main.lua
  33. 1 0
      module/Air8000/project/wifi_ap_read_file/ap_init.lua
  34. 0 0
      module/Air8101/demo/accessory_board/AirCAMERA_1020/AirCAMERA_1020.lua
  35. 0 0
      module/Air8101/demo/accessory_board/AirCAMERA_1020/http_app.lua
  36. 0 0
      module/Air8101/demo/accessory_board/AirCAMERA_1020/main.lua
  37. 77 77
      module/Air8101/demo/accessory_board/AirCAMERA_1020/readme.md
  38. 0 0
      module/Air8101/demo/accessory_board/AirCAMERA_1020/wifi_app.lua
  39. 0 0
      module/Air8101/demo/accessory_board/AirCAMERA_1030/AirCAMERA_1030.lua
  40. 0 0
      module/Air8101/demo/accessory_board/AirCAMERA_1030/http_app.lua
  41. 0 0
      module/Air8101/demo/accessory_board/AirCAMERA_1030/main.lua
  42. 58 58
      module/Air8101/demo/accessory_board/AirCAMERA_1030/readme.md
  43. 0 0
      module/Air8101/demo/accessory_board/AirCAMERA_1030/wifi_app.lua
  44. 0 0
      module/Air8101/demo/accessory_board/AirETH_1000/http_app.lua
  45. 0 0
      module/Air8101/demo/accessory_board/AirETH_1000/main.lua
  46. 0 0
      module/Air8101/demo/accessory_board/AirETH_1000/net_app.lua
  47. 0 0
      module/Air8101/demo/accessory_board/AirETH_1000/readme.md
  48. 0 0
      module/Air8101/demo/accessory_board/AirFONTS_1000/lcd/AirFONTS_1000.lua
  49. 0 0
      module/Air8101/demo/accessory_board/AirFONTS_1000/lcd/AirLCD_1020.lua
  50. 0 0
      module/Air8101/demo/accessory_board/AirFONTS_1000/lcd/lcd_vector_font_app.lua
  51. 0 0
      module/Air8101/demo/accessory_board/AirFONTS_1000/lcd/main.lua
  52. 125 125
      module/Air8101/demo/accessory_board/AirFONTS_1000/lcd/readme.md
  53. 0 0
      module/Air8101/demo/accessory_board/AirFONTS_1000/lvgl/AirFONTS_1000.lua
  54. 0 0
      module/Air8101/demo/accessory_board/AirFONTS_1000/lvgl/AirLCD_1020.lua
  55. 0 0
      module/Air8101/demo/accessory_board/AirFONTS_1000/lvgl/lcd_vector_font_app.lua
  56. 0 0
      module/Air8101/demo/accessory_board/AirFONTS_1000/lvgl/main.lua
  57. 121 121
      module/Air8101/demo/accessory_board/AirFONTS_1000/lvgl/readme.md
  58. 0 0
      module/Air8101/demo/accessory_board/AirGPIO_1000/AirGPIO_1000.lua
  59. 0 0
      module/Air8101/demo/accessory_board/AirGPIO_1000/gpio_app.lua
  60. 0 0
      module/Air8101/demo/accessory_board/AirGPIO_1000/main.lua
  61. 74 74
      module/Air8101/demo/accessory_board/AirGPIO_1000/readme.md
  62. 0 0
      module/Air8101/demo/accessory_board/AirKEY_1000/AirKEY_1000.lua
  63. 0 0
      module/Air8101/demo/accessory_board/AirKEY_1000/key_app.lua
  64. 0 0
      module/Air8101/demo/accessory_board/AirKEY_1000/main.lua
  65. 76 76
      module/Air8101/demo/accessory_board/AirKEY_1000/readme.md
  66. 0 0
      module/Air8101/demo/accessory_board/AirLCD_1020/lcd/AirLCD_1020.lua
  67. 0 0
      module/Air8101/demo/accessory_board/AirLCD_1020/lcd/bird.jpg
  68. 0 0
      module/Air8101/demo/accessory_board/AirLCD_1020/lcd/introduction.jpg
  69. 0 0
      module/Air8101/demo/accessory_board/AirLCD_1020/lcd/lcd_app.lua
  70. 0 0
      module/Air8101/demo/accessory_board/AirLCD_1020/lcd/lcd_jpg_fps.lua
  71. 0 0
      module/Air8101/demo/accessory_board/AirLCD_1020/lcd/main.lua
  72. 0 0
      module/Air8101/demo/accessory_board/AirLCD_1020/lcd/pins_Air8101.json
  73. 105 105
      module/Air8101/demo/accessory_board/AirLCD_1020/lcd/readme.md
  74. 0 0
      module/Air8101/demo/accessory_board/AirLCD_1020/lvgl/AirLCD_1020.lua
  75. 0 0
      module/Air8101/demo/accessory_board/AirLCD_1020/lvgl/lcd_app.lua
  76. 0 0
      module/Air8101/demo/accessory_board/AirLCD_1020/lvgl/main.lua
  77. 0 0
      module/Air8101/demo/accessory_board/AirLCD_1020/lvgl/pins_Air8101.json
  78. 103 103
      module/Air8101/demo/accessory_board/AirLCD_1020/lvgl/readme.md
  79. 9 9
      module/Air8101/demo/accessory_board/AirLCD_1020/readme.md
  80. 321 0
      module/Air8101/demo/accessory_board/AirMICROSD_1000/AirMICROSD_1000.lua
  81. 82 0
      module/Air8101/demo/accessory_board/AirMICROSD_1000/http_download_file.lua
  82. 82 0
      module/Air8101/demo/accessory_board/AirMICROSD_1000/main.lua
  83. 181 0
      module/Air8101/demo/accessory_board/AirMICROSD_1000/readme.md
  84. 53 53
      module/Air8101/demo/accessory_board/AirPHY_1000/http_app.lua
  85. 0 0
      module/Air8101/demo/accessory_board/AirPHY_1000/main.lua
  86. 42 42
      module/Air8101/demo/accessory_board/AirPHY_1000/phy_app.lua
  87. 88 88
      module/Air8101/demo/accessory_board/AirPHY_1000/readme.md
  88. 0 0
      module/Air8101/demo/accessory_board/AirSHT30_1000/AirSHT30_1000.lua
  89. 0 0
      module/Air8101/demo/accessory_board/AirSHT30_1000/main.lua
  90. 62 62
      module/Air8101/demo/accessory_board/AirSHT30_1000/readme.md
  91. 0 0
      module/Air8101/demo/accessory_board/AirSHT30_1000/sht30_app.lua
  92. 0 0
      module/Air8101/demo/accessory_board/AirUSBHUB_1000/AirCAMERA_1030.lua
  93. 0 0
      module/Air8101/demo/accessory_board/AirUSBHUB_1000/http_app.lua
  94. 0 0
      module/Air8101/demo/accessory_board/AirUSBHUB_1000/main.lua
  95. 63 63
      module/Air8101/demo/accessory_board/AirUSBHUB_1000/readme.md
  96. 0 0
      module/Air8101/demo/accessory_board/AirUSBHUB_1000/wifi_app.lua
  97. 0 0
      module/Air8101/demo/accessory_board/AirVOC_1000/AirVOC_1000.lua
  98. 0 0
      module/Air8101/demo/accessory_board/AirVOC_1000/main.lua
  99. 64 64
      module/Air8101/demo/accessory_board/AirVOC_1000/readme.md
  100. 0 0
      module/Air8101/demo/accessory_board/AirVOC_1000/voc_app.lua

+ 7 - 0
components/misc/include/luat_misc.h

@@ -0,0 +1,7 @@
+#ifndef __LUAT_MISC_H__
+#define __LUAT_MISC_H__
+#include "stdint.h"
+typedef void (*powerkey_cb)(uint32_t event);
+uint8_t luat_misc_powerkey_get(void);
+void luat_misc_powerkey_setup(uint8_t enable, uint16_t press_deboubce_time, uint16_t release_deboubce_time, powerkey_cb cb);
+#endif

+ 20 - 16
components/network/httpsrv/src/luat_httpsrv_lwip.c

@@ -349,24 +349,28 @@ static err_t client_sent_cb(void *arg, struct tcp_pcb *tpcb, u16_t len) {
             }
         }
         else {
-            ret = luat_fs_fread(ctx->sbuff, 1400, 1, ctx->fd);
-            if (ret < 1) {
-                luat_fs_fclose(ctx->fd);
-                ctx->fd = NULL;
-                // tcp_err(ctx->pcb, NULL);
-                // tcp_sent(ctx->pcb, NULL);
-                // tcp_close(ctx->pcb);
-                // client_cleanup(ctx);
-                ctx->write_done = 1;
-            }
-            else {
-                ctx->sbuff_offset = ret;
-                ret = client_write(ctx, (const char*)ctx->sbuff, ctx->sbuff_offset);
-                if (ret == 0) {
-                    // ctx->send_size += ctx->sbuff_offset;
+            while (tcp_sndbuf(tpcb) > 1400)
+            {
+                ret = luat_fs_fread(ctx->sbuff, 1400, 1, ctx->fd);
+                if (ret < 1) {
+                    luat_fs_fclose(ctx->fd);
+                    ctx->fd = NULL;
+                    // tcp_err(ctx->pcb, NULL);
+                    // tcp_sent(ctx->pcb, NULL);
+                    // tcp_close(ctx->pcb);
+                    // client_cleanup(ctx);
+                    ctx->write_done = 1;
+                    break;
+                }
+                else {
+                    ctx->sbuff_offset = ret;
+                    ret = client_write(ctx, (const char*)ctx->sbuff, ctx->sbuff_offset);
+                    if (ret == 0) {
+                        // ctx->send_size += ctx->sbuff_offset;
+                        ctx->sbuff_offset = 0;
+                    }
                     ctx->sbuff_offset = 0;
                 }
-                ctx->sbuff_offset = 0;
             }
         }
     }

+ 40 - 28
components/network/iperf/binding/luat_lib_iperf.c

@@ -50,9 +50,11 @@ static void iperf_report_cb(void *arg, enum lwiperf_report_type report_type,
 }
 
 typedef struct iperf_start_ctx {
-    luat_netdrv_t* drv;
+    uint8_t adapter_index;
     uint8_t mode;
-    const ip_addr_t* remote_ip;
+    luat_netdrv_t* drv;
+    ip_addr_t remote_ip;
+    uint16_t port;
 }iperf_start_ctx_t;
 
 static void iperf_start_cb(void* args) {
@@ -61,48 +63,49 @@ static void iperf_start_cb(void* args) {
     iperf_start_ctx_t* ctx = (iperf_start_ctx_t*)args;
     uint8_t is_server = ctx->mode;
     luat_netdrv_t* drv = ctx->drv;
-    const ip_addr_t* remote_ip = ctx->remote_ip;
+    const ip_addr_t* remote_ip = &ctx->remote_ip;
     ipaddr_ntoa_r(&drv->netif->ip_addr, buff, sizeof(buff));
-    LLOGD("启动iperf %s %p", is_server ? "server" : "client", remote_ip);
+    // LLOGD("mode %s addr %s:%d", is_server ? "server" : "client", buff, ctx->port);
     if (is_server) {
-        iperf_session = luat_lwiperf_start_tcp_server(&drv->netif->ip_addr, 5001, iperf_report_cb, NULL);
-        LLOGD("iperf listen %s:5001", buff);
+        iperf_session = luat_lwiperf_start_tcp_server(&drv->netif->ip_addr, ctx->port, iperf_report_cb, NULL);
+        LLOGD("server listen %s:%d", buff, ctx->port);
     }
     else {
-        luat_lwiperf_start_tcp_client(remote_ip, 5001, LWIPERF_CLIENT, iperf_report_cb, NULL, &drv->netif->ip_addr);
+        luat_lwiperf_start_tcp_client(remote_ip, ctx->port, LWIPERF_CLIENT, iperf_report_cb, NULL, &drv->netif->ip_addr);
         ipaddr_ntoa_r(remote_ip, buff2, sizeof(buff2));
-        LLOGD("iperf connect %s --> %s:5001", buff, buff2);
+        LLOGD("client connect %s --> %s:%d", buff, buff2, ctx->port);
     }
 }
 
-static int start_gogogo(int adpater_id, int is_server, const ip_addr_t* remote_ip) {
-    if (adpater_id < 0 || adpater_id >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY) {
+static int start_gogogo(iperf_start_ctx_t* ctx) {
+    uint8_t adapter_index = ctx->adapter_index;
+    uint8_t is_server = ctx->mode;
+    if (adapter_index >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY) {
         // 必须明确指定合法的索引号
-        LLOGE("非法的网络适配器索引号 %d", adpater_id);
+        LLOGE("非法的网络适配器索引号 %d", adapter_index);
         return 0;
     }
     // 首先, 通过netdrv获取对应的网络设备的netif
-    luat_netdrv_t* drv = luat_netdrv_get(adpater_id);
+    luat_netdrv_t* drv = luat_netdrv_get(adapter_index);
     if (drv == NULL || drv->netif == NULL) {
-        LLOGE("非法的网络适配器索引号 %d", adpater_id);
+        LLOGE("该网络(%d)不支持iperf, 无法启动", adapter_index);
         return 0;
     }
     if (!netif_is_up(drv->netif) || !netif_is_link_up(drv->netif) || ip_addr_isany(&drv->netif->ip_addr)) {
-        LLOGE("该网络还没就绪, 无法启动");
+        LLOGE("该网络(%d)还没就绪, 无法启动", adapter_index);
         return 0;
     }
-    iperf_start_ctx_t ctx = {
-        .drv = drv,
-        .mode = is_server,
-        .remote_ip = remote_ip
-    };
-    tcpip_callback_with_block(iperf_start_cb, &ctx, 1);
+    ctx->drv = drv;
+    if (is_server) {
+        ctx->remote_ip = drv->netif->ip_addr;
+    }
+    tcpip_callback_with_block(iperf_start_cb, ctx, 1);
     return iperf_session != NULL;
 }
 
 /*
 启动server模式
-@api iperf.server(id)
+@api iperf.server(id, port)
 @int 网络适配器的id, 必须填, 例如 socket.LWIP_ETH0
 @return boolean 成功返回true, 失败返回false
 @usage
@@ -122,8 +125,11 @@ static int l_iperf_server(lua_State *L) {
         LLOGE("已经启动了server或者client,要先关掉才能启动新的");
         return 0;
     }
-    int adpater_id = luaL_checkinteger(L, 1);
-    if (start_gogogo(adpater_id, 1, NULL)) {
+    iperf_start_ctx_t ctx = {0};
+    ctx.adapter_index = luaL_checkinteger(L, 1);
+    ctx.mode = 1; // server模式
+    ctx.port = luaL_optinteger(L, 2, 5001);
+    if (start_gogogo(&ctx)) {
         lua_pushboolean(L, 1);
         return 1;
     }
@@ -132,7 +138,7 @@ static int l_iperf_server(lua_State *L) {
 
 /*
 启动client模式
-@api iperf.client(id)
+@api iperf.client(id, ip, port)
 @int 网络适配器的id, 必须填, 例如 socket.LWIP_ETH0
 @string 远程服务器的ip, 只能是ipv4地址,不支持域名!!! 必须填值
 @return boolean 成功返回true, 失败返回false
@@ -154,18 +160,24 @@ sys.subscribe("IPERF_REPORT", function(bytes, ms_duration, bandwidth)
 end)
 */
 static int l_iperf_client(lua_State *L) {
-    ip_addr_t remote_ip = {0};
     if (iperf_session != NULL) {
         LLOGE("已经启动了server或者client,要先关掉才能启动新的");
         return 0;
     }
-    int adpater_id = luaL_checkinteger(L, 1);
+    
+    iperf_start_ctx_t ctx = {0};
+    int adapter_index = luaL_checkinteger(L, 1);
     const char* ip = luaL_checkstring(L, 2);
-    if (ipaddr_aton(ip, &remote_ip) == 0) {
+    if (ipaddr_aton(ip, &ctx.remote_ip) == 0) {
         LLOGE("非法的ip地址 %s", ip);
         return 0;
     }
-    if (start_gogogo(adpater_id, 0, &remote_ip)) {
+    ctx.adapter_index = adapter_index;
+    ctx.port = luaL_optinteger(L, 3, 5001);
+    ctx.drv = luat_netdrv_get(adapter_index);
+    ctx.mode = 0; // client模式
+    // LLOGD("client connect to %s:%d", ip, ctx.port);
+    if (start_gogogo(&ctx)) {
         lua_pushboolean(L, 1);
         return 1;
     }

+ 4 - 4
components/network/netdrv/binding/luat_lib_netdrv.c

@@ -467,14 +467,14 @@ static void luat_socket_evt_cb(netdrv_tcp_evt_t* evt, void* userdata) {
 // 监听socket事件
 /*
 订阅网络事件
-@api netdrv.event_subscribe(adapter_id, event_type, callback)
+@api netdrv.on(adapter_id, event_type, callback)
 @int 网络适配器的id
 @int 事件总类型, 当前支持 netdrv.EVT_SOCKET
 @function 回调函数 function(id, event, params)
 @return bool 成功与否,成功返回true,否则返回nil
 @usage
 -- 订阅socket连接状态变化事件
-netdrv.event_subscribe(socket.LWIP_ETH, netdrv.EVT_SOCKET, function(id, event, params)
+netdrv.on(socket.LWIP_ETH, netdrv.EVT_SOCKET, function(id, event, params)
     -- id 是网络适配器id
     -- event是事件id, 字符串类型, 
         - create 创建socket对象
@@ -500,7 +500,7 @@ netdrv.event_subscribe(socket.LWIP_ETH, netdrv.EVT_SOCKET, function(id, event, p
     end
 end)
 */
-static int l_netdrv_event_subscribe(lua_State *L) {
+static int l_netdrv_on(lua_State *L) {
     int id = luaL_checkinteger(L, 1);
     if (id < 0) {
         return 0; // 非法id
@@ -547,7 +547,7 @@ static const rotable_Reg_t reg_netdrv[] =
 
     { "ctrl",           ROREG_FUNC(l_netdrv_ctrl)},
     { "debug",          ROREG_FUNC(l_netdrv_debug)},
-    { "event_subscribe",ROREG_FUNC(l_netdrv_event_subscribe)},
+    { "on",ROREG_FUNC(l_netdrv_on)},
 #ifdef LUAT_USE_MREPORT
     { "mreport",        ROREG_FUNC(l_mreport_config)},
 #endif

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

@@ -195,8 +195,6 @@ int luat_ch390h_read_pkg(ch390h_t* ch, uint8_t *buff, uint16_t* len) {
 
 int luat_ch390h_write_pkg(ch390h_t* ch, uint8_t *buff, uint16_t len) {
     uint8_t tmp[4] = {0};
-    // 写入下一个数据
-    luat_ch390h_write(ch, 0x78, len, buff);
     
     luat_ch390h_read(ch, 0x02, 1, tmp);
     uint8_t TCR = tmp[0];
@@ -229,6 +227,8 @@ int luat_ch390h_write_pkg(ch390h_t* ch, uint8_t *buff, uint16_t len) {
         }
         // return 1;
     }
+    // 写入下一个数据
+    luat_ch390h_write(ch, 0x78, len, buff);
     // TCR == 0之后, 才能写入长度
     luat_ch390h_write_reg(ch, 0x7C, len & 0xFF);
     luat_ch390h_write_reg(ch, 0x7D, (len >> 8) & 0xFF);

+ 9 - 9
components/network/netdrv/src/luat_netdrv_event.c

@@ -12,7 +12,7 @@
 #define LUAT_LOG_TAG "netdrv"
 #include "luat_log.h"
 
-netdrv_tcpevt_reg_t g_netdrv_tcpevt_regs[NW_ADAPTER_QTY] = {0};
+static netdrv_tcpevt_reg_t s_tcpevt_regs[NW_ADAPTER_QTY] = {0};
 
 void luat_netdrv_register_socket_event_cb(uint8_t id, uint32_t evt_flags, luat_netdrv_tcp_evt_cb cb, void* userdata) {
     if (id >= NW_ADAPTER_QTY) {
@@ -20,13 +20,13 @@ void luat_netdrv_register_socket_event_cb(uint8_t id, uint32_t evt_flags, luat_n
         return;
     }
     if (evt_flags == 0) {
-        g_netdrv_tcpevt_regs[id].cb = NULL;
-        g_netdrv_tcpevt_regs[id].userdata = NULL;
+        s_tcpevt_regs[id].cb = NULL;
+        s_tcpevt_regs[id].userdata = NULL;
         return;
     }
-    g_netdrv_tcpevt_regs[id].flags = evt_flags;
-    g_netdrv_tcpevt_regs[id].cb = cb;
-    g_netdrv_tcpevt_regs[id].userdata = userdata;
+    s_tcpevt_regs[id].flags = evt_flags;
+    s_tcpevt_regs[id].cb = cb;
+    s_tcpevt_regs[id].userdata = userdata;
     // LLOGD("socket event cb adapter %d, flags=0x%02X userdata=%p", id, evt_flags, userdata);
 }
 
@@ -36,7 +36,7 @@ __NETDRV_CODE_IN_RAM__ void luat_netdrv_fire_socket_event_netctrl(uint32_t event
     if (event_id < EV_NW_RESET || event_id == EV_NW_SOCKET_TX_OK || event_id == EV_NW_SOCKET_RX_NEW) {
         return; // 其他事件无视
     }
-    if (g_netdrv_tcpevt_regs[adapter_id].cb == NULL) {
+    if (s_tcpevt_regs[adapter_id].cb == NULL) {
         //LLOGD("TCP事件网络适配器ID无效 %d", adapter_id);
         return;
     }
@@ -45,7 +45,7 @@ __NETDRV_CODE_IN_RAM__ void luat_netdrv_fire_socket_event_netctrl(uint32_t event
         return;
     }
     event_id -= EV_NW_RESET;
-    if ((g_netdrv_tcpevt_regs[adapter_id].flags & event_id) == 0) {
+    if ((s_tcpevt_regs[adapter_id].flags & event_id) == 0) {
         //LLOGD("TCP事件网络适配器ID无效 %d", adapter_id);
         return;
     }
@@ -65,5 +65,5 @@ __NETDRV_CODE_IN_RAM__ void luat_netdrv_fire_socket_event_netctrl(uint32_t event
     evt.local_port = ctrl->local_port;
     evt.remote_port = ctrl->remote_port;
     evt.userdata = ctrl->user_data;
-    g_netdrv_tcpevt_regs[adapter_id].cb(&evt, g_netdrv_tcpevt_regs[adapter_id].userdata);
+    s_tcpevt_regs[adapter_id].cb(&evt, s_tcpevt_regs[adapter_id].userdata);
 }

+ 18 - 0
components/pins/binding/luat_lib_pins.c

@@ -172,7 +172,25 @@ LUAMOD_API int luaopen_pins( lua_State *L ) {
 	char buff[64] = {0};
 	char name[40] = {0};
 	luat_hmeta_model_name(name);
+	// 需要兼容2种命名风格, 严格模组命名, 或者全小写命名
+	// 首先, 找pins_Air780EPM.json
+	// 不存在的话, 找 pins_air780epm.json
 	snprintf(buff, sizeof(buff), "/luadb/pins_%s.json", name);
+	if (luat_fs_fexist(buff) == 0) {
+		int size = strlen(name);
+    	int j;
+    
+    	for( int i = 0; i < size - 1 ; i++){
+        	for (int j = 97; j < 123; j ++){
+            	if (name[i] == j){
+                	j = j - 32;
+                	name[i] = j;
+                	break;
+            	}
+        	}
+    	}
+		snprintf(buff, sizeof(buff), "/luadb/pins_%s.json", name);
+	}
 	
 	int ret = luat_pins_load_from_file(buff);
 	if (ret == 0) {

+ 0 - 112
components/pins/meta/Air8000.define.json

@@ -1,112 +0,0 @@
-{
-    "model":"air8000",
-    "pin_count":104,
-    "pins":[
-        [83,11,"GPIO16",["","","","","GPIO16","","",""]],
-        [82,12,"GPIO17",["","","","","GPIO17","","",""]],
-        [80,13,"I2C0_SCL",["","","I2C0_SCL","I2C1_SCL","GPIO18","PWM0","",""]],
-        [81,14,"I2C0_SDA",["","","I2C0_SDA","I2C1_SDA","GPIO19","PWM1","",""]],
-        [1,15,"USB_BOOT",["","","","","","","",""]],
-        [31,16,"GPIO1",["GPIO1","","","","","PWM0","",""]],
-        [30,17,"GPIO2",["GPIO2","","","","ONEWIRE","PWM1","",""]],
-        [98,18,"GPIO3",["GPIO3","CAM_MCLK","","","ONEWIRE","PWM2","",""]],
-        [67,19,"I2C1_SDA",["GPIO4","CAM_BCLK","I2C1_SDA","","USIM2_RST","","",""]],
-        [66,20,"I2C1_SCL",["GPIO5","CAM_CS","I2C1_SCL","","USIM2_CLK","","",""]],       
-        [41,27,"SPI1_CS",["GPIO12","SPI1_CS","","UART2_RXD","USIM2_DAT","","","CAN_RXD"]],
-        [40,28,"SPI1_MOSI",["GPIO13","SPI1_MOSI","","UART2_TXD","USIM2_RST","","","CAN_TXD"]],
-        [39,29,"SPI1_MISO",["GPIO14","SPI1_MISO","I2C0_SDA","UART3_RXD","USIM2_CLK","PWM0","","CAN_STB"]],
-        [38,30,"SPI1_SCLK",["GPIO15","SPI1_SCLK","I2C0_SCL","UART3_TXD","","PWM1","",""]],
-        [47,31,"DBG_RXD",["","","","","","","",""]],
-        [46,32,"DBG_TXD",["","","","","","","",""]],
-        [17,33,"UART1_RXD",["GPIO18","UART1_RXD","","","","","",""]],
-        [16,34,"UART1_TXD",["GPIO19","UART1_TXD","","","","","",""]],
-        [18,35,"I2S_BCLK",["GPIO29","","","","I2S_BCLK","PWM0","",""]],
-        [19,36,"I2S_LRCK",["GPIO30","","","","I2S_LRCK","PWM1","",""]],
-        [20,37,"I2S_DIN",["GPIO31","","","","I2S_DIN","PWM2","",""]],
-        [21,38,"I2S_DOUT",["GPIO32","","","","I2S_DOUT","","",""]],
-        [22,39,"I2S_MCLK",["GPIO33","","","","I2S_MCLK","PWM4","",""]],
-        [25,40,"LCD_CLK",["GPIO34","LCD_CLK","I2C0_SDA","UART3_RXD","","","",""]],
-        [26,41,"LCD_CS",["GPIO35","LCD_CS","I2C0_SCL","UART3_TXD","","","",""]],
-        [27,42,"LCD_RST",["GPIO36","LCD_RST","I2C1_SCL","","","","",""]],
-        [28,43,"LCD_SDA",["GPIO37","LCD_SDA","I2C1_SDA","","","","",""]],
-        [29,44,"LCD_RS",["GPIO38","","LCD_RS","","","","",""]],
-        [23,45,"GPIO20",["GPIO20","","","","","","",""]],
-        [24,46,"GPIO21",["GPIO21","","","","","PWM4","",""]],
-        [36,51,"CAN_TXD",["GPIO26","","","","","","","CAN_TXD"]],
-        [35,52,"CAN_STB",["GPIO27","","","","","PWM4","","CAN_STB"]],
-        [37,53,"CAN_RXD",["GPIO28","","","","ONEWIRE","","CAN_STB","CAN_RXD"]],
-        [44,0,"WAKEUP0",["WAKEUP0","","","","","","",""]],
-        [2,0,"VBUS",["VBUS","","","","","","",""]],
-        [14,0,"PWR_KEY",["PWR_KEY","","","","","","",""]],
-        [43,0,"WAKEUP6",["WAKEUP6","","","","","","",""]],
-        [52,0,"GPIO153",["GPIO153","","","","","","",""]],
-        [96,0,"GPIO160",["GPIO160","","","","","","",""]],
-        [73,0,"GPIO162",["GPIO162","","","","","","",""]],
-        [74,0,"GPIO164",["GPIO164","","","","","","",""]],
-        [48,0,"UART11_RXD",["UART11_RXD","GPIO129","","","","","",""]],
-        [49,0,"UART11_TXD",["UART11_TXD","GPIO128","","","","","",""]],
-        [56,0,"GPIO140",["GPIO140","","","","","","",""]],
-        [55,0,"GPIO141",["GPIO141","","","","","","",""]],
-        [54,0,"GPIO146",["GPIO146","","","","","","",""]],
-        [53,0,"GPIO147",["GPIO147","","","","","","",""]],
-        [60,0,"UART12_TXD",["UART12_TXD","GPIO169","","","","","",""]],
-        [59,0,"UART12_RXD",["UART12_RXD","GPIO168","","","","","",""]]
-    ],
-    "pin_others":[
-        [65,"1PPS"],
-        [6,"V_CHG"],
-        [7,"VBAT"],
-        [8,"VBAT"],
-        [10,"SIM_VDD"],
-        [11,"SIM_RST"],
-        [12,"SIM_DAT"],
-        [13,"SIM_CLK"],
-        [3,"USB_P"],
-        [4,"USB_N"],
-        [75,"ADC0"],
-        [68,"ADC1"],
-        [42,"ADC2"],
-        [87,"ADC3"],
-        [5,"GND"],
-        [9,"GND"],
-        [32,"GND"],
-        [34,"GND"],
-        [50,"GND"],
-        [61,"GND"],
-        [63,"GND"],
-        [70,"GND"],
-        [76,"GND"],
-        [77,"GND"],
-        [86,"GND"],
-        [93,"GND"],
-        [99,"GND"],
-        [101,"GND"],
-        [102,"GND"],
-        [103,"GND"],
-        [104,"GND"],
-        [15,"RSTN"],
-        [33,"LTE_ANT"],
-        [45,"VDD_EXT"],
-        [51,"WIFI_ANT"],
-        [62,"GNSS_ANT"],
-        [64,"GNSS_VCC"],
-        [79,"NC"],
-        [97,"NC"],
-        [100,"NC"],
-        [95,"NC"],
-        [94,"NC"],
-        [90,"NC"],
-        [91,"NC"],
-        [92,"NC"],
-        [89,"NC"],
-        [88,"NC"],
-        [84,"NC"],
-        [85,"NC"],
-        [69,"NC"],
-        [78,"NC"],
-        [71,"NC"],
-        [72,"NC"],
-        [57,"NC"],
-        [58,"NC"]
-        ]
-}

+ 0 - 112
components/pins/meta/Air8000A.define.json

@@ -1,112 +0,0 @@
-{
-    "model":"air8000a",
-    "pin_count":104,
-    "pins":[
-        [83,11,"GPIO16",["","","","","GPIO16","","",""]],
-        [82,12,"GPIO17",["","","","","GPIO17","","",""]],
-        [80,13,"I2C0_SCL",["","","I2C0_SCL","I2C1_SCL","GPIO18","PWM0","",""]],
-        [81,14,"I2C0_SDA",["","","I2C0_SDA","I2C1_SDA","GPIO19","PWM1","",""]],
-        [1,15,"USB_BOOT",["","","","","","","",""]],
-        [31,16,"GPIO1",["GPIO1","","","","","PWM0","",""]],
-        [30,17,"GPIO2",["GPIO2","","","","ONEWIRE","PWM1","",""]],
-        [98,18,"GPIO3",["GPIO3","CAM_MCLK","","","ONEWIRE","PWM2","",""]],
-        [67,19,"I2C1_SDA",["GPIO4","CAM_BCLK","I2C1_SDA","","USIM2_RST","","",""]],
-        [66,20,"I2C1_SCL",["GPIO5","CAM_CS","I2C1_SCL","","USIM2_CLK","","",""]],       
-        [41,27,"SPI1_CS",["GPIO12","SPI1_CS","","UART2_RXD","USIM2_DAT","","","CAN_RXD"]],
-        [40,28,"SPI1_MOSI",["GPIO13","SPI1_MOSI","","UART2_TXD","USIM2_RST","","","CAN_TXD"]],
-        [39,29,"SPI1_MISO",["GPIO14","SPI1_MISO","I2C0_SDA","UART3_RXD","USIM2_CLK","PWM0","","CAN_STB"]],
-        [38,30,"SPI1_SCLK",["GPIO15","SPI1_SCLK","I2C0_SCL","UART3_TXD","","PWM1","",""]],
-        [47,31,"DBG_RXD",["","","","","","","",""]],
-        [46,32,"DBG_TXD",["","","","","","","",""]],
-        [17,33,"UART1_RXD",["GPIO18","UART1_RXD","","","","","",""]],
-        [16,34,"UART1_TXD",["GPIO19","UART1_TXD","","","","","",""]],
-        [18,35,"I2S_BCLK",["GPIO29","","","","I2S_BCLK","PWM0","",""]],
-        [19,36,"I2S_LRCK",["GPIO30","","","","I2S_LRCK","PWM1","",""]],
-        [20,37,"I2S_DIN",["GPIO31","","","","I2S_DIN","PWM2","",""]],
-        [21,38,"I2S_DOUT",["GPIO32","","","","I2S_DOUT","","",""]],
-        [22,39,"I2S_MCLK",["GPIO33","","","","I2S_MCLK","PWM4","",""]],
-        [25,40,"LCD_CLK",["GPIO34","LCD_CLK","I2C0_SDA","UART3_RXD","","","",""]],
-        [26,41,"LCD_CS",["GPIO35","LCD_CS","I2C0_SCL","UART3_TXD","","","",""]],
-        [27,42,"LCD_RST",["GPIO36","LCD_RST","I2C1_SCL","","","","",""]],
-        [28,43,"LCD_SDA",["GPIO37","LCD_SDA","I2C1_SDA","","","","",""]],
-        [29,44,"LCD_RS",["GPIO38","","LCD_RS","","","","",""]],
-        [23,45,"GPIO20",["GPIO20","","","","","","",""]],
-        [24,46,"GPIO21",["GPIO21","","","","","PWM4","",""]],
-        [36,51,"CAN_TXD",["GPIO26","","","","","","","CAN_TXD"]],
-        [35,52,"CAN_STB",["GPIO27","","","","","PWM4","","CAN_STB"]],
-        [37,53,"CAN_RXD",["GPIO28","","","","ONEWIRE","","CAN_STB","CAN_RXD"]],
-        [44,0,"WAKEUP0",["WAKEUP0","","","","","","",""]],
-        [2,0,"VBUS",["VBUS","","","","","","",""]],
-        [14,0,"PWR_KEY",["PWR_KEY","","","","","","",""]],
-        [43,0,"WAKEUP6",["WAKEUP6","","","","","","",""]],
-        [71,0,"GPIO152",["GPIO152","","","","","","",""]],
-        [52,0,"GPIO153",["GPIO153","","","","","","",""]],
-        [72,0,"GPIO156",["GPIO156","","","","","","",""]],
-        [96,0,"GPIO160",["GPIO160","","","","","","",""]],
-        [73,0,"GPIO162",["GPIO162","","","","","","",""]],
-        [74,0,"GPIO164",["GPIO164","","","","","","",""]],
-        [48,0,"UART11_RXD",["UART11_RXD","GPIO129","","","","","",""]],
-        [49,0,"UART11_TXD",["UART11_TXD","GPIO128","","","","","",""]],
-        [56,0,"GPIO140",["GPIO140","","","","","","",""]],
-        [55,0,"GPIO141",["GPIO141","","","","","","",""]],
-        [54,0,"GPIO146",["GPIO146","","","","","","",""]],
-        [53,0,"GPIO147",["GPIO147","","","","","","",""]],
-        [60,0,"UART12_TXD",["UART12_TXD","GPIO169","","","","","",""]],
-        [59,0,"UART12_RXD",["UART12_RXD","GPIO168","","","","","",""]]
-    ],
-    "pin_others":[
-        [65,"1PPS"],
-        [6,"V_CHG"],
-        [7,"VBAT"],
-        [8,"VBAT"],
-        [10,"SIM_VDD"],
-        [11,"SIM_RST"],
-        [12,"SIM_DAT"],
-        [13,"SIM_CLK"],
-        [3,"USB_P"],
-        [4,"USB_N"],
-        [75,"ADC0"],
-        [68,"ADC1"],
-        [42,"ADC2"],
-        [87,"ADC3"],
-        [5,"GND"],
-        [9,"GND"],
-        [32,"GND"],
-        [34,"GND"],
-        [50,"GND"],
-        [61,"GND"],
-        [63,"GND"],
-        [70,"GND"],
-        [76,"GND"],
-        [77,"GND"],
-        [86,"GND"],
-        [93,"GND"],
-        [99,"GND"],
-        [101,"GND"],
-        [102,"GND"],
-        [103,"GND"],
-        [104,"GND"],
-        [15,"RSTN"],
-        [33,"LTE_ANT"],
-        [45,"VDD_EXT"],
-        [51,"WIFI_ANT"],
-        [62,"GNSS_ANT"],
-        [64,"GNSS_VCC"],
-        [79,"NC"],
-        [97,"NC"],
-        [100,"NC"],
-        [95,"NC"],
-        [94,"NC"],
-        [90,"NC"],
-        [91,"NC"],
-        [92,"NC"],
-        [89,"NC"],
-        [88,"NC"],
-        [84,"NC"],
-        [85,"NC"],
-        [69,"NC"],
-        [78,"NC"],
-        [57,"NC"],
-        [58,"NC"]
-        ]
-}

+ 0 - 100
components/pins/meta/Air8000D.define.json

@@ -1,100 +0,0 @@
-{
-    "model":"air8000d",
-    "pin_count":104,
-    "pins":[
-        [83,11,"GPIO16",["","","","","GPIO16","","",""]],
-        [82,12,"GPIO17",["","","","","GPIO17","","",""]],
-        [80,13,"I2C0_SCL",["","","I2C0_SCL","I2C1_SCL","GPIO18","PWM0","",""]],
-        [81,14,"I2C0_SDA",["","","I2C0_SDA","I2C1_SDA","GPIO19","PWM1","",""]],
-        [1,15,"USB_BOOT",["","","","","","","",""]],
-        [31,16,"GPIO1",["GPIO1","","","","","PWM0","",""]],
-        [30,17,"GPIO2",["GPIO2","","","","ONEWIRE","PWM1","",""]],
-        [98,18,"GPIO3",["GPIO3","CAM_MCLK","","","ONEWIRE","PWM2","",""]],
-        [67,19,"I2C1_SDA",["GPIO4","CAM_BCLK","I2C1_SDA","","USIM2_RST","","",""]],
-        [66,20,"I2C1_SCL",["GPIO5","CAM_CS","I2C1_SCL","","USIM2_CLK","","",""]],       
-        [90,23,"SPI0_CS",["GPIO8","SPI0_CS","I2C1_SDA","","","","",""]],
-        [91,24,"SPI0_MOSI",["GPIO9","SPI0_MOSI","I2C1_SCL","","","","",""]],
-        [92,25,"SPI0_MISO",["GPIO10","SPI0_MISO","","UART2_RXD","","","",""]],
-        [89,26,"SPI0_SCLK",["GPIO11","SPI0_SCLK","","UART2_TXD","","","",""]],
-        [41,27,"SPI1_CS",["GPIO12","SPI1_CS","","UART2_RXD","USIM2_DAT","","","CAN_RXD"]],
-        [40,28,"SPI1_MOSI",["GPIO13","SPI1_MOSI","","UART2_TXD","USIM2_RST","","","CAN_TXD"]],
-        [39,29,"SPI1_MISO",["GPIO14","SPI1_MISO","I2C0_SDA","UART3_RXD","USIM2_CLK","PWM0","","CAN_STB"]],
-        [38,30,"SPI1_SCLK",["GPIO15","SPI1_SCLK","I2C0_SCL","UART3_TXD","","PWM1","",""]],
-        [47,31,"DBG_RXD",["","","","","","","",""]],
-        [46,32,"DBG_TXD",["","","","","","","",""]],
-        [17,33,"UART1_RXD",["GPIO18","UART1_RXD","","","","","",""]],
-        [16,34,"UART1_TXD",["GPIO19","UART1_TXD","","","","","",""]],
-        [18,35,"I2S_BCLK",["GPIO29","","","","I2S_BCLK","PWM0","",""]],
-        [19,36,"I2S_LRCK",["GPIO30","","","","I2S_LRCK","PWM1","",""]],
-        [20,37,"I2S_DIN",["GPIO31","","","","I2S_DIN","PWM2","",""]],
-        [21,38,"I2S_DOUT",["GPIO32","","","","I2S_DOUT","","",""]],
-        [22,39,"I2S_MCLK",["GPIO33","","","","I2S_MCLK","PWM4","",""]],
-        [25,40,"LCD_CLK",["GPIO34","LCD_CLK","I2C0_SDA","UART3_RXD","","","",""]],
-        [26,41,"LCD_CS",["GPIO35","LCD_CS","I2C0_SCL","UART3_TXD","","","",""]],
-        [27,42,"LCD_RST",["GPIO36","LCD_RST","I2C1_SCL","","","","",""]],
-        [28,43,"LCD_SDA",["GPIO37","LCD_SDA","I2C1_SDA","","","","",""]],
-        [29,44,"LCD_RS",["GPIO38","","LCD_RS","","","","",""]],
-        [23,45,"GPIO20",["GPIO20","","","","","","",""]],
-        [24,46,"GPIO21",["GPIO21","","","","","PWM4","",""]],
-        [88,47,"GPIO22",["GPIO22","","","","","PWM5","",""]],
-        [84,48,"GPIO23",["GPIO23","","","","","PWM0","",""]],      
-        [36,51,"CAN_TXD",["GPIO26","","","","","","","CAN_TXD"]],
-        [35,52,"CAN_STB",["GPIO27","","","","","PWM4","","CAN_STB"]],
-        [37,53,"CAN_RXD",["GPIO28","","","","ONEWIRE","","CAN_STB","CAN_RXD"]],
-        [44,0,"WAKEUP0",["WAKEUP0","","","","","","",""]],
-        [2,0,"VBUS",["VBUS","","","","","","",""]],
-        [14,0,"PWR_KEY",["PWR_KEY","","","","","","",""]],
-        [43,0,"WAKEUP6",["WAKEUP6","","","","","","",""]]
-    ],
-    "pin_others":[
-        [65,"1PPS"],
-        [6,"V_CHG"],
-        [7,"VBAT"],
-        [8,"VBAT"],
-        [10,"SIM_VDD"],
-        [11,"SIM_RST"],
-        [12,"SIM_DAT"],
-        [13,"SIM_CLK"],
-        [3,"USB_P"],
-        [4,"USB_N"],
-        [75,"ADC0"],
-        [68,"ADC1"],
-        [42,"ADC2"],
-        [87,"ADC3"],
-        [5,"GND"],
-        [9,"GND"],
-        [32,"GND"],
-        [34,"GND"],
-        [50,"GND"],
-        [61,"GND"],
-        [63,"GND"],
-        [70,"GND"],
-        [76,"GND"],
-        [77,"GND"],
-        [86,"GND"],
-        [93,"GND"],
-        [99,"GND"],
-        [101,"GND"],
-        [102,"GND"],
-        [103,"GND"],
-        [104,"GND"],
-        [15,"RSTN"],
-        [33,"LTE_ANT"],
-        [45,"VDD_EXT"],
-        [51,"WIFI_ANT"],
-        [62,"GNSS_ANT"],
-        [64,"GNSS_VCC"],
-        [79,"NC"],
-        [97,"NC"],
-        [100,"NC"],
-        [95,"NC"],
-        [94,"NC"],
-        [85,"NC"],
-        [69,"NC"],
-        [78,"NC"],
-        [71,"NC"],
-        [72,"NC"],
-        [57,"NC"],
-        [58,"NC"]
-        ]
-}

+ 0 - 112
components/pins/meta/Air8000G.define.json

@@ -1,112 +0,0 @@
-{
-    "model":"air8000g",
-    "pin_count":104,
-    "pins":[
-        [83,11,"GPIO16",["","","","","GPIO16","","",""]],
-        [82,12,"GPIO17",["","","","","GPIO17","","",""]],
-        [80,13,"I2C0_SCL",["","","I2C0_SCL","I2C1_SCL","GPIO18","PWM0","",""]],
-        [81,14,"I2C0_SDA",["","","I2C0_SDA","I2C1_SDA","GPIO19","PWM1","",""]],
-        [1,15,"USB_BOOT",["","","","","","","",""]],
-        [31,16,"GPIO1",["GPIO1","","","","","PWM0","",""]],
-        [30,17,"GPIO2",["GPIO2","","","","ONEWIRE","PWM1","",""]],
-        [98,18,"GPIO3",["GPIO3","CAM_MCLK","","","ONEWIRE","PWM2","",""]],
-        [67,19,"I2C1_SDA",["GPIO4","CAM_BCLK","I2C1_SDA","","USIM2_RST","","",""]],
-        [66,20,"I2C1_SCL",["GPIO5","CAM_CS","I2C1_SCL","","USIM2_CLK","","",""]],       
-        [90,23,"SPI0_CS",["GPIO8","SPI0_CS","I2C1_SDA","","","","",""]],
-        [91,24,"SPI0_MOSI",["GPIO9","SPI0_MOSI","I2C1_SCL","","","","",""]],
-        [92,25,"SPI0_MISO",["GPIO10","SPI0_MISO","","UART2_RXD","","","",""]],
-        [89,26,"SPI0_SCLK",["GPIO11","SPI0_SCLK","","UART2_TXD","","","",""]],
-        [41,27,"SPI1_CS",["GPIO12","SPI1_CS","","UART2_RXD","USIM2_DAT","","","CAN_RXD"]],
-        [40,28,"SPI1_MOSI",["GPIO13","SPI1_MOSI","","UART2_TXD","USIM2_RST","","","CAN_TXD"]],
-        [39,29,"SPI1_MISO",["GPIO14","SPI1_MISO","I2C0_SDA","UART3_RXD","USIM2_CLK","PWM0","","CAN_STB"]],
-        [38,30,"SPI1_SCLK",["GPIO15","SPI1_SCLK","I2C0_SCL","UART3_TXD","","PWM1","",""]],
-        [47,31,"DBG_RXD",["","","","","","","",""]],
-        [46,32,"DBG_TXD",["","","","","","","",""]],
-        [17,33,"UART1_RXD",["GPIO18","UART1_RXD","","","","","",""]],
-        [16,34,"UART1_TXD",["GPIO19","UART1_TXD","","","","","",""]],
-        [18,35,"I2S_BCLK",["GPIO29","","","","I2S_BCLK","PWM0","",""]],
-        [19,36,"I2S_LRCK",["GPIO30","","","","I2S_LRCK","PWM1","",""]],
-        [20,37,"I2S_DIN",["GPIO31","","","","I2S_DIN","PWM2","",""]],
-        [21,38,"I2S_DOUT",["GPIO32","","","","I2S_DOUT","","",""]],
-        [22,39,"I2S_MCLK",["GPIO33","","","","I2S_MCLK","PWM4","",""]],
-        [25,40,"LCD_CLK",["GPIO34","LCD_CLK","I2C0_SDA","UART3_RXD","","","",""]],
-        [26,41,"LCD_CS",["GPIO35","LCD_CS","I2C0_SCL","UART3_TXD","","","",""]],
-        [27,42,"LCD_RST",["GPIO36","LCD_RST","I2C1_SCL","","","","",""]],
-        [28,43,"LCD_SDA",["GPIO37","LCD_SDA","I2C1_SDA","","","","",""]],
-        [29,44,"LCD_RS",["GPIO38","","LCD_RS","","","","",""]],
-        [23,45,"GPIO20",["GPIO20","","","","","","",""]],
-        [24,46,"GPIO21",["GPIO21","","","","","PWM4","",""]],
-        [36,51,"CAN_TXD",["GPIO26","","","","","","","CAN_TXD"]],
-        [35,52,"CAN_STB",["GPIO27","","","","","PWM4","","CAN_STB"]],
-        [37,53,"CAN_RXD",["GPIO28","","","","ONEWIRE","","CAN_STB","CAN_RXD"]],
-        [44,0,"WAKEUP0",["WAKEUP0","","","","","","",""]],
-        [2,0,"VBUS",["VBUS","","","","","","",""]],
-        [14,0,"PWR_KEY",["PWR_KEY","","","","","","",""]],
-        [43,0,"WAKEUP6",["WAKEUP6","","","","","","",""]]
-    ],
-    "pin_others":[
-        [65,"1PPS"],
-        [6,"V_CHG"],
-        [7,"VBAT"],
-        [8,"VBAT"],
-        [10,"SIM_VDD"],
-        [11,"SIM_RST"],
-        [12,"SIM_DAT"],
-        [13,"SIM_CLK"],
-        [3,"USB_P"],
-        [4,"USB_N"],
-        [75,"ADC0"],
-        [68,"ADC1"],
-        [42,"ADC2"],
-        [87,"ADC3"],
-        [5,"GND"],
-        [9,"GND"],
-        [32,"GND"],
-        [34,"GND"],
-        [50,"GND"],
-        [61,"GND"],
-        [63,"GND"],
-        [70,"GND"],
-        [76,"GND"],
-        [77,"GND"],
-        [86,"GND"],
-        [93,"GND"],
-        [99,"GND"],
-        [101,"GND"],
-        [102,"GND"],
-        [103,"GND"],
-        [104,"GND"],
-        [15,"RSTN"],
-        [33,"LTE_ANT"],
-        [45,"VDD_EXT"],
-        [51,"WIFI_ANT"],
-        [62,"GNSS_ANT"],
-        [64,"GNSS_VCC"],
-        [79,"NC"],
-        [97,"NC"],
-        [100,"NC"],
-        [95,"NC"],
-        [94,"NC"],
-        [88,"NC"],
-        [84,"NC"],
-        [85,"NC"],
-        [69,"NC"],
-        [78,"NC"],
-        [71,"NC"],
-        [72,"NC"],
-        [57,"NC"],
-        [58,"NC"],
-	    [52,"NC"],
-        [96,"NC"],
-        [73,"NC"],
-        [74,"NC"],
-        [48,"NC"],
-        [49,"NC"],
-        [56,"NC"],
-        [55,"NC"],
-        [54,"NC"],
-        [53,"NC"],
-        [60,"NC"],
-        [59,"NC"]
-        ]
-}

+ 0 - 100
components/pins/meta/Air8000T.define.json

@@ -1,100 +0,0 @@
-{
-    "model":"air8000t",
-    "pin_count":104,
-    "pins":[
-        [83,11,"GPIO16",["","","","","GPIO16","","",""]],
-        [82,12,"GPIO17",["","","","","GPIO17","","",""]],
-        [80,13,"I2C0_SCL",["","","I2C0_SCL","I2C1_SCL","GPIO18","PWM0","",""]],
-        [81,14,"I2C0_SDA",["","","I2C0_SDA","I2C1_SDA","GPIO19","PWM1","",""]],
-        [1,15,"USB_BOOT",["","","","","","","",""]],
-        [31,16,"GPIO1",["GPIO1","","","","","PWM0","",""]],
-        [30,17,"GPIO2",["GPIO2","","","","ONEWIRE","PWM1","",""]],
-        [98,18,"GPIO3",["GPIO3","CAM_MCLK","","","ONEWIRE","PWM2","",""]],
-        [67,19,"I2C1_SDA",["GPIO4","CAM_BCLK","I2C1_SDA","","USIM2_RST","","",""]],
-        [66,20,"I2C1_SCL",["GPIO5","CAM_CS","I2C1_SCL","","USIM2_CLK","","",""]],       
-        [95,21,"GPIO6",["GPIO6","CAM_RX0","UART2_RXD","","USIM2_DAT","","",""]],
-        [94,22,"GPIO7",["GPIO7","CAM_RX1","UART2_TXD","","OneWire","","",""]],       
-        [90,23,"SPI0_CS",["GPIO8","SPI0_CS","I2C1_SDA","","","","",""]],
-        [91,24,"SPI0_MOSI",["GPIO9","SPI0_MOSI","I2C1_SCL","","","","",""]],
-        [92,25,"SPI0_MISO",["GPIO10","SPI0_MISO","","UART2_RXD","","","",""]],
-        [89,26,"SPI0_SCLK",["GPIO11","SPI0_SCLK","","UART2_TXD","","","",""]],
-        [41,27,"SPI1_CS",["GPIO12","SPI1_CS","","UART2_RXD","USIM2_DAT","","","CAN_RXD"]],
-        [40,28,"SPI1_MOSI",["GPIO13","SPI1_MOSI","","UART2_TXD","USIM2_RST","","","CAN_TXD"]],
-        [39,29,"SPI1_MISO",["GPIO14","SPI1_MISO","I2C0_SDA","UART3_RXD","USIM2_CLK","PWM0","","CAN_STB"]],
-        [38,30,"SPI1_SCLK",["GPIO15","SPI1_SCLK","I2C0_SCL","UART3_TXD","","PWM1","",""]],
-        [47,31,"DBG_RXD",["","","","","","","",""]],
-        [46,32,"DBG_TXD",["","","","","","","",""]],
-        [17,33,"UART1_RXD",["GPIO18","UART1_RXD","","","","","",""]],
-        [16,34,"UART1_TXD",["GPIO19","UART1_TXD","","","","","",""]],
-        [18,35,"I2S_BCLK",["GPIO29","","","","I2S_BCLK","PWM0","",""]],
-        [19,36,"I2S_LRCK",["GPIO30","","","","I2S_LRCK","PWM1","",""]],
-        [20,37,"I2S_DIN",["GPIO31","","","","I2S_DIN","PWM2","",""]],
-        [21,38,"I2S_DOUT",["GPIO32","","","","I2S_DOUT","","",""]],
-        [22,39,"I2S_MCLK",["GPIO33","","","","I2S_MCLK","PWM4","",""]],
-        [25,40,"LCD_CLK",["GPIO34","LCD_CLK","I2C0_SDA","UART3_RXD","","","",""]],
-        [26,41,"LCD_CS",["GPIO35","LCD_CS","I2C0_SCL","UART3_TXD","","","",""]],
-        [27,42,"LCD_RST",["GPIO36","LCD_RST","I2C1_SCL","","","","",""]],
-        [28,43,"LCD_SDA",["GPIO37","LCD_SDA","I2C1_SDA","","","","",""]],
-        [29,44,"LCD_RS",["GPIO38","","LCD_RS","","","","",""]],
-        [23,45,"GPIO20",["GPIO20","","","","","","",""]],
-        [24,46,"GPIO21",["GPIO21","","","","","PWM4","",""]],
-        [88,47,"GPIO22",["GPIO22","","","","","","",""]],
-        [84,48,"GPIO23",["GPIO23","","","","","PWM0","",""]], 
-        [85,49,"GPIO24",["GPIO24","","","","","PWM1","",""]],
-        [69,50,"GPIO25",["GPIO25","","","","","PWM2","",""]],          
-        [36,51,"CAN_TXD",["GPIO26","","","","","","","CAN_TXD"]],
-        [35,52,"CAN_STB",["GPIO27","","","","","PWM4","","CAN_STB"]],
-        [37,53,"CAN_RXD",["GPIO28","","","","ONEWIRE","","CAN_STB","CAN_RXD"]],
-        [44,0,"WAKEUP0",["WAKEUP0","","","","","","",""]],
-        [2,0,"VBUS",["VBUS","","","","","","",""]],
-        [78,0,"WAKEUP2",["WAKEUP2","","","","","","",""]],
-        [14,0,"PWR_KEY",["PWR_KEY","","","","","","",""]],
-        [43,0,"WAKEUP6",["WAKEUP6","","","","","","",""]]
-    ],
-    "pin_others":[
-        [65,"1PPS"],
-        [6,"V_CHG"],
-        [7,"VBAT"],
-        [8,"VBAT"],
-        [10,"SIM_VDD"],
-        [11,"SIM_RST"],
-        [12,"SIM_DAT"],
-        [13,"SIM_CLK"],
-        [3,"USB_P"],
-        [4,"USB_N"],
-        [75,"ADC0"],
-        [68,"ADC1"],
-        [42,"ADC2"],
-        [87,"ADC3"],
-        [5,"GND"],
-        [9,"GND"],
-        [32,"GND"],
-        [34,"GND"],
-        [50,"GND"],
-        [61,"GND"],
-        [63,"GND"],
-        [70,"GND"],
-        [76,"GND"],
-        [77,"GND"],
-        [86,"GND"],
-        [93,"GND"],
-        [99,"GND"],
-        [101,"GND"],
-        [102,"GND"],
-        [103,"GND"],
-        [104,"GND"],
-        [15,"RSTN"],
-        [33,"LTE_ANT"],
-        [45,"VDD_EXT"],
-        [51,"WIFI_ANT"],
-        [62,"GNSS_ANT"],
-        [64,"GNSS_VCC"],
-        [79,"NC"],
-        [97,"NC"],
-        [100,"NC"],
-        [71,"NC"],
-        [72,"NC"],
-        [57,"NC"],
-        [58,"NC"]
-        ]
-}

+ 0 - 112
components/pins/meta/Air8000W.define.json

@@ -1,112 +0,0 @@
-{
-    "model":"air8000w",
-    "pin_count":104,
-    "pins":[
-        [83,11,"GPIO16",["","","","","GPIO16","","",""]],
-        [82,12,"GPIO17",["","","","","GPIO17","","",""]],
-        [80,13,"I2C0_SCL",["","","I2C0_SCL","I2C1_SCL","GPIO18","PWM0","",""]],
-        [81,14,"I2C0_SDA",["","","I2C0_SDA","I2C1_SDA","GPIO19","PWM1","",""]],
-        [1,15,"USB_BOOT",["","","","","","","",""]],
-        [31,16,"GPIO1",["GPIO1","","","","","PWM0","",""]],
-        [30,17,"GPIO2",["GPIO2","","","","ONEWIRE","PWM1","",""]],
-        [98,18,"GPIO3",["GPIO3","CAM_MCLK","","","ONEWIRE","PWM2","",""]],
-        [67,19,"I2C1_SDA",["GPIO4","CAM_BCLK","I2C1_SDA","","USIM2_RST","","",""]],
-        [66,20,"I2C1_SCL",["GPIO5","CAM_CS","I2C1_SCL","","USIM2_CLK","","",""]],    
-        [95,21,"GPIO6",["GPIO6","CAM_RX0","UART2_RXD","","USIM2_DAT","","",""]],    
-        [94,22,"GPIO7",["GPIO7","CAM_RX1","UART2_TXD","","OneWire","","",""]],      
-        [41,27,"SPI1_CS",["GPIO12","SPI1_CS","","UART2_RXD","USIM2_DAT","","","CAN_RXD"]],
-        [40,28,"SPI1_MOSI",["GPIO13","SPI1_MOSI","","UART2_TXD","USIM2_RST","","","CAN_TXD"]],
-        [39,29,"SPI1_MISO",["GPIO14","SPI1_MISO","I2C0_SDA","UART3_RXD","USIM2_CLK","PWM0","","CAN_STB"]],
-        [38,30,"SPI1_SCLK",["GPIO15","SPI1_SCLK","I2C0_SCL","UART3_TXD","","PWM1","",""]],
-        [47,31,"DBG_RXD",["","","","","","","",""]],
-        [46,32,"DBG_TXD",["","","","","","","",""]],
-        [17,33,"UART1_RXD",["GPIO18","UART1_RXD","","","","","",""]],
-        [16,34,"UART1_TXD",["GPIO19","UART1_TXD","","","","","",""]],
-        [18,35,"I2S_BCLK",["GPIO29","","","","I2S_BCLK","PWM0","",""]],
-        [19,36,"I2S_LRCK",["GPIO30","","","","I2S_LRCK","PWM1","",""]],
-        [20,37,"I2S_DIN",["GPIO31","","","","I2S_DIN","PWM2","",""]],
-        [21,38,"I2S_DOUT",["GPIO32","","","","I2S_DOUT","","",""]],
-        [22,39,"I2S_MCLK",["GPIO33","","","","I2S_MCLK","PWM4","",""]],
-        [25,40,"LCD_CLK",["GPIO34","LCD_CLK","I2C0_SDA","UART3_RXD","","","",""]],
-        [26,41,"LCD_CS",["GPIO35","LCD_CS","I2C0_SCL","UART3_TXD","","","",""]],
-        [27,42,"LCD_RST",["GPIO36","LCD_RST","I2C1_SCL","","","","",""]],
-        [28,43,"LCD_SDA",["GPIO37","LCD_SDA","I2C1_SDA","","","","",""]],
-        [29,44,"LCD_RS",["GPIO38","","LCD_RS","","","","",""]],
-        [23,45,"GPIO20",["GPIO20","","","","","","",""]],
-        [24,46,"GPIO21",["GPIO21","","","","","PWM4","",""]],
-        [85,49,"GPIO24",["GPIO24","","","","","PWM1","",""]],
-        [69,50,"GPIO25",["GPIO25","","","","","PWM2","",""]],
-        [36,51,"CAN_TXD",["GPIO26","","","","","","","CAN_TXD"]],
-        [35,52,"CAN_STB",["GPIO27","","","","","PWM4","","CAN_STB"]],
-        [37,53,"CAN_RXD",["GPIO28","","","","ONEWIRE","","CAN_STB","CAN_RXD"]],
-        [44,0,"WAKEUP0",["WAKEUP0","","","","","","",""]],
-        [2,0,"VBUS",["VBUS","","","","","","",""]],
-        [14,0,"PWR_KEY",["PWR_KEY","","","","","","",""]],
-        [43,0,"WAKEUP6",["WAKEUP6","","","","","","",""]],
-        [71,0,"GPIO152",["GPIO152","","","","","","",""]],
-        [52,0,"GPIO153",["GPIO153","","","","","","",""]],
-        [72,0,"GPIO156",["GPIO156","","","","","","",""]],
-        [96,0,"GPIO160",["GPIO160","","","","","","",""]],
-        [73,0,"GPIO162",["GPIO162","","","","","","",""]],
-        [74,0,"GPIO164",["GPIO164","","","","","","",""]],
-        [48,0,"UART11_RXD",["UART11_RXD","GPIO129","","","","","",""]],
-        [49,0,"UART11_TXD",["UART11_TXD","GPIO128","","","","","",""]],
-        [56,0,"GPIO140",["GPIO140","","","","","","",""]],
-        [55,0,"GPIO141",["GPIO141","","","","","","",""]],
-        [54,0,"GPIO146",["GPIO146","","","","","","",""]],
-        [53,0,"GPIO147",["GPIO147","","","","","","",""]],
-        [60,0,"UART12_TXD",["UART12_TXD","GPIO169","","","","","",""]],
-        [59,0,"UART12_RXD",["UART12_RXD","GPIO168","","","","","",""]]
-    ],
-    "pin_others":[
-        [65,"1PPS"],
-        [6,"V_CHG"],
-        [7,"VBAT"],
-        [8,"VBAT"],
-        [10,"SIM_VDD"],
-        [11,"SIM_RST"],
-        [12,"SIM_DAT"],
-        [13,"SIM_CLK"],
-        [3,"USB_P"],
-        [4,"USB_N"],
-        [75,"ADC0"],
-        [68,"ADC1"],
-        [42,"ADC2"],
-        [87,"ADC3"],
-        [5,"GND"],
-        [9,"GND"],
-        [32,"GND"],
-        [34,"GND"],
-        [50,"GND"],
-        [61,"GND"],
-        [63,"GND"],
-        [70,"GND"],
-        [76,"GND"],
-        [77,"GND"],
-        [86,"GND"],
-        [93,"GND"],
-        [99,"GND"],
-        [101,"GND"],
-        [102,"GND"],
-        [103,"GND"],
-        [104,"GND"],
-        [15,"RSTN"],
-        [33,"LTE_ANT"],
-        [45,"VDD_EXT"],
-        [51,"WIFI_ANT"],
-        [62,"GNSS_ANT"],
-        [64,"GNSS_VCC"],
-        [79,"NC"],
-        [97,"NC"],
-        [100,"NC"],
-        [90,"NC"],
-        [91,"NC"],
-        [92,"NC"],
-        [89,"NC"],
-        [88,"NC"],
-        [84,"NC"],
-        [78,"NC"],
-        [57,"NC"],
-        [58,"NC"]
-        ]
-}

+ 0 - 132
components/pins/meta/air780egh.define.json

@@ -1,132 +0,0 @@
-{
-    "model": "air780egh",
-    "pin_count" : 109,
-    "pins" : [
-        [97,  11, "GPIO16",    ["",      "",    "", "", "GPIO16", "", "", ""]],
-        [100, 12, "GPIO17",    ["",      "",    "", "", "GPIO17", "", "", ""]],
-        [67,  13, "I2C1_SCL",  ["",      "",    "I2C0_SCL", "I2C1_SCL", "GPIO18", "PWM0", "", ""]],
-        [66,  14, "I2C1_SDA",  ["",      "",    "I2C0_SDA", "I2C1_SDA", "GPIO19", "PWM1", "", ""]],
-        [82,  15, "USB_BOOT",  ["", "",  "",    "", "", "", "", ""]],
-        [22,  16, "PWM0",      ["GPIO1", "",    "", "", "", "PWM0", "", ""]],
-        [23,  17, "ONEWIRE",   ["GPIO2", "",    "", "",      "ONEWIRE", "PWM1", "", ""]],
-        [54,  18, "CAM_MCLK",  ["GPIO3", "CAM_MCLK", "", "", "ONEWIRE", "PWM2", "", ""]],
-        [80,  19, "CAM_BCLK",  ["GPIO4", "CAM_BCLK",  "I2C1_SDA", "", "", "", "", ""]],
-        [81,  20, "CAM_CS",    ["GPIO5", "CAM_CS",    "I2C1_SCL", "", "", "", "", ""]],
-        [55,  21, "CAM_RX0",   ["GPIO6", "CAM_RX0",   "UART2_RXD", "", "", "", "", ""]],
-        [56,  22, "CAM_RX1",   ["GPIO7", "CAM_RX1",   "UART2_TXD", "", "ONEWIRE", "", "", ""]],
-        [83,  23, "SPI0_CS",   ["GPIO8", "SPI0_CS",   "I2C1_SDA", "", "", "", "", ""]],
-        [85,  24, "SPI0_MOSI", ["GPIO9", "SPI0_MOSI", "I2C1_SCL", "", "", "", "", ""]],
-        [84,  25, "SPI0_MISO", ["GPIO10", "SPI0_MISO", "", "UART2_RXD", "", "", "", ""]],
-        [86,  26, "SPI0_CLK",  ["GPIO11", "SPI0_CLK", "", "UART2_TXD", "", "", "", ""]],
-        [58,  29, "UART3_RXD", ["GPIO14", "SPI1_MISO", "I2C0_SDA", "UART3_RXD", "", "PWM0", "", ""]],
-        [57,  30, "UART3_TXD", ["GPIO15", "SPI1_CLK", "I2C0_SCL", "UART3_TXD", "", "PWM1", "", ""]],
-        [38,  31, "DBG_RXD",   ["", "DBG_RXD", "", "", "", "", "", ""]],
-        [39,  32, "DBG_TXD",   ["", "DBG_TXD", "", "", "", "", "", ""]],
-        [17,  33, "UART1_RXD", ["GPIO18", "UART1_RXD", "", "", "", "", "", ""]],
-        [18,  34, "UART1_TXD", ["GPIO19", "UART1_TXD", "", "", "", "", "", ""]],
-        [30,  35, "GPIO29",    ["GPIO29", "", "", "", "", "PWM0", "", ""]],
-        [31,  36, "GPIO30",    ["GPIO30", "", "", "", "", "PWM1", "", ""]],
-        [32,  37, "GPIO31",    ["GPIO31", "", "", "", "", "PWM2", "", ""]],
-        [33,  38, "GPIO32",    ["GPIO32", "", "", "", "", "", "", ""]],
-        [26,  39, "PWM4",      ["GPIO33", "", "", "", "", "PWM4", "", ""]],
-        [53,  40, "LCD_CLK",   ["GPIO34", "LCD_CLK", "I2C0_SDA", "UART3_RXD", "", "", "", ""]],
-        [52,  41, "LCD_CS",    ["GPIO35", "LCD_CS",  "I2C0_SCL", "UART3_TXD", "", "", "", ""]],
-        [49,  42, "LCD_RST",   ["GPIO36", "LCD_RST", "I2C1_SCL", "", "", "", "", ""]],
-        [50,  43, "LCD_SDA",   ["GPIO37", "LCD_SDA", "I2C1_SDA", "", "", "", "", ""]],
-        [51,  44, "LCD_RS",    ["GPIO38", "", "LCD_RS", "", "", "", "", ""]],
-        [102, 45, "GPIO20",    ["GPIO20", "", "", "", "", "", "", ""]],
-        [19,  47, "GPIO22",    ["GPIO22", "", "", "", "", "", "", ""]],
-        [99,  48, "GPIO23",    ["GPIO23", "", "", "", "", "PWM0", "", ""]],
-        [20,  49, "PWM1",      ["GPIO24", "", "", "", "", "PWM1", "", ""]],
-        [106, 50, "CAN_RXD",   ["GPIO25", "", "", "", "", "PWM2", "", "CAN_RXD"]],
-        [25,  51, "CAN_TXD",   ["GPIO26", "", "", "", "", "", "", "CAN_TXD"]],
-        [16,  52, "GPIO27",    ["GPIO27", "", "", "", "", "PWM4", "", ""]],
-        [78,  53, "CAN_STB",   ["GPIO28", "", "", "", "ONEWIRE", "", "", "CAN_RXD"]],
-        [101, 0,  "WAKEUP0",   ["", "", "", "", "", "", "", ""]],
-        [61,  0,  "VBUS",      ["", "", "", "", "", "", "", ""]],
-        [79,  0,  "USIM_DET",  ["", "", "", "", "", "", "", ""]],
-        [75,  0,  "WAKEUP6",   ["","","","","","","",""]],
-        [7,   0,  "PWR_KEY",   ["", "", "", "", "", "", "", ""]]
-    ],
-    "pin_others": [
-        [1, "GND"],
-        [2, "NC"],
-        [3, "NC"],
-        [4, "NC"],
-        [5, "NC"],
-        [6, "NC"],
-
-        [8, "NC"],
-        [9, "ADC0"],
-        [10, "GND"],
-        [11, "USIM_DAT"],
-        [12, "USIM_RST"],
-        [13, "USIM_CLK"],
-        [14, "USIM_VDD"],
-        [15, "RESET_N"],
-        
-        [21, "NC"],
-
-        [24, "VDD_EXT"],
-
-        [27, "GND"],
-        [28, "NC"],
-        [29, "NC"],
-
-        [34, "GND"],
-        [35, "LTE_ANT"],
-        [36, "GND"],
-        [37, "GND"],
-
-        [40, "GND"],
-        [41, "GND"],
-        [42, "VBAT"],
-        [43, "VBAT"],
-        [44, "NC"],
-        [45, "GND"],
-        [46, "GND"],
-        [47, "GND"],
-        [48, "GND"],
-
-        [59, "USB_DP"],
-        [60, "USB_DM"],
-
-        [62, "USIM2_CLK"],
-        [63, "USIM2_RST"],
-        [64, "USIM2_DAT"],
-        [65, "USIM2_VDD"],
-
-        [68, "NC"],
-        [69, "NC"],
-        [70, "GND"],
-        [71, "GND"],
-        [72, "GND"],
-        [73, "GND"],
-        [74, "NC"],
-        [75, "NC"],
-        [76, "ADC3"],
-        [77, "ADC2"],
-
-        [87, "NC"],
-        [88, "GND"],
-        [89, "GND"],
-        [90, "GND"],
-        [91, "GND"],
-        [92, "GND"],
-        [93, "GND"],
-        [94, "GND"],
-        [95, "GND"],
-        [96, "ADC1"],
-        
-        [98, "NC"],
-
-        [103, "NC"],
-        [104, "NC"],
-        [105, "NC"],
-        
-        [107, "NC"],
-        [108, "NC"],
-        [109, "NC"]
-       
-    ]
-}

+ 0 - 130
components/pins/meta/air780ehm.define.json

@@ -1,130 +0,0 @@
-{
-    "model": "air780ehm",
-    "pin_count" : 108,
-    "pins" : [
-        [97,  11, "GPIO16",    ["",      "",    "", "", "GPIO16", "", "", ""]],
-        [100, 12, "GPIO17",    ["",      "",    "", "", "GPIO17", "", "", ""]],
-        [67,  13, "I2C1_SCL",  ["",      "",    "I2C0_SCL", "I2C1_SCL", "GPIO18", "PWM0", "", ""]],
-        [66,  14, "I2C1_SDA",  ["",      "",    "I2C0_SDA", "I2C1_SDA", "GPIO19", "PWM1", "", ""]],
-        [82,  15, "USB_BOOT",  ["", "",  "",    "", "", "", "", ""]],
-        [22,  16, "PWM0",      ["GPIO1", "",    "", "", "", "PWM0", "", ""]],
-        [23,  17, "ONEWIRE",   ["GPIO2", "",    "", "",      "ONEWIRE", "PWM1", "", ""]],
-        [54,  18, "CAM_MCLK",  ["GPIO3", "CAM_MCLK", "", "", "ONEWIRE", "PWM2", "", ""]],
-        [80,  19, "CAM_BCLK",  ["GPIO4", "CAM_BCLK",  "I2C1_SDA", "", "", "", "", ""]],
-        [81,  20, "CAM_CS",    ["GPIO5", "CAM_CS",    "I2C1_SCL", "", "", "", "", ""]],
-        [55,  21, "CAM_RX0",   ["GPIO6", "CAM_RX0",   "UART2_RXD", "", "", "", "", ""]],
-        [56,  22, "CAM_RX1",   ["GPIO7", "CAM_RX1",   "UART2_TXD", "", "ONEWIRE", "", "", ""]],
-        [83,  23, "SPI0_CS",   ["GPIO8", "SPI0_CS",   "I2C1_SDA", "", "", "", "", ""]],
-        [85,  24, "SPI0_MOSI", ["GPIO9", "SPI0_MOSI", "I2C1_SCL", "", "", "", "", ""]],
-        [84,  25, "SPI0_MISO", ["GPIO10", "SPI0_MISO", "", "UART2_RXD", "", "", "", ""]],
-        [86,  26, "SPI0_CLK",  ["GPIO11", "SPI0_CLK", "", "UART2_TXD", "", "", "", ""]],
-        [28,  27, "UART2_RXD", ["GPIO12", "SPI1_CS", "",   "UART2_RXD", "", "", "", "CAN_RXD"]],
-        [29,  28, "UART2_TXD", ["GPIO13", "SPI1_MOSI", "", "UART2_TXD", "", "", "", "CAN_TXD"]],
-        [58,  29, "UART3_RXD", ["GPIO14", "SPI1_MISO", "I2C0_SDA", "UART3_RXD", "", "PWM0", "", ""]],
-        [57,  30, "UART3_TXD", ["GPIO15", "SPI1_CLK", "I2C0_SCL", "UART3_TXD", "", "PWM1", "", ""]],
-        [38,  31, "DBG_RXD",   ["", "DBG_RXD", "", "", "", "", "", ""]],
-        [39,  32, "DBG_TXD",   ["", "DBG_TXD", "", "", "", "", "", ""]],
-        [17,  33, "UART1_RXD", ["GPIO18", "UART1_RXD", "", "", "", "", "", ""]],
-        [18,  34, "UART1_TXD", ["GPIO19", "UART1_TXD", "", "", "", "", "", ""]],
-        [30,  35, "GPIO29",    ["GPIO29", "", "", "", "", "PWM0", "", ""]],
-        [31,  36, "GPIO30",    ["GPIO30", "", "", "", "", "PWM1", "", ""]],
-        [32,  37, "GPIO31",    ["GPIO31", "", "", "", "", "PWM2", "", ""]],
-        [33,  38, "GPIO32",    ["GPIO32", "", "", "", "", "", "", ""]],
-        [26,  39, "PWM4",      ["GPIO33", "", "", "", "", "PWM4", "", ""]],
-        [53,  40, "LCD_CLK",   ["GPIO34", "LCD_CLK", "I2C0_SDA", "UART3_RXD", "", "", "", ""]],
-        [52,  41, "LCD_CS",    ["GPIO35", "LCD_CS",  "I2C0_SCL", "UART3_TXD", "", "", "", ""]],
-        [49,  42, "LCD_RST",   ["GPIO36", "LCD_RST", "I2C1_SCL", "", "", "", "", ""]],
-        [50,  43, "LCD_SDA",   ["GPIO37", "LCD_SDA", "I2C1_SDA", "", "", "", "", ""]],
-        [51,  44, "LCD_RS",    ["GPIO38", "",        "LCD_RS", "", "", "", "", ""]],
-        [102, 45, "GPIO20",    ["GPIO20", "", "", "", "", "", "", ""]],
-        [107, 46, "GPIO21",    ["GPIO21", "", "", "", "", "PWM4", "", ""]],
-        [19,  47, "GPIO22",    ["GPIO22", "", "", "", "", "", "", ""]],
-        [99,  48, "GPIO23",    ["GPIO23", "", "", "", "", "PWM0", "", ""]],
-        [20,  49, "PWM1",      ["GPIO24", "", "", "", "", "PWM1", "", ""]],
-        [106, 50, "CAN_RXD",   ["GPIO25", "", "", "", "", "PWM2", "", "CAN_RXD"]],
-        [25,  51, "CAN_TXD",   ["GPIO26", "", "", "", "", "", "", "CAN_TXD"]],
-        [16,  52, "GPIO27",    ["GPIO27", "", "", "", "", "PWM4", "", ""]],
-        [78,  53, "GPIO28",    ["GPIO28", "", "", "", "ONEWIRE", "", "", "CAN_RXD"]],
-        [101, 0,  "WAKEUP0",   ["", "", "", "", "", "", "", ""]],
-        [61,  0,  "VBUS",      ["", "", "", "", "", "", "", ""]],
-        [79,  0,  "USIM_DET",  ["", "", "", "", "", "", "", ""]],
-        [7,   0,  "PWR_KEY",   ["", "", "", "", "", "", "", ""]]
-    ],
-    "pin_others": [
-        [1, "GND"],
-        [2, "NC"],
-        [3, "NC"],
-        [4, "NC"],
-        [5, "NC"],
-        [6, "NC"],
-        [8, "NC"],
-        [9, "ADC0"],
-        [10, "GND"],
-        [11, "USIM_DAT"],
-        [12, "USIM_RST"],
-        [13, "USIM_CLK"],
-
-        [15, "RESET_N"],
-
-        [95, "GND"],
-        [14, "USIM_VDD"],
-        [21, "NC"],
-        [96, "ADC1"],
-        [24, "VDD_EXT"],
-        [27, "GND"],
-        [34, "GND"],
-        [35, "LTE_ANT"],
-        [36, "GND"],
-        [37, "GND"],
-        [40, "GND"],
-        [41, "GND"],
-        [42, "VBAT"],
-        [43, "VBAT"],
-        [44, "NC"],
-        [98, "NC"],
-
-        [45, "GND"],
-        [46, "GND"],
-        [47, "GND"],
-        [48, "GND"],
-
-        [103, "NC"],
-        [59, "USB_DP"],
-        [60, "USB_DM"],
-
-        [62, "USIM2_CLK"],
-        [63, "USIM2_RST"],
-        [64, "USIM2_DAT"],
-        [65, "USIM2_VDD"],
-
-        [104, "NC"],
-        [105, "NC"],
-
-        [68, "NC"],
-        [69, "NC"],
-
-        [70, "GND"],
-        [71, "GND"],
-        [72, "GND"],
-
-        [73, "GND"],
-        [74, "NC"],
-        [75, "NC"],
-
-        [76, "ADC3"],
-        [77, "ADC2"],
-        
-        [108, "NC"],
-        [109, "NC"],
-
-        [87, "NC"],
-        [88, "GND"],
-
-        [89, "GND"],
-        [90, "GND"],
-        [91, "GND"],
-        [92, "GND"],
-        [93, "GND"],
-        [94, "GND"]
-    ]
-}

+ 0 - 129
components/pins/meta/air780ehv.define.json

@@ -1,129 +0,0 @@
-{
-    "model": "air780ehv",
-    "pin_count" : 109,
-    "pins" : [
-        [97,  11, "GPIO16",    ["",      "",    "", "", "GPIO16", "", "", ""]],
-        [100, 12, "GPIO17",    ["",      "",    "", "", "GPIO17", "", "", ""]],
-        [67,  13, "I2C1_SCL",  ["",      "",    "I2C0_SCL", "I2C1_SCL", "GPIO18", "PWM0", "", ""]],
-        [66,  14, "I2C1_SDA",  ["",      "",    "I2C0_SDA", "I2C1_SDA", "GPIO19", "PWM1", "", ""]],
-        [82,  15, "USB_BOOT",  ["", "", "", "", "", "", "", ""]],
-        [22,  16, "PWM0",      ["GPIO1", "",    "", "", "", "PWM0", "", ""]],
-        [23,  17, "ONEWIRE",   ["GPIO2", "",    "", "",      "ONEWIRE", "PWM1", "", ""]],
-        [54,  18, "CAM_MCLK",  ["GPIO3", "CAM_MCLK", "", "", "ONEWIRE", "PWM2", "", ""]],
-        [80,  19, "CAM_BCLK",  ["GPIO4", "CAM_BCLK",  "I2C1_SDA", "", "", "", "", ""]],
-        [81,  20, "CAM_CS",    ["GPIO5", "CAM_CS",    "I2C1_SCL", "", "", "", "", ""]],
-        [55,  21, "CAM_RX0",   ["GPIO6", "CAM_RX0",   "UART2_RXD", "", "", "", "", ""]],
-        [56,  22, "CAM_RX1",   ["GPIO7", "CAM_RX1",   "UART2_TXD", "", "ONEWIRE", "", "", ""]],
-        [83,  23, "SPI0_CS",   ["GPIO8", "SPI0_CS",   "I2C1_SDA", "", "", "", "", ""]],
-        [85,  24, "SPI0_MOSI", ["GPIO9", "SPI0_MOSI", "I2C1_SCL", "", "", "", "", ""]],
-        [84,  25, "SPI0_MISO", ["GPIO10", "SPI0_MISO", "", "UART2_RXD", "", "", "", ""]],
-        [86,  26, "SPI0_CLK",  ["GPIO11", "SPI0_CLK", "", "UART2_TXD", "", "", "", ""]],
-        [28,  27, "UART2_RXD", ["GPIO12", "SPI1_CS", "",   "UART2_RXD", "", "", "", "CAN_RXD"]],
-        [29,  28, "UART2_TXD", ["GPIO13", "SPI1_MOSI", "", "UART2_TXD", "", "", "", "CAN_TXD"]],
-        [38,  0, "DBG_RXD",   ["", "DBG_RXD", "", "", "", "", "", ""]],
-        [39,  0, "DBG_TXD",   ["", "DBG_TXD", "", "", "", "", "", ""]],
-        [17,  33, "UART1_RXD", ["GPIO18", "UART1_RXD", "", "", "", "", "", ""]],
-        [18,  34, "UART1_TXD", ["GPIO19", "UART1_TXD", "", "", "", "", "", ""]],
-        [53,  40, "LCD_CLK",   ["GPIO34", "LCD_CLK", "I2C0_SDA", "UART3_RXD", "", "", "", ""]],
-        [52,  41, "LCD_CS",    ["GPIO35", "LCD_CS",  "I2C0_SCL", "UART3_TXD", "", "", "", ""]],
-        [49,  42, "LCD_RST",   ["GPIO36", "LCD_RST", "I2C1_SCL", "", "", "", "", ""]],
-        [50,  43, "LCD_SDA",   ["GPIO37", "LCD_SDA", "I2C1_SDA", "", "", "", "", ""]],
-        [51,  44, "LCD_RS",    ["GPIO38", "", "LCD_RS", "", "", "", "", ""]],
-        [107, 46, "GPIO21",    ["GPIO21", "", "", "", "", "PWM4", "", ""]],
-        [19,  47, "GPIO22",    ["GPIO22", "", "", "", "", "", "", ""]],
-        [99,  48, "GPIO23",    ["GPIO23", "", "", "", "", "PWM0", "", ""]],
-        [20,  49, "PWM1",      ["GPIO24", "", "", "", "", "PWM1", "", ""]],
-        [106, 50, "CAN_RXD",   ["GPIO25", "", "", "", "", "PWM2", "", "CAN_RXD"]],
-        [25,  51, "CAN_TXD",   ["GPIO26", "", "", "", "", "", "", "CAN_TXD"]],
-        [16,  52, "GPIO27",    ["GPIO27", "", "", "", "", "PWM4", "", ""]],
-        [78,  53, "CAN_STB",   ["GPIO28", "", "", "", "ONEWIRE", "", "", "CAN_RXD"]],
-        [101, 0,  "WAKEUP0",   ["", "", "", "", "", "", "", ""]],
-        [61,  0,  "VBUS",      ["", "", "", "", "", "", "", ""]],
-        [79,  0,  "USIM_DET",  ["", "", "", "", "", "", "", ""]],
-        [75,  0,  "WAKEUP6",   ["","","","","","","",""]],
-        [7,   0,  "PWR_KEY",   ["", "", "", "", "", "", "", ""]]
-    ],
-    "pin_others": [
-        [1, "GND"],
-        [2, "NC"],
-        [3, "NC"],
-        [4, "NC"],
-        [5, "NC"],
-        [6, "NC"],
-        [8, "NC"],
-       
-        [9, "ADC0"],
-        [10, "GND"],
-        [11, "USIM_DAT"],
-        [12, "USIM_RST"],
-        [13, "USIM_CLK"],
-        [14, "USIM_VDD"],
-        [15, "RESET_N"],
-
-        [21, "NC"],
-
-        [24, "VDD_EXT"],
-        [26, "NC"],
-        [27, "GND"],
-        [34, "GND"],
-        [35, "LTE_ANT"],
-        [36, "GND"],
-        [37, "GND"],
-        [40, "GND"],
-        [41, "GND"],
-        [42, "VBAT"],
-        [43, "VBAT"],
-        [44, "NC"],
-        [30, "NC"],
-        [31, "NC"],
-        [32, "NC" ],
-        [33, "NC"],
-      
-        [45, "GND"],
-        [46, "GND"],
-        [47, "GND"],
-        [48, "GND"],
-
-        [57, "NC"],
-        [58, "NC"],
-
-        [59, "USB_DP"],
-        [60, "USB_DM"],
-
-        [62, "USIM2_CLK"],
-        [63, "USIM2_RST"],
-        [64, "USIM2_DAT"],
-        [65, "USIM2_VDD"],
-
-        [68, "NC"],
-        [69, "NC"],
-        [70, "GND"],
-        [71, "GND"],
-        [72, "GND"],
-        [73, "GND"],
-        [74, "NC"],
-
-        [76, "ADC3"],
-        [77, "ADC2"],
-
-        [87, "NC"],
-        [88, "GND"],
-        [89, "GND"],
-        [90, "GND"],
-        [91, "GND"],
-        [92, "GND"],
-        [93, "GND"],
-        [94, "GND"],
-        [95, "GND"],
-        [96, "ADC1"],
-        [98, "NC"],
-
-        [102, "NC"],
-        [103, "NC"],
-        [104, "NC"],
-        [105, "NC"],
-
-        [108, "NC"],
-        [109, "NC"]
-    ]
-}

+ 0 - 130
components/pins/meta/air780epm.define.json

@@ -1,130 +0,0 @@
-{
-    "model": "air780epm",
-    "pin_count" : 108,
-    "pins" : [
-        [97,  11, "GPIO16",    ["",      "",    "", "", "GPIO16", "", "", ""]],
-        [100, 12, "GPIO17",    ["",      "",    "", "", "GPIO17", "", "", ""]],
-        [67,  13, "I2C1_SCL",  ["",      "",    "I2C0_SCL", "I2C1_SCL", "GPIO18", "PWM0", "", ""]],
-        [66,  14, "I2C1_SDA",  ["",      "",    "I2C0_SDA", "I2C1_SDA", "GPIO19", "PWM1", "", ""]],
-        [82,  15, "USB_BOOT",  ["", "",  "",    "", "", "", "", ""]],
-        [22,  16, "PWM0",      ["GPIO1", "",    "", "", "", "PWM0", "", ""]],
-        [23,  17, "ONEWIRE",   ["GPIO2", "",    "", "",      "ONEWIRE", "PWM1", "", ""]],
-        [54,  18, "CAM_MCLK",  ["GPIO3", "CAM_MCLK", "", "", "ONEWIRE", "PWM2", "", ""]],
-        [80,  19, "CAM_BCLK",  ["GPIO4", "CAM_BCLK",  "I2C1_SDA", "", "", "", "", ""]],
-        [81,  20, "CAM_CS",    ["GPIO5", "CAM_CS",    "I2C1_SCL", "", "", "", "", ""]],
-        [55,  21, "CAM_RX0",   ["GPIO6", "CAM_RX0",   "UART2_RXD", "", "", "", "", ""]],
-        [56,  22, "CAM_RX1",   ["GPIO7", "CAM_RX1",   "UART2_TXD", "", "ONEWIRE", "", "", ""]],
-        [83,  23, "SPI0_CS",   ["GPIO8", "SPI0_CS",   "I2C1_SDA", "", "", "", "", ""]],
-        [85,  24, "SPI0_MOSI", ["GPIO9", "SPI0_MOSI", "I2C1_SCL", "", "", "", "", ""]],
-        [84,  25, "SPI0_MISO", ["GPIO10", "SPI0_MISO", "", "UART2_RXD", "", "", "", ""]],
-        [86,  26, "SPI0_CLK",  ["GPIO11", "SPI0_CLK", "", "UART2_TXD", "", "", "", ""]],
-        [28,  27, "UART2_RXD", ["GPIO12", "SPI1_CS", "",   "UART2_RXD", "", "", "", "CAN_RXD"]],
-        [29,  28, "UART2_TXD", ["GPIO13", "SPI1_MOSI", "", "UART2_TXD", "", "", "", "CAN_TXD"]],
-        [58,  29, "UART3_RXD", ["GPIO14", "SPI1_MISO", "I2C0_SDA", "UART3_RXD", "", "PWM0", "", ""]],
-        [57,  30, "UART3_TXD", ["GPIO15", "SPI1_CLK", "I2C0_SCL", "UART3_TXD", "", "PWM1", "", ""]],
-        [38,  31, "DBG_RXD",   ["", "", "", "", "", "", "", ""]],
-        [39,  32, "DBG_TXD",   ["", "", "", "", "", "", "", ""]],
-        [17,  33, "UART1_RXD", ["GPIO18", "UART1_RXD", "", "", "", "", "", ""]],
-        [18,  34, "UART1_TXD", ["GPIO19", "UART1_TXD", "", "", "", "", "", ""]],
-        [30,  35, "GPIO29",    ["GPIO29", "", "", "", "", "PWM0", "", ""]],
-        [31,  36, "GPIO30",    ["GPIO30", "", "", "", "", "PWM1", "", ""]],
-        [32,  37, "GPIO31",    ["GPIO31", "", "", "", "", "PWM2", "", ""]],
-        [33,  38, "GPIO32",    ["GPIO32", "", "", "", "", "", "", ""]],
-        [26,  39, "PWM4",      ["GPIO33", "", "", "", "", "PWM4", "", ""]],
-        [53,  40, "LCD_CLK",   ["GPIO34", "LCD_CLK", "I2C0_SDA", "UART3_RXD", "", "", "", ""]],
-        [52,  41, "LCD_CS",    ["GPIO35", "LCD_CS",  "I2C0_SCL", "UART3_TXD", "", "", "", ""]],
-        [49,  42, "LCD_RST",   ["GPIO36", "LCD_RST", "I2C1_SCL", "", "", "", "", ""]],
-        [50,  43, "LCD_SDA",   ["GPIO37", "LCD_SDA", "I2C1_SDA", "", "", "", "", ""]],
-        [51,  44, "LCD_RS",    ["GPIO38", "",        "LCD_RS", "", "", "", "", ""]],
-        [102, 45, "GPIO20",    ["GPIO20", "", "", "", "", "", "", ""]],
-        [107, 46, "GPIO21",    ["GPIO21", "", "", "", "", "PWM4", "", ""]],
-        [19,  47, "GPIO22",    ["GPIO22", "", "", "", "", "", "", ""]],
-        [99,  48, "GPIO23",    ["GPIO23", "", "", "", "", "PWM0", "", ""]],
-        [20,  49, "PWM1",      ["GPIO24", "", "", "", "", "PWM1", "", ""]],
-        [106, 50, "CAN_RXD",   ["GPIO25", "", "", "", "", "PWM2", "", "CAN_RXD"]],
-        [25,  51, "CAN_TXD",   ["GPIO26", "", "", "", "", "", "", "CAN_TXD"]],
-        [16,  52, "GPIO27",    ["GPIO27", "", "", "", "", "PWM4", "", ""]],
-        [78,  53, "GPIO28",    ["GPIO28", "", "", "", "ONEWIRE", "", "", "CAN_RXD"]],
-        [101, 0,  "WAKEUP0",   ["", "", "", "", "", "", "", ""]],
-        [61,  0,  "VBUS",      ["", "", "", "", "", "", "", ""]],
-        [79,  0,  "USIM_DET",  ["", "", "", "", "", "", "", ""]],
-        [7,   0,  "PWR_KEY",   ["", "", "", "", "", "", "", ""]]
-    ],
-    "pin_others": [
-        [1, "GND"],
-        [2, "NC"],
-        [3, "NC"],
-        [4, "NC"],
-        [5, "NC"],
-        [6, "NC"],
-        [8, "NC"],
-        [9, "ADC0"],
-        [10, "GND"],
-        [11, "USIM_DAT"],
-        [12, "USIM_RST"],
-        [13, "USIM_CLK"],
-
-        [15, "RESET_N"],
-
-        [95, "GND"],
-        [14, "USIM_VDD"],
-        [21, "NC"],
-        [96, "ADC1"],
-        [24, "VDD_EXT"],
-        [27, "GND"],
-        [34, "GND"],
-        [35, "LTE_ANT"],
-        [36, "GND"],
-        [37, "GND"],
-        [40, "GND"],
-        [41, "GND"],
-        [42, "VBAT"],
-        [43, "VBAT"],
-        [44, "NC"],
-        [98, "NC"],
-
-        [45, "GND"],
-        [46, "GND"],
-        [47, "GND"],
-        [48, "GND"],
-
-        [103, "NC"],
-        [59, "USB_DP"],
-        [60, "USB_DM"],
-
-        [62, "USIM2_CLK"],
-        [63, "USIM2_RST"],
-        [64, "USIM2_DAT"],
-        [65, "USIM2_VDD"],
-
-        [104, "NC"],
-        [105, "NC"],
-
-        [68, "NC"],
-        [69, "NC"],
-
-        [70, "GND"],
-        [71, "GND"],
-        [72, "GND"],
-
-        [73, "GND"],
-        [74, "NC"],
-        [75, "NC"],
-
-        [76, "ADC3"],
-        [77, "ADC2"],
-        
-        [108, "NC"],
-        [109, "NC"],
-
-        [87, "NC"],
-        [88, "GND"],
-
-        [89, "GND"],
-        [90, "GND"],
-        [91, "GND"],
-        [92, "GND"],
-        [93, "GND"],
-        [94, "GND"]
-    ]
-}

+ 0 - 112
components/pins/meta/define_check.py

@@ -1,112 +0,0 @@
-#!/usr/bin/python3
-# -*- coding: UTF-8 -*-
-
-import os, sys, json, logging
-
-logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
-
-def sort_by_type(data):
-    slist = {}
-    for item in data :
-        tmp = str(item).split("_")
-        tp = None
-        stp = None
-        
-        if item == "VBUS" or item == "USB_BOOT" or item == "PWR_KEY" or item == "USIM_DET" :
-            tp = item
-            stp = ""
-        elif len(tmp) == 2 :
-            tp = tmp[0]
-            stp = tmp[1]
-        elif tmp[0].startswith("GPIO") :
-            tp = "GPIO"
-            stp = tmp[0][4:]
-        elif tmp[0].startswith("PWM") :
-            tp = "PWM"
-            stp = tmp[0][3:]
-        elif tmp[0].startswith("WAKEUP") :
-            tp = "WAKEUP"
-            stp = tmp[0][6:]
-        else :
-            tp = tmp[0]
-            stp = ""
-        if tp not in slist :
-            slist[tp] = []
-        slist[tp].append(stp)
-    return slist
-
-def main():
-    path = sys.argv[1]
-    with open(path, 'r', encoding='utf-8') as f:
-        data = json.load(f)
-    # 首先, 管脚号是否有重复
-    pin_list = set()
-    paddr_list = set()
-    alt_list = set()
-    alt_dft_list = set()
-    autotest_script = ""
-    for item in data["pins"] :
-        pin = item[0]
-        paddr = item[1]
-        alt = item[2]
-
-        # 管脚物理编号,是否有重复
-        if pin in pin_list :
-            logging.error("pin %s is duplicate" % pin)
-        pin_list.add(pin)
-
-        # paddr 是否有重复
-        if paddr in paddr_list and paddr != 0 :
-            logging.error("paddr %s is duplicate at pin %d" % (paddr, pin))
-        paddr_list.add(paddr)
-
-        # 遍历全部alt
-        self_alts = set()
-        for altitem in item[3] :
-            if "" == altitem :
-                continue
-            alt_list.add(altitem)
-            self_alts.add(altitem)
-        # 默认alt是否在self_alts中, 需要排除全是""的alt
-        if len(self_alts) > 0 and alt not in self_alts:
-            logging.error("alt %s is not in self alt list, pin %d" % (alt, pin))
-
-        # 默认alt是否有重复
-        if alt in alt_dft_list :
-            logging.error("alt %s is duplicate" % alt)
-        alt_dft_list.add(alt)
-
-        # 生成自动测试脚本, 全部功能配置一遍
-        for altitem in self_alts :
-            autotest_script += "pins.setup(%3d, \"%s\")\n" % (pin, altitem)
-
-    alt_list_sorted = sorted(list(alt_list))
-    # for alt in alt_list_sorted:
-    #     logging.debug("alt %s" % alt)
-    slist = sort_by_type(alt_list_sorted)
-    for tp in slist :
-        slist[tp] = sorted(slist[tp])
-        logging.debug("alt %s : %s" % (tp, ",".join(slist[tp])))
-
-    # 打印默认alt功能分类
-    
-    slist = sort_by_type(alt_dft_list)
-    for tp in slist :
-        slist[tp] = sorted(slist[tp])
-        logging.debug("dft alt %s : %s" % (tp, ",".join(slist[tp])))
-
-    model = os.path.basename(path).split(".")[0]
-    dst = os.path.join("..", "..", "..", "luat", "demo", "pins", model + "_test.lua")
-    with open(dst, "w+", encoding='utf-8') as f:
-        f.write(autotest_script)
-
-    # 检查管脚是不是全部声明了, 包括不需要复用的
-    for item in data["pin_others"] :
-        pin = item[0]
-        pin_list.add(pin)
-    for id in range(1, data["pin_count"] + 1) :
-        if id not in pin_list :
-            logging.error("pin %d is not declared" % id)
-
-if __name__ == '__main__':
-    main()

+ 91 - 3
luat/demo/netdrv/ch390h/wan.lua

@@ -52,12 +52,12 @@ sys.taskInit(function()
         return 404, {}, "Not Found" .. uri
     end, socket.LWIP_ETH)
     iperf.server(socket.LWIP_ETH)
-    if netdrv.event_subscribe then
-        netdrv.event_subscribe(socket.LWIP_ETH, netdrv.EVT_SOCKET, function(id, event, params)
+    if netdrv.on then
+        netdrv.on(socket.LWIP_ETH, netdrv.EVT_SOCKET, function(id, event, params)
             log.info("netdrv", "socket event", id, event, json.encode(params or {}))
         end)
     else
-        log.warn("netdrv", "not support event_subscribe")
+        log.warn("netdrv", "not support netdrv.on")
     end
     while 1 do
         sys.wait(6000)
@@ -74,3 +74,91 @@ sys.taskInit(function()
         -- log.info("sys", rtos.meminfo("sys"))
     end
 end)
+
+--根据自己的服务器修改以下参数
+local mqtt_host = "lbsmqtt.airm2m.com"
+local mqtt_port = 18840
+local mqtt_isssl = false
+local client_id = "abc"
+local user_name = "user"
+local password = "password"
+
+local pub_topic = "/luatos/pub/" .. (mcu.unique_id():toHex())
+local sub_topic = "/luatos/sub/" .. (mcu.unique_id():toHex())
+-- local topic2 = "/luatos/2"
+-- local topic3 = "/luatos/3"
+
+local mqttc = nil
+
+sys.taskInit(function()
+    -- 等待联网
+    local ret, device_id = sys.waitUntil("IP_READY")
+    -- 下面的是mqtt的参数均可自行修改
+    client_id = device_id
+    pub_topic = "/luatos/pub/" .. device_id
+    sub_topic = "/luatos/sub/" .. device_id
+
+    -- 打印一下上报(pub)和下发(sub)的topic名称
+    -- 上报: 设备 ---> 服务器
+    -- 下发: 设备 <--- 服务器
+    -- 可使用mqtt.x等客户端进行调试
+    log.info("mqtt", "pub", pub_topic)
+    log.info("mqtt", "sub", sub_topic)
+
+    -- 打印一下支持的加密套件, 通常来说, 固件已包含常见的99%的加密套件
+    -- if crypto.cipher_suites then
+    --     log.info("cipher", "suites", json.encode(crypto.cipher_suites()))
+    -- end
+    if mqtt == nil then
+        while 1 do
+            sys.wait(1000)
+            log.info("bsp", "本bsp未适配mqtt库, 请查证")
+        end
+    end
+
+    -------------------------------------
+    -------- MQTT 演示代码 --------------
+    -------------------------------------
+    -- socket.dft(socket.LWIP_ETH)
+    mqttc = mqtt.create(socket.LWIP_ETH, mqtt_host, mqtt_port, mqtt_isssl)
+
+    mqttc:auth(client_id,user_name,password) -- client_id必填,其余选填
+    -- mqttc:keepalive(240) -- 默认值240s
+    mqttc:autoreconn(true, 3000) -- 自动重连机制
+
+    mqttc:on(function(mqtt_client, event, data, payload)
+        -- 用户自定义代码
+        log.info("mqtt", "event", event, mqtt_client, data, payload)
+        if event == "conack" then
+            -- 联上了
+            sys.publish("mqtt_conack")
+            mqtt_client:subscribe(sub_topic)--单主题订阅
+            -- mqtt_client:subscribe({[topic1]=1,[topic2]=1,[topic3]=1})--多主题订阅
+        elseif event == "recv" then
+            log.info("mqtt", "downlink", "topic", data, "payload", payload)
+            sys.publish("mqtt_payload", data, payload)
+        elseif event == "sent" then
+            -- log.info("mqtt", "sent", "pkgid", data)
+        -- elseif event == "disconnect" then
+            -- 非自动重连时,按需重启mqttc
+            -- mqtt_client:connect()
+        end
+    end)
+
+    -- mqttc自动处理重连, 除非自行关闭
+    mqttc:connect()
+	sys.waitUntil("mqtt_conack")
+    while true do
+        -- 演示等待其他task发送过来的上报信息
+        local ret, topic, data, qos = sys.waitUntil("mqtt_pub", 300000)
+        if ret then
+            -- 提供关闭本while循环的途径, 不需要可以注释掉
+            if topic == "close" then break end
+            mqttc:publish(topic, data, qos)
+        end
+        -- 如果没有其他task上报, 可以写个空等待
+        --sys.wait(60000000)
+    end
+    mqttc:close()
+    mqttc = nil
+end)

+ 79 - 0
module/Air8000/demo/accessory_board/AirETH_1000/lan.lua

@@ -0,0 +1,79 @@
+--[[
+@module  lan
+@summary lan 模组连接4G网络通过以太网口传输给其他设备
+@version 1.0
+@date    2025.09.12
+@author  王城钧
+@usage
+本文件为lan网络模块,核心业务逻辑为:
+1.设置模组连接4G网络通过以太网口传输给其他设备
+本文件没有对外接口,直接在main.lua中require "lan"就可以加载运行;
+]]
+
+dhcps = require "dhcpsrv"
+dnsproxy = require "dnsproxy"
+
+-- 启动lan网络初始化
+local function lan_init()
+    sys.wait(500)   -- 非必须延时
+    log.info("ch390", "打开LDO供电")
+    gpio.setup(140, 1, gpio.PULLUP)     --打开ch390供电
+    sys.wait(6000)
+    local result = spi.setup(
+        1,--spi_id
+        nil,
+        0,--CPHA
+        0,--CPOL
+        8,--数据宽度
+        25600000--,--频率
+        -- spi.MSB,--高低位顺序    可选,默认高位在前
+        -- spi.master,--主模式     可选,默认主
+        -- spi.full--全双工       可选,默认全双工
+    )
+    log.info("main", "open",result)
+    if result ~= 0 then--返回值为0,表示打开成功
+        log.info("main", "spi open error",result)
+        return
+    end
+
+    -- 初始化指定netdrv设备,
+    -- socket.LWIP_ETH 网络适配器编号
+    -- netdrv.CH390外挂CH390
+    -- SPI ID 1, 片选 GPIO12
+    netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {spi=1,cs=12})
+    sys.wait(3000)
+    local ipv4,mark, gw = netdrv.ipv4(socket.LWIP_ETH, "192.168.4.1", "255.255.255.0", "192.168.4.1")
+    log.info("ipv4", ipv4,mark, gw)
+    while netdrv.link(socket.LWIP_ETH) ~= true do
+        -- sys.wait(100)   -- 等待以太网口联通
+    end
+    while netdrv.link(socket.LWIP_GP) ~= true do
+        -- sys.wait(100)   -- 等待GP口联通
+    end
+    sys.wait(2000) --非必须延时
+    dhcps.create({adapter=socket.LWIP_ETH})
+    dnsproxy.setup(socket.LWIP_ETH, socket.LWIP_GP)
+    netdrv.napt(socket.LWIP_GP)
+    if iperf then
+        log.info("启动iperf服务器端")
+        iperf.server(socket.LWIP_ETH)
+    end
+end
+
+-- 启动lan网络任务
+local function lan_task()
+    -- sys.waitUntil("IP_READY")
+    while 1 do
+        sys.wait(3000) -- 非必须延时, 此处为了方便观察日志
+        -- log.info("http", http.request("GET", "http://httpbin.air32.cn/bytes/4096", nil, nil, {adapter=socket.LWIP_ETH}).wait())
+        log.info("lua", rtos.meminfo())
+        log.info("sys", rtos.meminfo("sys"))
+        -- log.info("psram", rtos.meminfo("psram"))
+    end
+end
+
+-- 启动lan网络初始化
+sys.taskInit(lan_init)
+
+-- 启动lan网络任务
+sys.taskInit(lan_task)

+ 66 - 0
module/Air8000/demo/accessory_board/AirETH_1000/main.lua

@@ -0,0 +1,66 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
+@version 1.0
+@date    2025.09.12
+@author  王城钧
+@usage
+本demo演示的核心功能为:
+1.设置三种以太网小板工作模式,一种为以太网提供网络供模组上网,一种为设置模组连接4G网络通过以太网口传输给其他设备,一种为以太网提供网络供wifi和以太网设备上网
+更多说明参考本目录下的readme.md文件
+]]
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
+PROJECT = "Air_ETH1000"
+VERSION = "001.000.000"
+
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
+end
+
+
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+-- 开启WAN功能(以太网提供网络供模组上网)
+-- require "wan"
+
+-- 开启LAN功能(设置模组连接4G网络通过以太网口传输给其他设备)
+require "lan"
+
+-- 开启多网融合功能(以太网提供网络供wifi和以太网设备上网)
+-- require "netif_app"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 49 - 0
module/Air8000/demo/accessory_board/AirETH_1000/netif_app.lua

@@ -0,0 +1,49 @@
+--[[
+@module  netif_app
+@summary netif_app 网络管理模块,开启多网融合功能,以太网提供网络供wifi和以太网设备上网
+@version 1.0
+@date    2025.08.05
+@author  魏健强
+@usage
+本文件为网络管理模块,核心业务逻辑为:
+1.设置多网融合功能,以太网提供网络供wifi和以太网设备上网
+2.http测试以太网网络
+本文件没有对外接口,直接在main.lua中require "netif_app"就可以加载运行;
+]]
+
+exnetif = require "exnetif"
+
+function netif_app_task_func()
+    local res
+    --设置多网融合功能,以太网提供网络供wifi设备上网
+    res = exnetif.setproxy(socket.LWIP_AP, socket.LWIP_ETH, {
+            ssid = "test2",                     -- AP热点名称(string),网卡包含wifi时填写
+            password = "HZ88888888",            -- AP热点密码(string),网卡包含wifi时填写
+            -- ap_opts = {                      -- AP模式下配置项(选填参数)
+            --     hidden = false,              -- 是否隐藏SSID, 默认false,不隐藏
+            --     max_conn = 4 },              -- 最大客户端数量, 默认4
+            -- channel = 6,                     -- AP建立的通道(选填参数), 默认6
+            -- adapter_addr = "192.168.5.1",    -- 自定义LWIP_AP网卡的ip地址(选填),需要自定义ip和网关ip时填写
+            -- adapter_gw = { 192, 168, 5, 1 }, -- 自定义LWIP_AP网卡的网关地址(选填),需要自定义ip和网关ip时填写
+            main_adapter = {                    -- 提供网络的网卡开启参数
+                ethpower_en = 140,              -- 以太网模块的pwrpin引脚(gpio编号)
+                tp = netdrv.CH390,              -- 网卡芯片型号(选填参数),仅spi方式外挂以太网时需要填写。
+                opts = {spi = 1, cs = 12}       -- 使用8000核心板上面的SPI1时,cs引脚为12
+            }
+        })
+    
+    if res then
+        log.info("exnetif", "setproxy success")
+    else
+        log.info("开启失败,请检查配置项是否正确,日志中是否打印了错误信息")
+    end
+
+    -- 每5秒进行HTTPS连接测试,实时监测以太网网络连接状态, 仅供测试需要,量产不需要,用来判断当前网络是否可用,需要的话可以打开注释
+    -- while 1 do
+    --     local code, headers, body = http.request("GET", "https://httpbin.air32.cn/bytes/2048", nil, nil, {adapter=socket.LWIP_ETH,timeout=5000,debug=false}).wait()
+    --     log.info("http执行结果", code, headers, body and #body)
+    --     sys.wait(5000)
+    -- end
+end
+
+sys.taskInit(netif_app_task_func)

+ 125 - 0
module/Air8000/demo/accessory_board/AirETH_1000/readme.md

@@ -0,0 +1,125 @@
+## 功能模块介绍:
+
+1、main.lua:主程序入口,以下三个脚本按自己的需求选择其一使用即可,另外两个注释;
+
+2、wan.lua:以太网提供网络供模组上网;
+
+3、lan.lua:模组连接4G网络通过以太网口传输给其他设备供网;
+
+4、netif_app: 网络管理模块,开启多网融合功能,以太网提供网络供wifi和以太网设备上网;
+
+## 演示功能概述
+
+1、模组连接4G网络通过以太网口传输给其他设备供网 
+
+## 演示硬件环境
+
+1、Air8000核心板一块+可上网的sim卡一张+网线一根+AirETH_1000板子一个;
+
+[](https://docs.openluat.com/air8000/luatos/app/image/lan.jpg)
+
+![lan](E:\文档池\新建文件夹\luatos-doc-pool\docs\root\docs\air8000\luatos\app\image\lan.jpg)
+
+2、TYPE-C USB数据线一根 + 杜邦线若干;
+
+* Air8000核心板通过TYPE-C USB口供电;(外部供电/USB供电 拨动开关 拨到 USB供电一端)
+
+* TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
+
+* AirETH_1000板子网口与电脑网口通过网线连接;
+
+3、Air8000核心板和AirETH_1000配件板的硬件接线方式为:
+
+| Air8000核心板 | AirETH_1000配件板 |
+| ---------- | -------------- |
+| vdd        | 3.3v           |
+| gnd        | gnd            |
+| spi1_sclk  | SCK            |
+| spi1_cs    | CSS            |
+| spi1_miso  | SDO            |
+| spi1_mosi  | SDI            |
+| gpio21     | INT            |
+
+演示软件环境
+------
+
+1、Luatools下载调试工具
+
+2、[Air8000 V2014版本固件](https://docs.openluat.com/air8000/luatos/firmware/)(理论上,2025年9月12日之后发布的固件都可以) 
+
+## 演示核心步骤
+
+1、搭建好硬件环境,按接线图连接硬件。
+
+2、烧录内核固件和本项目的Lua脚本:main.lua:主程序入口(需要在main.lua文件中打开require"lan"),lan.lua:模组连接4G网络通过以太网口传输给其他设备供网。
+
+3、启动设备,观察日志输出:
+
+```
+[2025-09-12 15:25:44.453][000000006.933] D/ch390h 注册CH390H设备 SPI id 1 cs 12 irq 255
+
+[2025-09-12 15:25:44.512][000000006.934] D/netdrv.ch390x task started
+
+[2025-09-12 15:25:44.560][000000006.934] D/ch390h ch390注册完成
+
+[2025-09-12 15:25:44.595][000000006.979] D/netdrv.ch390x 初始化MAC 701988D3008A
+
+[2025-09-12 15:25:44.627][000000006.980] D/netdrv.ch390x luat_netif_init 执行完成 1
+
+[2025-09-12 15:25:45.993][000000008.574] I/netdrv.ch390x link is up 1 12 100M
+
+[2025-09-12 15:25:46.850][000000009.435] I/user.lua 4194296 54592 54592
+
+[2025-09-12 15:25:46.880][000000009.435] I/user.sys 3208824 303680 305200
+
+[2025-09-12 15:25:47.349][000000009.935] D/net network ready 4, setup dns server
+
+[2025-09-12 15:25:47.445][000000009.935] I/user.ipv4 192.168.4.1 255.255.255.0 192.168.4.1
+
+[2025-09-12 15:25:49.356][000000011.936] I/user.dhcpsrv 自动获取网卡IP作为网关 192.168.4.1
+
+[2025-09-12 15:25:49.399][000000011.937] D/socket connect to 255.255.255.255,0
+
+[2025-09-12 15:25:49.451][000000011.937] D/net connect 255.255.255.255:0 UDP
+
+[2025-09-12 15:25:49.482][000000011.939] I/user.dnsproxy 4 1
+
+[2025-09-12 15:25:49.525][000000011.941] I/user.dnsproxy 开始监听
+
+[2025-09-12 15:25:49.568][000000011.944] D/socket connect to 255.255.255.255,0
+
+[2025-09-12 15:25:49.612][000000011.945] D/net connect 255.255.255.255:0 UDP
+
+[2025-09-12 15:25:49.655][000000011.946] D/socket connect to 119.29.29.29,53
+
+[2025-09-12 15:25:49.699][000000011.946] D/netdrv NAPT is enabled gw 1
+
+[2025-09-12 15:25:49.751][000000011.951] I/user.启动iperf服务器端
+
+[2025-09-12 15:25:49.794][000000011.952] D/iperf 启动iperf server 0
+
+[2025-09-12 15:25:49.825][000000011.952] D/lwiperf iperf_malloc 88 88 0xc1703c4
+
+[2025-09-12 15:25:49.852][000000011.952] D/iperf iperf listen 192.168.4.1:5001
+
+[2025-09-12 15:25:49.878][000000012.436] I/user.lua 4194296 58552 58568
+
+[2025-09-12 15:25:49.908][000000012.436] I/user.sys 3208824 512576 514616
+
+[2025-09-12 15:25:50.690][000000013.275] I/user.dhcpsrv 是discover包 E466E52E5EE6 12
+
+[2025-09-12 15:25:50.720][000000013.276] I/user.dhcpsrv 分配ip E466E52E5EE6 192.168.4.100
+
+[2025-09-12 15:25:50.755][000000013.276] I/user.dhcpsrv send offer
+
+[2025-09-12 15:25:50.791][000000013.289] I/user.dhcpsrv 是request包 E466E52E5EE6 12
+
+[2025-09-12 15:25:50.828][000000013.289] I/user.dhcpsrv request,发现已经分配的mac地址, send ack E466E52E5EE6 12
+
+[2025-09-12 15:25:52.852][000000015.437] I/user.lua 4194296 69128 69944
+
+[2025-09-12 15:25:52.883][000000015.437] I/user.sys 3208824 514232 515760
+
+```
+
+4、电脑通过网线与AirETH_1000板子连接若可以正常上网,则表示验证成功。

+ 60 - 0
module/Air8000/demo/accessory_board/AirETH_1000/wan.lua

@@ -0,0 +1,60 @@
+--[[
+@module  wan
+@summary wan 以太网提供网络供模组上网
+@version 1.0
+@date    2025.09.12
+@author  王城钧
+@usage
+本文件为lan网络模块,核心业务逻辑为:
+1.以太网提供网络供模组上网
+2.http测试以太网网络
+本文件没有对外接口,直接在main.lua中require "wan"就可以加载运行;
+]]
+
+-- 启动WAN网络初始化
+local function wan_init()
+    sys.wait(500)                   --等待500ms,此延时非必须
+    log.info("ch390", "打开LDO供电")
+    gpio.setup(140, 1, gpio.PULLUP) --打开ch390供电
+    sys.wait(6000)                  --等待6000ms,此延时非必须
+    local result = spi.setup(
+        1,                          --spi_id
+        nil,
+        0,                          --CPHA
+        0,                          --CPOL
+        8,                          --数据宽度
+        25600000                    --,--频率
+    -- spi.MSB,--高低位顺序    可选,默认高位在前
+    -- spi.master,--主模式     可选,默认主
+    -- spi.full--全双工       可选,默认全双工
+    )
+    log.info("main", "open", result)
+    if result ~= 0 then --返回值为0,表示打开成功
+        log.info("main", "spi open error", result)
+        return
+    end
+    -- 初始化指定netdrv设备,
+    -- socket.LWIP_ETH 网络适配器编号
+    -- netdrv.CH390外挂CH390
+    -- SPI ID 1, 片选 GPIO12
+    netdrv.setup(socket.LWIP_ETH, netdrv.CH390, { spi = 1, cs = 12 })
+    netdrv.dhcp(socket.LWIP_ETH, true)
+end
+
+-- WAN网络测试任务
+local function wan_task()
+    -- sys.waitUntil("IP_READY")
+    while 1 do
+        sys.wait(6000)    --非必须延时,只是为了方便观察日志输出                                                                                                      -- 此处延时非必须,只是为了方便观察日志输出
+        log.info("http",
+            http.request("GET", "http://httpbin.air32.cn/bytes/4096", nil, nil, { adapter = socket.LWIP_ETH }).wait())          --adapter指定为以太网联网方式
+        log.info("lua", rtos.meminfo())
+        log.info("sys", rtos.meminfo("sys"))
+    end
+end
+
+-- 启动WAN网络初始化和任务
+sys.taskInit(wan_init)
+
+-- 启动WAN联网测试
+sys.taskInit(wan_task)

+ 2 - 0
module/Air8000/demo/ble/central/ble_client_sender.lua

@@ -104,6 +104,7 @@ local function ble_client_sender_task_func()
         -- BLE连接成功
         -- msg[3]表示ble_device对象
         if msg[2] == "CONNECT_OK" then
+            sys.publish("BLE_CONNECT_STATUS", true)
             ble_device = msg[3]
             -- 发送send_queue中的数据
             send_item = send_item_func(ble_device)
@@ -125,6 +126,7 @@ local function ble_client_sender_task_func()
 
         -- BLE断开连接
         elseif msg[2] == "DISCONNECTED" then
+            sys.publish("BLE_CONNECT_STATUS", false)
             -- 清空ble_device对象
             ble_device = nil
             -- 如果存在正在等待发送结果的发送项,执行回调函数通知发送方失败

+ 21 - 6
module/Air8000/demo/ble/central/ble_timer_app.lua

@@ -58,10 +58,25 @@ local function read_data_req_timer_cbfunc()
     sys.sendMsg(BLE_TASK_NAME,"BLE_EVENT","READ_REQ",server_uuid,read_char_uuid)
 end
 
--- 启动5秒的循环定时器用于发送数据
-sys.timerLoopStart(send_data_req_timer_cbfunc, 5000)
-log.info("TIMER_APP", "已启动发送数据循环定时器,间隔: 5000ms")
+local function ble_connect_status_handler(status)
+    if status then
+        -- 蓝牙连接成功,启动定时器
+        -- 启动5秒的循环定时器用于发送数据
+        sys.timerLoopStart(send_data_req_timer_cbfunc, 5000)
+        log.info("TIMER_APP", "已启动发送数据循环定时器,间隔: 5000ms")
 
--- 启动5秒的循环定时器用于读取数据
-sys.timerLoopStart(read_data_req_timer_cbfunc, 5000)
-log.info("TIMER_APP", "已启动读取数据循环定时器,间隔: 5000ms")
+        -- 启动5秒的循环定时器用于读取数据
+        sys.timerLoopStart(read_data_req_timer_cbfunc, 5000)
+        log.info("TIMER_APP", "已启动读取数据循环定时器,间隔: 5000ms")
+    else
+        -- 蓝牙断开连接,停止定时器
+        sys.timerStop(send_data_req_timer_cbfunc)
+        log.info("TIMER_APP", "已停止发送数据循环定时器")
+
+        sys.timerStop(read_data_req_timer_cbfunc)
+        log.info("TIMER_APP", "已停止读取数据循环定时器")
+    end
+end
+
+-- 订阅BLE_CONNECT_STATUS事件
+sys.subscribe("BLE_CONNECT_STATUS", ble_connect_status_handler)

+ 2 - 0
module/Air8000/demo/ble/peripheral/ble_server_sender.lua

@@ -120,6 +120,7 @@ local function ble_server_sender_task_func()
         -- BLE连接成功
         -- msg[3]表示ble_device对象
         if msg[2] == "CONNECT_OK" then
+            sys.publish("BLE_CONNECT_STATUS", true)
             ble_device = msg[3]
             -- 发送send_queue中的数据
             send_item = send_item_func(ble_device)
@@ -131,6 +132,7 @@ local function ble_server_sender_task_func()
                 send_item = send_item_func(ble_device)
             end
         elseif msg[2] == "DISCONNECTED" then
+            sys.publish("BLE_CONNECT_STATUS", false)
             -- 清空ble_device对象
             ble_device = nil
             -- 如果存在正在等待发送结果的发送项,执行回调函数通知发送方失败

+ 18 - 6
module/Air8000/demo/ble/peripheral/ble_timer_app.lua

@@ -56,11 +56,23 @@ function send_write_data_timer_cbfunc()
     sys.publish("SEND_DATA_REQ", "timer", config.service_uuid, config.char_uuid3, write_data, "write", {func = send_data_cbfunc, para="timer "..write_data})
 end
 
--- 启动5秒的循环定时器用于通过notify方式发送数据
-sys.timerLoopStart(send_notify_data_timer_cbfunc, 5000)
-log.info("ble_timer_app", "已启动notify发送定时器, 间隔: 5000ms")
+local function ble_connect_status_handler(status)
+    if status then
+        -- 蓝牙连接成功,启动定时器
+        sys.timerLoopStart(send_notify_data_timer_cbfunc, 5000)
+        log.info("ble_timer_app", "已启动notify发送定时器, 间隔: 5000ms")
 
--- 启动6秒的循环定时器用于通过write方式发送数据
-sys.timerLoopStart(send_write_data_timer_cbfunc, 6000)
-log.info("ble_timer_app", "已启动write发送定时器, 间隔: 6000ms")
+        sys.timerLoopStart(send_write_data_timer_cbfunc, 6000)
+        log.info("ble_timer_app", "已启动write发送定时器, 间隔: 6000ms")
+    else
+        -- 蓝牙断开连接,停止定时器
+        sys.timerStop(send_notify_data_timer_cbfunc)
+        log.info("ble_timer_app", "已停止notify发送定时器")
 
+        sys.timerStop(send_write_data_timer_cbfunc)
+        log.info("ble_timer_app", "已停止write发送定时器")
+    end
+end
+
+-- 订阅BLE_CONNECT_STATUS事件
+sys.subscribe("BLE_CONNECT_STATUS", ble_connect_status_handler)

+ 1 - 1
module/Air8000/demo/errDump/auto_dump_udp_srv.lua

@@ -25,7 +25,7 @@ local function test_user_log()
         sys.waitUntil("IP_READY", 1000)
     end
     -- 下面演示自动发送异常日志到自建udp服务器,如果是系统异常日志,则会在重启后自动上报,如果是用户写入调试日志,则周期性上报。
-    errDump.config(true,600,nil,nil,"112.125.89.8",47250)
+    errDump.config(true,600,nil,nil,"112.125.89.8",47816)
     while true do
         sys.wait(15000)
         -- 上报用户调试日志

+ 7 - 12
module/Air8000/demo/errDump/errdump_read.lua

@@ -28,31 +28,26 @@ local function test_user_log()
         sys.publish("ERRDUMP_DATA_SEND_UART", err_buff:toStr(0, err_buff:used()))
         -- 将读取到的系统异常日志通过"SEND_DATA_REQ"消息publish给tcp发送出去
         sys.publish("SEND_DATA_REQ", err_buff:toStr(0, err_buff:used()))
-    end
-    --手动读取的话需要手动删除日志,否则下次读取会继续读取上次的日志
-    --  errDump.dumpf返回值:true表示本次读取前并没有写入数据,false反之,在删除日志前,最好再读一下确保没有新的数据写入了
-    new_flag = errDump.dump(err_buff, errDump.TYPE_SYS)
-    if not new_flag then
-        log.info("没有新数据了,删除系统错误日志")
+        --手动读取的话需要手动删除日志,否则下次读取会继续读取上次的日志
+        log.info("读取完系统错误日志,删除系统错误日志")
         errDump.dump(nil, errDump.TYPE_SYS, true)
     end
     -- 开机读取完系统异常日志后循环读取用户调试日志
     while true do
         local new_flag = errDump.dump(err_buff, errDump.TYPE_USR)
-        if new_flag then
+        if err_buff:used() > 0 then
             log.info("errBuff", err_buff:toStr(0, err_buff:used()))
             -- 将数据data通过"ERRDUMP_DATA_SEND_UART"消息publish给串口发送出去
             sys.publish("ERRDUMP_DATA_SEND_UART", err_buff:toStr(0, err_buff:used()))
             -- 将读取到的用户调试日志通过"SEND_DATA_REQ"消息publish给tcp发送出去
             sys.publish("SEND_DATA_REQ", err_buff:toStr(0, err_buff:used()))
-        end
-        new_flag = errDump.dump(err_buff, errDump.TYPE_USR)
-        if not new_flag then
-            log.info("没有新数据了,删除用户调试日志")
+            --手动读取的话需要手动删除日志,否则下次读取会继续读取上次的日志
+            log.info("读取完用户调试日志,删除用户调试日志")
             errDump.dump(nil, errDump.TYPE_USR, true)
         end
         sys.wait(15000)
-        errDump.record("测试一下用户的调试日志记录功能") --写入用户的调试日志,注意最大只有4KB,超过部分新的覆盖旧的
+        --写入用户的调试日志测试,注意最大只有4KB,超过部分新的覆盖旧的
+        errDump.record("测试一下用户的调试日志记录功能")
     end
 end
 

+ 1 - 1
module/Air8000/demo/errDump/errdump_tcp/tcp_client_main.lua

@@ -24,7 +24,7 @@ local tcp_client_sender = require "tcp_client_sender"
 -- 点击 打开TCP 按钮,会创建一个TCP server
 -- 将server的地址和端口赋值给下面这两个变量
 local SERVER_ADDR = "112.125.89.8"
-local SERVER_PORT = 48481
+local SERVER_PORT = 47305
 
 -- tcp_client_main的任务名
 local TASK_NAME = tcp_client_sender.TASK_NAME

+ 2 - 2
module/Air8000/demo/errDump/main.lua

@@ -66,11 +66,11 @@ require "netdrv_device"
 -- require "auto_dump_air_srv"
 
 --自动上报异常日志到自建UDP平台
-require "auto_dump_udp_srv"
+-- require "auto_dump_udp_srv"
 
 --手动读取异常日志并通过串口和TCP传输
 --加载手动读取异常日志模块
--- require "errdump_read"
+require "errdump_read"
 
 
 -- 用户代码已结束---------------------------------------------

+ 1 - 0
module/Air8000/project/wifi_ap_read_file/ap_init.lua

@@ -13,6 +13,7 @@
 本文件在其余文件中用到了其中的变量,可直接在所需文件中 require "ap_init" 来加载运行。
 ]]
 
+dnsproxy = require("dnsproxy")
 dhcpsrv = require("dhcpsrv")
 -- 配置参数
 local AP_SSID       = "Air8000_FileHub"

+ 0 - 0
module/Air8101/project/core_accessory_board/AirCAMERA_1020/AirCAMERA_1020.lua → module/Air8101/demo/accessory_board/AirCAMERA_1020/AirCAMERA_1020.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirCAMERA_1020/http_app.lua → module/Air8101/demo/accessory_board/AirCAMERA_1020/http_app.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirCAMERA_1020/main.lua → module/Air8101/demo/accessory_board/AirCAMERA_1020/main.lua


+ 77 - 77
module/Air8101/project/core_accessory_board/AirCAMERA_1020/readme.md → module/Air8101/demo/accessory_board/AirCAMERA_1020/readme.md

@@ -1,77 +1,77 @@
-
-## 演示功能概述
-
-AirCAMERA_1020是合宙设计生产的一款DVP摄像头配件板;
-
-本demo演示的核心功能为:
-
-Air8101核心板+AirCAMERA_1020配件板,演示DVP摄像头100万像素拍照+http上传照片+电脑浏览器查看照片的功能;
-
-
-## 核心板+配件板资料
-
-[Air8101核心板+配件板相关资料](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
-
-
-## 演示硬件环境
-
-![](https://docs.openluat.com/air8101/product/file/AirCAMERA_1020/hw_connection.jpg)
-
-![](https://docs.openluat.com/air8101/product/file/AirCAMERA_1020/hw_connection1.jpg)
-
-1、Air8101核心板
-
-2、AirCAMERA_1020配件板(带DVP摄像头,1.8V的开关拨到ON,1.2V和1.5V的开关拨到OFF)
-
-3、Air8101核心板和AirCAMERA_1020配件板的硬件接线方式为
-
-- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端),此种供电方式下,vbat引脚为3.3V,可以直接给AirCAMERA_1020配件板供电;
-
-- 为了演示方便,所以Air8101核心板上电后直接通过vbat引脚给AirCAMERA_1020配件板提供了3.3V的供电;
-
-- 客户在设计实际项目时,一般来说,需要通过一个GPIO来控制LDO给摄像头供电,这样可以灵活地控制摄像头的供电,可以使项目的整体功耗降到最低;
-
-- AirCAMERA_1020配件板设计为了排母的形式,可以参考下表直接插到Air8101核心板的排针上
-
-| Air8101核心板 | AirCAMERA_1020配件板 |
-| ------------ | -------------------- |
-|     vbat     |          VDD         |
-|     gnd      |          GND         |
-|   11/U1RX    |          SDA         |
-|   12/U1TX    |          SCL         |
-|   73/VSY     |          VSY         |
-|    3/HSY     |          HSY         |
-|    69/D7     |           D7         |
-|    2/MCLK    |         MCLK         |
-|     7/D6     |           D6         |
-|     70/D5    |           D5         |
-|    74/PCK    |         PCLK         |
-|     6/D4     |           D4         |
-|     4/D0     |           D0         |
-|    71/D3     |           D3         |
-|    72/D1     |           D1         |
-|     5/D2     |     <font color="red">D2(错印成了D5)</font>    |
-
-
-## 演示软件环境
-
-1、Luatools下载调试工具
-
-2、[Air8101 V1003版本固件](https://docs.openluat.com/air8101/luatos/firmware/)(理论上最新版本固件也可以,如果使用最新版本的固件不可以,可以烧录V1003固件对比验证)
-
-
-## 演示操作步骤
-
-1、搭建好演示硬件环境
-
-2、demo脚本代码wifi_app.lua中的wlan.connect("茶室-降功耗,找合宙!", "Air123456", 1),前两个参数,修改为自己测试时wifi热点的名称和密码;注意:仅支持2.4G的wifi,不支持5G的wifi
-
-3、Luatools烧录内核固件和修改后的demo脚本代码
-
-4、烧录成功后,自动开机运行
-
-5、观察Luatools的运行日志,如果输出 http_upload_photo_task_func httpplus.request 200表示测试正常
-
-6、电脑上浏览器打开[https://www.air32.cn/upload/data/jpg/](https://www.air32.cn/upload/data/jpg/),打开对应的测试日期目录,点击具体的测试时间照片,可以查看摄像头拍照上传的照片
-   
-
+
+## 演示功能概述
+
+AirCAMERA_1020是合宙设计生产的一款DVP摄像头配件板;
+
+本demo演示的核心功能为:
+
+Air8101核心板+AirCAMERA_1020配件板,演示DVP摄像头100万像素拍照+http上传照片+电脑浏览器查看照片的功能;
+
+
+## 核心板+配件板资料
+
+[Air8101核心板+配件板相关资料](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air8101/product/file/AirCAMERA_1020/hw_connection.jpg)
+
+![](https://docs.openluat.com/air8101/product/file/AirCAMERA_1020/hw_connection1.jpg)
+
+1、Air8101核心板
+
+2、AirCAMERA_1020配件板(带DVP摄像头,1.8V的开关拨到ON,1.2V和1.5V的开关拨到OFF)
+
+3、Air8101核心板和AirCAMERA_1020配件板的硬件接线方式为
+
+- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端),此种供电方式下,vbat引脚为3.3V,可以直接给AirCAMERA_1020配件板供电;
+
+- 为了演示方便,所以Air8101核心板上电后直接通过vbat引脚给AirCAMERA_1020配件板提供了3.3V的供电;
+
+- 客户在设计实际项目时,一般来说,需要通过一个GPIO来控制LDO给摄像头供电,这样可以灵活地控制摄像头的供电,可以使项目的整体功耗降到最低;
+
+- AirCAMERA_1020配件板设计为了排母的形式,可以参考下表直接插到Air8101核心板的排针上
+
+| Air8101核心板 | AirCAMERA_1020配件板 |
+| ------------ | -------------------- |
+|     vbat     |          VDD         |
+|     gnd      |          GND         |
+|   11/U1RX    |          SDA         |
+|   12/U1TX    |          SCL         |
+|   73/VSY     |          VSY         |
+|    3/HSY     |          HSY         |
+|    69/D7     |           D7         |
+|    2/MCLK    |         MCLK         |
+|     7/D6     |           D6         |
+|     70/D5    |           D5         |
+|    74/PCK    |         PCLK         |
+|     6/D4     |           D4         |
+|     4/D0     |           D0         |
+|    71/D3     |           D3         |
+|    72/D1     |           D1         |
+|     5/D2     |     <font color="red">D2(错印成了D5)</font>    |
+
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air8101 V1003版本固件](https://docs.openluat.com/air8101/luatos/firmware/)(理论上最新版本固件也可以,如果使用最新版本的固件不可以,可以烧录V1003固件对比验证)
+
+
+## 演示操作步骤
+
+1、搭建好演示硬件环境
+
+2、demo脚本代码wifi_app.lua中的wlan.connect("茶室-降功耗,找合宙!", "Air123456", 1),前两个参数,修改为自己测试时wifi热点的名称和密码;注意:仅支持2.4G的wifi,不支持5G的wifi
+
+3、Luatools烧录内核固件和修改后的demo脚本代码
+
+4、烧录成功后,自动开机运行
+
+5、观察Luatools的运行日志,如果输出 http_upload_photo_task_func httpplus.request 200表示测试正常
+
+6、电脑上浏览器打开[https://www.air32.cn/upload/data/jpg/](https://www.air32.cn/upload/data/jpg/),打开对应的测试日期目录,点击具体的测试时间照片,可以查看摄像头拍照上传的照片
+   
+

+ 0 - 0
module/Air8101/project/core_accessory_board/AirCAMERA_1020/wifi_app.lua → module/Air8101/demo/accessory_board/AirCAMERA_1020/wifi_app.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirCAMERA_1030/AirCAMERA_1030.lua → module/Air8101/demo/accessory_board/AirCAMERA_1030/AirCAMERA_1030.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirCAMERA_1030/http_app.lua → module/Air8101/demo/accessory_board/AirCAMERA_1030/http_app.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirCAMERA_1030/main.lua → module/Air8101/demo/accessory_board/AirCAMERA_1030/main.lua


+ 58 - 58
module/Air8101/project/core_accessory_board/AirCAMERA_1030/readme.md → module/Air8101/demo/accessory_board/AirCAMERA_1030/readme.md

@@ -1,58 +1,58 @@
-
-## 演示功能概述
-
-AirCAMERA_1030是合宙设计生产的一款USB摄像头配件板;
-
-本demo演示的核心功能为:
-
-Air8101核心板+AirCAMERA_1030配件板,演示USB摄像头100万像素拍照+http上传照片+电脑浏览器查看照片的功能;
-
-
-## 核心板+配件板资料
-
-[Air8101核心板+配件板相关资料](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
-
-
-## 演示硬件环境
-
-![](https://docs.openluat.com/air8101/product/file/AirCAMERA_1030/hw_connection.jpg)
-
-1、Air8101核心板
-
-2、AirCAMERA_1030配件板(带USB摄像头+数据连接线)
-
-3、Air8101核心板和AirCAMERA_1030配件板的硬件接线方式为
-
-- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端);
-
-- 如果测试发现软件重启,并且日志中出现  poweron reason 0,表示供电不足,此时再通过直流稳压电源对核心板的VIN管脚进行5V供电;
-
-- Air8101核心板上的3.3V和5V拨动开关,拨到5V的一端;为了演示方便,所以Air8101核心板的上电后直接给AirCAMERA_1030配件板提供了供电;
-
-- 客户在设计实际项目时,一般来说,需要通过一个GPIO来控制LDO给摄像头供电,这样可以灵活地控制摄像头的供电,可以使项目的整体功耗降到最低;
-
-- Air8101核心板的USB-A母座和AirCAMERA_1030配件板的USB-A公座相连;
-
-
-## 演示软件环境
-
-1、Luatools下载调试工具
-
-2、[Air8101 V1003版本固件](https://docs.openluat.com/air8101/luatos/firmware/)(理论上最新版本固件也可以,如果使用最新版本的固件不可以,可以烧录V1003固件对比验证)
-
-
-## 演示操作步骤
-
-1、搭建好演示硬件环境
-
-2、demo脚本代码wifi_app.lua中的wlan.connect("茶室-降功耗,找合宙!", "Air123456", 1),前两个参数,修改为自己测试时wifi热点的名称和密码;注意:仅支持2.4G的wifi,不支持5G的wifi
-
-3、Luatools烧录内核固件和修改后的demo脚本代码
-
-4、烧录成功后,自动开机运行
-
-5、观察Luatools的运行日志,如果输出 http_upload_photo_task_func httpplus.request 200表示测试正常
-
-6、电脑上浏览器打开[https://www.air32.cn/upload/data/jpg/](https://www.air32.cn/upload/data/jpg/),打开对应的测试日期目录,点击具体的测试时间照片,可以查看摄像头拍照上传的照片
-   
-
+
+## 演示功能概述
+
+AirCAMERA_1030是合宙设计生产的一款USB摄像头配件板;
+
+本demo演示的核心功能为:
+
+Air8101核心板+AirCAMERA_1030配件板,演示USB摄像头100万像素拍照+http上传照片+电脑浏览器查看照片的功能;
+
+
+## 核心板+配件板资料
+
+[Air8101核心板+配件板相关资料](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air8101/product/file/AirCAMERA_1030/hw_connection.jpg)
+
+1、Air8101核心板
+
+2、AirCAMERA_1030配件板(带USB摄像头+数据连接线)
+
+3、Air8101核心板和AirCAMERA_1030配件板的硬件接线方式为
+
+- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端);
+
+- 如果测试发现软件重启,并且日志中出现  poweron reason 0,表示供电不足,此时再通过直流稳压电源对核心板的VIN管脚进行5V供电;
+
+- Air8101核心板上的3.3V和5V拨动开关,拨到5V的一端;为了演示方便,所以Air8101核心板的上电后直接给AirCAMERA_1030配件板提供了供电;
+
+- 客户在设计实际项目时,一般来说,需要通过一个GPIO来控制LDO给摄像头供电,这样可以灵活地控制摄像头的供电,可以使项目的整体功耗降到最低;
+
+- Air8101核心板的USB-A母座和AirCAMERA_1030配件板的USB-A公座相连;
+
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air8101 V1003版本固件](https://docs.openluat.com/air8101/luatos/firmware/)(理论上最新版本固件也可以,如果使用最新版本的固件不可以,可以烧录V1003固件对比验证)
+
+
+## 演示操作步骤
+
+1、搭建好演示硬件环境
+
+2、demo脚本代码wifi_app.lua中的wlan.connect("茶室-降功耗,找合宙!", "Air123456", 1),前两个参数,修改为自己测试时wifi热点的名称和密码;注意:仅支持2.4G的wifi,不支持5G的wifi
+
+3、Luatools烧录内核固件和修改后的demo脚本代码
+
+4、烧录成功后,自动开机运行
+
+5、观察Luatools的运行日志,如果输出 http_upload_photo_task_func httpplus.request 200表示测试正常
+
+6、电脑上浏览器打开[https://www.air32.cn/upload/data/jpg/](https://www.air32.cn/upload/data/jpg/),打开对应的测试日期目录,点击具体的测试时间照片,可以查看摄像头拍照上传的照片
+   
+

+ 0 - 0
module/Air8101/project/core_accessory_board/AirCAMERA_1030/wifi_app.lua → module/Air8101/demo/accessory_board/AirCAMERA_1030/wifi_app.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirETH_1000/http_app.lua → module/Air8101/demo/accessory_board/AirETH_1000/http_app.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirETH_1000/main.lua → module/Air8101/demo/accessory_board/AirETH_1000/main.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirETH_1000/net_app.lua → module/Air8101/demo/accessory_board/AirETH_1000/net_app.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirETH_1000/readme.md → module/Air8101/demo/accessory_board/AirETH_1000/readme.md


+ 0 - 0
module/Air8101/project/core_accessory_board/AirFONTS_1000/lcd/AirFONTS_1000.lua → module/Air8101/demo/accessory_board/AirFONTS_1000/lcd/AirFONTS_1000.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirFONTS_1000/lcd/AirLCD_1020.lua → module/Air8101/demo/accessory_board/AirFONTS_1000/lcd/AirLCD_1020.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirFONTS_1000/lcd/lcd_vector_font_app.lua → module/Air8101/demo/accessory_board/AirFONTS_1000/lcd/lcd_vector_font_app.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirFONTS_1000/lcd/main.lua → module/Air8101/demo/accessory_board/AirFONTS_1000/lcd/main.lua


+ 125 - 125
module/Air8101/project/core_accessory_board/AirFONTS_1000/lcd/readme.md → module/Air8101/demo/accessory_board/AirFONTS_1000/lcd/readme.md

@@ -1,125 +1,125 @@
-
-## 演示功能概述
-
-AirFONTS_1000是合宙设计生产的一款矢量字体的配件板;
-
-支持GBK中文和ASCII码字符集
-
-支持16到192号的黑体字体
-
-16号到31号,支持4bit灰度显示
-
-32号到64号,支持2bit灰度显示
-
-65号到192号,不支持灰度显示
-
-本demo演示的核心功能为:
-
-Air8101核心板+AirFONTS_1000配件板+AirLCD_1020配件板,演示多种字号和灰度的显示效果;
-
-
-## 核心板+配件板资料
-
-[Air8101核心板+配件板相关资料](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
-
-
-## 演示硬件环境
-
-![](https://docs.openluat.com/air8101/product/file/AirFONTS_1000/hw_connection.jpg)
-
-1、Air8101核心板
-
-2、AirFONTS_1000配件板+6根5cm长的母对母的杜邦线(一定要使用配套的杜邦线,如果杜邦线太长,SPI数据传输不稳定,可能会出现显示花屏的问题)
-
-3、AirLCD_1020配件板+40pin双头线
-
-4、Air8101核心板和AirFONTS_1000配件板、AirLCD_1020配件板的硬件接线方式为
-
-- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端);如果测试发现软件重启,并且日志中出现  poweron reason 0,表示供电不足,此时再通过直流稳压电源对核心板的VIN管脚进行5V供电;
-
-- 为了演示方便,所以Air8101核心板上电后直接通过vbat引脚给AirFONTS_1000配件板提供了3.3V的供电;
-
-- 客户在设计实际项目时,一般来说,需要通过一个GPIO来控制LDO给FONTS芯片供电,这样可以灵活地控制供电,可以使项目的整体功耗降到最低;
-
-- Air8101核心板 和 AirFONTS_1000配件板之间一定要使用配套的5cm长的杜邦线相连,杜邦线太长的话,会出现spi通信不稳定的现象;
-
-
-| Air8101核心板 | AirFONTS_1000配件板|
-| ------------ | ------------------ |
-|     vbat     |         3.3V       |
-|     gnd      |         GND        |
-|   67/GPIO4   |         MOSI       |
-|   8/GPIO5    |         MISO       |
-|   66/GPIO3   |          CS        |
-|   65/GPIO2   |         CLK        |
-
-
-- 为了演示方便,所以Air8101核心板上电后直接通过vbat引脚给AirLCD_1020配件板提供了3.3V的供电;
-
-- 客户在设计实际项目时,一般来说,需要通过一个GPIO来控制LDO给LCD和TP供电,这样可以灵活地控制供电,可以使项目的整体功耗降到最低;
-
-- 核心板和配件板之间配备了双排40PIN的双头线,可以参考下表很方便地连接双方各自的40个管脚,插入或者拔出双头线时,要慢慢的操作,防止将排针折弯;
-
-| Air8101核心板 | AirLCD_1020配件板 |
-| ------------ | ------------------ |
-|     gnd      |         GND        |
-|     vbat     |         VCC        |
-|    42/R0     |        RGB_R0      |
-|    40/R1     |        RGB_R1      |
-|    43/R2     |        RGB_R2      |
-|    39/R3     |        RGB_R3      |
-|    44/R4     |        RGB_R4      |
-|    38/R5     |        RGB_R5      |
-|    45/R6     |        RGB_R6      |
-|    37/R7     |        RGB_R7      |
-|    46/G0     |        RGB_G0      |
-|    36/G1     |        RGB_G1      |
-|    47/G2     |        RGB_G2      |
-|    35/G3     |        RGB_G3      |
-|    48/G4     |        RGB_G4      |
-|    34/G5     |        RGB_G5      |
-|    49/G6     |        RGB_G6      |
-|    33/G7     |        RGB_G7      |
-|    50/B0     |        RGB_B0      |
-|    32/B1     |        RGB_B1      |
-|    51/B2     |        RGB_B2      |
-|    31/B3     |        RGB_B3      |
-|    52/B4     |        RGB_B4      |
-|    30/B5     |        RGB_B5      |
-|    53/B6     |        RGB_B6      |
-|    29/B7     |        RGB_B7      |
-|   28/DCLK    |       RGB_DCLK     |
-|   54/DISP    |       RGB_DISP     |
-|   55/HSYN    |       RGB_HSYNC    |
-|   56/VSYN    |       RGB_VSYNC    |
-|    57/DE     |        RGB_DE      |
-|   14/GPIO8   |        LCD_BL      |
-|   13/GPIO9   |        LCD_RST     |
-|    8/GPIO5   |        LCD_SDI     |
-|    9/GPIO6   |        LCD_SCL     |
-|  68/GPIO12   |        LCD_CS      |
-|  75/GPIO28   |        TP_RST      |
-|   10/GPIO7   |        TP_INT      |
-|   12/U1TX    |        TP_SCL      |
-|   11/U1RX    |        TP_SDA      |
-
-
-## 演示软件环境
-
-1、Luatools下载调试工具
-
-2、[目前还没有正式固件,只有临时内测固件,联系合宙销售同事获取](https://docs.openluat.com/air8101/luatos/firmware/)
-
-## 演示操作步骤
-
-1、搭建好演示硬件环境
-
-2、不需要修改demo脚本代码
-
-3、Luatools烧录内核固件和demo脚本代码
-
-4、烧录成功后,自动开机运行
-
-   (1) ;
-   
-
+
+## 演示功能概述
+
+AirFONTS_1000是合宙设计生产的一款矢量字体的配件板;
+
+支持GBK中文和ASCII码字符集
+
+支持16到192号的黑体字体
+
+16号到31号,支持4bit灰度显示
+
+32号到64号,支持2bit灰度显示
+
+65号到192号,不支持灰度显示
+
+本demo演示的核心功能为:
+
+Air8101核心板+AirFONTS_1000配件板+AirLCD_1020配件板,演示多种字号和灰度的显示效果;
+
+
+## 核心板+配件板资料
+
+[Air8101核心板+配件板相关资料](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air8101/product/file/AirFONTS_1000/hw_connection.jpg)
+
+1、Air8101核心板
+
+2、AirFONTS_1000配件板+6根5cm长的母对母的杜邦线(一定要使用配套的杜邦线,如果杜邦线太长,SPI数据传输不稳定,可能会出现显示花屏的问题)
+
+3、AirLCD_1020配件板+40pin双头线
+
+4、Air8101核心板和AirFONTS_1000配件板、AirLCD_1020配件板的硬件接线方式为
+
+- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端);如果测试发现软件重启,并且日志中出现  poweron reason 0,表示供电不足,此时再通过直流稳压电源对核心板的VIN管脚进行5V供电;
+
+- 为了演示方便,所以Air8101核心板上电后直接通过vbat引脚给AirFONTS_1000配件板提供了3.3V的供电;
+
+- 客户在设计实际项目时,一般来说,需要通过一个GPIO来控制LDO给FONTS芯片供电,这样可以灵活地控制供电,可以使项目的整体功耗降到最低;
+
+- Air8101核心板 和 AirFONTS_1000配件板之间一定要使用配套的5cm长的杜邦线相连,杜邦线太长的话,会出现spi通信不稳定的现象;
+
+
+| Air8101核心板 | AirFONTS_1000配件板|
+| ------------ | ------------------ |
+|     vbat     |         3.3V       |
+|     gnd      |         GND        |
+|   67/GPIO4   |         MOSI       |
+|   8/GPIO5    |         MISO       |
+|   66/GPIO3   |          CS        |
+|   65/GPIO2   |         CLK        |
+
+
+- 为了演示方便,所以Air8101核心板上电后直接通过vbat引脚给AirLCD_1020配件板提供了3.3V的供电;
+
+- 客户在设计实际项目时,一般来说,需要通过一个GPIO来控制LDO给LCD和TP供电,这样可以灵活地控制供电,可以使项目的整体功耗降到最低;
+
+- 核心板和配件板之间配备了双排40PIN的双头线,可以参考下表很方便地连接双方各自的40个管脚,插入或者拔出双头线时,要慢慢的操作,防止将排针折弯;
+
+| Air8101核心板 | AirLCD_1020配件板 |
+| ------------ | ------------------ |
+|     gnd      |         GND        |
+|     vbat     |         VCC        |
+|    42/R0     |        RGB_R0      |
+|    40/R1     |        RGB_R1      |
+|    43/R2     |        RGB_R2      |
+|    39/R3     |        RGB_R3      |
+|    44/R4     |        RGB_R4      |
+|    38/R5     |        RGB_R5      |
+|    45/R6     |        RGB_R6      |
+|    37/R7     |        RGB_R7      |
+|    46/G0     |        RGB_G0      |
+|    36/G1     |        RGB_G1      |
+|    47/G2     |        RGB_G2      |
+|    35/G3     |        RGB_G3      |
+|    48/G4     |        RGB_G4      |
+|    34/G5     |        RGB_G5      |
+|    49/G6     |        RGB_G6      |
+|    33/G7     |        RGB_G7      |
+|    50/B0     |        RGB_B0      |
+|    32/B1     |        RGB_B1      |
+|    51/B2     |        RGB_B2      |
+|    31/B3     |        RGB_B3      |
+|    52/B4     |        RGB_B4      |
+|    30/B5     |        RGB_B5      |
+|    53/B6     |        RGB_B6      |
+|    29/B7     |        RGB_B7      |
+|   28/DCLK    |       RGB_DCLK     |
+|   54/DISP    |       RGB_DISP     |
+|   55/HSYN    |       RGB_HSYNC    |
+|   56/VSYN    |       RGB_VSYNC    |
+|    57/DE     |        RGB_DE      |
+|   14/GPIO8   |        LCD_BL      |
+|   13/GPIO9   |        LCD_RST     |
+|    8/GPIO5   |        LCD_SDI     |
+|    9/GPIO6   |        LCD_SCL     |
+|  68/GPIO12   |        LCD_CS      |
+|  75/GPIO28   |        TP_RST      |
+|   10/GPIO7   |        TP_INT      |
+|   12/U1TX    |        TP_SCL      |
+|   11/U1RX    |        TP_SDA      |
+
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[目前还没有正式固件,只有临时内测固件,联系合宙销售同事获取](https://docs.openluat.com/air8101/luatos/firmware/)
+
+## 演示操作步骤
+
+1、搭建好演示硬件环境
+
+2、不需要修改demo脚本代码
+
+3、Luatools烧录内核固件和demo脚本代码
+
+4、烧录成功后,自动开机运行
+
+   (1) ;
+   
+

+ 0 - 0
module/Air8101/project/core_accessory_board/AirFONTS_1000/lvgl/AirFONTS_1000.lua → module/Air8101/demo/accessory_board/AirFONTS_1000/lvgl/AirFONTS_1000.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirFONTS_1000/lvgl/AirLCD_1020.lua → module/Air8101/demo/accessory_board/AirFONTS_1000/lvgl/AirLCD_1020.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirFONTS_1000/lvgl/lcd_vector_font_app.lua → module/Air8101/demo/accessory_board/AirFONTS_1000/lvgl/lcd_vector_font_app.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirFONTS_1000/lvgl/main.lua → module/Air8101/demo/accessory_board/AirFONTS_1000/lvgl/main.lua


+ 121 - 121
module/Air8101/project/core_accessory_board/AirFONTS_1000/lvgl/readme.md → module/Air8101/demo/accessory_board/AirFONTS_1000/lvgl/readme.md

@@ -1,121 +1,121 @@
-
-## 演示功能概述
-
-AirFONTS_1000是合宙设计生产的一款矢量字体的配件板;
-
-支持GBK中文和ASCII码字符集
-
-支持16到192号的黑体字体,支持灰度显示
-
-本demo演示的核心功能为:
-
-Air8101核心板+AirFONTS_1000配件板+AirLCD_1020配件板,演示多种字号和灰度的显示效果;
-
-
-## 核心板+配件板资料
-
-[Air8101核心板+配件板相关资料](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
-
-
-## 演示硬件环境
-
-![](https://docs.openluat.com/air8101/product/file/AirFONTS_1000/hw_connection.jpg)
-
-1、Air8101核心板
-
-2、AirFONTS_1000配件板+6根5cm长的母对母的杜邦线(一定要使用配套的杜邦线,如果杜邦线太长,SPI数据传输不稳定,可能会出现显示花屏的问题)
-
-3、AirLCD_1020配件板+40pin双头线
-
-4、Air8101核心板和AirFONTS_1000配件板、AirLCD_1020配件板的硬件接线方式为
-
-- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端);如果测试发现软件重启,并且日志中出现  poweron reason 0,表示供电不足,此时再通过直流稳压电源对核心板的VIN管脚进行5V供电;
-
-- 为了演示方便,所以Air8101核心板上电后直接通过vbat引脚给AirFONTS_1000配件板提供了3.3V的供电;
-
-- 客户在设计实际项目时,一般来说,需要通过一个GPIO来控制LDO给FONTS芯片供电,这样可以灵活地控制供电,可以使项目的整体功耗降到最低;
-
-- Air8101核心板 和 AirFONTS_1000配件板之间一定要使用配套的5cm长的杜邦线相连,杜邦线太长的话,会出现spi通信不稳定的现象;
-
-
-| Air8101核心板 | AirFONTS_1000配件板|
-| ------------ | ------------------ |
-|     vbat     |         3.3V       |
-|     gnd      |         GND        |
-|   67/GPIO4   |         MOSI       |
-|   8/GPIO5    |         MISO       |
-|   66/GPIO3   |          CS        |
-|   65/GPIO2   |         CLK        |
-
-
-- 为了演示方便,所以Air8101核心板上电后直接通过vbat引脚给AirLCD_1020配件板提供了3.3V的供电;
-
-- 客户在设计实际项目时,一般来说,需要通过一个GPIO来控制LDO给LCD和TP供电,这样可以灵活地控制供电,可以使项目的整体功耗降到最低;
-
-- 核心板和配件板之间配备了双排40PIN的双头线,可以参考下表很方便地连接双方各自的40个管脚,插入或者拔出双头线时,要慢慢的操作,防止将排针折弯;
-
-| Air8101核心板 | AirLCD_1020配件板 |
-| ------------ | ------------------ |
-|     gnd      |         GND        |
-|     vbat     |         VCC        |
-|    42/R0     |        RGB_R0      |
-|    40/R1     |        RGB_R1      |
-|    43/R2     |        RGB_R2      |
-|    39/R3     |        RGB_R3      |
-|    44/R4     |        RGB_R4      |
-|    38/R5     |        RGB_R5      |
-|    45/R6     |        RGB_R6      |
-|    37/R7     |        RGB_R7      |
-|    46/G0     |        RGB_G0      |
-|    36/G1     |        RGB_G1      |
-|    47/G2     |        RGB_G2      |
-|    35/G3     |        RGB_G3      |
-|    48/G4     |        RGB_G4      |
-|    34/G5     |        RGB_G5      |
-|    49/G6     |        RGB_G6      |
-|    33/G7     |        RGB_G7      |
-|    50/B0     |        RGB_B0      |
-|    32/B1     |        RGB_B1      |
-|    51/B2     |        RGB_B2      |
-|    31/B3     |        RGB_B3      |
-|    52/B4     |        RGB_B4      |
-|    30/B5     |        RGB_B5      |
-|    53/B6     |        RGB_B6      |
-|    29/B7     |        RGB_B7      |
-|   28/DCLK    |       RGB_DCLK     |
-|   54/DISP    |       RGB_DISP     |
-|   55/HSYN    |       RGB_HSYNC    |
-|   56/VSYN    |       RGB_VSYNC    |
-|    57/DE     |        RGB_DE      |
-|   14/GPIO8   |        LCD_BL      |
-|   13/GPIO9   |        LCD_RST     |
-|    8/GPIO5   |        LCD_SDI     |
-|    9/GPIO6   |        LCD_SCL     |
-|  68/GPIO12   |        LCD_CS      |
-|  75/GPIO28   |        TP_RST      |
-|   10/GPIO7   |        TP_INT      |
-|   12/U1TX    |        TP_SCL      |
-|   11/U1RX    |        TP_SDA      |
-
-
-## 演示软件环境
-
-1、Luatools下载调试工具
-
-2、[目前还没有正式固件,只有临时内测固件,联系合宙销售同事获取](https://docs.openluat.com/air8101/luatos/firmware/)
-
-## 演示操作步骤
-
-1、搭建好演示硬件环境
-
-2、不需要修改demo脚本代码
-
-3、Luatools烧录内核固件和demo脚本代码
-
-4、烧录成功后,自动开机运行
-
-   (1) 开机后会显示一个标签和一个按钮,标签上显示的内容为“16号字体”,颜色为黑色;按钮上显示的内容为“点我”;
-
-   (2) 点击一次“点我”按钮,标签上显示的内容和颜色发生变化,显示的内容中的数字依次加一,在16和32之间循环;显示的颜色在黑色,红色,绿色,蓝色之间循环;
-   
-
+
+## 演示功能概述
+
+AirFONTS_1000是合宙设计生产的一款矢量字体的配件板;
+
+支持GBK中文和ASCII码字符集
+
+支持16到192号的黑体字体,支持灰度显示
+
+本demo演示的核心功能为:
+
+Air8101核心板+AirFONTS_1000配件板+AirLCD_1020配件板,演示多种字号和灰度的显示效果;
+
+
+## 核心板+配件板资料
+
+[Air8101核心板+配件板相关资料](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air8101/product/file/AirFONTS_1000/hw_connection.jpg)
+
+1、Air8101核心板
+
+2、AirFONTS_1000配件板+6根5cm长的母对母的杜邦线(一定要使用配套的杜邦线,如果杜邦线太长,SPI数据传输不稳定,可能会出现显示花屏的问题)
+
+3、AirLCD_1020配件板+40pin双头线
+
+4、Air8101核心板和AirFONTS_1000配件板、AirLCD_1020配件板的硬件接线方式为
+
+- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端);如果测试发现软件重启,并且日志中出现  poweron reason 0,表示供电不足,此时再通过直流稳压电源对核心板的VIN管脚进行5V供电;
+
+- 为了演示方便,所以Air8101核心板上电后直接通过vbat引脚给AirFONTS_1000配件板提供了3.3V的供电;
+
+- 客户在设计实际项目时,一般来说,需要通过一个GPIO来控制LDO给FONTS芯片供电,这样可以灵活地控制供电,可以使项目的整体功耗降到最低;
+
+- Air8101核心板 和 AirFONTS_1000配件板之间一定要使用配套的5cm长的杜邦线相连,杜邦线太长的话,会出现spi通信不稳定的现象;
+
+
+| Air8101核心板 | AirFONTS_1000配件板|
+| ------------ | ------------------ |
+|     vbat     |         3.3V       |
+|     gnd      |         GND        |
+|   67/GPIO4   |         MOSI       |
+|   8/GPIO5    |         MISO       |
+|   66/GPIO3   |          CS        |
+|   65/GPIO2   |         CLK        |
+
+
+- 为了演示方便,所以Air8101核心板上电后直接通过vbat引脚给AirLCD_1020配件板提供了3.3V的供电;
+
+- 客户在设计实际项目时,一般来说,需要通过一个GPIO来控制LDO给LCD和TP供电,这样可以灵活地控制供电,可以使项目的整体功耗降到最低;
+
+- 核心板和配件板之间配备了双排40PIN的双头线,可以参考下表很方便地连接双方各自的40个管脚,插入或者拔出双头线时,要慢慢的操作,防止将排针折弯;
+
+| Air8101核心板 | AirLCD_1020配件板 |
+| ------------ | ------------------ |
+|     gnd      |         GND        |
+|     vbat     |         VCC        |
+|    42/R0     |        RGB_R0      |
+|    40/R1     |        RGB_R1      |
+|    43/R2     |        RGB_R2      |
+|    39/R3     |        RGB_R3      |
+|    44/R4     |        RGB_R4      |
+|    38/R5     |        RGB_R5      |
+|    45/R6     |        RGB_R6      |
+|    37/R7     |        RGB_R7      |
+|    46/G0     |        RGB_G0      |
+|    36/G1     |        RGB_G1      |
+|    47/G2     |        RGB_G2      |
+|    35/G3     |        RGB_G3      |
+|    48/G4     |        RGB_G4      |
+|    34/G5     |        RGB_G5      |
+|    49/G6     |        RGB_G6      |
+|    33/G7     |        RGB_G7      |
+|    50/B0     |        RGB_B0      |
+|    32/B1     |        RGB_B1      |
+|    51/B2     |        RGB_B2      |
+|    31/B3     |        RGB_B3      |
+|    52/B4     |        RGB_B4      |
+|    30/B5     |        RGB_B5      |
+|    53/B6     |        RGB_B6      |
+|    29/B7     |        RGB_B7      |
+|   28/DCLK    |       RGB_DCLK     |
+|   54/DISP    |       RGB_DISP     |
+|   55/HSYN    |       RGB_HSYNC    |
+|   56/VSYN    |       RGB_VSYNC    |
+|    57/DE     |        RGB_DE      |
+|   14/GPIO8   |        LCD_BL      |
+|   13/GPIO9   |        LCD_RST     |
+|    8/GPIO5   |        LCD_SDI     |
+|    9/GPIO6   |        LCD_SCL     |
+|  68/GPIO12   |        LCD_CS      |
+|  75/GPIO28   |        TP_RST      |
+|   10/GPIO7   |        TP_INT      |
+|   12/U1TX    |        TP_SCL      |
+|   11/U1RX    |        TP_SDA      |
+
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[目前还没有正式固件,只有临时内测固件,联系合宙销售同事获取](https://docs.openluat.com/air8101/luatos/firmware/)
+
+## 演示操作步骤
+
+1、搭建好演示硬件环境
+
+2、不需要修改demo脚本代码
+
+3、Luatools烧录内核固件和demo脚本代码
+
+4、烧录成功后,自动开机运行
+
+   (1) 开机后会显示一个标签和一个按钮,标签上显示的内容为“16号字体”,颜色为黑色;按钮上显示的内容为“点我”;
+
+   (2) 点击一次“点我”按钮,标签上显示的内容和颜色发生变化,显示的内容中的数字依次加一,在16和32之间循环;显示的颜色在黑色,红色,绿色,蓝色之间循环;
+   
+

+ 0 - 0
module/Air8101/project/core_accessory_board/AirGPIO_1000/AirGPIO_1000.lua → module/Air8101/demo/accessory_board/AirGPIO_1000/AirGPIO_1000.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirGPIO_1000/gpio_app.lua → module/Air8101/demo/accessory_board/AirGPIO_1000/gpio_app.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirGPIO_1000/main.lua → module/Air8101/demo/accessory_board/AirGPIO_1000/main.lua


+ 74 - 74
module/Air8101/project/core_accessory_board/AirGPIO_1000/readme.md → module/Air8101/demo/accessory_board/AirGPIO_1000/readme.md

@@ -1,74 +1,74 @@
-
-## 演示功能概述
-
-AirGPIO_1000是合宙设计生产的一款I2C转16路扩展GPIO的配件板;
-
-本demo演示的核心功能为:
-
-Air8101核心板+AirGPIO_1000配件板,演示I2C扩展16路GPIO功能;
-
-分输出、输入和中断三种应用场景来演示;
-
-
-## 核心板+配件板资料
-
-[Air8101核心板+配件板相关资料](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
-
-
-## 演示硬件环境
-
-![](https://docs.openluat.com/air8101/product/file/AirGPIO_1000/hw_connection.jpg)
-
-1、Air8101核心板
-
-2、AirGPIO_1000配件板
-
-3、母对母的杜邦线8根
-
-4、Air8101核心板和AirGPIO_1000配件板的硬件接线方式为
-
-- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端),此种供电方式下,vbat引脚为3.3V,可以直接给AirGPIO_1000配件板供电;
-
-- 为了演示方便,所以Air8101核心板上电后直接通过vbat引脚给AirGPIO_1000配件板提供了3.3V的供电;
-
-- 客户在设计实际项目时,一般来说,需要通过一个GPIO来控制LDO给配件板供电,这样可以灵活地控制配件板的供电,可以使项目的整体功耗降到最低;
-
-| Air8101核心板 | AirGPIO_1000配件板 |
-| ------------ | ------------------ |
-|     vbat     |         3V3        |
-|     gnd      |         GND        |
-|    38/R5     |         SDA        |
-|    45/R6     |         SCL        |
-|   65/GPIO2   |         INT        |
-
-- 扩展GPIO输出演示时,无需接线;通过万用表或者示波器检测AirGPIO_1000配件板上的P00电平即可
-
-- 扩展GPIO输入演示时,将AirGPIO_1000配件板上的P10和P11两个引脚通过杜邦线短接;软件上会将P10配置为输出(第一秒输出低电平,第二秒输出高电平,如此循环输出),将P11配置为输入,通过检测P11引脚输入电平的状态来演示
-
-- 扩展GPIO中断演示时,将AirGPIO_1000配件板上的P03和P04两个引脚通过杜邦线短接,将AirGPIO_1000配件板上的P13和P14两个引脚通过杜邦线短接;软件上会将P03和P13配置为输出(第一秒输出低电平,第二秒输出高电平,如此循环输出),将P04和P14配置为中断,通过检测中断函数的触发状态来演示
-
-
-## 演示软件环境
-
-1、Luatools下载调试工具
-
-2、[Air8101最新版本的内核固件](https://docs.openluat.com/air8101/luatos/firmware/)
-
-
-## 演示操作步骤
-
-1、搭建好演示硬件环境
-
-2、不需要修改demo脚本代码
-
-3、Luatools烧录内核固件和demo脚本代码
-
-4、烧录成功后,自动开机运行
-
-   (1) 通过万用表或者示波器检测AirGPIO_1000配件板上的P00电平,持续1秒输出0V的低电平,持续1秒输出3.3V的高电平,循环输出,表示GPIO输出测试正常;
-
-   (2) 通过观察Luatools的运行日志,首先打印 air_gpio.get(0x11) 0, 再隔一秒打印 air_gpio.get(0x11) 1,再隔一秒打印 air_gpio.get(0x11) 0,如此循环输出,表示GPIO输入测试正常;
-
-   (3) 通过观察Luatools的运行日志,首先打印 P04_int_cbfunc 4 0      P14_int_cbfunc 20 0, 再隔一秒打印  P04_int_cbfunc 4 1      P14_int_cbfunc 20 1,再隔一秒打印 P04_int_cbfunc 4 0      P14_int_cbfunc 20 0,如此循环输出,表示GPIO中断测试正常;
-   
-
+
+## 演示功能概述
+
+AirGPIO_1000是合宙设计生产的一款I2C转16路扩展GPIO的配件板;
+
+本demo演示的核心功能为:
+
+Air8101核心板+AirGPIO_1000配件板,演示I2C扩展16路GPIO功能;
+
+分输出、输入和中断三种应用场景来演示;
+
+
+## 核心板+配件板资料
+
+[Air8101核心板+配件板相关资料](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air8101/product/file/AirGPIO_1000/hw_connection.jpg)
+
+1、Air8101核心板
+
+2、AirGPIO_1000配件板
+
+3、母对母的杜邦线8根
+
+4、Air8101核心板和AirGPIO_1000配件板的硬件接线方式为
+
+- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端),此种供电方式下,vbat引脚为3.3V,可以直接给AirGPIO_1000配件板供电;
+
+- 为了演示方便,所以Air8101核心板上电后直接通过vbat引脚给AirGPIO_1000配件板提供了3.3V的供电;
+
+- 客户在设计实际项目时,一般来说,需要通过一个GPIO来控制LDO给配件板供电,这样可以灵活地控制配件板的供电,可以使项目的整体功耗降到最低;
+
+| Air8101核心板 | AirGPIO_1000配件板 |
+| ------------ | ------------------ |
+|     vbat     |         3V3        |
+|     gnd      |         GND        |
+|    38/R5     |         SDA        |
+|    45/R6     |         SCL        |
+|   65/GPIO2   |         INT        |
+
+- 扩展GPIO输出演示时,无需接线;通过万用表或者示波器检测AirGPIO_1000配件板上的P00电平即可
+
+- 扩展GPIO输入演示时,将AirGPIO_1000配件板上的P10和P11两个引脚通过杜邦线短接;软件上会将P10配置为输出(第一秒输出低电平,第二秒输出高电平,如此循环输出),将P11配置为输入,通过检测P11引脚输入电平的状态来演示
+
+- 扩展GPIO中断演示时,将AirGPIO_1000配件板上的P03和P04两个引脚通过杜邦线短接,将AirGPIO_1000配件板上的P13和P14两个引脚通过杜邦线短接;软件上会将P03和P13配置为输出(第一秒输出低电平,第二秒输出高电平,如此循环输出),将P04和P14配置为中断,通过检测中断函数的触发状态来演示
+
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air8101最新版本的内核固件](https://docs.openluat.com/air8101/luatos/firmware/)
+
+
+## 演示操作步骤
+
+1、搭建好演示硬件环境
+
+2、不需要修改demo脚本代码
+
+3、Luatools烧录内核固件和demo脚本代码
+
+4、烧录成功后,自动开机运行
+
+   (1) 通过万用表或者示波器检测AirGPIO_1000配件板上的P00电平,持续1秒输出0V的低电平,持续1秒输出3.3V的高电平,循环输出,表示GPIO输出测试正常;
+
+   (2) 通过观察Luatools的运行日志,首先打印 air_gpio.get(0x11) 0, 再隔一秒打印 air_gpio.get(0x11) 1,再隔一秒打印 air_gpio.get(0x11) 0,如此循环输出,表示GPIO输入测试正常;
+
+   (3) 通过观察Luatools的运行日志,首先打印 P04_int_cbfunc 4 0      P14_int_cbfunc 20 0, 再隔一秒打印  P04_int_cbfunc 4 1      P14_int_cbfunc 20 1,再隔一秒打印 P04_int_cbfunc 4 0      P14_int_cbfunc 20 0,如此循环输出,表示GPIO中断测试正常;
+   
+

+ 0 - 0
module/Air8101/project/core_accessory_board/AirKEY_1000/AirKEY_1000.lua → module/Air8101/demo/accessory_board/AirKEY_1000/AirKEY_1000.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirKEY_1000/key_app.lua → module/Air8101/demo/accessory_board/AirKEY_1000/key_app.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirKEY_1000/main.lua → module/Air8101/demo/accessory_board/AirKEY_1000/main.lua


+ 76 - 76
module/Air8101/project/core_accessory_board/AirKEY_1000/readme.md → module/Air8101/demo/accessory_board/AirKEY_1000/readme.md

@@ -1,76 +1,76 @@
-
-## 演示功能概述
-
-AirKEY_1000是合宙设计生产的一款支持8个独立按键的配件板;
-
-本demo演示的核心功能为:
-
-Air8101核心板+AirKEY_1000配件板,使用Air8101核心板的GPIO中断检测AirKEY_1000配件板上8个独立按键的按下或者弹起状态;
-
-
-## 核心板+配件板资料
-
-[Air8101核心板+配件板相关资料](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
-
-
-## 演示硬件环境
-
-![](https://docs.openluat.com/air8101/product/file/AirKEY_1000/hw_connection.jpg)
-
-1、Air8101核心板
-
-2、AirKEY_1000配件板
-
-3、母对母的杜邦线9根
-
-4、Air8101核心板和AirKEY_1000配件板的硬件接线方式为
-
-- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端)
-
-| Air8101核心板 |  AirKEY_1000配件板 |
-| ------------ | ------------------ |
-|     40/R1    |         K1         |
-|     39/R3    |         K2         |
-|     38/R5    |         K3         |
-|     37/R7    |         K4         |
-|     36/G1    |         K5         |
-|     35/G3    |         K6         |
-|     34/G5    |         K7         |
-|     33/G7    |         K8         |
-|     gnd      |         G          |
-
-
-## 演示软件环境
-
-1、[最新版本的内核固件](https://docs.openluat.com/air8101/luatos/firmware/)
-
-2、Luatools下载调试工具
-
-
-## 演示操作步骤
-
-1、搭建好演示硬件环境
-
-2、不需要修改demo脚本代码
-
-3、Luatools烧录内核固件和demo脚本代码
-
-4、烧录成功后,自动开机运行
-
-   (1) 按键1弹起时,Luatools的运行日志输出 key1_int_cbfunc pressup,表示按键1测试正常;
-
-   (1) 按键2弹起时,Luatools的运行日志输出 key2_int_cbfunc pressup,表示按键2测试正常;
-
-   (1) 按键3弹起时,Luatools的运行日志输出 key3_int_cbfunc pressup,表示按键3测试正常;
-
-   (1) 按键4弹起时,Luatools的运行日志输出 key4_int_cbfunc pressup,表示按键4测试正常;
-
-   (1) 按键5按下时,Luatools的运行日志输出 key5 pressdown,表示按键5测试正常;
-
-   (1) 按键6按下时,Luatools的运行日志输出 key6 pressdown,表示按键6测试正常;
-
-   (1) 按键7按下时,Luatools的运行日志输出 key7 pressdown,表示按键7测试正常;
-
-   (1) 按键8按下时,Luatools的运行日志输出 key8 pressdown,表示按键8测试正常;
-   
-
+
+## 演示功能概述
+
+AirKEY_1000是合宙设计生产的一款支持8个独立按键的配件板;
+
+本demo演示的核心功能为:
+
+Air8101核心板+AirKEY_1000配件板,使用Air8101核心板的GPIO中断检测AirKEY_1000配件板上8个独立按键的按下或者弹起状态;
+
+
+## 核心板+配件板资料
+
+[Air8101核心板+配件板相关资料](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air8101/product/file/AirKEY_1000/hw_connection.jpg)
+
+1、Air8101核心板
+
+2、AirKEY_1000配件板
+
+3、母对母的杜邦线9根
+
+4、Air8101核心板和AirKEY_1000配件板的硬件接线方式为
+
+- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端)
+
+| Air8101核心板 |  AirKEY_1000配件板 |
+| ------------ | ------------------ |
+|     40/R1    |         K1         |
+|     39/R3    |         K2         |
+|     38/R5    |         K3         |
+|     37/R7    |         K4         |
+|     36/G1    |         K5         |
+|     35/G3    |         K6         |
+|     34/G5    |         K7         |
+|     33/G7    |         K8         |
+|     gnd      |         G          |
+
+
+## 演示软件环境
+
+1、[最新版本的内核固件](https://docs.openluat.com/air8101/luatos/firmware/)
+
+2、Luatools下载调试工具
+
+
+## 演示操作步骤
+
+1、搭建好演示硬件环境
+
+2、不需要修改demo脚本代码
+
+3、Luatools烧录内核固件和demo脚本代码
+
+4、烧录成功后,自动开机运行
+
+   (1) 按键1弹起时,Luatools的运行日志输出 key1_int_cbfunc pressup,表示按键1测试正常;
+
+   (1) 按键2弹起时,Luatools的运行日志输出 key2_int_cbfunc pressup,表示按键2测试正常;
+
+   (1) 按键3弹起时,Luatools的运行日志输出 key3_int_cbfunc pressup,表示按键3测试正常;
+
+   (1) 按键4弹起时,Luatools的运行日志输出 key4_int_cbfunc pressup,表示按键4测试正常;
+
+   (1) 按键5按下时,Luatools的运行日志输出 key5 pressdown,表示按键5测试正常;
+
+   (1) 按键6按下时,Luatools的运行日志输出 key6 pressdown,表示按键6测试正常;
+
+   (1) 按键7按下时,Luatools的运行日志输出 key7 pressdown,表示按键7测试正常;
+
+   (1) 按键8按下时,Luatools的运行日志输出 key8 pressdown,表示按键8测试正常;
+   
+

+ 0 - 0
module/Air8101/project/core_accessory_board/AirLCD_1020/lcd/AirLCD_1020.lua → module/Air8101/demo/accessory_board/AirLCD_1020/lcd/AirLCD_1020.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirLCD_1020/lcd/bird.jpg → module/Air8101/demo/accessory_board/AirLCD_1020/lcd/bird.jpg


+ 0 - 0
module/Air8101/project/core_accessory_board/AirLCD_1020/lcd/introduction.jpg → module/Air8101/demo/accessory_board/AirLCD_1020/lcd/introduction.jpg


+ 0 - 0
module/Air8101/project/core_accessory_board/AirLCD_1020/lcd/lcd_app.lua → module/Air8101/demo/accessory_board/AirLCD_1020/lcd/lcd_app.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirLCD_1020/lcd/lcd_jpg_fps.lua → module/Air8101/demo/accessory_board/AirLCD_1020/lcd/lcd_jpg_fps.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirLCD_1020/lcd/main.lua → module/Air8101/demo/accessory_board/AirLCD_1020/lcd/main.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirLCD_1020/lcd/pins_Air8101.json → module/Air8101/demo/accessory_board/AirLCD_1020/lcd/pins_Air8101.json


+ 105 - 105
module/Air8101/project/core_accessory_board/AirLCD_1020/lcd/readme.md → module/Air8101/demo/accessory_board/AirLCD_1020/lcd/readme.md

@@ -1,105 +1,105 @@
-
-## 演示功能概述
-
-AirLCD_1020是合宙设计生产的一款5寸RGB888接口800*480分辨率的电容触摸显示屏配件板
-
-本demo演示的核心功能为:
-
-Air8101核心板+AirLCD_1020配件板,使用lcd图形库函数演示UI显示和触摸功能;
-
-
-## 核心板+配件板资料
-
-[Air8101核心板+配件板相关资料](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
-
-
-## 演示硬件环境
-
-![](https://docs.openluat.com/air8101/product/file/AirLCD_1020/hw_connection.jpg)
-
-1、Air8101核心板
-
-2、AirLCD_1020配件板
-
-3、双排40PIN的双头线
-
-4、Air8101核心板和AirGPIO_1000配件板的硬件接线方式为
-
-- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端);如果测试发现软件重启,并且日志中出现  poweron reason 0,表示供电不足,此时再通过直流稳压电源对核心板的VIN管脚进行5V供电;
-
-- 为了演示方便,所以Air8101核心板上电后直接通过vbat引脚给AirLCD_1020配件板提供了3.3V的供电;
-
-- 客户在设计实际项目时,一般来说,需要通过一个GPIO来控制LDO给LCD和TP供电,这样可以灵活地控制供电,可以使项目的整体功耗降到最低;
-
-- 核心板和配件板之间配备了双排40PIN的双头线,可以参考下表很方便地连接双方各自的40个管脚,插入或者拔出双头线时,要慢慢的操作,防止将排针折弯;
-
-| Air8101核心板 | AirLCD_1020配件板 |
-| ------------ | ------------------ |
-|     gnd      |         GND        |
-|     vbat     |         VCC        |
-|    42/R0     |        RGB_R0      |
-|    40/R1     |        RGB_R1      |
-|    43/R2     |        RGB_R2      |
-|    39/R3     |        RGB_R3      |
-|    44/R4     |        RGB_R4      |
-|    38/R5     |        RGB_R5      |
-|    45/R6     |        RGB_R6      |
-|    37/R7     |        RGB_R7      |
-|    46/G0     |        RGB_G0      |
-|    36/G1     |        RGB_G1      |
-|    47/G2     |        RGB_G2      |
-|    35/G3     |        RGB_G3      |
-|    48/G4     |        RGB_G4      |
-|    34/G5     |        RGB_G5      |
-|    49/G6     |        RGB_G6      |
-|    33/G7     |        RGB_G7      |
-|    50/B0     |        RGB_B0      |
-|    32/B1     |        RGB_B1      |
-|    51/B2     |        RGB_B2      |
-|    31/B3     |        RGB_B3      |
-|    52/B4     |        RGB_B4      |
-|    30/B5     |        RGB_B5      |
-|    53/B6     |        RGB_B6      |
-|    29/B7     |        RGB_B7      |
-|   28/DCLK    |       RGB_DCLK     |
-|   54/DISP    |       RGB_DISP     |
-|   55/HSYN    |       RGB_HSYNC    |
-|   56/VSYN    |       RGB_VSYNC    |
-|    57/DE     |        RGB_DE      |
-|   14/GPIO8   |        LCD_BL      |
-|   13/GPIO9   |        LCD_RST     |
-|    8/GPIO5   |        LCD_SDI     |
-|    9/GPIO6   |        LCD_SCL     |
-|  68/GPIO12   |        LCD_CS      |
-|  75/GPIO28   |        TP_RST      |
-|   10/GPIO7   |        TP_INT      |
-|   12/U1TX    |        TP_SCL      |
-|   11/U1RX    |        TP_SDA      |
-
-
-
-## 演示软件环境
-
-1、Luatools下载调试工具
-
-2、[LuatOS-SoC_V1004_Air8101_20250527_085719.soc以及之后的固件都可以,如果打开这个网页,还没有合适的固件,联系合宙销售同事获取](https://docs.openluat.com/air8101/luatos/firmware/)
-
-
-## 演示操作步骤
-
-1、搭建好演示硬件环境
-
-2、不需要修改demo脚本代码
-
-3、Luatools烧录内核固件和demo脚本代码
-
-4、烧录成功后,自动开机运行
-
-   (1) lcd上可以全屏显示一张图片,表示lcd显示功能正常;
-
-   (2) 在触摸面板(注意:将触摸面板上的塑料膜撕掉)上,使用手指按下后,所按的位置会出现一个不太规则并且也没有全部填充的红色实心圆,表示触摸功能正常; 
-
-   (3) 每隔10秒钟,会自动刷屏,清空红色实心圆;  
-
-5、[点击此处观看演示视频](https://docs.openluat.com/air8101/product/file/AirLCD_1020/lcd.mp4)
-
+
+## 演示功能概述
+
+AirLCD_1020是合宙设计生产的一款5寸RGB888接口800*480分辨率的电容触摸显示屏配件板
+
+本demo演示的核心功能为:
+
+Air8101核心板+AirLCD_1020配件板,使用lcd图形库函数演示UI显示和触摸功能;
+
+
+## 核心板+配件板资料
+
+[Air8101核心板+配件板相关资料](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air8101/product/file/AirLCD_1020/hw_connection.jpg)
+
+1、Air8101核心板
+
+2、AirLCD_1020配件板
+
+3、双排40PIN的双头线
+
+4、Air8101核心板和AirGPIO_1000配件板的硬件接线方式为
+
+- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端);如果测试发现软件重启,并且日志中出现  poweron reason 0,表示供电不足,此时再通过直流稳压电源对核心板的VIN管脚进行5V供电;
+
+- 为了演示方便,所以Air8101核心板上电后直接通过vbat引脚给AirLCD_1020配件板提供了3.3V的供电;
+
+- 客户在设计实际项目时,一般来说,需要通过一个GPIO来控制LDO给LCD和TP供电,这样可以灵活地控制供电,可以使项目的整体功耗降到最低;
+
+- 核心板和配件板之间配备了双排40PIN的双头线,可以参考下表很方便地连接双方各自的40个管脚,插入或者拔出双头线时,要慢慢的操作,防止将排针折弯;
+
+| Air8101核心板 | AirLCD_1020配件板 |
+| ------------ | ------------------ |
+|     gnd      |         GND        |
+|     vbat     |         VCC        |
+|    42/R0     |        RGB_R0      |
+|    40/R1     |        RGB_R1      |
+|    43/R2     |        RGB_R2      |
+|    39/R3     |        RGB_R3      |
+|    44/R4     |        RGB_R4      |
+|    38/R5     |        RGB_R5      |
+|    45/R6     |        RGB_R6      |
+|    37/R7     |        RGB_R7      |
+|    46/G0     |        RGB_G0      |
+|    36/G1     |        RGB_G1      |
+|    47/G2     |        RGB_G2      |
+|    35/G3     |        RGB_G3      |
+|    48/G4     |        RGB_G4      |
+|    34/G5     |        RGB_G5      |
+|    49/G6     |        RGB_G6      |
+|    33/G7     |        RGB_G7      |
+|    50/B0     |        RGB_B0      |
+|    32/B1     |        RGB_B1      |
+|    51/B2     |        RGB_B2      |
+|    31/B3     |        RGB_B3      |
+|    52/B4     |        RGB_B4      |
+|    30/B5     |        RGB_B5      |
+|    53/B6     |        RGB_B6      |
+|    29/B7     |        RGB_B7      |
+|   28/DCLK    |       RGB_DCLK     |
+|   54/DISP    |       RGB_DISP     |
+|   55/HSYN    |       RGB_HSYNC    |
+|   56/VSYN    |       RGB_VSYNC    |
+|    57/DE     |        RGB_DE      |
+|   14/GPIO8   |        LCD_BL      |
+|   13/GPIO9   |        LCD_RST     |
+|    8/GPIO5   |        LCD_SDI     |
+|    9/GPIO6   |        LCD_SCL     |
+|  68/GPIO12   |        LCD_CS      |
+|  75/GPIO28   |        TP_RST      |
+|   10/GPIO7   |        TP_INT      |
+|   12/U1TX    |        TP_SCL      |
+|   11/U1RX    |        TP_SDA      |
+
+
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[LuatOS-SoC_V1004_Air8101_20250527_085719.soc以及之后的固件都可以,如果打开这个网页,还没有合适的固件,联系合宙销售同事获取](https://docs.openluat.com/air8101/luatos/firmware/)
+
+
+## 演示操作步骤
+
+1、搭建好演示硬件环境
+
+2、不需要修改demo脚本代码
+
+3、Luatools烧录内核固件和demo脚本代码
+
+4、烧录成功后,自动开机运行
+
+   (1) lcd上可以全屏显示一张图片,表示lcd显示功能正常;
+
+   (2) 在触摸面板(注意:将触摸面板上的塑料膜撕掉)上,使用手指按下后,所按的位置会出现一个不太规则并且也没有全部填充的红色实心圆,表示触摸功能正常; 
+
+   (3) 每隔10秒钟,会自动刷屏,清空红色实心圆;  
+
+5、[点击此处观看演示视频](https://docs.openluat.com/air8101/product/file/AirLCD_1020/lcd.mp4)
+

+ 0 - 0
module/Air8101/project/core_accessory_board/AirLCD_1020/lvgl/AirLCD_1020.lua → module/Air8101/demo/accessory_board/AirLCD_1020/lvgl/AirLCD_1020.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirLCD_1020/lvgl/lcd_app.lua → module/Air8101/demo/accessory_board/AirLCD_1020/lvgl/lcd_app.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirLCD_1020/lvgl/main.lua → module/Air8101/demo/accessory_board/AirLCD_1020/lvgl/main.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirLCD_1020/lvgl/pins_Air8101.json → module/Air8101/demo/accessory_board/AirLCD_1020/lvgl/pins_Air8101.json


+ 103 - 103
module/Air8101/project/core_accessory_board/AirLCD_1020/lvgl/readme.md → module/Air8101/demo/accessory_board/AirLCD_1020/lvgl/readme.md

@@ -1,103 +1,103 @@
-
-## 演示功能概述
-
-AirLCD_1020是合宙设计生产的一款5寸RGB888接口800*480分辨率的电容触摸显示屏配件板
-
-本demo演示的核心功能为:
-
-Air8101核心板+AirLCD_1020配件板,使用lvgl图形库函数演示UI显示和触摸功能;
-
-
-## 核心板+配件板资料
-
-[Air8101核心板+配件板相关资料](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
-
-
-## 演示硬件环境
-
-![](https://docs.openluat.com/air8101/product/file/AirLCD_1020/hw_connection.jpg)
-
-1、Air8101核心板
-
-2、AirLCD_1020配件板
-
-3、双排40PIN的双头线
-
-4、Air8101核心板和AirGPIO_1000配件板的硬件接线方式为
-
-- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端);如果测试发现软件重启,并且日志中出现  poweron reason 0,表示供电不足,此时再通过直流稳压电源对核心板的VIN管脚进行5V供电;
-
-- 为了演示方便,所以Air8101核心板上电后直接通过vbat引脚给AirLCD_1020配件板提供了3.3V的供电;
-
-- 客户在设计实际项目时,一般来说,需要通过一个GPIO来控制LDO给LCD和TP供电,这样可以灵活地控制供电,可以使项目的整体功耗降到最低;
-
-- 核心板和配件板之间配备了双排40PIN的双头线,可以参考下表很方便地连接双方各自的40个管脚,插入或者拔出双头线时,要慢慢的操作,防止将排针折弯;
-
-| Air8101核心板 | AirLCD_1020配件板 |
-| ------------ | ------------------ |
-|     gnd      |         GND        |
-|     vbat     |         VCC        |
-|    42/R0     |        RGB_R0      |
-|    40/R1     |        RGB_R1      |
-|    43/R2     |        RGB_R2      |
-|    39/R3     |        RGB_R3      |
-|    44/R4     |        RGB_R4      |
-|    38/R5     |        RGB_R5      |
-|    45/R6     |        RGB_R6      |
-|    37/R7     |        RGB_R7      |
-|    46/G0     |        RGB_G0      |
-|    36/G1     |        RGB_G1      |
-|    47/G2     |        RGB_G2      |
-|    35/G3     |        RGB_G3      |
-|    48/G4     |        RGB_G4      |
-|    34/G5     |        RGB_G5      |
-|    49/G6     |        RGB_G6      |
-|    33/G7     |        RGB_G7      |
-|    50/B0     |        RGB_B0      |
-|    32/B1     |        RGB_B1      |
-|    51/B2     |        RGB_B2      |
-|    31/B3     |        RGB_B3      |
-|    52/B4     |        RGB_B4      |
-|    30/B5     |        RGB_B5      |
-|    53/B6     |        RGB_B6      |
-|    29/B7     |        RGB_B7      |
-|   28/DCLK    |       RGB_DCLK     |
-|   54/DISP    |       RGB_DISP     |
-|   55/HSYN    |       RGB_HSYNC    |
-|   56/VSYN    |       RGB_VSYNC    |
-|    57/DE     |        RGB_DE      |
-|   14/GPIO8   |        LCD_BL      |
-|   13/GPIO9   |        LCD_RST     |
-|    8/GPIO5   |        LCD_SDI     |
-|    9/GPIO6   |        LCD_SCL     |
-|  68/GPIO12   |        LCD_CS      |
-|  75/GPIO28   |        TP_RST      |
-|   10/GPIO7   |        TP_INT      |
-|   12/U1TX    |        TP_SCL      |
-|   11/U1RX    |        TP_SDA      |
-
-
-
-## 演示软件环境
-
-1、Luatools下载调试工具
-
-2、[LuatOS-SoC_V1004_Air8101_20250527_085719.soc以及之后的固件都可以,如果打开这个网页,还没有合适的固件,联系合宙销售同事获取](https://docs.openluat.com/air8101/luatos/firmware/)
-
-
-## 演示操作步骤
-
-1、搭建好演示硬件环境
-
-2、不需要修改demo脚本代码
-
-3、Luatools烧录内核固件和demo脚本代码
-
-4、烧录成功后,自动开机运行
-
-   (1) lcd上会显示一个按钮,按钮上显示Press Me,按钮下方有一个标签,标签上显示0;表示lcd显示功能正常;
-
-   (2) 手指点击一次Press Me按钮,标签上的数字加一,表示触摸功能正常;   
-
-5、[点击此处观看演示视频](https://docs.openluat.com/air8101/product/file/AirLCD_1020/lvgl.mp4)
-
+
+## 演示功能概述
+
+AirLCD_1020是合宙设计生产的一款5寸RGB888接口800*480分辨率的电容触摸显示屏配件板
+
+本demo演示的核心功能为:
+
+Air8101核心板+AirLCD_1020配件板,使用lvgl图形库函数演示UI显示和触摸功能;
+
+
+## 核心板+配件板资料
+
+[Air8101核心板+配件板相关资料](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air8101/product/file/AirLCD_1020/hw_connection.jpg)
+
+1、Air8101核心板
+
+2、AirLCD_1020配件板
+
+3、双排40PIN的双头线
+
+4、Air8101核心板和AirGPIO_1000配件板的硬件接线方式为
+
+- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端);如果测试发现软件重启,并且日志中出现  poweron reason 0,表示供电不足,此时再通过直流稳压电源对核心板的VIN管脚进行5V供电;
+
+- 为了演示方便,所以Air8101核心板上电后直接通过vbat引脚给AirLCD_1020配件板提供了3.3V的供电;
+
+- 客户在设计实际项目时,一般来说,需要通过一个GPIO来控制LDO给LCD和TP供电,这样可以灵活地控制供电,可以使项目的整体功耗降到最低;
+
+- 核心板和配件板之间配备了双排40PIN的双头线,可以参考下表很方便地连接双方各自的40个管脚,插入或者拔出双头线时,要慢慢的操作,防止将排针折弯;
+
+| Air8101核心板 | AirLCD_1020配件板 |
+| ------------ | ------------------ |
+|     gnd      |         GND        |
+|     vbat     |         VCC        |
+|    42/R0     |        RGB_R0      |
+|    40/R1     |        RGB_R1      |
+|    43/R2     |        RGB_R2      |
+|    39/R3     |        RGB_R3      |
+|    44/R4     |        RGB_R4      |
+|    38/R5     |        RGB_R5      |
+|    45/R6     |        RGB_R6      |
+|    37/R7     |        RGB_R7      |
+|    46/G0     |        RGB_G0      |
+|    36/G1     |        RGB_G1      |
+|    47/G2     |        RGB_G2      |
+|    35/G3     |        RGB_G3      |
+|    48/G4     |        RGB_G4      |
+|    34/G5     |        RGB_G5      |
+|    49/G6     |        RGB_G6      |
+|    33/G7     |        RGB_G7      |
+|    50/B0     |        RGB_B0      |
+|    32/B1     |        RGB_B1      |
+|    51/B2     |        RGB_B2      |
+|    31/B3     |        RGB_B3      |
+|    52/B4     |        RGB_B4      |
+|    30/B5     |        RGB_B5      |
+|    53/B6     |        RGB_B6      |
+|    29/B7     |        RGB_B7      |
+|   28/DCLK    |       RGB_DCLK     |
+|   54/DISP    |       RGB_DISP     |
+|   55/HSYN    |       RGB_HSYNC    |
+|   56/VSYN    |       RGB_VSYNC    |
+|    57/DE     |        RGB_DE      |
+|   14/GPIO8   |        LCD_BL      |
+|   13/GPIO9   |        LCD_RST     |
+|    8/GPIO5   |        LCD_SDI     |
+|    9/GPIO6   |        LCD_SCL     |
+|  68/GPIO12   |        LCD_CS      |
+|  75/GPIO28   |        TP_RST      |
+|   10/GPIO7   |        TP_INT      |
+|   12/U1TX    |        TP_SCL      |
+|   11/U1RX    |        TP_SDA      |
+
+
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[LuatOS-SoC_V1004_Air8101_20250527_085719.soc以及之后的固件都可以,如果打开这个网页,还没有合适的固件,联系合宙销售同事获取](https://docs.openluat.com/air8101/luatos/firmware/)
+
+
+## 演示操作步骤
+
+1、搭建好演示硬件环境
+
+2、不需要修改demo脚本代码
+
+3、Luatools烧录内核固件和demo脚本代码
+
+4、烧录成功后,自动开机运行
+
+   (1) lcd上会显示一个按钮,按钮上显示Press Me,按钮下方有一个标签,标签上显示0;表示lcd显示功能正常;
+
+   (2) 手指点击一次Press Me按钮,标签上的数字加一,表示触摸功能正常;   
+
+5、[点击此处观看演示视频](https://docs.openluat.com/air8101/product/file/AirLCD_1020/lvgl.mp4)
+

+ 9 - 9
module/Air8101/project/core_accessory_board/AirLCD_1020/readme.md → module/Air8101/demo/accessory_board/AirLCD_1020/readme.md

@@ -1,9 +1,9 @@
-本目录为:Air8101核心板+AirLCD_1020配件板的演示功能代码;
-
-AirUI:使用AirUI图形化开发框架(支持可拖拽的上位机工具)开发设计,演示AirLCD_1020配件板上RGB888 800*480分辨率的显示屏+触摸功能;
-
-lcd:使用lcd库手动编码,演示AirLCD_1020配件板上RGB888 800*480分辨率的显示屏+触摸功能;
-
-lvgl:使用lvgl库手动编码,演示AirLCD_1020配件板上RGB888 800*480分辨率的显示屏+触摸功能;
-
-u8g2:使用u8g2库手动编码,演示AirLCD_1020配件板上RGB888 800*480分辨率的显示屏+触摸功能;
+本目录为:Air8101核心板+AirLCD_1020配件板的演示功能代码;
+
+AirUI:使用AirUI图形化开发框架(支持可拖拽的上位机工具)开发设计,演示AirLCD_1020配件板上RGB888 800*480分辨率的显示屏+触摸功能;
+
+lcd:使用lcd库手动编码,演示AirLCD_1020配件板上RGB888 800*480分辨率的显示屏+触摸功能;
+
+lvgl:使用lvgl库手动编码,演示AirLCD_1020配件板上RGB888 800*480分辨率的显示屏+触摸功能;
+
+u8g2:使用u8g2库手动编码,演示AirLCD_1020配件板上RGB888 800*480分辨率的显示屏+触摸功能;

+ 321 - 0
module/Air8101/demo/accessory_board/AirMICROSD_1000/AirMICROSD_1000.lua

@@ -0,0 +1,321 @@
+--[[
+@module  tfcard_app
+@summary TF卡文件操作测试模块
+@version 1.0.0
+@date    2025.08.25
+@author  王棚嶙
+@usage
+本文件为TF卡的文件操作测试流程:
+1. 创建目录
+2. 创建并写入文件
+3. 检查文件是否存在
+4. 获取文件大小
+5. 读取文件内容
+6. 启动计数文件操作
+7. 文件追加测试
+8. 按行读取测试
+9. 读取后关闭文件
+10. 文件重命名
+11. 列举目录内容
+12. 删除文件
+13. 删除目录
+本文件没有对外接口,直接在main.lua中require "tfcard_app"就可以加载运行
+]] 
+    -- 开始进行主测试流程。
+local function tfcard_main_task() 
+    -- 供电控制 (Air8101专用)
+    --gpio13为8101TF卡的供电控制引脚,在挂载前需要设置为高电平,不能省略
+    gpio.setup(13, 1)
+    
+   
+    -- ########## 开始进行tf卡挂载 ##########
+    local mount_ok, mount_err = fatfs.mount(fatfs.SDIO, "/sd", 24 * 1000 * 1000)
+    if mount_ok then
+        log.info("fatfs.mount", "挂载成功", mount_err)
+    else
+        log.error("fatfs.mount", "挂载失败", mount_err)
+        goto resource_cleanup
+    end
+
+    -- ########## 获取SD卡的可用空间信息并打印。 ########## 
+    data, err = fatfs.getfree("/sd")
+    if data then
+        --打印SD卡的可用空间信息
+        log.info("fatfs", "getfree", json.encode(data))
+    else
+        --打印错误信息
+        log.info("fatfs", "getfree", "err", err)
+        goto resource_cleanup
+    end
+
+    -- 列出所有挂载点,如不需要,可注释掉。
+    data = io.lsmount()
+    log.info("fs", "lsmount", json.encode(data))
+
+    -- ########## 功能: 启用fatfs调试模式 ##########
+    -- 若挂载失败,可以尝试打开调试信息,查找原因.(设置调试模式)
+    -- fatfs.debug(1) 
+
+    -- 执行tfcard文件操作演示
+    log.info("文件操作", "===== 开始文件操作 =====")
+
+    dir_path = "/sd/io_test"
+
+    -- 1. 创建目录
+    if io.mkdir(dir_path) then
+        log.info("io.mkdir", "目录创建成功", "路径:" .. dir_path)
+    else
+        -- 检查是否目录已存在
+        if io.exists(dir_path) then
+            log.warn("io.mkdir", "目录已存在,跳过创建", "路径:" .. dir_path)
+        else
+            log.error("io.mkdir", "目录创建失败且目录不存在", "路径:" .. dir_path)
+            goto resource_cleanup
+        end
+    end
+
+    -- 2. 创建并写入文件
+    file_path = dir_path .. "/boottime"
+    file = io.open(file_path, "wb")
+    if file then
+        file:write("这是io库API文档示例的测试内容")
+        file:close()
+        --在LuatOS文件操作中,执行file:close()是必须且关键的操作,它用于关闭文件句柄,释放资源,并确保数据被正确写入磁盘。
+        -- 如果不执行file:close(),可能会导致数据丢失、文件损坏或其他不可预测的问题。
+        log.info("文件创建", "文件写入成功", "路径:" .. file_path)
+    else
+        log.error("文件创建", "文件创建失败", "路径:" .. file_path)
+        goto resource_cleanup
+    end
+
+    -- 3. 检查文件是否存在
+    if io.exists(file_path) then
+        log.info("io.exists", "文件存在", "路径:" .. file_path)
+    else
+        log.error("io.exists", "文件不存在", "路径:" .. file_path)
+        goto resource_cleanup
+    end
+
+    -- 4. 获取文件大小
+    file_size = io.fileSize(file_path)
+    if file_size then
+        log.info("io.fileSize", "文件大小:" .. file_size .. "字节", "路径:" .. file_path)
+    else
+        log.error("io.fileSize", "获取文件大小失败", "路径:" .. file_path)
+        goto resource_cleanup
+    end
+
+    -- 5. 读取文件内容
+    file = io.open(file_path, "rb")
+    if file then
+        content = file:read("*a")
+        log.info("文件读取", "路径:" .. file_path, "内容:" .. content)
+        file:close()
+    else
+        log.error("文件操作", "无法打开文件读取内容", "路径:" .. file_path)
+        goto resource_cleanup
+    end
+
+    -- 6. 启动计数文件操作
+    count = 0
+    --以只读模式打开文件
+    file = io.open(file_path, "rb")
+    if file then
+        data = file:read("*a")
+        log.info("启动计数", "文件内容:", data, "十六进制:", data:toHex())
+        count = tonumber(data) or 0
+        file:close()
+    else
+        log.warn("启动计数", "文件不存在或无法打开")
+
+    end
+
+    log.info("启动计数", "当前值:", count)
+    count=count + 1
+    log.info("启动计数", "更新值:", count)
+
+    file = io.open(file_path, "wb")
+    if file then
+        file:write(tostring(count))
+        file:close()
+        log.info("文件写入", "路径:" .. file_path, "内容:", count)
+    else
+        log.error("文件写入", "无法打开文件", "路径:" .. file_path)
+        goto resource_cleanup
+    end
+
+    -- 7. 文件追加测试
+    append_file = dir_path .. "/test_a"
+    -- 清理旧文件
+    os.remove(append_file)
+
+    -- 创建并写入初始内容
+    file = io.open(append_file, "wb")
+    if file then
+        file:write("ABC")
+        file:close()
+        log.info("文件创建", "路径:" .. append_file, "初始内容:ABC")
+    else
+        log.error("文件创建", "无法创建文件", "路径:" .. append_file)
+        goto resource_cleanup
+    end
+
+    -- 追加内容
+    file = io.open(append_file, "a+")
+    if file then
+        file:write("def")
+        file:close()
+        log.info("文件追加", "路径:" .. append_file, "追加内容:def")
+    else
+        log.error("文件追加", "无法打开文件进行追加", "路径:" .. append_file)
+        goto resource_cleanup
+
+    end
+
+    -- 验证追加结果
+    file = io.open(append_file, "r")
+    if file then
+        data = file:read("*a")
+        log.info("文件验证", "路径:" .. append_file, "内容:" .. data, "结果:",
+            data == "ABCdef" and "成功" or "失败")
+        file:close()
+    else
+        log.error("文件验证", "无法打开文件进行验证", "路径:" .. append_file)
+        goto resource_cleanup
+    end
+
+    -- 8. 按行读取测试
+    line_file = dir_path .. "/testline"
+    file = io.open(line_file, "w")
+    if file then
+        file:write("abc\n")
+        file:write("123\n")
+        file:write("wendal\n")
+        file:close()
+        log.info("文件创建", "路径:" .. line_file, "写入3行文本")
+    else
+        log.error("文件创建", "无法创建文件", "路径:" .. line_file)
+        goto resource_cleanup
+    end
+
+    -- 按行读取文件
+    file = io.open(line_file, "r")
+    if file then
+        log.info("按行读取", "路径:" .. line_file, "第1行:", file:read("*l"))
+        log.info("按行读取", "路径:" .. line_file, "第2行:", file:read("*l"))
+        log.info("按行读取", "路径:" .. line_file, "第3行:", file:read("*l"))
+        file:close()
+    else
+        log.error("按行读取", "无法打开文件", "路径:" .. line_file)
+        goto resource_cleanup
+    end
+
+    -- 9. 文件重命名
+    old_path = append_file
+    new_path = dir_path .. "/renamed_file.txt"
+    success, err = os.rename(old_path, new_path)
+    if success then
+        log.info("os.rename", "文件重命名成功", "原路径:" .. old_path, "新路径:" .. new_path)
+
+        -- 验证重命名结果
+        if io.exists(new_path) and not io.exists(old_path) then
+            log.info("验证结果", "重命名验证成功", "新文件存在", "原文件不存在")
+        else
+            log.error("验证结果", "重命名验证失败")
+        end
+    else
+        log.error("os.rename", "重命名失败", "错误:" .. tostring(err), "原路径:" .. old_path)
+        goto resource_cleanup
+    end
+
+    -- 10. 列举目录内容
+    log.info("目录操作", "===== 开始目录列举 =====")
+
+    ret, data = io.lsdir(dir_path, 50, 0) -- 50表示最多返回50个文件,0表示从目录开头开始
+    if ret then
+        log.info("fs", "lsdir", json.encode(data))
+    else
+        log.info("fs", "lsdir", "fail", ret, data)
+        goto resource_cleanup
+    end
+
+    -- 11. 删除文件测试
+    -- 测试删除renamed_file.txt文件
+    if os.remove(new_path) then
+        log.info("os.remove", "文件删除成功", "路径:" .. new_path)
+
+        -- 验证renamed_file.txt删除结果
+        if not io.exists(new_path) then
+            log.info("验证结果", "renamed_file.txt文件删除验证成功")
+        else
+            log.error("验证结果", "renamed_file.txt文件删除验证失败")
+        end
+    else
+        log.error("io.remove", "renamed_file.txt文件删除失败", "路径:" .. new_path)
+        goto resource_cleanup
+    end
+
+    -- 测试删除testline文件
+    if os.remove(line_file) then
+        log.info("os.remove", "testline文件删除成功", "路径:" .. line_file)
+
+        -- 验证删除结果
+        if not io.exists(line_file) then
+            log.info("验证结果", "testline文件删除验证成功")
+        else
+            log.error("验证结果", "testline文件删除验证失败")
+        end
+    else
+        log.error("io.remove", "testline文件删除失败", "路径:" .. line_file)
+        goto resource_cleanup
+    end
+
+    if os.remove(file_path) then
+        log.info("os.remove", "文件删除成功", "路径:" .. file_path)
+
+        -- 验证删除结果
+        if not io.exists(file_path) then
+            log.info("验证结果", "boottime文件删除验证成功")
+        else
+            log.error("验证结果", "boottime文件删除验证失败")
+        end
+    else
+        log.error("io.remove", "boottime文件删除失败", "路径:" .. file_path)
+        goto resource_cleanup
+    end
+
+    -- 12. 删除目录(不能删除非空目录,所以在删除目录前要确保目录内没有文件或子目录)
+    if io.rmdir(dir_path) then
+        log.info("io.rmdir", "目录删除成功", "路径:" .. dir_path)
+
+        -- 验证删除结果
+        if not io.exists(dir_path) then
+            log.info("验证结果", "目录删除验证成功")
+        else
+            log.error("验证结果", "目录删除验证失败")
+        end
+    else
+        log.error("io.rmdir", "目录删除失败", "路径:" .. dir_path)
+        goto resource_cleanup
+    end
+
+    log.info("文件操作", "===== 文件操作完成 =====")
+
+    -- ########## 功能: 收尾功能演示##########
+    -- 卸载文件系统和关闭SPI
+    ::resource_cleanup::
+
+    log.info("结束", "开始执行关闭操作...")  
+    -- 如已挂载需先卸载文件系统,未挂载直接关闭SPI
+    if mount_ok then
+        if fatfs.unmount("/sd") then
+            log.info("文件系统", "卸载成功")
+        else
+            log.error("文件系统", "卸载失败")
+        end
+    end
+
+
+end
+
+sys.taskInit(tfcard_main_task)

+ 82 - 0
module/Air8101/demo/accessory_board/AirMICROSD_1000/http_download_file.lua

@@ -0,0 +1,82 @@
+--[[
+@module http_download_file
+@summary http下载文件模块
+@version 1.0.0
+@date    2025.08.25
+@author  王棚嶙
+@usage
+本文件演示的功能为通过http下载文件进入TF卡中:
+1. 网络就绪检测,链接wifi
+2. 创建HTTP下载任务并等待完成
+3. 记录下载结果
+4. 获取并记录文件大小
+本文件没有对外接口,直接在main.lua中require "http_download_file"即可
+]] 
+
+
+local function http_download_file_task()
+    -- 阶段1: 网络就绪检测
+    
+    -- 要连接的WIFI路由器名称
+    local ssid ="茶室-降功耗,找合宙!"
+    -- 要连接的WIFI路由器密码
+    local password = "Air123456"
+    log.info("wifi", ssid, password)
+    wlan.init()
+    -- 连接WIFI
+    wlan.connect(ssid, password, 1)
+    
+    
+    while not socket.adapter(socket.dft()) do
+        log.warn("HTTP下载", "等待网络连接", socket.dft())
+        -- 等待IP_READY消息,超时设为1秒
+        sys.waitUntil("IP_READY", 1000)
+    end
+
+    -- 检测到了IP_READY消息
+    log.info("HTTP下载", "网络已就绪", socket.dft())
+    -- TF卡供电控制(AIR8101专用)
+    gpio.setup(13, 1)  
+    -- 挂载文件系统
+    local mount_ok = fatfs.mount(fatfs.SDIO , "/sd",  24 * 1000 * 1000)
+    if not mount_ok then
+        log.error("HTTP下载", "文件系统挂载失败")
+        return
+    end
+    -- 阶段2: 执行下载任务
+    log.info("HTTP下载", "开始下载任务")
+
+    -- 核心下载操作开始 (支持http和https)
+    -- local code, headers, body = http.request("GET", "...", nil, nil, {dst = "/sd/1.mp3"}).wait()
+    -- 其中 "..."为url地址, 支持 http和https, 支持域名, 支持自定义端口。
+    local code, headers, body_size = http.request("GET",
+                                    "https://gitee.com/openLuat/LuatOS/raw/master/module/Air780EHM_Air780EHV_Air780EGH/demo/audio/1.mp3",
+                                    nil, nil, {dst = "/sd/1.mp3"}).wait()
+    -- 阶段3: 记录下载结果
+    log.info("HTTP下载", "下载完成", 
+        code==200 and "success" or "error", 
+        code, 
+        -- headers是下载的文件头信息
+        json.encode(headers or {}), 
+        -- body_size是下载的文件大小(字节数)
+        body_size) 
+        
+    if code == 200 then
+        -- 获取实际文件大小
+        local actual_size = io.fileSize("/sd/1.mp3")
+        log.info("HTTP下载", "文件大小验证", "预期:", body_size, "实际:", actual_size)
+        
+        if actual_size~= body_size then
+            log.error("HTTP下载", "文件大小不一致", "预期:", body_size, "实际:", actual_size)
+        end
+    end
+
+    -- 阶段4: 资源清理
+    fatfs.unmount("/sd")
+   
+    log.info("HTTP下载", "资源清理完成")
+end
+
+
+-- 创建下载任务
+sys.taskInit(http_download_file_task)

+ 82 - 0
module/Air8101/demo/accessory_board/AirMICROSD_1000/main.lua

@@ -0,0 +1,82 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
+@version 001.000.000
+@date    2025.08.25
+@author  王棚嶙
+@usage
+本 Demo 完整覆盖了 TF 卡操作的核心到高级流程,HTTP下载功能包括:
+1. 挂载及文件操作:
+   - 文件系统挂载/卸载
+   - TF卡空间信息查询
+   - 文件创建/读写/追加
+   - 目录创建/删除
+   - 文件重命名/删除
+   - 文件存在性检查与大小获取
+2. 下载功能:
+   - 网络检测与HTTP文件下载
+更多说明参考本目录下的readme.md文件
+]]
+
+
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
+      
+
+PROJECT = "tf_card"
+VERSION = "001.000.000"
+
+
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+
+-- 添加硬狗防止程序卡死
+if wdt then
+    wdt.init(9000)--初始化watchdog设置为9s
+    sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
+end
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
+--[[在加载以下两个功能时,建议分别打开进行测试,因为文件操作和http下载功能是异步操作。
+放到一个项目中,如果加载的时间点是随机的,就会出现tfcard_app在spi.setup和fatfs挂载文件系统之后,
+还没有释放资源,然后http_download_file又去重复spi.setup和fatfs挂载文件系统了,不符合正常的业务逻辑,用户在参考编程的时候也要注意。]]
+
+--加载tf卡测试应用模块
+require "tfcard_app"
+--加载HTTP下载存入TF卡功能演示模块
+--require "http_download_file"
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 181 - 0
module/Air8101/demo/accessory_board/AirMICROSD_1000/readme.md

@@ -0,0 +1,181 @@
+## **功能模块介绍**
+
+本demo演示了在嵌入式环境中对TF卡(SD卡)的完整操作流程,覆盖了从文件系统挂载到高级文件操作的完整功能链。项目分为两个核心模块:
+
+1、main.lua:主程序入口 <br> 
+2、tfcard_app.lua:TF卡基础应用模块,实现文件系统管理、文件操作和目录管理功能。<br> 
+3、http_download_file.lua:HTTP下载模块,实现网络检测与文件下载到TF卡的功能
+
+## **演示功能概述**
+
+### 1、主程序入口模块(main.lua)
+
+- 初始化项目信息和版本号
+- 初始化看门狗,并定时喂狗
+- 启动一个循环定时器,每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况方便分析内存使用是否有异常
+- 加载tfcard_app模块(通过require "tfcard_app")
+- 加载http_download_file模块(通过require "http_download_file")
+- 最后运行sys.run()
+
+### 2、TF卡核心演示模块(tfcard_app.lua)
+
+#### 文件系统管理
+
+- SPI初始化与挂载:
+  - 配置SPI接口参数(频率400kHz)
+  - 挂载FAT32文件系统到`/sd`路径
+  - 自动格式化检测与处理
+- 空间信息获取:
+  - 实时查询TF卡可用空间
+  - 输出详细存储信息(总空间/剩余空间)
+#### 文件操作
+- 创建目录:io.mkdir("/sd/io_test")
+- 创建/写入文件: io.open("/sd/io_test/boottime", "wb")
+- 检查文件存在: io.exists(file_path)
+- 获取文件大小:io.fileSize(file_path)
+- 读取文件内容: io.open(file_path, "rb"):read("*a")
+- 启动计数文件: 记录设备启动次数
+- 文件追加: io.open(append_file, "a+")
+- 按行读取: file:read("*l")
+- 文件关闭: file:close()
+- 文件重命名: os.rename(old_path, new_path)
+- 列举目录: io.lsdir(dir_path)
+- 删除文件: os.remove(file_path)
+- 删除目录: io.rmdir(dir_path)
+
+#### 结果处理
+
+- 资源清理(卸载/SPI关闭)
+
+### 3、HTTP下载功能 (http_download_file.lua)
+
+#### 文件系统管理
+
+- SPI初始化与挂载
+
+#### 网络就绪检测
+
+- wifi链接
+- 1秒循环等待IP就绪
+- 网络故障处理机制
+
+#### 安全下载
+
+- HTTP下载
+
+#### 结果处理
+
+- 下载状态码解析
+- 自动文件大小验证
+- 资源清理(卸载/spi关闭)
+
+## **演示硬件环境**
+
+1、Air8101核心板一块
+
+2、TYPE-C USB数据线一根
+
+3、闪迪C10高速TF卡一张(即micro SD卡,即微型SD卡)
+
+4、AirMICROSD_1000配件板一块
+
+5、Air8101核心板和数据线的硬件接线方式为
+
+- Air8101核心板通过板上的TYPE-C USB口供电。(正面的开关拨到3.3V,背面的开关拨到off)
+- TYPE-C USB数据线直接插到Air8101核心板的TYPE-C USB座子,另外一端连接电脑USB口;
+
+6、Air8101核心板与AirMICROSD_1000配件板直插,对应管脚为
+| Air8101/Air6101核心板 | AirMICROSD_1000配件板 |
+| ------------- | ----------------- |
+| 59/3V3        | 3V3               |
+| gnd           | gnd               |
+| 9/GPIO6       | CD                |
+| 67/GPIO4      | D0                |
+| 66/GPIO3      | CMD               |
+| 65/GPIO2      | CLK               |
+
+## **演示软件环境**
+
+1、Luatools下载调试工具: https://docs.openluat.com/air780epm/common/Luatools/
+
+2、内核固件版本:https://docs.openluat.com/air8101/luatos/firmware/
+
+## **演示核心步骤**
+
+1、搭建好硬件环境
+
+2、通过Luatools将demo与固件烧录到核心板中
+
+3、烧录好后,板子开机将会在Luatools上看到如下打印
+
+```lua
+(1)TF卡初始化与挂载
+[2025-08-24 19:51:24.152][000000001.389] SPI_HWInit 552:spi1 speed 2000000,1994805,154
+[2025-08-24 19:51:24.213][000000002.390] D/fatfs init sdcard at spi=1 cs=20
+[2025-08-24 19:51:24.286][000000002.390] SPI_SetNewConfig 996:spi1 speed 400000,400000
+[2025-08-24 19:51:24.329][000000002.408] SPI_SetNewConfig 996:spi1 speed 24000000,25600000
+[2025-08-24 19:51:24.383][000000002.408] D/SPI_TF 卡容量 122138624KB
+[2025-08-24 19:51:24.430][000000002.408] D/SPI_TF sdcard init OK OCR:0xc0ff8000!
+[2025-08-24 19:51:24.477][000000002.412] I/user.fatfs.mount 挂载成功 0
+[2025-08-24 19:51:24.535][000000002.617] I/user.fatfs getfree {"free_sectors":244262144,"total_kb":122132480,"free_kb":122131072,"total_sectors":244264960}
+[2025-08-24 19:51:24.583][000000002.618] I/user.fs lsmount [{"fs":"ec7xx","path":""},{"fs":"inline","path":"\/lua\/"},{"fs":"ram","path":"\/ram\/"},{"fs":"luadb","path":"\/luadb\/"},{"fs":"fatfs","path":"\/sd"}]
+
+
+(2)文件操作演示
+[2025-08-24 19:51:24.685][000000002.619] I/user.文件操作 ===== 开始文件操作 =====
+[2025-08-24 19:51:25.145][000000003.032] I/user.io.mkdir 目录创建成功 路径:/sd/io_test
+[2025-08-24 19:51:25.231][000000003.043] I/user.文件创建 文件写入成功 路径:/sd/io_test/boottime
+[2025-08-24 19:51:25.297][000000003.046] I/user.io.exists 文件存在 路径:/sd/io_test/boottime
+[2025-08-24 19:51:25.376][000000003.049] I/user.io.fileSize 文件大小:41字节 路径:/sd/io_test/boottime
+[2025-08-24 19:51:25.467][000000003.052] I/user.文件读取 路径:/sd/io_test/boottime 内容:这是io库API文档示例的测试内容
+[2025-08-24 19:51:25.547][000000003.056] I/user.启动计数 文件内容: 这是io库API文档示例的测试内容 十六进制: E8BF99E698AF696FE5BA93415049E69687E6A1A3E7A4BAE4BE8BE79A84E6B58BE8AF95E58685E5AEB9 82
+[2025-08-24 19:51:25.616][000000003.056] I/user.启动计数 当前值: 0
+[2025-08-24 19:51:25.693][000000003.057] I/user.启动计数 更新值: 1
+[2025-08-24 19:51:25.736][000000003.068] I/user.文件写入 路径:/sd/io_test/boottime 内容: 1
+[2025-08-24 19:51:25.795][000000003.081] I/user.文件创建 路径:/sd/io_test/test_a 初始内容:ABC
+[2025-08-24 19:51:25.852][000000003.088] I/user.文件追加 路径:/sd/io_test/test_a 追加内容:def
+[2025-08-24 19:51:25.909][000000003.091] I/user.文件验证 路径:/sd/io_test/test_a 内容:ABCdef 结果: 成功
+[2025-08-24 19:51:25.954][000000003.102] I/user.文件创建 路径:/sd/io_test/testline 写入3行文本
+[2025-08-24 19:51:26.001][000000003.106] I/user.按行读取 路径:/sd/io_test/testline 第1行: abc
+[2025-08-24 19:51:26.048][000000003.106] I/user.按行读取 路径:/sd/io_test/testline 第2行: 123
+[2025-08-24 19:51:26.093][000000003.107] I/user.按行读取 路径:/sd/io_test/testline 第3行: wendal
+[2025-08-24 19:51:26.140][000000003.112] I/user.os.rename 文件重命名成功 原路径:/sd/io_test/test_a 新路径:/sd/io_test/renamed_file.txt
+[2025-08-24 19:51:26.188][000000003.116] D/fatfs f_open /io_test/test_a 4
+[2025-08-24 19:51:26.238][000000003.116] D/vfs fopen /sd/io_test/test_a r not found
+[2025-08-24 19:51:26.312][000000003.117] I/user.验证结果 重命名验证成功 新文件存在 原文件不存在
+[2025-08-24 19:51:26.367][000000003.117] I/user.目录操作 ===== 开始目录列举 =====
+[2025-08-24 19:51:26.424][000000003.121] I/user.fs lsdir [{"name":"boottime","size":0,"type":0},{"name":"testline","size":0,"type":0},{"name":"renamed_file.txt","size":0,"type":0}]
+[2025-08-24 19:51:26.478][000000003.127] I/user.os.remove 文件删除成功 路径:/sd/io_test/renamed_file.txt
+[2025-08-24 19:51:26.539][000000003.129] D/fatfs f_open /io_test/renamed_file.txt 4
+[2025-08-24 19:51:26.593][000000003.130] D/vfs fopen /sd/io_test/renamed_file.txt r not found
+[2025-08-24 19:51:26.656][000000003.130] I/user.验证结果 renamed_file.txt文件删除验证成功
+[2025-08-24 19:51:26.734][000000003.137] I/user.os.remove testline文件删除成功 路径:/sd/io_test/testline
+[2025-08-24 19:51:26.856][000000003.139] D/fatfs f_open /io_test/testline 4
+[2025-08-24 19:51:26.922][000000003.140] D/vfs fopen /sd/io_test/testline r not found
+[2025-08-24 19:51:27.113][000000003.140] I/user.验证结果 testline文件删除验证成功
+[2025-08-24 19:51:27.197][000000003.147] I/user.os.remove 文件删除成功 路径:/sd/io_test/boottime
+[2025-08-24 19:51:27.251][000000003.149] D/fatfs f_open /io_test/boottime 4
+[2025-08-24 19:51:27.302][000000003.150] D/vfs fopen /sd/io_test/boottime r not found
+[2025-08-24 19:51:27.365][000000003.150] I/user.验证结果 boottime文件删除验证成功
+[2025-08-24 19:51:27.407][000000003.158] I/user.io.rmdir 目录删除成功 路径:/sd/io_test
+[2025-08-24 19:51:27.461][000000003.159] D/fatfs f_open /io_test 4
+[2025-08-24 19:51:27.536][000000003.159] D/vfs fopen /sd/io_test r not found
+[2025-08-24 19:51:27.610][000000003.159] I/user.验证结果 目录删除验证成功
+[2025-08-24 19:51:27.668][000000003.160] I/user.文件操作 ===== 文件操作完成 =====
+[2025-08-24 19:51:27.712][000000003.160] I/user.系统清理 开始执行关闭操作...
+[2025-08-24 19:51:27.772][000000003.160] I/user.文件系统 卸载成功
+[2025-08-24 19:51:27.867][000000003.160] I/user.SPI接口 已关闭
+
+
+(3)网络连接与HTTP下载
+[2025-08-24 20:31:49.405][000000006.268] I/user.HTTP下载 开始下载任务
+[2025-08-24 20:31:49.438][000000006.275] dns_run 674:gitee.com state 0 id 1 ipv6 0 use dns server2, try 0
+[2025-08-24 20:31:49.471][000000006.277] D/mobile TIME_SYNC 0
+[2025-08-24 20:31:49.503][000000006.297] dns_run 691:dns all done ,now stop
+[2025-08-24 20:31:54.800][000000012.080] I/user.HTTP下载 下载完成 success 200 
+[2025-08-24 20:31:54.872][000000012.080] {"Age":"0","Cache-Control":"public, max-age=60","Via":"1.1 varnish","Transfer-Encoding":"chunked","Date":"Sun, 24 Aug 2025 12:31:49 GMT","Access-Control-Allow-Credentials":"true","Vary":"Accept-Encoding","X-Served-By":"cache-ffe9","X-Gitee-Server":"http-pilot 1.9.21","Connection":"keep-alive","Server":"ADAS\/1.0.214","Access-Control-Allow-Headers":"Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With,X-CustomHeader,Content-Range,Range,Set-Language","Content-Security-Policy":"default-src 'none'; style-src 'unsafe-inline'; sandbox","X-Request-Id":"1f7e4b55-53c8-440a-9806-8894aa823f50","Accept-Ranges":"bytes","Etag":"W\/\"6ea36a6c51a48eaba0ffbc01d409424e7627bc56\"","Content-Type":"text\/plain; charset=utf-8","Access-Control-Allow-Methods":"GET, POST, PUT, PATCH, DELETE, OPTIONS","X-Frame-Options":"DENY","X-Cache":"MISS","Set-Cookie":"BEC=1f1759df3ccd099821dcf0da6feb0357;Path=\/;Max-Age=126000"}
+[2025-08-24 20:31:54.910][000000012.080]  411922
+[2025-08-24 20:31:54.936][000000012.082] I/user.HTTP下载 文件大小验证 预期: 411922 实际: 411922
+[2025-08-24 20:31:54.979][000000012.083] I/user.HTTP下载 资源清理完成
+
+```

+ 53 - 53
module/Air8101/project/core_accessory_board/AirPHY_1000/http_app.lua → module/Air8101/demo/accessory_board/AirPHY_1000/http_app.lua

@@ -1,53 +1,53 @@
-
---这个task的核心业务逻辑是:每隔一段时间发送一次http get请求,测试http数传是否正常
-local function http_get_task_func()
-    --检查当前使用的网卡(本demo使用的是以太网卡socket.LWIP_ETH)的连接状态
-    log.info("http_get_task_func", "socket.adapter(socket.dft())", socket.adapter(socket.dft()))
-    --如果当前使用的网卡(本demo使用的是以太网卡socket.LWIP_ETH)还没有连接成功
-    if not socket.adapter(socket.dft()) then
-        --phy_app.lua中的以太网配置和启动结束后,一旦以太网卡准备就绪,就会产生一个"IP_READY"消息
-        --在此处阻塞等待以太网连接成功的消息"IP_READY"
-        --或者等待30秒超时退出阻塞等待状态
-        --如果没有等到"IP_READY"消息,直接退出这个函数
-        if not sys.waitUntil("IP_READY", 30000) then
-            log.error("http_get_task_func error", "ip network timeout")
-            return
-        end
-    end
-
-    
-    --每6秒执行一次循环
-    while true do
-        --发送http get请求服务器,等待服务器的http应答,此处会阻塞当前task,等待整个过程成功结束或者出现错误异常结束
-        --此处使用了http.request().wait()的形式
-        --http.request()的详细说明参考API文档
-        --wait()表示在此处阻塞等待整个过程的结束
-
-        --具体到此处的代码,对部分参数以及返回值做如下解释
-        --timeout=3000表示超时时间为3秒,如果3秒内没有成功结束或者异常结束整个过程,则会超时结束;
-        --整个过程结束后,http.request().wait()有三个返回值code,headers,body
-        --code表示结果,number类型,详细说明参考API手册,一般来说:
-        --             200表示成功
-        --             小于0的值表示出错,例如-8表示超时错误
-        --             其余结果值参考API手册
-        --headers表示服务器返回的应答头,table类型
-        --body表示服务器返回的应答题,具体到这里的代码使用方式,为string类型
-        log.info("http", http.request("GET", "http://httpbin.air32.cn/get", nil, nil, {timeout=3000}).wait())
-
-        --打印使用的内存信息,方便分析内存使用情况
-        log.info("lua", rtos.meminfo())
-        log.info("sys", rtos.meminfo("sys"))
-
-        --打印当前使用的网卡(本demo使用的是以太网卡socket.LWIP_ETH)下的本地IP,网关,子网掩码,网关IP信息
-        log.info("ip", socket.dft(), socket.localIP(socket.dft()))
-
-        --等待6秒钟
-        sys.wait(6000)
-    end
-
-end
-
---创建并且启动一个task
---task的主函数为http_get_task_func
-sys.taskInit(http_get_task_func)
-
+
+--这个task的核心业务逻辑是:每隔一段时间发送一次http get请求,测试http数传是否正常
+local function http_get_task_func()
+    --检查当前使用的网卡(本demo使用的是以太网卡socket.LWIP_ETH)的连接状态
+    log.info("http_get_task_func", "socket.adapter(socket.dft())", socket.adapter(socket.dft()))
+    --如果当前使用的网卡(本demo使用的是以太网卡socket.LWIP_ETH)还没有连接成功
+    if not socket.adapter(socket.dft()) then
+        --phy_app.lua中的以太网配置和启动结束后,一旦以太网卡准备就绪,就会产生一个"IP_READY"消息
+        --在此处阻塞等待以太网连接成功的消息"IP_READY"
+        --或者等待30秒超时退出阻塞等待状态
+        --如果没有等到"IP_READY"消息,直接退出这个函数
+        if not sys.waitUntil("IP_READY", 30000) then
+            log.error("http_get_task_func error", "ip network timeout")
+            return
+        end
+    end
+
+    
+    --每6秒执行一次循环
+    while true do
+        --发送http get请求服务器,等待服务器的http应答,此处会阻塞当前task,等待整个过程成功结束或者出现错误异常结束
+        --此处使用了http.request().wait()的形式
+        --http.request()的详细说明参考API文档
+        --wait()表示在此处阻塞等待整个过程的结束
+
+        --具体到此处的代码,对部分参数以及返回值做如下解释
+        --timeout=3000表示超时时间为3秒,如果3秒内没有成功结束或者异常结束整个过程,则会超时结束;
+        --整个过程结束后,http.request().wait()有三个返回值code,headers,body
+        --code表示结果,number类型,详细说明参考API手册,一般来说:
+        --             200表示成功
+        --             小于0的值表示出错,例如-8表示超时错误
+        --             其余结果值参考API手册
+        --headers表示服务器返回的应答头,table类型
+        --body表示服务器返回的应答题,具体到这里的代码使用方式,为string类型
+        log.info("http", http.request("GET", "http://httpbin.air32.cn/get", nil, nil, {timeout=3000}).wait())
+
+        --打印使用的内存信息,方便分析内存使用情况
+        log.info("lua", rtos.meminfo())
+        log.info("sys", rtos.meminfo("sys"))
+
+        --打印当前使用的网卡(本demo使用的是以太网卡socket.LWIP_ETH)下的本地IP,网关,子网掩码,网关IP信息
+        log.info("ip", socket.dft(), socket.localIP(socket.dft()))
+
+        --等待6秒钟
+        sys.wait(6000)
+    end
+
+end
+
+--创建并且启动一个task
+--task的主函数为http_get_task_func
+sys.taskInit(http_get_task_func)
+

+ 0 - 0
module/Air8101/project/core_accessory_board/AirPHY_1000/main.lua → module/Air8101/demo/accessory_board/AirPHY_1000/main.lua


+ 42 - 42
module/Air8101/project/core_accessory_board/AirPHY_1000/phy_app.lua → module/Air8101/demo/accessory_board/AirPHY_1000/phy_app.lua

@@ -1,42 +1,42 @@
-
-local function ip_ready_func()
-    log.info("phy connect.ip_ready_func", "IP_READY")
-end
-
-local function ip_lose_func()
-    log.info("phy connect.ip_lose_func", "IP_LOSE")
-end
-
-
-
---此处订阅"IP_READY"和"IP_LOSE"两种消息
---在消息的处理函数中,仅仅打印了一些信息,便于实时观察以太网的连接状态
---也可以根据自己的项目需求,在消息处理函数中增加自己的业务逻辑控制,例如可以在连网状态发生改变时更新网络图标
-sys.subscribe("IP_READY", ip_ready_func)
-sys.subscribe("IP_LOSE", ip_lose_func)
-
-
-
-
---本demo测试使用的是核心板的VDD 3V3引脚对AirPHY_1000配件板进行供电
---VDD 3V3引脚是Air8101内部的LDO输出引脚,最大输出电流300mA
---GPIO13在Air8101内部使能控制这个LDO的输出
---所以在此处GPIO13输出高电平打开这个LDO
-gpio.setup(13, 1, gpio.PULLUP) 
-
-
-
---初始化以太网卡
-
---以太网联网成功(成功连接路由器,并且获取到了IP地址)后,内核固件会产生一个"IP_READY"消息
---各个功能模块可以订阅"IP_READY"消息实时处理以太网联网成功的事件
---也可以在任何时刻调用socket.adapter(socket.LWIP_ETH)来获取以太网是否连接成功
-
---以太网断网后,内核固件会产生一个"IP_LOSE"消息
---各个功能模块可以订阅"IP_LOSE"消息实时处理以太网断网的事件
---也可以在任何时刻调用socket.adapter(socket.LWIP_ETH)来获取以太网是否连接成功
-netdrv.setup(socket.LWIP_ETH)
-
---在以太网上开启动态主机配置协议
-netdrv.dhcp(socket.LWIP_ETH, true)
-
+
+local function ip_ready_func()
+    log.info("phy connect.ip_ready_func", "IP_READY")
+end
+
+local function ip_lose_func()
+    log.info("phy connect.ip_lose_func", "IP_LOSE")
+end
+
+
+
+--此处订阅"IP_READY"和"IP_LOSE"两种消息
+--在消息的处理函数中,仅仅打印了一些信息,便于实时观察以太网的连接状态
+--也可以根据自己的项目需求,在消息处理函数中增加自己的业务逻辑控制,例如可以在连网状态发生改变时更新网络图标
+sys.subscribe("IP_READY", ip_ready_func)
+sys.subscribe("IP_LOSE", ip_lose_func)
+
+
+
+
+--本demo测试使用的是核心板的VDD 3V3引脚对AirPHY_1000配件板进行供电
+--VDD 3V3引脚是Air8101内部的LDO输出引脚,最大输出电流300mA
+--GPIO13在Air8101内部使能控制这个LDO的输出
+--所以在此处GPIO13输出高电平打开这个LDO
+gpio.setup(13, 1, gpio.PULLUP) 
+
+
+
+--初始化以太网卡
+
+--以太网联网成功(成功连接路由器,并且获取到了IP地址)后,内核固件会产生一个"IP_READY"消息
+--各个功能模块可以订阅"IP_READY"消息实时处理以太网联网成功的事件
+--也可以在任何时刻调用socket.adapter(socket.LWIP_ETH)来获取以太网是否连接成功
+
+--以太网断网后,内核固件会产生一个"IP_LOSE"消息
+--各个功能模块可以订阅"IP_LOSE"消息实时处理以太网断网的事件
+--也可以在任何时刻调用socket.adapter(socket.LWIP_ETH)来获取以太网是否连接成功
+netdrv.setup(socket.LWIP_ETH)
+
+--在以太网上开启动态主机配置协议
+netdrv.dhcp(socket.LWIP_ETH, true)
+

+ 88 - 88
module/Air8101/project/core_accessory_board/AirPHY_1000/readme.md → module/Air8101/demo/accessory_board/AirPHY_1000/readme.md

@@ -1,88 +1,88 @@
-
-## 演示功能概述
-
-AirPHY_1000是合宙设计生产的一款搭载LAN8720Ai芯片的以太网配件板;
-
-本demo演示的核心功能为:
-
-Air8101核心板+AirPHY_1000配件板,使用配件板上的以太网口通过网线连接路由器,演示以太网数传功能;
-
-
-## 核心板+配件板资料
-
-[Air8101核心板+配件板相关资料](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
-
-
-## 演示硬件环境
-
-![](https://docs.openluat.com/air8101/product/file/AirPHY_1000/hw_connection.jpg)
-
-![](https://docs.openluat.com/air8101/product/file/AirPHY_1000/hw_connection1.jpg)
-
-1、Air8101核心板
-
-2、AirPHY_1000配件板
-
-3、公对母的杜邦线11根(连接核心板和配件板)
-
-4、网线1根(一端接配件板,一端接路由器)
-
-5、Air8101核心板和AirPHY_1000配件板的硬件接线方式为
-
-- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端);
-
-- 如果测试发现软件重启,并且日志中出现  poweron reason 0,表示供电不足,此时再通过直流稳压电源对核心板的VIN管脚进行5V供电;
-
-| Air8101核心板 | AirPHY_1000配件板  |
-| ------------ | ------------------ |
-|    59/3V3    |         3.3v       |
-|     gnd      |         gnd        |
-|     5/D2     |         RX1        |
-|    72/D1     |         RX0        |
-|    71/D3     |         CRS        |
-|     4/D0     |         MDIO       |
-|     6/D4     |         TX0        |
-|    74/PCK    |         MDC        |
-|    70/D5     |         TX1        |
-|     7/D6     |         TXEN       |
-|     不接     |          NC        |
-|    69/D7     |         CLK        |
-
-
-## 演示软件环境
-
-1、Luatools下载调试工具
-
-2、[最新版本的内核固件](https://docs.openluat.com/air8101/luatos/firmware/)
-
-
-## 演示操作步骤
-
-1、搭建好演示硬件环境
-
-2、不需要修改demo脚本代码
-
-3、Luatools烧录内核固件和demo脚本代码
-
-4、烧录成功后,自动开机运行
-
-   (1) 配件板上网口水晶头位置处的橙色灯常亮,表示配件板和路由器的连接正常;
-
-   (2) 配件板上网口水晶头位置处的绿色灯常亮或者闪烁,表示配件板和核心板的供电连接正常;
-
-   (3) 观察Luatools的运行日志,如果出现类似于下面的日志,表示软件功能正常:
-
-```lua
-user.http	200	table: 608FD678	{
-   "args": {}, 
-   "headers": {
-      "Accept-Encoding": "gzip", 
-      "Host": "httpbin.air32.cn:80", 
-      "X-Forwarded-Host": "httpbin.air32.cn:80", 
-      "X-Forwarded-Server": "c4a1487bcf14"
-   }, 
-   "origin": "10.0.0.24", 
-   "url": "http://httpbin.air32.cn:80/get"
-}
-```
-
+
+## 演示功能概述
+
+AirPHY_1000是合宙设计生产的一款搭载LAN8720Ai芯片的以太网配件板;
+
+本demo演示的核心功能为:
+
+Air8101核心板+AirPHY_1000配件板,使用配件板上的以太网口通过网线连接路由器,演示以太网数传功能;
+
+
+## 核心板+配件板资料
+
+[Air8101核心板+配件板相关资料](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air8101/product/file/AirPHY_1000/hw_connection.jpg)
+
+![](https://docs.openluat.com/air8101/product/file/AirPHY_1000/hw_connection1.jpg)
+
+1、Air8101核心板
+
+2、AirPHY_1000配件板
+
+3、公对母的杜邦线11根(连接核心板和配件板)
+
+4、网线1根(一端接配件板,一端接路由器)
+
+5、Air8101核心板和AirPHY_1000配件板的硬件接线方式为
+
+- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端);
+
+- 如果测试发现软件重启,并且日志中出现  poweron reason 0,表示供电不足,此时再通过直流稳压电源对核心板的VIN管脚进行5V供电;
+
+| Air8101核心板 | AirPHY_1000配件板  |
+| ------------ | ------------------ |
+|    59/3V3    |         3.3v       |
+|     gnd      |         gnd        |
+|     5/D2     |         RX1        |
+|    72/D1     |         RX0        |
+|    71/D3     |         CRS        |
+|     4/D0     |         MDIO       |
+|     6/D4     |         TX0        |
+|    74/PCK    |         MDC        |
+|    70/D5     |         TX1        |
+|     7/D6     |         TXEN       |
+|     不接     |          NC        |
+|    69/D7     |         CLK        |
+
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[最新版本的内核固件](https://docs.openluat.com/air8101/luatos/firmware/)
+
+
+## 演示操作步骤
+
+1、搭建好演示硬件环境
+
+2、不需要修改demo脚本代码
+
+3、Luatools烧录内核固件和demo脚本代码
+
+4、烧录成功后,自动开机运行
+
+   (1) 配件板上网口水晶头位置处的橙色灯常亮,表示配件板和路由器的连接正常;
+
+   (2) 配件板上网口水晶头位置处的绿色灯常亮或者闪烁,表示配件板和核心板的供电连接正常;
+
+   (3) 观察Luatools的运行日志,如果出现类似于下面的日志,表示软件功能正常:
+
+```lua
+user.http	200	table: 608FD678	{
+   "args": {}, 
+   "headers": {
+      "Accept-Encoding": "gzip", 
+      "Host": "httpbin.air32.cn:80", 
+      "X-Forwarded-Host": "httpbin.air32.cn:80", 
+      "X-Forwarded-Server": "c4a1487bcf14"
+   }, 
+   "origin": "10.0.0.24", 
+   "url": "http://httpbin.air32.cn:80/get"
+}
+```
+

+ 0 - 0
module/Air8101/project/core_accessory_board/AirSHT30_1000/AirSHT30_1000.lua → module/Air8101/demo/accessory_board/AirSHT30_1000/AirSHT30_1000.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirSHT30_1000/main.lua → module/Air8101/demo/accessory_board/AirSHT30_1000/main.lua


+ 62 - 62
module/Air8101/project/core_accessory_board/AirSHT30_1000/readme.md → module/Air8101/demo/accessory_board/AirSHT30_1000/readme.md

@@ -1,63 +1,63 @@
-
-## 演示功能概述
-
-AirSHT30_1000是合宙设计生产的一款I2C接口的SHT30温湿度传感器配件板;
-
-本demo演示的核心功能为:
-
-Air8101核心板+AirSHT30_1000配件板,每隔1秒读取1次温湿度数据;
-
-
-## 核心板+配件板资料
-
-[Air8101核心板+配件板相关资料](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
-
-
-## 演示硬件环境
-
-![](https://docs.openluat.com/air8101/product/file/AirSHT30_1000/hw_connection.jpg)
-
-1、Air8101核心板
-
-2、AirSHT30_1000配件板
-
-3、母对母的杜邦线4根
-
-4、Air8101核心板和AirSHT30_1000配件板的硬件接线方式为
-
-- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端),此种供电方式下,vbat引脚为3.3V,可以直接给AirSHT30_1000配件板供电;
-
-- 为了演示方便,所以Air8101核心板上电后直接通过vbat引脚给AirSHT30_1000配件板提供了3.3V的供电;
-
-- 客户在设计实际项目时,一般来说,需要通过一个GPIO来控制LDO给配件板供电,这样可以灵活地控制配件板的供电,可以使项目的整体功耗降到最低;
-
-| Air8101核心板 | AirSHT30_1000配件板|
-| ------------ | ------------------ |
-|     vbat     |         3V3        |
-|     gnd      |         GND        |
-|    38/R5     |         SDA        |
-|    45/R6     |         SCL        |
-
-
-## 演示软件环境
-
-1、Luatools下载调试工具
-
-2、[Air8101最新版本的内核固件](https://docs.openluat.com/air8101/luatos/firmware/)
-
-
-## 演示操作步骤
-
-1、搭建好演示硬件环境
-
-2、不需要修改demo脚本代码
-
-3、Luatools烧录内核固件和demo脚本代码
-
-4、烧录成功后,自动开机运行
-
-5、通过观察Luatools的运行日志,每隔1秒出现一次类似于下面的打印,就表示测试正常
-
-``` lua
-[2025-06-16 16:29:43.039] I/user.read_sht30_task_func	temprature	26.73 ℃
+
+## 演示功能概述
+
+AirSHT30_1000是合宙设计生产的一款I2C接口的SHT30温湿度传感器配件板;
+
+本demo演示的核心功能为:
+
+Air8101核心板+AirSHT30_1000配件板,每隔1秒读取1次温湿度数据;
+
+
+## 核心板+配件板资料
+
+[Air8101核心板+配件板相关资料](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air8101/product/file/AirSHT30_1000/hw_connection.jpg)
+
+1、Air8101核心板
+
+2、AirSHT30_1000配件板
+
+3、母对母的杜邦线4根
+
+4、Air8101核心板和AirSHT30_1000配件板的硬件接线方式为
+
+- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端),此种供电方式下,vbat引脚为3.3V,可以直接给AirSHT30_1000配件板供电;
+
+- 为了演示方便,所以Air8101核心板上电后直接通过vbat引脚给AirSHT30_1000配件板提供了3.3V的供电;
+
+- 客户在设计实际项目时,一般来说,需要通过一个GPIO来控制LDO给配件板供电,这样可以灵活地控制配件板的供电,可以使项目的整体功耗降到最低;
+
+| Air8101核心板 | AirSHT30_1000配件板|
+| ------------ | ------------------ |
+|     vbat     |         3V3        |
+|     gnd      |         GND        |
+|    38/R5     |         SDA        |
+|    45/R6     |         SCL        |
+
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air8101最新版本的内核固件](https://docs.openluat.com/air8101/luatos/firmware/)
+
+
+## 演示操作步骤
+
+1、搭建好演示硬件环境
+
+2、不需要修改demo脚本代码
+
+3、Luatools烧录内核固件和demo脚本代码
+
+4、烧录成功后,自动开机运行
+
+5、通过观察Luatools的运行日志,每隔1秒出现一次类似于下面的打印,就表示测试正常
+
+``` lua
+[2025-06-16 16:29:43.039] I/user.read_sht30_task_func	temprature	26.73 ℃
 [2025-06-16 16:29:43.039] I/user.read_sht30_task_func	humidity	56.62 %RH

+ 0 - 0
module/Air8101/project/core_accessory_board/AirSHT30_1000/sht30_app.lua → module/Air8101/demo/accessory_board/AirSHT30_1000/sht30_app.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirUSBHUB_1000/AirCAMERA_1030.lua → module/Air8101/demo/accessory_board/AirUSBHUB_1000/AirCAMERA_1030.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirUSBHUB_1000/http_app.lua → module/Air8101/demo/accessory_board/AirUSBHUB_1000/http_app.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirUSBHUB_1000/main.lua → module/Air8101/demo/accessory_board/AirUSBHUB_1000/main.lua


+ 63 - 63
module/Air8101/project/core_accessory_board/AirUSBHUB_1000/readme.md → module/Air8101/demo/accessory_board/AirUSBHUB_1000/readme.md

@@ -1,63 +1,63 @@
-
-## 演示功能概述
-
-AirCAMERA_1030是合宙设计生产的一款USB摄像头配件板;
-
-AirUSBHUB_1000是合宙直接使用的第三方一拖四的USB HUB(例如绿联的USB HUB产品)
-
-本demo演示的核心功能为:
-
-Air8101核心板+AirUSBHUB_1000+HUB上外挂四个AirCAMERA_1030配件板;
-
-依次演示四个AirCAMERA_1030的USB摄像头100万像素拍照+http上传照片+电脑浏览器查看照片的功能;
-
-
-## 核心板+配件板资料
-
-[Air8101核心板+配件板相关资料](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
-
-
-## 演示硬件环境
-
-![](https://docs.openluat.com/air8101/product/file/AirUSBHUB_1000/hw_connection.jpg)
-
-1、Air8101核心板
-
-2、AirUSBHUB_1000配件板
-
-3、四个AirCAMERA_1030配件板(带USB摄像头+数据连接线)
-
-4、Air8101核心板+AirUSBHUB_1000配件板+AirCAMERA_1030配件板的硬件接线方式为
-
-- Air8101核心板通过TYPE-C USB口供电;(核心板背面的功耗测试开关拨到OFF一端)
-
-- 如果测试发现软件频繁重启,可能是供电不足,此时再通过直流稳压电源对核心板的VIN管脚进行5V供电;
-
-- Air8101核心板上的3.3V和5V拨动开关,拨到5V的一端;
-
-- Air8101核心板的USB-A母座和AirUSBHUB_1000配件板的USB-A公座相连;
-
-- AirUSBHUB_1000配件板上有四个USB端口,每个端口接一个AirCAMERA_1030配件板
-
-
-## 演示软件环境
-
-1、Luatools下载调试工具
-
-2、[Air8101 V1003版本固件](https://docs.openluat.com/air8101/luatos/firmware/)(理论上最新版本固件也可以,如果使用最新版本的固件不可以,可以烧录V1003固件对比验证)
-
-## 演示操作步骤
-
-1、搭建好演示硬件环境
-
-2、demo脚本代码wifi_app.lua中的wlan.connect("茶室-降功耗,找合宙!", "Air123456", 1),前两个参数,修改为自己测试时wifi热点的名称和密码;注意:仅支持2.4G的wifi,不支持5G的wifi
-
-3、Luatools烧录内核固件和修改后的demo脚本代码
-
-4、烧录成功后,自动开机运行
-
-5、观察Luatools的运行日志,如果输出 http_upload_photo_task_func httpplus.request 200 x,表示USB HUB上的第x个摄像头测试正常
-
-6、电脑上浏览器打开[https://www.air32.cn/upload/data/jpg/](https://www.air32.cn/upload/data/jpg/),打开对应的测试日期目录,点击具体的测试时间照片,可以查看摄像头拍照上传的照片
-   
-
+
+## 演示功能概述
+
+AirCAMERA_1030是合宙设计生产的一款USB摄像头配件板;
+
+AirUSBHUB_1000是合宙直接使用的第三方一拖四的USB HUB(例如绿联的USB HUB产品)
+
+本demo演示的核心功能为:
+
+Air8101核心板+AirUSBHUB_1000+HUB上外挂四个AirCAMERA_1030配件板;
+
+依次演示四个AirCAMERA_1030的USB摄像头100万像素拍照+http上传照片+电脑浏览器查看照片的功能;
+
+
+## 核心板+配件板资料
+
+[Air8101核心板+配件板相关资料](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air8101/product/file/AirUSBHUB_1000/hw_connection.jpg)
+
+1、Air8101核心板
+
+2、AirUSBHUB_1000配件板
+
+3、四个AirCAMERA_1030配件板(带USB摄像头+数据连接线)
+
+4、Air8101核心板+AirUSBHUB_1000配件板+AirCAMERA_1030配件板的硬件接线方式为
+
+- Air8101核心板通过TYPE-C USB口供电;(核心板背面的功耗测试开关拨到OFF一端)
+
+- 如果测试发现软件频繁重启,可能是供电不足,此时再通过直流稳压电源对核心板的VIN管脚进行5V供电;
+
+- Air8101核心板上的3.3V和5V拨动开关,拨到5V的一端;
+
+- Air8101核心板的USB-A母座和AirUSBHUB_1000配件板的USB-A公座相连;
+
+- AirUSBHUB_1000配件板上有四个USB端口,每个端口接一个AirCAMERA_1030配件板
+
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air8101 V1003版本固件](https://docs.openluat.com/air8101/luatos/firmware/)(理论上最新版本固件也可以,如果使用最新版本的固件不可以,可以烧录V1003固件对比验证)
+
+## 演示操作步骤
+
+1、搭建好演示硬件环境
+
+2、demo脚本代码wifi_app.lua中的wlan.connect("茶室-降功耗,找合宙!", "Air123456", 1),前两个参数,修改为自己测试时wifi热点的名称和密码;注意:仅支持2.4G的wifi,不支持5G的wifi
+
+3、Luatools烧录内核固件和修改后的demo脚本代码
+
+4、烧录成功后,自动开机运行
+
+5、观察Luatools的运行日志,如果输出 http_upload_photo_task_func httpplus.request 200 x,表示USB HUB上的第x个摄像头测试正常
+
+6、电脑上浏览器打开[https://www.air32.cn/upload/data/jpg/](https://www.air32.cn/upload/data/jpg/),打开对应的测试日期目录,点击具体的测试时间照片,可以查看摄像头拍照上传的照片
+   
+

+ 0 - 0
module/Air8101/project/core_accessory_board/AirUSBHUB_1000/wifi_app.lua → module/Air8101/demo/accessory_board/AirUSBHUB_1000/wifi_app.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirVOC_1000/AirVOC_1000.lua → module/Air8101/demo/accessory_board/AirVOC_1000/AirVOC_1000.lua


+ 0 - 0
module/Air8101/project/core_accessory_board/AirVOC_1000/main.lua → module/Air8101/demo/accessory_board/AirVOC_1000/main.lua


+ 64 - 64
module/Air8101/project/core_accessory_board/AirVOC_1000/readme.md → module/Air8101/demo/accessory_board/AirVOC_1000/readme.md

@@ -1,65 +1,65 @@
-
-## 演示功能概述
-
-AirVOC_1000是合宙设计生产的一款I2C接口的VOC(挥发性有机化合物)气体传感器配件板;
-
-主要用于检测甲醛、一氧化碳、可燃气体、酒精、氨气、硫化物、苯系蒸汽、烟雾、其它有害气体的监测;
-
-本demo演示的核心功能为:
-
-Air8101核心板+AirVOC_1000配件板,每隔1秒读取1次TVOC空气质量数据;
-
-
-## 核心板+配件板资料
-
-[Air8101核心板+配件板相关资料](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
-
-
-## 演示硬件环境
-
-![](https://docs.openluat.com/air8101/product/file/AirVOC_1000/hw_connection.jpg)
-
-1、Air8101核心板
-
-2、AirVOC_1000配件板
-
-3、母对母的杜邦线4根
-
-4、Air8101核心板和AirVOC_1000配件板的硬件接线方式为
-
-- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端),此种供电方式下,vbat引脚为3.3V,可以直接给AirVOC_1000配件板供电;
-
-- 为了演示方便,所以Air8101核心板上电后直接通过vbat引脚给AirVOC_1000配件板提供了3.3V的供电;
-
-- 客户在设计实际项目时,一般来说,需要通过一个GPIO来控制LDO给配件板供电,这样可以灵活地控制配件板的供电,可以使项目的整体功耗降到最低;
-
-| Air8101核心板 | AirVOC_1000配件板  |
-| ------------ | ------------------ |
-|     vbat     |         3V3        |
-|     gnd      |         GND        |
-|    38/R5     |         SDA        |
-|    45/R6     |         SCL        |
-
-
-## 演示软件环境
-
-1、Luatools下载调试工具
-
-2、[Air8101最新版本的内核固件](https://docs.openluat.com/air8101/luatos/firmware/)
-
-
-## 演示操作步骤
-
-1、搭建好演示硬件环境
-
-2、不需要修改demo脚本代码
-
-3、Luatools烧录内核固件和demo脚本代码
-
-4、烧录成功后,自动开机运行
-
-5、通过观察Luatools的运行日志,每隔1秒出现一次类似于下面的打印,就表示测试正常
-
-``` lua
-[2025-06-16 21:00:56.415] I/user.空气质量	TVOC: ppb 96, ppm 0.096, 等级 1(优)
+
+## 演示功能概述
+
+AirVOC_1000是合宙设计生产的一款I2C接口的VOC(挥发性有机化合物)气体传感器配件板;
+
+主要用于检测甲醛、一氧化碳、可燃气体、酒精、氨气、硫化物、苯系蒸汽、烟雾、其它有害气体的监测;
+
+本demo演示的核心功能为:
+
+Air8101核心板+AirVOC_1000配件板,每隔1秒读取1次TVOC空气质量数据;
+
+
+## 核心板+配件板资料
+
+[Air8101核心板+配件板相关资料](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air8101/product/file/AirVOC_1000/hw_connection.jpg)
+
+1、Air8101核心板
+
+2、AirVOC_1000配件板
+
+3、母对母的杜邦线4根
+
+4、Air8101核心板和AirVOC_1000配件板的硬件接线方式为
+
+- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端),此种供电方式下,vbat引脚为3.3V,可以直接给AirVOC_1000配件板供电;
+
+- 为了演示方便,所以Air8101核心板上电后直接通过vbat引脚给AirVOC_1000配件板提供了3.3V的供电;
+
+- 客户在设计实际项目时,一般来说,需要通过一个GPIO来控制LDO给配件板供电,这样可以灵活地控制配件板的供电,可以使项目的整体功耗降到最低;
+
+| Air8101核心板 | AirVOC_1000配件板  |
+| ------------ | ------------------ |
+|     vbat     |         3V3        |
+|     gnd      |         GND        |
+|    38/R5     |         SDA        |
+|    45/R6     |         SCL        |
+
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air8101最新版本的内核固件](https://docs.openluat.com/air8101/luatos/firmware/)
+
+
+## 演示操作步骤
+
+1、搭建好演示硬件环境
+
+2、不需要修改demo脚本代码
+
+3、Luatools烧录内核固件和demo脚本代码
+
+4、烧录成功后,自动开机运行
+
+5、通过观察Luatools的运行日志,每隔1秒出现一次类似于下面的打印,就表示测试正常
+
+``` lua
+[2025-06-16 21:00:56.415] I/user.空气质量	TVOC: ppb 96, ppm 0.096, 等级 1(优)
 [2025-06-16 21:00:57.425] I/user.空气质量	TVOC: ppb 98, ppm 0.098, 等级 1(优)

+ 0 - 0
module/Air8101/project/core_accessory_board/AirVOC_1000/voc_app.lua → module/Air8101/demo/accessory_board/AirVOC_1000/voc_app.lua


Некоторые файлы не были показаны из-за большого количества измененных файлов