summaryrefslogtreecommitdiff
path: root/Core/EM/usb/setup/usbsetup.c
diff options
context:
space:
mode:
Diffstat (limited to 'Core/EM/usb/setup/usbsetup.c')
-rw-r--r--Core/EM/usb/setup/usbsetup.c804
1 files changed, 804 insertions, 0 deletions
diff --git a/Core/EM/usb/setup/usbsetup.c b/Core/EM/usb/setup/usbsetup.c
new file mode 100644
index 0000000..5b7cfe7
--- /dev/null
+++ b/Core/EM/usb/setup/usbsetup.c
@@ -0,0 +1,804 @@
+//**********************************************************************
+//**********************************************************************
+//** **
+//** (C)Copyright 1985-2014, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//**********************************************************************
+//**********************************************************************
+
+//****************************************************************************
+// $Header: /Alaska/SOURCE/Modules/USB/ALASKA/Setup/usbsetup.c 24 12/24/14 10:40p Wilsonlee $
+//
+// $Revision: 24 $
+//
+// $Date: 12/24/14 10:40p $
+//
+//****************************************************************************
+// Revision History
+// ----------------
+// $Log: /Alaska/SOURCE/Modules/USB/ALASKA/Setup/usbsetup.c $
+//
+// 24 12/24/14 10:40p Wilsonlee
+// [TAG] EIP196287
+// [Category] Improvement
+// [Description] Display info of connected usb controllers and remove or
+// grayed-out some item according the connected usb controller number.
+// [Files] uhcd.c, usbport.c, usb.uni, usb.sd, usbsetup.c,
+// AmiUsbController.h, UsbPolicy.h
+//
+// 23 8/20/14 5:26a Wilsonlee
+// [TAG] EIP182011
+// [Category] Improvement
+// [Description] We don't need to update NVRAM variables in
+// InstallUsbMass and UninstallUSBMass functions.
+// [Files] efiusbmass.c, usbsetup.c
+//
+// 22 6/26/14 1:18a Wilsonlee
+// [TAG] EIP173387
+// [Category] Improvement
+// [Description] Remove TODO comments.
+// [Files] usbsetup.c, xhci.c, usbmass.c, usbCCID.c, usb.c, uhci.c,
+// syskbc.c, usbport.c, usbbus.c, uhcd.c, UsbBotPeim.c, PeiXhci.c,
+// PeiEhci.c
+//
+// 21 5/07/14 10:37a Wilsonlee
+// [TAG] EIP166594
+// [Category] Improvement
+// [Description] Add the token "USB_SETUP_VARIABLE_RUNTIME_ACCESS" to
+// control if we set runtime attribute for the setup variables used by USB
+// module.
+// [Files] usb.sdl, usbport.c, usbsetup.c
+//
+// 20 4/29/14 10:23p Wilsonlee
+// [TAG] EIP161709
+// [Category] New Feature
+// [Description] Dynamically update the usb device list in BIOS setup.
+// [Files] usb.sdl, usb.sd, usbsetup.c, uhcd.c
+//
+// 19 2/08/13 3:33a Roberthsu
+// [TAG] EIP112379
+// [Category] Bug Fix
+// [Severity] Normal
+// [Symptom] USB device information is incorrect in Setup.
+// [RootCause] Memory copy size error.
+// [Solution] Change copy point device string size.
+// [Files] usbsetup.c
+//
+// 18 10/25/12 1:37a Wilsonlee
+// [TAG] EIP102493
+// [Category] New Feature
+// [Description] USB Module version is added to the setup page.
+// [Files] usbsetup.c, usb.sd, usb.uni
+//
+// 17 7/15/11 6:32a Ryanchou
+// [TAG] EIP38434
+// [Category] New Feature
+// [Description] Added USB HID report protocol support.
+// [Files] amiusb.c, AmiUsbController.h, amiusbhc.c, efiusbkb.c,
+// efiusbkb.h, efiusbpoint.c, ehci.c, ohci.c, uhcd.c uhcd.cif, uhci.c,
+// usb.c, usbdef.h, usbhid.c, usbkbd.c, usbkbd.h, usbms.c, usbpoint.c,
+// usbrt.cif, usbsb.c, usbsetup.c, usbsrc.sdl, xhci.c
+//
+// 16 7/12/11 8:19a Ryanchou
+// [TAG] EIP56918
+// [Category] New Feature
+// [Description] Added CCID device support.
+// [Files] amiusb.c, amiusb.h, amiusbrtCCID.h, ehci.c, ohci.c, uhci.c,
+// usb.c, UsbCCID.c, usbdef.h, usbrt.cif, usbsetup.c, efiusbccid.c,
+// framework.cif, uhcd.c, uhcd.cif, uhcd.h, usbsrc.sdl, AmiusbCCID.h,
+// AmiUsbController.h, AmiUSBProtocols.cif
+//
+// 15 10/14/10 4:42p Olegi
+// - Tabs replaced with spaces
+// - Changed the existing logic of getting strings correlated to device
+// number: from hardcoded table that was limted to 10 elements only (snum
+// array). If more than 10 devices used, the whole logic caused memory
+// corruption that ended with CPU exception.
+// - Changed the logic of conversion decimal number to CHAR16 string +
+// space as required.
+// - Added limitations for input numbers to be smaller than 127 which is
+// USB max device address; this limitation should never be approached but
+// it protects string operations on numbers.
+//
+// 14 10/12/10 2:34a Rameshr
+// [TAG]- EIP 44585
+// [Category]-IMPROVEMENT
+// [Description]- Number of maximum supported USB Mass Storage device
+// increased from 8 to 16.
+// [Files]- Uin13.bin, UsbPort.c, UsbInt13.h, Usb.c, Usbdef.h, Uasbmass.c,
+// Usb.sd, usb.uni, UsbSetup.c, UsbSrc.sdl, UsbPolicy.h
+//
+// 13 4/12/10 12:19p Olegi
+// Moving structure definitions to the .H file. EIP36942
+//
+// 12 1/29/10 5:15p Olegi
+//
+// 11 11/10/09 8:54a Olegi
+// EIP30149: HII 2.1 compliance.
+//
+// 10 9/09/09 3:18p Davidd
+// Removed the assertion caused by USB support disabled in setup - EIP
+// 25360
+//
+// 9 12/18/08 10:47a Olegi
+// Variable gEfiSetupGuid made static.
+//
+// 8 7/04/08 1:04p Olegi
+//
+// 7 6/27/08 6:00p Olegi
+//
+// 6 5/16/08 12:07p Olegi
+// Compliance with AMI coding standard.
+//
+//****************************************************************************
+
+//<AMI_FHDR_START>
+//----------------------------------------------------------------------------
+//
+// Name: UsbSetup.c
+//
+// Description: USB driver setup related functions implementation.
+//
+//----------------------------------------------------------------------------
+//<AMI_FHDR_END>
+
+#include <AmiLib.h>
+#include <AmiDxeLib.h>
+#include <Setup.h>
+#include <SetupStrTokens.h>
+#include "Protocol/AMiUsbController.h"
+#include <Protocol/UsbPolicy.h>
+
+#define MAX_DEVS_LINE_LENGTH 80
+#define MAX_DEVICE_NUMBER_LENGTH 10
+#define MAX_DEVICE_AMOUNT 127
+
+static EFI_GUID gEfiSetupGuid = SETUP_GUID;
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: GetConnectedDevices
+//
+// Description: This function retrieves the information about connected
+// USB devices.
+//
+// Output: returns TRUE if device connection status has changed since this
+// function is called last time; otherwise FALSE.
+// Notes: When FALSE is returned, none of the output parameters are valid.
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+
+EFI_STATUS
+GetConnectedDevices(
+ CHAR16 *DevNumStr,
+ CHAR16 *ControllerNumStr,
+ EFI_USB_PROTOCOL *UsbProtocol,
+ CONNECTED_USB_DEVICES_NUM *Devs
+)
+{
+ CHAR16 StrMassStorage[] = L"Drive";
+ CHAR16 StrKeyboard[] = L"Keyboard";
+ CHAR16 StrMouse[] = L"Mouse";
+ CHAR16 StrPoint[] = L"Point"; //(EIP38434+)
+ CHAR16 StrMice[] = L"Mice";
+ CHAR16 StrHub[] = L"Hub";
+ CHAR16 StrCcid[] = L"SmartCard Reader";
+ CHAR16 StrUhci[] = L"UHCI";
+ CHAR16 StrOhci[] = L"OHCI";
+ CHAR16 StrEhci[] = L"EHCI";
+ CHAR16 StrXhci[] = L"XHCI";
+ CHAR16 Name[MAX_DEVS_LINE_LENGTH];
+ CHAR16 *StrPtr = Name;
+ CHAR16 NumberToString [MAX_DEVICE_NUMBER_LENGTH];
+ UINTN NumSize;
+ CHAR16 Comma[] = L", ";
+ CHAR16 Space[] = L" ";
+ CHAR16 LeadingSpace[] = L" None";
+ UINT8 MassStorageNumber;
+ UINT8 KeyboardNumber;
+ UINT8 MouseNumber;
+ UINT8 PointNumber;
+ UINT8 HubNumber;
+ UINT8 CcidNumber; //(EIP38434)
+ UINT8 UhciNumber;
+ UINT8 OhciNumber;
+ UINT8 EhciNumber;
+ UINT8 XhciNumber;
+ BOOLEAN Is1stItem = TRUE;
+
+ UsbProtocol->UsbReportDevices(Devs);
+ MassStorageNumber = Devs->NumUsbMass;
+ KeyboardNumber = Devs->NumUsbKbds;
+ MouseNumber = Devs->NumUsbMice;
+ PointNumber = Devs->NumUsbPoint;
+ HubNumber = Devs->NumUsbHubs;
+ CcidNumber = Devs->NumUsbCcids;
+ UhciNumber = Devs->NumUhcis;
+ OhciNumber = Devs->NumOhcis;
+ EhciNumber = Devs->NumEhcis;
+ XhciNumber = Devs->NumXhcis;
+
+ // Form the string
+ pBS->SetMem(StrPtr, MAX_DEVS_LINE_LENGTH * sizeof(CHAR16), 0);
+ pBS->CopyMem(StrPtr, LeadingSpace, 10 * sizeof(CHAR16));
+ StrPtr += 6; // leave string pointer at "None"
+
+ // Drive/Drives
+ if ((MassStorageNumber) && (MassStorageNumber < MAX_DEVICE_AMOUNT)) {
+ ItowEx(MassStorageNumber, NumberToString, 10, FALSE);
+ NumSize = Wcslen(NumberToString);
+
+ pBS->CopyMem(StrPtr, NumberToString, (NumSize * sizeof (CHAR16)));
+ StrPtr += NumSize;
+ // move pointer 1 more space
+ pBS->CopyMem(StrPtr, Space, 2);
+ StrPtr += 1;
+
+ pBS->CopyMem(StrPtr, StrMassStorage, 10);
+ StrPtr += 5; // L"Drive"
+ if (MassStorageNumber > 1) {
+ *StrPtr++ = L's'; // L"Drives"
+ }
+ Is1stItem = FALSE;
+ }
+
+ // Keyboard/Keyboards
+ if ((KeyboardNumber) && (KeyboardNumber < MAX_DEVICE_AMOUNT)) {
+ if (!Is1stItem) {
+ pBS->CopyMem(StrPtr, Comma, 4);
+ StrPtr += 2; // L" ,"
+ }
+ ItowEx(KeyboardNumber, NumberToString, 10, FALSE);
+ NumSize = Wcslen(NumberToString);
+
+ // move pointer 1 more space then string length
+ pBS->CopyMem(StrPtr, NumberToString, (NumSize * sizeof (CHAR16)));
+ StrPtr += NumSize;
+ // move pointer 1 more space
+ pBS->CopyMem(StrPtr, Space, 2);
+ StrPtr += 1;
+
+ pBS->CopyMem(StrPtr, StrKeyboard, 16);
+ StrPtr += 8; // L"Keyboard"
+ if (KeyboardNumber > 1) {
+ *StrPtr++ = L's'; // L"Keyboards"
+ }
+ Is1stItem = FALSE;
+ }
+
+ // Mouse/Mice
+ if ((MouseNumber) && (MouseNumber < MAX_DEVICE_AMOUNT)) {
+ if (!Is1stItem) {
+ pBS->CopyMem(StrPtr, Comma, 4);
+ StrPtr += 2; // L" ,"
+ }
+ ItowEx(MouseNumber, NumberToString, 10, FALSE);
+ NumSize = Wcslen(NumberToString);
+
+ // move pointer 1 more space then string length
+ pBS->CopyMem(StrPtr, NumberToString, (NumSize * sizeof (CHAR16)));
+ StrPtr += NumSize;
+ // move pointer 1 more space
+ pBS->CopyMem(StrPtr, Space, 2);
+ StrPtr += 1;
+
+ if (MouseNumber == 1) {
+ pBS->CopyMem(StrPtr, StrMouse, 10);
+ StrPtr += 5; // L"Mouse"
+ } else {
+ pBS->CopyMem(StrPtr, StrMice, 8);
+ StrPtr += 4; // L"Mice"
+ }
+ Is1stItem = FALSE;
+ }
+ //(EIP38434+)>
+ // Point/Points
+ if ((PointNumber) && (PointNumber < MAX_DEVICE_AMOUNT)) {
+ if (!Is1stItem) {
+ pBS->CopyMem(StrPtr, Comma, 4);
+ StrPtr += 2; // L" ,"
+ }
+ ItowEx(PointNumber, NumberToString, 10, FALSE);
+ NumSize = Wcslen(NumberToString);
+ // move pointer 1 more space then string length
+ pBS->CopyMem(StrPtr, NumberToString, (NumSize * sizeof (CHAR16)));
+ StrPtr += NumSize;
+ // move pointer 1 more space
+ pBS->CopyMem(StrPtr, Space, 2);
+ StrPtr += 1;
+
+ pBS->CopyMem(StrPtr, StrPoint, 10);
+ StrPtr += 5; // L"Point"
+ if (PointNumber > 1) {
+ *StrPtr++ = L's'; // L"Points"
+ }
+ Is1stItem = FALSE;
+ }
+ //<(EIP38434+)
+ // Hub/Hubs
+ if ((HubNumber) && (HubNumber < MAX_DEVICE_AMOUNT)) {
+ if (!Is1stItem) {
+ pBS->CopyMem(StrPtr, Comma, 4);
+ StrPtr += 2; // L" ,"
+ }
+ ItowEx(HubNumber, NumberToString, 10, FALSE);
+ NumSize = Wcslen(NumberToString);
+
+ // move pointer 1 more space then string length
+ pBS->CopyMem(StrPtr, NumberToString, (NumSize * sizeof (CHAR16)));
+ StrPtr += NumSize;
+ // move pointer 1 more space
+ pBS->CopyMem(StrPtr, Space, 2);
+ StrPtr += 1;
+ pBS->CopyMem(StrPtr, StrHub, 6);
+ StrPtr += 3; // L"Hub"
+ if (HubNumber > 1) {
+ *StrPtr++ = L's'; // L"Hubs"
+ }
+ Is1stItem = FALSE;
+ }
+ // Ccid/Ccids
+ if (CcidNumber) {
+ if (!Is1stItem) {
+ pBS->CopyMem(StrPtr, Comma, 4);
+ StrPtr += 2; // L" ,"
+ }
+ ItowEx(CcidNumber, NumberToString, 10, FALSE);
+ NumSize = Wcslen(NumberToString);
+
+ // move pointer 1 more space then string length
+ pBS->CopyMem(StrPtr, NumberToString, (NumSize * sizeof (CHAR16)));
+ StrPtr += NumSize;
+
+ // move pointer 1 more space
+ pBS->CopyMem(StrPtr, Space, 2);
+ StrPtr += 1; // L" "
+
+ pBS->CopyMem(StrPtr, StrCcid, 32);
+ StrPtr += 16; // L"SmartCard Reader"
+ if (CcidNumber > 1) {
+ *StrPtr++ = L's'; // L'SmartCard Readers'
+ }
+ Is1stItem = FALSE;
+ }
+
+ pBS->CopyMem(DevNumStr, Name, MAX_DEVS_LINE_LENGTH * sizeof(CHAR16));
+
+ Is1stItem = TRUE;
+ StrPtr = Name;
+ // Form the string
+ pBS->SetMem(StrPtr, MAX_DEVS_LINE_LENGTH * sizeof(CHAR16), 0);
+ pBS->CopyMem(StrPtr, LeadingSpace, 10 * sizeof(CHAR16));
+ StrPtr += 6; // leave string pointer at "None"
+
+ // Drive/Drives
+ if (UhciNumber) {
+ ItowEx(UhciNumber, NumberToString, 10, FALSE);
+ NumSize = Wcslen(NumberToString);
+
+ pBS->CopyMem(StrPtr, NumberToString, (NumSize * sizeof (CHAR16)));
+ StrPtr += NumSize;
+ // move pointer 1 more space
+ pBS->CopyMem(StrPtr, Space, 2);
+ StrPtr += 1;
+
+ pBS->CopyMem(StrPtr, StrUhci, 8);
+ StrPtr += 4; // L"UHCI"
+ if (UhciNumber > 1) {
+ *StrPtr++ = L's'; // L"UHCIs"
+ }
+ Is1stItem = FALSE;
+ }
+
+ if (OhciNumber) {
+ if (!Is1stItem) {
+ pBS->CopyMem(StrPtr, Comma, 4);
+ StrPtr += 2; // L" ,"
+ }
+ ItowEx(OhciNumber, NumberToString, 10, FALSE);
+ NumSize = Wcslen(NumberToString);
+
+ // move pointer 1 more space then string length
+ pBS->CopyMem(StrPtr, NumberToString, (NumSize * sizeof (CHAR16)));
+ StrPtr += NumSize;
+
+ // move pointer 1 more space
+ pBS->CopyMem(StrPtr, Space, 2);
+ StrPtr += 1; // L" "
+
+ pBS->CopyMem(StrPtr, StrOhci, 8);
+ StrPtr += 4; // L"OHCI"
+ if (OhciNumber > 1) {
+ *StrPtr++ = L's'; // L'OHCIs'
+ }
+ Is1stItem = FALSE;
+ }
+
+ if (EhciNumber) {
+ if (!Is1stItem) {
+ pBS->CopyMem(StrPtr, Comma, 4);
+ StrPtr += 2; // L" ,"
+ }
+ ItowEx(EhciNumber, NumberToString, 10, FALSE);
+ NumSize = Wcslen(NumberToString);
+
+ // move pointer 1 more space then string length
+ pBS->CopyMem(StrPtr, NumberToString, (NumSize * sizeof (CHAR16)));
+ StrPtr += NumSize;
+
+ // move pointer 1 more space
+ pBS->CopyMem(StrPtr, Space, 2);
+ StrPtr += 1; // L" "
+
+ pBS->CopyMem(StrPtr, StrEhci, 8);
+ StrPtr += 4; // L"EHCI"
+ if (EhciNumber > 1) {
+ *StrPtr++ = L's'; // L'EHCIs'
+ }
+ Is1stItem = FALSE;
+ }
+
+ if (XhciNumber) {
+ if (!Is1stItem) {
+ pBS->CopyMem(StrPtr, Comma, 4);
+ StrPtr += 2; // L" ,"
+ }
+ ItowEx(XhciNumber, NumberToString, 10, FALSE);
+ NumSize = Wcslen(NumberToString);
+
+ // move pointer 1 more space then string length
+ pBS->CopyMem(StrPtr, NumberToString, (NumSize * sizeof (CHAR16)));
+ StrPtr += NumSize;
+
+ // move pointer 1 more space
+ pBS->CopyMem(StrPtr, Space, 2);
+ StrPtr += 1; // L" "
+
+ pBS->CopyMem(StrPtr, StrXhci, 8);
+ StrPtr += 4; // L"XHCI"
+ if (XhciNumber > 1) {
+ *StrPtr++ = L's'; // L'XHCIs'
+ }
+ Is1stItem = FALSE;
+ }
+
+ pBS->CopyMem(ControllerNumStr, Name, MAX_DEVS_LINE_LENGTH * sizeof(CHAR16));
+
+ return EFI_SUCCESS;
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: GetMassDeviceName
+//
+// Description: This function retrieves the USB mass storage device ASCII name.
+//
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+
+UINT8
+GetMassDeviceName(
+ UINT8 *DevName,
+ UINT8 DevAddr,
+ EFI_USB_PROTOCOL *UsbProtocol
+)
+{
+ CHAR8 Data[48];
+ UINT8 NextDev;
+
+ // Get the name using USBMassAPIGetDeviceInformation
+ NextDev = UsbProtocol->UsbGetNextMassDeviceName(Data, sizeof(Data), DevAddr);
+ if (NextDev != 0xFF) {
+ Sprintf((char*)DevName, "%a", Data);
+ }
+ return NextDev;
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: InitUSBStrings
+//
+// Description: This function is eLink'ed with the chain executed right before
+// the Setup.
+//
+//----------------------------------------------------------------------------
+
+VOID
+InitUSBStrings(
+ EFI_HII_HANDLE HiiHandle,
+ UINT16 Class
+)
+{
+ CHAR16 DevNumStr[MAX_DEVS_LINE_LENGTH];
+ CHAR16 ControllerNumStr[MAX_DEVS_LINE_LENGTH];
+ CHAR8 MassStr[MAX_DEVS_LINE_LENGTH];
+ UINT8 NextDev;
+ UINT16 MassDev[16] = {
+ STRING_TOKEN(STR_USB_MASS_DEVICE1),
+ STRING_TOKEN(STR_USB_MASS_DEVICE2),
+ STRING_TOKEN(STR_USB_MASS_DEVICE3),
+ STRING_TOKEN(STR_USB_MASS_DEVICE4),
+ STRING_TOKEN(STR_USB_MASS_DEVICE5),
+ STRING_TOKEN(STR_USB_MASS_DEVICE6),
+ STRING_TOKEN(STR_USB_MASS_DEVICE7),
+ STRING_TOKEN(STR_USB_MASS_DEVICE8),
+ STRING_TOKEN(STR_USB_MASS_DEVICE9),
+ STRING_TOKEN(STR_USB_MASS_DEVICE10),
+ STRING_TOKEN(STR_USB_MASS_DEVICE11),
+ STRING_TOKEN(STR_USB_MASS_DEVICE12),
+ STRING_TOKEN(STR_USB_MASS_DEVICE13),
+ STRING_TOKEN(STR_USB_MASS_DEVICE14),
+ STRING_TOKEN(STR_USB_MASS_DEVICE15),
+ STRING_TOKEN(STR_USB_MASS_DEVICE16)
+
+ };
+ UINT8 MassDevValid[16];
+ UINT8 i;
+ UINTN VariableSize;
+ USB_MASS_DEV_NUM SetupData;
+ EFI_STATUS Status;
+ EFI_USB_PROTOCOL *UsbProtocol;
+ EFI_GUID UsbProtocolGuid = EFI_USB_PROTOCOL_GUID;
+ CONNECTED_USB_DEVICES_NUM DevNum;
+ UINT32 VariableAttributes = EFI_VARIABLE_BOOTSERVICE_ACCESS;
+ USB_CONTROLLER_NUM UsbControllerNum;
+
+#if USB_SETUP_VARIABLE_RUNTIME_ACCESS
+ VariableAttributes |= EFI_VARIABLE_RUNTIME_ACCESS;
+#endif
+
+
+ if (Class!=ADVANCED_FORM_SET_CLASS) {
+ return;
+ }
+ //(EIP102493+)>
+ InitString(HiiHandle, STRING_TOKEN(STR_USB_MODULE_VER), L"%d.%02d.%02d",
+ USB_DRIVER_MAJOR_VER, USB_DRIVER_MINOR_VER, USB_DRIVER_BUILD_VER);
+ //<(EIP102493+)
+
+ Status = pBS->LocateProtocol(&UsbProtocolGuid, NULL, &UsbProtocol);
+//#### ASSERT_EFI_ERROR(Status);
+ if (EFI_ERROR(Status)) {
+ return;
+ }
+
+ // Number of connected devices
+ GetConnectedDevices(DevNumStr, ControllerNumStr, UsbProtocol, &DevNum);
+
+ TRACE((-1, "Devices total: %d KBDs, %d HUBs, %d MICE, %d POINT %d MASS %d CCID\n",
+ DevNum.NumUsbKbds, DevNum.NumUsbHubs, DevNum.NumUsbMice,
+ DevNum.NumUsbPoint, DevNum.NumUsbMass, DevNum.NumUsbCcids));
+
+ InitString(HiiHandle, STRING_TOKEN(STR_USB_DEVICES_ENABLED_LIST), L"%s", DevNumStr);
+ InitString(HiiHandle, STRING_TOKEN(STR_USB_CONTROLLERS_ENABLED_LIST), L"%s", ControllerNumStr);
+
+ // Mass storage device names
+ for (i = 0, NextDev = 0; i < 16; i++) {
+ NextDev = GetMassDeviceName(MassStr, NextDev, UsbProtocol);
+ if (NextDev == 0xFF) {
+ break; // No more devices
+ }
+ InitString(HiiHandle, MassDev[i], L"%S", MassStr);
+ if (NextDev & 0x80) {
+ break; // Last device
+ }
+ }
+
+ for (i = 0; i < 16; i++) {
+ if (i < DevNum.NumUsbMass) {
+ MassDevValid[i] = 1;
+ } else {
+ MassDevValid[i] = 0;
+ }
+ }
+
+ VariableSize = sizeof(USB_MASS_DEV_VALID);
+
+ Status = pRS->SetVariable(L"UsbMassDevValid",
+ &gEfiSetupGuid,
+ VariableAttributes,
+ VariableSize,
+ &MassDevValid);
+
+ VariableSize = sizeof(SetupData);
+ Status = pRS->GetVariable(L"UsbMassDevNum",
+ &gEfiSetupGuid,
+ NULL,
+ &VariableSize,
+ &SetupData);
+
+ if (EFI_ERROR(Status)) {
+ return;
+ }
+
+ SetupData.IsInteractionAllowed = 0;
+ SetupData.UsbMassDevNum = DevNum.NumUsbMass;
+
+ Status = pRS->SetVariable(L"UsbMassDevNum",
+ &gEfiSetupGuid,
+ VariableAttributes,
+ VariableSize,
+ &SetupData);
+
+ VariableSize = sizeof(UsbControllerNum);
+ Status = pRS->GetVariable(L"UsbControllerNum",
+ &gEfiSetupGuid,
+ NULL,
+ &VariableSize,
+ &UsbControllerNum);
+
+ if (EFI_ERROR(Status)) {
+ return;
+ }
+
+ UsbControllerNum.UhciNum = DevNum.NumUhcis;
+ UsbControllerNum.OhciNum = DevNum.NumOhcis;
+ UsbControllerNum.EhciNum = DevNum.NumEhcis;
+ UsbControllerNum.XhciNum = DevNum.NumXhcis;
+
+ Status = pRS->SetVariable(L"UsbControllerNum",
+ &gEfiSetupGuid,
+ VariableAttributes,
+ VariableSize,
+ &UsbControllerNum);
+
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: UpdateUSBStrings
+//
+// Description: This function is updating usb setup page dynamically.
+//
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+
+VOID
+UpdateUSBStrings(
+ EFI_HII_HANDLE HiiHandle,
+ UINT16 Class,
+ UINT16 SubClass,
+ UINT16 Key
+)
+{
+ UINT8 MassDevValid[16];
+ UINT8 i;
+ UINT8 NextDev;
+ UINTN VariableSize;
+ EFI_GUID UsbProtocolGuid = EFI_USB_PROTOCOL_GUID;
+ EFI_STATUS Status;
+ EFI_USB_PROTOCOL *UsbProtocol;
+ CONNECTED_USB_DEVICES_NUM DevNum;
+ USB_MASS_DEV_NUM MassDevNumData;
+ USB_CONTROLLER_NUM UsbControllerNum;
+ CHAR16 DevNumStr[MAX_DEVS_LINE_LENGTH];
+ CHAR16 ControllerNumStr[MAX_DEVS_LINE_LENGTH];
+ CHAR8 MassStr[MAX_DEVS_LINE_LENGTH];
+ UINT16 MassDev[16] = {
+ STRING_TOKEN(STR_USB_MASS_DEVICE1),
+ STRING_TOKEN(STR_USB_MASS_DEVICE2),
+ STRING_TOKEN(STR_USB_MASS_DEVICE3),
+ STRING_TOKEN(STR_USB_MASS_DEVICE4),
+ STRING_TOKEN(STR_USB_MASS_DEVICE5),
+ STRING_TOKEN(STR_USB_MASS_DEVICE6),
+ STRING_TOKEN(STR_USB_MASS_DEVICE7),
+ STRING_TOKEN(STR_USB_MASS_DEVICE8),
+ STRING_TOKEN(STR_USB_MASS_DEVICE9),
+ STRING_TOKEN(STR_USB_MASS_DEVICE10),
+ STRING_TOKEN(STR_USB_MASS_DEVICE11),
+ STRING_TOKEN(STR_USB_MASS_DEVICE12),
+ STRING_TOKEN(STR_USB_MASS_DEVICE13),
+ STRING_TOKEN(STR_USB_MASS_DEVICE14),
+ STRING_TOKEN(STR_USB_MASS_DEVICE15),
+ STRING_TOKEN(STR_USB_MASS_DEVICE16)
+ };
+
+ if (Key == USB_DEVICES_ENABLED_REFRESH_KEY) {
+
+ Status = pBS->LocateProtocol(&UsbProtocolGuid, NULL, &UsbProtocol);
+
+ if (EFI_ERROR(Status)) {
+ return;
+ }
+
+ // Number of connected devices
+ GetConnectedDevices(DevNumStr, ControllerNumStr, UsbProtocol, &DevNum);
+
+ InitString(HiiHandle, STRING_TOKEN(STR_USB_DEVICES_ENABLED_LIST), L"%s", DevNumStr);
+
+ // Mass storage device names
+ for (i = 0, NextDev = 0; i < 16; i++) {
+ NextDev = GetMassDeviceName(MassStr, NextDev, UsbProtocol);
+ if (NextDev == 0xFF) {
+ break; // No more devices
+ }
+ InitString(HiiHandle, MassDev[i], L"%S", MassStr);
+ if (NextDev & 0x80) {
+ break; // Last device
+ }
+ }
+
+ VariableSize = sizeof(MassDevValid);
+
+ Status = HiiLibGetBrowserData(
+ &VariableSize, &MassDevValid,
+ &gEfiSetupGuid, L"UsbMassDevValid");
+
+ if (EFI_ERROR(Status)) {
+ return;
+ }
+
+ for (i = 0; i < 16; i++) {
+ if (i < DevNum.NumUsbMass) {
+ MassDevValid[i] = 1;
+ } else {
+ MassDevValid[i] = 0;
+ }
+ }
+
+ Status = HiiLibSetBrowserData(
+ VariableSize, &MassDevValid,
+ &gEfiSetupGuid, L"UsbMassDevValid");
+
+ if (EFI_ERROR(Status)) {
+ return;
+ }
+
+ VariableSize = sizeof(MassDevNumData);
+
+ Status = HiiLibGetBrowserData(
+ &VariableSize, &MassDevNumData,
+ &gEfiSetupGuid, L"UsbMassDevNum");
+
+ if (EFI_ERROR(Status)) {
+ return;
+ }
+
+ MassDevNumData.UsbMassDevNum = DevNum.NumUsbMass;
+
+ Status = HiiLibSetBrowserData(
+ VariableSize, &MassDevNumData,
+ &gEfiSetupGuid, L"UsbMassDevNum");
+
+ VariableSize = sizeof(UsbControllerNum);
+
+ Status = HiiLibGetBrowserData(
+ &VariableSize, &UsbControllerNum,
+ &gEfiSetupGuid, L"UsbControllerNum");
+
+ if (EFI_ERROR(Status)) {
+ return;
+ }
+
+ UsbControllerNum.UhciNum = DevNum.NumUhcis;
+ UsbControllerNum.OhciNum = DevNum.NumOhcis;
+ UsbControllerNum.EhciNum = DevNum.NumEhcis;
+ UsbControllerNum.XhciNum = DevNum.NumXhcis;
+
+ Status = HiiLibSetBrowserData(
+ VariableSize, &UsbControllerNum,
+ &gEfiSetupGuid, L"UsbControllerNum");
+
+ }
+
+}
+
+//**********************************************************************
+//**********************************************************************
+//** **
+//** (C)Copyright 1985-2014, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//**********************************************************************
+//**********************************************************************