fl2440内核自带按键驱动移植及hexdump命令

本文介绍了在Centos 6.7环境下,使用buildroot-2012.08交叉编译器,针对FL2440开发板的Linux-3.0内核进行GPIO按键驱动的移植过程,详细展示了如何修改内核配置和设备树以添加按键驱动。同时,文章讲解了如何利用hexdump工具解析/dev/input/event0设备节点的按键事件,解读了hexdump输出的数据结构和各字段含义。


主机操作系统: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
找到按键信息






对照着自己的原理图修改一下红色标记的部分放到mach-smdk2440.c就Ok了,我们要好好利用别人的资源哦。。。毕竟linux是开源的。


http://www.cnblogs.com/kerrycode/p/5077687.html    (hexdump命令)




<think>我们正在讨论hexdump命令,用户请求获取该命令的详细解释。根据之前的对话历史,用户已经对`hexdump -C`有了一定的了解,现在希望获得更全面的命令解释。 参考引用资料: - 引用[1]和[2]介绍了hexdump的基本用途:查看和解析二进制文件,以十六进制格式显示文件内容。 - 引用[4]提供了详细的参数说明(基于RHEL 5.7)。 - 引用[5]展示了使用`hexdump -C`的典型输出示例。 结合这些信息,我应当构建一个全面的解释,包括: 1. 命令的基本功能和典型应用场景 2. 核心参数详解(特别是常用参数如-C, -n, -s等) 3. 输出格式解析(重点说明-C格式的双栏显示) 4. 实际使用示例 5. 与其他工具(如xxd, od)的简单对比 特别注意:用户要求使用中文回答,数学表达式需用$...$或$$...$$格式(但hexdump解释中数学表达式较少,可能涉及偏移量计算时使用)。 由于hexdump参数较多,我将重点解释最常用的参数,避免信息过载。同时,根据引用[3]和[5]的示例,加入实际命令示例。 最后,按照要求生成相关问题。 </think>### `hexdump` 命令详解 `hexdump` 是 Linux 中用于**以十六进制、十进制或 ASCII 格式解析文件二进制内容**的核心工具,适用于二进制文件分析、数据结构调试和隐藏内容检测[^1][^2]。 --- #### **一、核心功能与用途** 1. **二进制文件分析** - 查看 ELF 可执行文件头、图片元数据等二进制结构。 - 检测文件中的非打印字符(如空字符 `0x00`)。 2. **数据格式转换** - 支持十六进制(`-x`)、八进制(`-o`)、十进制(`-d`)、ASCII(`-c`)多种格式输出。 3. **偏移量定位** - 左侧列显示**十六进制偏移地址**(如 `00000000`),便于精确定位数据位置。 --- #### **二、命令语法** ```bash hexdump [选项] 文件名 ``` 或简写为: ```bash hd [选项] 文件名 # 部分系统支持 ``` --- #### **三、常用参数详解** | 参数 | 作用 | 示例 | |------|------|------| | **`-C`** | **规范格式(十六进制 + ASCII 双栏)** | `hexdump -C file.bin` | | **`-n N`** | 仅解析前 N 字节 | `hexdump -n 64 file` | | **`-s OFFSET`** | 从指定偏移开始解析 | `hexdump -s 0x100 file` | | **`-v`** | 禁用重复行压缩(显示全部原始数据) | `hexdump -Cv file` | | **`-x`** | 双字节十六进制输出 | `hexdump -x file` | | **`-e fmt`** | **自定义格式**(高级用法) | 见下文 | --- #### **四、输出格式解析(以 `-C` 为例)** ```bash 00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| ``` 1. **左侧:偏移地址** `00000000` 表示当前行的起始字节位置(十六进制)。 2. **中部:十六进制数据** - 每行默认 16 字节,每 8 字节用空格分隔(`7f 45 ... 00 00`)。 3. **右侧:ASCII 映射** - 可打印字符显示原字符(如 `.`、`E`、`L`)。 - 不可打印字符(如 `0x00`)显示为 `.`。 - UTF-8 等多字节字符**无法完整显示**,会被拆分为单字节处理[^5]。 --- #### **五、自定义格式(`-e` 高级用法)** 通过 `-e` 定义解析规则: ```bash hexdump -e '格式字符串' 文件 ``` - **示例 1**:每字节显示为 8 位十六进制 ```bash hexdump -e '/1 "%08X "' file # 输出:0000007F 00000045 ... ``` - **示例 2**:解析 4 字节整数(小端序) ```bash hexdump -e '/4 "%d "' file # 若数据为 01 00 00 00 → 输出:1 ``` - **格式符号**: - `/1`:单字节单位 - `/4 "%d"`:4 字节按十进制整数解析 - `"%08X"`:8 位十六进制(补零对齐) --- #### **六、典型应用场景** 1. **查看二进制文件头** ```bash hexdump -C -n 32 /bin/ls # 解析 ls 命令前 32 字节 ``` 2. **检测文本中的隐藏字符** ```bash echo -e "Hello\x00World" | hexdump -C ``` 输出: ``` 00000000 48 65 6c 6c 6f 00 57 6f 72 6c 64 |Hello.World| ``` 3. **网络数据包分析** ```bash tcpdump -i eth0 -w packet.pcap # 抓包 hexdump -C -s 14 -n 20 packet.pcap # 解析 IP 头(偏移 14 字节) ``` --- #### **七、与其他工具对比** | 命令 | 特点 | 适用场景 | |---------------|-------------------------------|----------------------| | `hexdump -C` | 规范双栏输出+偏移地址 | 二进制结构分析 | | `xxd` | 类似 `-C`,支持反向生成二进制 | 二进制编辑 | | `od -x` | 纯十六进制输出(无 ASCII 栏) | 原始数据提取 | > 注意:不同 Linux 发行版的 `hexdump` 参数可能略有差异,建议通过 `man hexdump` 查看本地帮助[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值