拓冰建站拓冰建站
首页 / 资讯中心 / 正文

LitePCIe Linux内核驱动完全指南:MMAP与DMA设备节点、ioctl接口的编译与使用

LitePCIe Linux内核驱动完全指南MMAP与DMA设备节点、ioctl接口的编译与使用【免费下载链接】litepcieSmall footprint and configurable PCIe core项目地址: https://gitcode.com/gh_mirrors/li/litepcieLitePCIe是一个小体积、可配置的开源 FPGA PCIe 核心其随附的 Linux 内核驱动会为每路 DMA 通道创建/dev/litepcieN设备节点通过read/write传输数据、mmap实现零拷贝访问、ioctl控制寄存器与 DMA 读写方向。本指南带你完成驱动编译、设备节点创建并讲清每一个 ioctl 接口的用法让新手也能快速上手。驱动能做什么设备节点与 UART 串口驱动加载后PCIe 设备会在系统中注册为字符设备/dev下出现设备节点作用创建位置/dev/litepcieN每路 DMA 通道一个字符设备N 从 0 递增main.c/dev/ttyLXU0FPGA 上的 UART 控制台配置了串口前端时liteuart.c每个/dev/litepcieN节点同时支持四种操作覆盖了 FPGA 数据通道的全部使用场景write()把用户数据拷入 TX 环形缓冲区DMA 发送方向Reader消费后送往 FPGAread()从 RX 环形缓冲区读出数据DMA 接收方向Writer从 FPGA 持续写入mmap()将 DMA 缓冲区直接映射到用户空间实现零拷贝ioctl()读写 CSR 寄存器、开关 DMA 方向、查询缓冲区进度、SPI Flash 刷写等。驱动内部为每路 DMA 预分配256 个 8 KB 缓冲每个方向共 2 MB每 32 个缓冲触发一次 MSI 中断硬件/软件双计数器hw_count/sw_count保证流控不丢数核心逻辑见 main.c。一键编译与安装init.sh 自动重建模块编译流程非常直接。先克隆仓库git clone https://gitcode.com/gh_mirrors/li/litepcie cd litepcie/litepcie/software/kernel然后依次执行make # 针对当前运行内核uname -r编译 litepcie.ko / liteuart.ko ./init.sh # 自动 insmod、检测内核变更时自动重建模块、放开 /dev 权限Makefile 会自动探测当前内核版本在/lib/modules/$(uname -r)/build下执行内核模块构建。init.sh 是贴心的自愈脚本模块已加载时直接跳过报Invalid module format内核升级了时自动重新 make 再 insmod报Required key not available时提示你关闭 BIOS 的 Secure Boot最后把/dev/litepcie0到/dev/litepcie16全部chmod 666。卸载驱动只需一行rmmod litepcie 更换 FPGA 镜像后设备没刷新仓库提供了 rescan.py它会自动摘除/重挂驱动并触发 PCIe 总线重扫描免去重启。驱动支持 Xilinx 7 系Gen2 最高 X8、UltraScaleGen4 最高 X16、Lattice CPNX 与 Gowin GW5AT 等 PHY设备 ID 表在 config.hPCI ID 匹配表见 main.c。MMAP 零拷贝一个 2MB 大页搞定双向 DMA零拷贝是驱动的一大亮点。mmap规则很直观实现在 litepcie_mmap偏移量vm_pgoff映射内容典型用途0TX 环形缓冲Reader 方向256×8KB你写FPGA 读DMA_BUFFER_TOTAL_SIZE PAGE_SHIFT即偏移 2MB 处RX 环形缓冲Writer 方向256×8KBFPGA 写你读mmap 的长度必须恰好为DMA_BUFFER_TOTAL_SIZE2 MB否则返回EINVAL。映射后用户空间可直接读写 DMA 缓冲区无需任何拷贝每消费/生产完一个缓冲用LITEPCIE_IOCTL_MMAP_DMA_WRITER_UPDATE/LITEPCIE_IOCTL_MMAP_DMA_READER_UPDATE把新的sw_count同步给内核即可进度查询则用LITEPCIE_IOCTL_MMAP_DMA_INFO获取。用户态的-z参数就负责开启这条零拷贝路径实现封装在 litepcie_dma.c。ioctl 接口速查表寄存器、DMA 与 Flash 一个不漏所有 ioctl 命令字与参数结构体都定义在公开头文件 litepcie.h实现集中在 litepcie_ioctlioctl 命令方向作用LITEPCIE_IOCTL_REG读写直接读写 BAR0 上的 32 位 CSR 寄存器地址值读写标志LITEPCIE_IOCTL_DMA写开启/关闭 DMA回环内部回环测试用LITEPCIE_IOCTL_DMA_WRITER读写使能/关闭 RX 方向并返回hw_count/sw_countLITEPCIE_IOCTL_DMA_READER读写使能/关闭 TX 方向并返回hw_count/sw_countLITEPCIE_IOCTL_LOCK读写请求/释放 Reader 或 Writer 方向锁保证同方向只有一个用户LITEPCIE_IOCTL_MMAP_DMA_INFO读查询零拷贝的 TX/RX 缓冲偏移、大小、个数LITEPCIE_IOCTL_MMAP_DMA_WRITER_UPDATE写零拷贝模式下上报 Writer 侧已消费缓冲数LITEPCIE_IOCTL_MMAP_DMA_READER_UPDATE写零拷贝模式下上报 Reader 侧已生产缓冲数LITEPCIE_IOCTL_FLASH读写SPI Flash 半双工收发8~40 bit配置了 Flash 前端时可用LITEPCIE_IOCTL_ICAP写通过 ICAP 口写 FPGA 配置寄存器Xilinx 专用典型使用顺序open → LOCK 申请方向 → DMA_WRITER/READER 使能 → read/write 或 mmap 传输 → release 自动停 DMA 并解锁。release路径会自动停 DMA、关中断见 litepcie_release。寄存器读写、Flash 刷写等便捷函数已封装在 liblitepcie 用户态库中例如 litepcie_helpers.c 提供了litepcie_readl/litepcie_writel。现成工具上手litepcie_test 与 litepcie_util无需自己写 ioctl仓库 user/ 目录提供了两套现成工具在software/user下执行make即可编译同时生成liblitepcie.a静态库cd litepcie/software/user make1.litepcie_testDMA 收发与测速源码 litepcie_test.c# 记录 FPGA→PC 的数据流到文件最多 1GB实时打印速率 ./litepcie_test -c 0 record stream.bin 1000000000 # 把文件通过 DMA 回放到 FPGA循环 3 轮 ./litepcie_test -c 0 play stream.bin 3 # 加 -z 开启零拷贝mmap模式 ./litepcie_test -c 0 -z record stream.bin 1000000000运行时会以 200 ms 为周期打印 Gbps 速率、缓冲数与数据量用CtrlC结束。2.litepcie_util诊断与刷写源码 litepcie_util.c./litepcie_util info # 查看 SoC 标识、FPGA DNA、温度与电压 ./litepcie_util scratch_test # Scratch 寄存器读写自检 ./litepcie_util dma_test # DMA 回环带宽与误码测试-a 自动校准 RX 延时-e 外部回环 ./litepcie_util flash_read rom.bin 1048576 # 从 SPI Flash 读出 1MB ./litepcie_util flash_write rom.bin 0 # 写回 SPI Flash配合 flash_reload 完成 FPGA 重配置这些命令背后就是前文表格里的 ioctl 组合调用例如dma_test会依次LITEPCIE_IOCTL_DMA回环→LOCK→DMA_WRITER/READER是学习 ioctl 用法最好的活注释。常见问题排查清单 现象原因与解决insmod报Invalid module format内核已升级在 kernel 目录重新make clean make后再./init.sh脚本会自动做这件事Required key not availableBIOS 开启了 Secure Boot需关闭或签名模块看不到/dev/litepcie0确认lspci能识别该 PCIe 设备且 ID 在 config.h 列表中换过 FPGA 镜像后运行python3 rescan.pyread/write报 buffers lost用户态消费太慢导致环形缓冲溢出改用-z零拷贝模式或减小单次传输量打开节点后 DMA 行为怪异方向未加锁先LITEPCIE_IOCTL_LOCK申请 Reader/Writer退出时释放ARM 平台上零拷贝读到旧数据mmap 的内存带缓存需手动做 cache 维护驱动注释中有说明见 main.c小结LitePCIe 的 Linux 驱动把 FPGA 的 PCIe 数据通道抽象成了极简而完整的三件套/dev/litepcieN字符设备—— 每路 DMA 一个节点read/write 即收发消息mmap 零拷贝—— 2 MB 大页映射 DMA 环形缓冲MMAP_DMA_*ioctl 维持进度ioctl 控制面—— 寄存器直读直写、方向开关与方向锁、Flash 刷写一应俱全。配合init.sh的一键安装和litepcie_test/litepcie_util现成工具从编译到跑通 DMA 带宽测试通常只需几分钟。接下来可以深入 litepcie/software/kernel/ 的驱动源码或参考 test/ 目录下的模型测试了解 TLP 层行为把 LitePCIe 接入你的下一个 FPGA 项目。【免费下载链接】litepcieSmall footprint and configurable PCIe core项目地址: https://gitcode.com/gh_mirrors/li/litepcie创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门