热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

物联网内核与驱动开发基础课程第五讲:平台总线技术详解

在《物联网内核与驱动开发基础课程》第五讲中,详细解析了平台总线技术的应用与开发。本讲内容不仅涵盖了平台总线的基本概念,还深入探讨了其在嵌入式系统中的实现方法及优化策略,为开发者提供了宝贵的实践指导。通过具体案例分析,帮助学员更好地理解平台总线在设备管理、资源分配等方面的关键作用。

平台总线开发笔记:https://blog.csdn.net/weixin_39148042/article/details/82495343

高级驱动--平台总线:

Linux设备驱动模型的由来:

1,实现入口函数 xxx_init()和卸载函数 xxx_exit()

2,申请设备号  register_chrdev (与内核相关)

3,利用udev/mdev机制创建设备文件(节点) class_create, device_create (与内核相关)

4,硬件部分初始化

             io资源映射 ioremap,内核提供gpio库函数 (与硬件相关)

             注册中断(与硬件相关)

5,构建 file_operation结构 (与内核相关)

6,实现操作硬件方法  xxx_open,xxx_read,xxxx_write

设备驱动模型:总线、device、driver

device对象:设备对象,描述设备信息,包括地址,中断号,甚至其他自定义的数据

driver对象:描述设备驱动的方法(代码逻辑)

bus:平台总线,平台总线会建立两个链表,一个与device相关的链表,另一个与driver相关的链表,我们写的所有的device和driver都会添加(注册)到bus中的相应链表中,device和driver中都有一个名字,找出device和driver名字相同的匹配在一起,形成一个完整的设备驱动,然后调用driver中的probe函数(方法),如果需要移除设备,调用driver中的remove函数(方法),这就是bus的功能。

Sysfs文件系统:告诉我们内核驱动的一些信息

下图是拓扑图,表示设备之间的一种关系,可以通过总线查看一个设备,也可以通过Devices查看一个设备,还可以通过一个类来查看一个设备。

/sys目录下存放的有Buses、Devices、Classes

Buses:所有总线,下图usb是其中的一个总线

Devices:所有设备的集合

Classes:将所有设备进行分类,比如:输入设备等

总线设备都可以在Buses、Devices和Classes中找到。

/sys:

block:用于管理块设备,系统中的每一个块设备会在该目录下对应一个子目录。

bus:用于管理总线,每注册一条总线,在该目录下有一个对应的子目录。

其中,每个总线子目录下会有两个子目录:devices和drivers。

devices包含系统中所有属于该总线的的设备。

class:将系统中的设备按功能分类。

dev:该目录包含已注册的设备号(设备节点)的视图,包括char和block

kernel:内核中的相关参数。

module:内核中的模块信息。

fireware:内核中的固件信息。

fs:描述内核中的文件系统。

配对函数(match)、探测函数(probe)和卸载函数:

 1,int (*match)(struct device *dev, struct device_driver *drv);--总线bus

当总线上添加了新设备或者新驱动函数的时候,内核会调用一次或者多次这个函数。

如果现在添加了一个新的驱动(driver),内核就会调用所属总线(bus)的match函数,

配对总线上所有的设备(device),如果驱动能够对应处理其中一个设备,函数返回1,

告诉内核配对成功。一般的,match函数是判断设备的结构体成员device->bus_id

和驱动函数的结构体成员device_driver->name是否一致,如果一致,

那就表明配对成功。

2,int (*probe)(struct device *dev);---- 驱动driver

当配对(match)成功后,内核就会调用指定驱动中的probe函数来查询设备能否被该

驱动操作,如果可以,驱动就会对该设备进行相应的操作,如初始化。所以说,真正

的驱动函数入口是在probe函数中。

3, int (*remove) (struct device *dev); ---驱动driver

当设备从总线中移除时,内核会调用驱动函数中的remove函数调用,进行一些设备

卸载相应的操作

总线模型编程:

平台总线模型:

平台总线编程接口:

Pdev注册和注销

int platform_device_register(struct platform_device * pdev)

void  platform_device_unregister(struct platform_device * pdev)

获取资源数据

int platform_get_irq(struct platform_device * dev,unsigned int num)

struct resource * platform_get_resource_byname(struct platform_device * dev, unsigned int type,const char * name)


