1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Linux PCI驱动框架分析过程

Linux PCI驱动框架分析过程

时间:2021-12-05 16:29:11

相关推荐

Linux PCI驱动框架分析过程

描述:

内核版本:4.14

ARM64处理器

使用工具:源洞察3.5,Visio

1.概述

首先,回顾一下PCIe的建筑图:

本文就来说说PCIe主机的驱动,对应的是根联合体部分,相当于PCI的主桥部分;

本文选取Xilinx的nwl-pcie进行分析。

驱动整体编写简单,足以覆盖现有框架,不会占用太多笔墨;

2.过程分析

说到驾驶的分析,离不开驾驶模型的引入,而驾驶模型的实现使得具体的驾驶开发更加容易;

所以我们来回顾一下上一篇文章中提到的驱动模型:Linux内核建立了统一的设备模型,由总线、设备和驱动抽象而成,其中设备和驱动都挂在总线上。当有新的设备注册或新的驱动注册时,总线会执行匹配操作(match功能),当发现驱动和设备可以匹配时,会执行探测功能的操作;

《Linux PCI驱动程序框架分析(二)》提到了PCI设备、PCI总线、PCI驱动程序的创建。PCI设备和PCI驱动都挂接在PCI总线上,直观。PCIe控制器也遵循设备、总线、驱动的匹配模型,但是这里的总线被虚拟总线平台总线代替,对应的设备和驱动是platform_device和platform _ driver分别。

那么问题来了,platform_device是什么时候创建的?然后你要提到设备树设备树。

2.1设备树

设备树用于描述硬件信息,包括节点的各种属性,在dts文件中定义,最终会编译成dtb文件加载到内存中;

在启动过程中,内核将把dtb文件解析成device_node描述的DeviceTree。

根据设备节点节点,创建平台设备结构,并最终在系统中注册,这就是PCIe主机设备的创建过程。

让我们看看PCIe主机的设备树内容:

pcie: pcie@fd0e0000 {

compatible = “xlnx,nwl-pcie-2.11”;

status = “disabled”;

#address-cells = <3>;

#size-cells = <2>;

#interrupt-cells = <1>;

msi-controller;

device_type = “pci”;

interrupt-parent = <&gic>;interrupts = <0 118 4>,<0 117 4>,<0 116 4>,<0 115 4>,/* MSI_1 [63...32] */<0 114 4>;/* MSI_0 [31...0] */interrupt-names = "misc", "dummy", "intx", "msi1", "msi0";msi-parent = <&pcie>;reg = <0x0 0xfd0e0000 0x0 0x1000>,<0x0 0xfd480000 0x0 0x1000>,<0x80 0x00000000 0x0 0x1000000>;reg-names = "breg", "pcireg", "cfg";ranges = <0x02000000 0x00000000 0xe0000000 0x00000000 0xe0000000 0x00000000 0x10000000/* non-prefetchable memory */0x43000000 0x00000006 0x00000000 0x00000006 0x00000000 0x00000002 0x00000000>;/* prefetchable memory */bus-range = <0x00 0xff>;interrupt-map-mask = <0x0 0x0 0x0 0x7>;interrupt-map =<0x0 0x0 0x0 0x1 &pcie_intc 0x1>,<0x0 0x0 0x0 0x2 &pcie_intc 0x2>,<0x0 0x0 0x0 0x3 &pcie_intc 0x3>,<0x0 0x0 0x0 0x4 &pcie_intc 0x4>;pcie_intc: legacy-interrupt-controller {interrupt-controller;#address-cells = <0>;#interrupt-cells = <1>;};

};

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。