PCIe driver
参考: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相关推荐
- PCIe学习笔记之pcie初始化枚举和资源分配流程代码分析
本文主要是对PCIe的初始化枚举.资源分配流程进行分析.代码对应的是linux 4.19, 平台是arm64. 文章首发于这里 1. PCIe architecture 1.1 pcie的拓扑结构 在 ...
- PCIe初始化枚举和资源分配流程分析
本文主要是对PCIe的初始化枚举.资源分配流程进行分析,代码对应的是alikernel-4.19,平台是arm64 1. PCIe architecture 1.1 pcie的拓扑结构 在分析PCIe ...
- Git和Github代码管理实践
对于代码的管理我们一般使用GitHub+Git或SVN+Redmine,下面主要接介绍一下GitHub和Git的常用操作: 1.GitHub 创建开源项目 先登录其官网注册一个免费使用的账号,依次 ...
- [RK3568][Android11.0]Vold-DiskInfo:区分u盘和硬盘
测试平台 Platform: RK3568 OS: Android 11.0 需求描述 目前系统内部设备没有对硬盘(sata/usb移动硬盘)和u盘做区分,统一显示的为usb存储设备.目前有需求要在显 ...
- 【转载】Ubuntu完全教程,让你成为Ubuntu高手!
Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音.了解发音是有意义的,您不是第一个为此困惑的人,当然,也不会是最后一个:) 大多数的美国人读 ubun ...
- Ubuntu完全教程,让你成为Ubuntu高手!
Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音.了解发音是有意义的,您不是第一个为此困惑的人,当然,也不会是最后一个:)大多数的美国人读 ubunt ...
- Ubuntu教程,让你成为Ubuntu高手!
Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音.了解发音是有意义的,您不是第一个为此困惑的人,当然,也不会是最后一个:) 大多数的美国人读 ubun ...
- Ubuntu完全使用文档_我是亲民_新浪博客
Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音.了解发音是有意义的,您不是第一个为此困惑的人,当然,也不会是最后一个:) 大多数的美国人读 ubun ...
- Ubuntu完全使用文档
Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音.了解发音是有意义的,您不是第一个为此困惑的人,当然,也不会是最后一个:) 大多数的美国人读 ubun ...
最新文章
- Python中文件路径如果需要回退到上一级怎么办?
- Leaflet中加载离线OSM瓦片地图(使用OfflineMapMaker切割下载离线png地图文件)
- PostgreSQL csvlog 源码分析
- ios 不被遮挡 阴影_为何你没见到日环食?你不知道的天象常识原来还有这么多 | 返朴...
- 【英语学习】【English L06】U02 Food L1 Food on the menu
- 底部按钮吸附_知乎的药丸按钮(二)我的 iOS 实现
- 基于核极限学习机(KELM)回归预测 -附代码
- 深度学习(一)TensorFlow入门教程集合
- PyCharm专业版破解
- 【游戏开发题库】使用Unity制作Unity题库,支持题目录入和刷题(面试 | 笔试 | 自制题库 | 从基础到高级)
- CSS外边距重叠和高度坍塌完美解决
- bluescreen view-windows 蓝屏分析原因
- 家用计算机初步,职称计算机Internet基础知识:配置家庭局域网
- mysql源码分析——THD数据结构
- 大学四年·写于离校前
- UE4-简单的FPS项目制作(B站视频笔记)P1P2
- 乌镇互联网大会 阿里云飞天当选世界互联网代表性领先科技成果
- strcmp函数的说明和使用
- ReactDOM.render 是如何串联渲染链路的?(中)
- 在openEuler系统上安装mugen工具的使用指南
热门文章
- java sql timestamp_Java SQL Timestamp before()用法及代码示例
- 如何让你的内网服务器可以被外网访问到(端口映射、NAT、域名解析、IP地址)
- Linux 知:coredump
- 什么是CV2以及如何安装?
- 第三周 目标检测(Object detection)
- 新职业人才缺口近千万,90后最担心失业;字节跳动回应TikTok被收购传闻;Twitter公布账号劫持事故细节 | EA周报...
- 苹果电池ti测试软件,iPhone真实电池寿命快速检测,比苹果官方测的还准!
- python pip 安装使用国内镜像源
- Java极速入门系列:第一章Java概述、Java环境、IDEA开发工具
- 鸿蒙系统生态建设怎样了,鸿蒙系统正式发布-华为OS生态建设开始布局