Linux裝置驅動開發之Platform匯流排裝置

2021-10-08 14:19:28 字數 3866 閱讀 7791

1.   linux 裝置模型:

• 裝置 (device):裝置板級資訊描述(描述裝置硬體資訊,主要是裝置樹開發);

• 驅動 (driver):裝置驅動程式(不依賴板級資訊的裝置驅動程式);

• 匯流排(bus):負責管理掛載對應匯流排的裝置以及驅動(常用platform 匯流排、spi匯流排、i2c匯流排,負責裝置和驅動的匹配);

• 類 (class):對於具有相同功能的裝置,歸結到一種類別,進行分類管理(sysfs檔案系統,匯出裝置資訊到sys/目錄下);

linux 驅動程式的開發有兩大特點,一點是裝置資訊和裝置驅動的分離,另一點是裝置資訊的描述使用了裝置樹的方式,後面會單獨講。

裝置資訊和驅動程式分離,裝置資訊描述這個裝置的硬體資源,比如使用io口、使用的記憶體位址、使用的暫存器位址、使用的中斷號,驅動程式的編寫不依賴於裝置的板級資訊,可以更好的相容不同的裝置,裝置資訊和驅動都需要註冊到對應的匯流排上,由匯流排負責裝置資訊和驅動程式的匹配,匹配後驅動程式會通過固定的api介面獲取裝置資訊中的暫存器、中斷、io等資源,進行裝置的初始化。

linux中 spi 介面、i2c 介面、usb介面的裝置有固定的的匯流排可以匹配,但是對於led燈、蜂鳴器、按鍵等裝置怎樣實現驅動和裝置資訊的分離開發,linux 提供了一種platform 匯流排即虛擬匯流排,以供這些裝置進行註冊。

linux platform 匯流排裝置的開發比較簡單,流程如下:定義paltform_device  、向platform 註冊paltform_device 、定義platform_driver、向platform註冊paltform_drive。

linux 下platform匯流排裝置的描述使用plat_device結構體:

struct platform_device ;

平台裝置資源使用struct resource來描述:

struct resource

例如:

static struct resource s3c_wdt_resource1 =

static struct resource s3c_wdt_resource2 =;

平台匯流排裝置的註冊:int platform_device_register(struct platform_device *pdev)

平台匯流排裝置的解除安裝:void platform_device_unregister(struct platform_device *pdev)

linux 下platform裝置驅動的描述使用plat_drive結構體:

struct platform_driver ;

probe:函式指標型別,指向驅動的 probe 函式,當匯流排為裝置和驅動匹配上之後,會執行驅動的 probe 函式。我們通常在該函式中,對裝置進行一系列的初始化。

remove:函式指標型別,指向驅動的 remove 函式,當我們移除我們的平台裝置時,會呼叫該函式進行資源的釋放。

driver:linux 裝置模型中用於抽象驅動的 device_driver 結構體;

id_table:表示該驅動能夠相容的裝置型別。

struct platform_device_id ;

平台匯流排驅動的註冊:intplatform_driver_register(structplatform_driver*drv)

平台匯流排驅動的解除安裝:void platform_driver_unregister(struct platform_driver *drv)

裝置資訊和驅動由匯流排進行匹配後,裝置驅動會呼叫專用的api介面獲取裝置板級資訊。

structresource*platform_get_resource(structplatform_device*dev,unsigned inttype,unsigned intnum);

dev:指定要獲取哪個平台裝置的資源;

type:指定獲取資源的型別,如 ioresource_mem、ioresource_io 等;

num:指定要獲取的資源編號。

intplatform_get_irq(structplatform_device*pdev,unsigned intnum) ;

pdev:指定要獲取哪個平台裝置的資源;

num:指定要獲取的資源編號。

對於存放在 device 結構體中成員 platform_data 的資料,我們可以使用 dev_get_platdata 函式來獲取。

static inlinevoid*dev_get_platdata(const structdevice*dev)

linux 匯流排進行裝置資訊和驅動的匹配一共有四種方式:裝置樹機制 >acpi 匹配模式 >id_table 方式 > 字串比較

裝置樹方式,使用compatible的值進行匹配。

acpi方式 一般不用。

id_table 方式,paltform_drive結構體中提供id_table陣列,陣列中的name 與paltform_device結構體中的成員進行比較。

字串比較方式:比較platform_device中的name欄位和platform_drive結構體中device_drive中的name欄位。

linux裝置驅動之PCIE驅動開發

pcie pci express 是intel提出的新一代的匯流排介面,目前普及的pcie 3.0的傳輸速率為8gt s,下一代pcie 4.0將翻番為16gt s,因為傳輸速率快廣泛應用於資料中心 雲計算 人工智慧 機器學習 視覺計算 顯示卡 儲存和網路等領域。pcie插槽是可以向下相容的,比如p...

LINUX裝置驅動開發之0418

目前android廠商大都使用kernel ramdisk.img dt.img的方式打包成boot.img。device tree的基本語法 dts檔案主要由 root node child node property include組成。root node 由 表示,dt的entry point...

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

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