1rt_stm32_eth_rx()
rt_stm32_eth_rx 会去读取接收缓冲区中的数据,并放入 pbuf(lwIP 中利用结构体 pbuf 来管理数据包 )中,并返回 pbuf 指针。
网络设备层的“erx” 接收线程会阻塞在获取 eth_rx_thread_mb 邮箱上,当它接收到邮件时,会调用 rt_stm32_eth_rx 去接收数据。
1rt_stm32_eth_tx()
rt_stm32_eth_tx 会将要发送的数据放入发送缓冲区,等待 DMA 来发送数据。
网络设备层的“etx” 发送线程会阻塞在获取 eth_tx_thread_mb 邮箱上, 当它接收到邮件时,会调用 rt_stm32_eth_tx 来发送数据。
ETH 设备初始化:
1static int rt_hw_stm32_eth_init(void)
2INIT_DEVICE_EXPORT(rt_hw_stm32_eth_init);
由系统自动初始化机制调用。
lwip协议栈初始化:
1int lwip_system_init(void)
2INIT_PREV_EXPORT(lwip_system_init)
由系统自动初始化机制调用。
5 使用网卡设备链接服务器
下面示例完成通过传入的网卡名称绑定该网卡 IP 地址并和服务器进行连接通信的过程:
1static int bing_test(int argc, char **argv)
2{
3 struct sockaddr_in client_addr;
4 struct sockaddr_in server_addr;
5 struct netdev *netdev = RT_NULL;
6 int sockfd = -1;
7 int AF = -1;
8 uint8_t send_buf[]= “This is a TCP Client test.。.
”;
9 uint8_t read_buf[10];
10 if (argc != 2)
11 {
12 rt_kprintf(“bind_test [netdev_name] --bind network interface device by name.
”);
13 return -RT_ERROR;
14 }
15 if(rt_strcmp(argv[1], “esp0”) == 0)
16 {
17 AF = AF_AT;
18 }else if(rt_strcmp(argv[1], “e0”) == 0){
19 AF = AF_INET;
20 }else{
21 return -RT_ERROR;
22 }
23 /* 通过名称获取 netdev 网卡对象 */
24 netdev = netdev_get_by_name(argv[1]);
25 if (netdev == RT_NULL)
26 {
27 rt_kprintf(“get network interface device(%s) failed.
”, argv[1]);
28 return -RT_ERROR;
29 }
30 /* 设置默认网卡对象 */
31 netdev_set_default(netdev);
32 if ((sockfd = socket(AF, SOCK_STREAM, 0)) 《 0)
33 {
34 rt_kprintf(“Socket create failed.
”);
35 return -RT_ERROR;
36 }
37
38 /* 初始化需要绑定的客户端地址 */
39 client_addr.sin_family = AF;
40 client_addr.sin_port = htons(8080);
41 /* 获取网卡对象中 IP 地址信息 */
42 client_addr.sin_addr.s_addr = netdev-》ip_addr.addr;
43 rt_memset(&(client_addr.sin_zero), 0, sizeof(client_addr.sin_zero));
44
45 if (bind(sockfd, (struct sockaddr *)&client_addr, sizeof(struct sockaddr)) 《 0)