主题 : 关于s3c2410_gpio_getpin(),疑惑中... 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 7451
精华: 1
发帖: 21
金钱: 230 两
威望: 200 点
综合积分: 62 分
注册时间: 2009-07-15
最后登录: 2017-09-13
楼主  发表于: 2009-07-31 10:52

 关于s3c2410_gpio_getpin(),疑惑中...

在驱动程序中,使用s3c2410_gpio_getpin()获取一个GPIO(比如GPJ0)的pin value。
(1)当s3c2410_gpio_cfgpin配置成S3C2410_GPJ0_OUTP时。
s3c2410_gpio_getpin()得到的值,是0或1。(我外接了一个按键电路,电路中有一个10K的上拉电阻)
(2)当s3c2410_gpio_cfgpin配置成S3C2410_GPJ0_INP时。
s3c2410_gpio_getpin()得到的值,是0或2048(是一个大于1的整数)。
请问,这个怎么理解呢?为什么IO配置成输出状态了,还可以getpin?
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2009-07-31 12:13
Linux是公开源码的,为什么不去看着两个函数的源代码?

复制代码
  1. unsigned int s3c2410_gpio_getpin(unsigned int pin)
  2. {
  3.     void __iomem *base = S3C24XX_GPIO_BASE(pin);
  4.     unsigned long offs = S3C2410_GPIO_OFFSET(pin);
  5.     return __raw_readl(base + 0x04) & (1<< offs);
  6. }

很明显
1, s3c2410_gpio_getpin()和当前GPIO配置的功能无关,只是读取GPxDAT寄存器中相应的bit;
2, s3c2410_gpio_getpin()的返回值是GPxDAT寄存器的值与所要读取的GPIO对应的bit mask相与以后的值,0表示该GPIO对应的bit为0, 非0表示该bit为1
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 7451
精华: 1
发帖: 21
金钱: 230 两
威望: 200 点
综合积分: 62 分
注册时间: 2009-07-15
最后登录: 2017-09-13
2楼  发表于: 2009-07-31 15:06
非常感谢!受教了。