Linux裝置驅動安裝的基本過程

2021-06-19 19:13:11 字數 1247 閱讀 7537

在windows系統裡面,如果發現新的硬體裝置但是系統沒有可以用的自帶驅動程式,那使用者就得自己安裝驅動。linux核心的設計也是一樣,下面就以marvel phy裝置的發現和驅動安裝(即模組插入)為例說明一般嵌入式裡裝置的發現和安裝過程。

假如某個小系統裡面,soc上整合了mac,然後外面通過mdio bus接了乙個phy晶元,那麼在定製核心的時候肯定會選擇libphy以及相應的soc mdio bus驅動,核心啟動的時候,mdio bus驅動會呼叫mdiobus_register()來向核心註冊bus,註冊的過程中會迴圈呼叫mdiobus_scan去發現phy裝置,get_phy_device()做的就是就是讀取phy晶元的id,如果發現mdio bus掛了phy裝置,那就為這個phy裝置建立phy_device例項,並且為其分配addr。這樣核心裡就有為phy裝置初始化了資料結構了,也就是說發現並建立了裝置(所有的裝置都會有struct device結構)。

struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr)

return phydev; }

那麼接下來就是安裝驅動的過程。

我們假設驅動模組是核心起來後載入的,那麼來看看驅動的實現。

static struct phy_driver marvell_drivers = , },

phy的驅動模組定義了driver資料結構,一系列api。而驅動模組插入時,呼叫phy_drivers_register向系統註冊此driver,並將其和mdio bus type關聯。那如何將這個驅動**和剛才發現的phy裝置關聯起來呢?這裡的phy_id和phy_id_mask是關鍵。phy_drivers_register最終會呼叫driver_attach在這個driver關聯的bus上面為每個裝置match這個driver。主要**在下面兩個函式:

static inline int driver_match_device(struct device_driver *drv,

struct device *dev)

static int mdio_bus_match(struct device *dev, struct device_driver *drv)

前面發現裝置的時候裝置已經記錄了自己的phy_id,這個時候driver又是和這個phy_id匹配,所以驅動就匹配上了phy裝置。這之後phy_device->drv就會指向marvell_drivers。

整個過程的設計十分科學合理。

原文見:

驅動 linux裝置驅動 字元裝置驅動開發

preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...

Linux裝置驅動

一.簡介 作業系統是通過各種驅動程式來駕馭硬體裝置,它為使用者遮蔽了各種各樣的裝置,驅動硬體是作業系統最基本的功能,並且提供統一的操作方式。正如我們檢視螢幕上的文件時,不用去管到底使用nvidia晶元,還是ati晶元的顯示卡,只需知道輸入命令後,需要的文字就顯示在螢幕上。硬體驅動程式是作業系統最基本...

linux裝置驅動

1 flash的程式設計原理都是只能將1寫為0,而不能將0寫為1。所以在flash程式設計之前,必須將對應的塊擦除,而擦除的過程就是把所有位都寫為1的過程,塊內的所有位元組變為0xff。2 nand flash與nor flash相比容量大 低 nand flash中每個塊的最大擦寫次數是100萬次...