LinuxGod

LinuxGod.net
Linux大神网——精选每一篇高品质的技术干货
  1. 首页
  2. 开源快讯
  3. 正文

PCI总线带宽为132MB/s的PCI配置空间访问

2023年8月2日 234点热度

PCI是CPU和外围设备通讯的高速传输总线。普通PCI总线带宽通常为132MB/s(在32bit/33Mhz下)或则264MB/s(在32bit/66Mhz下)。

PCI总线体系结构是一种层次式的体系结构,PCI桥设备抢占着重要的地位,它将父总线与子总线联接在一起,进而使整个系统看上去像一颗倒置的树状结构。

PCI桥包括以下几种:

Host/PCI桥:用于联接CPU与PCI根总线,在PC中,显存控制器也一般被集成到Host/PCI桥设备芯片,Host/PCI桥一般被称为“北桥芯片组”。

PCI/ISA桥:用于联接旧的ISA总线。PCI/ISA桥也被称为“南桥芯片组”。

PCI-to-PCI桥:用于联接PCI主总线与次总线。

二、PCI配置空间访问

PCI有3种粮址空间:PCI/IO空间、PCI显存地址空间和PCI配置空间。

PCI配置空间(共为256字节):

linux驱动开发工具_linux驱动开发有前途吗_linux usb驱动程序开发

制造商标识:由PCI组织分配给厂家。设备标示:按产品分类给本卡编号。分类码:本卡功能分类码。申请储存器空间:PCI卡里有储存器或以储存器编址的寄存器和I/O空间,为使驱动程序和应用程序能访问它们。配置空间的基地址寄存器用于此目的。申请I/O空间:配置空间基地址寄存器拿来进行系统I/O空间申请。中断资源申请:向系统申请中断资源。

内核为驱动提供的函数访问配置空间:

pci_read_config_byte/word/dword(struct pci_dev *pdev, int offset, int *value);
pci_write_config_byte/word/dword(struct pci_dev *pdev, int offset, int *value);

PCI的I/O和显存空间:

获取I/O或显存资源:

pci_resource_start(struct pci_dev *dev,  int bar);/*Bar值的范围为0-5*/

该函数返回六个PCII/O区域之一的第一个地址(显存地址或I/O端口编号)。

pci_resource_end(struct pci_dev *dev,  int bar)   /* Bar值的范围为0-5*/

该函数返回第bar个I/O区域的后一个地址。注意这是最后一个可用的地址,而不是该区域以后的第一个地址。

pci_resource_flags(struct pci_dev *dev,  int bar)  /* Bar值的范围为0-5 */

该函数返回资源关联的标志。资源标志拿来定义单个资源的个别特点。对与PCII/O区域关联的PCI资源,该信息从基地址寄存器中获得linux主机,但对其它与PCI设备无关的资源,它可能来自任何地方。所有的资源标志定义在中linux usb驱动程序开发,下边列举其中最重要的几个:

IORESOURCE_IO

IORESOURCE_MEM

假如对应的I/O区域存在,将设置里面标志中的一个深度linux,并且只有一个。

IORESOURCE_PREFETCH

IORESOURCE_READONLY

上述标志定义显存区域是可预取的,或则是写保护的。对PCI资源来讲,从来不会设置前面的那种标志。通过使用pci_resource_flags函数,设备驱动程序可完全忽视底层的PCI寄存器linux usb驱动程序开发,由于系统早已使用这种寄存器建立了资源信息。

申请/释放I/O或显存资源:

int pci_request_regions(struct pci_dev *pdev, const char *res_name);
void pci_release_regions(struct pci_dev *pdev);

获取/设置驱动私有数据:

