首页 核心课程 师资团队 就业实训 企业培训 承接项目 技术文章 在线学习 我要报名 关于我们 “顶嵌杯”专题
分类导航
课件下载 
模拟试卷 
视频下载 
基于ARM9开发板的按键字符设备驱动实现代码
文件名称: 基于ARM9开发板的按键字符设备驱动实现代码
文件大小:
文件类型: rar
上传时间: 2009-09-08 14:41:14
更新时间: 2009-09-08 14:41:14
下载次数: 331
适用年级:
作者姓名:
文件简介
基于ARM9开发板的按键字符设备驱动实现代码
详细介绍

基于ARM9开发板的按键字符设备驱动实现

摘要:

该驱动程序实现4个按键设备在Linux系统中基于QT2410E开发板的工作情况,通过该实例可以了解ARM平台Linux系统下的GPIO程序控制,以及硬件中断程序的工作机制。另外还可以熟悉Linux 2.6内核的模块加载和测试方法。

1.了解硬件原理图

由于该设备驱动是针对具体硬件设备的,所以一般需要了解它的硬件原理图(如图1),该模块有四个按键分别是S2S3S4S5,其中这四个按键分别对应的外部中断为:EINT0EINT2KBDINTEINT1)和KBDSPIMISOEINT13)。工作原理很简单,当系统正常工作时,按这四个任意键会产生相应的中断信号,从而系统会知道哪个按键被触发,在该驱动实现中当有哪个按键被触发时会有相应的打印信息产生。

按键模块的电路图

2.设计驱动程序框架

字符设备指那些必须以串行顺序依次访问的设备,并且不需要缓冲,通常用于不需要大量数据请求传送的设备类型,所以对于该按键设备适合用字符设备类型来实现。对于Linux设备驱动,通常根据设备类型的不同所以实现框架会有所不同,比如字符设备、块设备和网络设备分别都有自己的实现框架和相应的内核API函数。通常字符设备驱动实现的内容有:模块的加载(字符设备的注册,硬件的初始化,中断的注册等);字符设备的操作函数实现(openclosereadwriteioctl等);中断程序的实现;模块的卸载(注销字符设备,注销其他申请的资源)。下面来分析一下该按键设备驱动的具体实现。

3.按键模块的加载

     1  static int __init buttons_init(void)

     2  {

     3          int ret,devno;

     4          dev_t dev;

     5          ret = alloc_chrdev_region(&dev,0,1,DEVICE_NAME); //在系统中申请一个字符设备区域,主设备号由系统动态分配。

     6          buttons_major_number = MAJOR(dev); //摘取出主设备号

     7          printk(KERN_INFO "Initial QT2410E Board Buttons driver!\n");

     8          if (ret<0) {

     9                  printk(KERN_WARNING "button:can't get major number %d\n",buttons_major_number);

    10                  return ret;

    11          }

    12          ret = request_irqs(); //注册中断,下文会具体分析该函数的实现

    13          if (ret) { //如果注册中断失败,则注销上面申请的字符设备区域。

    14                  unregister_chrdev_region(dev,1);

    15                  printk(KERN_WARNING "button:can't request irqs\n");

    16                  return ret;

    17          }

    18          devno = MKDEV(buttons_major_number,0);

    19          cdev_init(&buttons_dev,&buttons_fops); //初始化buttons_dev字符设备结构

    20          buttons_dev.owner = THIS_MODULE;

    21          

    22

    23          ret = cdev_add(&buttons_dev,devno,1);// 将字符设备加入到内核中

    24          if (ret) { //如果添加失败,则做上述注册的释放操作。

    25                  free_irqs();

    26                  unregister_chrdev_region(dev,1);

    27                  printk(KERN_NOTICE "Error %d adding buttons device\n",ret);

    28                  return ret;

    29          }

    30

    31  #ifdef CONFIG_DEVFS_FS //如果定义devfs,系统会自动创建/dev目录下的字符设备节点,比如这里会自动创建/dev/buttons字符设备节点

    32          devfs_mk_cdev(MKDEV(buttons_major_number,0), S_IFCHR | S_IRUSR | S_IWUSR,DEVICE_NAME);

    33          printk(KERN_INFO"/dev/%s has been added to your system.\n",DEVICE_NAME);

    34  #else //否则需要执行 mknod命令手动创建字符设备节点。

    35          printk(DEVICE_NAME "Initialized\n");

    36          printk(KERN_INFO "You must create the dev file manually.\n");

    37          printk(KERN_INFO "Todo: mknod c /dev/%s %d 0\n",DEVICE_NAME,buttons_major_number);

    38  #endif

 

嵌入式培训 | 在线报名 | 合作企业 | 关于顶嵌 | 联系我们 | 加入顶嵌 | 友情链接 | 返回顶部

联系电话:010-62640798 62642993 
传真:010-62631735-8900
地址:北京市海淀区紫竹院南路7号院2楼
全国免费咨询电话:400-650-3060
Copyright © 2009 北京顶嵌(TOP-E)开源科技有限公司 - 嵌入式Linux专业培训机构 All Rights Reserved
京ICP06031998

打标机 激光机 二维码
合作网站:白癜风