当前位置: 代码迷 >> 驱动开发 >> 矩阵键盘驱动,求解释解决方法
  详细解决方案

矩阵键盘驱动,求解释解决方法

热度:70   发布时间:2016-04-28 10:41:41.0
矩阵键盘驱动,求解释
本帖最后由 yeakon 于 2012-11-14 12:22:04 编辑 一下是人家写的代码,我现在要把他弄懂,我是新手,问题小白不要见怪,还有这个驱动有点小问题,不知道为什么,求大神指导,

//这个是头文件定义的
#define KEYIFCOL_CLEAR (readl(key_base+S3C_KEYIFCOL) & ~0xffff)
#define KEYIFCON_CLEAR (readl(key_base+S3C_KEYIFCON) & ~0x1f)
#define KEYIFFC_DIV (readl(key_base+S3C_KEYIFFC) | 0x1)
static int keypad_scan(void)
{
u32 col, cval, rval;

pr_debug("keypad_scan() is called\n");

pr_debug("row val = %x", readl(key_base + S3C_KEYIFROW));

for (col = 0; col < KEYPAD_COLUMNS; col++) {
/* clear that column number and make that normal output */
                //以下这句移位取反的操作不知道是怎么回事
cval = KEYCOL_DMASK & ~((1 << col) | (1 << (col + 8)));
//key_base + S3C_KEYIFCOL值是什么意思
writel(cval, key_base + S3C_KEYIFCOL);

udelay(KEYPAD_DELAY);
                //这个操作又是什么意思
rval = ~(readl(key_base + S3C_KEYIFROW)) &
((1<<KEYPAD_ROWS) - 1);
keymask[col] = rval;
}

writel(KEYIFCOL_CLEAR, key_base+S3C_KEYIFCOL);

return 0;
}

不明白的都在注释中了,另外加载这个驱动,ROW2一行的按键都没有反应,和某一些键按下去有两个键值,大概会是什么原因,附上扫描的代码。

static void keypad_timer_handler(unsigned long data)
{
u32 press_mask;
u32 release_mask;
u32 restart_timer = 0;
int i, col;
struct s3c_keypad *pdata = (struct s3c_keypad *)data;
struct input_dev *dev = pdata->dev;

keypad_scan();
for (col = 0; col < KEYPAD_COLUMNS; col++) {
press_mask = ((keymask[col] ^ prevmask[col]) & keymask[col]);
release_mask = ((keymask[col] ^ prevmask[col]) & prevmask[col]);
i = col * KEYPAD_ROWS;

while (press_mask) {
if (press_mask & 1) {
input_report_key(dev, pdata->keycodes[i], 1);
pr_debug("key Pressed : key %d map %d\n",
i, pdata->keycodes[i]);
}
press_mask >>= 1;
i++;
}

i = col * KEYPAD_ROWS;

while (release_mask) {
if (release_mask & 1) {
input_report_key(dev, pdata->keycodes[i], 0);
pr_debug("key Released : %d map %d\n",
i, pdata->keycodes[i]);
}
release_mask >>= 1;
i++;
}
prevmask[col] = keymask[col];

restart_timer |= keymask[col];
}

if (restart_timer) {
mod_timer(&keypad_timer, jiffies + HZ/10);
} else {
writel(KEYIFCON_INIT, key_base + S3C_KEYIFCON);
is_timer_on = false;
}
}

------解决方案--------------------
测试出来四个正常,四个没反应,其他的都双键值,是什么原因呢,求大神指导啊
------解决方案--------------------
该回复于2012-11-15 22:29:19被管理员删除
  相关解决方案