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.pswp.cn/bicheng/86335.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/86335.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/86335.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入学习入门--(一)前备知识

一.Python基础知识 1.1 Python算数运算 1.2 变量 1.3 数据类型 1.3.1 int&#xff08;整数&#xff09; float&#xff08;浮点数&#xff09; str&#xff08;字符串&#xff09; 1.3.2 bool&#xff08;布尔值&#xff09;: 表示真或假 取值:True,False 1.3.3 list&…

iClone 中创建的面部动画导入 Daz 3D

以下是如何将 iClone 中创建的面部动画导入 Daz 3D 的简要指南。简而言之&#xff0c;您可以通过 FBX&#xff08;使用 3DXchange 或 Character Creator 的导出工具&#xff09;导出 iClone 面部动画&#xff0c;然后将其导入 Daz Studio 并将变形或骨骼重新映射到 Genesis 角色…

OceanBase向量检索在货拉拉的探索和实践

货拉拉成立于2013年&#xff0c;成长于粤港澳大湾区&#xff0c;是从事同城跨城货运、企业版物流服务、搬家、零担、跑腿、冷运、汽车租售及车后市场服务的互联网物流商城。截至2024年&#xff0c;货拉拉在全球拥有1670万月活用户和168万月活司机&#xff0c;业务覆盖全球11个市…

Flask(五) 表单处理 request.form、WTForms

文章目录 1. 基本表单处理&#xff0c;使用 request.form&#xff08;轻量&#xff09;示例一创建 HTML 表单处理表单数据 示例二HTML 表单&#xff08;login.html&#xff09;Flask 路由处理表单 2. 使用 Flask-WTF 扩展安装设置 Secret Key&#xff08;CSRF 防护&#xff09;…

c++虚继承复习

深入理解C虚继承&#xff1a;解决菱形继承问题的利器 在C面向对象编程中&#xff0c;多重继承是一个强大但容易误用的特性。今天我们来探讨一个特殊的多重继承形式——虚继承&#xff08;Virtual Inheritance&#xff09;&#xff0c;它是解决著名的"菱形继承问题"的…

魔乐社区国产算力应用创新大赛重磅开启!

当国产算力崛起成为 AI 发展新引擎&#xff0c;你是否渴望用创新方案解锁无限可能&#xff1f;魔乐社区国产算力应用创新大赛重磅来袭&#xff01;聚焦国产算力前沿&#xff0c;无论你是开发者、研究者&#xff0c;还是技术爱好者&#xff0c;都能在这里一展身手。 现在报名参…

WebView 性能调试与优化全流程:加载速度与渲染性能双提升

移动端 WebView 页面通常用于承载复杂的前端应用&#xff0c;尤其是动态加载大量数据或进行高频率交互时&#xff0c;性能问题尤为突出。用户常常会遇到页面加载缓慢、滚动卡顿、甚至是部分内容显示不完全的情况。在这种情况下&#xff0c;如何优化数据加载与渲染过程&#xff…

51c嵌入式~CAN~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/14016935 一、CAN总线常见信号干扰问题 定位干扰原因 当总线有干扰时&#xff0c;有经验的工程师能够迅速定位&#xff0c;但是对于新手来说却很麻烦。 造成总线干扰的原因有很多&#xff0c;比如通过电磁辐射耦合到通…

【cursor实战】分析python下并行、串行计算性能

提示语 写一个Python并行计算、串行计算性能对比的代码。并行计算要包括多线程和多进程两种,计算的内容要比较复杂 模型 claude-4-sonnet 生成的代码 #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Python并行计算与串行计算性能对比程序 包含串行…

ubuntu中53端口被占用导致dnsmasq无法使用。已解决。

方案一&#xff1a;修改参数&#xff0c;但不影响使用 编辑配置文件 vim /etc/systemd/resolved.conf将此参数修改为&#xff1a; DNSStubListenerno重启服务 sudo systemctl daemon-reload sudo systemctl disable systemd-resolved.service方案一&#xff1a;直接禁用 编…

【多模态大模型】训练与推理直观解读

