1.新建内核模块工程

在 module_init函数中调用pci初始化函数。

2.pci初始化函数

lspci -xxx

1.使用pcis命令查看当前设备的设备厂商,ID等信息,如下图:

2. 使用 lspci  -vvv 查看设备更多信息

3.使用  lspci -xxx  可以查看pci配置寄存器值,如下图

每个pci设备的配置寄存器值都会显示出来,具体寄存器对应值参照pci标准如下图:

Vendor ID,Device ID:标记了一个设备的生产厂商和具体的设备,比如Intel的设备Vendor ID通常是0x8086,Device ID就需要厂家自定义了。

Revision ID 和Class Code 寄存器:该组寄存器只读,其中Reversion ID 寄存器记载PCI 设备的版本号,该寄存器可以认为是Deveice ID 寄存器的扩展,而Class Code 寄存器记载了PCI设备的分类。

Status:设备状态字,具体每个BIT的意义见下图

Command:设备状态字:

Base Address Registers:决定PCI/PCIe设备空间映射到系统空间具体位置的寄存器,映射方式有两种,分别是IO(IO为x86平台特有,arm,mips等没有IO)和Memory映射,一个设备最多可以有6个基址空间:

配置空间中的 capability Pointer 是扩展信息地址,这个寄存器的是可选的,但是PCI-X 和PCIe必须支持这个寄存器。

结构如下,每个capability都有一个唯一的ID号,每个capability都有一个指针指向下一个capability,行成链表。

Interrupt Line 寄存器:该寄存器是系统软件对pci设备进行配置时写入的,记录当前PCI设备使用的中断向量号,设备驱动程序可以通过这个寄存器,判断当前PCI设备使用处理器系统中的那个中断向量号。

Interrupt pin 寄存器 :该寄存器保存PCI设备使用的中断引脚。PCI总线提供了四个中断引脚:INTA,INTB,INTC,INTD,1表示使用INTA,2表示INTB,3表示INTC,4表示INTD。

下图是初始化函数

在初始化函数中声明pci驱动,PCI_DRV_CB与 PCI_DRV_HANDEL 是SylixOS封装好的结构体,首先需要填充支持设备表,设备表结构体定义如下

实例:

注册完成设备支持列表后,需要注册探测函数 PCIDRV_pfuncDevProbe,系统会在发现设备表中对应的设备时调用相应的probe函数。进入到pro函数后获取基地址和中断号,并可以probe中注册其他字符驱动,块设备驱动,网卡驱动等等。

在SylixOS中可以直接调用相应的API将获得的物理基地址映射为虚拟地址,如下图

在获取到基地址后就可以像正常的驱动一样 操作寄存器,完成相应的驱动。如果需要使用中断,SylixOS支持INTx和MSI中断两种,通过API_pciDevMsiEnableSet函数来控制当前使用哪种中断,当MSI中断使能后系统会自动禁用INTX中断。

在使用INTX中断时一个设备最多只能有一个中断号,通过系统函数获取中断号,如下图:

使用MSI中断时使用API_PciDevMsiRangeEnable申请一段连续的中断,但是不一定会成功,需要检测是否申请到足够的中断。在PCIe设备必须支持MSI,MSI 使用了MSI capability 结构体来实现中断请求,PCI设备在提交MSI中断请求时总是向这种Capability结构体中的Message Address 的地址写Message Data ,从而组成一个寄存器写TLP。MSI capability 结构体如下图

MSI capability 有几种类型根据位数和mask进行区分, 当capability ID为05 表示是MSI的ID号,

实例:

通过查看配置空间当前capability pointer 值为50,也就是扩展空间地址为50,50位置对应的capability ID是05 ,说明设备支持MSI中断。

Message control :该字段存放当前设备使用MSI机制进行中断请求的状态与控制信息。

Message Address/message Upoer Address:存放目的地址

Message Data:用来存放MSI 报文使用的数据。

Mask Bits:一个PCIe设备使用的MSI机制时,最多可以使用32个中断,对应到这里的32位。BIT置1表示屏蔽中断。

pending Bits : 该字段对于系统软件只读,也是32位,对应到可用的32个中断。

当Mask Bits 字段的相应位为1时。如果PCIe设备需要发送对应的中断请求,Pending Bits 字段对应位将被PCIe设备的内部逻辑置为1,此时PCIe设备并不会使用MSI报文向中断控制寄存器提交请求,但是系统软件将Mask bits字段的相应位从1改写为0时,PCIe设备将发送MSI 报文向出来提交中断请求,同时将Pending Bits 字段对应的内容清零。

在使用MSI时向系统申请一段连续中断向量后,需要获取申请的中断向量首个向量号,并将中断向量号绑定中断函数。在申请MSI成功后系统会自动将MSI控制块中对用的MSI信息进行填充

通过MSI获得中断数量,首个中断号,然后把中断号依次使用API_PciDevInterConnect函数进行中断函数绑定。

3.pci设备卸载

通过注册时使用的驱动名称查找对用的PCI句柄,找到后调用 API_PciDrvDevDel 函数删除,API_PciDrvDevDel会调用在pci初始化时注册好的PCIDRV_pfuncDevRemove  。

