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

update:更新780EGH/780EHV/780EHM netdrv demo

wjq 2 месяцев назад
Родитель
Сommit
ed085632bd

+ 0 - 85
module/Air780EHM_Air780EHV_Air780EGH/demo/netdrv/ch390h/lan.lua

@@ -1,85 +0,0 @@
---[[
-@module  lan
-@summary lan功能测试模块
-@version 1.0
-@date    2025.07.01
-@author  Jensen
-@usage
-使用Air780EGH核心板,插上sim卡,将4G网络转以太网功能,
-通过网线将以太网模块CH390H与电脑以太网口连接,电脑可以4G网络访问互联网
-]]
-
--- 加载dhcp server模块,用于动态ip地址分配
-dhcps = require "dhcpsrv"
--- 加载dns模块,用于域名解析
-dnsproxy = require "dnsproxy"
-
--- 网络配置,netdrv模块启动ch390h以太网模块和4g网络
-function network_setup()
-    -- 配置以太网模块ch390h的spi接口参数,使用SPI0
-    -- sys.wait(3000)
-    local result = spi.setup(
-        0,--串口id
-        nil,
-        0,--CPHA
-        0,--CPOL
-        8,--数据宽度
-        38400000--,--频率, 这里注意若通过杜邦线连接CH390H与核心板需调整总线速率,过大的速率会造成通信失败
-        -- 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
-    -- 配置以太网网络,使用SPI0, CS为GPIO08
-    netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {spi=0,cs=8})
-    sys.wait(3000)
-    -- 配置以太网网络参数,包括静态IP,子网掩码,网关IP,
-    -- 本测试需要将4G网络转以太网络相当于自身作为路由器,网关IP地址为自身静态IP地址
-    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
-    
-    -- 插入sim卡,等待4G网络连接
-    while netdrv.link(socket.LWIP_GP) ~= true do
-        sys.wait(100)
-    end
-    
-    -- 配置以太网络打开DHCP服务器
-    dhcps.create({adapter=socket.LWIP_ETH})
-    -- 配置DNS服务
-    dnsproxy.setup(socket.LWIP_ETH, socket.LWIP_GP)
-    -- 使用4G网络作为主网关出口
-    netdrv.napt(socket.LWIP_GP)
-    
-    -- 若支持iper则建立iper服务器,用于吞吐测试
-    if iperf then
-        log.info("启动iperf服务器端")
-        iperf.server(socket.LWIP_ETH)
-    end    
-    
-end
-
--- 外部网络设备通过网线连接CH390H模块,通过4G网络进行http通信测试
-function test_http_requet()
-    -- sys.waitUntil("IP_READY")
-    while 1 do
-        sys.wait(300000)
-        -- 注意这里会耗费sim卡4G网络流量,默认先屏蔽该功能,按需打开
-        -- 定时通过http get请求来获取4K数据
-        -- 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"))
-    end
-end
-
--- 启动lan网络配置任务
-sys.taskInit(network_setup)
--- 启动lan网络数据通信任务
-sys.taskInit(test_http_requet)

+ 0 - 83
module/Air780EHM_Air780EHV_Air780EGH/demo/netdrv/ch390h/readme.md

