热门标签 | 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)


推荐阅读
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • Linux环境下C语言实现定时向文件写入当前时间
    本文介绍如何在Linux系统中使用C语言编程,实现在每秒钟向指定文件中写入当前时间戳。通过此示例,读者可以了解基本的文件操作、时间处理以及循环控制。 ... [详细]
  • 对于许多初学者而言,遇到总线错误(bus error)或段错误(segmentation fault/core dump)是极其令人困扰的。本文详细探讨了这两种错误的成因、表现形式及解决方法,并提供了实用的调试技巧。 ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • 本文详细介绍了如何在预装Ubuntu系统的笔记本电脑上安装Windows 7。针对没有光驱的情况,提供了通过USB安装的具体方法,并解决了分区、驱动器无法识别等问题。 ... [详细]
  • 在编译BSP包过程中,遇到了一个与 'gets' 函数相关的编译错误。该问题通常发生在较新的编译环境中,由于 'gets' 函数已被弃用并视为安全漏洞。本文将详细介绍如何通过修改源代码和配置文件来解决这一问题。 ... [详细]
  • Linux环境下进程间通信:深入解析信号机制
    本文详细探讨了Linux系统中信号的生命周期,从信号生成到处理函数执行完毕的全过程,并介绍了信号编程中的注意事项和常见应用实例。通过分析信号在进程中的注册、注销及处理过程,帮助读者理解如何高效利用信号进行进程间通信。 ... [详细]
  • 主调|大侠_重温C++ ... [详细]
  • 本文详细介绍了如何解压并安装MySQL集群压缩包,创建用户和组,初始化数据库,配置环境变量,并启动相关服务。此外,还提供了详细的命令行操作步骤和常见问题的解决方案。 ... [详细]
  • CentOS 6.8 上安装 Oracle 10.2.0.1 的常见问题及解决方案
    本文记录了在 CentOS 6.8 系统上安装 Oracle 10.2.0.1 数据库时遇到的问题及解决方法,包括依赖库缺失、操作系统版本不兼容、用户权限不足等问题。 ... [详细]
  • CentOS 6.5 上安装 MySQL 5.7.23 的详细步骤
    本文详细介绍如何在 CentOS 6.5 系统上成功安装 MySQL 5.7.23,包括卸载旧版本、下载安装包、配置文件修改及启动服务等关键步骤。 ... [详细]
  • 异常要理解Java异常处理是如何工作的,需要掌握一下三种异常类型:检查性异常:最具代表性的检查性异常是用户错误或问题引起的异常ÿ ... [详细]
  • 在本教程中,我们将深入探讨如何使用 Python 构建游戏的主程序模块。通过逐步实现各个关键组件,最终完成一个功能完善的游戏界面。 ... [详细]
  • Linux系统中Java程序Too Many Open Files问题的深入解析与解决方案
    本文详细分析了在Linux环境下运行的Java应用程序中可能出现的“Too many open files”异常现象,探讨其成因及解决方法。该问题通常出现在高并发文件访问或大量网络连接场景下,对系统性能和稳定性有较大影响。 ... [详细]
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社区 版权所有