参考:Linux PCI驱动框架分析(三)

参考:xHCI驱动学习(1) 核心数据结构

本文以QCOM平台为例分析

PCIe RC driver

PCIe RC probe

1. RC driver和device tree通过名字匹配成功后调用msm_pcie_probe函数

2. msm_pcie_probe工作主要包含:

• 解析dts,获取时钟,电压,中断,memory资源以及配置信息

• 根据boot_option选项决定是否枚举设备,即调用msm_pcie_enumerate()函数(Qcom提供了三种可供选择的设备枚举时机)

RC触发设备枚举(msm_pcie_enumerate

1. 使能电压,时钟,配置PCIe到RC mode,pcie-phy初始化,link-trainning等.

2. 分配struct pci_host_bridge 内存,并初始化

3. 获取PCI总线范围”bus-range”和地址空间范围”ranges”

4. 向内核申请host_bridge_resource资源

5. MSI初始化

6. 初始化pci_ops,用来读写配置空间

7. map irq

8. 递归遍历pci bus及其pci 子bus上的所有设备

9. 分配bus resource,即初始化BAR空间

10. 递归probe pci_bus及其子总线上的所有devices

 递归遍历设备(深度优先算法)

pci_scan_root_bus_bridge 参考:PCIe 基础知识 中的PCIe设备枚举的软件实现

PCIe设备probe流程

1. 首先遍历当前pci bus上的所有devices,如果vendor ID和device ID匹配成功则调用当前bus_type中的probe成员,bus_type在pci_setup_device函数中初始化,即最终调用到pci_device_probe

2. 再遍历当前pci bus子总线上的所有devices,直到所有子总线上的devices被probe

3. pci_device_probe函数最终调用function的probe函数,进行function的初始化;即function调用pci_register_driver(struct pci_driver)函数注册pci驱动时,传入的结构体struct pci_driver参数的probe成员函数

PCIe endpoint driver

以USB endpoint为例:

路径:drivers/usb/dwc3/dwc3-pci.c

1. 初始化pci_device_id结构体

2. 初始化pci_driver结构体

3. 注册driver到PCIe Framework

PCIe与USB的交互

1. 向PCI Framework注册pci driver

2. 在PCIe枚举(pci_scan_root_bus_bridge)过程中,通过BDF读设备的vendor ID和device ID,有效则添加到PCIe设备树(bus链表,设备链表)中,然后pci_bus_add_devices依次遍历PCIe设备树上的device,并触发device和driver的匹配,匹配方式就是判断设备vendor ID&device ID和struct pci_device_id中初始化的vendor ID&device ID是否相等,相等则触发struct pci_driver中初始化的probe函数,对于该示例来说就是dwc3_pci_porbe()函数

3. 通过RC提供的配置空间读写接口操作配置空间的寄存器

4. 获取BAR寄存器的值和irq信息

5. 保存BAR的内容和中断信息到平台设备

6. 添加平台设备到系统,该过程会触发device和driver的匹配(根据名字匹配),匹配成功则调用该driver的probe函数(dwc3_probe)

7. dwc3_probe创建并添加平台设备“xhci-hcd”,并触发device和driver的匹配(根据名字匹配),匹配成功则调用该driver的probe函数(xhci_plat_probe),进入usb初始化流程

8. 获取步骤5中BAR的内容

9. 映射BAR指向的地址到虚拟地址空间,CPU对EP memory的访问即对该虚拟地址的读写

10. 获取步骤5中保存的中断信息

11. 注册中断

PCIe 与 USB 核心数据结构

struct pci_dev

成员dev的driver_data成员指向dwc3_pci数据

struct dwc3_pci

成员dev的driver_data成员指向dwc3数据

struct dwc3

成员xhci即为platform_device数据

struct xhci_hcd

成员main_hcd指向usb2.0控制器

成员shared_hcd指向usb3.x控制器

struct usb_hcd

usb控制器核心结构体

成员self的controller成员指向platform_device的device成员

struct hc_driver

操作函数集

PCIe driver相关推荐

  1. PCIe学习笔记之pcie初始化枚举和资源分配流程代码分析

    本文主要是对PCIe的初始化枚举.资源分配流程进行分析.代码对应的是linux 4.19, 平台是arm64. 文章首发于这里 1. PCIe architecture 1.1 pcie的拓扑结构 在 ...

  2. PCIe初始化枚举和资源分配流程分析

    本文主要是对PCIe的初始化枚举.资源分配流程进行分析,代码对应的是alikernel-4.19,平台是arm64 1. PCIe architecture 1.1 pcie的拓扑结构 在分析PCIe ...

  3. Git和Github代码管理实践

    对于代码的管理我们一般使用GitHub+Git或SVN+Redmine,下面主要接介绍一下GitHub和Git的常用操作: 1.GitHub 创建开源项目   先登录其官网注册一个免费使用的账号,依次 ...

  4. [RK3568][Android11.0]Vold-DiskInfo:区分u盘和硬盘

    测试平台 Platform: RK3568 OS: Android 11.0 需求描述 目前系统内部设备没有对硬盘(sata/usb移动硬盘)和u盘做区分,统一显示的为usb存储设备.目前有需求要在显 ...

  5. 【转载】Ubuntu完全教程,让你成为Ubuntu高手!

    Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音.了解发音是有意义的,您不是第一个为此困惑的人,当然,也不会是最后一个:) 大多数的美国人读 ubun ...

  6. Ubuntu完全教程,让你成为Ubuntu高手!

    Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音.了解发音是有意义的,您不是第一个为此困惑的人,当然,也不会是最后一个:)大多数的美国人读 ubunt ...

  7. Ubuntu教程,让你成为Ubuntu高手!

    Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音.了解发音是有意义的,您不是第一个为此困惑的人,当然,也不会是最后一个:) 大多数的美国人读 ubun ...

  8. Ubuntu完全使用文档_我是亲民_新浪博客

    Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音.了解发音是有意义的,您不是第一个为此困惑的人,当然,也不会是最后一个:) 大多数的美国人读 ubun ...

  9. Ubuntu完全使用文档

    Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音.了解发音是有意义的,您不是第一个为此困惑的人,当然,也不会是最后一个:) 大多数的美国人读 ubun ...

