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)