@@ -1,83 +0,0 @@
-
-## 演示功能概述
-
-本demo使用Air780EGH核心板,演示netdrv库操作以太网模块CH390H模块的使用方法,分别实现以下通信功能测试及代码实现:
-
-1、WAN通信测试为通过以太网模块CH390H连接路由器LAN口,在路由器DHCP获取IP地址后可以访问互联网
-
-2、LAN通信测试为4G网络转以太网功能,通过网线将以太网模块CH390H与电脑以太网口连接,电脑可以4G网络访问互联网
-
-## 演示硬件环境
-
-1、Air780EGH核心板一块,TYPE-C USB数据线一根
-
-2、CH390H以太网模块一个,杜邦线若干
-
-3、Air780EHM核心板与CH390H模块硬件接线:
-
-核心板                   CH390模块
-GND              <--->  GND
-3.3V             <--->  3.3V
-(PIN86)SPI0_CLK  <--->  SCK
-(PIN85)SPIO_MOSI <--->  SDI
-(PIN84)SPI0_MISO <--->  SDO
-(PIN83)SPI0_CS   <--->  CSS
-
-4、Air780EGH核心板通过TYPE-C USB口供电;(核心板USB旁边的开关拨到on一端)
-
-## 演示软件环境
-
-1、Luatools下载调试工具
-
-2、[Air780EGH 最新版本固件](https://docs.openluat.com/air780egh/luatos/firmware/version/)
-
-## 演示核心步骤
-
-1、搭建好硬件环境
-
-2、通过Luatools将demo与固件烧录到核心板中
-
-3、功能测试结果描述如下,具体详见相关文档 [Air780EGH 以太网](https://docs.openluat.com/air780egh/luatos/app/driver/eth/)
-
-WAN功能通信测试:
-
-一台已经拨号上网并可以访问互联网资源的路由器,将Air780EGH核心板连接的CH390H通过网线与路由器的LAN口相连,此时如果CH390H运行正常,可以在luatools打印中看到如下打印信息:(注意以下分配的参数与路由器设置有关)
-
-> D/DHCP get ip ready  
-> D/ulwip 动态IP:192.168.100.42  
-> D/ulwip 子网掩码:255.255.255.0  
-> D/ulwip 网关:192.168.100.1  
-
-CH309H 通信正常后,demo会定时向指定网址做http get请求,请求成功如下打印所示:
-
-> dns run 674:httpbin.air32.cn state 0 id 1 ipv6 0 use dns server0, try 0  
-> D/ulwip IP_READY 192.168.100.42  
-> dns run 674:httpbin.air32.cn state 0 id 1 ipv6 0 use dns server0, try 1  
-> dns run 691:dns all done,now stop  
-> D/net connect 49.232.89.122:80 TCP  
-> I/user http  200   table 0C7F81F0  
-
-LAN功能通信测试:
-
-资费正常的SIM卡插入Air780EGH核心板,将Air780EGH核心板连接的CH390H通过网线与PC电脑的网口相连,打开PC电脑的系统设置,在"网络和Internet"->"以太网"选项页面,等待以太网显示已连接,PC电脑若通过wifi连接此时可以断开wifi,通过以太网连接也可以正常访问互联网资源,可以在luatools打印中看到如下打印信息:
-
-> D/net network_read 4  
-> D/net 使用网关作为默认DNS服务器 192.168.4.1  
-> I/user ipv4  192.168.4.1  255.255.255.0  192.168.4.1  
-> D/socket connect to 255.255.255.255,0  
-> D/net connect 255.255.255.255:0 UDP  
-> I/user dnsproxy  4  1  
-> I/user dnsproxy  开启DNS代理  
-> D/socket connect to 255.255.255.255,0  
-> D/net connect 255.255.255.255:0 UDP  
-> D/socket connect to 223.5.5.5,53  
-> D/netdrv NAPT is enabled gw 1  
-
-CH309H 通信正常后,demo会定时向指定网址做http get请求,请求成功如下打印所示:(注意此时使用的是sim卡4G流量,注意流量消耗)
-
-> dns run 674:httpbin.air32.cn state 0 id 1 ipv6 0 use dns server0, try 0  
-> D/ulwip IP_READY 192.168.100.42  
-> dns run 674:httpbin.air32.cn state 0 id 1 ipv6 0 use dns server0, try 1  
-> dns run 691:dns all done,now stop  
-> D/net connect 49.232.89.122:80 TCP  
-> I/user http  200   table 0C7F81F0  

+ 0 - 52
module/Air780EHM_Air780EHV_Air780EGH/demo/netdrv/ch390h/wan.lua

@@ -1,52 +0,0 @@
---[[
-@module  wan
-@summary wan功能测试模块
-@version 1.0
-@date    2025.07.01
-@author  Jensen
-@usage
-使用Air780EGH核心板,通过以太网模块CH390H连接路由器LAN口,在路由器DHCP获取IP地址后可以访问互联网
-]]
-
--- 网络配置,netdrv模块启动ch390h以太网模块
-function network_setup()
-    -- 配置以太网模块ch390h的spi接口参数,使用SPI0
-    -- sys.wait(3000)
-    local result = spi.setup(
-        0,--串口id
-        nil,
-        0,--CPHA
-        0,--CPOL
-        8,--数据宽度
-        38400000--,--频率,这里注意若通过杜邦线连接CH390H与核心板需调整总线速率,过大的速率会造成通信失败
-        -- 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
-    -- 配置以太网网络,使用SPI0, CS为GPIO08
-    netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {spi=0,cs=8})
-    -- 使能DHCP
-    netdrv.dhcp(socket.LWIP_ETH, true)
-end
-
--- CH390H通过网线连接路由器LAN口,路由器已拨号上网,通过路由器接入互联网进行http通信测试
-function test_http_requet()
-    -- sys.waitUntil("IP_READY")
-    while 1 do
-        sys.wait(6000)
-        -- 定时通过http get请求来获取4K数据
-        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"))
-    end
-end
-
--- 启动wan网络配置任务
-sys.taskInit(network_setup)
--- 启动wan网络数据通信任务
-sys.taskInit(test_http_requet)

+ 29 - 22
module/Air780EHM_Air780EHV_Air780EGH/demo/netdrv/ch390h/main.lua → module/Air780EHM_Air780EHV_Air780EGH/demo/netdrv/main.lua

@@ -1,14 +1,14 @@
 --[[
 @module  main
-@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
 @version 1.0
-@date    2025.07.01
-@author  Jensen
+@date    2025.10.20
+@author  魏健强
 @usage
-本demo演示的功能为:
-实现使用Air780EGH结合netdrv库实现以太网模块CH390H的网络功能包括LAN和WAN通信测试
-WAN通信测试为通过以太网模块CH390H连接路由器LAN口,在路由器DHCP获取IP地址后可以访问互联网
-LAN通信测试为4G网络转以太网功能,通过网线将以太网模块CH390H与电脑以太网口连接,电脑可以4G网络访问互联网
+本demo演示的核心功能为:
+1.开启以太网功能
+2.开启多网融合功能
+更多说明参考本目录下的readme.md文件
 ]]
 --[[
 必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
@@ -19,19 +19,25 @@ VERSION:项目版本号,ascii string类型
             X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
             因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
         如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
-
-
 ]]
--- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "NETDRV_CH390H_TEST"
+PROJECT = "netdrv"
 VERSION = "001.000.000"
 
---添加硬狗防止程序卡死
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
 if wdt then
-    wdt.init(9000)--初始化watchdog设置为9s
-    sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
 end
 
+
 -- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
 -- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
 -- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
@@ -55,17 +61,18 @@ end
 --     log.info("mem.sys", rtos.meminfo("sys"))
 -- end, 3000)
 
---log.info("ch390", "打开LDO供电")
---gpio.setup(20, 1)  --打开LDO供电, 对于核心板外接CH390H模块时可以不需要配置
 
--- 以下功能测试模块,测试时一次加载一个测试模块
--- wan功能通信测试
-require "wan"
--- lan功能通信测试
---require "lan"
+-- 开启以太网wan
+-- require "netdrv_eth_wan"
+-- 开启以太网lan
+-- require "netdrv_eth_lan"
+-- 4G连接外部网络,支持以太网lan模式为其他以太网设备提供接入 
+-- require "netdrv_4g_multiple"
+-- 双网口模式,以太网wan连接外部网络,以太网lan口为其他以太网设备提供接入
+require "netdrv_eth_multiple"
+
 
 -- 用户代码已结束---------------------------------------------
 -- 结尾总是这一句
 sys.run()
 -- sys.run()之后后面不要加任何语句!!!!!
-

+ 67 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/netdrv/netdrv_4g_multiple.lua

@@ -0,0 +1,67 @@
+--[[
+@module  netdrv_4g_multiple
+@summary 多网卡(4G网卡、通过SPI外挂CH390H芯片的以太网卡)驱动模块 
+@version 1.0
+@date    2025.10.20
+@author  魏健强
+@usage
+本文件为多网卡驱动模块 ,核心业务逻辑为:
+1、4G连接外部网络,以太网lan模式为其他以太网设备提供接入 ;
+
+直接使用Air780EPM V1.3开发板硬件测试即可;
+
+本文件没有对外接口,直接在其他功能模块中require "netdrv_4g_multiple"就可以加载运行;
+]] 
+dhcpsrv = require "dhcpsrv"
+dnsproxy = require "dnsproxy"
+
+local function lte_eth_setup()
+    log.info("ch390", "打开LDO供电")
+    gpio.setup(20, 1, gpio.PULLUP) -- 打开ch390供电
+    local result = spi.setup(0, -- spi_id
+    nil, 0, -- CPHA
+    0, -- CPOL
+    8, -- 数据宽度
+    25600000 -- ,--频率
+    )
+    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 = 0,
+        cs = 8
+    })
+    -- 确保ch390初始化完成,否则会出现netdrv.ipv4设置失败的情况
+    sys.wait(1000)
+    -- 设置ip, 子网掩码,网关
+    local ipv4, mark, gw = netdrv.ipv4(socket.LWIP_ETH, "192.168.4.1", "255.255.255.0", "192.168.4.1")
+    log.info("LWIP_ETH", ipv4, mark, gw)
+    -- 开启dhcp服务器
+    dhcpsrv.create({adapter = socket.LWIP_ETH})
+    -- 设置dns转发
+    dnsproxy.setup(socket.LWIP_ETH, socket.LWIP_GP)
+end
+
+
+local function netdrv_multiple_task_func()
+    -- 等待4G网络连接成功
+    while not socket.adapter() do
+        -- 在此处阻塞等待4G网卡连接成功的消息"IP_READY"
+        -- 或者等待1秒超时退出阻塞等待状态;
+        -- 注意:此处的1000毫秒超时不要修改的更长;
+        sys.waitUntil("IP_READY", 1000)
+    end
+    -- 开启4G->以太网的多网融合
+    lte_eth_setup()
+    -- 设置4G为数据出口
+    netdrv.napt(socket.LWIP_GP)
+end
+
+-- 启动一个task,task的处理函数为netdrv_multiple_task_func
+sys.taskInit(netdrv_multiple_task_func)

