Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Config 从PCI配置空间(EFI)读取USB设备供应商ID和设备ID_Config_Space_Pci_Uefi - Fatal编程技术网

Config 从PCI配置空间(EFI)读取USB设备供应商ID和设备ID

Config 从PCI配置空间(EFI)读取USB设备供应商ID和设备ID,config,space,pci,uefi,Config,Space,Pci,Uefi,我想通过EFI程序获取插入式USB设备的供应商ID和设备ID。我可以读取整个PCI配置空间,我可以找到USB设备所在的USB主机控制器,我也可以读取该控制器的全部内存地址,但我不知道我在该内存中搜索什么来获取这些ID。有人能帮我吗?PCI配置空间显示的是PCI和PCI Express设备,而不是USB设备 PCI配置空间将显示USB控制器的供应商和设备ID,但不会显示连接的设备。您必须通过读取/写入USB寄存器来枚举USB总线 请注意,接管USB控制器将破坏当前正在运行的USB堆栈,并杀死您的U

我想通过EFI程序获取插入式USB设备的供应商ID和设备ID。我可以读取整个PCI配置空间,我可以找到USB设备所在的USB主机控制器,我也可以读取该控制器的全部内存地址,但我不知道我在该内存中搜索什么来获取这些ID。有人能帮我吗?

PCI配置空间显示的是PCI和PCI Express设备,而不是USB设备

PCI配置空间将显示USB控制器的供应商和设备ID,但不会显示连接的设备。您必须通过读取/写入USB寄存器来枚举USB总线

请注意,接管USB控制器将破坏当前正在运行的USB堆栈,并杀死您的USB键盘和引导设备

如果您使用的是UEFI shell,那么您可能可以在devtree的输出中找到所需的内容


如果您正在编写自己的UEFI DXE代码,它将必须查询USB驱动程序。

USB协议定义了一个设置数据包,xHCI驱动程序必须在xHCI中构造该数据包,并且xHCI硬件将转换为USB–对于此信息,它没有直接访问的寄存器,如PCIe。首先,我将在windows上展示整个USB设备枚举过程,这与使用xHCI或eHCI不同

控制器接口 硬件重置后,所有根集线器端口都将处于断开连接状态。端口将通电并等待设备连接。当硬件检测到设备连接时,它会将PORTSC寄存器中的当前连接状态和连接状态更改标志设置为1,此操作将导致PSCEG信号在作为PORTSC寄存器位的逻辑OR的同时变高。此信号在控制器中生成端口状态更改事件,这导致xHCI控制器硬件在事件环上放置数据包(称为传输请求块)。事件环段和表从非分页池分配,并在xHCI控制器枚举期间初始化,可能在xHCI驱动程序的
StartDevice
例程期间初始化,加载时调用该例程;它还初始化设备MMIO空间中的事件环寄存器

在环上排队事件会导致硬件触发MSI-X表中特定偏移量处的中断(来自条的MSI-X偏移量和条号存储在xHCI控制器PCIe配置空间的MSI-X功能中;因此,MSI-X表位于MMIO空间中)。主事件环始终接收所有端口状态更改事件。主事件环始终映射到第一个MSI-X中断。MSI-X中断将作为标准PCIe MSI传输到LAPIC,并在IRR中为MSI-X表存储数据中指定的向量排队中断。xHCI驱动程序先前使用内核和HALAPI创建了对应于向量的条目。xHCI驱动程序的ISR意识到TRB数据包是一个端口状态更改事件;它可以评估端口ID,以确定作为更改事件(例如5)来源的根集线器端口,然后检查第5个PORTSC寄存器,以查看发生了什么更改,它在与操作基准的某个偏移处访问该更改,这是xHCI控制器PCIe配置空间条中地址的偏移量,该空间是在启动时PCIe枚举期间分配的(MMIO基);公式为
Operational base+(400h+(10h*(n-1))
,其中n是通过MaxPorts的端口号1,Operational base是CAPLENGTH寄存器+MMIO base中的值

xHCI驱动程序通知根集线器驱动程序一个设备已经到达(我想通过调用a,它可能通过根集线器的PDO访问),根集线器驱动程序为它创建一个PDO,并通知PnP管理器根集线器的子设备集已经更改。xHCI驱动程序会自动分配插槽ID,并在调用回调函数之前静默地执行地址设备TRB过程,并当场提供插槽ID,或者,集线器驱动程序必须通过向xHCI控制器发送URB来启动此操作,以请求分配插槽ID,并在通知某个端口ID上存在端口状态更改时将其返回(我不确定。我不确定哪些数据结构由集线器驱动程序而不是xHCI驱动程序控制,因此这只是猜测)。当xHCI驱动程序收到URB时,它将在命令环上发送一个启用插槽TRB,并从事件环上的命令完成TRB获取插槽ID;它将在设备上下文基数组中分配一个设备上下文结构(称为输出设备上下文)和指向它的指针,xHCI控制器在非分页池中维护该数组。在URB响应中,集线器驱动器接收插槽ID;然后,集线器驱动程序在内存中分配输入设备上下文。输入设备上下文中输入控制上下文结构中插槽上下文和端点0上下文的添加上下文标志设置为1,以指示需要添加它们。然后使用端口号、根字符串和端点数分配输入设备上下文结构中的插槽上下文。输入上下文中的端点0(aka.default control)上下文数据结构必须配置为TR Dequeue指针(指向它分配的传输环)、EP type、Error Count和Max Packet Size字段的有效值。最大流、最大突发大小和EP状态值应设置为0。输入上下文结构指针由集线器在地址设备命令中发送,地址设备命令指向新设备的插槽ID,该命令通过URB发送到xHCI驱动程序,并将地址设备TRB放置在命令环上,主机控制器将输入上下文复制到插槽的DCBA条目指向的输出上下文

然后,集线器驱动程序向xHCI驱动程序发送URBs,以获取以下形式的设备描述符:

     Status = SubmitRequestToRootHub(RootHubDeviceObject,
                                 IOCTL_INTERNAL_USB_SUBMIT_URB,
                                 Urb,
                                 NULL);

return FDO->DriverObject->MajorFunction[StackPtr->MajorFunction](FDO, Irp);