我正在尝试使用 TCA8418 键盘(通过 I2C 运行),并且已将驱动程序加载到内核中,但该设备未被识别,因此我自己实例化它并且无法绑定驱动程序。我收到以下错误:
# echo -n "1-0034" > /sys/bus/i2c/drivers/tca8418_keypad/bind
-bash: echo: write error: No such device
这是在尝试了以下操作(以 root 身份)之后的结果:
# echo -n "tca8418_keypad" 0x34 > /sys/bus/i2c/devices/i2c-1/new_device
我分别有以下设备树和驱动程序树:
/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
到目前为止,我已使用以下内容作为参考,但似乎都不能完全工作:
我已经没有想法了,可以使用一些建议。我是否正在接近这个正确的方式?
如果这很重要的话,我正在 ARM 单板计算机上运行 Debian。
编辑:
我发现在实例化新设备时收到以下错误:
tca8418_keypad: probe of 1-0034 failed with error -22
答案1
我缺少该设备的平台数据。
我可以通过将平台数据直接插入到驱动程序模块的代码中来使其工作:
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
};
然后将其添加到 __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);
...
}
这不是最优雅的修复,但它对我有用。我更喜欢用户空间解决方案,但我找不到。