ZYNQ7000搭建嵌入式Linux操作系统-增加PL端以太网

  • 一、VIVADO工程建立
  • 二、VIVADO工程设置
  • 三、虚拟机下生成内核和uboot.elf
  • 四、SDK生成设备树和BOOT.bin
  • 五、设备树的生成
  • 六、linaro文件系统
  • 七、系统启动

一、VIVADO工程建立

这部分请参考我上篇讲述搭建操作系统的文章

二、VIVADO工程设置

zynq核的搭建也请参照上篇文章,不过需要增加一些内容;
双击zynq核,进入zynq的配置;

选择PS-PL Configuration,选中General—>Enable Clock Resets—>FCLK_RESET0_N

选中AXI Non Secure Enablement—> GP Master AXI Interface —> M AXI GP0 Interface

选中HP Slave AXI Interface —> S AXI HP0 interface

选择Clock Configuration,选中PL Fabric Clocks —> FCLK_CLK0,并修改Requested Frequency(MHz)

选择Interrupts,打开Fabric Interrupts —> PL-PS Interrupts Ports —> IRQ_F2P[15:0]

单击ok,完成配置;

单击上方的Run Block Automation,弹出的窗口中单击ok;

单击Diagram窗口的+号,输入1g,双击选择添加AXI 1G/2.5G Ethernet Subsystem;

添加了一个新的IP核,这个IP核是用来扩展开发板以太网的,需要申请Tri Mode Ethernet MAC这个ip核的license,申请方法可以参考这个链接

双击此IP核,进入AXI 1G/2.5G Ethernet Subsystem的配置,并按照下图配置;(这个根据自己的开发板配的以太网PHY模块进行配置,我的是RGMII)

其他页面不需要修改,直接点ok;
配置完后,点击上方的Run Block Automation,弹出的页面中使用默认配置,点击ok;


点击上方的Run Connection Automation,弹出窗口;

全部勾中,并使用默认配置,单击ok;

再单击上方的Run Connection Automation,弹出窗口;

依然全部勾中,使用默认配置,点击ok;

点击Diagram窗口上部的加号,输入xlc,添加concat这个ip核;


双击配置这个ip核;

把Number of Ports改为4,单击ok;

然后按照黄线这样进行连线;

connect_bd_net [get_bd_pins axi_ethernet_0/mac_irq] [get_bd_pins xlconcat_0/In0]
connect_bd_net [get_bd_pins axi_ethernet_0/interrupt] [get_bd_pins xlconcat_0/In1]
connect_bd_net [get_bd_pins axi_ethernet_0_dma/mm2s_introut] [get_bd_pins xlconcat_0/In2]
connect_bd_net [get_bd_pins axi_ethernet_0_dma/s2mm_introut] [get_bd_pins xlconcat_0/In3]
connect_bd_net [get_bd_pins processing_system7_0/IRQ_F2P] [get_bd_pins xlconcat_0/dout]


Ctrl+s保存,右键点击Sources 里面的design_1(design_1.bd),在弹出的窗口中点击Create HDL Wrapper…;

在弹出的窗口选择第二项,并点击ok;

Sources窗口里就会生成新的.v顶层文件;

点击左边的Run Synthesis,弹出的窗口都选择默认的选项即可。等待一段时间;

完成综合后,选择第二项,点击ok;

出现新的界面;

点击上方的Window—>I/O Ports;

在下方会出现新窗口,在这个窗口中对管脚进行约束;

在窗口中完成管脚约束后,按下Ctrl+s保存到约束文件中;
约束过的管脚会在Fixed一栏打上勾;

点击左边的Generate Bitstream,等待生成bit流文件成功即可;

三、虚拟机下生成内核和uboot.elf

上一篇中生成的uboot.elf不需要修改,直接可以用;
如果没有生成过uboot.elf,请参考上一篇生成uboot的内容;

本部分主要叙述内核配置和生成;
上一篇文章中讲述了如何使用xilinx_zynq_defconfig生成内核配置,这次咱们要在之前的内核基础上进行修改;
首先进入虚拟机,在图形化界面下进入放置内核源码的目录,我的放在了/home/<用户名>/Download/下;
进入文件夹,右键单击文件夹内空白处,点击Open in Terminal;

