fl2440内核自带按键驱动移植及hexdump命令
2017-04-29 19:47
495 查看
主机操作系统:Centos 6.7
交叉编译器版本:buildroot-2012.08
开发板平台: FL2440
Linux内核版本: linux-3.0
开发模块: linux内核自带按键驱动移植
1、修改arch/arm/mach-s3c2440/mach-smdk2440.c添加button驱动添加头文件
#include <linux/gpio.h> #include <linux/gpio_keys.h> #include <linux/input.h>
#if defined(CONFIG_KEYBOARD_GPIO)||defined(CONFIG_KEYBOARD_GPIO_MODULE) static struct gpio_keys_button s3c2440_buttons[] = { { .gpio = S3C2410_GPF(0), .code = KEY_F1, .desc = "button 1", .active_low = 0, }, { .gpio = S3C2410_GPF(2), .code = KEY_F2, .desc = "button 2", .active_low = 0, }, { .gpio = S3C2410_GPF(3), .code = KEY_F3, .desc = "button 3", .active_low = 0, }, { .gpio = S3C2410_GPF(4), .code = KEY_F4, .desc = "button 4", .active_low = 0, }, }; static struct gpio_keys_platform_data s3c2440_button_data = { .buttons = s3c2440_buttons, .nbuttons = ARRAY_SIZE(s3c2440_buttons), }; static struct platform_device s3c2440_button_device = { .name = "gpio-keys", .id = -1, .dev = { .platform_data = &s3c2440_button_data, } }; #endif修改结构体smdk2440_devices[],添加button的驱动
306 static struct platform_device *smdk2440_devices[] __initdata = { 307 &s3c_device_ohci, 308 &s3c_device_lcd, 309 &s3c_device_wdt, 310 &s3c_device_i2c0, 311 &s3c_device_iis, 312 &s3c_device_dm9000, 313 &uda1340_codec, 314 &s3c24xx_uda134x, 315 &samsung_asoc_dma, 316 &s3c_device_timer,//add by fanmaolin 2017.4.23 317 &smdk2440_beeper_device,//add by fanmaolin 2017.4.23 318 &s3c2440_button_device,//add by fanmaolin 2017.4.29 319 };
修改smdk2440_machine_init函数,加入如下代码:
for (i = 0; i < ARRAY_SIZE(s3c2440_buttons); i++) { s3c_gpio_setpull(s3c2440_buttons[i].gpio, S3C_GPIO_PULL_UP); s3c_gpio_cfgpin(s3c2440_buttons[i].gpio, S3C2410_GPIO_INPUT); }
2、在内核中添加对按键的支持
[fanmaolin@Centeros linux-3.0]$ make menuconfig
Device Drivers --->
Input device support --->
<*> Event interface
[*] Keyboards --->
<*> GPIO Buttons
<*> Polled GPIO buttons
3、make后在开发板上用hexdump命令进行测试
hexdump是Linux下的一个二进制文件查看工具,它可以将二进制文件转换为ASCII、八进制、十进制、十六进制格式进行查看。
指令所在路径:/usr/bin/hexdump
命令语法:
hexdump: [-bcCdovx] [-e fmt] [-f fmt_file] [-n length] [-s skip] [file ...]
命令参数:
参数 | 长参数 | 描叙 |
-b | | 每个字节显示为8进制。一行共16个字节,一行开始以十六进制显示偏移值 |
-c | | 每个字节显示为ASCII字符 |
-C | | 每个字节显示为16进制和相应的ASCII字符 |
-d | | 两个字节显示为10进制 |
-e | | 格式化输出 |
-f | | Specify a file that contains one or more newline separated format strings. Empty lines and lines whose first non-blank character is a hash mark (#) are ignored. |
-n | | 只格式前n个长度的字符 |
-o | | 两个字节显示为8进制 |
-s | | 从偏移量开始输出 |
-v | | The -v option causes hexdump to display all input data. Without the -v option, any number of groups of output lines, which would be identical to the immediately preceding group of output lines |
-x | | 双字节十六进制显示 |
由于gpio-keys驱动将按键事件映射到了/dev/input/event0设备节点上,因此,对该设备节点使用hexdump工具可以读取到按键事件。
我们在这里用hexdump测试按键
上面是依次按下4个按键所得到的结果,每按一个键,会出现4行数据,这是因为每按一次键包括键的按下和键的抬起两个动作,而每个动作结束后还会有一个同步事件发生,因此会出现4行数据。
每行的倒数第四个数据到倒数第二数据分别对应input_event数据结构中的type
,code ,value
struct input_event {
struct timeval time;
__u16 type; //按键类型
__u16 code; //按键代码
__s32 value; //按键的值
};
结合之前设置的linux,code分析可知,hexdump打印的各列数据含义如下:
第一列:行号
第2~5列:输入事件时间戳,即结构体中的time。
第6列:输入事件类型,即结构体中的type。
第7列:按键的键值,即结构体中的code。
第8列:按键的状态,即结构体中的value,1表示按下,0表示松开。
我们也可以用10进制显示
经过计算或直接看图可知按键代码
button1 003b 转换为10进制为 59
button2 003c 转换为10进制为 60 以此类推 。。。
hexdump 以ASCII字符显示时,可以输出换行符,这个功能可以用来检查文件是Linux的换行符格式还是Widows格式换行符。
问题总结:
关于内核自带驱动的移植方法大同小异,套路都是修改make menuconfig,然后修改设备信息并添加,如果你不知道该怎么写,就去内核里找找,参考别人的代码,比如按键驱动,
[fanmaolin@Centeros ~]$ cd fl2440/kernel/linux-3.0/arch/arm/mach-s3c2440/mach- mach-anubis.c mach-gta02.c mach-nexcoder.c mach-osiris-dvs.c mach-rx3715.c mach-smdk2440.o mach-at2440evb.c mach-mini2440.c mach-osiris.c mach-rx1950.c mach-smdk2440.c
在这里你可以看到不同型号的开发板,
[fanmaolin@Centeros ~]$ vim fl2440/kernel/linux-3.0/arch/arm/mach-s3c2440/mach-mini2440.c找到按键信息
对照着自己的原理图修改一下红色标记的部分放到[b]mach-smdk2440.c就Ok了,我们要好好利用别人的资源哦。。。毕竟linux是开源的。[/b]
http://www.cnblogs.com/kerrycode/p/5077687.html (hexdump命令)
相关文章推荐
- fl2440——移植USB驱动、内核添加USB支持、U盘挂载
- Linux-2.6.32.2内核在mini2440上的移植(十六)---基于中断的按键驱动移植
- Linux-2.6.32.2内核在mini2440上的移植(十六)---基于中断的按键驱动移植
- fl2440内核移植(四)——DM9000移植
- Fl2440内核添加DM9000网卡驱动
- Linux-2.6.32.2内核在mini2440上的移植(十六)---基于中断的按键驱动移植
- FL2440移植LINUX-3.4.2 -- 内核自带的触摸屏驱动移植
- fl2440内核移植(二)——RTC移植
- fl2440内核移植
- fl2440 触摸屏驱动的移植
- [转]inux3.1.8内核移植到gt2440---CS8900A驱动移植
- FL2440移植LINUX-3.4.2 (七)--驱动移植LCD(移植自己写的和移植内核自带的)
- linux2.6.37.4内核在2440开发板上移植 触摸屏驱动移植
- fl2440内核移植(五)——USB驱动移植
- linux-2.6.22.6中LCD驱动到FL2440-I移植
- 【引用】Linux-2.6.32.2内核在mini2440上的移植(十六)---基于中断的按键驱动移植
- 内核linux-3.0移植到fl2440-----添加DM9000网卡驱动
- 内核linux-3.0移植到fl2440-----添加U盘,MMC和LCD驱动
- 移植驱动到内核学习笔记2-----LED和按键驱动
- fl2440 内核移植