Configuración de un teclado matricial 4x4 en procesadores i.MX6

La implementación de un teclado matricial de 4x4 en una plataforma basada en el SoC i.MX6 requiere la activación de controladores específicos en el kernel de Linux y la definición de los recursos de hardware en el código de soporte de la placa (board file).

1. Activación del controlador en el Kernel

El controlador necesario para gestionar teclados conectados mediante una matriz de pines GPIO se encuentra en drivers/input/keyboard/matrix_keypad.c. Para habilittarlo, es necesario asegurarse de que la opción CONFIG_KEYBOARD_MATRIX esté activa en la configuración del kernel.


Symbol: KEYBOARD_MATRIX [=y]
Type  : tristate
Prompt: GPIO driven matrix keypad support
Location:
  -> Device Drivers
    -> Input device support
      -> Keyboards (INPUT_KEYBOARD [=y])
        -> GPIO driven matrix keypad support

2. Definición del hardware y mapeo de teclas

En el archivo de soporte de la placa, usualmente localizado en arch/arm/mach-mx6/board-mx6q_sabresd.c (o el equivalente según el diseño), se deben definir los pines GPIO destinados a las filas y columnas, así como la tabla de códigos de teclas.


/* Definición de pines para Columnas y Filas */
#define KBD_COL_0  IMX_GPIO_NR(4, 6)
#define KBD_COL_1  IMX_GPIO_NR(4, 8)
#define KBD_COL_2  IMX_GPIO_NR(4, 10)
#define KBD_COL_3  IMX_GPIO_NR(4, 12)

#define KBD_ROW_0  IMX_GPIO_NR(4, 7)
#define KBD_ROW_1  IMX_GPIO_NR(4, 9)
#define KBD_ROW_2  IMX_GPIO_NR(4, 11)
#define KBD_ROW_3  IMX_GPIO_NR(4, 13)

/* Mapa de teclas: Fila, Columna, Código de tecla */
static const uint32_t mapa_teclas_matriz[] = {
    KEY(0, 0, KEY_ESC),   KEY(0, 1, KEY_0),     KEY(0, 2, KEY_1),     KEY(0, 3, KEY_OK),
    KEY(1, 0, KEY_2),     KEY(1, 1, KEY_3),     KEY(1, 2, KEY_4),     KEY(1, 3, KEY_5),
    KEY(2, 0, KEY_6),     KEY(2, 1, KEY_7),     KEY(2, 2, KEY_8),     KEY(2, 3, KEY_9),
    KEY(3, 0, KEY_F1),    KEY(3, 1, KEY_BACK),  KEY(3, 2, KEY_F2),    KEY(3, 3, KEY_F3),
};

static const struct matrix_keymap_data datos_mapa_teclas = {
    .keymap      = mapa_teclas_matriz,
    .keymap_size = ARRAY_SIZE(mapa_teclas_matriz),
};

static const unsigned int gpios_columnas[] = { KBD_COL_0, KBD_COL_1, KBD_COL_2, KBD_COL_3 };
static const unsigned int gpios_filas[]    = { KBD_ROW_0, KBD_ROW_1, KBD_ROW_2, KBD_ROW_3 };

/* Configuración de la plataforma para el teclado matricial */
static struct matrix_keypad_platform_data info_plataforma_teclado = {
    .keymap_data       = &datos_mapa_teclas,
    .col_gpios         = gpios_columnas,
    .row_gpios         = gpios_filas,
    .num_col_gpios     = ARRAY_SIZE(gpios_columnas),
    .num_row_gpios     = ARRAY_SIZE(gpios_filas),
    .col_scan_delay_us = 15,
    .debounce_ms       = 12,
    .wakeup            = 1,
    .active_low        = 1,
};

static struct platform_device dispositivo_teclado_matriz = {
    .name = "matrix-keypad",
    .id   = -1,
    .dev  = {
        .platform_data = &info_plataforma_teclado,
    },
};

3. Registro del dispositivo

Para que el sistema operativo reconozca el teclado durante el arranque, se debe registrar el dispositivo dentro de la función de inicialización de la placa:


static void __init mx6_board_init(void)
{
    // ... otras inicializaciones ...
    platform_device_register(&dispositivo_teclado_matriz);
}

4. Verificación del funcionamiento

Una vez compilado el kernel e iniciado el sistema, se puede verificar que el dispositivo de entrada haya sido registrado correctamente consultando el sistema de archivos proc:


# cat /proc/bus/input/devices

Debería aparecer una entrada similar a la siguiente, indicando que el controlador matrix-keypad está asociado a un manejador de eventos (por ejemplo, event1):


I: Bus=0019 Vendor=0000 Product=0000 Version=0000
N: Name="matrix-keypad"
P: Phys=
S: Sysfs=/devices/platform/matrix-keypad/input/input1
H: Handlers=event1 
B: EV=100013

Para probar la captura de teclas en tiempo real en entornos Android o sistemas embebidos con las utilidades de input instaladas, se puede ejecutar:


# getevent

Este comando mostrará los eventos generados cada vez que se presione o suelte una tecla de la matriz física.

Etiquetas: imx6 linux-kernel GPIO matrix-keypad embedded-linux

Publicado el 6-25 22:39