Проблема с зондом при записи драйвера устройства I2C - PullRequest
6 голосов
/ 10 июня 2010

Я новичок в написании драйверов устройств для Linux, простите меня, если что-то глупо спросили и мой плохой английский ^^
Я пытаюсь написать драйвер для сенсорной панели, которая взаимодействует с процессором через I2C.
Я попытался добавить драйвер устройства на платформу Linux, и регистр был успешным, я имею в виду, что драйвер был загружен, но функция зонда не сработала !!

Выше приведен частичный код драйвера i.написал.

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

любые предложения и комментарии будут приветствоваться, спасибо ^^

Ответы [ 2 ]

7 голосов
/ 12 июня 2010

Чтобы модель устройства / драйвера 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 верен.Я не уверен, что он играет роль в механизме ассоциации устройств / модулей в ядре, но я бы сказал, что гораздо менее запутанно то, что все они имеют одно и то же имя.

1 голос
/ 25 мая 2013

Метод зонда будет вызываться только тогда, когда устройство соответствует имени драйвера. Поскольку вы упомянули имя вашего драйвера как 'i2c_ts', проверьте дерево устройства на наличие имени устройства. И то, и другое должно быть одинаковым.

...