
Ich versuche, eine TCA8418-Tastatur zu verwenden (die über I2C funktioniert) und habe den Treiber in den Kernel geladen, aber das Gerät wurde nicht erkannt, also instanziiere ich es selbst und kann den Treiber nicht binden. Ich erhalte die folgende Fehlermeldung:
# echo -n "1-0034" > /sys/bus/i2c/drivers/tca8418_keypad/bind
-bash: echo: write error: No such device
Dies geschah, nachdem ich (als Root) Folgendes versucht hatte:
# echo -n "tca8418_keypad" 0x34 > /sys/bus/i2c/devices/i2c-1/new_device
Ich habe folgende Geräte- bzw. Treiberbäume:
/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
Ich habe bisher Folgendes als Referenz verwendet, aber keines scheint vollständig zu funktionieren:
Ich habe keine Ideen mehr und könnte ein paar Vorschläge gebrauchen. Komme ich dem überhaupt näher?RechtsWeg?
Falls das wichtig ist, verwende ich Debian auf einem ARM-Singleboardcomputer.
Bearbeiten:
Ich habe inzwischen festgestellt, dass ich die folgende Fehlermeldung erhalte, wenn ich das neue Gerät instanziiere:
tca8418_keypad: probe of 1-0034 failed with error -22
Antwort1
Mir fehlten Plattformdaten zu diesem Gerät.
Ich konnte es zum Laufen bringen, indem ich die Plattformdaten direkt in den Code für das Treibermodul eingefügt habe:
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
};
Fügen Sie dann Folgendes zur __init-Funktion hinzu:
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);
...
}
Dies ist zwar nicht die eleganteste Lösung, aber bei mir hat es funktioniert. Ich hätte eine Userspace-Lösung bevorzugt, konnte aber keine finden.