推荐阅读
  • 基于STM32的智能太阳能路灯设计与华为云IOT集成方案
    基于STM32的智能太阳能路灯设计与华为云IOT集成方案 ... [详细]
  • 在上篇文章的基础上,本文将继续探讨 Linux 设备驱动中的设备模型与 `devicedriverbus` 机制。在将设备注册到总线之前,需要先创建 `device` 对象。可以通过静态定义 `device` 结构体变量,并调用 `device_register` 函数来完成这一过程。此外,文章还将详细解析设备模型的内部工作机制,以及 `devicedriverbus` 机制如何实现设备与驱动的自动匹配和管理。 ... [详细]
  • 在整理旧文件时,发现了几篇关于2011年MiniGUI技术的博客,虽然内容已显陈旧,但仍然具有一定的参考价值。这些文章详细探讨了MiniGUI的帧缓冲技术、图形渲染引擎以及输入处理机制,为理解早期嵌入式系统的图形界面开发提供了宝贵资料。 ... [详细]
  • 算术表达式分析与解析技术初探
    本文初步探讨了算术表达式的分析与解析技术,针对作者在职业转型过程中发现自身算法基础薄弱的问题,决定在接下来的三个月内,系统地学习和掌握常用数据结构与算法,以提升个人技术能力。研究内容不仅涵盖了基本的算术表达式解析方法,还深入讨论了其在实际应用中的优化策略,为相关领域的进一步研究奠定了基础。 ... [详细]
  • [Offer收割]编程竞赛第8轮 A 小Ho的完美主义倾向
    题目链接:小Ho的完美主义倾向题目描述:小Ho在一条直线型的街道上漫步。这条街道由若干块长度为L的石板铺设而成,因此每隔L的距离就会出现一道石板间的接缝。小Ho对这些规律排列的接缝产生了浓厚的兴趣,他决定研究如何在这条街道上行走,以满足自己对完美路径的追求。本题要求在给定的约束条件下,计算出小Ho能够实现其目标的所有可能方案数。 ... [详细]
  • 如何在DataGridView中实现带有图标的单元格显示
    本文详细探讨了在C# WinForms应用程序中,如何通过DataGridView控件实现带有图标的单元格显示。文章不仅提供了具体的实现方法,还深入解析了相关技术细节,对于希望提升用户界面交互体验的开发者而言,具有很高的参考价值。 ... [详细]
  • Oracle程序包基础入门:了解核心概念与基本结构
    本文旨在为初学者介绍 Oracle 程序包的基础知识,涵盖其核心概念和基本结构。通过详细解析程序包的组成元素,如过程、函数和变量,帮助读者理解如何在实际应用中有效使用 Oracle 程序包。此外,文章还提供了实例代码,以便读者更好地掌握这些关键概念。 ... [详细]
  • 程序连接MySQL数据库的多种方法详解 ... [详细]
  • 在Linux/WSL环境中,本文对Shell任务的并行处理进行了详细的测试与分析。通过多种并行处理技术,如GNU Parallel和xargs,探讨了如何有效提升任务执行效率和系统资源利用率。实验结果表明,合理配置并行参数能够显著缩短任务完成时间,提高系统整体性能。此外,文章还介绍了Shell脚本编写的基本原则和最佳实践,为读者提供了实用的参考。 ... [详细]
  • 深入解析Android应用中的UID与PID机制及其作用
    在使用开发工具连接手机时,我们经常能看到进程编号,如PID和UID。在Android系统中,PID代表进程标识符,而UID则是用户标识符。与传统计算机系统不同,Android中的每个应用程序都对应一个唯一的UID,这不仅用于区分不同的应用程序,还用于实现系统的安全性和资源管理。通过这种方式,Android能够有效控制应用的权限和资源使用,确保系统的稳定性和安全性。 ... [详细]
  • LeetCode 算法挑战:最小栈的 Java 实现与优化 ... [详细]
  • 本题库精选了高难度的C语言指针与字符串练习题,涵盖了复杂的指针操作和字符串处理技巧。特别包括了基于NMEA-0183协议的GPS数据处理题目,旨在帮助读者深入理解和掌握C语言在实际应用中的高级用法。 ... [详细]
  • 在Linux系统中Nginx环境下SSL证书的安装步骤与WordPress CDN的高级配置指南
    在Linux系统中,Nginx环境下安装SSL证书的具体步骤及WordPress CDN的高级配置指南。首先,安装SSL证书需要准备两个关键配置文件,并建议在操作前备份相关服务器配置文件,以确保数据安全。随后,本文将详细介绍如何在Nginx中正确配置SSL证书,以及如何优化WordPress的CDN设置,提升网站性能和安全性。 ... [详细]
  • 字符串对比竟也暗藏玄机,你是否认同?
    在探讨字符串对比技术时,本文通过两个具体案例深入剖析了其背后的复杂性与技巧。首先,案例一部分详细介绍了需求背景、分析过程及两种不同的代码实现方法,并进行了总结。接着,案例二同样从需求描述出发,逐步解析问题并提供解决方案,旨在揭示字符串处理中容易被忽视的关键细节和技术挑战。 ... [详细]
  • 如何在Linux系统上部署MySQL 5.7.28
    本文详细介绍了在Linux系统上部署MySQL 5.7.28的具体步骤。通过官方下载页面获取最新安装包后,按照提供的指南进行配置和安装。文章内容实用性强,适合初学者和有经验的管理员参考。 ... [详细]
author-avatar
行者
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有