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.