+ 55 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/netdrv/netdrv_eth_lan.lua

@@ -0,0 +1,55 @@
+--[[
+@module  netdrv_eth_lan
+@summary “通过SPI外挂CH390H芯片的以太网卡”驱动模块 
+@version 1.0
+@date    2025.10.20
+@author  魏健强
+@usage
+本文件为“通过SPI外挂CH390H芯片的以太网卡”驱动模块 ,核心业务逻辑为:
+1、开启以太网lan;
+
+直接使用Air780EPM V1.3开发板硬件测试即可;
+
+本文件没有对外接口,直接在其他功能模块中require "netdrv_eth_lan"就可以加载运行;
+]] 
+dhcps = require "dhcpsrv"
+
+local function eth_lan_setup()
+    -- 本demo使用Air8000开发板测试,开发板上的硬件配置为:
+    -- GPIO140为CH390H以太网芯片的供电使能控制引脚
+    -- 使用spi1,片选引脚使用GPIO12
+    -- 如果使用的硬件不是Air8000开发板,根据自己的硬件配置修改以下参数
+    log.info("ch390", "打开LDO供电")
+    gpio.setup(20, 1, gpio.PULLUP) -- 打开ch390供电
+    local result = spi.setup(0, -- spi_id
+    nil, 0, -- CPHA
+    0, -- CPOL
+    8, -- 数据宽度
+    25600000 -- ,--频率
+    )
+    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 = 0,
+        cs = 8
+    })
+    -- 确保ch390初始化完成,否则会出现netdrv.ipv4设置失败的情况
+    sys.wait(1000)
+    -- 设置ip, 子网掩码,网关
+    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)
+    -- 开启dhcp服务器
+    dhcps.create({
+        adapter = socket.LWIP_ETH
+    })
+end
+
+sys.taskInit(eth_lan_setup)