输入命令:

sudo su
<输入密码,不可见>
apt-get install libncurses5-dev -y
source /tools/Xilinx/SDK/2019.1/settings64.sh
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- xilinx_zynq_defconfig //这里是拷贝zynq的默认内核配置
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf menuconfig

进入内核配置界面;

使用方法在上方有说明。
现在我要搭建PL端的以太网,以太网的PHY用的是Marvell的,那我就移动到Device Drivers—> Network device support —> Ethernet driver support —> Marvell devices,按下y将这个选项勾上;

然后用到了Xilinx的1g/2.5g Ethernet Subsystem,这个也要添加驱动,这个驱动的位置在Device Drivers—> Network device support —> Ethernet driver support —> Xilinx Devices ,默认是打开的,所以不需要更改;

接着按下左右键,移动光标到save上,保存配置到.config,再疯狂双击esc,双击数次后就能退出配置界面到命令行了;


退回Terminal后,输入下面的命令;

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage LOADADDR=0x8000

稍等片刻,等待编译完成,就能在/home/<用户名>/Downloads/linux-xlnx-xilinx-v2019.1/arch/arm/boot/下能看到生成的内核文件uImage。
将生成的uImage拷贝到/home/<用户名>/Documents/pl_ethernet里

四、SDK生成设备树和BOOT.bin

流程和上一篇的一模一样,请参考上一篇内容;
生成的文件的区别就是多了个pl.dtsi,内容是这样的;

