实验四. 基于GPIO方式的红外驱动移植实验
实验目的
- 掌握平台主板红外接收器驱动移植流程;
- 掌握内核添加任意遥控器设备按键支持的流程;
实验环境
- 硬件:CBT-EMB-MIP 实验平台,PC机;
- 软件:VMware,Linux OS;
实验内容
- 内核添加任意遥控器设备按键支持;
实验原理
- 驱动文件
drivers/media/rc/gpio-ir-recv.c
include/media/gpio-ir-recv.h
- 在
mach-tiny4412.c
文件中添加对红外设备的支持:
#ifdef CONFIG_IR_GPIO_CIR
#include <media/gpio-ir-recv.h>
#include <media/rc-map.h>
static struct gpio_ir_recv_platform_data tiny4412_rc_data = {
.gpio_nr = EXYNOS4_GPX2(0), //红外中断引脚
.active_low = 1,
.map_name = RC_MAP_NEC_TERRATEC_CINERGY_XS, //遥控器对应红外码表
};
static struct platform_device tiny4412_device_gpiorc = {
.name = "gpio-rc-recv",
.id = -1,
.dev = {
.platform_data = &tiny4412_rc_data,
},
};
#endif
说明:说明:设备名称是“gpio-rc-recv”,这个和gpio-rc-recv.c驱动中的驱动名称一致,才能注册这个设备驱动。 在多核心平台上,使用EXYNOS4_GPX2(0)这个管脚连接红外接收管的中断管脚,所以在gpio_ir_recv_platform_data结构体中指定gpio_nr为EXYNOS4_GPX2(0)
- 配置内核,支持IRM驱动:
Device Drivers --->
[*] Multimedia support --->
[*] Remote Controller adapter --->
<*> GPIO IR remote control
系统启动时输出的调试信息:
[ 1.960000] lirc_dev: IR Remote Control driver registered, major 250
[ 1.960000] IR NEC protocol handler initialized
[ 1.960000] IR RC5(x) protocol handler initialized
[ 1.960000] IR RC6 protocol handler initialized
[ 1.960000] IR JVC protocol handler initialized
[ 1.960000] IR Sony protocol handler initialized
[ 1.960000] IR RC5 (streamzap) protocol handler initialized
[ 1.960000] IR SANYO protocol handler initialized
[ 1.960000] IR LIRC bridge handler initialized
[ 1.960000] Registered IR keymap rc-empty
[ 1.960000] input: gpio_ir_recv as /devices/virtual/rc/rc0/input3
[ 1.960000] rc0: gpio_ir_recv as /devices/virtual/rc/rc0
[ 1.960000] rc rc0: lirc_dev: driver ir-lirc-codec (gpio-rc-recv) registered at minor = 0
实验步骤
获取遥控器按键码值
- 启动Android系统,按下平台屏幕下方的
选择
按钮选择到A9主处理器上。 - 通过Xshell或adb shell进入终端。
- 输入
su
获取权限后执行getevent -l
会打印如下信息:
root@android:/dev/input # getevent -l
add device 1: /dev/input/event2
name: "tiny4412-key"
could not get driver version for /dev/input/mouse0, Not a typewriter
add device 2: /dev/input/event1
name: "fa_ts_input"
add device 3: /dev/input/event0
name: "ft5x0x_ts"
could not get driver version for /dev/input/mice, Not a typewriter
add device 4: /dev/input/event3
name: "gpio_ir_recv"
- 使用遥控器对着平台的红外接收器按下相应按键,在终端上会捕捉到相应键码信息。本例中按键的键码为
0000bf15
add device 4: /dev/input/event3
name: "gpio_ir_recv"
/dev/input/event3: EV_MSC MSC_SCAN 0000bf15
/dev/input/event3: EV_KEY KEY_ENTER DOWN
/dev/input/event3: EV_SYN SYN_REPORT 00000000
/dev/input/event3: EV_MSC MSC_SCAN 0000bf15
/dev/input/event3: EV_SYN SYN_REPORT 00000000
/dev/input/event3: EV_MSC MSC_SCAN 0000bf15
/dev/input/event3: EV_SYN SYN_REPORT 00000000
/dev/input/event3: EV_MSC MSC_SCAN 0000bf15
/dev/input/event3: EV_SYN SYN_REPORT 00000000
/dev/input/event3: EV_KEY KEY_ENTER UP
/dev/input/event3: EV_SYN SYN_REPORT 00000000
内核中添加键码映射
- 不同的遥控器会有不同的键码,需要在linux内核中做键码映射。 在实验原理中可知采用的键码映射表信息如下
.map_name = RC_MAP_NEC_TERRATEC_CINERGY_XS,
路径为:drivers/media/rc/keymaps/rc-nec-terratec-cinergy-xs.c
- 修改该文件,在
static struct rc_map_table nec_terratec_cinergy_xs[] = {}
结构体中参照其他遥控器配置键码映射。示例海信电视遥控器:
#if 1
//#Hisense CN-22601
{ 0xbf0d, KEY_POWER},
{ 0xbf5c, KEY_BACK},
{ 0xbf16, KEY_UP},
{ 0xbf19, KEY_LEFT},
{ 0xbf15, KEY_ENTER},
{ 0xbf18, KEY_RIGHT},
{ 0xbf17, KEY_DOWN},
{ 0xbf1b, KEY_HOMEPAGE},
{ 0xbf14, KEY_MENU},
{ 0xbf44, KEY_VOLUMEUP},
{ 0xbf43, KEY_VOLUMEDOWN},
{ 0xbf0e, KEY_MUTE},
#endif
说明:左侧十六进制为遥控器实际键值,通过getevent
获得。右侧为Android层的键码。例:按下键码为0xbf14
的按键,Android系统会自动进入Home界面。
重新编译内核并烧写
- 按照上述增加完按键后重新编译内核,按照烧写文档重新烧写zImage镜像。
- 再次重启系统后即可实现遥控按键的控制。