实验四. 基于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镜像。
  • 再次重启系统后即可实现遥控按键的控制。

results matching ""

    No results matching ""