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)的主要内容,如果未能解决你的问题,请参考以下文章

使用GDB调试设备驱动程序

:Linux设备驱动的调试

《驱动调试 - 根据oops的栈信息,确定函数调用过程》

内核调试-perf introduction

[架构之路-29]:目标系统 - 系统软件 - Linux OS内核以及内核驱动的调试技术

11.事件驱动events