1# OpenHarmony驱动子系统开发—ETH驱动 2 3## 配置说明 4 5 1. 在lwip_adapter/include/app_ethernet.h中: 6 7 #define USE_DHCP: 当此宏被定义时,表示开启DHCP功能,若需使用静态IP,则注释此宏定义即可 8 9 #define DHCP_TIMEOUT_S:当DHCP功能开启时,此宏定义值表示DHCP超时时间设置 10 11 #define ETH_THREAD_PRIORITY:此宏定义值表示ETH初始化线程的优先级 12 13 以下定义使用静态IP时的IP地址设置: 14 /* STATIC IP */ 15 #define IP_ADDR0 (uint8_t) 192 16 #define IP_ADDR1 (uint8_t) 168 17 #define IP_ADDR2 (uint8_t) 8 18 #define IP_ADDR3 (uint8_t) 200 19 20 /*NETMASK*/ 21 #define NETMASK_ADDR0 (uint8_t) 255 22 #define NETMASK_ADDR1 (uint8_t) 255 23 #define NETMASK_ADDR2 (uint8_t) 255 24 #define NETMASK_ADDR3 (uint8_t) 0 25 26 /*GATEWAY*/ 27 #define GW_ADDR0 (uint8_t) 192 28 #define GW_ADDR1 (uint8_t) 168 29 #define GW_ADDR2 (uint8_t) 8 30 #define GW_ADDR3 (uint8_t) 1 31 32 2. 在lwip_adapter/include/lwipopts.h中: 33 34 此头文件中定义了LWIP的一些基本选项设置,有几个比较重要的参数设置,如下: 35 36 #define MEM_SIZE: 此宏定义了LWIP协议栈使用的内存堆大小 37 38 #define PBUF_POOL_SIZE: 定义了数据收发时的pbuf数量 39 #define PBUF_POOL_BUFSIZE:定义了每个pbuf的大小 40 41 LWIP总内存占用基本 = MEM_SIZE + PBUF_POOL_SIZE*PBUF_POOL_BUFSIZE 42 43 #define TCPIP_THREAD_NAME "TCP/IP" 44 #define TCPIP_THREAD_STACKSIZE 4096 : 这两个宏定义了TCPIP线程运行时的任务名以及栈大小 45 46## 初始化接口说明 47 48 ETH驱动的初始化接口: void ethernet_enable(eth_state_callBack callback); 49 50 此函数实现于:lwip_adapter/src/app_ethernet.c中 51 52 参数callback: 此参数为ETH初始化状态回调函数。 53 54 当调用 ethernet_enable函数,并且注册了状态回调函数后,ETH connect/disConnect状态都会通过此回调返回! 55 56 57## 具体使用步骤 58 59 1. 在main函数中调用 ethernet_enable(eth_callBack)函数,初始化ETH驱动接口,并注册状态回调函数eth_callBack; 60 61 2. 实现回调函数,在回调函数中处理应用程序,例: 62 63 void eth_callBack(EthLinkState state) 64 { 65 static osThreadId_t tcp_client_id = NULL; 66 67 /* ETH连接断开*/ 68 if (state == STATE_UPDATE_LINK_DOWN){ 69 printf("ETH LINK STATE: DisConnected!\r\n"); 70 71 // 断开ETH连接时删除TCP线程 72 osThreadTerminate(tcp_client_id); 73 tcp_client_id = NULL; 74 } 75 /* ETH连接成功*/ 76 else if (state == STATE_UPDATE_LINK_UP){ 77 printf("ETH LINK STATE: Connected!\r\n"); 78 79 // ETH连接成功后 创建TCP线程 80 osThreadAttr_t attr; 81 attr.name = "tcp_client"; 82 attr.attr_bits = 0U; 83 attr.cb_mem = NULL; 84 attr.cb_size = 0U; 85 attr.stack_mem = NULL; 86 attr.stack_size = 1024 * 4; 87 attr.priority = 25; 88 tcp_client_id = osThreadNew((osThreadFunc_t)tcp_client, NULL, &attr); 89 if (tcp_client_id == NULL) 90 { 91 printf("Failed to create tcp_client thread!\n"); 92 } 93 } 94 } 95 96 回调函数原型位于: lwip_adapter/include/app_ethernet.h中 97 98 注意: 回调函数实现时,当ETH连接时创建线程,ETH断开后务必记得删除线程。防止多次连接/断开时,创建多个线程而没有释放,导致程序崩溃! 99 100 101 102