Linux加载i2c驱动程序

问题描述 投票:0回答:1

我的主板上有linux 4.4。我还有两个带驱动程序的i2c设备。当我将第一个设备连接到电路板时 - 我在dmesg中看到_probe函数被调用。当我没有连接任何设备到板 - 在dmesg我没有看到_probe功能。当我连接第二个设备 - 在dmesg我没有看到_probe功能。但我想看到它。如果我使用i2cdetect工具,我会看到正确的设备地址。不使用驱动程序中的字段.detect。我想在dmesg中看到_probe函数与第二个设备或没有设备。

linux如何检查连接的i2c设备及其选择方式是否会加载驱动程序?

这是我的设备树:

    i2c@546c0000 {
        #address-cells = <0x1>;
        #size-cells = <0x0>;
        compatible = "nvidia,tegra210-vii2c";
        reg = <0x0 0x546c0000 0x0 0x34000>;
        iommus = <0x52 0x12>;
        interrupts = <0x0 0x11 0x4>;
        scl-gpio = <0x7b 0x92 0x0>;
        sda-gpio = <0x7b 0x93 0x0>;
        status = "okay";
        clocks = <0x41 0xd0 0x41 0x51 0x41 0x1c>;
        clock-names = "vii2c", "i2cslow", "host1x";
        resets = <0x41 0xd0>;
        reset-names = "vii2c";
        clock-frequency = <0x61a80>;
        bus-pullup-supply = <0x69>;
        avdd_dsi_csi-supply = <0x67>;
        linux,phandle = <0xe0>;
        phandle = <0xe0>;

        newname_c@30 {
            compatible = "nvidia,newname";
            reg = <0x30>;
            devnode = "video0";
            physical_w = "3.674";
            physical_h = "2.738";
            vertical-flip = "true";
            avdd-reg = "vana";
            iovdd-reg = "vif";
            clocks = <0x41 0x117>;
            clock-names = "clk_out_3";
            clock-frequency = <0x16e3600>;
            mclk = "clk_out_3";
            reset-gpios = <0x7b 0x94 0x0>;
            pwdn-gpios = <0x7b 0x97 0x0>;
            vana-supply = <0x94>;
            vif-supply = <0x93>;
            status = "okay";
            linux,phandle = <0xe1>;
            phandle = <0xe1>;
linux driver i2c
1个回答
0
投票

在引导过程中,当内核解析设备树并到达您的设备节点时,它将查找任何带有of_match_table的驱动程序,其中一个compatible条目与您的节点的compatible属性匹配。将加载每个匹配的驱动程序,根据您在节点中指定的(和包含)元素,运行其probe函数并给出合适的struct i2c_client结构作为参数(我跳过了详细信息)。因此,为了回答您的问题,Linux(实际上是I2C内核)不检查任何连接的i2c设备。相应的设备驱动程序(通常在probe函数中,通常通过读取其值预先知道的寄存器)。这就是您必须提前申报设备的原因。有a look here有关设备和驱动程序匹配的详细信息,以及模块自动加载。

首先,尝试使用以下命令确保在内核配置中启用了对驱动程序的支持:

zcat /proc/config.gz | grep <your_driver_kconfig_option>

你应该看到以=y=m结尾的东西。现在,回到您的问题,有几个原因可能无法解决:

  • 您的驱动程序未构建或未安装(如果构建为模块)
  • 驱动程序在其of_match_table中没有此兼容条目。您可以尝试匹配驱动程序的名称(节点的兼容值应与驱动程序代码中的i2c_driver.driver.mame元素相同)。这不是很干净但可能有所帮助。

PS:如果/proc/config.gz文件不存在,请先运行modprobe configs命令。

© www.soinside.com 2019 - 2024. All rights reserved.