# myuio **Repository Path**: younger4s/myuio ## Basic Information - **Project Name**: myuio - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-10-28 - **Last Updated**: 2025-10-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # UIOShell - PCIe BAR0 访问工具 基于Linux UIO驱动的PCIe板卡BAR0空间访问命令行工具。 ## 功能特性 - ✅ 封装UIO访问逻辑为 `UIODevice` 类 - ✅ 支持读写PCIe板卡BAR0空间的32位寄存器 - ✅ 交互式命令行界面 - ✅ 支持十进制和十六进制输入 - ✅ 自动检查地址对齐和范围 - ✅ 详细的错误提示 ## 编译方法 ```bash mkdir build cd build cmake .. make ``` ## 使用方法 ### 1. 准备UIO设备 确保PCIe板卡已绑定到UIO驱动,通常会创建 `/dev/uio0` 设备节点。 ```bash # 检查UIO设备 ls -l /dev/uio* # 查看UIO设备信息 cat /sys/class/uio/uio0/name cat /sys/class/uio/uio0/maps/map0/size ``` ### 2. 运行程序 ```bash # 使用默认设备 /dev/uio0 sudo ./UIOShell # 或指定UIO设备 sudo ./UIOShell /dev/uio1 ``` **注意:** 访问UIO设备通常需要root权限。 ### 3. 命令说明 程序运行后,会显示交互式提示符 `UIOShell>`,支持以下命令: #### 写入寄存器 (w) ``` w <偏移地址> <值> ``` 示例: ``` UIOShell> w 0x00 0x12345678 # 向偏移0x00写入0x12345678 UIOShell> w 16 255 # 向偏移16(0x10)写入255(0xFF) ``` #### 读取寄存器 (d) ``` d <偏移地址> ``` 示例: ``` UIOShell> d 0x00 # 读取偏移0x00的值 UIOShell> d 16 # 读取偏移16(0x10)的值 ``` #### 帮助信息 (h) ``` UIOShell> h # 显示帮助信息 ``` #### 退出程序 (q) ``` UIOShell> q # 退出程序 ``` ## 代码架构 ### 核心类: UIODevice 位于 `UIODevice.h` 和 `UIODevice.cpp` 主要方法: - `bool init()` - 初始化UIO设备,打开设备文件并映射BAR0空间 - `bool writeReg(uint32_t offset, uint32_t value)` - 写入32位寄存器 - `bool readReg(uint32_t offset, uint32_t& value)` - 读取32位寄存器 - `bool isOpened()` - 检查设备是否已打开 - `size_t getSize()` - 获取BAR0空间大小 ### 主程序: main.cpp - 命令行解析 - 交互式命令处理 - UIODevice类的使用示例 ## 注意事项 1. **权限要求**:访问UIO设备需要root权限或正确的设备权限设置 2. **地址对齐**:所有寄存器访问必须4字节对齐 3. **地址范围**:偏移地址不能超出BAR0空间大小 4. **寄存器宽度**:当前仅支持32位(4字节)寄存器访问 ## 示例会话 ``` ================================= UIO Shell - PCIe BAR0 访问工具 ================================= 使用UIO设备: /dev/uio0 提示: 输入 'h' 查看帮助 BAR0大小: 0x1000 字节 成功映射UIO设备 /dev/uio0 到用户空间 映射地址: 0x7f1234567000 设备初始化成功,可以开始访问BAR0空间 UIOShell> w 0x00 0xAABBCCDD 写入成功: [0x0] = 0xaabbccdd UIOShell> d 0x00 读取成功: [0x0] = 0xaabbccdd UIOShell> w 0x10 12345 写入成功: [0x10] = 0x3039 UIOShell> d 0x10 读取成功: [0x10] = 0x3039 UIOShell> q 退出程序... 程序已退出 ``` ## UIO驱动准备 如果PCIe设备尚未绑定到UIO驱动,可以使用以下方法: ```bash # 1. 加载UIO驱动模块 sudo modprobe uio sudo modprobe uio_pci_generic # 2. 查找PCIe设备的BDF(例如 01:00.0) lspci | grep -i # 3. 解绑原驱动(如果有) echo "0000:01:00.0" | sudo tee /sys/bus/pci/devices/0000:01:00.0/driver/unbind # 4. 绑定到UIO驱动 echo "1234 5678" | sudo tee /sys/bus/pci/drivers/uio_pci_generic/new_id # (1234 5678 是你的设备的 Vendor ID 和 Device ID,可通过lspci -n查看) ``` ## 故障排查 ### 问题:无法打开UIO设备 **解决方案:** - 检查设备文件是否存在:`ls -l /dev/uio0` - 使用sudo运行程序 - 检查UIO驱动是否加载:`lsmod | grep uio` ### 问题:mmap失败 **解决方案:** - 确认BAR0已正确映射 - 检查 `/sys/class/uio/uio0/maps/map0/` 下的信息 - 确保有足够的系统权限 ### 问题:地址对齐错误 **解决方案:** - 确保偏移地址是4的倍数 - 例如:0x00, 0x04, 0x08... 而不是 0x01, 0x02... ## 许可证 MIT License ## 作者 UIOShell 开发团队