1.直观案例解读-图文问答 假设我们的输入是一张包含小猫的图片&#xff0c;以及一个文本提问&#xff1a;“其中是否有小猫&#xff1f;”。下面我将以最详尽的方式&#xff0c;描述数据在nanoVLM模型中从输入到输出的完整流动过程&#xff0c;并解释每一步中数据的形状和含义…

uni-app项目实战笔记17--获取系统信息getSystemInfo状态栏和胶囊按钮

接着上一篇笔记&#xff0c;在添加头部导航栏后&#xff0c;H5显示正常&#xff1a; 但在微信小程序中&#xff0c;由于刘海屏的存在&#xff0c;添加的头部导航栏跟状态栏重叠在一起&#xff1a; 因此需要获取状态栏的高度以便状态栏和导航栏错开不重叠在一起。同时头部导航栏…

Windows下Zookeeper客户端启动缓慢问题分析与解决方案

文章目录 1. 问题描述2. 问题分析2.1 性能分析2.2 根本原因 3. 解决方案3.1 临时解决方案3.2 长期解决方案 4. 注意事项5. 结论 1. 问题描述 在Windows 8.1 64-bit操作系统环境下&#xff0c;使用Curator框架连接Zookeeper时出现客户端启动异常缓慢的问题。具体表现为&#xf…

在 Java 中生成 PDF 缩略图(教程)

Java 本身无法自动生成 PDF 页面缩略图&#xff0c;但幸运的是&#xff0c;有许多软件库可以实现这一功能。本文示例使用我们自家的 JPedal 库&#xff0c;仅需几行 Java 代码即可创建缩略图。JPedal 是开发者使用的最佳 Java PDF 库。 如何使用 JPedal 将 PDF 转换为缩略图 …

基于大模型的甲状腺结节预测及综合诊疗技术方案大纲

目录 一、技术方案概述二、术前预测与方案制定2.1 结节特征分析与良恶性预测2.2 手术方案建议2.3 麻醉方案优化三、术中辅助决策3.1 实时数据监测与分析3.2 麻醉深度监控与调节四、术后护理与并发症预测4.1 术后恢复预测4.2 并发症风险预警五、统计分析与技术验证5.1 数据分割与…

SpringCloud系列(36)--SpringCloud Gateway简介

1、SpringCloud GateWay概述 SpringCloud Gateway是 Spring Cloud的一个全新项目&#xff0c;基于Spring 5.0Spring Boot 2.0和Project Reactor等技术开发的网关&#xff0c;它旨在为微服务架构提供一种简单有效的统—的API路由管理方式&#xff1b;SpringCloud Gateway作为Sp…

TensorFlow深度学习实战:构建神经网络全指南

引言&#xff1a;深度学习与TensorFlow概览 深度学习作为机器学习的一个重要分支&#xff0c;近年来在计算机视觉、自然语言处理、语音识别等领域取得了突破性进展。TensorFlow是由Google Brain团队开发的开源深度学习框架&#xff0c;自2015年发布以来&#xff0c;已成为最受…

K8S: etcdserver: too many requests

Kubernetes etcdserver: too many requests 错误解决方案 当Kubernetes集群出现 etcdserver: too many requests 错误时&#xff0c;表明etcd数据库接收到的请求量超过了其处理能力。etcd作为Kubernetes的核心组件&#xff0c;存储着集群的所有状态数据&#xff0c;处理请求过…

银河麒麟高级服务器操作系统(全架构)OpenGauss 数据库部署手册

一、部署前准备工作 1. 环境检查 项目配置描述内存功能调试建议 32GB 以上。性能测试和商业部署时&#xff0c;单实例部署建议 128GB 以上。复杂的查询对内存的需求量比较高&#xff0c;在高并发场景下&#xff0c;可能出现内存不足。此时建议使用大内存的机器&#xff0c;或…

Boosting:从理论到实践——集成学习中的偏差征服者

核心定位&#xff1a;一种通过串行训练弱学习器、自适应调整数据权重&#xff0c;将多个弱模型组合成强模型的集成学习框架&#xff0c;专注于降低预测偏差。 本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千A…