Linux
綁定 I2C 設備驅動程序
我正在嘗試使用 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
我缺少此設備的平台數據。
我能夠通過將平台數據直接插入驅動程序模組的程式碼來使其工作:
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); ... }
這不是最優雅的修復,但它對我有用。我更喜歡使用者空間解決方案,但我找不到。