enc28j60驱动对接

ENC28J60集成了MAC控制器和PHY收发器,用户可以很方便的通过SPI在MCU上实现以太网扩展。

网络对接层

在yoc移植的过程中,如果需要支持WiFi功能(例如有配网需求,参考netmgr即 网络管理器),则需要对相关接口进行移植实现,包含netgprs两部分:

  • NET HAL的接口定义请查看头文件:net_impl.h

  • GPRS HAL的接口定义请查看头文件:gprs_impl.h

NET模块结构体

首先,先了解一下NETHAL相关的一个重要结构体net_ops_t。WiFi特有相关的操作和接口都封装在net_ops_t这个结构体中,相关定义在文件:wifi_impl.h

typedef struct net_ops {
    int (*get_mac_addr)(aos_dev_t *dev, uint8_t *mac);
    int (*set_mac_addr)(aos_dev_t *dev, const uint8_t *mac);

    int (*get_dns_server)(aos_dev_t *dev, ip_addr_t ipaddr[], uint32_t num);
    int (*set_dns_server)(aos_dev_t *dev, ip_addr_t ipaddr[], uint32_t num);

    int (*set_hostname)(aos_dev_t *dev, const char *name);
    const char* (*get_hostname)(aos_dev_t *dev);

    int (*set_link_up)(aos_dev_t *dev);
    int (*set_link_down)(aos_dev_t *dev);

    int (*start_dhcp)(aos_dev_t *dev);
    int (*stop_dhcp)(aos_dev_t *dev);
    int (*set_ipaddr)(aos_dev_t *dev, const ip_addr_t *ipaddr, const ip_addr_t *netmask, const ip_addr_t *gw);
    int (*get_ipaddr)(aos_dev_t *dev, ip_addr_t *ipaddr, ip_addr_t *netmask, ip_addr_t *gw);
    int (*ping)(aos_dev_t *dev, int type, char *remote_ip);

    int (*subscribe)(aos_dev_t *dev, uint32_t event, event_callback_t cb, void *param);
    int (*unsubscribe)(aos_dev_t *dev, uint32_t event, event_callback_t cb, void *param);
} net_ops_t;

NET接口说明

  • get_mac_addr、set_mac_addr

    设置(获取)mac地址

  • get_dns_server、set_dns_server

    设置(获取)dns地址

  • set_hostname、get_hostname

    设置(获取)主机名

  • set_link_up、set_link_down

    断开(连接)设备

  • start_dhcp、stop_dhcp

    启动(停止)dhcp

  • set_ipaddr、get_ipaddr

    设置(获取)ip相关信息,ipaddr、netmask及gw

  • ping

    网络测试(Packet Internet Groper)

  • subscribe、 unsubscribe

    订阅及取消订阅相关事件

eth模块结构体

首先,先了解一下ethHAL相关的一个重要结构体eth_driver_t。WiFi特有相关的操作和接口都封装在eth_driver_t这个结构体中,相关定义在文件:ethernet_impl.h。

typedef struct eth_driver {
    /*common*/
    int (*mac_control)(aos_dev_t *dev, eth_config_t *config);
    int (*set_packet_filter)(aos_dev_t *dev, int type);
    int (*start)(aos_dev_t *dev);
    int (*restart)(aos_dev_t *dev);
    int (*ping)(aos_dev_t *dev, int type, char *remote_ip);
    int (*ifconfig)(aos_dev_t *dev);
} eth_driver_t;
  • mac_control

    物理层配置

    typedef struct eth_config {
        int speed;
        int duplex;
        int loopback;
        uint8_t mac[6];
        void *net_pin;
    } eth_config_t;
    
  • set_packet_filter

    设置包过滤类型

  • start 、restart

    启动(重启)设备

  • ping

    网络测试(Packet Internet Groper)

  • ifconfig

    查看网络设备的状态

使用说明

驱动注册

  void eth_enc28j60_register(utask_t *task, esp_wifi_param_t *param)
  • 示例详解

    主要流程为注册网卡驱动----->启动netmgr微服务(netmgr详细说明 网络管理器

netmgr_hdl_t app_netmgr_hdl;
void enc28j60_init(void)
{
    aos_kv_setint("dhcp_en", 1);                         //开启dhcp功能

    enc28j60_pin_t pin_param = {
        .enc28j60_spi_idx = 0,
        .enc28j60_spi_rst = ENC28J60_ETH_PIN_RST,       //复位脚
        .enc28j60_spi_cs  = ENC28J60_ETH_SPI_CS,        //片选脚
        .enc28j60_spi_interrupt = ENC28J60_ETH_PIN_INT, //中断脚
    };
    eth_config_t eth_param;

    eth_param.net_pin = &pin_param;

    int random = rand();

    eth_param.mac[0] = 0x00;                            //初始化mac
    eth_param.mac[1] = 0x11;
    eth_param.mac[2] = 0x22;
    eth_param.mac[3] = (random >> 16) & 0xFF;
    eth_param.mac[4] = (random >> 8) & 0xFF;
    eth_param.mac[5] = (random) & 0xFF;


    eth_enc28j60_register(&eth_param);                  //注册enc

    app_netmgr_hdl = netmgr_dev_eth_init();             //初始化netmgr eth
    if (app_netmgr_hdl) {
        netmgr_service_init(NULL);                      //初始化netmgr微服务
        netmgr_start(app_netmgr_hdl);                   //启动netmgr微服务
   }
}

​ 在src/init/init.c,board_yoc_init()调用esp8266初始化

void board_yoc_init(void)
{
    ...
    enc28j60_init();
    ...
}

console网络测试

  • 在src/init/cli_cmd.c中的console 命令行增加网络相关命令,方便测试网卡功能
void board_cli_init(utask_t *task)
{
    ...
    cli_reg_cmd_ping();
    cli_reg_cmd_ifconfig();  
    ...
}
  • ifconfig

    使用ifconfig命令,如下图所示

ii

  • ping

    确认连接网络后,使用ping命令测试网络是否连接外网,下图所示已连接

results matching ""

    No results matching ""