2017-06-06 153 views
0

我有一个需求来创建一个Linux内核驱动程序,通过接口板通过I2C接口与一堆MCU。因为它们的数量会很多,即大约1-18个,我们正在使用恩智浦/ TI I2C多路复用器。Linux I2C内核驱动程序

我已导入恩智浦/ TI I2C多路复用器内核驱动程序,并将它们合并到DTS文件中。我已成功地将所有I2C多路复用器列为不同的i2c-x节点。

MCU的全部使用相同的地址0x08。我创建了一个内核驱动程序,它为它创建了一个接口。 但是,驱动程序insmod仅触发__init函数。并且不打扰probe()

在提到许多单证时,我将

static struct i2c_board_info xxxx_i2c_devices[] = { 
    { 
    I2C_BOARD_INFO("xxxx", 0x08), 
    }, 
}; 

及其相应

i2c_register_board_info(0, xxxx_i2c_devices, ARRAY_SIZE(xxxx_i2c_devices)); 

但是我只能够触发式测头的功能,这将在HWMON只有一个实例,而不是数为我想象它是。我刚才提到https://www.kernel.org/doc/Documentation/i2c/instantiating-devices

没有在板init的变化,我想利用方法3,但内核甚至不叫probe()和检测function(),只有司机的__init功能。

是跟着司机 - https://github.com/1119553797/sprd-kernel-common/blob/sprdb2g_gonk4.0/drivers/hwmon/w83l785ts.c

如果需要,会后整个内核驱动程序,以供参考现在用的是3.0.8内核,定制电路板使用的板级改动同上述内核。

+0

尽量少古代内核第一。 – 0andriy

回答

0

好的,广泛的谷歌搜索和修补不同的方法后,一个解决方法。

首先在DTS中,我们可以直接在Mux寻址中分配I2C地址。例如,

[email protected] { 
    #address-cells = <1>; 
    #size-cells = <0>; 
    reg = <0>; 

    adc0: [email protected] { 
     compatible = "nuvoton,nau7802"; 
     reg = <0x2a>; 
     nuvoton,vldo = <3000>; 
    }; 
}; 

[email protected] { 
    #address-cells = <1>; 
    #size-cells = <0>; 
    reg = <1>; 

    adc1: [email protected] { 
     compatible = "nuvoton,nau7802"; 
     reg = <0x2a>; 
     nuvoton,vldo = <3000>; 
    }; 
}; 

[email protected] { 
    #address-cells = <1>; 
    #size-cells = <0>; 
    reg = <2>; 

    adc2: [email protected] { 
     compatible = "nuvoton,nau7802"; 
     reg = <0x2a>; 
     nuvoton,vldo = <3000>; 
    }; 
}; 
在驱动

然后,为了识别与厂商ID,产品结构在上面的例子中“新唐科技,nau7802”,我们必须做以下修改: -

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

static const struct of_device_id nau7802_dt_ids[] = { 
    { .compatible = "nuvoton,nau7802" }, 
    {}, 
}; 
MODULE_DEVICE_TABLE(of, nau7802_dt_ids); 

static struct i2c_driver nau7802_driver = { 
    .probe = nau7802_probe, 
    .remove = nau7802_remove, 
    .id_table = nau7802_i2c_id, 
    .driver = { 
     .name = "nau7802", 
     .of_match_table = nau7802_dt_ids, 
    }, 
}; 

的部分“adc1”等可以简单地跳过。 “MODULE_DEVICE_TABLE(的”,就是要device_tree信息,从我可以收集。

请告知,如果你找到一个更好的方法,它不需要DTS &板_init改变我。