linux核心學習 驅動 I2C

2021-09-29 06:25:06 字數 3238 閱讀 8738

先來看看linux核心的i2c驅動的檔案在/drivers/i2c目錄下。

還是比較簡單的。

根據上面的分析我們可以知道在linux系統中iic子系統的初始化順序為:

/driver/i2c/i2c-core.c postcore_initcall(i2c_init);

/arch/arm/mach-s3c2440 machine_start(s3c2440, 「smdk2440」)

/drivers/i2c/busses/i2c-s3c2410.c subsys_initcall(i2c_adap_s3c_init);

/driver/i2c/i2c-dev.c module_init(i2c_dev_init);

1.最開始寫硬體驅動,直接寫,然後建立乙個節點給應用呼叫就行。

2.後來發現太混亂,引入了「驅動-匯流排-裝置」的模型。這樣就對相似的裝置做了分類。將底層**和裝置**分離。思路清晰了。

3.在2.6版本核心以後,發現在核心**中有很多關於「board」、「platform」的冗餘**(比方說不同的開發板會有很多相似的硬體,那麼**就是一樣的。)。為了解決這種辣雞**太多的問題,引進了「裝置樹」的概念。將某ic的驅動都放入drivers目錄下,不同的

在i2c bus用來掛載後面將會使用到的i2c 介面卡(adapter)和i2c裝置(client)。i2c bus是乙個虛擬的裝置。

注意這裡的i2c bus與platform bus不是屬於同乙個型別的匯流排,platform bus用來管理platform driver 和platform device。.在整個linux 系統中只有一條platform bus,它在核心啟動時初始化:

start_kernel(/init/main.c) ->

rest_init (/init/main.c)->

kernel_thread(建立系統程序/arch/arm/kernel/process.c) ->

kernel_init(/init/main.c) -> do_basic_setup(/init/main.c) ->

driver_init(/drivers/base/init.c) -> platform_bus_init(/drivers/base/platform.c) ->

device_register(&platform_bus)

以上內容包括了函式所在位置(括號裡的就是位置。)

原始碼如下

struct device platform_bus =

;int __init platform_bus_init

(void

)

關鍵函式是device_register

error = device_register(&platform_bus);

error = bus_register(&platform_bus_type);

這兩句,就實現了bus的註冊。

上面準備好了platform_bus的匯流排,下一步就是i2c_bus的註冊。

首先初始化的是i2c_init() 函式,iic bus 就是在該函式中初始化的。

(1.0)通過bus_register()函式註冊iic匯流排。我們看引數i2c_bus_type,它被定義為:

struct bus_type i2c_bus_type =

;

(1.1)匯流排提供的match方法:match方法用來進行 device 和driver 的匹配,在向匯流排註冊裝置或是驅動的的時候會呼叫此方法。其函式定義為:

static

inti2c_device_match

(struct device *dev,

struct device_driver *drv)

(1.1.0)用struct i2c_client 來描述乙個具體的iic裝置,這裡指的是client device 。

(1.1.1)獲取driver

(1.1.2)如果iic驅動的id_table 存在的話,使用i2c_match_id 進行函式進行匹配。匹配的方法是拿id_table 中的每一項與client 的name 進行匹配,如果名字相同則匹配成功。從這裡我們可以看出iic匯流排的匹配方式與platform 匯流排的匹配方式是不同的:

driver是一張表(id_table),device有乙個名字。

(1.2)匯流排提供的probe方法:probe方法在完成裝置和驅動的配對之後呼叫執行。在裡面可以做一些更進一步的初始化工作

static

inti2c_device_probe

(struct device *dev)

(1.2.0)iic的電源管理

(1.2.1)呼叫iic裝置驅動中的probe 函式

上面的繼續梳理下:

i2c bus的啟動過程,

i2c bus如何註冊匯流排

i2c bus如何match 驅動和裝置

i2c bus呼叫裝置的probe方法。

ok,有了 匯流排,那麼就需要device和driver。不過核心為了更進一步的抽象,把device和driver抽象成platform device和platform_driver。

i2c的platform device 初始化在mach-smdk2440.c檔案中進行

Linux驅動 I2C匯流排

這裡以rk3288為例子,使用的是linux4.14,根據裝置樹節點i2c 與rk3x i2c driver,match之後,就會呼叫對應的probe rk3x i2c probe 這裡主要就是註冊乙個adapt i2c add adapter 也就是i2c控制器,或者說是i2c主裝置,既然是主裝置...

Linux驅動之I2C裝置驅動

核心 4.20 晶元 hym8563 rtc 下面的 分析主要都在注釋中,會按照驅動中函式的執行順序分析。static const struct i2c device id hym8563 id module device table i2c,hym8563 id static const stru...

核心中編寫i2c裝置驅動

二 核心中編寫i2c裝置驅動 核心編寫i2c裝置驅動支援兩種方式 adapter方式 legacy 和probe方式 new style 1.legacy方式 此方法驅動需要自己建立i2c client,並且要知道晶元的位址,在核心目錄documentation i2c upgrading clie...