IIC匯流排驅動程式框架分析

2021-06-08 19:07:07 字數 2783 閱讀 4550

我們首先從/drivers/i2c/chips/eeprom.c來分析,這是驅動那一塊的:

static struct i2c_driver eeprom_driver = ,

.id= i2c_driverid_eeprom,

.attach_adapter= eeprom_attach_adapter,

.detach_client= eeprom_detach_client,

};

i2c_add_driver(&eeprom_driver);

i2c_register_driver(this_module, driver);

driver->driver.bus = &i2c_bus_type;

/* 把驅動加入iic匯流排驅動列表 */

list_add_tail(&driver->list,&drivers);

/* 遍歷介面卡鍊錶,對每乙個介面卡呼叫driver->attach_adapter函式 */

list_for_each_entry(adapter, &adapters, list)

eeprom_attach_adapter(struct i2c_adapter *adapter)

i2c_probe(adapter, &addr_data, eeprom_detect);

i2c_probe_address(adapter, address_data->normal_i2c[i], -1, found_proc)

;//見注釋1

i2c_smbus_xfer(adapter, addr, 0, 0, 0,i2c_smbus_quick, null);

i2c_smbus_xfer_emulated(adapter,addr,flags,read_write, command,size,data);

i2c_transfer(adapter, msg, num)

adap->algo->master_xfer

/* 這個函式在介面卡裡面有定義 */

s3c24xx_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg *msgs, int num)

/* s訊號和裝置位址最終通過介面卡裡面的這個函式來傳送 */

s3c24xx_i2c_doxfer(i2c, msgs, num);

我們再來另外乙個框架,/drivers/i2c/busses/i2c-s3c2410.c,這是介面卡那一塊的:

platform_driver_register(&s3c2410_i2c_driver);

s3c24xx_i2c_probe(struct platform_device *pdev)

s3c24xx_i2c_init(i2c);

request_irq(res->start, s3c24xx_i2c_irq, irqf_disabled,pdev->name, i2c);

i2c_add_adapter(&i2c->adap);

i2c_add_adapter(&i2c->adap);

i2c_register_adapter(adapter);

list_add_tail(&adap->list, &adapters);

list_for_each(item,&drivers)

注釋1:

i2c_probe_address(adapter, address_data->normal_i2c[i], -1, found_proc);這個函式會將address_data裡面定義的裝置位址通過介面卡裡面的傳送函式傳送給裝置,如果存在相應的裝置的話就會呼叫found_proc函式,在這個函式裡面做了如下事情:

struct i2c_client *new_client

;//定義乙個i2c_client結構體,下面需要設定

new_client->addr = address;//這個是裝置位址

new_client->adapter = adapter;//這時找到的介面卡

new_client->driver = &eeprom_driver;

//這是驅動

i2c_attach_client(new_client

);//新增客戶

如此就把裝置、驅動、介面卡三者有機的聯絡起來了哦!

分析:

為了方便觀察我們來做乙個框圖:

在驅動這邊:

(1)將定義的i2c_driver結構體加入匯流排的驅動鏈表

(2)遍歷介面卡,呼叫驅動裡面的attach_adapter函式

(3)attach_adapter函式會呼叫

i2c_probe()函式,它的第二個引數是裝置位址,第三個引數是功能函式。它會呼叫介面卡裡面的

master_xfer函式傳送這個位址,來檢測是否存在這樣的裝置,如果存在就會呼叫功能函式。

在介面卡這邊:

(1)定義介面卡,並且加入匯流排介面卡鍊錶

(2)遍歷每乙個驅動,呼叫驅動的attach_adapter函式

(3)attach_adapter函式會呼叫

i2c_probe()函式,它的第二個引數是裝置位址,第三個引數是功能函式。它會呼叫介面卡裡面的

master_xfer函式傳送這個位址,來檢測是否存在這樣的裝置,如果存在就會呼叫功能函式。

我們可以看出來不管是先加在驅動還是先載入介面卡都是一樣的哦!

IIC驅動程式分析(一)

根據上一節課的分析,我們來解讀這段 include include include include include include include static unsigned short ignore static unsigned short normal addr 位址值是7位 static...

IIC驅動程式分析(二)

在上一節的實驗中,我們採用的是normal i2c 的方式,即 要發出s訊號和裝置位址並得到ack訊號,才能確定存在這個裝置。那麼如果本身不存在這個裝置當然啊不會給出應答訊號,這是就不會呼叫i2c probe adapter,addr data,at24cxx detect 函式中的at24cxx ...

LCD驅動程式 框架分析(一)

在寫lcd驅動程式之前,我們必須先要明白lcd驅動程式編寫的框架,這點韋東山老師分析的相當詳細,讓我們來學習一下吧!首先從fbmem.c檔案開始。1 我們先找到入口函式 static int init fbmem init void return 0 2 接下來當然要看操作函式集 fb fops s...