+ 115 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/netdrv/netdrv_eth_multiple.lua

@@ -0,0 +1,115 @@
+--[[
+@module  netdrv_eth_multiple
+@summary 双以太网驱动模块 
+@version 1.0
+@date    2025.10.20
+@author  魏健强
+@usage
+本文件为多网卡驱动模块 ,核心业务逻辑为:
+1、以太网WAN连接外部网络, 其他需要上网的设备连接模块以太网LAN口上网;
+
+直接使用Air780EPM V1.3开发板硬件测试即可;
+
+本文件没有对外接口,直接在其他功能模块中require "netdrv_eth_multiple"就可以加载运行;
+]] 
+dhcpsrv = require "dhcpsrv"
+dnsproxy = require "dnsproxy"
+
+local static_ip = false
+
+
+local function eth_wan_setup()
+    log.info("ch390", "打开LDO供电")
+    gpio.setup(20, 1, gpio.PULLUP) -- 打开ch390供电
+    local result = spi.setup(0, -- 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 = 0,
+        cs = 8
+    })
+    sys.wait(1000) -- 等待以太网模块初始化完成,去掉会导致以太网初始化失败
+    if static_ip then
+        -- 静态ip配置
+        log.info("静态ip", netdrv.ipv4(socket.LWIP_ETH, "192.168.4.100", "255.255.255.0", "192.168.4.1"))
+    else
+        -- 使用dhcp动态获取ip地址
+        netdrv.dhcp(socket.LWIP_ETH, true)
+    end
+    log.info("LWIP_ETH", "mac addr", netdrv.mac(socket.LWIP_ETH))
+end
+
+local function eth_lan_setup()
+    log.info("ch390", "打开LDO供电")
+    gpio.setup(21, 1, gpio.PULLUP) -- 打开ch390供电
+    local result = spi.setup(1, -- spi_id
+    nil, 0, -- CPHA
+    0, -- CPOL
+    8, -- 数据宽度
+    25600000 -- ,--频率
+    )
+    log.info("main", "open", result)
+    if result ~= 0 then -- 返回值为0,表示打开成功
+        log.info("main", "spi open error", result)
+        return
+    end
+
+    -- 初始化指定netdrv设备,
+    -- socket.LWIP_USER0 网络适配器编号
+    -- netdrv.CH390外挂CH390
+    -- SPI ID 1, 片选 GPIO12
+    netdrv.setup(socket.LWIP_USER0, netdrv.CH390, {
+        spi = 1,
+        cs = 12
+    })
+    -- 确保ch390初始化完成,否则会出现netdrv.ipv4设置失败的情况
+    sys.wait(1000)
+    -- 设置ip, 子网掩码,网关
+    local ipv4, mark, gw = netdrv.ipv4(socket.LWIP_USER0, "192.168.5.1", "255.255.255.0", "192.168.5.1")
+    log.info("ipv4", ipv4, mark, gw)
+    -- 开启dhcp服务器
+    dhcpsrv.create({
+        adapter = socket.LWIP_USER0
+    })
+end
+
+
+local function netdrv_multiple_task_func()
+    eth_wan_setup()
+    eth_lan_setup()
+    -- 设置dns转发
+    dnsproxy.setup(socket.LWIP_USER0, socket.LWIP_ETH)
+    -- 设置以太网为数据出口
+    netdrv.napt(socket.LWIP_ETH)
+end
+
+local function http_test()
+    -- 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
+
+-- 启动一个task,task的处理函数为netdrv_multiple_task_func
+sys.taskInit(netdrv_multiple_task_func)
+sys.taskInit(http_test)

