上一篇已经谈过,在现内核的中引入设备树之后对于内核驱动的编写,主要集中在硬件接口的配置上了即xxxx.dts文件的编写。

在自己的开发板上移植按键驱动:

1、根据开发板的原理图

确定按键的硬件接口为:GPIO2_2、GPIO2_3、GPIO2_5、GPIO0_30。

修改dts文件使其与原理图的按键接口一致。

gpio_buttons: gpio_buttons@ {
compatible = "gpio-keys";
#address-cells = <>;
#size-cells = <>; switch@ {
label = "button0";
linux,code = <0x100>;
gpios = <&gpio2 GPIO_ACTIVE_HIGH>;
}; switch@ {
label = "button1";
linux,code = <0x101>;
gpios = <&gpio2 GPIO_ACTIVE_HIGH>;
}; switch@ {
label = "button2";
linux,code = <0x102>;
gpios = <&gpio0 GPIO_ACTIVE_HIGH>;
gpio-key,wakeup;
}; switch@ {
label = "button3";
linux,code = <0x103>;
gpios = <&gpio2 GPIO_ACTIVE_HIGH>;
};
};
gpio_keys_s0: gpio_keys_s0 {
pinctrl-single,pins = <
0x94 (PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_oen_ren.gpio2_3 */
0x90 (PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_advn_ale.gpio2_2 */
0x70 (PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_wait0.gpio0_30 */
0x9c (PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ben0_cle.gpio2_5 */
>;
};

保存编译生成zyr-am335x-evmsk.dtb

在内核中确保xxx/linux3.14.65/drivers/input/keyboard/gpio_key.c被编译进去(可以通过各层的Makefile与Kconfig还有menuconfig来实现)

编译好的内核和dtb文件下载到开发板中查看按键的事件类型:

[root@zyr-am335x mnt]#cd
[root@zyr-am335x ]#cat /proc/bus/input/devices
I: Bus= Vendor= Product= Version=
N: Name="gpio_buttons.7"
P: Phys=gpio-keys/input0
S: Sysfs=/devices/gpio_buttons./input/input0
U: Uniq=
H: Handlers=event0
B: PROP=
B: EV=
B: KEY=f [root@zyr-am335x ]#

可以看到按键的事件或者是用户接口吧为event0.。知道了用户的按键接口就可以编写测试程序了。

测试程序目的:实现一个按键对应一个LED灯,按键按一次LED灯的状态变化一次(前提是led子系统对应的LED驱动已经加载入内核中):

#include <stdio.h>
#include <linux/input.h>
#include <fcntl.h>
#include <sys/time.h>
#include <unistd.h> void keyboard_test()
{
int count_sw1 = ;
int count_sw2 = ;
int count_sw3 = ;
int count_sw4 = ;
int fd=open("/dev/input/event0",O_RDWR);
if( fd <= )
{
printf("Can not open keyboard input file\n");
} struct input_event *event;
char buf[] = {};
fd_set rfds;
FD_ZERO(&rfds);
FD_SET(fd, &rfds); while()
{
int ret = select(fd + ,&rfds, NULL,NULL,NULL);
if(ret < )
continue;
if( FD_ISSET(fd, &rfds) )
{
int readn = read(fd, buf, sizeof(struct input_event));
if (readn <= )
{
printf("uart read error %d\n", readn);
continue;
} struct input_event *my_event=(struct input_event*)buf;
if(my_event->type == EV_KEY)
{
switch( my_event->code )
{
case :
printf("This is a button:%d %d\n", my_event->code,my_event->value);
count_sw1++;
if(count_sw1==)
{
system("echo 1 > /sys/class/leds/zyrD1:green:usr0/brightness");
}
else if(count_sw1==)
{
system("echo 0 > /sys/class/leds/zyrD1:green:usr0/brightness");
count_sw1=;
}
break;
case :
printf("This is a button:%d %d\n", my_event->code,my_event->value);
count_sw2++;
if(count_sw2==)
{
system("echo 1 > /sys/class/leds/zyrD2:green:usr1/brightness");
}
else if(count_sw2==)
{
system("echo 0 > /sys/class/leds/zyrD2:green:usr1/brightness");
count_sw2=;
}
break;
case :
printf("This is a button:%d %d\n", my_event->code,my_event->value);
count_sw3++;
if(count_sw3==)
{
system("echo 1 > /sys/class/leds/zyrD3:green:heartbeat/brightness");
}
else if(count_sw3==)
{
system("echo 0 > /sys/class/leds/zyrD3:green:heartbeat/brightness");
count_sw3=;
}
break;
case :
printf("This is a button:%d %d\n", my_event->code,my_event->value);
count_sw4++;
if(count_sw4==)
{
system("echo 1 > /sys/class/leds/zyrD4:green:mmc0/brightness");
}
else if(count_sw4==)
{
system("echo 0 > /sys/class/leds/zyrD4:green:mmc0/brightness");
count_sw4=;
}
break;
default:
break; }
} } }
} int main()
{
keyboard_test();
return ;
}

将生成的可执行文件copy到nfs的共享目录下运行:

[root@zyr-am335x ]#cd mnt/
[root@zyr-am335x mnt]#ls
LED_zixitong gpio_keys.ko leds-gpio.ko zyr-hello.ko
gpio_buttons_leds led_test zleds-gpio.ko
[root@zyr-am335x mnt]#./gpio_buttons_leds
This is a button:
This is a button:
This is a button:
This is a button:
This is a button:
This is a button:
This is a button:
This is a button:
This is a button:
This is a button:
This is a button:
This is a button:
This is a button:
This is a button:
This is a button:
This is a button: 0
其中的256,257,258,259分别对应dts文件中的linux,code = <0x101>;linux,code = <0x102>;linux,code = <0x103>;linux,code = <0x104>;

ARM Linux 驱动Input子系统之按键驱动测试的更多相关文章

  1. ARM Linux内核Input输入子系统浅解

    --以触摸屏驱动为例 第一章.了解linux input子系统         Linux输入设备总类繁杂,常见的包括有按键.键盘.触摸屏.鼠标.摇杆等等,他们本身就是字符设备,而linux内核将这些 ...

  2. linux kernel input 子系统分析

    Linux 内核为了处理各种不同类型的的输入设备 , 比如说鼠标 , 键盘 , 操纵杆 , 触摸屏 , 设计并实现了一个对上层应用统一的试图的抽象层 , 即是Linux 输入子系统 . 输入子系统的层 ...

  3. Linux/Android——input子系统核心 (三)【转】

    本文转载自:http://blog.csdn.net/jscese/article/details/42123673 之前的博客有涉及到linux的input子系统,这里学习记录一下input模块. ...

  4. linux输入子系统之按键驱动

    上一节中,我们讲解了Linux  input子系统的框架,到内核源码里详细分析了输入子系统的分离分层的框架等. 上一节文章链接:http://blog.csdn.net/lwj103862095/ar ...

  5. 基于input子系统的sensor驱动调试(二)

    继上一篇:http://www.cnblogs.com/linhaostudy/p/8303628.html#_label1_1 一.驱动流程解析: 1.模块加载: static struct of_ ...

  6. 基于input子系统的sensor驱动调试(一)

    要想弄明白世界的本质,就要追根溯源:代码也是一样的道理: 最近调试几个sensor驱动,alps sensor驱动.compass sensor驱动.G-sensor驱动都是一样的架构: 一.基于in ...

  7. linux之i2c子系统架构---总线驱动

    编写i2c设备驱动(从设备)一般有两种方式: 1.用户自己编写独立的从设备驱动,应用程序直接使用即可. 2.linux内核内部已经实现了一个通用的设备驱动,利用通用设备驱动编写一个应用程序(用户态驱动 ...

  8. linux字符驱动之poll机制按键驱动

    在上一节中,我们讲解了如何自动创建设备节点,实现一个中断方式的按键驱动.虽然中断式的驱动,效率是蛮高的,但是大家有没有发现,应用程序的死循环里的读函数是一直在读的:在实际的应用场所里,有没有那么一种情 ...

  9. linux内核input子系统解析【转】

    转自:http://emb.hqyj.com/Column/Column289.htm 时间:2017-01-04作者:华清远见 Android.X windows.qt等众多应用对于linux系统中 ...

随机推荐

  1. Redmine数据表字段说明

    Redmine数据表结构 issues tracker_id 跟踪标签的id,外键到trakers表 project_id 外键到项目project subject 主题 description 问题 ...

  2. 【译】第六篇 Integration Services:初级工作流管理

    本篇文章是Integration Services系列的第六篇,详细内容请参考原文. 简介在前几篇文章中,我们关注使用增量加载方式加载数据.在本篇文章,我们将关注使用优先约束管理SSIS控制流中的工作 ...

  3. Inline函数使用注意事项

    Inline函数使用注意事项 1.在一个文件中定义的inline函数不能再另一个文件中使用 2.inline函数应简洁,只有少数几个语句. 3.在inline函数中不能有循环,if,switch语句. ...

  4. 微信小程序实战--开发一个简单的快递单号查询

    功能如图: 虽然工作中只负责小程序后台开发,但是还是小程序开发产生了浓厚的兴趣,官方文档也是超级详细了 这里就简单做一个快递单号的查询: 新建一个page: 接着就可以写wxml了.这里用一个简单的i ...

  5. Wannacry样本取证特征与清除

    一.取证特征 1)网络域名特征 http://www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com 2)文件特征 母体文件 mssecsvc.exe c: ...

  6. 最短路径之迪杰斯特拉(Dijkstra)算法

    对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...

  7. vm tools安装包为空

    新装了linux mint虚拟机之后突然发现安装vm tools时为空 1.关闭虚拟机2.打开设置 3.把CD/DVD(SATA)从安装系统时挂载的镜像改为自动检测 4.重启安装vm tools发现没 ...

  8. 002_Linux-Memory专题

    一.单独查看某个进程的内存占用 pmap 736 | tail -n 1 二. 以前我对这块认识很模糊,而且还有错误的认识:今天由我同事提醒,所以我决定来好好的缕缕这块的关系. 图: -------- ...

  9. mysql测试工具 -> mysqlslap

    一.简介 mysqlslap是mysql自带的基准测试工具 优点:查询数据,语法简单,灵活容易使用.该工具可以模拟多个客户端同时并发的向服务器发出查询更新,给出了性能测试数据而且提供了多种引擎的性能比 ...

  10. JS判断是否是PC端访问网站

    function IsPC() { var userAgentInfo = navigator.userAgent; var Agents = ["Android", " ...