树莓派4调用ioremap()映射GPIO地址失败,如何释放已占用的寄存器内存范围?
树莓派4 GPIO寄存器地址占用解决方法
占用fe200000-fe2000b3地址段的是树莓派内核自带的pinctrl-bcm2835 GPIO驱动,可通过以下三种方式解决冲突:
方案1:设备树禁用官方GPIO驱动(稳定持久,推荐)
该方法会完全卸载系统自带的GPIO驱动,彻底释放目标内存区域,适合长期自定义驱动开发使用:
- 编辑启动配置文件,路径通常为
/boot/firmware/config.txt(旧版系统为/boot/config.txt) - 在文件末尾添加配置:
dtoverlay=disable-bcm2835-gpio - 保存文件后重启树莓派,重启后查看
/proc/iomem即可确认目标地址段已释放 - 后续需要恢复官方驱动时,删除添加的配置行重启即可
方案2:临时释放内存区域(仅测试用,重启失效)
如果仅做短期测试不想重启系统,可在自定义驱动的初始化逻辑中先释放原有驱动的内存占用,再执行映射:
- 先调用
release_mem_region()释放目标地址段,示例代码:// 参数分别为:起始物理地址、地址段长度 release_mem_region(0xfe200000, 0xb4); - 再正常调用
ioremap()映射物理地址,之后即可使用readb()/writeb()等函数操作寄存器 - 注意:该方法会导致系统原有GPIO相关功能全部失效,且存在触发内核崩溃的风险,仅可用于纯测试场景
方案3:兼容官方驱动的开发方式(无需释放地址)
如果不需要完全替换官方GPIO驱动,可直接使用内核标准接口避免地址冲突:
- 直接调用GPIO子系统提供的
gpiod系列API操作GPIO,无需手动处理寄存器映射,完全规避地址占用问题 - 若必须直接操作寄存器,可直接引用内核导出的BCM2835 GPIO控制器结构体获取已映射的虚拟地址,不需要自行调用
ioremap
注意事项
- 禁用官方GPIO驱动后,所有依赖系统标准GPIO接口的功能(I2C/SPI引脚配置、LED触发、按键输入等)都会失效,操作前请确认无相关依赖
- 自定义驱动操作寄存器时需严格对照BCM2711芯片手册的寄存器定义,避免误写控制位导致系统异常
内容的提问来源于stack exchange,提问作者Ankit Sharma
相关产品推荐
相关产品推荐

