s3c2410_gpio_setpin() 及GPIO虚拟地址,物理地址

转载 2012年03月23日 18:24:21
在mini2440_leds_misc.c里有这样的一段代码,而纵观整个c文件里面,其实真正核心的代码,我感觉就一句了:

s3c2410_gpio_setpin(led_table[i], !cmd);

而这一句里面,堪称核心的就是s3c2410_gpio_setpin 了。

于是百度得来其详细讲解。对于理解arm-linux对于24x0系列开发板的地址映射有着异常强悍


1 case MEMDEV_IOCON:
2 /*灯全亮*/
3 for(i=0;i<4;i++)
4 s3c2410_gpio_setpin(led_table[i], !cmd);
5 return 0;

 

作用:设置相应GPIO口的值,
如pin=S3C2410_GPB5    to=0   则:设置S3C2410_GPB5的输出值为0
如pin=S3C2410_GPB5    to=1 则:设置S3C2410_GPB5的输出值为1

void s3c2410_gpio_setpin(unsigned int pin, unsigned int to)
{
    void __iomem *base = S3C2410_GPIO_BASE(pin);
    unsigned long offs = S3C2410_GPIO_OFFSET(pin);
    unsigned long flags;
    unsigned long dat;

    local_irq_save(flags);

    dat = __raw_readl(base + 0x04);
    dat &= ~(1 << offs);
    dat |= to << offs;
    __raw_writel(dat, base + 0x04);

    local_irq_restore(flags);
}
EXPORT_SYMBOL(s3c2410_gpio_setpin);

说明:
1.
S3C2410_GPIO_BASE(pin)-------------
在linux/include/asm/hardware/s3c2410/regs-gpio.h中
#define S3C2410_GPIO_BASE(pin)   ((((pin) & ~31) >> 1) +S3C24XX_VA_GPIO)

S3C24XX_VA_GPIO------------
在linux/include/asm-arm/arch-s3c2410/map.h

#define S3C24XX_VA_GPIO       S3C2410_ADDR(0x00E00000)
----GPIO的虚拟偏移地址:
0x00E00000
#define S3C2410_ADDR(x)    (0xF0000000 + (x))
----所有寄存器的虚拟首地址:
0xF0000000
则:
S3C24XX_VA_GPIO =0xF0E0 0000        ----GPIO的虚拟首地址

如:pin = S3C2410_GPB5 
而在linux/include/asm/hardware/s3c2410/regs-gpio.h

#define S3C2410_GPB5         S3C2410_GPIONO(S3C2410_GPIO_BANKB, 5)
#define S3C2410_GPIONO(bank,offset) ((bank) + (offset))
#define S3C2410_GPIO_BANKB (32*1)
则:
S3C2410_GPB5 =32*1+5=37

由:
#define S3C2410_GPIO_BASE(pin)   ((((pin) & ~31) >> 1) +S3C24XX_VA_GPIO)
pin = S3C2410_GPB5 = 37
S3C24XX_VA_GPIO =0xF0E0 0000 
则:
S3C2410_GPIO_BASE(S3C2410_GPB5)   ((((S3C2410_GPB5) & ~31) >> 1) +0xF0E0 0000 )

S3C2410_GPIO_BASE(37)   ((((37) & ~31) >> 1) +0xF0E0 0000 )

S3C2410_GPIO_BASE(37) =((10 0101 &0 0000)>>1)+0xF0E0 0000
                                              =     1 0000+
0xF0E0 0000
                                              =    
0xF0E1 0000
~31主要是为了清除
S3C2410_GPB5的后5位,
以上表明,linux内核驱动里面操作的都不是GPIO的物理地址,都是对映射之后的虚拟地址进行操作的。
在map中MMU将虚拟地址映射到物理地址中的范围是,

虚拟地址的范围是:0x0000 0000 -------------0x4F00 0000
物理地址的范围是:0x4800 0000--------------0x5B00 001C

#define S3C24XX_VA_GPIO       S3C2410_ADDR(0x00E00000)
#define S3C2400_PA_GPIO       (0x15600000)
#define S3C2410_PA_GPIO       (0x56000000)
#define S3C24XX_SZ_GPIO       SZ_1M
S3C24XX_VA_GPIO 表示:    S3C24XX     GPIO的Virtual Address 
S3C2400_PA_GPIO 表示:    S3C2400     GPIO的Physicla Address 
S3C2410_PA_GPIO 表示:    S3C2410     GPIO的Physicla Address 
S3C24XX_SZ_GPIO       SZ_1M   表示:S3C24XX每个段(虚拟地址中)划分为1M
如:ARM920T是32位的,则虚拟内存空间为4GB,共划分为4096个1M大小的段 

