Linux kernel i2c驱动程序中未调用探测器

Linux kernel i2c驱动程序中未调用探测器,linux-kernel,raspberry-pi,linux-device-driver,embedded-linux,archlinux,Linux Kernel,Raspberry Pi,Linux Device Driver,Embedded Linux,Archlinux,我正在努力学习在raspberry pi板上编写i2c驱动程序,我已经使用groove LCD背光。这里没有调用driver.probe,而正如我在dmesg中看到的那样,驱动程序已插入系统 正在调用驱动程序的初始化代码,代码=> static int lcd_probe(struct i2c_client *i2c_client, const struct i2c_device_id *i2c_id) { int ret = 0; //struct lcd_da

我正在努力学习在raspberry pi板上编写i2c驱动程序,我已经使用groove LCD背光。这里没有调用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_板_信息代码=>

/** aaryaa i2c lcd struct */
static struct i2c_board_info __initdata lcd_i2c_devices[] = {
    {
            .type = "lcd",
            .addr = 0x62,
    },
};
我在i2c_寄存器_设备中添加了调试 我发现驱动程序证明设备没有被调用。dmesg我已链接

看来我也需要在平台上注册

i2c中如何调用probe? 任何帮助都将不胜感激。
谢谢你

您是否已将设备的条目添加到设备树中?据我所知,我可以通过DT或board文件提供客户端详细信息。这里我用的是黑板文件。如果我做错了,请纠正我。为什么需要添加DT…?我很了解bus num,因为我使用i2cdetect检测总线1上带有addr 0x62和0x3e的设备。那么,请您详细解释一下。您不应该在客户端驱动程序中使用.detect方法。那是用来探测公共汽车的。您可能没有可供驱动程序绑定的设备。看看sysfs,您应该在/sys/bus/i2c/devices中看到一个名为“0-0062”的目录,其中应该有一个名为“name”的文件,该文件的内容应该是“lcd”。如果您找不到,驱动程序绑定到的设备条目就不存在了。在sysfs中,我只能看到符号链接“i2c1”->(../../../../devices/platform/soc/20804000.i2c/i2c-1),它在“name”文件中包含“20804000.i2c”的内容。所以我的设备没有注册到sys。并且没有用于lcd的设备条目@tangrs建议,我需要在DT中添加设备。请纠正我,如果我错了!!您是否已将设备的条目添加到设备树中?据我所知,我可以通过DT或board文件提供客户端详细信息。这里我用的是黑板文件。如果我做错了,请纠正我。为什么需要添加DT…?我很了解bus num,因为我使用i2cdetect检测总线1上带有addr 0x62和0x3e的设备。那么,请您详细解释一下。您不应该在客户端驱动程序中使用.detect方法。那是用来探测公共汽车的。您可能没有可供驱动程序绑定的设备。看看sysfs,您应该在/sys/bus/i2c/devices中看到一个名为“0-0062”的目录,其中应该有一个名为“name”的文件,该文件的内容应该是“lcd”。如果您找不到,驱动程序绑定到的设备条目就不存在了。在sysfs中,我只能看到符号链接“i2c1”->(../../../../devices/platform/soc/20804000.i2c/i2c-1),它在“name”文件中包含“20804000.i2c”的内容。所以我的设备没有注册到sys。并且没有用于lcd的设备条目@tangrs建议,我需要在DT中添加设备。请纠正我,如果我错了!!