type
Post
status
Published
slug
2023/12/15/Raspberry-Pi-register-physical-base-address-query
summary
tags
开发
树莓派
category
Linux
icon
password
new update day
Property
Dec 15, 2023 03:46 AM
created days
Last edited time
Dec 15, 2023 03:46 AM
背景资料
最近拿出了我自己的吃灰派,想着正好最近在学习驱动开发,于是就尝试着使用树莓派的 GPIO 进行一些驱动程序的开发练手工作。
首先了解到树莓派 4b 使用的CPU是 bcm2711,于是就找到了对应的芯片手册:
通过查询 GPIO 那一章节的介绍发现芯片手册上的 GPIO 物理基地址为
0x7e200000
.于是就使用这个基地址在驱动程序中进行了 ioremap 操作,结果触发了内核系统的保护机制,即:不允许映射相关内存区域。
而且树莓派的官方 datasheet 也并没有什么有用的信息,只有一个对应的引脚图。
后面经过查找资料发现,不止一个人遇到了这个问题。
树莓派4B的datasheet在我看来非常混乱复杂,尤其是地址映射方面。单datasheet就有两个版本而且还自相矛盾。为了查找到确定的物理地址,使用官方提供的函数进行读取。
安装运行环境
sudo apt install libraspberrypi-dev
编写查询程序
首先在应用层插入头文件:
#include <bcm_host.h>
可用函数有如下选择:
unsigned bcm_host_get_peripheral_address() //读取外设物理地址 unsigned bcm_host_get_peripheral_size() unsigned bcm_host_get_sdram_address()
本例要求读取外设物理地址,使用函数(1),代码如下:
#include <stdio.h> #include <bcm_host.h> void main() { unsigned t; t = bcm_host_get_peripheral_address(); printf("baseadd = %x\n",t); }
用下面的语句进行编译,一定要在树莓派上进行编译运行
gcc addr.c -lbcm_host -o test
这个很重要,是驱动开发的基础,以此为基地址相对偏移一个位置。如GPIO的设置。在这里要特别注意相对偏移量。
同时我们也可以发现这个地址跟芯片手册提供的不是同一个:
0x7e200000
#define BCM2711_PHY_BASE 0xFE000000 #define GPIO_BASE_ADDR (BCM2711_PERI_BASE + 0x200000) GPFSEL0= (volatile unsigned int *)ioremap(0xfe200000,4); GPSET0 = (volatile unsigned int *)ioremap(0xfe20001c,4); GPCLR0 = (volatile unsigned int *)ioremap(0xfe200028,4);
参考资料
欢迎加入“喵星计算机技术研究院”,原创技术文章第一时间推送。
- 作者:tangcuyu
- 链接:https://expoli.tech/articles/2023/12/15/Raspberry-Pi-register-physical-base-address-query
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章