设备驱动模型的需求 总线、设备和驱动模型,如果把它们之间的关系比喻成生活中的例子是比较容易理解的。...没错,Linux 内核里就是运用了这种设计思想去对设备和驱动进行适配隔离的,只不过在内核里我们不叫做适配层,而取名为总线,意为通过这个总线去把驱动和对应的设备绑定一起,如图: ?...基于这种设计思想,Linux 把设备驱动分为了总线、设备和驱动三个实体,这三个实体在内核里的职责分别如下: ?...设备驱动模型的改善 相信通过上面的学习,相信对于设备、驱动通过总线来匹配的模型已经有所了解。如果写代码的话应该是下面结构图所示: ?...最底层是不同板子的板级文件代码,中间层是内核的总线,最上层是对应的驱动,现在描述板级的代码已经和驱动解耦了,这也是 Linux 设备驱动模型最早的实现机制,但随着时代的发展,就像是人类的贪婪促进了社会的进步一样
复习总线设备驱动模型,做了一点小笔记,大牛略过。 一、Linux系统的驱动框架的基础很大一部分是围绕着总线设备驱动模型展开的。...如支持mini2440的nandflash,dm9000等) dev_t devt; // 设备号 }; 任何建立在平台总线设备驱动模型基础上的驱动代码...(dev); } structdevice_driver { const char *name;// 驱动名 struct bus_type *bus;// 该驱动所属的总线...指向设备探测函数 int (*remove) (struct device*dev);// 指向设备移除函数 struct driver_private *p; }; 同理,任何建立在平台总线设备驱动模型基础上的驱动代码...) { // 将驱动绑定在对应的总线上,主要工作把驱动(device_driver)添加到总线(bus_type)的klist_drivers链表中去 ret =bus_add_driver
为了此目的,就引入了I2S(inter-IC sound)数字总线协议接口。 I2S规范 I2S总线只能用来处理audio data,而别的信号比如控制信号,编码信号则交给别的模块处理。
//本文主要参考《野火Linux实战开发指南》 上次跟大家分享了设备模型的一些东西,包括总线、设备、驱动等的一些概念,还有他们之间的联系。...因为在Linux当中,对于I2C、SPI、USB这些常见类型的物理总线来说,Linux内核会自动创建与之相应的驱动总线,因此I2C设备、SPI设备、 USB设备自然是注册挂载在相应的总线上。...它们也就没有相应的物理总线,比如led、rtc时钟、蜂鸣器、按键等等,Linux内核将不会为它们创建相应的驱动总线。...为了使这部分设备的驱动开发也能够遵循设备驱动模型,Linux内核引入了一种虚拟的总线——平台总线(platform bus)。...平台总线也是基于上一节当中的设备模型,在上一节里,介绍了创建总线,也提到了在实际当中,并不需要我们去创建新的总线,而是一般直接用现成的,平台总线就是这样一种现成的总线。
是因为windows自带了USB总线驱动程序, USB总线驱动程序负责: 识别USB设备,给USB设备找到对应的驱动程序 新接入的USB设备的默认地址(编号)是0,在未分配新编号前,PC主机使用0地址和它通信...然后USB总线驱动程序都会给它分配一个地址(编号) PC机想访问USB总线上某个USB设备时,发出的命令都含有对应的地址(编号) USB是一种主从结构。...其中usb_bus_type是一个全局变量, 它和我们之前学的platform平台总线相似,属于USB总线, 是Linux中bus的一种....如下图所示,每当创建一个USB设备,或者USB设备驱动时,USB总线都会调用match成员来匹配一次,使USB设备和USB设备驱动联系起来....id_table来匹配该USB设备 USB总线驱动程序大概流程就此结束,未完待续——分析完后下节开始写USB驱动
coresight cpu event_source hid i2c iio mdio_bus mmc platform scsi sdio serio spi usb virtio workqueue 数据结构 linux
前言 Linux将所有的设备统一抽象为struct device结构, 同时将所有的驱动统一抽象为struct device_driver结构。...数据结构 Linux将所有的设备统一抽象为struct device结构。...bus: 设备所属的总线。 driver: 设备所对应的驱动。 platfrorm_data: 设备所对应的平台数据。...C: 关于总线先设备与驱动的匹配是设备驱动模型的核心 void bus_probe_device(struct device *dev) { struct bus_type *bus = dev->...设备驱动模型-Ktype static ssize_t dev_attr_show(struct kobject *kobj, struct attribute *attr, char
前言 在linux设备驱动模型中,总线可以看作是linux设备模型的核心,系统中的其他设备以及驱动都是以总线为核心围绕。不过驱动程序员在系统中创建一条总线的机会并不多。...驱动模型中的总线可以是真是存在的物理总线(USB总线,I2C总线,PCI总线),也可以是为了驱动模型架构设计出的虚拟总线(Platform总线)。...为此linux设备驱动模型都将围绕"总线--设备--驱动"来展开,因为符合linux设备驱动模型的设备与驱动都是必须挂载在一个总线上的,无论是实际存在的或者虚拟的。....match: 当一个设备或者驱动添加到此总线上的时候,bus就会调用match对设备和驱动一一匹配的。...p: 一个用来管理总线上设备与驱动的数据结构。
Kobject是linux设备驱动模型的基础,也是设备模型中抽象的一部分。如果想了解设备驱动模型就需要明白Kobject的构成或原理。...通常驱动程序员很少使用到kobject结构及其相关接口,而是使用封装之后的更高层的接口函数。 Kobject结构体 内核使用kobject来表示内核一个对象。...init_name; /* initial name of the device */ const struct device_type *type; Kobject相关操作函数 kobject相关的操作函数一般驱动程序员是不会直接操作的...#include #include #include #include #include #include #include
前言 linux将所有的驱动抽象为struct device_driver结构。这样设计可以方便驱动程序更好编写,在编写驱动的时候只需要将此结构嵌入到具体的驱动中即可。...bus: 设备驱动所属的总线 owner: 设备驱动的owner,通常为THIS_MODULE suppress_bind_attrs: 通过sysfs操作设备驱动的bind/unbind,...return ret; } A: 通过驱动的名称在所属的总线上查找,判断总线上是否已经有此驱动,防止重复注册。...B: 将具体的驱动添加到所属的总线,这是注册驱动的核心函数。...->bus); //总线引用计数减1 } 重点看下设备与对应的驱动是如何解除联系的。
#include #include #include #include #include #include #include static struct kobject kobj;...it */ if (name) { pr_debug("kobject: '%s': free name\n", name); kfree(name); } } 所以基于上述的执行路径,在驱动的
Linux系统提供了两套RTC接口,/dev/rtc是为pc机器提供,另一种/dev/rtc0, /dev/rtc1支持所有的系统,具体可参考rtc.txt文档。...linux为新的接口设计一套驱动模型,如果驱动工程师想增加某一个驱动,只需要将芯片相关的代码编写,然后注册到rtc核心层中即可。...RTC驱动框架 RTC涉及的代码如下: driver/rtc/class.c: 此文件向linux内核驱动模型注册了一个类RTC, 同时为底层的RTC驱动提供了注册/注销RTC接口。...driver/rtc/rtc-xxx.c: 各式各样的rtc驱动。 RTC的模型图如下: ? 通过上图可以清晰的看出class.c为各种各异的驱动提供了注册接口。...,当驱动程序使用rtc_device_register函数传递正确的参数,然后就返回struct rtc_deivce给驱动程序。
Linux 内核源码:include\linux\usb.h Linux 内核源码:drivers\hid\usbhid\usbmouse.c 1....BUS/DEV/DRV 模型 "USB 接口"是逻辑上的 USB 设备,编写的 usb_driver 驱动程序,支持的是"USB 接口": USB 控制器或 Hub 识别出 USB 设备后,会创建、...注册 usb_device usb_device 被"drivers\usb\core\generic.c" 驱动认领后,会选择、设置某个配置 这个配置下面的接口,都会分配、设置、注册一个 usb_interface...接口函数 在 USB 设备驱动程序中,能使用的 USB 函数都在这个头文件里:include\linux\usb.h。...已经提交的 URB,可以取消它,有 2 个函数: usb_kill_urb:这是一个同步函数,它会等待 URB 结束 usb_unlink_urb:这是一个异步函数,它不会等待 URB 结束,USB 控制器驱动会调用它的回调函数
前言 当一个设备动态的加入到系统时候(比如常见的将U盘插入到PC机器上), 设备驱动程序就需要动态的检测到有设备插入了系统,就需要将此事件通知到用户层,然后用户层对这一事件做响应的处理,比如加载USB驱动...Linux系统对uevent机制的具体实现是建立在设备模型的基础上的,通过kobject_uevent函数实现。 在前面的kset小节中提到了注册一个kset的接口,可以在这里习复下。
这种做法完全不适应Linux的通用性的设计理念,对于Linux来讲:同样的事情我只做一遍,向外提供接口,不管你是什么IIC设备挂载那条IIC总线上,都可以用。...因此,这就需要Linux在代码架构上有非常严谨的模块化设计。 架构设计 在Linux设计中,将I2C代码框架分为三个部分:I2C总线、I2C核心、I2C驱动。...「I2C总线驱动(i2c adapter):」 根据平台定制的i2c驱动,其中包含i2c传输的算法设计。...I2C设备驱动对上和用户应用程序打交道,对下和I2C核心对接。 ? 本篇主要对IIC总线驱动的总结。...i2c总线结构体 Linux在分层中,必不可少的将每一层模块封装成一个结构体,然后将结构体作为一个与外接交互的桥梁。
转载请标明出处floater的csdn blog,http://blog.csdn.net/flaoter Linux SPI驱动分为核心层,控制器驱动层和设备驱动层。...核心层是Linux的SPI核心部分,提供了核心数据结构的定义,总线、设备和驱动的注册、注销管理等,提供与上层的统一接口。...linux将I2C、SPI、USB等总线驱动隔离成控制器驱动和设备驱动,使两者相对独立。 本文以qcom的spi控制器为例,对spi控制器驱动进行解析。kernel代码版本是3.18。...linux驱动与设备是一对多的关系,在spi_master设备注册时,控制器的结构体信息会提供给spi_master作为私有数据。...3.3 厂商的总线传输 控制器驱动注册函数中进行了传输函数的赋值。
基于这样的想法,linux把设备驱动分为了总线、设备和驱动三个实体,总线是上图中的统一纽带,设备是上图中的板级互连信息,这三个实体完成的职责分别如下: 实体 功能 代码 设备 描述基地址、中断号、时钟、...总线 完成设备和驱动的关联 drivers/base/platform.cdrivers/pci/pci-driver.c… 我们把所有的板子互连信息填入设备端,然后让设备端向总线注册告知总线自己的存在...如下图,某个电路板子上有2个ABC,1个DEF,1个HIJ设备,以及分别1个的ABC、DEF、HIJ驱动,那么总线,就是让2个ABC设备和1个ABC驱动匹配,DEF设备和驱动一对一匹配,HIJ设备和驱动一对一匹配...总线里面有个match()函数,来完成哪个设备由哪个驱动来服务的职责,比如对于挂在内存上的platform总线而言,它的匹配类似(最简单的匹配方法就是设备和驱动的name字段一样): static int...但是,这个VxBus,可以说和Linux的总线、设备、驱动模型是极大地雷同的。但是,请问,你为什么要叫VxBus呢,它非常地Vx吗?
[导读] Linux设备林林总总,嵌入式开发一个绕不开的话题就是设备驱动开发,在做具体设备驱动开发之前,有必要对Linux设驱动模型有一个相对清晰的认识,将会帮助驱动开发,明白具体驱动接口操作符相应都做些什么...注:代码分析基于linux-5.4.31 为啥要驱动模型 随着系统结构演化越来越复杂,Linux内核对设备描述衍生出一般性的抽象描述,形成一个分层体系结构,从而引入了设备驱动模型。...Linux内核驱动程序模型是先前在内核中使用的所有不同驱动程序模型的统一。 它旨在通过将一组数据和操作整合到全局可访问的数据结构中,来扩展基于基础总线来桥接设备驱动程序。...驱动模型抽象了啥 当前驱动程序模型为描述总线和总线下可能出现的设备提供了一个通用的、统一的模型。...总体上而言: 通过上面一些关键数据结构关系分析,总线设备驱动模型最终目的是实现如下这样一个分层驱动模型。
当前使用的是ubuntu18.04,驱动模块的位置:/lib/modules/5.3.0-40-generic/kernel/drivers/usb/mon/usbmon.ko 如果不确定当前内核的版本...2.4 查看usbmon可以识别到的USB总线编号 root@wbyq:/mnt/hgfs/linux-share-dir/linux_c/usb_dev_ubuntu# ls /sys/kernel...root@wbyq:/mnt/hgfs/linux-share-dir/linux_c/usb_dev_ubuntu# lsusb Bus 004 Device 001: ID 1d6b:0003 Linux.../linux_c/usb_dev_ubuntu# 其中 Bus 003 表示 3号总线。...使用的总线是3号总线。 2.6 监控指定总线上通信的数据 为了只看这个想要的设备数据,可以过滤一下。 后面的 "1:010" ,1表示总线编号。 010表示设备编号。
SM总线控制器是全称System Management,是主板控制芯片上的一个通信控制器,主板芯片技术中的一种,如果你遇到设备管理器中quotm总线控制器quot有一黄色问号,下载您所使用的主板最新的系统所对应的驱动程序...,在安装了正确的主机板驱动程序后,系统将能够正确识别您所有的芯片,问题即可解决。...sm总线控制器简介 几年前,Intel在其81x系列芯片组中就开始使用ICH芯片,并在ICH中运用System Management Bus(简称Smbus,系统管理总线)技术。...SM总线控制器是1995年由Intel提出的,应用于移动PC和桌面PC系统中的低速率通讯。它主要是希望通过一条廉价并且功能强大的总线(由两条线组成),来控制主板上的设备并收集相应的信息。...“Intel Software Installation Utility”,可以在主板驱动盘 sm总线控制器驱动安装方法 1.到本站下载安装,打开安装程序,点击下一步继续安装 2.点击yes进行下一步
领取专属 10元无门槛券
手把手带您无忧上云