linux内核版本:linux-2.6.30.4

目的:当按下K1,K2,K3,K4时,分别代表输入L、S、ENTER、LEFTSHIFT

经过上一节知道,在我们写驱动的时候input核心层和handler层都不需要修改,要修改的只是input_device层。

写一个符合input子系统驱动程序的步骤:

1.分配一个input_device结构体;

2.设置

3.注册

4.硬件相关代码,比如中断服务程序里上报事件

  1 #include <linux/module.h>
  2 #include <linux/init.h>
  3 #include <linux/fs.h>
  4 #include <linux/interrupt.h>
  5 #include <linux/irq.h>
  6 #include <linux/sched.h>
  7 #include <linux/pm.h>
  8 #include <linux/sysctl.h>
  9 #include <linux/proc_fs.h>
 10 #include <linux/delay.h>
 11 #include <linux/input.h>
 12
 13 #include <mach/hardware.h>
 14 #include <mach/regs-gpio.h>
 15
 16 struct pin_desc
 17 {
 18     int irq;
 19     char *name;
 20     unsigned int pin;
 21     unsigned int key_val;
 22 };
 23
 24 static struct pin_desc pins_desc[4] =
 25 {
 26     {IRQ_EINT1, "S1", S3C2410_GPF1, KEY_L},
 27     {IRQ_EINT4, "S2", S3C2410_GPF4, KEY_S},
 28     {IRQ_EINT2, "S3", S3C2410_GPF2, KEY_ENTER},
 29     {IRQ_EINT0, "S4", S3C2410_GPF0, KEY_LEFTSHIFT},
 30 };
 31
 32 static struct pin_desc *irq_pd;
 33 static struct timer_list timer;
 34 static struct input_dev *seventh_dev;
 35
 36 static irqreturn_t buttons_irq(int irq, void *dev_id)
 37 {
 38     irq_pd = (struct pin_desc *)dev_id;
 39     mod_timer(&timer, jiffies+HZ/100);
 40
 41     return IRQ_RETVAL(IRQ_HANDLED);
 42 }
 43
 44
 45
 46 static void timer_fuction(unsigned long data)
 47 {
 48
 49     struct pin_desc *pin = irq_pd;
 50     unsigned int pinval;
 51
 52     if (!pin)
 53         return;
 54
 55     pinval = s3c2410_gpio_getpin(pin->pin);
 56
 57     if (pinval)
 58     {
 59         //松开,最后一个参数:0-松开,1-按下
 60         input_event(seventh_dev, EV_KEY, pin->key_val, 0);
 61         input_sync(seventh_dev);
 62     }
 63     else
 64     {
 65         //按下
 66         input_event(seventh_dev, EV_KEY, pin->key_val, 1);
 67         input_sync(seventh_dev);
 68     }
 69 }
 70
 71 int seventh_init()
 72 {
 73     int i;
 74     /*1. 分配一个input_device结构体*/
 75     seventh_dev = input_allocate_device();
 76
 77     /*2. 设置*/
 78     /*2.1 能产生哪类事件*/
 79     set_bit(EV_KEY, seventh_dev->evbit);
 80     set_bit(EV_KEY, seventh_dev->evbit);//能产生重复类事件
 81     /*2.2 能产生这类操作里的哪些事件:L,S,ENTER,LEFTSHIFT*/
 82     set_bit(KEY_L, seventh_dev->keybit);
 83     set_bit(KEY_S, seventh_dev->keybit);
 84     set_bit(KEY_ENTER, seventh_dev->keybit);
 85     set_bit(KEY_LEFTSHIFT, seventh_dev->keybit);
 86
 87     /*3. 注册*/
 88     input_register_device(seventh_dev);
 89
 90     /*4. 硬件相关操作*/
 91     init_timer(&timer);
 92     timer.function = timer_fuction;
 93     add_timer(&timer);
 94     for (i = 0; i < 4; i++)
 95     {
 96         request_irq(pins_desc[i].irq, buttons_irq, IRQ_TYPE_EDGE_BOTH, pins_desc[i].name, &pins_desc[i]);
 97     }
 98     return 0;
 99 }
100 static void seventh_exit()
101 {
102     int i;
103     for (i = 0; i < 4; i++)
104     {
105         free_irq(pins_desc[i].irq, &pins_desc[i]);
106     }
107     del_timer(&timer);
108     input_unregister_device(seventh_dev);
109     input_free_device(seventh_dev);
110 }
111
112 module_init(seventh_init);
113 module_exit(seventh_exit);
114
115 MODULE_LICENSE("GPL");  

测试:

1.hexdump /dev/event0

省略           秒           微秒         类   code    value

0000000 00ac 0000 b539 0007 0001 0026 0001 0000
0000010 00ac 0000 b557 0007 0000 0000 0000 0000
0000020 00ac 0000 3ba9 0009 0001 0026 0000 0000
0000030 00ac 0000 3bc0 0009 0000 0000 0000 0000

这里格式对应的是

1 struct input_event {
2 struct timeval time;
3 __u16 type;
4 __u16 code;
5 __s32 value;
6 };

type(类)为1表示EV_KEY,code为0x26表示KEY_L value为1表示按下,0表示松开

2.如果没有启动QT,cat /dev/tty1

当按下K1,K2,K3时,在串口终端上输出ls

3.

