ZYNQ+linuxç½å£è°è¯ç¬è®°ï¼3ï¼PL-ETH
å¨ZYNQä¸ä½¿ç¨gigE Visionåè®®çç½ç»æ¥å£ç¸æºã
第ä¸æ¥ï¼è°éPS侧ç½å£GEM0ï¼Xilinx BSPé»è®¤é 好ï¼ã
第äºæ¥ï¼è°éPS侧ç½å£GEM1ï¼è§åä¸ç¯ææ¡£ï¼å¼åç¬è®°(1)ï¼ã
第ä¸æ¥ï¼è°éPL侧ç½å£ï¼æ¬æéè¿°ï¼ã
第åæ¥ï¼å¨PL侧ç½å£ä¸éªè¯Jumbo Frameç¹æ§ï¼å¹¶å¨åºç¨å±éé gigE Visionåè®®ã
æ ¹æ®ãxappãå¯ç¥ï¼PL侧çPHYæ¯æBase-XåSGMII两ç§é ç½®ï¼è¿ä¸¤ç§é 置对åºä¸¤ç§ä¸åçPHYå¼èæ¥å£ï¼è¿æ¥å°MACï¼ãèæ们çhdfæ件使ç¨çæ¯Base-Xçé ç½®ã
å ³äºç½å£çLinux驱å¨ï¼æ们å¨å®ç½æ¾å°ä¸ä»½èµæï¼ Xilinx Wiki - Zynq PL Ethernet ãèµæå¾é¿ï¼æ们åªçä¸æ们ç¸å ³ç2.4.1 PL Ethernet BSP installation for Base-Xâè¿ä¸ç« èå°±å¯ä»¥äºã
é¦å å¯¼å ¥FPGA设计åäºæä¾çhdfæ件ï¼
å¨å¼¹åºçå¾å½¢çé¢éï¼è¿å ¥Subsystem AUTO Hardware SettingsââEthernet SettingsââPrimary Ethernetï¼ç¡®è®¤å¯ä»¥çå°PL侧ç½ç»è®¾å¤axi_ethernet_0ï¼è¯´æhdfæ件éå·²å å«äºå¿ è¦çç½å£ç¡¬ä»¶ä¿¡æ¯ï¼
ä¸å¾ä¸è¢«éä¸çç½å£å°æ为Linuxä¸ç设å¤eth0ãè¿éæ们é»è®¤éæ©ps7_ethernet_0ï¼å³ä½¿ç¨GEM0ä½ä¸ºé¦éç½å£ã
å¯ç¨Xilinx AXI Ethernet驱å¨
è¿å ¥Device Drivers -- Network device support â éä¸Xilinx AXI Ethernetï¼ä»¥åXilinx Ethernet GEMï¼è¿æ¯PS侧ç½å£ç驱å¨ï¼
è¿å ¥Networking support â éä¸ Random ethaddr if unset
è¿å ¥Device Drivers -- Network device support -- PHY Device support and infrastructure â å¯ç¨Drivers for xilinx PHYs
è¿å ¥~~~~Device Drivers -- DMA Engine Support -â ç¦ç¨~~~~Xilinx AXI DMAS Engine~~~ ï¼å¯¹åºçé 置项å为 ~~ CONFIG_XILINX_DMA ~~~ï¼
注æï¼ Xilinx Wikié对设å¤æ èç¹çå¼ç¨æ误ï¼&axi_ethernetï¼ï¼å¯¼è´ç¼è¯æ¥éï¼åºæ¹ä¸º&axi_ethernet_0ã
注ï¼PL-ETH驱å¨æå¨è·¯å¾ï¼<project>/build/tmp/work-shared/plnx_arm/kernel-source/drivers/net/ethernet/xilinx/xilinx_axienet_main.cåxilinx_axienet_mdio.cã对åºçå æ ¸é 置项为CONFIG_NET_VENDOR_XILINXåCONFIG_XILINX_AXI_EMACã
å¯ç¨ethtoolåtcpdumpï¼è°è¯ç¨ï¼éå¿ é¡»ï¼ï¼
ç¶åå°çæçBOOT.BINåimage.ubæ·è´å°SDå¡æ ¹ç®å½ä¸ï¼å°SDå¡æå ¥æ¿åä¸ï¼ä¸çµè¿è¡ã
ä¸çµåï¼ä½¿ç¨ifconfig eth1æ¥çç½å£ä¿¡æ¯ï¼è§å¯MACå°åä¸è®¾ç½®çä¸è´ï¼ä¸ifconfig eth1 ..1. up没ææ¥éã
æµè¯ç½ç»éè·¯ï¼ping PCæ¯éçã说æç½å£å·¥ä½æ£å¸¸ã
Linuxä¸eth1ï¼å³PL-ETHï¼çMACå°åæ误
é®é¢æè¿°ï¼
å¼æºæå°ï¼
注æï¼
MACå°åæ¯éçï¼é©±å¨é解æåºçæ¯GEM0çMACå°åã
è¯éªåç°ï¼å³ä½¿å¨system-user.dtsiéä¸ålocal-mac-addressï¼ä¹ç §æ ·è§£æåºçæ¯GEM0çMACã
èå°system-user.dtsiéçlocal-mac-addressæ¹å为pl-mac-addressï¼å¹¶å°é©±å¨é解æçå符串ä¹å¯¹åºæ´æ¹ä¸ºpl-mac-addressï¼åå¯ä»¥æ£ç¡®è§£æåºæ¥ï¼
Passing MAC address to kernel via Device Tree Blob and U-Bootï¼
/support/answers/.html
U-Bootéçç¯å¢åéethaddrä¼è¦çæ设å¤æ épl-ethçlocal-mac-addrå段ï¼ä»èå½±åLinuxå¯å¨åçç½å¡MACå°åï¼
ä½U-Bootéçç¯å¢åéipaddrä¸ä¼å¯¹Linuxå¯å¨åçé 置产çä»»ä½å½±åãå 为设å¤æ éæ ¹æ¬å°±æ²¡æå ³äºIPå°åçé ç½®ã
phy-modeæä¹ä¼æ¯sgmiiï¼æ¥äºä¸å®æ¹çæä¾çBSPéï¼ä¹æ¯âsgmiiâã说æè¿ä¸ªæ²¡é®é¢ãå ·ä½åå ä¸æ¸ æ¥ã
@TODO: 设å¤æ éçä¸æå·ç顺åºå¦ä½å½±ååè½ï¼
为ä½è¯»åºæ¥çIRQå·ä¸å¯¹å¢ï¼è¿æ¯å 为è¿é读å°çä¸æ¯ç¡¬ä»¶çä¸æå·ï¼èæ¯ç»è¿ç³»ç»æ å°ä¹åç软件IRQ numberã两è ä¸å ·æ线æ§å ³ç³»ã
å ³äºä¸æå·ççé®ï¼
Linuxä¸çç½å£eth0ãeth1ç顺åºï¼ä¼¼ä¹æ¯æç §phyå°åä»å°å°å¤§æ¥æå¸çã
Xilinx xapp-zynq-eth.pdf (v5.0) July ,
/support/documentation/application_notes/xapp-zynq-eth.pdf
Xilinx Wiki - Zynq PL Ethernet:
/wiki/spaces/A/pages//Zynq+PL+Ethernet
Xilinx Wiki - Linux Drivers:
/wiki/spaces/A/pages//Linux+Drivers
Xilinx Wiki - Linux Drivers - Macb Driver:
/wiki/spaces/A/pages//Macb+Driver
Xilinx Wiki - Zynq Ethernet Performance:
/wiki/spaces/A/pages//Zynq+Ethernet+Performance
æ¥å°å ³äºJumbo frame MTUçå®ä¹ï¼å½åå¼ä¸ºï¼å¯å¦æ¹å¤§ä¸äºï¼
驱å¨æºç éå ³äºjumbo frameç说æï¼
设置MTU为ï¼åç°pingå æ大é¿åº¦åªè½è®¾ä¸ºping ..1. -s
_device,对相关变量与函数进行赋值,源码并完成net_device的驱动驱动注册。
在接收数据时,源码Linux采用NAPI(Network I/O)方式,驱动驱动先关闭中断,源码上升趋势源码公式循环读取缓存区中的驱动驱动数据。此阶段需要编写poll函数,源码并在probe函数中初始化该函数。驱动驱动最大循环次数设置为,源码值将传递给xx_poll函数。驱动驱动在中断中关闭接收中断并启用NAPI调度。源码
发送数据则通过上层协议将数据保存在sk_buff中,驱动驱动然后通过eth_start_xmit函数进行传输。源码在该函数中,驱动驱动需将sk_buff中的富途sdk 源码有效数据放入缓冲区,并将缓冲区数据通过MAC发送出去。
以太网MAC数据驱动主要依赖以太网描述符进行数据收发控制。描述符由两个位寄存器组成,包含地址和状态控制器。描述符数量可多,通过寄存器写入首地址与数量,数据自动通过DMA存入描述符地址中。当一个描述符地址写满,处理器自动继续写入下一个地址。
发送数据时,数据地址保存在sk_buff中,根据其数量将数据分块,每块大小与描述符缓存大小一致。然后,将描述符对应状态位标记(置1或置0),维权协会网站源码即可实现数据发送。
以太网PHY驱动包括初始化PHY设备与读取网络状态两部分。初始化过程中,设置PHY工作模式、电压等参数。读取网络状态时,通过特定寄存器获取PHY运行状态、链路状态等信息。
å¦ä½å¨Zynq-ä¸ç§åPL Image
å¨Zynq-ä¸ç¼ç¨PL大è´æ3ç§æ¹æ³ï¼
1. ç¨FSBLï¼å°bitstreaméæå°boot.binä¸
2. ç¨U-BOOTå½ä»¤
3. å¨Linuxä¸ç¨xdevcfg驱å¨ã
æ¥éª¤ï¼
1. å»æbitstreamçæ件头
ç¨FSBLç§åPL Images没æä»ä¹å¥½è¯´çï¼ç¨Xilinx SDKçCreate Boot Imageå·¥å ·å³å¯å®æï¼ä¸åèµè¿°ãç¨å两ç§æ¹æ³éè¦æbitstreamæ件çæ件头ç¨bootgenå·¥å ·å»æã
ä¸ä¸ªå ¸åçbifæ件å¦ä¸æ示ï¼
the_ROM_image:
{
[bootloader]<fsbl_name>.elf
<pl_bitstream_name>.bit
<u-boot_name>.elf
}
bifæ件å¯ä»¥ç¨ææ¬ç¼è¾å¨åï¼ä¹å¯ä»¥ç¨Xilinx SDKçCreate Boot Imageå·¥å ·çæãç¶åå¨å½ä»¤è¡ä¸ç¨ä»¥ä¸å½ä»¤å³å¯å»æbitstreamæ件çæ件头ã
bootgen -image <bootimage>.bif -split bin -o i BOOT.BIN
"-splitâåæ°å¯ä»¥çæ以ä¸æ件ï¼
<pl_bitstream_name>.bit.bin
2. å¨U-BOOTä¸ç§åPL Image
å½ä»¤âfpga loadâåâfpga loadbâé½å¯ä»¥ãåºå«æ¯åä¸ä¸ªå½ä»¤æ¥åå»æäºæ件头çbitstreamæ件ï¼åä¸ä¸ªå½ä»¤æ¥åå«ææ件头çbitstreamæ件ã
å¨OSL .2ä¸ï¼ç¼ºçç¼è¯å°±å¯ä»¥å®æ´æ¯æåå ¥PL Imageçåè½ãä½æ¯å¨Petalinux .ä¸ï¼å°½ç®¡å¯ä»¥å¨U-BOOTä¸çå°å½ä»¤âfpgaâï¼è¿éè¦å¨æ件
<PROJ>/subsystems/linux/configs/u-boot/platform-top.h ä¸å¢å 以ä¸å 容åéæ°ç¼è¯æå¯ä»¥æ¯æå ·ä½çåè½ã
/* Enable the PL to be downloaded */
#define CONFIG_FPGA
#define CONFIG_FPGA_XILINX
#define CONFIG_FPGA_ZYNQPL
#define CONFIG_CMD_FPGA
#define CONFIG_FPGA_LOADFS
å¨OSL .2 U-BOOTä¸ï¼å ·ä½çåè½æ¯å¨zynqpl.cçzynq_load()ä¸å®ç°çã
3. å¨Linuxä¸ç§åPL Image
OSL Linux .2.ä¸å·²ç»å«æxdevcfg驱å¨äºï¼ä¹åå°±æï¼ä¸è¿æ¬ææ¯å¨è¿ä¸ªçæ¬ä¸éªè¯çï¼ï¼ç´æ¥ç¨ä»¥ä¸å½ä»¤å°±å¯ä»¥å®æPL Imageåå ¥ã
cat <path_to_storage_media>/<pl_bitstream_name>.bit.bin > /dev/xdevcfg
Linux驱å¨çæºä»£ç å¨xilinx_devcfg.cä¸ãå 为驱å¨çç¼å·æ¯éè¿alloc_chrdev_region()å¨æåé çï¼æ以ä¸éè¦æå·¥ç¨mknodå½ä»¤æå¨å»ºç«è®¾å¤èç¹ã
å¨Linux驱å¨ä¸ï¼æ¯æ¬¡å¾DevCfgä¸åå ¥åèï¼ç´å°å ¨é¨åå®ã
4. å¨ç¨æ·ç¨åºä¸ç§åPL Image
ç®å没æç°æçæºç æ¥å®æè¿ä¸ªåè½ï¼ä¸è¿å¯ä»¥ç¨mmap()æDevCfgçå¯åå¨æ å°å°ç¨æ·ç¨åºçèå°åä¸ï¼ç¶ååèä¸äºç°æç软件代ç æ¥å®æè¿ä¸ªåè½ï¼
* FSBLä¸çpcap.c
* U-BOOTä¸çzynqpl.c
* Linuxä¸çxilinx_devcfg.c
* Xilinx SDKä¸çä¾åãä¾åä½äºä»¥ä¸ä½ç½®ï¼éSDKççæ¬ä¼æååã
C:\Xilinx\SDK\.1\data\embeddedsw\XilinxProcessorIPLib\drivers\devcfg_v3_0\examples\index.html
å°ç»ï¼
DevCfgå¤è®¾å é¨æèªå·±çDMAï¼åªéè¦ç®åçé ç½®PL Imageçåºå°ååé¿åº¦å°DevCfgå¯åå¨ï¼å°±å¯ä»¥å®æZynq- PL Imageçå è½½ãXilinxå·²ç»æä¾äºçµæ´»ç解å³æ¹æ¡ï¼å¦æå¼åè è¦æè¿ä¸ªåè½éæå¨èªå·±çåºç¨ç¨åºä¸ï¼ä¹æå¾å¤ç代ç å¯ä»¥åèï¼å¹¶ä¸æ¯å¾å°é¾çä»»å¡ã
sdr开发篇 3. ZYNQ_DEV开发板linux的helloworld
创建Vivado工程并添加ZYNQ核心,设置DDR功能包括GPIO、ETH0、SD0、UART0、USB0。通过Block Automation进行配置,享做笔记源码连接处理系统7_0的FCLK_CLK0到M_AXI_GPO_ACLK。创建HDL wrapper,选择图形界面配置或编辑文件的方式进行I/O端口的分配。进行编译,包含合成、实施、生成比特流等步骤。导出HDF文件,使用Petalinux进行Ubuntu命令行操作,创建工程,拷贝HDF文件,配置硬件信息,检查接口和配置SD卡,启动。配置内核和设备树,汉源码头游艇跳过根文件系统的配置,进行编译前的多点CPU核心分配。打包boot.bin。制作SD卡文件系统,包含分区操作,EXT分区和FAT分区的直接拷贝。启动测试,进行默认登录账号密码验证,GPIO、以太网、USB host的测试,包含脚本的创建和测试过程,处理USB相关的驱动问题。确保设备管理器中正确显示RNDIS,并完成IP配置,进行电脑ping测试。
zynq平台 Linux系统 phy e驱动配置
在Zynq平台上配置Linux系统中的PHY E驱动,遵循以下步骤。
确保硬件连接正确并识别为网络设备,可通过`ifconfig -a`查看。
内核配置中启用Ethernet PHY支持,检查设备树(DTS)或内核配置文件,确保相关配置被定义。
在设备树(DTS)文件中添加PHY E描述,指定兼容性与地址,可能还需添加其他属性。
编译内核并加载设备树(DTB)文件至系统中,确保在系统启动后,驱动自动加载。
使用`ethtool -i eth0`检查驱动加载情况及PHY信息。
此步骤适用于Zynq平台配置Linux系统中的PHY E驱动。具体配置可能因平台和内核版本不同而有所差异。
ZYNQ XC7Z的PL PS中断驱动程序编写测试(linux4.版本下)
设计目的旨在实现ARM与FPGA的高效交互,特别聚焦于PL与PS间的中断驱动通信。通过使用BRAM存储数据并触发外部PL端中断,通知PS端进行数据读写操作,本文将详细阐述这一过程。程序设计逻辑围绕按键触发中断,通过按键直接连接至PL端,驱动产生异步通知。应用开始向BRAM写入数据,随后阻塞等待读取数据,读取后进行比较。 Vivado平台中,增加BRAM控制器与BRAM配置,以及中断机制的集成。本文重点介绍了在中断系统中使用第个中断,连接至IRQ_F2P接口。此外,需在Linux设备树中添加相应的中断配置,明确中断号为,通过计算得出实际中断号为,并设置为上升沿触发模式。 中断程序设计包含驱动注册、字符驱动注册以及中断注册,考虑到数据交换量可能较大,本文提出使用mmap函数优化数据读写效率。中断处理函数中,首先产生异步通知信号,随后清除阻塞等待队列信号。 应用程序测试阶段,接收中断触发信号后,通过mmap功能将数据写入BRAM,接着执行阻塞等待读取数据,直至唤醒后读取并打印数据。通过 printk 功能,直观展示了中断触发的数据处理流程,具体步骤如下: 中断处理函数 plps_handler 触发。 先前阻塞状态的 plpsirq_read 函数被激活,用于处理异步通知信号。 应用层的异步通知函数 my_signal_fun 被调用。 最终执行完成阻塞读取操作,read(fd, str, )完成数据读取。 综上,本文详细介绍了ZYNQ XC7Z芯片下中断驱动程序的编写与测试过程,特别关注了Linux环境下的设备树配置、中断机制实现,以及程序的高效数据交换逻辑。通过实证分析,验证了设计方法的有效性,为后续FPGA与ARM交互应用提供了参考依据。2024-12-28 16:09
2024-12-28 15:32
2024-12-28 15:30
2024-12-28 15:07
2024-12-28 14:24