Bläddra i källkod

add: netdrv,ch390,支持关闭phy,关闭spi通信

https://gitee.com/openLuat/LuatOS/issues/ID8U9S
Wendal Chen 3 månader sedan
förälder
incheckning
2c58338621

+ 13 - 1
components/network/netdrv/binding/luat_lib_netdrv.c

@@ -243,7 +243,13 @@ static int l_netdrv_ipv4(lua_State *L) {
             LLOGW("非法GW[%d] %s %d", id, tmp, ret);
             return 0;
         }
-        network_set_static_ip_info(id, &ip, &netmask, &gw, NULL);
+        ret = network_set_static_ip_info(id, &ip, &netmask, &gw, NULL);
+        LLOGI("设置IP[%d] %s %s %s ret %d", id,
+            luaL_checkstring(L, 2),
+            luaL_checkstring(L, 3),
+            luaL_checkstring(L, 4),
+            ret
+        );
     }
     char buff[16] = {0};
     char buff2[16] = {0};
@@ -342,6 +348,10 @@ static int l_netdrv_ready(lua_State *L) {
 -- 重启网卡, 仅CH390H支持, 其他网络设备暂不支持
 -- 本函数于 2025.4.14 新增
 netdrv.ctrl(socket.LWIP_ETH, netdrv.CTRL_RESET, netdrv.RESET_HARD)
+
+-- 关闭CH390H通信并下电PHY,可用于降功耗;第三个参数1=关闭,0=重新启动
+netdrv.ctrl(socket.LWIP_ETH, netdrv.CTRL_DOWN, 1)
+netdrv.ctrl(socket.LWIP_ETH, netdrv.CTRL_DOWN, 0)
 */
 static int l_netdrv_ctrl(lua_State *L) {
     int id = luaL_checkinteger(L, 1);
@@ -658,6 +668,8 @@ static const rotable_Reg_t reg_netdrv[] =
 
     //@const CTRL_RESET number 控制类型-复位,当前仅支持CH390H
     { "CTRL_RESET",     ROREG_INT(LUAT_NETDRV_CTRL_RESET)},
+    //@const CTRL_DOWN number 控制类型-关闭CH390H通信并下电PHY,0重新启动,1关闭
+    { "CTRL_DOWN",      ROREG_INT(LUAT_NETDRV_CTRL_DOWN)},
     //@const RESET_HARD number 请求对网卡硬复位,当前仅支持CH390H
     { "RESET_HARD",     ROREG_INT(0x101)},
     //@const RESET_SOFT number 请求对网卡软复位,当前仅支持CH390H

+ 1 - 0
components/network/netdrv/include/luat_netdrv.h

@@ -28,6 +28,7 @@ enum {
 
 enum {
     LUAT_NETDRV_CTRL_RESET,
+    LUAT_NETDRV_CTRL_DOWN,
 };
 
 typedef struct luat_netdrv_conf

+ 2 - 0
components/network/netdrv/include/luat_netdrv_ch390h.h

@@ -39,6 +39,8 @@ typedef struct ch390h
     uint8_t flow_control;  // 流控状态:0=正常 1=背压中
 }ch390h_t;
 
+#define CH390H_STATUS_STOPPED 4
+
 
 luat_netdrv_t* luat_netdrv_ch390h_setup(luat_netdrv_conf_t *conf);
 

+ 13 - 0
components/network/netdrv/src/ch390h_task.c

@@ -156,6 +156,9 @@ static void send_msg_cs(ch390h_t* ch, luat_ch390h_cstring_t* cs) {
 
 static void ch390h_dataout(luat_netdrv_t* drv, void* userdata, uint8_t* buff, uint16_t len) {
     ch390h_t* ch = (ch390h_t*)userdata;
+    if (ch->status == CH390H_STATUS_STOPPED) {
+        return;
+    }
     luat_ch390h_cstring_t* cs = new_cstring(ch, len);
     if (cs == NULL) {
         return;
@@ -166,6 +169,9 @@ static void ch390h_dataout(luat_netdrv_t* drv, void* userdata, uint8_t* buff, ui
 }
 
 static void ch390h_dataout_pbuf(ch390h_t* ch, struct pbuf* p) {
+    if (ch->status == CH390H_STATUS_STOPPED) {
+        return;
+    }
     luat_ch390h_cstring_t* cs = new_cstring(ch, p->tot_len);
     if (cs == NULL) {
         return;
@@ -189,6 +195,9 @@ err_t ch390_netif_output(struct netif *netif, struct pbuf *p) {
         if (ch->netdrv->netif != netif) {
             continue;
         }
+        if (ch->status == CH390H_STATUS_STOPPED) {
+            return ERR_IF;
+        }
         ch390h_dataout_pbuf(ch, p);
         break;
     }
@@ -254,6 +263,10 @@ static int task_loop_one(ch390h_t* ch, luat_ch390h_cstring_t* cs) {
     uint8_t buff[32] = {0};
     int ret = 0;
     uint16_t len = 0;
+
+    if (ch->status == CH390H_STATUS_STOPPED) {
+        return 0;
+    }
     
     // LLOGD("状态 spi %d cs %d stat %d", ch->spiid, ch->cspin, ch->status);
     // 首先, 判断设备状态

+ 32 - 0
components/network/netdrv/src/luat_netdrv_ch390h.c

@@ -1,6 +1,7 @@
 #include "luat_base.h"
 #include "luat_netdrv.h"
 #include "luat_network_adapter.h"
+#include "luat_netdrv_event.h"
 #include "luat_netdrv_ch390h.h"
 #include "luat_ch390h.h"
 #include "luat_malloc.h"
@@ -12,6 +13,7 @@
 #include "lwip/sys.h"
 #include "lwip/tcpip.h"
 #include "luat_ulwip.h"
+#include <stdint.h>
 
 #define LUAT_LOG_TAG "ch390h"
 #include "luat_log.h"
@@ -49,6 +51,13 @@ static int check_device_duplicate(ch390h_t* ch) {
     return 0;
 }
 
+static void ch390h_netif_down_cb(void* args) {
+    struct netif* netif = (struct netif*)args;
+    if (netif) {
+        luat_netdrv_netif_set_down(netif);
+    }
+}
+
 static int ch390h_ctrl(luat_netdrv_t* drv, void* userdata, int cmd, void* buff, size_t len) {
     ch390h_t* ch = (ch390h_t*)userdata;
     if (ch == NULL) {
@@ -64,6 +73,29 @@ static int ch390h_ctrl(luat_netdrv_t* drv, void* userdata, int cmd, void* buff,
                 return -3;
             }
             return 0;
+        case LUAT_NETDRV_CTRL_DOWN: {
+            int stop = buff ? (int)(uintptr_t)buff : 1;
+            if (stop) {
+                ch->status = CH390H_STATUS_STOPPED;
+                ch->init_done = 0;
+                luat_ch390h_set_rx(ch, 0);
+                luat_ch390h_set_phy(ch, 0);
+                luat_netdrv_set_link_updown(drv, 0);
+                tcpip_callback_with_block((tcpip_callback_fn)ch390h_netif_down_cb, drv->netif, 1);
+                LLOGI("adapter %d stopped and phy down", ch->adapter_id);
+            }
+            else {
+                ch->status = 0;
+                ch->init_done = 0;
+                ch->rx_error_count = 0;
+                ch->tx_busy_count = 0;
+                ch->vid_pid_error_count = 0;
+                luat_netdrv_set_link_updown(drv, 0);
+                tcpip_callback_with_block((tcpip_callback_fn)ch390h_netif_down_cb, drv->netif, 1);
+                LLOGI("adapter %d restart requested", ch->adapter_id);
+            }
+            return 0;
+        }
     }
     return 0;
 }