Linux-hexdump命令调试event驱动—详解(13)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux-hexdump命令调试event驱动—详解(13)相关的知识,希望对你有一定的参考价值。
hexdump: 查看文件的内容,比如二进制文件中包含的某些字符串,通常用来调试驱动用
1.调试 键盘驱动 讲解
当我们insmod挂载了键盘驱动后,找到键盘驱动被放在event1设备里,
此时没有按键按下,所以event1里面的数据是没有的,那么数据又是从来哪里来?
通过键盘驱动的read函数,若有按键按下,就会上传按键数据给用户层,此时的用户层就是hexdump
因为键盘驱动的input_handler 是:evdev_handler
所以键盘驱动的read函数是: evdev_handler->evdev_fops->evdev_read
进入evdev_read()函数,如下图所示:
evdev_event_to_user()这个函数从字面上来看,显然就是用来上传给用户层的函数,其中buffer是函数参数,指向用户层,
所以数据就是event.
我们来看看event的结构体:input_event
struct input_event { struct timeval time; //事件发生的时间 __u16 type; // 哪类事件, 比如按键事件 __u16 code; // 对应的事件里支持的哪个变量,比如按键K __s32 value; // 对应的变量里的数值, 比如松开按键则是1,反之为0 };
把 time里的成员展开如下:
struct input_event { long tv_sec; /* seconds */ //秒 long tv_usec; /* microseconds */ //微妙 __u16 type; // 哪类事件, 比如按键事件 __u16 code; // 对应的事件里支持的哪个变量,比如按键K __s32 value; // 对应的变量里的数值, 比如松开按键则是1,反之为0 };
所以我们使用 hexdump /dev/event1 来调试时,如果按下按键就会打印上面input_event结构体里的数据
1.1以按开发板的按键 KEY_L,为例(因为大小端,所以数据是反着的,比如下面的数值):
# hexdump /dev/event1 /*按下时:*/ //hexdump序列号 秒 微妙 键盘事件 0x26变量 数值=1(按下) 0000000 07c6 0000 faa2 000b 0001 0026 0001 0000 //hexdump序列号 秒 微妙 同步事件 0x00变量 数值=0 0000010 07c6 0000 faac 000b 0000 0000 0000 0000 /*松开时:*/ //hexdump序列号 秒 微妙 键盘事件 0x26变量 数值=0(松开) 0000020 07c6 0000 cf67 000d 0001 0026 0000 0000 //hexdump序列号 秒 微妙 同步事件 0x00变量 数值=0 0000030 07c6 0000 cf70 000d 0000 0000 0000 0000
以上是关于Linux-hexdump命令调试event驱动—详解(13)的主要内容,如果未能解决你的问题,请参考以下文章