+ 123 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/netdrv/netdrv_eth_wan.lua

@@ -0,0 +1,123 @@
+--[[
+@module  netdrv_eth_wan
+@summary “通过SPI外挂CH390H芯片的以太网卡”驱动模块 
+@version 1.0
+@date    2025.10.20
+@author  魏健强
+@usage
+本文件为“通过SPI外挂CH390H芯片的以太网卡”驱动模块 ,核心业务逻辑为:
+1、开启以太网wan;
+
+直接使用Air780EPM V1.3开发板硬件测试即可;
+
+本文件没有对外接口,直接在其他功能模块中require "netdrv_eth_wan"就可以加载运行;
+]] 
+local static_ip = false
+
+local function ip_ready_func(ip, adapter)
+    if adapter == socket.LWIP_ETH then
+        -- 在位置1和2设置自定义的DNS服务器ip地址:
+        -- "223.5.5.5",这个DNS服务器IP地址是阿里云提供的DNS服务器IP地址;
+        -- "114.114.114.114",这个DNS服务器IP地址是国内通用的DNS服务器IP地址;
+        -- 可以加上以下两行代码,在自动获取的DNS服务器工作不稳定的情况下,这两个新增的DNS服务器会使DNS服务更加稳定可靠;
+        -- 如果使用专网卡,不要使用这两行代码;
+        -- 如果使用国外的网络,不要使用这两行代码;
+        socket.setDNS(adapter, 1, "223.5.5.5")
+        socket.setDNS(adapter, 2, "114.114.114.114")
+
+        log.info("netdrv_eth_wan.ip_ready_func", "IP_READY", socket.localIP(socket.LWIP_ETH))
+    end
+end
+
+local function ip_lose_func(adapter)
+    if adapter == socket.LWIP_ETH then
+        log.warn("netdrv_eth_wan.ip_lose_func", "IP_LOSE")
+    end
+end
+
+-- 本功能在2025.9.3新增
+local function ping_test()
+    -- 要等联网了才能ping
+    sys.waitUntil("IP_READY")
+    while 1 do
+        -- 必须指定使用哪个网卡
+        netdrv.ping(socket.LWIP_ETH, "112.125.89.8")
+        sys.waitUntil("PING_RESULT", 3000)
+        sys.wait(3000)
+    end
+end
+local function ping_res(id, time, dst)
+    log.info("ping", id, time, dst); -- 获取到响应结果
+end
+
+-- 以太网联网成功(成功连接路由器,并且获取到了IP地址)后,内核固件会产生一个"IP_READY"消息
+-- 各个功能模块可以订阅"IP_READY"消息实时处理以太网联网成功的事件
+-- 也可以在任何时刻调用socket.adapter(socket.LWIP_ETH)来获取以太网是否连接成功
+
+-- 以太网断网后,内核固件会产生一个"IP_LOSE"消息
+-- 各个功能模块可以订阅"IP_LOSE"消息实时处理以太网断网的事件
+-- 也可以在任何时刻调用socket.adapter(socket.LWIP_ETH)来获取以太网是否连接成功
+
+-- 此处订阅"IP_READY"和"IP_LOSE"两种消息
+-- 在消息的处理函数中,仅仅打印了一些信息,便于实时观察“通过SPI外挂CH390H芯片的以太网卡”的连接状态
+-- 也可以根据自己的项目需求,在消息处理函数中增加自己的业务逻辑控制,例如可以在连网状态发生改变时更新网络图标
+sys.subscribe("IP_READY", ip_ready_func)
+sys.subscribe("IP_LOSE", ip_lose_func)
+
+local function eth_wan_setup()
+    -- 本demo使用Air8000开发板测试,开发板上的硬件配置为:
+    -- GPIO140为CH390H以太网芯片的供电使能控制引脚
+    -- 使用spi1,片选引脚使用GPIO12
+    -- 如果使用的硬件不是Air8000开发板,根据自己的硬件配置修改以下参数
+    log.info("ch390", "打开LDO供电")
+    gpio.setup(20, 1, gpio.PULLUP) -- 打开ch390供电
+    local result = spi.setup(0, -- 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 = 0,
+        cs = 8
+    })
+    sys.wait(1000) -- 等待以太网模块初始化完成,去掉会导致以太网初始化失败
+    if static_ip then
+        -- 静态ip配置
+        log.info("静态ip", netdrv.ipv4(socket.LWIP_ETH, "192.168.4.100", "255.255.255.0", "192.168.4.1"))
+    else
+        -- 使用dhcp动态获取ip地址
+        netdrv.dhcp(socket.LWIP_ETH, true)
+    end
+    log.info("LWIP_ETH", "mac addr", netdrv.mac(socket.LWIP_ETH))
+    sys.taskInit(ping_test)
+    sys.subscribe("PING_RESULT", ping_res)
+end
+
+local function http_test()
+    -- 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
+sys.taskInit(eth_wan_setup)
+sys.taskInit(http_test)
+
+

