/driver/pci/probe.c

/arch/powerpc/kernel/pci_64.c

在pci驱动中pci调用pci_scan_device扫描每个设备的每个功能,当发现该功能存在时(通过读设备的vendor及product ID确定),就为该设备功能建立一个完整的pci_dev(通过pci_setup_device 完成),并将该设备功能加入到全局链表及总线链表中,当加载设备驱动程序时,设备驱动根据总线类型扫描总线上连接的设备,然后读取pci_dev数据结构中的vendor ID及product Id号来确定是否支持该设备通过与自己的 product table id 比较完成。

1. pci驱动分为总线驱动和设备驱动。总线驱动是linux内核完成,主要完成设备的枚举,常规64个字节配置空间的访问。设备驱动是针对PCI接口具体设备需要实现的功能。例如PCIE网卡的驱动,肯定是实现一个网卡的收发。

2.linux启动过程中pci总线初始化主要包括2部分,pci控制器的注册和pci设备的枚举,pci总线和其他总线一个很重要的区别就是pci总线的枚举,在启动过程中遍历pci总线树上所有可能的dev func,记录下所有存在的设备的vendor id  设备名等,这个是做为后面pci设备驱动初始化中注册pci设备驱动需要匹配(例如设备驱动id)的重要依据,类似于platform驱动。

3. PCI 名稱以及裝置名稱為 09:00.0 0c04: 1077:2432 (rev 03) 先來看看這些數字所代表的意義.
前面的 3 個數字 "09:00.0" 是各代表什麼意思.
在 PCI 的裝置使用三個編號用來當作識別值,個別為 1. "匯流排(bus number)", 2. "裝置(device number) 以及 3. "功能(function number)".
所以剛剛的 09:00.0 就是 bus number = 09 ,device number = 00 function = 0 .
這3個編號會組合成一個 16-bits 的識別碼,
匯流排(bus number) 8bits 2^8 至多可連接 256 個匯流排(0 to ff),  
裝置(device number) 5bits 2^5 至多可接 32 種裝置(0 to 1f) 以及  
功能(function number) 3bits 2^3 至多每種裝置可有 8 項功能(0 to 7).
關於更多 #lspci 的資訊請參考 http://benjr.tw/node/543
不過在 Linux 使用 Class ID + Vendor ID + Device ID  來代表裝置,如剛剛的  0c04: 1077:2432 所代表裝置名稱為 (Class ID = 0c04 ,Vendor ID = 1077,Device ID =2432) .
0c04 : class 0c04 表示是 "Fiber Channel controller"
1077 : vendor ID 1077 製造廠商 "Qlogic Corp"
2432 : device ID 2432 產品名稱 "ISP2432-based 4Gb Fiber Channel to PCI Express HBA"

4.在PCIE链路只能连接一个下游设备,而这个下游设备的Device Number只能为0

5.在PCIe总线的物理链路的一个数据通路(Lane)中,由两组差分信号,共4根信号线组成, PCIe链路可以由多条Lane组成,目前PCIe链路可以支持1、2、4、8、12、16和32个Lane,即×1、×2、×4、×8、×12、×16和×32宽度的PCIe链路。每一个Lane上使用的总线频率与PCIe总线使用的版本相关。

6.研究了一下PCIE热插拔,跟踪内核驱动发现,目前来看,不仅需要linux内核支持,还需要PCIE设备本身支持(PCIE支持热插拔寄存器扩展)---

6.1 linux内核支持

Bus options ---> support for PCI Hotplug

---> PCI Express support ---> PCI EXpress hotplug driver

6.2 PCIE设备支持,参考PCIE 3.0标准手册,必须有该寄存器扩展(slot capabilities Register),且第7位hot-      plug capalbe为1

7. rtl8139 设备驱动初始化
static int __init demo_init_module (void)
{
    /* 检查系统是否支持PCI总线 */
    if (!pci_present())
        return -ENODEV;
    /* 注册硬件驱动程序 */
    if (!pci_register_driver(&demo_pci_driver)) {
        pci_unregister_driver(&demo_pci_driver);
                return -ENODEV;
    }
    /* ... */
   
    return 0;
}

pci_register_driver做了三件事情。

  ①是把带过来的参数rtl8139_pci_driver在内核中进行了注册,内核中有一个PCI设备的大的链表,这里负责把这个PCI驱动挂到里面去。

  ②是查看总线上所有PCI设备(网卡设备属于PCI设备的一种)的配置空间如果发现标识信息与rtl8139_pci_driver中的id_table相同即rtl8139_pci_tbl,而它的定义如下:

  static struct pci_device_id rtl8139_pci_tbl[] __devinitdata = {

  {0x10ec, 0x8129, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1},

  {PCI_ANY_ID, 0x8139, 0x10ec, 0x8139, 0, 0,0 },

  {0,}

  };

  ,那么就说明这个驱动程序就是用来驱动这个设备的,这里需要注意一下pci_device_id是内核定义的用来辨别不同PCI设备的一个结构,例如在我们这里0x10ec代表的是Realtek公司,我们扫描PCI设备配置空间如果发现有Realtek公司制造的设备时,两者就对上了,就是调用probe函数了。当然对上了公司号后还得看其他的设备号什么的,都对上了才说明这个驱动是可以为这个设备服务的。

  ③是把这个rtl8139_pci_driver结构挂在这个设备的数据结构(pci_dev)上,表示这个设备从此就有了自己的驱动了。而驱动也找到了它服务的对象了。

