【Linux驱动开发 ---- 4.2_平台设备(Platform Devices)概述】

Linux驱动开发 ---- 4.2_平台设备(Platform Devices)概述

前述

在嵌入式系统中,平台设备(Platform Devices)用于表示硬件设备,通常是与特定平台(如 ARM、MIPS 等)相关联的设备。平台设备不依赖于特定的总线(例如 PCI、USB 等),而是通过静态配置或设备树(Device Tree)来进行配置。平台设备广泛应用于嵌入式硬件,如 GPIO、SPI、I2C 控制器、内存等。

主要特点:

  1. 无需总线支持: 与常见的 PCI 或 USB 设备不同,平台设备直接与硬件平台相关联,不需要外部总线支持。
  2. 静态配置: 配置通常通过设备树(Device Tree)或静态方式进行,而不是动态的总线扫描。
  3. 注册方式: 平台设备使用 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");

代码详细解释

  1. platform_device_register_simple()

    • platform_device_register_simple() 是一个简化的接口,用于注册一个平台设备。
    • 参数说明:
      • "my_platform_device":设备的名称(设备在 /sys/class/platform/ 下的目录名称)。
      • -1:设备 ID(通常是一个唯一标识符,-1 表示自动分配一个设备 ID)。
      • NULL:设备资源(如内存、IO 地址等)。此处 NULL 表示没有资源分配。
      • 0:资源大小(如果没有分配资源,则为 0)。
  2. 设备注册

    • platform_dev_init() 函数中,调用 platform_device_register_simple() 注册一个平台设备。如果设备注册失败(返回 IS_ERR()),则返回错误代码。
    • 如果设备注册成功,会输出日志信息 "Platform device registered successfully"
  3. 设备注销

    • 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/ 目录查看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值