在Remove函数中做相应的删除处理

SylixOS pci 设备驱动开发相关推荐

  1. 《Linux设备驱动开发详解 A》一一2.3 接口与总线

    本节书摘来华章计算机出版社<Linux设备驱动开发详解 A>一书中的第2章,第2.3节,作者:宋宝华 更多章节内容可以访问云栖社区"华章计算机"公众号查看.1 2.3 ...

  2. Linux设备驱动开发概述

    作者:宋宝华 email:author@linuxdriver.cn 在过去这些年,Linux已经成功应用于服务器和桌面系统,而近年来,随着嵌入式系统应用的持续升温,Linux也开始广泛应用于嵌入式领 ...

  3. linux设备驱动开发详解源码,linux设备驱动开发详解光盘源码.rar

    压缩包 : linux设备驱动开发详解光盘源码.rar 列表 19/busybox源代码/busybox-1.2.1.tar.bz2 19/MTD工具/mtd-utils-1.0.0.tar.gz 1 ...

  4. 《Linux设备驱动开发详解》学习笔记一

    Linux设备驱动开发详解学习笔记<一> 书名:<Linux设备驱动开发详解>第二版 主机环境:Linux version 2.6.25-14.fc9.i686@Fedora ...

  5. 《Linux 设备驱动开发详解(第2版)》——1.4 Linux设备驱动

    本节书摘来自异步社区<Linux 设备驱动开发详解(第2版)>一书中的第1章,第1.1节,作者:宋宝华著,更多章节内容可以访问云栖社区"异步社区"公众号查看 1.4 L ...

  6. Linux设备驱动开发详解 第3版 (即 Linux设备驱动开发详解 基于最新的Linux 4 0内核 )前言

    Linux从未停歇脚步.Linus Torvalds,世界上最伟大的程序员之一,Linux内核的创始人,Git的缔造者,仍然在没日没夜的合并补丁,升级内核.做技术,从来没有终南捷径,拼的就是坐冷板凳的 ...

  7. 浅谈Linux PCI设备驱动(一)

    要弄清楚Linux PCI设备驱动,首先要明白,所谓的Linux PCI设备驱动实际包括Linux PCI设备驱动和设备本身驱动两部分.不知道读者理不理解这句话,本人觉得这句话很重要,对于PCI.US ...

  8. Linux设备驱动开发基础

    1.驱动概述和开发环境搭建 1.1驱动设备的作用 对设备驱动最通俗的解释就是"驱动硬件设备行动".驱动与底层硬件直接打交道,按照硬件设备的具体工作方式,读写设备的寄存器,完成设备的 ...

  9. 浅谈Linux PCI设备驱动(二)

    我们在浅谈Linux PCI设备驱动(一)中(以下简称浅谈(一) )介绍了PCI的配置寄存器组,而Linux PCI初始化就是使用了这些寄存器来进行的.后面我们会举个例子来说明Linux PCI设备驱 ...

  10. 《Linux设备驱动开发详解(第2版)》隆重出版

    Linux设备驱动开发详解(第2版)(前一版狂销3万册,畅销书最新升级) [新品] 点击看大图     基本信息 * 作者: 宋宝华       * 出版社:人民邮电出版社     * ISBN:97 ...

最新文章

  1. php js array,JavaScript等同于PHP的in_array()
  2. Handler消息机制(一):Linux的epoll机制
  3. Java内部类作用全解
  4. OpenCV图像增强(三)——自适应对数映射
  5. 查看docker的端口映射情况
  6. 数据库表扩展字段设计思路
  7. php安装pcntl扩展
  8. Vue2.x双向数据绑定
  9. C++ static 类成员
  10. mysql添加标签_PHP / MySQL - 如何添加多个标签
  11. NHibernate Antlr.Runtime.NoViableAltException报错
  12. win11正式版iso镜像如何安装 windows11正式版iso镜像安装方法
  13. linux系统u盘启动项,linux怎么以u盘启动
  14. 如何用informatic实现表的增量抽取
  15. 大地坐标系转换火星坐标系
  16. 35岁老年程序员的绝地翻身之路
  17. win32面试题总结
  18. Android AOSP和Android-X86源码下载编译终极普法
  19. 如何将EXCEL表格的内容导入到CDR中?
  20. 调查计算机对运算能力的影响,计算器对运算能力的影响

热门文章

  1. centos7 安装mysql_第02期:ClickHouse 单机部署以及从 MySQL 增量同步数据
  2. Java NIO框架Netty教程(三) – Object对象传递
  3. tomcat启动脚本
  4. 广东省汕头大学毕业设计论文撰写规范[2006]
  5. javascript的window.open()具体解释
  6. Android 退出app,后台推送的服务也停止了,怎么可以做到不停止后台服务呢?
  7. Spark 概念学习系列之从spark架构中透视job(十六)
  8. 40条真言,希望对进阶中的程序朋友有所帮助。
  9. plusgantt的项目管理系统实战开发最全课程
  10. DHCP Snooping,Dynamic ARP Inspection实现