Linux裝置驅動之platform:一種描述和管理嵌入式裝置的簡單方法
你是否想過如何在Linux系統中為你的嵌入式裝置編寫驅動程式?你是否想過如何在Linux系統中讓你的驅動程式適應不同的硬體平台和架構?你是否想過如何在Linux系統中讓你的驅動程式實現一些進階的功能,例如熱插拔、電源管理、裝置共享等?如果你對這些問題有興趣,那麼本文將為你介紹一種實現這些目標的有效方法——Linux裝置驅動之platform。 platform是一種用來描述嵌入式裝置的資料結構,它可以讓你用一種簡單而統一的方式,將嵌入式裝置的資訊和屬性傳遞給內核,從而實現裝置的識別和驅動。 platform也是一種用來實現硬體無關性的機制,它可以讓你用一種靈活且可移植的方式,將嵌入式裝置的配置和管理從驅動程式程式碼中分離出來,從而實現多平台的支援。 platform也是一種用於實現高級功能的框架,它可以讓你用一種標準而通用的方式,定義和使用各種嵌入式設備的接口和協議,從而實現熱插拔、電源管理、設備共享等功能。本文將從platform的基本概念、語法規則、寫作方法、註冊過程、匹配方式等方面,為你詳細地介紹platform在Linux設備驅動中的應用和作用,幫助你掌握這種有用而強大的方法。
根據Linux設備模型可知,一個現實的Linux設備和驅動通常都需要掛接在一種總線上,對於本身依附於PCI、USB等的設備而言,這自然不是問題,但是在嵌入式系統裡面,SoC系統中整合的獨立的周邊控制器、掛接在SoC 記憶體空間的周邊等卻不依附於此類匯流排。基於這個背景,Linux設計了一種虛擬的匯流排,稱為platform匯流排,對應的裝置稱為platform_device,而驅動程式稱為platform_driver。
設計目的
-
#相容設備模型
使得设备被挂接在一个总线上,因此,符合 Linux 2.6 的设备模型。其结果是,配套的 sysfs结点、设备电源管理都成为可能。
登入後複製 -
BSP和驅動隔離
在BSP中定义platform设备和设备使用的资源、设备的具体配置信息。而在驱动中,只需要通 过通用API去获取资源和数据,做到了板相关代码和驱动代码的分离,使得驱动具有更好的可 扩展性和跨平台性。
登入後複製
軟體架構
#核心中Platform裝置有關的實作位於include/linux/platform_device.h和drivers/base/platform.c兩個檔案中,它的軟體架構如下:
#由圖片可知,Platform裝置在內核中的實作主要包括三個部分:
- Platform Bus,基於底層bus模組,抽像出一個虛擬的Platform bus,用來掛載Platform設備;
- Platform Device,基於底層device模組,抽像出Platform Device,用來表示Platform設備;
- # Platform Driver,基於底層device_driver模組,抽像出Platform Driver,用於驅動Platform裝置。
platform_device
##注意,所謂的platform_device並不是與字元裝置、區塊裝置和網路裝置並列的概念,而是Linux系統提供的一種附加手段,例如,在S3C2440處理器中,把內部整合的I2C、RTC、 SPI、LCD、看門狗等控制器都歸納為platform_device,而它們本身就是字元裝置。
/* defined in */ struct platform_device { const char * name; / * 设备名 */ u32 id; /* 用于标识该设备的ID */ struct device dev; /* 真正的设备(Platform设备只是一个特殊的设备, 因此其核心逻辑还是由底层的模块实现)*/ u32 num_resources; / * 设备所使用各类资源数量 */ struct resource * resource; / * 资源 */ }; /* defined in */ struct resource { resource_size_t start; /* 资源起始 */ resource_size_t end; /* 结束 */ const char *name; unsigned long flags; /* 类型 */ struct resource *parent, *sibling, *child; }; /* 设备驱动获取BSP定义的resource */ struct resource *platform_get_resource(struct platform_device *, unsigned int flags, unsigned int num); #include int platform_device_register(struct platform_device *); void platform_device_unregister(struct platform_device *);
Tip: 和板級緊密相關的資源描述放在dev.paltform_data中。
paltform_driver
platform_driver这个结构体中包含probe()、remove()、shutdown()、suspend()、resume()函数,通常也需要由驱动实现:
struct platform_driver { int (*probe)(struct platform_device *); int (*remove)(struct platform_device *); void (*shutdown)(struct platform_device *); int (*suspend)(struct platform_device *, pm_message_t state); int (*suspend_late)(struct platform_device *, pm_message_t state); int (*resume_early)(struct platform_device *); int (*resume)(struct platform_device *); struct device_driver driver; }; #include int platform_driver_register(struct platform_driver *); void platform_driver_unregister(struct platform_driver *);
platform_bus
系统中为platform总线定义了一个bus_type的实例platform_bus_type:
struct bus_type platform_bus_type = { .name = "platform", .dev_attrs = platform_dev_attrs, .match = platform_match, .uevent = platform_uevent, .pm = PLATFORM_PM_OPS_PTR, }; EXPORT_SYMBOL_GPL(platform_bus_type);
这里要重点关注其 match()成员函数,正是此成员函数确定了 platform_device 和 platform_driver之间如何匹配:
static int platform_match(struct device *dev, struct device_driver *drv) { struct platform_device *pdev; pdev = container_of(dev, struct platform_device, dev); return (strncmp(pdev->name, drv->name, BUS_ID_SIZE) == 0); }
通过本文,我们了解了platform在Linux设备驱动中的应用和作用,学习了如何编写、注册、匹配、修改和调试platform。我们发现,platform是一种非常适合嵌入式系统开发的方法,它可以让我们方便地描述和管理嵌入式设备,实现硬件无关性和高级功能。当然,platform也有一些注意事项和限制,比如需要遵循语法规范、需要注意兼容性问题、需要注意内存占用和性能影响等。因此,在使用platform时,我们需要有一定的硬件知识和经验,以及良好的编程习惯和调试技巧。希望本文能够为你提供一个入门级的指导,让你对platform有一个初步的认识和理解。如果你想深入学习platform,建议你参考更多的资料和示例,以及自己动手实践和探索。
以上是Linux裝置驅動之platform:一種描述和管理嵌入式裝置的簡單方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Linux系統的五個基本組件是:1.內核,2.系統庫,3.系統實用程序,4.圖形用戶界面,5.應用程序。內核管理硬件資源,系統庫提供預編譯函數,系統實用程序用於系統管理,GUI提供可視化交互,應用程序利用這些組件實現功能。

