全部博文(26)
分类: LINUX
2010-04-13 11:35:32
目录:
1 贴点而源代码
2 分析源代码
1 贴点而源代码
以下是s3c2410_gpio_cfgpin函数的定义:
void s
{
void __iomem *base = S
unsigned long mask;
unsigned long con;
unsigned long flags;
if (pin < S
mask = 1 << S
} else {
mask = 3 << S
}
switch (function) {
case S
mask = 0;
function = 0;
break;
case S
case S
case S
case S
if (pin < S
function -= 1;
function &= 1;
function <<= S
} else {
function &= 3;
function <<= S
}
}
/* modify the specified register wwith IRQs off */
local_irq_save(flags);
con = __raw_readl(base + 0x00);
con &= ~mask;
con |= function;
__raw_writel(con, base + 0x00);
local_irq_restore(flags);
}
EXPORT_SYMBOL(s
以下是s3c2410_gpio_cfgpin中部分引用代码的定义:
#define S
#define S
#define S
2 分析源代码
在分析s3c2410_gpio_setpin时已经得知B组的基地址是0xfb000010,在datasheet中得知GPBCON的虚拟地址就是 B组的基地址,即0xfb000010,GPBDAT的虚拟地址就是B组基地址加4,即0xfb000014,所以对base+0x00的读写就是对GPBCON的读写,如源代码中的 con = __raw_readl(base + 0x00); __raw_writel(con, base + 0x00);把GPBCON中读出来的数据放入con变量中,然后对con进行修改,之后从新写入GPBCON之中,对con做了如下修改: con &= ~mask; con |= function;
对于我们的GPB5来说,它的BANK号为32,偏移量为5,所以可以计算GPB5对应的mask:
mask = 3 << S
计算结果是0b1100000000,也就是GPBCON中对应的[11,10]位
同时可以计算得知GPB5的function:
function &= 3; //在mini2440_leds.c 驱动中我们的function配置为S
function <<= S
计算结果是 0b0100000000 即对应GPBCON中的[11,10]位,而在datasheet中我们可以看到GPBCON中不同位的功能作用:
GPB5 [11:10] 00=Input 01=Output 10=nXBACK 11=reserved
GPB6 [13:12] 00=Input 01=Output 10=nXBREQ 11=reserved
GPB7 [15:14] 00=Input 01=Output 10=nXDACK1 11=reserved
GPB8 [17:16] 00=Input 01=Output 10=nXDREQ1 11=reserved
到这里,我们就明白在mini2440_led.c 驱动中对led的配置了。呵呵。
chinaunix网友2010-07-14 15:41:23
对于我们的GPB5来说,它的BANK号为32,偏移量为5,所以可以计算GPB5对应的mask: mask = 3 << S3C2410_GPIO_OFFSET(pin)*2; 计算结果是0b1100000000,也就是GPBCON中对应的[11,10]位 小弟眼拙,应该是0b110000000000吧