5回答

0收藏

[求助] GPIO 的地址

Raspberry Pi Raspberry Pi 8125 人阅读 | 5 人回复 | 2013-08-09

   根据BCM2835 的资料,GPIO 外设的起始地址是从0x20000000开始,但控制寄存器却是0X7E200000开始?看到其它人写的GPIO 的控制程序都是按照0X20200000 来写的。谁能给解释一下BCM 的VC CPU BUS adress /ARM physical address /ARM virtual address 三者之间有什么关系和区别?什么时候用哪种address?
分享到:
回复

使用道具 举报

回答|共 5 个

倒序浏览

沙发

斑斑

发表于 2013-8-9 22:16:01 | 只看该作者

看个图片,不知道对你有帮助吗?
板凳

shamiao

发表于 2013-8-9 23:12:28 | 只看该作者

本帖最后由 shamiao 于 2013-8-9 23:23 编辑

BCM2835是一个两级变址的结构。
VC CPU BUS adress是真正的CPU物理地址,是7E20那个
ARM physical address是CPU物理地址在硬件内部,固定的第一次映射,是2020那个
ARM virtual address是ioremap()映射给用户态的虚拟地址,这个地址是不固定的

一个原则:一个层只和自己相邻的层交互。
所以用户层ioremap()做映射的时候,只使用ARM physical address。

Physical addresses range from 0x20000000 to 0x20FFFFFF for peripherals. The bus
addresses for peripherals are set up to map onto the peripheral bus address range starting at
0x7E000000. Thus a peripheral advertised here at bus address 0x7Ennnnnn is available at
physical address 0x20nnnnnn.

沙渺很忙博客 http://shamiao.com
地板

wallace2012

发表于 2013-8-16 22:48:30 | 只看该作者

   不好意思,前两天电脑安装多操作系统搞得当机了。回复的晚了点,不好意思哈! 很庆幸,看来我遇到个行家了。2楼的回答正是我相要找的答案。不过我是学51单片机出来了,对于2级变址方面的概念还不是很清楚。能否说得更详细一点?
   还有除了GPIO地址是按照0X2020来寻址(或者说直接和用户打交道),其它寄存器地址是否也要做修改?我没有在BCM2835的官方资料中看到类似的ARM physical address表,只看到有VC CPU BUS adress的地址表(如GPIO的寄存器地址都是0X7E开头的)。是否有相关的资料? 先谢过了!
5#

shamiao

发表于 2013-8-17 05:43:05 | 只看该作者

1. 内部的那一级变址是CPU自己的事情,编程不用考虑。
2. 但在Linux的限制下,直接操作寄存器(即直接读写0x20的地址段)不允许。因此需要对地址段做内存映射,以一块内存区域的读写代替直接操作寄存器。
3. 这个最后映射到的内存地址,由Linux Kernel分配,是不确定的。
4. 重要的是:连续的地址段映射后仍然是连续的。
5. 所以利用这一特性,实际编程中一般采用“基址+偏移量”的方法,以地址段的起始地址(基址)出发,加上偏移量定位到具体寄存器。
6. 例如GPIO寄存器0x7E200004(GPFSEL1),则只记录#define REG_GPFSEL1_OFFSET 0x00200004U。实际使用中,以ioremap(还是mmap来着,忘了)映射得到的不固定基址,加上此常量访问寄存器。
7. 对包含GPIO在内的所有寄存器都如此。
沙渺很忙博客 http://shamiao.com
6#

michael_xing

发表于 2013-12-19 13:58:30 | 只看该作者

qindong4058 发表于 2013-8-9 22:16
看个图片,不知道对你有帮助吗?

这个图很爽啊。。。。。
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条