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
  • 1444

一个函数分析(s3c2410_gpio_setpin),浅析ARM GPIO地址转换

一个函数分析(s3c2410_gpio_setpin),浅析ARM GPIO地址转换   http://blog.163.com/ruoshui723 目录: 1 S3c...

linux中S3C2440的物理地址映射到虚拟地址详解

linux-2.6.30.4\arch\arm\plat-s3c\include\plat\ map-base.h #defineS3C_ADDR_BASE (0xF4000000) #ifndef...

展讯8810平台的ANDROID/linux的GPIO物理地址与虚拟地址的变换

./kernel/arch/arm/mach-sc8810/include/mach/regs_global.h ./u-boot/arch/arm/include/asm/arch-sc8810/...

展讯8810的GPIO物理地址与虚拟地址的变换,小例÷

转帖: ./mach-sc8810/board-sp8810/gpio_cfg.c  gpio配置规划 kernel/arch/arm/mach-sc8810/include/mach/reg...
  • luvzhan
  • luvzhan
  • 2013年03月01日 23:45
  • 754

控制IO端口 s3c2410_gpio_setpin()的使用

本文基于FL2440 ARM开发板Linux内核版本 2.6.28.7arm-linux-gcc 3.4.1转载请标明出处http://blog.csdn.net/yming0221 #include...

s3c2410_gpio_setpin

上个月在qq2440的光盘里发现了一段简单的LED驱动程序,大致看了一下明白了大意;但是由于里面的宏定义很是麻烦,看起来绕来绕去,于是我也懒得看明白了,干脆在CU论坛里发了个帖一问了事。      ...

s3c2410_gpio_setpin()系列函数

系列函数的定义在arch/arm/mach-s3c2410/gpio.c,相关的宏定义在include/asm-arm/arch-s3c2410/regs-gpio.h (1)void s3c2...

C/C++中指令、变量等虚拟地址与物理地址情况解析

本文的重点是介绍虚拟地址和物理地址的情况,分别说明目标文件、动态库、静态库中的指令、全局变量、局部变量的地址情况。...

物理地址与虚拟地址(3)

Windows 2000 使用基于分页机制的虚拟内存。每个进程有4GB的虚拟地址空间。基于分页机制,这4GB地址空间的一些部分被映射了物理内存,一些部分映射硬盘上的交换文件,一些部分什么也没有映射。程...
  • liduxun
  • liduxun
  • 2014年10月28日 17:07
  • 682
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:s3c2410_gpio_setpin() 及GPIO虚拟地址,物理地址
举报原因:
原因补充:

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