G01-ethernet_guide.md

G01-ethernet_guide.md

社蕙 492 2022-08-28

以太网使用指南

注意:本文档创建时间较久,有过时的可能性。

1. 裸机以太网

本节仅在Zybo上验证过,可能过时

1.1. 硬件端

1.1.1. vivado

以太网端口完全在ps端,因此,只需要在bd中配置好zynq-7000核即可(官方板子一般可以run block automation),并正常导出.xsa

1.1.2. 路由器

测试环境要求有一台支持dhcp 的路由器,开发板将连接路由器可以自动获取 IP 地址,实验主机和开发板在一个网络,可以相互通信。

1.2. 软件端

1.2.1. 准备工作

串口工具:推荐安装./tool/putty-64bit-0.76-installer.msi,也可以用Vitis Serial Terminal,但这个页面每次重新烧写会被console盖掉,很烦。
网络工具:./tool/NetAssist.exe

1.2.2. vitis例程测试流程

下面以官方的例程为例,建立一次连接。

  1. 利用1.1中的xsa建立Application Project,在template阶段选择lwip Echo Sever(这样做可以在不导入任何自有资源的情况下直接测试ETH端口,并且例程会帮助你在BSP libraries里面勾选lwip库,否则需要打开*.spr -> 选择standalone on.../BSP -> Modify BSP Settings...,手动勾选lwip)
  2. build,并debug As... -> Launch on hardware
  3. 选择正确的COM口,建立URAT连接
  4. run,串口将打印Waiting for PHY to complete autonegotiation.,等待路由器分配IP完成将打印Board IP: 192.168.xxx.xxx()
  5. 打开NetAssist,设置协议类型为TCP Client,主机地址填入上一步打印的Board IP,端口选择7,并连接。
  6. 此时板子应该能够复读主机发送的内容

1.2.3. 图片传输服务器

1.2.3.1. 代码解析

代码在./src/c/img_tx中。

main函数中,在dma传输之后,开始以太网服务器的初始化,start_application();将进入echo.c——这是实现echo server的关键函数。之后,start_application()对pcb结构体进行初始化(我事实上不清楚这个pcb是怎么成为一个全局变量的,并没有任何人给它传参啊?),以回调函数的形式进行tcp_accept(pcb, accept_callback);,而accept_callback()函数中再以回调函数的形式进行tcp_recv(newpcb, recv_callback);,这个recv_callback()因此成为响应TCP client的重要函数(但是,响应中是如何进入recv_callback()的,仍不清楚)。

err_t recv_callback(void *arg, struct tcp_pcb *tpcb,
                               struct pbuf *p, err_t err)
{
 /* do not read the packet if we are not in ESTABLISHED state */
 if (!p) {
  tcp_close(tpcb);
  tcp_recv(tpcb, NULL);
  return ERR_OK;
 }

 /* 接收client端的包,内容存在结构体p中 */
 tcp_recved(tpcb, p->len);

 /* echo back the payload */
 /* in this case, we assume that the payload is < TCP_SND_BUF */
 /* 如果直接返回内容,那么下面的注释代码就做到了这一点,否则,
 我们就需要从p->payload中提取我们所想要的内容,再返回,如下面的函数 */
 img_tx(tpcb,p,err);
// if (tcp_sndbuf(tpcb) > p->len) {
//  err = tcp_write(tpcb, p->payload, p->len, 1);
// } else
//  xil_printf("no space in tcp_sndbuf\n\r");

 /* free the received pbuf */
 pbuf_free(p);

 return ERR_OK;
}

img_tx(tpcb,p,err)在接收到client端发送的SENT字符串后,会发送一行(800*2宽)的像素,最多发送1200次后,将只会返回SENT over

1.2.3.2. 代码使用

