歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

I2C驅動情景分析——怎樣增加I2C設備

內核版本:linux-3.4.2

直奔主題,在Linux下怎樣增加一個I2C設備呢?
 
假設手上有一塊從淘寶上買來的開發板,我要在開發板的I2C總線上增加一個從設備(如at24c08),那麼我要怎樣寫這個“I2C設備驅動”,讓
 
應用程序可以訪問at24c08呢?
 
先來看一個最簡單的i2c設備驅動:
 static struct i2c_board_info at24cxx_info = { //所支持的i2c設備的列表
 I2C_BOARD_INFO("at24c08", 0x50),      //一項代表一個支持的設備,它的名字叫做“at24c08”,器件地址是0x50
};

static struct i2c_client *at24cxx_client;

static int at24cxx_dev_init(void)
{
 struct i2c_adapter *i2c_adap;    //分配一個適配器的指針

 i2c_adap = i2c_get_adapter(0);    //調用core層的函數,獲得一個i2c總線。這裡我們已經知道新增的器件掛接在編號為0的i2c總線上
 at24cxx_client = i2c_new_device(i2c_adap, &at24cxx_info);  // 把i2c適配器和新增的I2C器件關聯起來,這個用了i2c總線0,地址是0x50。這就組成了一個客戶端   
 at24cxx_client i2c_put_adapter(i2c_adap);
 return 0;
}

static void at24cxx_dev_exit(void)
{
 i2c_unregister_device(at24cxx_client);
}

module_init(at24cxx_dev_init);
module_exit(at24cxx_dev_exit);
 
 
 
從上面的程序可以看到,寫一個i2c設備驅動程序,與寫普通的字符驅動基本一樣。特別之處是它調用了i2c的core層的函數,以獲得對i2c總線的控制。因為用的是開發板,板上的與soc芯片(一般來說就是arm的芯片)i2c總線驅動一般都做好了,直接調用core層的函數就可以控制soc的i2c模塊了。也就是說,寫i2c設備驅動不需要關注arm內部的i2c模塊的寄存器,我們需要關注的是設備(at24c08)的寄存器以及它的datasheet對時序的要求。
 

其實,添加i2c設備的方法很靈活。根據Linux的官方文檔《linux-3.4.2\Documentation\i2c\instantiating-devices》,添加i2c設備的方法總結有4種:
 
1. i2c_register_board_info:根據總線編號、設備名字(“at24c08”)、設備地址(0x50)注冊一個字符驅動。這種方法最簡單、最粗暴,最貼近平時在開片機上開發i2c器件的。
 
2. i2c_new_device:根據i2c總線的編號,聲明一個i2c設備:這種方法就是上面例子用的方法。這種方法也簡單,但是需要事先知道器件掛接在哪條總線上。對於設備,還實現知道了設備地址0x50,總線適配器也支持名字為“at24c08”的設備
 
3. i2c_new_probed_device:
 
4.從用戶空間實例化一個器件:這個方法相當智能快速,如下輸入指令,即可增加一個i2c設備,同時增加了對應的設備文件。
 
# echo eeprom 0x50 > /sys/bus/i2c/devices/i2c-3/new_device 
 
根據英文文檔的標題,添加i2c設備有稱之為“i2c設備的實例化”。
 
從上述可以知道,在實例化一個i2c設備之前,除了有對應的驅動支持總線外(這裡是總線0),還需要有一個驅動使用了總線0發送時序,支持名字為"at24c08"的器件。這個驅動用總線驅動的函數,配置了at24c08的寄存器。

更多 I2C驅動情景分析 見 http://www.linuxidc.com/search.aspx?where=nkey&keyword=29201

I2C子系統之at24c02讀寫測試 http://www.linuxidc.com/Linux/2012-08/68256.htm
I2C子系統之ioctl() http://www.linuxidc.com/Linux/2012-08/68257.htm
I2C子系統之at24c02簡介 http://www.linuxidc.com/Linux/2012-08/68258.htm
I2C子系統之總結 http://www.linuxidc.com/Linux/2012-08/68259.htm
I2C子系統之內核中I2C子系統的結構 http://www.linuxidc.com/Linux/2012-08/68260.htm
I2C子系統之I2C bus初始化——I2C_init() http://www.linuxidc.com/Linux/2012-08/68261.htm
I2C子系統之platfor_device初始化——smdk2440_machine_init() http://www.linuxidc.com/Linux/2012-08/68262.htm
I2C子系統之platform_driver初始化——I2C_adap_s3c_init() http://www.linuxidc.com/Linux/2012-08/68263.htm
I2C子系統之I2C總線時鐘頻率設置 http://www.linuxidc.com/Linux/2012-08/68264.htm
I2C子系統之adapter device和client device注冊——I2C_add_number_adapter() http://www.linuxidc.com/Linux/2012-08/68265.htm
I2C子系統之__I2C_first_dynamic_bus_num變量的相關分析 http://www.linuxidc.com/Linux/2012-08/68266.htm
I2C子系統之 adapter driver注冊——I2C_dev_init() http://www.linuxidc.com/Linux/2012-08/68267.htm
I2C子系統之write() http://www.linuxidc.com/Linux/2012-08/68268.htm

Copyright © Linux教程網 All Rights Reserved