Привязка драйвера устройства 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 

До сих пор я использовал следующее для справки, но, похоже, не работает полностью:

  • https://lwn.net/Articles/143397/
  • https://www.kernel.org/doc/Documentation/i2c/instantiating-devices

У меня закончились идеи и я могу использовать некоторые предложения. Я даже подхожу к этому правильно ?

Если это важно, я запускаю Debian на одноплатном компьютере ARM.

Редактировать:

С тех пор я обнаружил, что при создании нового устройства я получаю следующую ошибку:

 tca8418_keypad: probe of 1-0034 failed with error -22 

One Solution collect form web for “Привязка драйвера устройства I2C”

Мне не хватало данных платформы для этого устройства.

Мне удалось заставить его работать, вставив данные платформы непосредственно в код для модуля драйвера:

 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); ... } 

Это не самые изящные исправления, но это сработало для меня. Я бы предпочел решение для пользовательского пространства, но я не смог его найти.

  • Как получить список основных номеров -> ассоциации драйверов
  • Проблема с пониманием концепции монтажа
  • Каждый ли файл в каталоге / dev является файлом устройства?
  • В чем разница между BAT0 и ADP0 на ядре linux?
  • в чем разница между драйвером устройства и модулем ядра
  • Как найти устройство, чей основной идентификатор - «fd»,
  • В чем разница между устройством цикла и блочным устройством?
  • Как / где установлены возможности устройства Linux / битовые поля?
  • Как создаются файлы Linux / dev?
  • Как переключить Huawei CDMA 2252+ на USB с CD-ROM?
  • Linux и Unix - лучшая ОС в мире.