Linux应用第10-12节 GPIO 编程/寄存器读写/以太网RJ45 ,选自ALINX 黑金云课堂 FPGA 免费直播课。该课程由 ALINX 资深工程师团队倾力打造,从 0 到 1 系统化教学,帮助每位工程师跨过 FPGA 开发门槛。
GPIO 概念与分类
概念
GPIO ------ General Purpose Input/Output 通用输入输出
-
区别于串口、SPI、IIC这些专用引脚,没有内置传输协议
-
数字信号只有高电平(1)、低电平(0)两种状态
ZYNQ 平台上 GPIO 的种类


命令行控制 GPIO
- sysfs 方式:通过
/sys/class/gpio/的 export/direction/value 节点操作,已标记为 deprecated - libgpiod 方式:使用
gpiodetect、gpioset、gpioget、gpioinfo等命令,是推荐的新一代接口
C 语言控制 GPIO
- libgpiod C API:通过
gpiod_chip、gpiod_line等结构体编程(gpio_libgpiod_demo.c,编译需链接-lgpiod)
寄存器读写
寄存器访问原理
- Linux 虚拟内存机制阻止用户程序直接访问物理地址。通过
/dev/mem设备文件和mmap()将物理地址映射到用户空间虚拟地址 - 物理地址必须页对齐(4KB)
- 需要 root 权限
O_SYNC标志确保写操作直达硬件而不经过缓存

💡原理具体讲解可前往 ALINX 视频号进行直播回看。
❓为什么要在应用层访问寄存器
------ 更加方便
❓操作 /dev/mem 读写寄存器的代价?
- 没有保护机制,写入错误的地址可能导致系统立即崩溃,多个进程同时访问同一寄存器可能导致资源冲突混乱
- 速度慢效率低
- 可移植性很差
- 写入错误的值可能导致外设异常甚至硬件损坏
仅在调试阶段使用 操作时务必确认地址和值的正确性!!!
devmem 命令行工具
- 作用
快速读写物理寄存器,适合硬件调试
- 语法
devmem ADDRESS [WIDTH [VALUE]]
ADDRESS---物理地址;
WIDTH---访问宽度:8/16/32/64/128 位,默认32位;
VALUE---要写入的值,省略则执行读取
devmem 0xFF0A0248 # 读取寄存器32位
devmem 0xFF0A0248 8 # 读取8位寄存器
devmem 0xFF0A0248 32 0x00004820 # 向寄存器写入32位值
C 语言 mmap 映射
- 核心流程:
open(/dev/mem)→ 计算页对齐地址 →mmap映射 →volatile指针读写 →munmap释放 - 关键要点:
volatile防止编译器优化、O_SYNC保证直写硬件、完善的错误处理

以太网 RJ45
网络配置
- 常用命令:
ifconfig/ip addr配置 IP、route/ip route配置网关、ethtool查看链路状态、ping测试连通性 - 可选:MDIO 配置 PHY 寄存器(速率、双工模式等)
iperf3 测速
- 测试 TCP/UDP 网络吞吐量
- TCP 测试反映最大可靠带宽;UDP 测试额外观察丢包率和抖动
- 服务端:
iperf3 -s - 客户端:
iperf3 -c <IP> -t 30
Socket 编程
- TCP 服务端:
socket→bind→listen→accept→recv/send→close - TCP 客户端:
socket→connect→send/recv→close - UDP:使用
sendto/recvfrom,无需连接 - 关键 API:
sockaddr_in、htons、inet_pton、inet_ntop
更多细节欢迎关注我们黑金云课堂全年免费直播课, 黑金云课堂五月直播日历 我们将在每周二、三、四,同步推进 Verilog开发、Vitis开发、Linux开发三大系列,带你从零开始,稳扎稳打掌握 FPGA 开发全流程!
| 系列 | 内容定位 |
|---|---|
| Verilog开发 | 硬件描述语言基础、逻辑设计、仿真调试 |
| Vitis开发 | Zynq软硬件协同、外设驱动、网络协议栈 |
| Linux开发 | 嵌入式Linux系统移植、驱动编写、应用开发 |