Я - новичок в записи драйвера устройства Linux, прощаю мне если что-либо глупое спрошенный и мой плохой English^^
Я пытаюсь записать драйвер для сенсорной панели, которые общаются с ЦП через I2C.
Я пытался добавить драйвер устройства в платформу Linux, и регистр был успехом, я подразумеваю, что драйвер был загружен, но тестовая функция не сделала разожженный!!
Выше частичный код драйвера, который я записал.
static int i2c_ts_probe(struct i2c_client *client, const struct i2c_device_id * id) {
/* ... */
}
static int i2c_ts_remove(struct i2c_client *client) {
/* ... */
}
static const struct i2c_device_id i2c_ts_id[] = {
{"Capacitive TS", 0},
{ }
};
MODULE_DEVICE_TABLE(i2c, i2c_ts_id);
static struct i2c_driver i2c_ts = {
.id_table = i2c_ts_id,
.probe = i2c_ts_probe,
.remove = i1c_ts_remobe,
.driver = {
.name = "i2c_ts",
},
};
static int __init i2c_ts_init(void) {
return i2c_add_driver(&i2c_ts);
}
static int __init i2c_ts_exit(void) {
return i2c_del_driver(&i2c_ts);
}
module_init(i2c_ts_init);
module_exit(i2c_ts_exit);
Выше частичный код в платформе (/kernel/arch/arm/mach-pxa/saarb.c) используемой для регистрации i2c устройства.
static struct i2c_board_info i2c_board_info_ts[] = {
{
.type = i2c_ts,
.irq = IRQ_GPIO(mfp_to_gpio(MFP_PIN_GPIO0)),
},
};
static void __init saarb_init(void) {
...
i2c_register_board_info(0, ARRAY_AND_SIZE(i2c_board_info_ts));
...
}
любое предложение и комментарий будут приветствоваться, thanks^^
Чтобы модель устройства / драйвера Linux могла исследовать ваш драйвер, должно быть устройство, запрашивающее его: это достигается путем сравнения имени драйвера («i2c_ts») и типа устройство в структуре i2c_board_info. В вашем случае я предполагаю, что тип не равен «i2c_ts».
Поэтому я бы посоветовал вам использовать макрос I2C_BOARD_INFO для создания экземпляра вашего устройства, как описано в Documentation / i2c / instantiating_devices.
static struct i2c_board_info i2c_board_info_ts[] = {
{
I2C_BOARD_INFO("i2c_ts", 0x12),
.irq = IRQ_GPIO(mfp_to_gpio(MFP_PIN_GPIO0)),
},
};
static void __init saarb_init(void) {
...
i2c_register_board_info(0, ARRAY_AND_SIZE(i2c_board_info_ts));
...
}
Вы также не указали адрес своему устройству, и он нужен I2C_BOARD_INFO. Прочтите техническое описание вашего сенсорного экрана, чтобы узнать, что это за адрес.
Наконец, как было предложено выше, убедитесь, что i2c_ts_id правильный. Я не уверен, что это играет роль в механизме ассоциации устройства / модуля в ядре, но я бы сказал, что это гораздо менее запутанно, поскольку все они имеют одно и то же имя.