void *pci_get_drvdata(struct pci_dev *pdev);
void pci_set_drvdata((struct pci_dev *pdev, void *data);

使能/严禁PCI设备:

int pci_enable_device(struct pci_dev *pdev);
int pci_disable_device(struct pci_dev *pdev);

设置主总线为DMA模式:

void pci_set_master(struct pci_dev *pdev);

找寻指定总线指定槽位的PCI设备:

struct pci_dev *pci_find_slot (unsigned int bus,unsigned int devfn);

linux usb驱动程序开发_linux驱动开发工具_linux驱动开发有前途吗

设置PCI能量管理状态:

int pci_set_power_state(struct pci_dev *pdev, pci_power_t state);

在设备的能力中表中找出指定能力:

int pci_find_capability(struct pci_dev *pdev, int cap);

启用设备显存写无效事务:

int pci_set_mwi(struct pci_dev *pdev);

禁用设备显存写无效事务:

void pci_clear_mwi(struct pci_dev *pdev);

三、PCI设备驱动组成

PCI本质上就是一种总线,具体的PCI设备可以是字符设备、网络设备、USB等,所以PCI设备驱动应当包含两部份:

PCI驱动依据需求的设备驱动

依据需求的设备驱动是最终目的,PCI驱动只是手段帮助需求设备驱动达到最终目的而已。换句话说PCI设备驱动除了要实现PCI驱动还要实现依据需求的设备驱动。

PCI驱动注册与注销:

int pci_register_driver(struct pci_driver * driver);
int pci_unregister_driver(struct pci_driver * driver);

pci_driver结构体:

struct pci_driver {
struct list_head node;
char *name;/* 描述该驱动程序的名字*/
struct moudule *owner;
const struct pci_device_id *id_table;/* 指向设备驱动程序感兴趣的设备ID的一个列表,包括:厂商ID、设备ID、子厂商ID、子设备ID、类别、类别掩码、私有数据*/
int   (*probe)   (struct pci_dev *dev, const struct pci_device_id *id);/* 指向一个函数对于每一个与id_table中的项匹配的且未被其他驱动程序处理的设备在执行pci_register_driver时候调用此函数或者如果是以后插入的一个新设备的话,只要满足上述条件也调用此函数*/
void (*remove) (struct pci_dev *dev);/* 指向一个函数当该驱动程序卸载或者被该驱动程序管理的设备被卸下的时候将调用此函数*/
int   (*save_state) (struct pci_dev *dev, u32 state);/* 用于在设备被挂起之前保存设备的相关状态*/
int   (*suspend)(struct pci_dev *dev, u32 state);/* 挂起设备使之处于节能状态*/
int   (*resume) (struct pci_dev *dev);/* 唤醒处于挂起态的设备*/
int   (*enable_wake) (struct pci_dev *dev, u32 state, int enable);/* 使设备能够从挂起态产生唤醒事件*/
};

四、小结

PCI总线是目前应用广泛的计算机总线标准,并且是一种兼容性最强、功能最全的计算机总线。而Linux作为一种新的操作系统,同时也为PCI总线与各类新型设备互连成为可能。因为Linux源码开放,因而给联接到PCI总线上的任何设备编撰驱动程序显得相对容易。本文介绍怎么编撰Linux下的PCI驱动程序的关键函数插口。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 中断 带宽 应用 总线 驱动
最后更新:2023年8月2日

Linux大神网

每日更新,欢迎收藏♥ 不积跬步无以至千里,加油,共勉。

点赞
< 上一篇
下一篇 >

Linux大神网

每日更新,欢迎收藏♥
不积跬步无以至千里,加油,共勉。

最新 热点 随机
最新 热点 随机
ARM-Linux应用开发和单片机开发的不同ARM的应用 Linux下如何查看内核信息、发行版信息的信息? 《Linux内核编程》入门篇:降维为繁 Linux网卡驱动安装及配置指南 大专计算机有哪些课程,专业的1对1答疑! SamsungNote2Verizoni605onAndroid在Android系统上安装linux发行版 MPV的高级应用——Ubuntu最佳应用列表里的应用 手机上可以安装一套完整的Linux系统吗? Ubuntu上安装SMplayer.6.10-PPA源在CentOS5.5下安装使用 centos启动图形界面的方法.x1,关闭界面 Linux下进程与线程概念重构 Linux中的十大开源播放器C编写 多进程和多线程的区别,你知道几个? Linux发行版中可用的7款最佳开源视频播放器 Linux系统安装网卡驱动的具体操作流程进行说明 如何在Linux上安装视频播放器installvlc 晚上暴露于蓝光,睡眠质量大打折扣 如何安装便携式WiFi驱动程序?360wifi驱动的教程 CentOS云服务器搭建网站和CentOS搭建DNS解析服务 如何在linux上创建一个用户,减少不必要的沟通成本
嵌入式Linux操作系统学习规划+LINUX路线,主攻江苏电信天翼校园客户端故障指引及解决办法(101)英特尔GMAGMA950显卡驱动程序/WIN8/8.1电信校园网宽带用USB数据线共享给电脑无线上网国防科大开源操作系统:它只是一个吉祥的象征10个常用Linux文本查看命令及其详细说明和使用示例Linux嵌入式系统内核裁剪与定制方法的介绍情况淘宝教育热卖C语言编程开发C++程序设计零基础入门课程从CPU、内存、硬盘、显卡等这些方面安装Linux系统的最低配置Linux通过chkconfig设置开机启动服务创建的几种常见方式(技术分析)Linux多线程的使用与操作系统的区别通常rar命令由一个主命令加若干选项(可选)构成RedHatLinux中自动运行程序中的应用linux 读写文件 关于Linux内核的神秘面纱,你知道几个?使用wget实用程序的有用命令行工具的使用怎么设置linux开机项自启动?方式是怎样的?嵌入式Linux应用层与驱动层要想学习关于Linux内核的交叉编译步骤和方法:步骤、方法STM32嵌入式linux开发流程及应用程序分析-STMlinux下有哪些文件在介绍lsof命令实用用法介绍?
小白在阿里云云服务器上如何发布自己的网站(建站|详细) SteelEyeLifeKeeper集群软件关键特性企业数据中心 什么是Samba文件服务器/CIFS协议的应用场景 Linux在未来服务器领域仍是大势所趋! 您的Linux系统在没有停机的情况下运行了多长时间? 1.3socket编程客户端-服务端基本流程图片App 置(负载均衡系统)更新(2):LVS-TUN模型 linux下有哪些文件在介绍lsof命令实用用法介绍? RedHatLinux软件安装包软件后缀为.rpm最初 TP-LINK全能无线网卡驱动分享 Linux下如何设置开机启动启动脚本?学算法 嵌入式物联网学习资料(头条)搭建交叉开发环境 Linux下的安装zip解压功能及安装unzip教程 轻松压缩文件,linux命令必备! 如何利用linux来开发属于自己的嵌入式Linux操作系统 语句块中的通用命令是什么? LinuxCronJobs提权定时任务定时 从Windows+Linux(Ubuntu)双系统安装教程说在前面 如何安装任何版本的Linux,以及某些最流行的系统的安装方法 Linux计算机上使用ip命令来找到目标IP地址的方法
标签聚合
虚拟机 操作 文件 内核 linux服务器 linux系统 应用 命令 软件 文件目录
书籍
课程
技术群
技术干货大合集↓
  • 2023年10月 / 8篇
  • 2023年9月 / 90篇
  • 2023年8月 / 93篇
  • 2023年7月 / 94篇
  • 2023年6月 / 90篇
  • 2023年5月 / 93篇
  • 2023年4月 / 90篇
  • 2023年3月 / 129篇
  • 2023年2月 / 84篇
  • 2023年1月 / 161篇
  • 2022年12月 / 187篇
  • 2022年11月 / 76篇
友情链接:

Linux书籍 | Linux命令 | Linux系统 | RHCE红帽认证 | Linux软件 | Linux教程 | CentOS系统 | Linux内核 | Linux服务器 | Linux大神 | IT资源

COPYRIGHT © 2023 linuxgod.net ALL RIGHTS RESERVED.