linux 摇杆驱动程序,ARM Linux 驱动Input子系统之按键驱动测试

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

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

1、根据开发板的原理图

977b2b657dfc6fcc2d10e76cf503d1a2.png

284d2e1cc6cfadf6096d258007bd3a4b.png

确定按键的硬件接口为: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 = ;

};

switch@ {

label = "button1";

linux,code = <0x101>;

gpios = ;

};

switch@ {

label = "button2";

linux,code = <0x102>;

gpios = ;

gpio-key,wakeup;

};

switch@ {

label = "button3";

linux,code = <0x103>;

gpios = ;

};

};

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

#include

#include

#include

#include

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输入子系统浅解

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

linux kernel input 子系统分析

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

Linux&sol;Android——input子系统核心 &lpar;三&rpar;【转】

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

linux输入子系统之按键驱动

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

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

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

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

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

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

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

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

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

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

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

随机推荐

让MyEclipse2013兼容Retina屏幕

1. 找到文件:/Applications/MyEclipse/MyEclipse Professional.app/Contents/Profile/myeclipse.app/Contents/I ...

SharePoint 2013 - REST API about Content

1. 获取所有子站点信息(Sub Site): var subSitesInfo = "{0}/_api/Web/WebInfos?$orderby=Title desc"; // ...

【wikioi】1033 蚯蚓的游戏问题(费用流)

http://wikioi.com/problem/1033/ 这题也是很水的费用流啊,同之前那题一样,拆点然后建边,容量为1,费用为点权.然后建个源连第一行每个点,容量为1,费用为0,然后最后一行每 ...

轻松学习Ionic (一) 搭建开发环境,并创建工程

1.准备工作     下载 Node.js(下载包),WebStorm(IDE,编写代码,浏览器调试),JDK(webstorm 运行环境),Android SDK (Android编译)     不 ...

Ror初学笔记

Ror正在以惊人的速度增长着,特别是在常常光顾JavaEye的时候发现Ror已经在国内有非常好的基础了,当然要凑个热闹尝尝鲜 咯. 眼下国内Ror的中文资料还是非常少的,到网上找找就仅仅有Eiffel ...

如何精准高效的实现视觉稿?------前端开发辅助工具AlloyDesigner使用介绍

AlloyDesigner:http://alloyteam.github.io/AlloyDesigner/ 介绍:AlloyDesigner是腾讯开发的一款工具,其在页面构建过程中,直接嵌入开发的 ...

noip2015 提高组 解题报告

完美退役...说好的不卡常呢QAQ day1: T1:模拟题?..考察选手将题目描述翻译成代码的能力233 //其实真相是考验rp..论代码雷同的危害233 T2:简单图论,每个点出度为1所以是基环内 ...

动态SQL详解

动态SQL 在之前用户所编写的PL/SQL程序时有一个最大的特点:就是所操作的数据库对象(例如:表)必须存在,否则创建的子程序就会出问题,而这样的操作在开发之中被称为静态SQL操作,而动态SQL操作可 ...

Python - 3&period; Input and Output

from:http://interactivepython.org/courselib/static/pythonds/Introduction/InputandOutput.html Input a ...

【Acm】八皇后问题

八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题. 其解决办法和我以前发过的[算法之美—Fire Net:www.cnblogs.com/lcw/p/3159414.html]类似 题目:在8 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值