Chinaunix

标题: 请教一个关于关于读写寄存器的问题 [打印本页]

作者: 在梅边376450483    时间: 2010-07-17 09:36
标题: 请教一个关于关于读写寄存器的问题
我看了一个程序,上面吧
.start =0x56000060,
.end   =0x56000068,   //GPGCON,GPGDAT,GPGUP三个寄存器地址空间
.flags =IORESOURCE_MEM,
这样的一个地址空间映射后,基地址赋给了s3c2410_key_base,然后在按键中断后,读取down = readw(s3c2410_key_base + 4); 这个是读取GPGDAT的值,没错吧?可是按键是和GPG0,GPG3,GPG5,GPG6,GPG7,GPG11相连的,GPGDAT是GPG口所有的io口的数据结存器么,这样读取GPGDAT是把GPG0、GPG1,GPG2,GPG3,GPG4,GPG5,GPG6。。。。。所有的数值都读取出来了么?



还有,定义了int pin = button_irqs->pin-S3C2410_GPIO_BANKG;其中button_irqs->pin就是S3C2410_GPG0,S3C2410_GPG3,S3C2410_GPG5,等和按键相连的GPIO口,
我想问下S3C2410_GPIO_BANKG是干什么用的?
最后读取的数据data =!(down & (1<<(pin & 0x0f)));  是怎么获取到该GPIO口的值的?
小弟硬件不太好,帮忙解释下不胜感激
作者: gkzok    时间: 2010-07-17 10:23
1,GPGDAT是个32位寄存器,比如GPG0只是其中一位,你可以去看一下它们的宏定义;
2,int pin = button_irqs->pin-S3C2410_GPIO_BANKG,这个S3C2410_GPIO_BANKG应该是作为一个基址,与button_irqs->pin做减法后结果pin是位数;
3.,这个是C语言基础吧...1<<(pin & 0x0f)是先取pin的低八位(设为N),然后。。。去翻C语言书
作者: 0vk0    时间: 2010-07-17 10:47
获取到该GPIO口的值,上面已经定义了start =0x56000060,

通过指针1<<(pin & 0x0f)直接就得到了该GPIO口的值
作者: 0vk0    时间: 2010-07-17 10:48
S3C2410_GPIO_BANKG是自己定义的GPIO,详情可参考其手册




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2