我們首先從/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...