浅谈GPIO(二)

本文介绍了S3C2410处理器中GPIO的虚拟地址计算方法,包括如何通过宏定义S3C2410_ADDR计算I/O端口的虚拟地址,并详细阐述了S3C2410_GPIO_BASE和S3C2410_GPIO_OFFSET宏的作用,用于获取每一组GPIO端口的起始虚拟地址和内部偏移值。
摘要由CSDN通过智能技术生成

    在GPIO中对其I/O端口虚拟地址的定义:

#define S3C24XX_VA_GPIO       S3C2410_ADDR(0x00E00000)

#ifndef __ASSEMBLY__
#define S3C2410_ADDR(x)      ((void __iomem *)0xF0000000 + (x))
#else
#define S3C2410_ADDR(x)      (0xF0000000 + (x))                
#endif

     很显然,在2410中,I/O端口虚拟地址VA是由0xF0000000与(X)相加得到(相比于页表映射机制,2410的MMU实在是简单);

   而且不同的寄存器偏移值都相差0x100000,比如
#define S3C24XX_VA_RTC       S3C2410_ADDR(0x00F00000)
#define S3C24XX_VA_GPIO       S3C2410_ADDR(0x00E00000)
#define S3C24XX_VA_IIS       S3C2410_ADDR(0x00D00000)

      现在得到的是S3C2410_VA_GPIO,即类似于S3C2410_PA_GPIO,前者得到的是I/O端口的起始虚拟地址,而后者是寄存器的起始物理地址。如果想要得到每一组I/O端口的起始虚拟地址,还需要用到以下宏定义:

  #define S3C2410_GPIO_BASE(pin)   ((((pin) & ~31) >> 1) + S3C24XX_VA_GPIO)
   #define S3C2410_GPIO_OFFSET(pin) ((pin) & 31)
   由S3C2410_GPIO_BASE(pin)得到的是每一组寄存器I/O端口的起始虚拟地址,例如:GPA为0x00+VA

GPB为0x10+VA, GPC 为0x20+VA等等。然后,通过S3C2410_GPIO_OFFSET(pin)得到每一组内的偏移值,即可得到所有I/O端口的虚拟地址。

   举例来说:

    pin&1111  1111  1110  0000

    pin&0001  1111 

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值