查看: 7434|回复: 5

[求助] GPIO 的地址

[复制链接]
  • TA的每日心情
    开心
    2013-9-12 22:39
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2013-8-9 21:38:17 | 显示全部楼层 |阅读模式
    分享到:
       根据BCM2835 的资料,GPIO 外设的起始地址是从0x20000000开始,但控制寄存器却是0X7E200000开始?看到其它人写的GPIO 的控制程序都是按照0X20200000 来写的。谁能给解释一下BCM 的VC CPU BUS adress /ARM physical address /ARM virtual address 三者之间有什么关系和区别?什么时候用哪种address?
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2017-10-9 10:25
  • 签到天数: 886 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2013-8-9 22:16:01 | 显示全部楼层
    看个图片,不知道对你有帮助吗? QQ图片20130718153609.jpg
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2012-12-16 23:38
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 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.

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2013-9-12 22:39
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

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

    使用道具 举报

  • TA的每日心情
    开心
    2012-12-16 23:38
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 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在内的所有寄存器都如此。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2013-12-19 13:39
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2013-12-19 13:58:30 | 显示全部楼层
    qindong4058 发表于 2013-8-9 22:16
    看个图片,不知道对你有帮助吗?

    这个图很爽啊。。。。。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-11-19 12:22 , Processed in 0.165123 second(s), 25 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.