先在板子上输入ps看,在接受我们输入显示的是900这个进程,

看一下它打开了哪些文件ls -l /proc/900/fd

可以看到标准输入输出和错误都是串口,可以用下面命令修改它的标准输入

exec 0</dev/tty1, 然后这时候再按K1,K2,K3,这时候就能把当前目录下的文件显示出来

不知道为什么我的标准输入改不成/dev/tty1,所以这个没有试验

转载于:https://www.cnblogs.com/linux-rookie/p/3245433.html

韦东山驱动视频笔记——6.输入子系统之编写驱动程序相关推荐

  1. 韦东山驱动视频笔记——3.字符设备驱动程序之poll机制

    linux内核版本:linux-2.6.30.4 目的:我们在中断方式的按键应用程序中,如果没有按键按下,read就会永远在那等待,所以如果在这个程序里还想做其他事就不可能了.因此我们这次改进它,让它 ...

  2. 韦东山视频教程视频的章节和要点

    第一部分 ARM体系结构与裸机实验 韦东山Linux视频第1期 第01课 环境搭建及工具.概念介绍 第1部分的细化,以后就在Linux上工作了,环境必须先建好 第02课 GPIO实验 写出第1个裸板程 ...

  3. 韦东山Linux视频第1期

    我用阿里云盘分享了「韦东山Linux视频第1期 S3C6410版本」,你可以不限速下载

  4. 韦东山Linux问题笔记

    一.韦东山JZ2440开发板的互ping问题 基本上老师那节互ping视频各个方面都有讲到,只不过它的侧重点不是大多数所遇到的问题,所以有一些问题讲的少了写,但基本都讲到了. 我用的是台式电脑,而韦东 ...

  5. 2014年YY公开课录像-韦东山-专题视频课程

    2014年YY公开课录像-5641人已学习 课程介绍         2014年在YY举办的公开课录像,现场回答网友提的普遍性问题 课程收益     回答网友提的普遍性问题 讲师介绍     韦东山 ...

  6. Linux 声卡驱动程序-韦东山-专题视频课程

    Linux 声卡驱动程序-2513人已学习 课程介绍         3期的声卡驱动更详细,推荐. 课程收益     熟悉内核声卡驱动框架 讲师介绍     韦东山 更多讲师课程     2003 年 ...

  7. 韦东山驱动笔记(4)

    27.字符设备和总线设备驱动模型回顾 分离: 28. 下面图片中的drive和device匹配后,就会调用probe 30.匹配方法 后面就可以根据id_table写出很多平台不一样的设备(一个驱动对 ...

  8. 3.韦东山嵌入式学习笔记-烧写工具

    程序烧写工具 oflash.SecureCRT.openJTAG.jlink 烧写方法 并口.openjtag.jlink.nor上的uboot 步骤 接口.接线.装驱动.装软件 如果PC有并口,装并 ...

  9. 韦东山:嵌入式Linux学习路线图

    我是1999年上的大学,物理专业.在大一时,我们班里普遍弥漫着对未来的不安,不知道学习了物理后出去能做什么.你当下的经历.当下的学习,在未来的一天肯定会影响到你.毕业后我们也各自找到了自己的职业:出国 ...

  10. 关于JTAG——韦东山嵌入式Linux视频学习笔记02

    1. JTAG的字面意思 JTAG --Joint Test Action Group,联合测试行动组. 2. JTAG标准 随着技术的发展,芯片的结构和功能越来越复杂,传统的使用万用表.示波器测试芯 ...

最新文章

  1. 皮一皮:真的是方法不对吗?
  2. 甜、酸、苦、辣、咸与健康
  3. Linux下的signal信号机制
  4. HttpServletRequest简述
  5. 20171026_Python学习第二周四次课
  6. 发现 nios2-elf-gcc 一处 bug
  7. pycharm上python项目的导出_pycharm项目打包成exe
  8. mac详细的系统信息怎么查看?
  9. 在Postgresql中添加新角色(Role)
  10. Xshell使用方法
  11. java视频插件,5+最佳javascript视频背景插件
  12. pandas读取excel带汉字的列头,Pandas读取excel与中文文件名
  13. logistic回归分析优点_机器学习实战项目-Logistic回归
  14. 占豪--2010年的市场机会在哪里(兼谈股指期货与楼市)
  15. Lua学习第二课_初探lua和lua语法
  16. C++四大特性——多态 的总结
  17. 2008年世界顶级杀毒软件排行榜
  18. 计算机专业哪些证书可以抵个税,个税专项附加扣除中继续教育哪些证书可以扣除?...
  19. 科研诚信与学术规范_Mooc_2018_期末考试答案
  20. 答疑中小白酒企业,爱码物联助力市场营销!

热门文章

  1. nginx 域名跳转
  2. LayaAir 位图添加遮罩与滤镜
  3. JavaScript JSON 对象使用详解、JSON. parse()、JSON. stringify()
  4. 日志框架简述、slf4j 日志框架概述,slf4j + log4j 1.X 日志组合
  5. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_03-项目概述-技术架构...
  6. 省选专练SCOI2015小凸想跑步
  7. 【转】使用Python的Requests库进行web接口测试
  8. 2017-4-24(1493037086057未命名文件 测试资源是否正确上传
  9. 考研编程练习----开门人和关门人
  10. mac os 10.10下安装android studio问题:android studio was unable to find a valid jvm