未调用i2c设备驱动程序init

时间:2016-07-15 10:42:47

标签: android c linux-kernel i2c atmel

我正在尝试为Atmel电容式触摸屏控制器提供i2c设备驱动程序,以便在基于Android Lollipop(版本5.0.2)的系统的Linux内核中运行。我已将制造商提供的更新源代码(atmel_mxt_ts.c)添加到kernel / drivers / input / touchscreen,并根据需要修改了devicetree,但是当内核启动时,i2c_device_register永远不会被调用此特定驱动程序。这意味着我无法在i2C总线上与此设备通信,因此触摸屏将无法工作。请注意,此驱动程序文件已存在于内核中,我只需要确保它包含在内核版本中,运行make menuconfig并执行完整的清理构建。 正在为其他i2c驱动程序调用i2c_device_register函数,例如电池驱动程序,因为我可以看到它们的printk输出。 另请注意,此设备的设备地址显示在sysfs中。即相关i2c总线的目录列表显示以下内容:

root@var_mx6:/ # ls /sys/bus/i2c/devices/i2c-2/
2-000b
2-004a
2-0068
delete_device
i2c-dev
name
new_device
power
subsystem
uevent

004a是Atmel电容式触摸设备的地址,000b是SMBus电池,0068是RTC设备。

有没有人建议为什么没有为Atmel电容式触摸设备驱动程序调用i2c_register_driver?

我在下面提供了一些代码片段。

以下是驱动程序源文件atmel_mxt_ts.c的最后一部分:

    static const struct of_device_id mxt_of_match[] = {
    { .compatible = "atmel,atmel_mxt_ts"},
    { /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, mxt_of_match);

#ifdef CONFIG_ACPI
static const struct acpi_device_id mxt_acpi_id[] = {
    { "ATML0000", 0 },  /* Touchpad */
    { "ATML0001", 0 },  /* Touchscreen */
    { }
};
MODULE_DEVICE_TABLE(acpi, mxt_acpi_id);
#endif

static const struct i2c_device_id mxt_id[] = {
    { "atmel_mxt_ts", 0 },
    { }
};
MODULE_DEVICE_TABLE(i2c, mxt_id);

static struct i2c_driver mxt_driver = {
    .driver = {
        .name   = "atmel_mxt_ts",
        .owner  = THIS_MODULE,
        .of_match_table = of_match_ptr(mxt_of_match),
        .acpi_match_table = ACPI_PTR(mxt_acpi_id),
        .pm = &mxt_pm_ops,
    },
    .probe      = mxt_probe,
    .remove     = mxt_remove,
    .id_table   = mxt_id,
};

module_i2c_driver(mxt_driver);

/* Module information */
MODULE_AUTHOR("Joonyoung Shim <jy0922.shim@samsung.com>");
MODULE_DESCRIPTION("Atmel maXTouch Touchscreen driver");
MODULE_LICENSE("GPL");

以下是设备来源的相关部分:

&i2c3 {
        clock-frequency = <100000>;
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_i2c3_3>;
        status = "okay";

    battery {
        compatible = "ti,bq20z75";
        reg = <0xb>;
        /* nBATT_PRES */
        battery-detect-gpios = <&expander1 4 GPIO_ACTIVE_LOW>;
        power-supplies = <&charger>;
    };

    touch@4a {
        compatible = "atmel,atmel_mxt_ts";
        reg = <0x4a>;
        interrupt-parent = <&gpio1>;
        interrupts = <4 1>; 
    };


        /* DS1307 RTC module */
        rtc@0x68 {
                 compatible = "dallas,ds1307";
                 reg = <0x68>;
        };
};

1 个答案:

答案 0 :(得分:0)

在第二次检查此文件时,之前对内核版本的.config文件所做的更改以添加atmel电容式触摸驱动程序已经被覆盖了。确保.config文件通过make manuconfig包含此驱动程序后,现在重新加载驱动程序。事实证明这是用户错误!