当前位置: 首页 > news >正文

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

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 控制器、内存等。

主要特点:

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

http://www.lryc.cn/news/572781.html

相关文章:

  • 基于深度学习的智能视频行为识别系统:技术与实践
  • 解决Windows10没有Microsoft store微软商店
  • C#学习日记
  • 局域网文件共享及检索系统
  • 在小程序中实现上下左右拖动表格
  • js调用微信支付 第二步 获取access_token ——仙盟创梦IDE
  • 多线程八股
  • Docker Swarm 与 Docker Compose 对比解析
  • 汽车整车厂如何用数字孪生系统打造“透明车间”
  • python高校工作室管理系统
  • 晨控CK-FR06与西门子PLC配置Modbus TCP通讯连接操作手册
  • Cmake入门及CMakeLists.txt 语法介绍
  • linux线程同步
  • 数据结构第八章(六)-置换选择排序和最佳归并树
  • P12894 [蓝桥杯 2025 国 Java B] 智能交通信号灯
  • 【机器学习实战笔记 12】集成学习:AdaBoost算法
  • 数字IC后端实现之Setup Violation修复案例(DataClock Tree ECO修复手段)
  • 目标检测新升级:用YOLOv8打造密度视频热力图可视化
  • 2025 年拓客系统排行榜
  • ceph 通过 crush rule 修改故障域
  • 装饰器模式深度解析:Java设计模式实战指南与动态功能扩展最佳实践
  • tkinter 的 pack() 布局管理器学习指南
  • 商业秘密被公开后的损失计算:从法律规定到司法实践的深度解析
  • npm下载离线依赖包
  • leetcode 291. Word Pattern II和290. Word Pattern
  • Vue 比较两个数组对象,页面展示差异数据值
  • AS32A601与ASM1042芯片在电力系统自动化监控中的应用效能分析
  • PROFIBUS DP 转 EtherCAT 网关:冶金自动化高效协同的基石
  • TypeScript 自定义类型
  • MySQL DATETIME类型存储空间详解:从8字节到5字节的演变