最新文章

  1. Python中文件路径如果需要回退到上一级怎么办?
  2. Leaflet中加载离线OSM瓦片地图(使用OfflineMapMaker切割下载离线png地图文件)
  3. PostgreSQL csvlog 源码分析
  4. ios 不被遮挡 阴影_为何你没见到日环食?你不知道的天象常识原来还有这么多 | 返朴...
  5. 【英语学习】【English L06】U02 Food L1 Food on the menu
  6. 底部按钮吸附_知乎的药丸按钮(二)我的 iOS 实现
  7. 基于核极限学习机(KELM)回归预测 -附代码
  8. 深度学习(一)TensorFlow入门教程集合
  9. PyCharm专业版破解
  10. 【游戏开发题库】使用Unity制作Unity题库,支持题目录入和刷题(面试 | 笔试 | 自制题库 | 从基础到高级)
  11. CSS外边距重叠和高度坍塌完美解决
  12. bluescreen view-windows 蓝屏分析原因
  13. 家用计算机初步,职称计算机Internet基础知识:配置家庭局域网
  14. mysql源码分析——THD数据结构
  15. 大学四年·写于离校前
  16. UE4-简单的FPS项目制作(B站视频笔记)P1P2
  17. 乌镇互联网大会 阿里云飞天当选世界互联网代表性领先科技成果
  18. strcmp函数的说明和使用
  19. ReactDOM.render 是如何串联渲染链路的?(中)
  20. 在openEuler系统上安装mugen工具的使用指南

热门文章

  1. java sql timestamp_Java SQL Timestamp before()用法及代码示例
  2. 如何让你的内网服务器可以被外网访问到(端口映射、NAT、域名解析、IP地址)
  3. Linux 知:coredump
  4. 什么是CV2以及如何安装?
  5. 第三周 目标检测(Object detection)
  6. 新职业人才缺口近千万,90后最担心失业;字节跳动回应TikTok被收购传闻;Twitter公布账号劫持事故细节 | EA周报...
  7. 苹果电池ti测试软件,iPhone真实电池寿命快速检测,比苹果官方测的还准!
  8. python pip 安装使用国内镜像源
  9. Java极速入门系列:第一章Java概述、Java环境、IDEA开发工具
  10. 鸿蒙系统生态建设怎样了,鸿蒙系统正式发布-华为OS生态建设开始布局