天天看點

UEFI應用與程式設計--EFI_USB2_HC_PROTOCOL

/*
 * Usb.c
 *
 *  Created on: 2017年10月11日
 *      Author: 
 */




#include <Uefi.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Protocol/Usb2HostController.h>
#include <Library/UefiLib.h>
#include <Library/ShellLib.h>

void FindUsbDev(EFI_STATUS Status, UINTN BufferSize, UINT16 BufferIndex,
    UINT16 TableSize, UINT16 LangID, UINT8 StringID, EFI_HANDLE* HandleBuffer,
    EFI_USB_IO_PROTOCOL* UsbIo, UINT16* LangIDTable, CHAR16** String) {

  EFI_USB_DEVICE_DESCRIPTOR DeviceDescriptor;

  Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiUsbIoProtocolGuid, NULL,
      &BufferSize, &HandleBuffer);
  if (EFI_ERROR(Status)) {
    Print(L"LocateHandleBuffer fail.\r\n");
  }
  for (BufferIndex = 0; BufferIndex < BufferSize; BufferIndex++) {
    Status = gBS->HandleProtocol(HandleBuffer[BufferIndex],//OpenProtocol?
        &gEfiUsbIoProtocolGuid, (void**) &UsbIo);
    if (EFI_ERROR (Status) || UsbIo == NULL) {
      continue;
    }
    Print(L"Usb Device:%d/%d\r\n", BufferIndex + 1, BufferSize);
    Status = UsbIo->UsbGetSupportedLanguages(UsbIo, &LangIDTable, &TableSize);
    LangID = *LangIDTable;

    Status = UsbIo->UsbGetStringDescriptor(UsbIo, LangID, StringID, String);
    Print(L"  %s\r\n", *String);
    Print(L"    DeviceDescriptor:\r\n");
    Status = UsbIo->UsbGetDeviceDescriptor(UsbIo, &DeviceDescriptor);
    Print(L"    Length:               %x\r\n", DeviceDescriptor.Length);
    Print(L"    DescriptorType:       %x\r\n", DeviceDescriptor.DescriptorType);
    Print(L"    BcdUSB:               %x\r\n", DeviceDescriptor.BcdUSB);
    Print(L"    DeviceClass:          %x\r\n", DeviceDescriptor.DeviceClass);
    Print(L"    DeviceSubClass:       %x\r\n", DeviceDescriptor.DeviceSubClass);
    Print(L"    DeviceProtocol:       %x\r\n", DeviceDescriptor.DeviceProtocol);
    Print(L"    MaxPacketSize:        %x\r\n", DeviceDescriptor.MaxPacketSize0);
    Print(L"    IdVendor:             %x\r\n", DeviceDescriptor.IdVendor);
    Print(L"    IdProduct:            %x\r\n", DeviceDescriptor.IdProduct);
    Print(L"    BcdDevice:            %x\r\n", DeviceDescriptor.BcdDevice);
    Print(L"    StrManufacturer:      %x\r\n", DeviceDescriptor.StrManufacturer);
    Print(L"    StrProduct:           %x\r\n", DeviceDescriptor.StrProduct);
    Print(L"    StrSerialNumber:      %x\r\n", DeviceDescriptor.StrSerialNumber);
    Print(L"    NumConfigurations:    %x\r\n", DeviceDescriptor.NumConfigurations);
    Print(L"-----------------------------------------------\r\n");
    ShellPromptForResponse (ShellPromptResponseTypeAnyKeyContinue, NULL, (VOID**)NULL);
    //    UsbIo->UsbGetConfigDescriptor();
    //    UsbIo->UsbGetInterfaceDescriptor();
  }
  if (HandleBuffer != NULL)
    Status = gBS->FreePool(HandleBuffer);
}

void GetSetUsbControllerStates(EFI_STATUS Status,EFI_USB_HC_STATE State,
    EFI_USB2_HC_PROTOCOL* Usb2Hc) {
  Status = Usb2Hc->GetState(Usb2Hc, &State);
  Print(L"State:%x\r\n", State);
//  State = EfiUsbHcStateHalt;
//  Print(L"%r\r\n", Usb2Hc->SetState(Usb2Hc, State));
//  Print(L"%r\r\n", Usb2Hc->GetState(Usb2Hc, &State));
//  Print(L"%x\r\n", State);
}

VOID
ShowUsbDev (
  )
{
  EFI_USB2_HC_PROTOCOL      *Usb2Hc;
  EFI_USB_HC_STATE          State;
  EFI_USB_PORT_STATUS       PortStatus;
  UINT16                    Index;
  EFI_STATUS                Status;

  UINT16                    BufferIndex;
  EFI_HANDLE                *HandleBuffer;
  UINTN                     BufferSize;

//  EFI_USB_DEVICE_DESCRIPTOR *DeviceDescriptor;
  EFI_USB_IO_PROTOCOL       *UsbIo;

  IN UINT16 LangID;
  IN UINT8 StringID;
  OUT CHAR16 **String;

  OUT UINT16 *LangIDTable;
  OUT UINT16 TableSize;
  Status        = EFI_SUCCESS;
  State         = EfiUsbHcStateMaximum;
  Usb2Hc        = NULL;
  UsbIo         = NULL;
  LangID        = 0;
  StringID      = 2;// 1 2 3
  String        = NULL;
  BufferIndex   = 0;
  HandleBuffer  = NULL;
  BufferSize    = 0;
  LangIDTable   = NULL;
  TableSize     = 0;

  Print(L"-----------------------------------------------\r\n");
  Status = gBS->LocateProtocol(&gEfiUsb2HcProtocolGuid, NULL, &Usb2Hc);

  FindUsbDev(Status, BufferSize, BufferIndex, TableSize, LangID, StringID,
      HandleBuffer, UsbIo, LangIDTable, String);
  Status = gBS->LocateHandleBuffer (
           ByProtocol,
           &gEfiUsb2HcProtocolGuid,
           NULL,
           &BufferSize,
           &HandleBuffer
          );
  if (EFI_ERROR (Status)) {
    Print (L"LocateHandleBuffer fail.\r\n");
  }
  for (BufferIndex = 0; BufferIndex < BufferSize; BufferIndex++) {
    Status = gBS->HandleProtocol (
                   HandleBuffer[BufferIndex],
                   &gEfiUsb2HcProtocolGuid,
                   (VOID **) &Usb2Hc
                  );
    if (EFI_ERROR (Status) || Usb2Hc == NULL) {
      continue;
    }
    Print(L"Usb Controller:%d/%d  ", BufferIndex + 1, BufferSize);
    GetSetUsbControllerStates(Status, State, Usb2Hc);
    for(Index = 0; Index < 255; Index++) {
      Status = Usb2Hc->GetRootHubPortStatus(Usb2Hc, (UINT8)Index , &PortStatus);
      if(Status == EFI_INVALID_PARAMETER)
        break;
      Print(L"  Usb Port%d:\r\n", Index + 1);
      Print(L"    PortStatus:%x\r\n", PortStatus.PortStatus);
    }
  }
  if (HandleBuffer != NULL)
    Status = gBS->FreePool(HandleBuffer);
}