以太网使用指南
注意:本文档创建时间较久,有过时的可能性。
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中的xsa建立Application Project,在template阶段选择lwip Echo Sever(这样做可以在不导入任何自有资源的情况下直接测试ETH端口,并且例程会帮助你在BSP libraries里面勾选lwip库,否则需要打开
*.spr
-> 选择standalone on.../BSP
->Modify BSP Settings...
,手动勾选lwip) - build,并
debug As...
->Launch on hardware
- 选择正确的COM口,建立URAT连接
- run,串口将打印
Waiting for PHY to complete autonegotiation.
,等待路由器分配IP完成将打印Board IP: 192.168.xxx.xxx
() - 打开NetAssist,设置协议类型为
TCP Client
,主机地址填入上一步打印的Board IP
,端口选择7,并连接。 - 此时板子应该能够复读主机发送的内容
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. 代码使用
下面介绍四倍宽猫猫图例程的操作
- 在2.1的基础上,右键
*_wrapper
,New...
->Others...
->Xilinx/Application Project
,导入代码,build然后开run - 在网络调试助手中输入
SENT
,- 左边循环发送设置为
1ms
(10ms
肯定是能run的) - 接收设置为
HEX
- 选择接收保存到文件
- 右下角复位计数
- 左边循环发送设置为
- 点击发送,在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. 收发文件
在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不通的解决办法
控制面板--系统和安全--Windows防火墙--高级设置:入站规则
允许回显请求
5. 其他参考
- Xilinx ZYNQ+TCP通信+Python上位机 实现实时视频传输系统:作者是魔改了echo server,虽然没有工程文件,但看起来有可操作性。
- Zynq 7000裸机的lwip 样例程序echo server 实验:作者解释了一下echo server的东西