/ {amba_pl: amba_pl {#address-cells = <1>;#size-cells = <1>;compatible = "simple-bus";ranges ;//这里描述的是1g/2.5g Ethernet Subsystem这个ip核的配置axi_ethernet_0: ethernet@41000000 {axistream-connected = <&axi_ethernet_0_dma>;axistream-control-connected = <&axi_ethernet_0_dma>;clock-frequency = <100000000>;clock-names = "s_axi_lite_clk axis_clk gtx_clk ref_clk";clocks = <&clkc 15>, <&clkc 15>, <&misc_clk_0>, <&misc_clk_1>;compatible = "xlnx,axi-ethernet-7.1", "xlnx,axi-ethernet-1.00.a";device_type = "network";interrupt-names = "mac_irq interrupt";interrupt-parent = <&intc>;interrupts = <0 29 1 0 30 4>;local-mac-address = [00 0a 35 00 00 00];//eth1的mac地址phy-mode = "rgmii";reg = <0x41000000 0x10000>;xlnx = <0x0>;xlnx,axiliteclkrate = <0x0>;xlnx,axisclkrate = <0x0>;xlnx,clockselection = <0x0>;xlnx,enableasyncsgmii = <0x0>;xlnx,gt-type = <0x0>;xlnx,gtinex = <0x0>;xlnx,gtlocation = <0x0>;xlnx,gtrefclksrc = <0x0>;xlnx,include-dre ;xlnx,instantiatebitslice0 = <0x0>;xlnx,phy-type = <0x3>;xlnx,phyaddr = <0x1>;xlnx,phyrst-board-interface-dummy-port = <0x0>;xlnx,rable = <0x0>;xlnx,rxcsum = <0x0>;xlnx,rxlane0-placement = <0x0>;xlnx,rxlane1-placement = <0x0>;xlnx,rxmem = <0x1000>;xlnx,rxnibblebitslice0used = <0x0>;xlnx,tx-in-upper-nibble = <0x1>;xlnx,txcsum = <0x0>;xlnx,txlane0-placement = <0x0>;xlnx,txlane1-placement = <0x0>;axi_ethernet_0_mdio: mdio {#address-cells = <1>;#size-cells = <0>;};};//这里是两个由Clock Wizard生成的时钟,一个125M,1个200Mmisc_clk_0: misc_clk_0 {#clock-cells = <0>;clock-frequency = <125000000>;compatible = "fixed-clock";};misc_clk_1: misc_clk_1 {#clock-cells = <0>;clock-frequency = <200000000>;compatible = "fixed-clock";};//以太网ip外面自动配置上的DMA的配置axi_ethernet_0_dma: dma@40400000 {#dma-cells = <1>;axistream-connected = <&axi_ethernet_0>;axistream-control-connected = <&axi_ethernet_0>;clock-names = "s_axi_lite_aclk m_axi_sg_aclk m_axi_mm2s_aclk m_axi_s2mm_aclk";clocks = <&clkc 15>, <&clkc 15>, <&clkc 15>, <&clkc 15>;compatible = "xlnx,eth-dma";interrupt-names = "mm2s_introut s2mm_introut";interrupt-parent = <&intc>;interrupts = <0 31 4 0 32 4>;reg = <0x40400000 0x10000>;xlnx,include-dre ;};};
};

将生成的BOOT.bin拷贝到/home/<用户名>/Documents/pl_ethernet里

五、设备树的生成

将SDK(Windows环境)生成的设备树文件夹传入虚拟机中;

修改system-top.dts的内容;
原内容为:(注意还是有格式的问题)

/dts-v1/;
#include "zynq-7000.dtsi"
#include "pl.dtsi"
#include "pcw.dtsi"
/ {chosen {bootargs = "console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=0 earlycon";stdout-path = "serial0:115200n8";};aliases {ethernet0 = &gem0;ethernet1 = &axi_ethernet_0;serial0 = &uart1;spi0 = &qspi;};memory {device_type = "memory";reg = <0x0 0x20000000>;};
};

修改为:

/dts-v1/;
/include/ "zynq-7000.dtsi"
/include/ "pl.dtsi"
/include/ "pcw.dtsi"
/ {chosen {bootargs = "console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=0 earlycon";stdout-path = "serial0:115200n8";};aliases {ethernet0 = &gem0;ethernet1 = &axi_ethernet_0;serial0 = &uart1;spi0 = &qspi;};memory {device_type = "memory";reg = <0x0 0x20000000>;};
};
//添加关于pl以太网的节点描述,仅供参考
&axi_ethernet_0 {phy-handle = <&phy0>;xlnx,has-mdio = <0x1>;phy-mode = "rgmii-rxid";mdio {#address-cells = <1>;#size-cells = <0>;phy0: phy@0 {device_type = "ethernet-phy";reg = <0>;};};
};

然后在这个文件夹下,右键单击空白处,选择open Terminal进入命令行,输入下面命令;

dtc -I dts -O dtb -o devicetree.dtb system-top.dts

就能在文件夹下看到生成的devicetree.dtb了。
将生成的devicetree.dtb拷贝到/home/<用户名>/Documents/pl_ethernet里

六、linaro文件系统

具体流程还是和上一篇一样,只不过制作过SD卡的就不需要动第二分区(EXT4)的文件了,只需要将第一分区(FAT32)的三个启动文件替换为/home/<用户名>/Documents/pl_ethernet下的三个文件即可。

七、系统启动

现在把SD卡插到开发板的SD卡插槽中,连接USB串口,上电启动。
在putty中设置串口的参数(串口名在设备管理器中查看,波特率为115200)就可以看到系统正常启动了。
并能看到新增的以太网模块;

ZYNQ7000搭建嵌入式Linux操作系统---增加PL端外设(以太网)篇相关推荐

  1. ZYNQ7000搭建嵌入式Linux操作系统---基础篇

    ZYNQ7000搭建Linux操作系统 ZYNQ7000搭建嵌入式Linux操作系统 一.VIVADO工程的建立 二.VIVADO工程设置 三.在虚拟机环境下生成内核镜像uImage和uboot.el ...

  2. ubuntu20.04.1 64位搭建嵌入式linux开发环境

    目录 背景 开发环境的搭建 1.交叉编译工具的安装 2.开发工具和依赖库的安装 2.1. 必需部分 2.2.可选部分 ubuntu20.04.1 64位配置和编译Linux3.0内核 背景 市面上的嵌 ...

  3. 嵌入式linux操作系统

    2. 怎么学习嵌入式Linux操作系统 本文假设您是零基础,以实用为主,用最快的时间让你入门:后面也会附上想深入学习时可以参考的资料. 在实际工作中,我们从事的是"操作系统"周边的 ...

  4. 构建嵌入式系统软件开发环境-VMware的安装及搭建嵌入式Linux开发环境

    嵌入式系统操作系统 目前流行的嵌入式操作系统主要有VxWorks.WindowsCE.Linux等,由于Linux的源码开放性.内核可裁剪性.在图像处理.文件管理及多任务支持等诸多方面的特点,使得它成 ...

  5. 常用的几种嵌入式Linux操作系统

    编辑器加载中...常用的几种嵌入式Linux操作系统 上海市浦东科技信息中心 石习 摘编 2010-08-13 关键字:嵌入式 操作系统 Linux 浏览量:22 以应用为中心,以计算机技术为基础,软 ...

  6. 在Windows使用VSCode搭建嵌入式Linux开发环境

    在Windows使用VSCode搭建嵌入式Linux开发环境 百问网已经制作好了完备的Ubuntu镜像,可以从这里下载: 链接:https://pan.baidu.com/s/1vw4VUV_Mvt0 ...

  7. 嵌入式Linux操作系统学习规划,学习嵌入式开发需要哪些知识?

    嵌入式Linux操作系统学习规划 ARM+LINUX路线,主攻嵌入式Linux操作系统及其上应用软件开发目标: (1) 掌握主流嵌入式微处理器的结构与原理(初步定为arm9) (2) 必须掌握一个嵌入 ...

  8. 嵌入式Linux操作系统学习规划 (转)

    ARM+LINUX路线,主攻嵌入式Linux操作系统及其上应用软件开发目标: (1) 掌握主流嵌入式微处理器的结构与原理(初步定为arm9) (2) 必须掌握一个嵌入式操作系统 (初步定为uclinu ...

  9. Linux学习之云服务器搭建嵌入式Linux开发环境

    Linux学习之云服务器搭建嵌入式Linux开发环境 第一步:购买云服务器 进入腾讯云官方网站腾讯云官方网站 选择云+校园云+校园 进入控制台 将云服务器系统设置为Ubuntu系统 使用Xshell6 ...

最新文章

  1. 2017秋-软件工程第十二次作业(三)-版本控制报告(个人)
  2. GARFIELD@02-10-2005
  3. 对函数指针与typedef的理解:typedef void (*sighandler_t)(int)
  4. 频谱泄露 振动 matlab,关于MATLAB FFT频谱泄露和加窗
  5. linux sed命令替换目标字符串所在行整行为给定值
  6. C++多态,虚函数,纯虚函数
  7. Python中字符串操作函数string.split('str1')和string.join(ls)
  8. onesignal php,PHP FPM源代码反刍品味之五:信号signal处理
  9. Cloud一分钟 | Gartner发布2018年第二季度全球服务器市场报告;中信银行联合腾讯云推出手机银行智能语音产品...
  10. ARM交叉编译工具arm-linux-gcc安装
  11. ZooKeeper官方文档学习笔记03-程序员指南02
  12. PLC+智能网关,实现HTTP+JSON/XML+POST/GET请求与解析
  13. 常见电子书类型及阅读器
  14. SQL server 服务报 远程过程调用失败0x800706be
  15. 一部手机全搞定,抖音发工资了,一共2千多,方法人人可以用
  16. 自然语言处理(NLP)常用开源工具总结----不定期更新
  17. Qt笔记(四十一)之qtcreator添加pri文件
  18. 基于beaglebone的rtems4.12源码编译生成image镜像并烧入sd卡
  19. 【思维·状压】 jzoj1434灌水(COCI2009) 纪中集训提高B组
  20. 实践出真知!7步搞懂分布式全内容,技术总监都拍手叫好

热门文章

  1. android webview生成长图,Android 生成长图并添加水印(二)
  2. 复平面上gamma函数_复变量Gamma函数及解析性质
  3. linux 安装lnmp环境,centos下配置LNMP环境(源码安装)
  4. layui弹出层中添加文本框
  5. 计算机数字媒体专业毕业论文,数字媒体技术本科毕业论文选题.docx
  6. 关于uniapp上传文件的一些api文档
  7. android百度测试,【腾讯百度测试面试题】面试问题:Android… - 看准网
  8. 管道/查明文件夹中图片个数
  9. 基于sklearn的人工神经网络
  10. unturned显示在服务器列表,unturned一进服务器就这样