3166|4

57

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求助啊,新手对Linux驱动的疑惑 [复制链接]

下面是2440板子上的4个按键的驱动程序中的一些代码:
struct button_irq_desc {
    int irq;
        int pin;
        int pin_setting;
        int number;
    char *name;       
};
static struct button_irq_desc button_irqs [] = {
    {IRQ_EINT19, S3C2410_GPG11, S3C2410_GPG11_EINT19, 0, "KEY1"}, /* K1 */    {IRQ_EINT11, S3C2410_GPG3,  S3C2410_GPG3_EINT11,  1, "KEY2"}, /* K2 */
    {IRQ_EINT2,  S3C2410_GPF2,  S3C2410_GPF2_EINT2,   2, "KEY3"}, /* K3 */
    {IRQ_EINT0,  S3C2410_GPF0,  S3C2410_GPF0_EINT0,   3, "KEY4"}, /* K4 */
};

...

s3c2410_gpio_cfgpin(button_irqs.pin,button_irqs.pin_setting);
...

以下我们以i=0为例:
S3C2410_GPG11, S3C2410_GPG11_EINT19等,都是在regs-gpio.h里定义的:
#define S3C2410_GPIONO(bank,offset) ((bank) + (offset))
#define S3C2410_GPIO_BANKG   (32*6)
#define S3C2410_GPG11         S3C2410_GPIONO(S3C2410_GPIO_BANKG, 11)
#define S3C2410_GPG11_INP     (0x00 << 22)
#define S3C2410_GPG11_OUTP    (0x01 << 22)
#define S3C2410_GPG11_EINT19  (0x02 << 22)
#define S3C2410_GPG11_TCLK1   (0x03 << 22)

通过计算,S3C2410_GPG11的值为(32*6 + 11), S3C2410_GPG11_EINT19的值为(0x02 << 22),

所以S3C2410_GPG11=0xCB,S3C2410_GPG11_EINT19=0x800000
s3c2410_gpio_cfgpin()函数是在hardware.h中定义的:
/* s3c2410_gpio_cfgpin
*
* set the configuration of the given pin to the value passed.
*
* eg:
*    s3c2410_gpio_cfgpin(S3C2410_GPA0, S3C2410_GPA0_ADDR0);
*    s3c2410_gpio_cfgpin(S3C2410_GPE8, S3C2410_GPE8_SDDAT1);
*/
我看了,觉得s3c2410_gpio_cfgpin函数的意思是通过传入的参数,设置对应的引脚,对于

S3C2410_GPG11_EINT19=0x800000转化为二进制为1000 0000 0000 0000 0000 0000正好

[23:22]位为10,表示EINT[19],设置GPG11为第19个中断。通过查2440的datasheet,发现就

是应该对控制寄存器GPGCON做这样的设置。那为什么传入s3c2410_gpio_cfgpin函数的第一个

参数不是GPGCON的地址,而是S3C2410_GPG11而且S3C2410_GPG11的值还为0xCB这样的数
,而

且GPGCON的地址值在regs-gpio.h中也已经给出了,如:
#define S3C2410_GPGCON           S3C2410_GPIOREG(0x60)
#define S3C2410_GPGDAT           S3C2410_GPIOREG(0x64)
#define S3C2410_GPGUP           S3C2410_GPIOREG(0x68)
为什么不用,而要传入一个S3C2410_GPG11值?而且值为0xCB,是什么意思?
还请高手们不吝赐教啊,先谢谢了!
此帖出自Linux开发论坛

最新回复

对楼上很讲的很清楚噢,操作那个宏就是操作CON  详情 回复 发表于 2009-10-8 17:18
点赞 关注

回复
举报

79

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
www.01zg.com,将嵌入式进行到底。
此帖出自Linux开发论坛
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
传0xCB是正确的。原因如下:
在gpio.c文件中有s3c2410_gpio_cfgpin的定义:

  1. void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function)
  2. {
  3.           unsigned long base = [color=#FF0000]S3C2410_GPIO_BASE(pin);[/color]
  4.           unsigned long shift = 1;
  5.           unsigned long mask = 3;
  6.           unsigned long con;
  7.           unsigned long flags;
  8.   
  9.           if (pin < S3C2410_GPIO_BANKB) {
  10.                   shift = 0;
  11.                   mask  = 1;
  12.           }
  13.   
  14.           mask <<= S3C2410_GPIO_OFFSET(pin);
  15.   
  16.           local_irq_save(flags);
  17.   
  18.           con = __raw_readl(base + 0x00);
  19.   
  20.           con &= mask << shift;
  21.           con |= function;
  22.   
  23.           __raw_writel(con, [color=#FF0000]base + 0x00[/color]);
  24.   
  25.           local_irq_restore(flags);
  26.   }
复制代码

由上看出s3c2410_gpio_cfgpin(0xCB, ...)实际上是对S3C2410_GPIO_BASE(0xCB)的地址写值。
现在我们再来看S3C2410_GPIO_BASE这个宏的定义,参见regs-gpio.h

  1. #define S3C2410_GPIO_BASE(pin)   ((((pin) & ~31) >> 1) + S3C2410_VA_GPIO)
复制代码

所以S3C2410_GPIO_BASE(0xCB)的值为0x60 + S3C2410_VA_GPIO


  1. #define S3C2410_GPIOREG(x) ((x) + S3C2410_VA_GPIO)
复制代码

S3C2410_GPIO_BASE(0xCB) == S3C2410_GPIOREG(60) == S3C2410_GPGCON
s3c2410_gpio_cfgpin(0xCB, ...)实际上就是对GPGCON寄存器写值
此帖出自Linux开发论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

4
 
eeworld的源代码块中不支持加色,请把标注的位置理解为标注为红色就好了
此帖出自Linux开发论坛
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

5
 
对楼上很讲的很清楚噢,操作那个宏就是操作CON
此帖出自Linux开发论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表