03 IIC裝置和驅動的匹配過程分析

2021-10-01 12:14:23 字數 3585 閱讀 8253

2. 裝置端

上一節分析了 平台裝置和驅動的匹配過程,即 probe 函式的自動呼叫過程,本節來分析 iic 匯流排上裝置和驅動的匹配過程。

struct i2c_driver 

;

struct i2c_device_id mpu6050_id=

,};struct i2c_driver mpu6050_driver =

,.id_table = mpu6050_id,

// 用於和裝置匹配的 id_table

};

iic驅動probe的呼叫過程和平台驅動類似,只是i2c_bus_type結構體中的變數不太一致,整體呼叫過程類似,詳細的過程分析如下:

#define i2c_add_driver(driver) i2c_register_driver(this_module, driver) (include\linux\i2c.h)

|-> driver->driver.bus =

&i2c_bus_type;

(drivers\i2c\i2c-core.c)

// i2c匯流排型別

|-> i2c_bus_type.name =

"i2c"

,// 名字是i2c

i2c_bus_type.match = i2c_device_match,

// match 函式

i2c_bus_type.probe = i2c_device_probe,

// probe 函式

i2c_bus_type.remove = i2c_device_remove,

// remove函式

|->

driver_register

(&driver->driver)

|->

bus_add_driver

(struct device_driver *drv)

(drivers\base\bus.c)

// 新增驅動到匯流排上

|->

driver_attach

(struct device_driver *drv)

(drivers\base\dd.c)

|->

bus_for_each_dev

(drv->bus,

null

, drv, __driver_attach)

(drivers\base\bus.c)

|->

__driver_attach

(struct device *dev,

void

*data)

(drivers\base\dd.c)

|->

driver_match_device

(struct device_driver *drv,

struct device *dev)

(drivers\base\base.h)

// 驅動和裝置匹配

|->

return drv->bus->match ? drv->bus->

match

(dev, drv):1

|->if(

of_driver_match_device

(dev, drv)

)// 裝置樹風格

return1;

if(acpi_driver_match_device

(dev, drv)

)// acpi風格

return1;

driver =

to_i2c_driver

(drv);if

(driver->id_table)

// 匹配id表

return

i2c_match_id

(driver->id_table, client)

!=null;|

->

driver_probe_device

(drv, dev)

(drivers\base\dd.c)

// 驅動和裝置匹配成功後,執行probe函式

|->

really_probe

(drv, dev)

(drivers\base\dd.c)

// 執行真正的 probe 函式

|->

if(dev->bus->probe)

else

if(drv->probe)

|->

if(dev->bus->remove)

// remove 函式

dev->bus->

remove

(dev)

;else

if(drv->remove)

// 在這裡呼叫真正的自己定義的remove函式

drv->

remove

(dev);|

->

platform_drv_probe

(struct device *_dev)

(drivers\base\platform.c)

|->

struct platform_driver *drv =

to_platform_driver

(_dev->driver)

// 找到 platform_driver 結構體

|-> #define to_platform_driver

(drv)

(container_of

((drv)

,struct platform_driver, driver)

)(include\linux\platform_device.h)

|->

struct platform_device *dev =

to_platform_device

(_dev)

|-> #define to_platform_device

(x)container_of

((x)

,struct platform_device, dev)

|->

if(drv->probe)

else

裝置端用 struct i2c_client 結構體描述,結構體定義如下:

struct i2c_client 

;

iic裝置向核心的註冊使用 i2c_register_board_info 函式,隨著裝置樹的出現這種方法基本被淘汰,現在大多採用裝置樹的方法來對iic裝置進行描述。

關於裝置樹的解析將在下一節進行分析。

將i2c裝置新增到 busnum 號i2c匯流排上	

struct i2c_board_info

;int

i2c_register_board_info

(int busnum,

struct i2c_board_info const

* info,

unsigned len)

(drivers\i2c\i2c-boardinfo.c)

linux 驅動裝置和 dts 匹配過程

linux 裝置驅動檔案在與 dts 中的裝置板級硬體資訊匹配的關鍵字是 compatible 屬性。即比較驅動檔案中 of device id 結構體元素的 compatible 成員變數和 dts 檔案中 node 中 compatible 屬性兩個字串。rationale linux 啟動從 ...

驅動中的IIC裝置新增

現在很多外設都會用到iic來進行通訊,記錄iic寫驅動的寫法,以g sensor操作為例 首先需要將iic操作的裝置掛載的iic匯流排上去,有兩種寫法 1.在arch arm mach s5pv210 mach x210.c中新增裝置到相應的iic匯流排上,示例如下 static struct i2...

SPI 匯流排驅動和裝置驅動的匹配

關於spi driver和spi device的匹配 第一種情況 spidev.c中spi driver中name欄位 static structspi driverspidev spi driver 和mach smdk6410.c中的modalias欄位 static structspi boa...