2017-06-06 150 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改變我。