Linux驱动开发 ---- 4.2_平台设备(Platform Devices)概述
目录
前述
在嵌入式系统中,平台设备(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.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
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/
目录查看。