arm驱动有:1、PCI总线驱动;2、RC驱动;3、PCI HOST Bridge控制器驱动;4、xilinx xdma ip驱动。pci总线驱动是指,符合UEFI 驱动模型的UEFI 驱动,符合UEFI驱动模型的UEFI驱动需要实现EFI_DRIVER_BINDING_PROTOCOL,
1、PCI总线驱动
pci总线驱动是符合UEFI 驱动模型的UEFI 驱动,符合UEFI驱动模型的UEFI驱动需要实现EFI_DRIVER_BINDING_PROTOCOL,这个protocol由 Supported(), Start(), S较好()三个函数和 Version, ImageHandle, DriverBindingHandle三个数据构成。
pci bus driver是只会在root bridge的handle上运行的符合UEFI驱动模型的总线驱动。
EFI_DRIVER_BINDING_PROTOCOL:
这个protocol是在主桥(host bridge)初始化的时候安装的,主桥会找出系统内所有的root bridges,并为每个root bridge安装EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL ,值得一提的是edk2中提到大多数系统下都只有1个主桥,但是UEFI spec中也有多个主桥的示例。为了便于理解,搞清楚系统内只有1个主桥的情况即可。
Supported():
PciBusDriverBindingSupported()判断某个控制器是否支持Pci 总线驱动是通过打开控制器的EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL 和EFI_DEVICE_PATH_PROTOCOL,如果都打开成功,说明控制器安装了EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL 和EFI_DEVICE_PATH_PROTOCOL,那么PciBusDriverBindingSupported()返回Success,该控制器支持pci总线驱动。
Start():
PciBusDriverBindingStart()只有在Supported()返回Success后才会被执行,而且并不是在前面提到的PciBusEntryPoint中执行的,PciBusEntryPoint只是安装EFI_DRIVER_BINDING_PROTOCOL,那么Start()是在哪里执行的呢?按照UEFI的设计,当boot service的ConnectController()被调用的时候才会执行DriverBinding中的supported,start。对于pci总线驱动来说,系统调用ConnectController的时候需要将所有安装了EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL 的控制器连接pci总线驱动,此时PciBusDriverBindingStart()开始。start()需要做的事情主要是需要利用主桥初始化过程中提供的EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL接口开始枚举pci 总线系统。
2、RC驱动
RC是PCIe体系结构的一个重要组成部件,也是一个较为混乱的概念。RC的提出与x86处理器系统密切相关,PCIe总线规范中涉及的RC也以x86处理器为例进行说明,而且一些在PCIe总线规范中出现的最新功能也在Intel的x86处理器系统中率先实现。事实上,只有x86处理器才存在PCIe总线规范定义的“标准RC”,而在多数处理器系统,并不含有在PCIe总线规范中涉及的,与RC相关的全部概念。
在x86处理器系统中,RC内部集成了一些PCI设备、RCRB(RC Register Block)和Event Collector等组成部件。其中RCRB由一系列的寄存器组成的大杂烩,而仅存在于x86处理器中;而Event Collector用来处理来自PCIe设备的错误消息报文和PME消息报文。RCRB的访问基地址一般在LPC设备寄存器上设置。
如果将RC中的RCRB、内置的PCI设备和Event Collector去除,该RC的主要功能与PCI总线中的Host Bridge类似,其主要作用是完成存储器域到PCI总线域的地址转换。但是随着虚拟化技术的引入,尤其是引入MR-IOV技术之后,RC的实现变得异常复杂。
RC需要完成以下工作内容。
初始化阶段:
- 能向CPU申请资源,如PCI总线号、pci内存空间、pci I/O空间。
- 能扫描到下游设备,并为设备分配资源。
工作阶段:
- 能转换PCI地址空间与CPU地址空间。
- 能将CPU的AXI访问信号转换成pcie TLP总线事务发送到下游总线(信号类型和地址空间转换)。
- 能将pcie设备发出的MR/MW TLP事务转换成AXI访问信号送给CPU(信号类型和地址空间转换)。
- 能接收PCIe设备中断(INTx、MSI、MSI-X),并反馈给CPU处理(级联中断)。
- 能向CPU报告RC自身的异常状态。
3、PCI HOST Bridge控制器驱动
PCI HOST Bridge控制器驱动根据系统实际IO空间和Memory Map,为PCI设备指定IO空间和Memory空间的范围,并且产生PCI HOST Bridge Resource Allocation协议供PCI总线驱动使用。该驱动还对HostBridge控制器下所有RootBridge设备产生Handle(句柄),句柄安装了PCIRootBridgeProtocol。PCI总线驱动利用EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL枚举系统中所有PCI设备,发现并获取PCI设备的Option ROM,并且调用PCI HOST Bridge Resource Allocation协议分配PCI设备资源。
每一个PCI HOST Bridge Controller下面可以接一个或者多个PCI root Bridge,PCI Root Bridge会产生 PCI local Bus。PCI设备驱动不会使用PCI Root Bridge I/O协议访问PCI设备,而是会使用PCI总线驱动为PCI设备产生的PCI IO Protocol来访问PCI设备的IO/MEMORY空间和配置空间。PCI Root Bridge I/O协议(Protocol)是安装在Root Bridge设备的句柄上,同时在该handle上也会有表明Root Bridge设备的Device Path协议(Protocol)。
4、xilinx xdma ip驱动
Xilinx从15年前,V4系列开始,一直在PCIe的解决方案上深耕,提供众多的应用方案级的解决方案,方便用户专注于自己的应用。早期,Xilinx提供的有Application Notes,例如XAPP859,XAPP1052等,构建了基本的双向数据传输。当时一些第三方公司,类似于PLDA,NwLogic也出针对Xilinx FPGA的PCIe传输方案。
后来,Xilinx团队2017年附近推出XDMA解决方案,并持续增加功能、修正Bug,到目前为止,XDMA已经成为一个功能强大、成熟稳定的Xilinx FPGA解决方案。功能上涵盖了SG功能,AXI-Lite功能,多通道分离,AXI-MM和AXI-Stream支持等。稳定性上,经过4年的逐步完善,目前已经有众多的客户基于这套方案实现产品,涵盖医疗、电力、通讯、数据中心等各种应用。最重要的是,XDMA是免费的。
Xilinx XDMA支持的系列包括7系列,UltraScale系列,UltraScale+系列各种系列,界面配置基本相同。这里以KU040的一个板子做例程,其他系列可以参考。Vivado使用2018.3,Vivado的版本,做XDMA,建议尽量使用新一些的版本。详细的说明,参考Xilinx的文档PG195。
延伸阅读
PCI标准的特点
PCI设备具有独立的地址空间——PCI总线地址空间。PCI总线地址空间与存储器地址空间通过Host Bridge 隔离,CPU访问PCI设备时,必须通过Host Bridge进行地址转换;PCI设备访问主存储器时,同样需要Host Bridge进行地址转换。Host Bridge使得PCI设备和处理器可以方便地共享主存储器资源。在Host Bridge 中有许多缓存,使得CPU总线与PCI总线可以工作在各自的时钟频率上。
文章标题:arm驱动 有哪些,发布者:Z, ZLW,转载请注明出处:https://worktile.com/kb/p/35012