LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1226|回复: 1

如何给我的小键盘加上驱动呢

[复制链接]
发表于 2004-11-18 17:43:35 | 显示全部楼层 |阅读模式
请问我如何在基于ARM9   linux下编写8×8的矩阵小键盘,需要用到外部中断吗?有没有简单的中断示例程序可以阅读一下。 我用的开发板是omap1510  ,小键盘是通过MPU IO 直接接到mpu interrupt handler lev2 irq1上的,我如何来写这个驱动呢,还有就是如果我已经能够使用键盘了,那我又如何来按下某个键而响应我的gui上的按钮呢
发表于 2004-11-20 13:53:32 | 显示全部楼层
这是一本新书《嵌入式Linux应用开发详解》上的源码程序,另外你还可以参考一下“置顶:入门的朋友一起来读这本书啦!”邹思轶写的那本书里面也有相关介绍。

[php]
/*键盘驱动范例  keybd.c*/
/* Copyright (C) 1998 by Ori Pomerantz */

/*必要头文件*/

/*标准头文件*/
#include <linux/kernel.h>   /*内核工作*/
#include <linux/module.h>  /*明确指定是模块*/

/*处理 CONFIG_MODVERSIONS */
#if CONFIG_MODVERSIONS==1
#define MODVERSIONS
#include <linux/modversions.h>
#endif

#include <linux/sched.h>
#include <linux/tqueue.h>

/* 在程序中将用到中断 */
#include <linux/interrupt.h>

#include <asm/io.h>

/*在2.2.3 版/usr/include/linux/version.h 中包含这个宏
* 但 2.0.35 版不包含-因此在这加入以被需要*/
#ifndef KERNEL_VERSION
#define KERNEL_VERSION(a,b,c) ((a)*65536+(b)*256+(c))
#endif

/*Bottom Half - 一旦内核模块认为它做任何事都是安全的时候这将被内核调用*/
static void got_char(void *scancode)
{
  printk("Scan Code %x %s.\n",
    (int) *((char *) scancode) & 0x7F,
    *((char *) scancode) & 0x80 ? "Released" : "ressed");
}

/*这个函数为键盘中断服务。它读取来自键盘的相关信息,然后安排到当内核认为bottom half安全的时候让它运行*/
void irq_handler(int irq,
                 void *dev_id,
                 struct pt_regs *regs)
{
  /*这些变量是静态的,因为它们需要对 bottom half 可见(通过指针)*/
  static unsigned char scancode;
  static struct tq_struct task =
        {NULL, 0, got_char, &scancode};
  unsigned char status;

  /*读取键盘状态*/
  status = inb(0x64);
        /*读取扫描码*/
  scancode = inb(0x60);

  /*安排 bottom half 运行*/
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,2,0)
  queue_task(&task, &tq_immediate);
#else
  queue_task_irq(&task, &tq_immediate);
#endif
  mark_bh(IMMEDIATE_BH);
}

/*在这里假设驱动的加载还是采用模块化方式*/
/*初始化模块--登记 IRQ 句柄*/
int init_module()
{
  /*由于原来键盘的句柄不能和本驱动程序共存,所以在启动本程序前(请不要用人称代词,如"我们","他们"等)不得不关闭它(释放它的 IRQ)。
   *同时因为不知道它在哪儿,所以抢占以后没有办法恢复它,因此当本程序运行完后计算机将被重新启动
   */
  free_irq(1, NULL);

  /*请求IRQ 1,键盘的IRQ,指向我们的 irq_handler*/
  return request_irq(
    1,  /* PC上的键盘的 IRQ 号*/
    irq_handler,  /* 我们的句柄*/
    SA_SHIRQ,
    /* SA_SHIRQ 意味着将这个 IRQ指定为可以共享
     *
     * SA_INTERRUPT 能使句柄为一个快速中断
     */
    "test_keyboard_irq_handler", NULL);
}


/*清除*/
void cleanup_module()
{
  /*它(指代不明,指代是明确的,就是这段代码)在这儿只是为了使驱动程序结构完整。它是完全不相关的,因为没有办法恢复被屏蔽的系统自带键盘中断,因此计算机完全没用了,需要被重新启动*/
  free_irq(1, NULL);
}
[/php]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表