Linux模块无法正确匹配平台数据

时间:2014-02-24 19:49:38

标签: linux-kernel linux-device-driver embedded-linux

我很难让pca955x模块正常使用我的pca9552芯片。该模块实际上从不运行探测功能。

我的平台数据

struct led_platform_data pca552_data = {
     .num_leds = 7,
};

static struct i2c_board_info mxc_i2c1_board_info[] __initdata = {
     {
          I2C_BOARD_INFO("leds-pca955x", 0x61),
          .platform_data = &pca552_data,
     },
}

在我的init中调用

i2c_register_board_info(1, mxc_i2c1_board_info,
        ARRAY_SIZE(mxc_i2c1_board_info));

模块数据

static struct i2c_driver pca955x_driver = {
    .driver = {
        .name   = "leds-pca955x",
        .owner  = THIS_MODULE,
    },
    .probe  = pca955x_probe,
    .remove = __devexit_p(pca955x_remove),
    .id_table = pca955x_id,
};

我在内核中构建了模块。我知道有一个设备,因为我可以使用i2c工具戳/读和切换LED。但是当找到设备时,linux没有初始化驱动程序。

我的理解是驱动程序名称应与主板信息中的平台数据名称相匹配。我有一个键盘驱动程序,它位于相同的mxc_i2c1_board_info中,工作正常。

1 个答案:

答案 0 :(得分:1)

您正在尝试将驱动程序的名称用作设备ID,在您的情况下,驱动程序的.id_table中会提供支持的ID:

static const struct i2c_device_id pca955x_id[] = {
    { "pca9550", pca9550 },
    { "pca9551", pca9551 },
    { "pca9552", pca9552 },
    { "pca9553", pca9553 },
    { }
};

因此,在您的情况下,将您的电路板信息更新为:

static struct i2c_board_info mxc_i2c1_board_info[] __initdata = {
     {
          I2C_BOARD_INFO("pca9552", 0x61),
          .platform_data = &pca552_data,
     },
}

应该让驱动程序探测设备。