要查看 Git 倉庫地址,請執行以下步驟:1. 打開命令行並導航到倉庫目錄;2. 運行 "git remote -v" 命令;3. 查看輸出中的倉庫名稱及其相應的地址。

雖然 Notepad 無法直接運行 Java 代碼,但可以通過借助其他工具實現:使用命令行編譯器 (javac) 編譯代碼,生成字節碼文件 (filename.class)。使用 Java 解釋器 (java) 解釋字節碼,執行代碼並輸出結果。

在 Sublime 中運行代碼的方法有六種:通過熱鍵、菜單、構建系統、命令行、設置默認構建系統和自定義構建命令,並可通過右鍵單擊項目/文件運行單個文件/項目,構建系統可用性取決於 Sublime Text 的安裝情況。

Linux的主要用途包括:1.服務器操作系統,2.嵌入式系統,3.桌面操作系統,4.開發和測試環境。 Linux在這些領域表現出色,提供了穩定性、安全性和高效的開發工具。

要安裝 Laravel,需依序進行以下步驟:安裝 Composer(適用於 macOS/Linux 和 Windows)安裝 Laravel 安裝器創建新項目啟動服務訪問應用程序(網址:http://127.0.0.1:8000)設置數據庫連接(如果需要)

Visual Studio Code (VSCode) 是一款跨平台、開源且免費的代碼編輯器,由微軟開發。它以輕量、可擴展性和對眾多編程語言的支持而著稱。要安裝 VSCode,請訪問官方網站下載並運行安裝程序。使用 VSCode 時,可以創建新項目、編輯代碼、調試代碼、導航項目、擴展 VSCode 和管理設置。 VSCode 適用於 Windows、macOS 和 Linux,支持多種編程語言,並通過 Marketplace 提供各種擴展。它的優勢包括輕量、可擴展性、廣泛的語言支持、豐富的功能和版