8. pci桥一般不存在私有寄存器,操作系统也不需要为PCE桥提供驱动,这类桥称为透明桥

PCI学习笔记

http://blog.chinaunix.net/uid-24148050-id-101021.html

Linux下的PCI总线驱动

http://blog.csdn.net/weiqing1981127/article/details/8031541

Linux PCI网卡驱动的详细分析

http://soft.chinabyte.com/os/13/12304513.shtml

Linux kernel中网络设备的管理

http://www.linuxidc.com/Linux/2013-08/88472.htm

PCI驱动初始化流程--基于POWERPC85xx架构的Linux内核PCI初始化

http://blog.csdn.net/luwei860123/article/details/38816473

PowerPC的PCI总线的dts配置【转】

http://blog.163.com/liuqiang_mail@126/blog/static/10996887520126192504668/

linux pci/pcie驱动相关推荐

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

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

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

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

  3. Linux PCI网卡驱动分析

    http://www.uplinux.com/shizi/wenxian/4429.html Linux网卡驱动分析 学习应该是一个先把问题简单化,在把问题复杂化的过程.一开始就着手处理复杂的问题,难 ...

  4. linux Pci字符驱动基本加载流程

    今天有朋友问我linux系统Pci字符驱动加载流程,简单整理了一下,顺便做个记录. 首先说下需要包含的头文件: 一个完整的字符驱动一般包含下面这些头文件: #include <linux/typ ...

  5. Linux PCI网卡驱动的详细分析

    前言 学习应该是一个先把问题简单化,在把问题复杂化的过程.一开始就着手处理复杂的问题,难免让人有心惊胆颤,捉襟见肘的感觉.读Linux网卡驱动也是一样.那长长的源码夹杂着那些我们陌生的变量和符号,望而 ...

  6. linux PCI设备驱动

    1.PCI 简介 1.1 PCI 引脚 为处理数据.寻址.接口控制.仲裁以及系统功能,PC接口作为目标设备的设备至少有47条引脚.作为总线主设备的设备至少有49条引脚.必要的引脚在左边,任选的引脚在右 ...

  7. linux pci网卡驱动

    Linux网卡驱动分析 Linux网卡驱动分析 学习应该是一个先把问题简单化,在把问题复杂化的过程.一开始就着手处理复杂的问题,难免让人有心惊胆颤,捉襟见肘的感觉.读Linux网卡驱动也是一样.那长长 ...

  8. Linux PCI 设备驱动基本框架(一)

    Linux将所有外部设备看成是一类特殊文件,称之为"设备文件",如果说系统调用是Linux内核和应用程序之间的接口,那么设备驱动程序则可以看成是 Linux内核与外部设备之间的接口 ...

  9. linux pci 网卡驱动,linux网络设备驱动_pci网卡

    <linux网络设备驱动_pci网卡>由会员分享,可在线阅读,更多相关<linux网络设备驱动_pci网卡(12页珍藏版)>请在技术文库上搜索. 1. LinuxLinux 网 ...

最新文章

  1. python--安装PIL
  2. java基础-集合:list
  3. 9 个实用 shell 脚本,建议收藏!
  4. 360面试题计算机面试题,奇虎360软件测试面试经验
  5. python汽车行驶工况_什么叫车辆行驶工况
  6. redmine-project.net vs redmine vs trac vs apis项目管理软件选型比较
  7. 夫妻俩70岁积蓄70万元,俩人退休金8000元,还需要理财吗?
  8. kettle转换JavaScript获取命令行参数
  9. 【Latex】数学公式排版
  10. poj 3278 Catch That Cow (bfs 搜索)
  11. 水杉3D建模Metasequoia for Mac 4.8.3
  12. 自动驾驶 10-4: 为什么是传感器融合 Why Sensor Fusion
  13. RDP报表工具v2.3报表使用
  14. 【Django】Specifying a namespace in include() without providing an app_name is not supported
  15. 阴历转换阳历c语言csdn,JavaScript实现公历转换农历
  16. qt 嵌入web页面_Qt与Web混合开发(一)--简单使用
  17. 什么是GPU计算?阿里云国际版有没有GPU计算?-Unirech
  18. EXCEL的功能整理(一)
  19. EMERSON艾默生AMS巡检仪维修TREX通讯器维修注意事项
  20. VMware vSphere 8.0U1

热门文章

  1. Android技术知识点:什么是外边距(margin)
  2. GMap2 与 google.maps.Map 的区别
  3. Qt入门-QLabel类
  4. IDEA 设置代码提示或自动补全的快捷键
  5. 如何快速、科学的配置GO语言编译Android环境
  6. vue 项目中的打包配置
  7. GTX1650 搭建TensorFlow-GPU 2.4框架(CUDA11.0 + cudnn 8.04 + anaconda 3.8)
  8. 一个实用的实时毛发渲染及着色方法
  9. 三维向量求夹角(0-360)
  10. MOV指令是数据传送指令