+ 108 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/netdrv/readme.md

@@ -0,0 +1,108 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、netdrv_eth_wan.lua:以太网wan
+
+3、netdrv_eth_lan.lua:以太网lan
+
+4、netdrv_4g_multiple.lua:4G连接外部网络,以太网lan模式为其他以太网设备提供接入 
+
+5、netdrv_eth_multiple:双以太网口,以太网WAN->以太网LAN
+
+## 演示功能概述
+
+1、演示 netdrv核心库+dnsproxy扩展库+dhcpsrv扩展库 开启以太网或双以太网口,4G,以太网多网融合功能.
+
+## 演示硬件环境
+
+![](image/780EHM双网口.png)
+
+2.2.1 Air780EHM/Air780EHV/Air780EGH 核心板一块 + 可上网的 sim 卡一张 +4g 天线一根 + 网线两根:
+
+- sim 卡插入开发板的 sim 卡槽
+- 天线装到开发板上
+- 网线一端插入AirETH_1000配件板网口,另外一端可以连接电脑
+
+2.2.2 TYPE-C USB 数据线一根 + USB 转串口数据线一根,Air780EHM/Air780EHV/Air780EGH 核心板和数据线的硬件接线方式为:
+
+- Air780EHM/Air780EHV/Air780EGH 核心板通过 TYPE-C USB 口供电;(外部供电/USB 供电 拨动开关 拨到 USB 供电一端)
+- TYPE-C USB 数据线直接插到核心板的 TYPE-C USB 座子,另外一端连接电脑 USB 口;
+
+2.2.3 必选 AirETH_1000配件板两块,Air780EHM/Air780EHV/Air780EGH 核心板和 AirETH_1000配件板的硬件接线方式为:
+
+
+这块配件板以太网接口接路由器
+
+<table>
+<tr>
+<td>Air780EHM/Air780EHV/Air780EGH核心板<br/></td><td>AirETH_1000配件板<br/></td></tr>
+<tr>
+<td>3V3<br/></td><td>3.3v<br/></td></tr>
+<tr>
+<td>GND<br/></td><td>GND<br/></td></tr>
+<tr>
+<td>86/SPI0CLK<br/></td><td>SCK<br/></td></tr>
+<tr>
+<td>83/SPI0CS<br/></td><td>CSS<br/></td></tr>
+<tr>
+<td>84/SPI0MISO<br/></td><td>SDO<br/></td></tr>
+<tr>
+<td>85/SPI0MOSI<br/></td><td>SDI<br/></td></tr>
+<tr>
+<td>107/GPIO21<br/></td><td>INT<br/></td></tr>
+</table>
+
+
+这块配件板以太网接口接电脑
+
+| Air780EHM/Air780EHV/Air780EGH核心板 |  AirETH_1000配件板 |
+| --------------- | ----------------- |
+| 24/VDD_EXT      | 3.3v              |
+| gnd             | gnd               |
+| UART3_TX        | SCK               |
+| UART2_RX        | CSS               |
+| UART3_RX        | SDO               |
+| UART2_TX        | SDI               |
+| nil             | INT               |
+
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+3、内核固件:[Air780EXX V2018 版本固件](https://docs.openluat.com/air780egh/luatos/firmware/version/);如有更新可以使用最新固件。
+
+
+## 演示核心步骤
+
+1、搭建好硬件环境,按接线图连接硬件,
+
+2、在main.lua中按照自己的网卡需求启用对应的Lua文件
+
+- 如果需要开启以太网lan,打开require "netdrv_eth_lan",其余注释掉
+
+- 如果需要开启以太网wan,打开require "netdrv_eth_wan",其余注释掉
+
+- 如果需要开启4G转以太网的多网融合,打开require "netdrv_4g_multiple",其余注释掉
+
+- 如果需要开启双以太网口的多网融合,打开require "netdrv_eth_multiple.lua",其余注释掉
+
+3、Luatools烧录内核固件和修改后的demo脚本代码
+netdrv_eth_lan:
+模块以太网接口接其他设备,这里演示使用电脑连接,可以dhcp获取ip,可以ping通模块
+![](https://docs.openluat.com/air780epm/luatos/app/socket/netdrv/image/780epm-netdrv2.png)
+
+netdrv_eth_wan:
+模块以太网口接路由器,模块成功联网并http请求成功
+![](https://docs.openluat.com/air780epm/luatos/app/socket/netdrv/image/780epm-netdrv1.png)
+
+netdrv_4g_multiple:
+4G作为数据出口,这里使用电脑连接模块以太网接口上网
+![](https://docs.openluat.com/air780epm/luatos/app/socket/netdrv/image/780epm-netdrv4.png)
+
+netdrv_eth_multiple:
+模块以太网口WAN接路由器LAN口,这里使用电脑连接模块LAN口,dhcp获取到ip,测试网络正常
+![](https://docs.openluat.com/air780epm/luatos/app/socket/netdrv/image/780epm-netdrv3.png)
+
+