文章目录
- 一、内容介绍
- 二、实现步骤
- 2.1 petalinux和vivado配置步骤
- 2.1.1 vivado配置
- 2.1.2 petalinux配置
- 2.2 linux系统(串口)
- 2.2.1 u-boot系统
- 2.2.2 linux系统
- 2.3 petalinux和vivado相关
- 2.3.1 TCP服务器程序
- 2.3.2 BRAM读写
一、内容介绍
ZYNQ的PL端读写BRAM,PS端网口通信相关内容
二、实现步骤
2.1 petalinux和vivado配置步骤
2.1.1 vivado配置
zynq:串口uart14-15
网口ENET 0
SD(使用SD卡启动要打开)
AXI BRAM Controller
Block Memory Genrator
自定义的PL端读取BRAM数据的IP核
生成.xsa文件用在petalinux配置中。
2.1.2 petalinux配置
petalinux-config --get-hw-description /mnt/hgfs/Share/7020_hdf/dds_signal_sd/
创建文件夹-基于.xsa配置-file:///mnt/hgfs/Share/downloads/mnt/hgfs/Share/sstate_arm/arm
sptl-petalinux-build
- 修改设备树
/home/zynqxue/workspace/Embedded_vitis/linux_dds/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
修改完成之后重新编译设备树petalinux-build -c device-tree
编译整体:petalinux-build
#include<dt-bindings/gpio/gpio.h>#include<dt-bindings/input/input.h>#include<dt-bindings/media/xilinx-vip.h>#include<dt-bindings/phy/phy.h>/{model="Alientek Navigator Zynq Development Board";compatible="xlnx,zynq-zc702","xlnx,zynq-7000";leds{compatible="gpio-leds";gpio-led1{label="led2";gpios=<&gpio00GPIO_ACTIVE_HIGH>;default-state="on";};gpio-led2{label="led1";gpios=<&gpio054GPIO_ACTIVE_HIGH>;linux,default-trigger="heartbeat";};gpio-led3{label="ps_led0";gpios=<&gpio07GPIO_ACTIVE_HIGH>;default-state="on";};gpio-led4{label="ps_led1";gpios=<&gpio08GPIO_ACTIVE_HIGH>;linux,default-trigger="timer";};};制作BOOT.BIN启动文件
petalinux-package --boot --fsbl --fpga --u-boot --force制作SD启动卡
cp xxx /media/zynqxue/bootsyncsudo umount /media/zynqxue/*
启动流程:
BootROM—>FSBL—>bitstream—>U-Boot—>ZImage—>RootFs
修改这部分"Image Packaging Configuration " 菜 单 下 的"Root filesystem
type(INITRAMFS)”子菜单下,BOOT.BIN的组成会不同。
(1) petalinux-config配置INITRD启动。
(a) boot块的内容:
BOOT.BIN 包含 zynq_fsbl.elf+u-boot.elf+system.dtb+system_wrapper.bit
image.ub 是打包后的 zImage + dtb + 根文件系统(推荐方式)
boot.scr 是启动脚本(非必须,看是否启用了)把这三个文件放到sd卡的boot分区。
(b) rootfs无内容
(2) petalinux-config配置ext4(sd)启动。
(a) boot块的内容:
BOOT.BIN 包含 zynq_fsbl.elf+u-boot.elf
boot.scr
system.dtb
system_wrapper.bit
ZImage
(b) rootfs块的内容
解压bootfs.tar.gz的内容
2.2 linux系统(串口)
2.2.1 u-boot系统
查看SD卡的分区1中包含的文件,就是在ubuntu中写入的sd卡的启动文件。ls mmc 0:1
启动linux内核boot
2.2.2 linux系统
进入根目录
cd /查看根目录下的内容
ls查看设备的节点
ls /proc/device-tree
没有修改设备树,设备树是空的,节点情况:
对应文件夹里面的节点内容(没有修改设备树,它也能正常识别?)petalinux自动识别xsa文件得到的设备树内容:
这个路径下:/petalinux/Bdds-dds/components/plnx_workspace/device-tree/device-tree
system-top.dts顶层设备树(包含 AXI 外设等)
pl.dtsiPL部分,Vivado生成的(比如 axi_bram_ctrl@40000000 )
psu.dtsi / zynq-7000.dtsiPS部分,标准片上系统外设,不能修改
system-conf.dtsi默认基础配置文件(不能修改)
pcw.dtsi描述 Vivado PS 外设启用状态
system-user.dtsi可以自定义的额外内容(project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi)
2.3 petalinux和vivado相关
2.3.1 TCP服务器程序
编写应用程序:
设置交叉编译环境:. /opt/petalinux/2020.2/environment-setup-cortexa9t2hf-neon-xilinx-linux-gnueabi
生成可执行文件:$CC tcp_server.c -o tcp_server
把应用程序的可执行文件放在SD卡的第二分区:cp tcp_server /media/zynqxue/rootfs/appfile
在linux系统下的路径:/media/sd-mmcblk0p2/appfile#
配置开发板IP(192.168.1.10):ifconfig eth0 192.168.1.10 up
执行TCP服务器程序:root@Bdds-dds:/media/sd-mmcblk0p2/appfile# ./tcp_server
使用网口调试工具进行连接
在ubuntu两个终端进行代码验证
打开终端 A,运行你写的服务器:gcc tcp_server.c command_parser.c -o tcp_serve./tcp_server
终端 A输出:Received: :FREQ 5.1;:POW 12.5;:FREQ?;:POW?;:FOO
–
打开终端 B,运行客户端测试工具(如 nc):nc 127.0.0.1 8080
在终端 B 输入::FREQ 5.1;:POW 12.5;:FREQ?;:POW?;:FOO
终端 B 输出FREQ SET TO 5.100000 MHzPOWER SET TO 12.50 dBmFREQ: 5.100000 MHzPOWER: 12.50 dBmERROR: Unknown Command
2.3.2 BRAM读写
/dev/mem 使用需要 root 权限(一般 rootfs 启动就是 root)
地址 0x40000000 和 0x43C00000 等应与你的设备树匹配(可用 cat /proc/iomem 验证)
如果你想做内核态驱动方案(推荐长期稳定),可以将这些 readl/writel 代码改为 platform_driver 驱动方式
bram_ptr = mmap(NULL, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, mem_fd, BRAM_BASEADDR);
从 mem_fd 打开的设备(如 /dev/mem)中,以读写权限、共享方式,将 BRAM_BASEADDR 开始的物理地址空间映射到用户进程虚拟地址空间中,映射大小为 MAP_SIZE 字节(例如 0x1000 = 4KB)