s3c2410_gpio_setpin() 及GPIO虚拟地址,物理地址
2011-09-20 09:31
267 查看
s3c2410_gpio_setpin() 及GPIO虚拟地址,物理地址
2011-05-01 20:44
在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大小的段
2011-05-01 20:44
在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虚拟地址,物理地址
- s3c2410_gpio_setpin() 及GPIO虚拟地址,物理地址
- 展讯8810的GPIO物理地址与虚拟地址的变换,小例÷
- GPIO物理地址与虚拟地址的变换
- 展讯8810平台的ANDROID/linux的GPIO物理地址与虚拟地址的变换
- 一个函数分析(s3c2410_gpio_setpin),浅析ARM GPIO地址转换
- s3c2410物理地址和虚拟地址空间
- 一个函数分析(s3c2410_gpio_setpin),浅析ARM GPIO地址转换
- 物理内存(物理地址)与虚拟内存(虚拟地址)的区别
- 【操作系统】物理地址与虚拟地址
- 物理地址和虚拟地址-简介
- x86虚拟地址到物理地址的映射学习
- 虚拟地址到物理地址的转换步骤
- 逻辑地址、线性地址、物理地址和虚拟地址理解
- 解读物理地址、虚拟地址关系。
- 我理解的逻辑地址、线性地址、物理地址和虚拟地址(补充完整了) .
- linux中的物理地址和虚拟地址
- 我理解的逻辑地址、线性地址、物理地址和虚拟地址(补充完整了)
- 基于linux2.6.30.4的s3c2440寄存器的虚拟地址和物理地址的关系ioremap()