下面介绍四倍宽猫猫图例程的操作

  1. 在2.1的基础上,右键*_wrapperNew...-> Others... -> Xilinx/Application Project,导入代码,build然后开run
  2. 在网络调试助手中输入SENT
    1. 左边循环发送设置为1ms10ms肯定是能run的)
    2. 接收设置为HEX
    3. 选择接收保存到文件
    4. 右下角复位计数
  3. 点击发送,在TX快接近4800或者前面的“接收/发送”的发送快接近1200时停止,转为手动发送(或者之后手动删去文件若干个结尾的SENT over),得到四倍宽猫猫图的纯像素数据。

加入文件头后如下图所示

四倍宽猫猫图

为什么叫猫猫图,才不是卖萌,是因为图里真有两只猫

2. linux以太网-tftp

参考Windows与嵌入式linux设备数据传送工具——tftpd32软件使用说明

2.1. 安装tftpd

我下载的是tftpd64但是流程是一样的,setup文件在tool文件夹中。

2.2. 配置服务器

首先将tftpd32软件下载安装至windows下,打开主界面,默认在Tftp Sever,选择工作文件夹路径以及配置IP。

确定ip的方法如下:win+R打开cmd,输入ipconfig查询ip,以太网适配器一栏中的IPv4地址是:

连接特定的 DNS 后缀 . . . . . . . :
   IPv4 地址 . . . . . . . . . . . . : 192.168.31.150

2.3. 互ping

在linux中,输入ifconfig查询IP,eth0中的inet addr是板子的IP。

接下来两方互ping,没问题就可以开始传送文件。

2.4. 收发文件

若从Windows下载文件到Linux:tftp -r 文件 -g Windows的IP地址
若从Linux上传文件至Windows:tftp -l 文件 -p Windows的IP地址

-g 表示下载文件 (get)
-p 表示上传文件 (put)
-l 表示本地文件名 (local file)
-r 表示远程主机的文件名 (remote file)

3. linux以太网-scp

3.1. 收发文件

参考使用scp在windows和Linux之间互传文件

在win系统上,使用cmd传输本地文件到远端linux系统命令:

scp /d/test.txt root@192.168.31.38:/root

冒号不可省略,不可断开。

4. 其他问题

4.1. NetAssist 连接不到 192.168.1.10:7

事实上如果uart报告Board IP是192.168.1.10那基本是寄了,如果连不上我也不知道怎么靠谱的解决,一般来说尝试以下方法的是递进有效的:

  • 重启板子/重新烧录
  • 试着重新生成硬件平台,重新编译软件

4.2. NetAssist闪退

如果NetAssist突然从底边栏消失了,请检查一下小图标托盘,它可能在那里,一般不会崩溃式闪退。

4.3. cmd无法cd到其他盘

尝试

d:

4.4. Unable to negotiate with <IP> port 22

应该是当前的shell所用的ssh与片上不能正常通信,考虑更换shell或者更改配置。

4.5. WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED

问题在于每一次板子重新开机,它都会生成一段新的ssh,所以上一次通信留下的东西的ssh就是旧的。

参考How To Fix the “Warning: Remote Host Identification Has Changed” Error,打开C:\Users\社蕙\.ssh\known_hosts,删去板子ip对应的ssh,例如:

192.168.31.38 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCbnMQ/Eq3LS4XXT5wrCUSlbaaMrGB54tMqiFIzoqFtiAZnhBr4ze9Z8ovzLY++OBE9TNA6QOq+n721r8ZA17uxowu35Z30k3Jt3WL/BaNbEgLRboYWRpVJOGt8Z4m87ACMtzEGJzqZ2SAV05KXJcBzzW1Y6QEWr2/UPclSOajMYO04iTSrnajrBl8D1ArvAezrh+wYMNMKWDH+YPfomQZ4xoNBFcfSwm5lkSSjE5LrTgm7dSaX8RhfY338VldOamaKwrmjHyHaX6azDQfXS90HxSVNxFT0H3/fggk+imRwflg2a7m/WkV8FVQFYj/7yRqg79drUW58rQP9015Vm8QF

局域网电脑互相ping不通的解决办法

参考局域网电脑互相ping不通的解决办法

控制面板--系统和安全--Windows防火墙--高级设置:入站规则

允许回显请求

5. 其他参考