Linux驅動開發 ---- 4.2_平臺設備(Platform Devices)概述
目錄
- Linux驅動開發 ---- 4.2_平臺設備(Platform Devices)概述
- 前述
- 主要特點:
- 平臺設備的作用
- 平臺設備的注冊與注銷
- 1. `platform_device_register_simple()`
- 2. `platform_device_unregister()`
- 平臺設備注冊示例
- 示例代碼:
- 代碼詳細解釋
- 編譯與加載
- 1. 創建 `Makefile` 文件
- 2. 編譯內核模塊
- 3. 加載模塊
- 4. 查看設備
- 5. 卸載模塊
- 6. 清理編譯文件
- 總結
前述
在嵌入式系統中,平臺設備(Platform Devices)用于表示硬件設備,通常是與特定平臺(如 ARM、MIPS 等)相關聯的設備。平臺設備不依賴于特定的總線(例如 PCI、USB 等),而是通過靜態配置或設備樹(Device Tree)來進行配置。平臺設備廣泛應用于嵌入式硬件,如 GPIO、SPI、I2C 控制器、內存等。
主要特點:
- 無需總線支持: 與常見的 PCI 或 USB 設備不同,平臺設備直接與硬件平臺相關聯,不需要外部總線支持。
- 靜態配置: 配置通常通過設備樹(Device Tree)或靜態方式進行,而不是動態的總線掃描。
- 注冊方式: 平臺設備使用
platform_device_register()
和platform_driver_register()
來注冊。
平臺設備的作用
平臺設備通常用于嵌入式系統中,表示直接連接到處理器或 SoC(系統級芯片)的硬件設備。這些設備的驅動程序在內核中注冊,并且設備通常在啟動時通過設備樹或手動配置進行注冊。常見的硬件如:
- GPIO 控制器
- SPI 控制器
- I2C 控制器
- UART 設備
- 內存映射設備(如 RAM、EEPROM)
平臺設備的注冊與注銷
1. platform_device_register_simple()
該函數是一個簡單的接口,用于注冊一個平臺設備。它將設備的名稱、設備 ID、設備資源等信息注冊到內核中。
2. platform_device_unregister()
該函數用于注銷一個平臺設備,將設備從系統中刪除。
平臺設備注冊示例
在以下代碼中,我們通過 platform_device_register_simple()
來注冊一個平臺設備,使用 platform_device_unregister()
來注銷設備。
示例代碼:
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/kernel.h>
#include <linux/init.h>// 設備對象指針
static struct platform_device *pdev;// 初始化函數
static int __init platform_dev_init(void)
{// 注冊平臺設備pdev = platform_device_register_simple("my_platform_device", -1, NULL, 0);if (IS_ERR(pdev)) {pr_err("Failed to register platform device\n");return PTR_ERR(pdev);}pr_info("Platform device registered successfully\n");return 0;
}// 卸載函數
static void __exit platform_dev_exit(void)
{// 注銷平臺設備platform_device_unregister(pdev);pr_info("Platform device unregistered successfully\n");
}module_init(platform_dev_init);
module_exit(platform_dev_exit);MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple platform device registration example");
代碼詳細解釋
-
platform_device_register_simple()
platform_device_register_simple()
是一個簡化的接口,用于注冊一個平臺設備。- 參數說明:
"my_platform_device"
:設備的名稱(設備在/sys/class/platform/
下的目錄名稱)。-1
:設備 ID(通常是一個唯一標識符,-1 表示自動分配一個設備 ID)。NULL
:設備資源(如內存、IO 地址等)。此處NULL
表示沒有資源分配。0
:資源大小(如果沒有分配資源,則為 0)。
-
設備注冊
- 在
platform_dev_init()
函數中,調用platform_device_register_simple()
注冊一個平臺設備。如果設備注冊失敗(返回IS_ERR()
),則返回錯誤代碼。 - 如果設備注冊成功,會輸出日志信息
"Platform device registered successfully"
。
- 在
-
設備注銷
- 在
platform_dev_exit()
函數中,調用platform_device_unregister()
注銷平臺設備。 - 注銷設備后,會輸出日志信息
"Platform device unregistered successfully"
。
- 在
編譯與加載
1. 創建 Makefile
文件
在當前目錄下創建一個 Makefile
文件來編譯這個內核模塊:
obj-m += platform_device_example.oall:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modulesclean:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
2. 編譯內核模塊
運行以下命令編譯內核模塊:
make
這將生成一個名為 platform_device_example.ko
的內核模塊文件。
3. 加載模塊
使用 insmod
命令加載內核模塊:
sudo insmod platform_device_example.ko
成功加載后,你將看到設備成功注冊的日志信息 "Platform device registered successfully"
。
4. 查看設備
加載模塊后,你可以查看設備是否成功注冊到 /sys
下:
ls /sys/class/platform/my_platform_device
5. 卸載模塊
使用 rmmod
卸載模塊:
sudo rmmod platform_device_example
卸載時,會看到 "Platform device unregistered successfully"
的日志信息。
6. 清理編譯文件
清理編譯文件:
make clean
總結
這個示例演示了如何通過 platform_device_register_simple()
注冊一個平臺設備,并使用 platform_device_unregister()
注銷設備。它通過簡單的內核模塊來注冊和注銷平臺設備,設備的相關信息可以通過 /sys/class/platform/
目錄查看。