netdrv_multiple.lua 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. --[[
  2. @module netdrv_multiple
  3. @summary 多网卡(WIFI STA网卡、通过MAC层的rmii接口外挂PHY芯片(LAN8720Ai)的以太网卡、通过SPI外挂CH390H芯片的以太网卡、通过SPI外挂4G模组的4G网卡)驱动模块
  4. @version 1.0
  5. @date 2025.07.24
  6. @author 朱天华
  7. @usage
  8. 本文件为多网卡驱动模块 ,核心业务逻辑为:
  9. 1、调用exnetif.set_priority_order配置多网卡的控制参数以及优先级;
  10. 通过MAC层的rmii接口外挂PHY芯片(LAN8720Ai)的以太网卡:
  11. Air8101核心板和AirPHY_1000配件板的硬件接线方式为:
  12. Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端);
  13. 如果测试发现软件重启,并且日志中出现 poweron reason 0,表示供电不足,此时再通过直流稳压电源对核心板的VIN管脚进行5V供电;
  14. | Air8101核心板 | AirPHY_1000配件板 |
  15. | ------------ | ------------------ |
  16. | 59/3V3 | 3.3v |
  17. | gnd | gnd |
  18. | 5/D2 | RX1 |
  19. | 72/D1 | RX0 |
  20. | 71/D3 | CRS |
  21. | 4/D0 | MDIO |
  22. | 6/D4 | TX0 |
  23. | 74/PCK | MDC |
  24. | 70/D5 | TX1 |
  25. | 7/D6 | TXEN |
  26. | 不接 | NC |
  27. | 69/D7 | CLK |
  28. 通过SPI外挂CH390H芯片的以太网卡(此网卡和4G网卡硬件连接有冲突,如果使用以太网,可以优先使用rmii接口的以太网卡,如果必须使用spi以太网卡,注意更换以太网或者4G网卡使用的spi,不要冲突):
  29. Air8101核心板和AirETH_1000配件板的硬件接线方式为:
  30. Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端);
  31. 如果测试发现软件重启,并且日志中出现 poweron reason 0,表示供电不足,此时再通过直流稳压电源对核心板的VIN管脚进行5V供电;
  32. | Air8101核心板 | AirETH_1000配件板 |
  33. | --------------- | ----------------- |
  34. | 59/3V3 | 3.3v |
  35. | gnd | gnd |
  36. | 28/DCLK | SCK |
  37. | 54/DISP | CSS |
  38. | 55/HSYN | SDO |
  39. | 57/DE | SDI |
  40. | 14/GPIO8 | INT |
  41. 通过SPI接口外挂4G模组(Air780EHM/Air780EHV/Air780EGH/Air780EPM)的4G网卡:
  42. Air8101核心板和Air780EHM/Air780EHV/Air780EGH/Air780EPM核心板或者开发板的硬件接线方式,参考netdrv_4g.lua的文件头注释;
  43. 本文件没有对外接口,直接在其他功能模块中require "netdrv_multiple"就可以加载运行;
  44. ]]
  45. local exnetif = require "exnetif"
  46. -- 网卡状态变化通知回调函数
  47. -- 当exnetif中检测到网卡切换或者所有网卡都断网时,会触发调用此回调函数
  48. -- 当网卡切换切换时:
  49. -- net_type:string类型,表示当前使用的网卡字符串
  50. -- adapter:number类型,表示当前使用的网卡id
  51. -- 当所有网卡断网时:
  52. -- net_type:为nil
  53. -- adapter:number类型,为-1
  54. local function netdrv_multiple_notify_cbfunc(net_type,adapter)
  55. if type(net_type)=="string" then
  56. log.info("netdrv_multiple_notify_cbfunc", "use new adapter", net_type, adapter)
  57. elseif type(net_type)=="nil" then
  58. log.warn("netdrv_multiple_notify_cbfunc", "no available adapter", net_type, adapter)
  59. else
  60. log.warn("netdrv_multiple_notify_cbfunc", "unknown status", net_type, adapter)
  61. end
  62. end
  63. local function netdrv_multiple_task_func()
  64. --设置网卡优先级
  65. exnetif.set_priority_order(
  66. {
  67. -- “通过MAC层的rmii接口外挂PHY芯片(LAN8720Ai)”的以太网卡,可以使用Air8101核心板+AirPHY_1000配件板验证
  68. {
  69. ETHERNET = {
  70. -- 供电使能GPIO,此demo使用的59脚3V3供电,受GPIO13控制
  71. pwrpin = 13,
  72. -- 设置的多个“已经IP READY,但是还没有ping通”网卡,循环执行ping动作的间隔(单位毫秒,可选)
  73. -- 如果没有传入此参数,exnetif会使用默认值10秒
  74. ping_time = 3000,
  75. -- 连通性检测ip(选填参数);
  76. -- 如果没有传入ip地址,exnetif中会默认使用httpdns能否成功获取baidu.com的ip作为是否连通的判断条件;
  77. -- 如果传入,一定要传入可靠的并且可以ping通的ip地址;
  78. -- ping_ip = "填入可靠的并且可以ping通的ip地址",
  79. }
  80. },
  81. -- “通过SPI外挂CH390H芯片”的以太网卡,可以使用Air8101核心板+AirETH_1000配件板验证
  82. -- {
  83. -- ETHUSER1 = {
  84. -- -- 供电使能GPIO,此demo使用的59脚3V3供电,受GPIO13控制
  85. -- pwrpin = 13,
  86. -- -- 设置的多个“已经IP READY,但是还没有ping通”网卡,循环执行ping动作的间隔(单位毫秒,可选)
  87. -- -- 如果没有传入此参数,exnetif会使用默认值10秒
  88. -- ping_time = 3000,
  89. -- -- 连通性检测ip(选填参数);
  90. -- -- 如果没有传入ip地址,exnetif中会默认使用httpdns能否成功获取baidu.com的ip作为是否连通的判断条件;
  91. -- -- 如果传入,一定要传入可靠的并且可以ping通的ip地址;
  92. -- -- ping_ip = "填入可靠的并且可以ping通的ip地址",
  93. -- -- 网卡芯片型号(选填参数),仅spi方式外挂以太网时需要填写。
  94. -- tp = netdrv.CH390,
  95. -- opts = {spi=0, cs=15}
  96. -- }
  97. -- },
  98. -- WIFI STA网卡
  99. {
  100. WIFI = {
  101. -- 要连接的WIFI路由器名称
  102. ssid = "茶室-降功耗,找合宙!",
  103. -- 要连接的WIFI路由器密码
  104. password = "Air123456",
  105. -- 连通性检测ip(选填参数);
  106. -- 如果没有传入ip地址,exnetif中会默认使用httpdns能否成功获取baidu.com的ip作为是否连通的判断条件;
  107. -- 如果传入,一定要传入可靠的并且可以ping通的ip地址;
  108. -- ping_ip = "填入可靠的并且可以ping通的ip地址",
  109. }
  110. }
  111. }
  112. )
  113. end
  114. -- 设置网卡状态变化通知回调函数netdrv_multiple_notify_cbfunc
  115. exnetif.notify_status(netdrv_multiple_notify_cbfunc)
  116. -- 如果存在udp网络应用,并且udp网络应用中,根据应用层的心跳能够判断出来udp数据通信出现了异常;
  117. -- 可以在判断出现异常的位置,调用一次exnetif.check_network_status()接口,强制对当前正式使用的网卡进行一次连通性检测;
  118. -- 如果存在tcp网络应用,不需要用户调用exnetif.check_network_status()接口去控制,exnetif会在tcp网络应用通信异常时自动对当前使用的网卡进行连通性检测。
  119. -- 启动一个task,task的处理函数为netdrv_multiple_task_func
  120. -- 在处理函数中调用exnetif.set_priority_order设置网卡优先级
  121. -- 因为exnetif.set_priority_order要求必须在task中被调用,所以此处启动一个task
  122. sys.taskInit(netdrv_multiple_task_func)