Vinculando um driver de dispositivo I2C

5

Estou tentando usar um teclado TCA8418 (que opera sobre I2C) e tenho o driver carregado no kernel, mas o dispositivo não foi reconhecido, por isso estou instanciando-o e não consigo vincular o driver. Eu recebo o seguinte erro:

# echo -n "1-0034" > /sys/bus/i2c/drivers/tca8418_keypad/bind
-bash: echo: write error: No such device

Isto é depois de ter tentado o seguinte (como root):

# echo -n "tca8418_keypad" 0x34 > /sys/bus/i2c/devices/i2c-1/new_device

Eu tenho as seguintes árvores de dispositivos e drivers, respectivamente:

/sys/bus/i2c/devices/1-0034
|-- modalias
|-- name
|-- power
|   |-- autosuspend_delay_ms
|   |-- control
|   |-- runtime_active_time
|   |-- runtime_status
|   '-- runtime_suspended_time
|-- subsystem -> ../../../../../bus/i2c
'-- uevent

/sys/bus/i2c/drivers/tca8418_keypad
|-- bind
|-- module -> ../../../../module/tca8418_keypad
|-- uevent
'-- unbind

Eu usei o seguinte para referência até agora, mas nenhum parece funcionar completamente:

Eu fiquei sem ideias e poderia usar algumas sugestões. Eu estou chegando perto disso do jeito certo ?

Estou usando o Debian em um computador de placa única ARM, se isso for importante.

Editar:

Eu descobri que estou recebendo o seguinte erro ao instanciar o novo dispositivo:

tca8418_keypad: probe of 1-0034 failed with error -22
    
por Super Penguin 22.10.2016 / 01:12

1 resposta

3

Eu estava sem dados da plataforma para este dispositivo.

Consegui que funcionasse inserindo os dados da plataforma diretamente no código do módulo do driver:

static uint32_t tca8418_km_data[] = {
    KEY(0, 0, KEY_F1),
    KEY(0, 1, KEY_F2),
    KEY(0, 2, KEY_F3),
    ...
};

static const struct matrix_keymap_data tca8418_mk_data = {
    .keymap         = tca8418_km_data,
    .keymap_size    = ARRAY_SIZE(tca8418_km_data),
};

static struct tca8418_keypad_platform_data my_tca8418_plat_data = {
    .keymap_data    = &tca8418_mk_data,
    .rows           = 6,
    .cols           = 8,
    .rep            = 1,
    .irq_is_gpio    = 1,
};

static struct i2c_board_info tca8418_board_info __initdata = {
    I2C_BOARD_INFO("tca8418_keypad", 0x34),
    .platform_data  = &my_tca8418_plat_data,
    .irq            = 16, // GPIO pin 16
};

Em seguida, adicione isso à função __init:

static int __init tca8418_keypad_init(void)
{
    struct i2c_adapter *i2c_adap;
    i2c_adap = i2c_get_adapter(1);
    i2c_new_device(i2c_adap, &tca8418_board_info);
    ...
}

Esta não é a mais elegante das correções, mas funcionou para mim. Eu preferia uma solução de espaço de usuário, mas não consegui encontrar uma.

    
por 08.11.2016 / 02:22