MyException - 我的异常网
当前位置:我的异常网» 驱动开发 » linux按键设备驱动解决方法

linux按键设备驱动解决方法(2)

www.myexceptions.net  网友分享于:2013-04-10  浏览:6次

};
 
static int kbd_init(void)
{
 int devno;    /* 设备号 */
 int result,err;
 int i;
 devno = MKDEV(major,minor);
 if(major)         /* 如果主设备号等于0,则动态分配设备号 */
  result = register_chrdev_region(devno, count, "kbd");
 else
 {
  result = alloc_chrdev_region(&devno, 0, count, "kbd");
  MAJOR(devno);
 }
 if(result)       /* 如果分配失败,则返回 */
 {
  printk("alloc char device failure!\n");
  return result;
 }
 
 /* 为设备结构分配内存空间 */
 kbd_devp = kmalloc(sizeof(struct kbd_dev),GFP_KERNEL);
 
if(!kbd_devp)
 {
  printk("alloc memory failuere!\n");
  return -ENOMEM;
  goto unregister;
 }
 /* 为分配的设备结构的内存空间进行初始化 */
 memset(kbd_devp, 0, sizeof(struct kbd_dev));
 kbd_devp->cdev = cdev_alloc();   /* 分配一个字符设备结构给kbd_devp->dev */
 cdev_init(kbd_devp->cdev, &kbd_fops);  /* 初始化字符设备结构 */
 kbd_devp->cdev->owner= THIS_MODULE;
 err = cdev_add(kbd_devp->cdev, devno, count);  /* 向系统添加字符设备结构 */
 if(err == 0)
printk("cdev_add success!\n");
 
gpfcon = ioremap(0x56000050,4);  /* 映射按键对应的物理地址 */
 *gpfcon = 0x22a;                 /* 设置控制按键的端口为中断 */
 
 for(i = 0; i < KEY_NUM; i++)
 {
  /* 注册这四个按键中断,低电平触发,给中断处理程序传入键值 */
  if(request_irq(key_info_tab[i].irq_no, key_irq_handler, IRQ_TYPE_LEVEL_LOW, 
      key_info_tab[i].gpio_port, &key_info_tab[i].key_no))
  {
   printk("can't get irq:%i\n",key_info_tab[i].irq_no);
   return 0;
  }
  kbd_devp->keystatus[i] = KEY_UP;   /* 设置按键状态为松开 */
   /* 初始化四个内核定时器,给定时器处理函数传入中断号 */
  setup_timer(&key_timer[i], timer_delay, key_info_tab[i].irq_no);
 }
 
 printk("device add success!\n");
 return 0;
 
 unregister:
  unregister_chrdev_region(MKDEV(major,minor), count);
  return result;
  
}
 
static void kbd_exit(void)
{
 int i;
 for(i = 0; i < KEY_NUM; i++)
 {
  free_irq(key_info_tab[i].irq_no, &key_info_tab[i].key_no);
 }
 iounmap(gpfcon);
 
 cdev_del(kbd_devp->cdev);
 kfree(kbd_devp->cdev);
 kfree(kbd_devp);
 unregister_chrdev_region(MKDEV(major,minor), count);
 printk("device remove success!\n");
}
 
module_init(kbd_init);
module_exit(kbd_exit);
MODULE_LICENSE("GPL");
 
我在我的开发板上使用# insmod key.ko 插入模块,使用命令# mknod /dev/kbd c 280 0创建设备节点,然后就直接按开发板的按键,串口上的输出是(这只是一个按键的信息,其他三个按键的输出信息与这个类似):
handle with irq : 16,irq_no:1
    disbale_irq_nosync :16

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有