s3c2410_gpio_setpin() 及GPIO虚拟地址,物理地址

s3c2410_gpio_setpin() 及GPIO虚拟地址,物理地址 2011-05-01 20:44 在mini2440_leds_misc.c里有这样的一段代码,而纵观整个c文件里面...
  • ayangke
  • ayangke
  • 2011年09月20日 09:31
  • 1487

s3c2410_gpio_setpin() 及GPIO虚拟地址,物理地址

在mini2440_leds_misc.c里有这样的一段代码,而纵观整个c文件里面,其实真正核心的代码,我感觉就一句了: s3c2410_gpio_setpin(led_table[i], !cm...
  • wzw88486969
  • wzw88486969
  • 2014年03月07日 17:51
  • 577

基于linux2.6.30.4的s3c2440寄存器的虚拟地址和物理地址的关系ioremap()

1 想一次修改某个目录下所有文件的权限,包括子目录中的文件权限也要修改,要使用参数-R表示启动递归处理。 刚开始学字符设备驱动,感觉最难的是驱动和底层硬件的连接。linux上的驱动程序,是基于操作...
  • u012590688
  • u012590688
  • 2015年05月26日 11:02
  • 850

用户空间的虚拟地址如何转换得到实际的物理地址

思路: 进程号是一个进程在用户空间的唯一标示,所以,根据pid可以从内核中得到一个进程的所有信息, 另外就是知道虚拟地址就可以通过内核物理地址映射到虚拟地址的逆运算就可以还原他的实际物理地址 以...
  • hpu11
  • hpu11
  • 2016年09月20日 21:47
  • 2131

Linux中的虚拟地址、物理地址和内存管理方式(一)

一、简单介绍下早期的内存实现:(可略过)         1、在早期的计算机中,运行一个程序的特点是:             (1)会把这些程序全都装入内存,             (2)程...
  • yinjingyu_bisheng
  • yinjingyu_bisheng
  • 2013年05月18日 15:06
  • 2303

Window中虚拟地址与物理地址之间的转化

如上所述,在确保访问的数据已在物理内存中后,还需要先将虚拟地址转换为物理地址,即"地址映射",才能够真正访问此数据。本节讲述Win32中虚拟内存管理器如何将虚拟地址映射为物理地址。 Win32通...
  • leo115
  • leo115
  • 2012年10月08日 23:27
  • 3477

逻辑地址、虚拟地址、物理地址以及内存管理

本文涉及的硬件平台是X86。物理地址、虚拟地址、逻辑地址、线性地址之间的关系进行了细致分析。其实,内存资源在驱动设计中的地位是至关重要的,我们要对设备进行操作,首先要获取到设备的地址。在UIO用户态驱...
  • xy010902100449
  • xy010902100449
  • 2015年07月19日 17:27
  • 1430

内核虚拟地址与物理地址的关系

在网上查资料时看到几篇介绍 linux driver 编写的文章,其中 提到 kmalloc() 与 __get_free_page() 返回地址的问题,我们 都知道 kmalloc() 与 __...
  • yangguangmeng
  • yangguangmeng
  • 2014年02月17日 11:06
  • 1507

Linux 虚拟地址与物理地址的映射关系分析

3.1用户空间的映射: 1. 用户空间的虚拟地址vaddr通过MMU(pgd,pmd,pte)找到对应的页表项x(即为物理地址) 2. 页表项x的高20位是物理也好,物理页号index = x >>...
  • ordeder
  • ordeder
  • 2014年11月30日 23:20
  • 9804

物理地址和虚拟地址的区别

(一)地址的概念 1)物理地址:CPU地址总线传来的地址,由硬件电路控制其具体含义。物理地址中 很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上 (如显存、 BIOS等)。在...
  • qq_21792169
  • qq_21792169
  • 2015年08月30日 14:22
  • 5041
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:s3c2410_gpio_setpin() 及GPIO虚拟地址,物理地址
举报原因:
原因补充:

(最多只允许输入30个字)