|
@@ -1,92 +1,70 @@
|
|
|
--[[
|
|
--[[
|
|
|
@module netdrv_eth_spi
|
|
@module netdrv_eth_spi
|
|
|
-@summary “通过SPI外挂CH390H芯片的以太网卡”驱动模块
|
|
|
|
|
|
|
+@summary “通过SPI外挂CH390H芯片的以太网卡”驱动模块
|
|
|
@version 1.0
|
|
@version 1.0
|
|
|
-@date 2025.09.19
|
|
|
|
|
-@author 王城钧
|
|
|
|
|
|
|
+@date 2025.07.24
|
|
|
|
|
+@author 朱天华
|
|
|
@usage
|
|
@usage
|
|
|
-本文件为“通过SPI外挂CH390H芯片的以太网卡”驱动模块,核心业务逻辑为:
|
|
|
|
|
|
|
+本文件为“通过SPI外挂CH390H芯片的以太网卡”驱动模块 ,核心业务逻辑为:
|
|
|
1、打开CH390H芯片供电开关;
|
|
1、打开CH390H芯片供电开关;
|
|
|
2、初始化spi1,初始化以太网卡,并且在以太网卡上开启DHCP(动态主机配置协议);
|
|
2、初始化spi1,初始化以太网卡,并且在以太网卡上开启DHCP(动态主机配置协议);
|
|
|
3、以太网卡的连接状态发生变化时,在日志中进行打印;
|
|
3、以太网卡的连接状态发生变化时,在日志中进行打印;
|
|
|
|
|
|
|
|
-使用Air8000核心板外接AirETH_1000小板测试即可;
|
|
|
|
|
|
|
+直接使用Air8000开发板硬件测试即可;
|
|
|
|
|
|
|
|
本文件没有对外接口,直接在其他功能模块中require "netdrv_eth_spi"就可以加载运行;
|
|
本文件没有对外接口,直接在其他功能模块中require "netdrv_eth_spi"就可以加载运行;
|
|
|
]]
|
|
]]
|
|
|
|
|
|
|
|
-exnetif = require "exnetif"
|
|
|
|
|
|
|
+local exnetif = require "exnetif"
|
|
|
|
|
|
|
|
-local function ip_ready_func(ip, adapter)
|
|
|
|
|
|
|
+local function ip_ready_func(ip, adapter)
|
|
|
if adapter == socket.LWIP_ETH then
|
|
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_spi.ip_ready_func", "IP_READY", socket.localIP(socket.LWIP_ETH))
|
|
log.info("netdrv_eth_spi.ip_ready_func", "IP_READY", socket.localIP(socket.LWIP_ETH))
|
|
|
end
|
|
end
|
|
|
end
|
|
end
|
|
|
|
|
|
|
|
-local function ip_lose_func(adapter)
|
|
|
|
|
|
|
+local function ip_lose_func(adapter)
|
|
|
if adapter == socket.LWIP_ETH then
|
|
if adapter == socket.LWIP_ETH then
|
|
|
log.warn("netdrv_eth_spi.ip_lose_func", "IP_LOSE")
|
|
log.warn("netdrv_eth_spi.ip_lose_func", "IP_LOSE")
|
|
|
end
|
|
end
|
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
--- 此处订阅"IP_READY"和"IP_LOSE"两种消息
|
|
|
|
|
--- 在消息的处理函数中,仅仅打印了一些信息,便于实时观察“通过SPI外挂CH390H芯片的以太网卡”的连接状态
|
|
|
|
|
--- 也可以根据自己的项目需求,在消息处理函数中增加自己的业务逻辑控制,例如可以在连网状态发生改变时更新网络图标
|
|
|
|
|
-sys.subscribe("IP_READY", ip_ready_func)
|
|
|
|
|
-sys.subscribe("IP_LOSE", ip_lose_func)
|
|
|
|
|
|
|
+-- 以太网联网成功(成功连接路由器,并且获取到了IP地址)后,内核固件会产生一个"IP_READY"消息
|
|
|
|
|
+-- 各个功能模块可以订阅"IP_READY"消息实时处理以太网联网成功的事件
|
|
|
|
|
+-- 也可以在任何时刻调用socket.adapter(socket.LWIP_ETH)来获取以太网是否连接成功
|
|
|
|
|
|
|
|
|
|
+-- 以太网断网后,内核固件会产生一个"IP_LOSE"消息
|
|
|
|
|
+-- 各个功能模块可以订阅"IP_LOSE"消息实时处理以太网断网的事件
|
|
|
|
|
+-- 也可以在任何时刻调用socket.adapter(socket.LWIP_ETH)来获取以太网是否连接成功
|
|
|
|
|
|
|
|
--- 设置默认网卡为socket.LWIP_ETH
|
|
|
|
|
-socket.dft(socket.LWIP_ETH)
|
|
|
|
|
|
|
+--此处订阅"IP_READY"和"IP_LOSE"两种消息
|
|
|
|
|
+--在消息的处理函数中,仅仅打印了一些信息,便于实时观察“通过SPI外挂CH390H芯片的以太网卡”的连接状态
|
|
|
|
|
+--也可以根据自己的项目需求,在消息处理函数中增加自己的业务逻辑控制,例如可以在连网状态发生改变时更新网络图标
|
|
|
|
|
+sys.subscribe("IP_READY", ip_ready_func)
|
|
|
|
|
+sys.subscribe("IP_LOSE", ip_lose_func)
|
|
|
|
|
|
|
|
|
|
|
|
|
--- 本demo测试使用的是Air8000开发板
|
|
|
|
|
|
|
+-- 配置SPI外接以太网芯片CH390H的单网卡,exnetif.set_priority_order使用的网卡编号为socket.LWIP_ETH
|
|
|
|
|
+-- 本demo使用Air8000开发板测试,开发板上的硬件配置为:
|
|
|
-- GPIO140为CH390H以太网芯片的供电使能控制引脚
|
|
-- GPIO140为CH390H以太网芯片的供电使能控制引脚
|
|
|
-gpio.setup(140, 1, gpio.PULLUP)
|
|
|
|
|
-
|
|
|
|
|
--- 这个task的核心业务逻辑是:初始化SPI,初始化以太网卡,并在以太网卡上开启动态主机配置协议
|
|
|
|
|
-local function netdrv_eth_spi_task_func()
|
|
|
|
|
- local result = exnetif.set_priority_order({
|
|
|
|
|
|
|
+-- 使用spi1,片选引脚使用GPIO12
|
|
|
|
|
+-- 如果使用的硬件不是Air8000开发板,根据自己的硬件配置修改以下参数
|
|
|
|
|
+exnetif.set_priority_order({
|
|
|
{
|
|
{
|
|
|
- ETHUSER1 = {
|
|
|
|
|
- -- 供电使能GPIO
|
|
|
|
|
- pwrpin = 140,
|
|
|
|
|
- -- 设置的多个“已经IP READY,但是还没有ping通”网卡,循环执行ping动作的间隔(单位毫秒,可选)
|
|
|
|
|
- -- 如果没有传入此参数,exnetif会使用默认值10秒
|
|
|
|
|
- ping_time = 3000,
|
|
|
|
|
-
|
|
|
|
|
- -- 连通性检测ip(选填参数);
|
|
|
|
|
- -- 如果没有传入ip地址,exnetif中会默认使用httpdns能否成功获取baidu.com的ip作为是否连通的判断条件;
|
|
|
|
|
- -- 如果传入,一定要传入可靠的并且可以ping通的ip地址;
|
|
|
|
|
- -- ping_ip = "填入可靠的并且可以ping通的ip地址",
|
|
|
|
|
-
|
|
|
|
|
- -- 网卡芯片型号(选填参数),仅spi方式外挂以太网时需要填写。
|
|
|
|
|
- tp = netdrv.CH390,
|
|
|
|
|
- opts = {spi=1, cs=12}
|
|
|
|
|
|
|
+ ETHERNET = {
|
|
|
|
|
+ pwrpin = 140,
|
|
|
|
|
+ tp = netdrv.CH390,
|
|
|
|
|
+ opts = {spi = 1, cs = 12}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
})
|
|
})
|
|
|
-
|
|
|
|
|
- -- 初始化以太网卡
|
|
|
|
|
-
|
|
|
|
|
- -- 以太网联网成功(成功连接路由器,并且获取到了IP地址)后,内核固件会产生一个"IP_READY"消息
|
|
|
|
|
- -- 各个功能模块可以订阅"IP_READY"消息实时处理以太网联网成功的事件
|
|
|
|
|
- -- 也可以在任何时刻调用socket.adapter(socket.LWIP_ETH)来获取以太网是否连接成功
|
|
|
|
|
-
|
|
|
|
|
- -- 以太网断网后,内核固件会产生一个"IP_LOSE"消息
|
|
|
|
|
- -- 各个功能模块可以订阅"IP_LOSE"消息实时处理以太网断网的事件
|
|
|
|
|
- -- 也可以在任何时刻调用socket.adapter(socket.LWIP_ETH)来获取以太网是否连接成功
|
|
|
|
|
-
|
|
|
|
|
- -- 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
|
|
|
|
|
-
|
|
|
|
|
--- 创建并且启动一个task
|
|
|
|
|
--- task的处理函数为netdrv_eth_spi_task_func
|
|
|
|
|
-sys.taskInit(netdrv_eth_spi_task_func)
|
|
|