зонд не вызывается в драйвере i2c

Я пытаюсь научиться писать драйвер i2c на плате Raspberry Pi, и у меня есть подсветка ЖК-дисплея. Здесь driver.probe не вызывается, тогда как драйвер вставлен в систему, как я вижу в dmesg.

Вызывается код инициализации драйвера, и код =>

static int lcd_probe(struct i2c_client *i2c_client, const struct i2c_device_id *i2c_id)
{
    int ret  = 0;
    //struct        lcd_data *lcd_data;
    // struct device *dev = &i2c_client->dev;
    // lcd_data->client = i2c_client;

    pr_debug("lcd_probe : calling the probe\n");
    pr_debug("lcd_probe : i2c_client->addr = %d, i2c_client_name = %s\n",
            i2c_client->addr, i2c_client->name);

    return ret;
}

static struct i2c_device_id lcd_id[] = {
    {"lcd", 0},
    {}
};
MODULE_DEVICE_TABLE(i2c, lcd_id);

static struct i2c_driver lcd_driver = {
    .driver = {
            .name = "lcd",
            .owner = THIS_MODULE,
    },
    .probe = lcd_probe,
    // .remove = lcd_remove,
    // .attach_adapter = lcd_attach,
    .detect = lcd_detect,
    .id_table = lcd_id,
};
static int __init lcd_init(void)
{
    pr_debug("lcd_init : calling init\n");
    return (i2c_add_driver(&lcd_driver));
}

и dmesg =>

[    1.971009] lcd_init : calling init

Но driver.probe не регистрируется в подсистеме i2c. инициализация файла платы =>

Код инициализации платы =>

/** start aartyaa lcd i2c driver */
printk(KERN_INFO "board file registering i2c lcd device\n");
i2c_register_board_info_dt(1, lcd_i2c_devices, ARRAY_SIZE(lcd_i2c_devices));

код i2c_board_info =>

/** aaryaa i2c lcd struct */
static struct i2c_board_info __initdata lcd_i2c_devices[] = {
    {
            .type = "lcd",
            .addr = 0x62,
    },
};

Я добавил отладки в i2c_register_device и обнаружил, что устройство, подтверждающее драйвер, не вызывается. dmesg я привязал ссылку dmesg

Кажется, мне также нужно зарегистрироваться на платформе ..

Как вызывается зонд в i2c...? Любая помощь будет оценена. Спасибо...!!!


person prityaa    schedule 17.12.2016    source источник
comment
Вы добавили запись об устройстве в дерево устройств?   -  person tangrs    schedule 17.12.2016
comment
Насколько я знаю, я могу предоставить информацию о клиенте либо через DT, либо через файл платы. Здесь я использовал файл платы. Если я ошибаюсь, пожалуйста, поправьте меня. а зачем требуется добавлять в DT...?   -  person prityaa    schedule 17.12.2016
comment
Я уже знаю номер шины, так как использовал i2cdetect для обнаружения устройства на шине 1 с адресами 0x62 и 0x3e. Так может у плз объяснить в деталях.   -  person prityaa    schedule 17.12.2016
comment
Вы не должны использовать метод .detect в драйвере клиента. Это для проверки автобуса. Скорее всего, у вас нет устройства для привязки вашего драйвера. Посмотрите в sysfs, вы должны увидеть в /sys/bus/i2c/devices каталог с именем что-то вроде 0-0062, и в нем должен быть файл с именем, который должен иметь содержимое lcd. Если вы не можете найти это, запись об устройстве отсутствует для привязки драйвера.   -  person TrentP    schedule 18.12.2016
comment
в sysfs я вижу только символическую ссылку i2c1 - › (../../../devices/platform/soc/20804000.i2c/i2c-1), которая содержит 20804000.i2c в имени файла. Итак, мое устройство не зарегистрировано в sys. И нет записи устройства для ЖК. @tangrs предложил, мне нужно добавить устройство в DT. Пожалуйста, поправьте меня, если я ошибаюсь ... !!   -  person prityaa    schedule 18.12.2016
comment
Если вы используете файл платы для инициализации устройств, используйте i2c_register_board_info() вместо i2c_register_board_info_dt().   -  person Dražen G.    schedule 30.01.2019