()获得 – dev号(也叫slot)和func号一般通过宏PCI_DEVFN()合并成一个字节 – 因为PCI规范允许单个系统拥有高达256个总线,所以总线编号是8位。...pcibios_init x86 BIOS专门提供了针对PCI总线的操作,这些操作里就包括了总线枚举的整个过程,Linux kernel中的宏CONFIG_PCI_BIOS。...在系统加电以后自检时,就会完成对PCI总线的枚举,之后Linux对PCI配置空间的访问都是通过BIOS调用的形式进行,提供有这些功能和服务的BIOS就称之为PCI BIOS 。...需要注意的是Linux x86_64是不采用PCI BIOS访问PCI配置空间的,而是内核实现了直接访问PCI配置空间的函数(CONFIG_PCI_DIRECT)。...所以Linux x86驱动程序中pci_read_config_byte()最终调用的是pci_bios_read_config_byte()。
PCI总线常见于x86体系,本文默认面向的体系为x86,注意x86架构下IO与内存是独立编址的。 附: 本文默认读者熟悉Linux设备驱动模型,不熟悉的可以先阅读这两篇blog。...Linux驱动之I2C子系统剖析 Linux驱动之SPI子系统剖析 PCI寻址 PCI系统总体布局组织为树状,从CPU连接的Host Bridge引出PCI主桥,主桥连接的是PCI总线0,可以直接连接PCI...设备,或者再挂上PCI桥引出下一级PCI总线。...PCI规范允许一个系统最多拥有256条总线,每条总线最多带有32个设备,每个设备可以是最多8个功能的多功能板,但是对于大型系统而言总线数不够,故还支持PCI域,每个PCI域可最多支持256个总线。...驱动的注册接口为pci_register_driver(struct pci_driver *drv),当调用该接口后,会调用PCI总线下的match方法来进行匹配 static int pci_bus_match
为了此目的,就引入了I2S(inter-IC sound)数字总线协议接口。 I2S规范 I2S总线只能用来处理audio data,而别的信号比如控制信号,编码信号则交给别的模块处理。
但是这些HOST主桥所完成的最基本功能依然是分离存储器域与PCI总线域,完成PCI总线域到存储器域,存储器域到PCI总线域之间的数据传递,并管理PCI设备的配置空间。...当处理器访问PCI设备时,首先访问的是这个设备在存储器域上的PCI设备空间,之后HOST主桥将这个存储器域的PCI总线地址转换为PCI总线域的物理地址[3],然后再通过PCI总线事务访问PCI总线域的地址空间...PCI总线x域上的PCI总线地址0x0000-0000与PCI总线y域上的PCI总线地址0x0000-0000并不相同,而且这两个PCI总线地址经过HOST主桥反向映射后,得到的存储器地址也不相同。...PCI总线可以使用PCI桥扩展PCI总线,并形成一颗PCI总线树。在一颗PCI总线树上,有几个PCI桥(包括HOST主桥),就有几条PCI总线。...在一颗PCI总线树中,总线号由系统软件决定,通常与HOST主桥直接相连的PCI总线编号为0,系统软件使用DFS(Depth-First Search)算法扫描PCI总线树上的所有PCI总线,并依次进行编号
设备驱动模型的需求 总线、设备和驱动模型,如果把它们之间的关系比喻成生活中的例子是比较容易理解的。...没错,Linux 内核里就是运用了这种设计思想去对设备和驱动进行适配隔离的,只不过在内核里我们不叫做适配层,而取名为总线,意为通过这个总线去把驱动和对应的设备绑定一起,如图: ?...基于这种设计思想,Linux 把设备驱动分为了总线、设备和驱动三个实体,这三个实体在内核里的职责分别如下: ?...看到这里,可能有些喜欢探究本质的读者又要问了,设备向总线注册了板级信息,驱动也向总线注册了驱动模块,但总线是怎么做到驱动和设备匹配的呢?接下来就讲下设备和驱动是怎么通过总线进行“联姻”的。...最底层是不同板子的板级文件代码,中间层是内核的总线,最上层是对应的驱动,现在描述板级的代码已经和驱动解耦了,这也是 Linux 设备驱动模型最早的实现机制,但随着时代的发展,就像是人类的贪婪促进了社会的进步一样
//本文主要参考《野火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驱动
lspci是一个用于显示系统中PCI总线及其连接设备信息的实用程序: 原始信息其实就是一些编号: 从左到右分别是: 00:01.3 总线编号:设备编号:函数编号 0680: 设备类型编号 8086:...7113 厂商编号:设备编号 这些编号的来源就是设备列表: 要把这些编号翻译成文字需要一个翻译文件: /usr/share/misc/pci.ids 注:不同系统上此文件路径可能不同,详见man...更新此文件的命令: update-pciids ,是个脚本可以打开看看文件的来源 这些程序都来自于pciutils工具:https://mj.ucw.cz/sw/pciutils/ 官方维护的一个pci.ids...文件网站:https://pci-ids.ucw.cz/ 总结:lspci从系统设备路径获取设备类型厂商设备编号,通过一个翻译文件pci.ids进行翻译。
PCI桥的配置空间在系统软件遍历PCI总线树时配置,系统软件不需要专门的驱动程序设置PCI桥的使用方法,这也是PCI桥被称为透明桥的主要原因。 在某些处理器系统中,还有一类PCI桥,叫做非透明桥。...,并将驱动程序的中断服务例程注册到操作系统中[4]。...除此之外在Linux系统中,ioremap函数的输入参数为存储器域的物理地址,而不能使用PCI总线域的物理地址。...而在pci_devàresource[bar].start参数中保存的地址已经经过PCI总线域到存储器域的地址转换,因此在编写Linux系统的设备驱动程序时,需要使用pci_devàresource[bar...在Linux系统中,设备驱动程序调用pci_enable_device函数,使能该寄存器的I/O和Memory Space位之后,才能访问该设备的存储器或者I/O地址空间。
超高授时精度:SYN4602 型 PCI 总线授时卡能够提供微秒(us)级别的超高授时精度。...广泛的操作系统支持:在兼容性方面,SYN4602 型 PCI 总线授时卡表现出色,支持 Windows32 位 / 64 位驱动,涵盖了 Windows10/8.1/8/7/Vista/XPServer2016...多领域应用的卓越表现服务器集群与数据中心:在服务器集群和数据中心领域,SYN4602 型 PCI 总线授时卡发挥着关键作用。...SYN4602 型 PCI 总线授时卡的高精度授时特性,能够有效提升通信系统的性能和服务质量,保障通信的稳定性和可靠性。...SYN4602 型 PCI 总线授时卡能够确保生产线上的机器人、传感器、控制器等设备在统一的时间基准下协同工作,提高生产效率,降低次品率。
由于实在找不到MSI-X在x86上实现的教程或文档,只能分析Linux的PCI驱动程序了。希望能得到一些启发。...本文基于linux 5.17.5进行分析 __pci_enable_msix_range static int __pci_enable_msix_range(struct pci_dev *dev,...该函数原型如下: int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) 该函数首先获取msi的domain,校验是否为继承的...(我还不明白这里是干啥意思的) 然后就会去调用pci_msi_legacy_setup_msi_irqs函数,去设置msix。...pci_msi_legacy_setup_msi_irqs 该函数的作用很简单:调用arch_setup_msi_irqs方法,去设置msi,然后通过pci_msi_setup_check_result
复习总线设备驱动模型,做了一点小笔记,大牛略过。 一、Linux系统的驱动框架的基础很大一部分是围绕着总线设备驱动模型展开的。...如支持mini2440的nandflash,dm9000等) dev_t devt; // 设备号 }; 任何建立在平台总线设备驱动模型基础上的驱动代码...(如平台驱动,PCI驱动,USB驱动,I2C驱动,SPI驱动等),它们的设备结构体(如platform_device, pci_dev,usb_device,i2c_device, spi_device...(如平台驱动,PCI驱动,USB驱动,I2C驱动,SPI驱动等),它们的驱动结构体(如platform_driver, pci_driver,usb_driver,i2c_driver,spi_driver...) { // 将驱动绑定在对应的总线上,主要工作把驱动(device_driver)添加到总线(bus_type)的klist_drivers链表中去 ret =bus_add_driver
串行总线和并行总线接口 在高速串行总线流行起来之前,芯片之间的互联通过系统同步或者源同步的并行接口传输数据,而所谓的并行接口,是指通信中一个或几个字节(8位)数据是在n*8条并行传输线上同时由源端传到目的地...并行总线与串行总线的区别对比及优缺点 很明显,并行通信的速度要比串行通信的速度快得多,效率更高,费时更少。...按照理论分析并行总线可以一次传多个数据位,而且时钟远远低于串行,理论应该成为目前高速传输信号的首选,那为什么像PCI、IEEE 1284、PATA等并行总线被PCIe、USB、SAT等串行总线所取代呢?...下面就针对并行总线为什么不能成为目前总线接口的主流? 图1‑5演示了系统同步(共同时钟)方式及源同步时钟方式并行总线接口。 ?...经上所述,并行总线在发高速传输的今天遇到了很多瓶颈,而这些瓶颈因为不能被解决,所以被串行总线所取代,但是将来随着一些工艺问题的解决,并行总线可能又被抬上“舞台”,像《PCIe“拍了拍”PCI- PCI和
各自是“SM总线控制器”和“其它PCI桥设备“,主板是七彩虹的,芯片组是 geForce 7025的,南桥是 nForce 630a,用七彩虹官网的主板驱动装了没用。...用驱动人生先备份还有一个相同主板的机器的驱动。...得到 NVIDIA nForce PCI System Management_*.zip, NVIDIA Network Bus Enumerator_*.zip. 第一个是SM总线驱动。...第二个是其它PCI桥设备驱动。 将它们分别解压到不同文件夹,更新驱动时选相应的的文件夹。就ok了。...其它PCI桥设备驱动更新后,winxp就会识别出网卡,由于nVidia的主板是软网卡,必须装这个驱动才干识别到。 只是还是不清楚为什么装主板驱动没用,曾经仅仅要装主板驱动就基本ok了。
其实,只要你认真下去,虽然有些东西看不明白,但是对于你写PCI的驱动来说,似乎“不那么重要”。因为,Linux内核对PCI总线已经有了完美的支持,你所需要做的内容是非常小的一部份。...Linux下的PCI总线,在系统上电的时候会逐一的扫描系统中存在的设备(包括设备和桥),总线号中断号都是这个时候分配给设备的,如果你是初学者,这个过程如果不是很明白,你大可以先略过,去找一个带有PCI总线的开发板...众所周知,Linux 2.6内核引入了总线驱动模型这一概念,如此,很多基于总线的设备驱动就分成了总线驱动和设备驱动两部分。...下面是我写的一个PCI总线的驱动程序,注意是PCI设备识别时的驱动程序,这里并没有实现具体的功能驱动。...基于PCI总线的设备有很多种,但就PCI总线驱动这一块来说,都大同小异,实现了PCI总线驱动之后,再去继续做具体的设备驱动。
北斗pci总线板卡是一种接收北斗卫星信号,为计算机等设备提供精确时间同步的板卡,其稳定性好、用法简单、兼容性强、可二次开发等特点深受广大客户欢迎,今天就pci授时板卡进行详细介绍:pci授时板卡功能:卫星信号接收与时间同步...北斗 PCI 总线授时板卡具有高精度、高可靠性等特点,广泛应用于以下领域:电网调度:电力系统的稳定运行对时间同步要求极高。...北斗pci总线板卡为核心网设备提供统一的时间源,确保网络中的各种设备在时间上保持一致,提高网络的整体性能和服务质量。...北斗pci总线板卡领用领域证券交易:在证券交易中,交易时间的准确性直接关系到交易的公平性和安全性。...北斗pci总线板卡为生产线中的各种设备提供统一的时间基准,使设备之间能够按照精确的时间顺序进行操作,提高生产线的生产效率和灵活性,实现智能化生产。
这种做法完全不适应Linux的通用性的设计理念,对于Linux来讲:同样的事情我只做一遍,向外提供接口,不管你是什么IIC设备挂载那条IIC总线上,都可以用。...因此,这就需要Linux在代码架构上有非常严谨的模块化设计。 架构设计 在Linux设计中,将I2C代码框架分为三个部分:I2C总线、I2C核心、I2C驱动。...「I2C总线驱动(i2c adapter):」 根据平台定制的i2c驱动,其中包含i2c传输的算法设计。...I2C设备驱动对上和用户应用程序打交道,对下和I2C核心对接。 ? 本篇主要对IIC总线驱动的总结。...i2c总线结构体 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表示设备编号。
而总线授时卡作为实现高精度时间同步的核心设备,其重要性不言而喻。本文将以SYN4602型PCI总线授时卡为例,探讨总线授时卡在大型系统中的关键作用,并解答客户在实际应用中可能遇到的问题。...总线授时卡通过接收高精度的时间源(如GPS、北斗卫星信号),并将这些时间信号通过总线(如PCIe、PCI)传递给系统中的各个设备,从而实现微秒甚至纳秒级别的时间同步。2....总线授时卡通过提供统一的时间基准,确保各个子系统在相同的时间点上进行数据采集和处理,从而避免数据不一致或丢失的问题。二、SYN4602型PCI总线授时卡的独特优势1....高精度与低延迟SYN4602型PCI总线授时卡采用先进的时间同步算法和高精度的时钟源,能够实现纳秒级别的时间同步精度。...SYN4602型PCI总线授时卡凭借其高精度、多源时间同步和强大的兼容性,能够满足大多数大型系统的需求。
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进行下一步