enc28j60驱动对接
ENC28J60集成了MAC控制器和PHY收发器,用户可以很方便的通过SPI在MCU上实现以太网扩展。
网络对接层
在yoc移植的过程中,如果需要支持WiFi功能(例如有配网需求,参考netmgr即 网络管理器),则需要对相关接口进行移植实现,包含net
及gprs
两部分:
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(ð_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命令,如下图所示
ping
确认连接网络后,使用
ping
命令测试网络是否连接外网,下图所示已连接