基于Dragon Board 410c开发板实现输入驱动-按键和轨迹球驱动
2016-09-22 10:59
501 查看
前言:
在上一篇博客《基于Dragon Board 410c开发板的触摸屏驱动编写》中,我已经描述了触摸屏驱动编写过程,以及其架构,这篇博客我会跟大家讲述一下按键和轨迹球驱动。
一、按键和轨迹球驱动
MSM具有按键和轨迹球的功能,对应的驱动程序在文件arch/arm/mach-msm/board-mahimahi-keypad.c中,接下来开始介绍此文件的实现流程。
(1)文件board-mahimahi-keypad.c中的全局定义代码如下所示:
static struct gpio_event_info *mahimahi_input_info[] = {
&mahimahi_keypad_matrix_info.info, // 键盘矩阵
&mahimahi_keypad_key_info.info, // 键盘信息
&jogball_x_axis.info.info, // 轨迹球X方向信息
&jogball_y_axis.info.info, // 轨迹球Y方向信息
};
static struct gpio_event_platform_data mahimahi_input_data = {
.names = {
"mahimahi-keypad", // 按键设备
"mahimahi-nav", // 轨迹球设备
NULL,
},
.info = mahimahi_input_info,
.info_count = ARRAY_SIZE(mahimahi_input_info),
.power = jogball_power,
};
static struct platform_device mahimahi_input_device = {
.name = GPIO_EVENT_DEV_NAME,
.id = 0,
.dev = {
.platform_data = &mahimahi_input_data,
},
};
按键和轨迹球是通过GPIO系统来实现的,因此定义了gpio_event_info类型的数组。
"mahimahi-keypad"和"mahimahi-nav"分别是两个设备的名称。
gpio_event_info 指针各式的数组mahimahi_input_info中包含了mahimahi_keypad_matrix_info.info,mahimahi_keypad_key_ info.info,jogball_x_axis.info.info和jogball_y_axis.info.info。
按键驱动是一个利用GPIO矩阵的驱动,由gpio_event_matrix_info矩阵定义,定义还需要包含按键的GPIO矩阵和input设备的信息,内容如下所示:
static unsigned int mahimahi_col_gpios[] = { 33, 32, 31 };
static unsigned int mahimahi_row_gpios[] = { 42, 41, 40 };
#define KEYMAP_INDEX(col, row) ((col)*ARRAY_
SIZE(mahimahi_row_gpios) + (row))
#define KEYMAP_SIZE (ARRAY_SIZE(mahimahi_col_gpios) * \
ARRAY_SIZE(mahimahi_row_gpios))
static const unsigned short mahimahi_keymap
[KEYMAP_SIZE] = { // 按键映射关系
[KEYMAP_INDEX(0, 0)] = KEY_VOLUMEUP, /* 115 */
[KEYMAP_INDEX(0, 1)] = KEY_VOLUMEDOWN, /* 114 */
[KEYMAP_INDEX(1, 1)] = MATRIX_KEY(1, BTN_MOUSE),
};
static struct gpio_event_matrix_info mahimahi
_keypad_matrix_info = {
.info.func = gpio_event_matrix_func,
// 关键函数实现
.keymap = mahimahi_keymap,
.output_gpios = mahimahi_col_gpios,
.input_gpios = mahimahi_row_gpios,
.noutputs = ARRAY_SIZE(mahimahi_col_gpios),
.ninputs = ARRAY_SIZE(mahimahi_row_gpios),
.settle_time.tv.nsec = 40 * NSEC_PER_USEC,
.poll_time.tv.nsec = 20 * NSEC_PER_MSEC,
.flags = (GPIOKPF_LEVEL_TRIGGERED_IRQ |
GPIOKPF_REMOVE_PHANTOM_KEYS |
GPIOKPF_PRINT_UNMAPPED_KEYS),
};
static struct gpio_event_direct_entry mahimahi_
keypad_key_map[] = { // Power按键
{
.gpio = MAHIMAHI_GPIO_POWER_KEY,
.code = KEY_POWER,
},
};
static struct gpio_event_input_info mahimahi_
keypad_key_info = {
.info.func = gpio_event_input_func,
// 关键函数实现
.info.no_suspend = true,
.flags = 0,
.type = EV_KEY,
.keymap = mahimahi_keypad_key_map,
.keymap_size = ARRAY_SIZE(mahimahi_keypad_key_map)
};
keypad_key_matrix _info和keypad _info是gpio_event_matrix_info类型的结构体,分别负责两个和一个按键的处理,
实际上,MSM平台基本上只有三个按键:Power,音量增加按键和音量减少按键。音量增加和音量减少的扫描码分别是KEY_VOLUMEUP(=115)和KEY_VOLUMEDOWN(=114)。
提示:音量控制的两个按键在全键盘的qwerty.kl有所定义,同时符合Linux的input设备和Android的按键标准。
轨迹球部分也是由GPIO实现的,由X方向和Y方向两部分组成,内容如下所示:
static uint32_t jogball_x_gpios[] = {
MAHIMAHI_GPIO_BALL_LEFT, MAHIMAHI_GPIO_BALL_RIGHT,
};
static uint32_t jogball_y_gpios[] = {
MAHIMAHI_GPIO_BALL_UP, MAHIMAHI_GPIO_BALL_DOWN,
};
static struct jog_axis_info jogball_x_axis = {
// X轴的内容
.info = {
.info.func = gpio_event_axis_func,
// 关键函数实现
.count = ARRAY_SIZE(jogball_x_gpios),
.dev = 1,
.type = EV_REL,
.code = REL_X,
.decoded_size = 1U << ARRAY_SIZE(jogball_x_gpios),
.map = jogball_axis_map,
.gpio = jogball_x_gpios,
.flags = GPIOEAF_PRINT_UNKNOWN_DIRECTION,
}
};
static struct jog_axis_info jogball_y_axis = {
// Y轴的内容
.info = {
.info.func = gpio_event_axis_func,
// 关键函数实现
.count = ARRAY_SIZE(jogball_y_gpios)
.dev = 1,
.type = EV_REL,
.code = REL_Y,
.decoded_size = 1U << ARRAY_SIZE(jogball_y_gpios),
.map = jogball_axis_map,
.gpio = jogball_y_gpios,
.flags = GPIOEAF_PRINT_UNKNOWN_DIRECTION,
}
};
在上述代码中,这里的轨迹球是用jog_axis_info类型的结构体进行定义的,这种设备的类型(type)是相对设备EV_REL。
注意:除了默认的AVRCP.kl和qwerty.kl之外,在MSM8916平台中新增了文件h2w_headset.kl文件。
在上一篇博客《基于Dragon Board 410c开发板的触摸屏驱动编写》中,我已经描述了触摸屏驱动编写过程,以及其架构,这篇博客我会跟大家讲述一下按键和轨迹球驱动。
一、按键和轨迹球驱动
MSM具有按键和轨迹球的功能,对应的驱动程序在文件arch/arm/mach-msm/board-mahimahi-keypad.c中,接下来开始介绍此文件的实现流程。
(1)文件board-mahimahi-keypad.c中的全局定义代码如下所示:
static struct gpio_event_info *mahimahi_input_info[] = {
&mahimahi_keypad_matrix_info.info, // 键盘矩阵
&mahimahi_keypad_key_info.info, // 键盘信息
&jogball_x_axis.info.info, // 轨迹球X方向信息
&jogball_y_axis.info.info, // 轨迹球Y方向信息
};
static struct gpio_event_platform_data mahimahi_input_data = {
.names = {
"mahimahi-keypad", // 按键设备
"mahimahi-nav", // 轨迹球设备
NULL,
},
.info = mahimahi_input_info,
.info_count = ARRAY_SIZE(mahimahi_input_info),
.power = jogball_power,
};
static struct platform_device mahimahi_input_device = {
.name = GPIO_EVENT_DEV_NAME,
.id = 0,
.dev = {
.platform_data = &mahimahi_input_data,
},
};
按键和轨迹球是通过GPIO系统来实现的,因此定义了gpio_event_info类型的数组。
"mahimahi-keypad"和"mahimahi-nav"分别是两个设备的名称。
gpio_event_info 指针各式的数组mahimahi_input_info中包含了mahimahi_keypad_matrix_info.info,mahimahi_keypad_key_ info.info,jogball_x_axis.info.info和jogball_y_axis.info.info。
按键驱动是一个利用GPIO矩阵的驱动,由gpio_event_matrix_info矩阵定义,定义还需要包含按键的GPIO矩阵和input设备的信息,内容如下所示:
static unsigned int mahimahi_col_gpios[] = { 33, 32, 31 };
static unsigned int mahimahi_row_gpios[] = { 42, 41, 40 };
#define KEYMAP_INDEX(col, row) ((col)*ARRAY_
SIZE(mahimahi_row_gpios) + (row))
#define KEYMAP_SIZE (ARRAY_SIZE(mahimahi_col_gpios) * \
ARRAY_SIZE(mahimahi_row_gpios))
static const unsigned short mahimahi_keymap
[KEYMAP_SIZE] = { // 按键映射关系
[KEYMAP_INDEX(0, 0)] = KEY_VOLUMEUP, /* 115 */
[KEYMAP_INDEX(0, 1)] = KEY_VOLUMEDOWN, /* 114 */
[KEYMAP_INDEX(1, 1)] = MATRIX_KEY(1, BTN_MOUSE),
};
static struct gpio_event_matrix_info mahimahi
_keypad_matrix_info = {
.info.func = gpio_event_matrix_func,
// 关键函数实现
.keymap = mahimahi_keymap,
.output_gpios = mahimahi_col_gpios,
.input_gpios = mahimahi_row_gpios,
.noutputs = ARRAY_SIZE(mahimahi_col_gpios),
.ninputs = ARRAY_SIZE(mahimahi_row_gpios),
.settle_time.tv.nsec = 40 * NSEC_PER_USEC,
.poll_time.tv.nsec = 20 * NSEC_PER_MSEC,
.flags = (GPIOKPF_LEVEL_TRIGGERED_IRQ |
GPIOKPF_REMOVE_PHANTOM_KEYS |
GPIOKPF_PRINT_UNMAPPED_KEYS),
};
static struct gpio_event_direct_entry mahimahi_
keypad_key_map[] = { // Power按键
{
.gpio = MAHIMAHI_GPIO_POWER_KEY,
.code = KEY_POWER,
},
};
static struct gpio_event_input_info mahimahi_
keypad_key_info = {
.info.func = gpio_event_input_func,
// 关键函数实现
.info.no_suspend = true,
.flags = 0,
.type = EV_KEY,
.keymap = mahimahi_keypad_key_map,
.keymap_size = ARRAY_SIZE(mahimahi_keypad_key_map)
};
keypad_key_matrix _info和keypad _info是gpio_event_matrix_info类型的结构体,分别负责两个和一个按键的处理,
实际上,MSM平台基本上只有三个按键:Power,音量增加按键和音量减少按键。音量增加和音量减少的扫描码分别是KEY_VOLUMEUP(=115)和KEY_VOLUMEDOWN(=114)。
提示:音量控制的两个按键在全键盘的qwerty.kl有所定义,同时符合Linux的input设备和Android的按键标准。
轨迹球部分也是由GPIO实现的,由X方向和Y方向两部分组成,内容如下所示:
static uint32_t jogball_x_gpios[] = {
MAHIMAHI_GPIO_BALL_LEFT, MAHIMAHI_GPIO_BALL_RIGHT,
};
static uint32_t jogball_y_gpios[] = {
MAHIMAHI_GPIO_BALL_UP, MAHIMAHI_GPIO_BALL_DOWN,
};
static struct jog_axis_info jogball_x_axis = {
// X轴的内容
.info = {
.info.func = gpio_event_axis_func,
// 关键函数实现
.count = ARRAY_SIZE(jogball_x_gpios),
.dev = 1,
.type = EV_REL,
.code = REL_X,
.decoded_size = 1U << ARRAY_SIZE(jogball_x_gpios),
.map = jogball_axis_map,
.gpio = jogball_x_gpios,
.flags = GPIOEAF_PRINT_UNKNOWN_DIRECTION,
}
};
static struct jog_axis_info jogball_y_axis = {
// Y轴的内容
.info = {
.info.func = gpio_event_axis_func,
// 关键函数实现
.count = ARRAY_SIZE(jogball_y_gpios)
.dev = 1,
.type = EV_REL,
.code = REL_Y,
.decoded_size = 1U << ARRAY_SIZE(jogball_y_gpios),
.map = jogball_axis_map,
.gpio = jogball_y_gpios,
.flags = GPIOEAF_PRINT_UNKNOWN_DIRECTION,
}
};
在上述代码中,这里的轨迹球是用jog_axis_info类型的结构体进行定义的,这种设备的类型(type)是相对设备EV_REL。
注意:除了默认的AVRCP.kl和qwerty.kl之外,在MSM8916平台中新增了文件h2w_headset.kl文件。
相关文章推荐
- 手把手教你写Linux设备驱动---input子系统(二)--按键驱动实现(一)(基于友善之臂4412开发板)
- 基于Tiny4412的Linux按键输入子系统驱动的实现(一)
- 基于dragonboard 410c的智能魔镜设计(2)——数据库设计与实现
- 基于Dragonboard 410c的 A路径搜索算法实现
- 基于dragonboard 410c的kobuki机器人简单控制——驱动安装
- 基于DragonBoard 410c之按键添加
- 基于Dragonboard 410c实现android局域网控制系统
- 基于DragonBoard 410c的家庭智能环保卫士——(10)数据库python代码实现
- 基于Dragonboard 410c的自动感应调色灯软件编码实现
- 基于开发板DragonBoard 410c的应用开发和部署
- 如何实现DragonBoard 410c GPIO控制(基于linux环境)
- 基于Dragonboard 410c的自动感应调色灯实现效果演示
- 基于Tiny4412的Linux按键输入子系统驱动的实现(二)
- 基于DragonBoard 410c的家庭智能环保卫士——(11)室内栅格地图位置更新Python实现
- 基于DragonBoard 410c的遥控炮台二之舵机驱动(下)
- 基于US-100超声波在dragonboard 410c Linux上的超声波驱动编写
- 基于dragonboard 410c的智能魔镜设计(8)——UI的python脚本实现
- 基于DragonBoard 410c 开发板的智能物料仓库调控系统之zigbee模块简介
- 基于DragonBoard 410c android系统实现红外遥控功能
- 基于ARM9开发板的按键字符设备驱动实现