Platforms/HiKey: enable gpio keyboard

When GPIO24 is in LOW LEVEL, send out 'f' key that is the hotkey
of AndroidFastbootApp.

Signed-off-by: Haojian Zhuang <haojian.zhuang@linaro.org>
diff --git a/Platforms/Hisilicon/HiKey/HiKey.dsc b/Platforms/Hisilicon/HiKey/HiKey.dsc
index e44ede6..1cf24eb 100644
--- a/Platforms/Hisilicon/HiKey/HiKey.dsc
+++ b/Platforms/Hisilicon/HiKey/HiKey.dsc
@@ -410,8 +410,6 @@
 

   MdeModulePkg/Universal/PCD/Dxe/Pcd.inf

 

-  OpenPlatformPkg/Platforms/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.inf

-

   #

   # GPIO

   #

@@ -419,6 +417,13 @@
   OpenPlatformPkg/Platforms/Hisilicon/HiKey/HiKeyGpioDxe/HiKeyGpioDxe.inf

 

   #

+  # GPIO Keyboard

+  #

+  OpenPlatformPkg/Drivers/Keyboard/GpioKeyboardDxe/GpioKeyboardDxe.inf

+

+  OpenPlatformPkg/Platforms/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.inf

+

+  #

   # MMC/SD

   #

   EmbeddedPkg/Universal/MmcDxe/MmcDxe.inf

diff --git a/Platforms/Hisilicon/HiKey/HiKey.fdf b/Platforms/Hisilicon/HiKey/HiKey.fdf
index a02fd0c..bd80c79 100644
--- a/Platforms/Hisilicon/HiKey/HiKey.fdf
+++ b/Platforms/Hisilicon/HiKey/HiKey.fdf
@@ -114,8 +114,6 @@
 

   INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf

 

-  INF OpenPlatformPkg/Platforms/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.inf

-

   #

   # GPIO

   #

@@ -123,6 +121,13 @@
   INF OpenPlatformPkg/Platforms/Hisilicon/HiKey/HiKeyGpioDxe/HiKeyGpioDxe.inf

 

   #

+  # GPIO Keyboard

+  #

+  INF OpenPlatformPkg/Drivers/Keyboard/GpioKeyboardDxe/GpioKeyboardDxe.inf

+

+  INF OpenPlatformPkg/Platforms/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.inf

+

+  #

   # Multimedia Card Interface

   #

   INF EmbeddedPkg/Universal/MmcDxe/MmcDxe.inf

diff --git a/Platforms/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.c b/Platforms/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.c
index 32bf5c7..174dfca 100644
--- a/Platforms/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.c
+++ b/Platforms/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.c
@@ -26,6 +26,7 @@
 
 #include <Protocol/Abootimg.h>
 #include <Protocol/BlockIo.h>
+#include <Protocol/PlatformGpioKeyboard.h>
 
 #include <Hi6220.h>
 #include <libfdt.h>
@@ -38,6 +39,8 @@
 #define RANDOM_MAX                       0x7FFFFFFFFFFFFFFF
 #define RANDOM_MAGIC                     0x9A4DBEAF
 
+#define DETECT_J15_FASTBOOT              24   // GPIO3_0
+
 typedef struct {
   UINT64        Magic;
   UINT64        Data;
@@ -107,6 +110,10 @@
   UartInit ();
   MtcmosInit ();
 
+  /* Set DETECT_J15_FASTBOOT (GPIO24) pin as GPIO function */
+  MmioWrite32 (0xf7010950, 0);        /* configure GPIO24 as nopull */
+  MmioWrite32 (0xf7010140, 0);        /* configure GPIO24 as GPIO */
+
   return EFI_SUCCESS;
 }
 
@@ -237,6 +244,28 @@
 
 EFI_STATUS
 EFIAPI
+GpioKeyboardRegister (
+  IN OUT GPIO_KBD_KEY                       *GpioKey
+  )
+{
+  if (GpioKey == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+  GpioKey->Signature = GPIO_KBD_KEY_NEXT_SIGNATURE;
+  GpioKey->Pin = DETECT_J15_FASTBOOT;
+  GpioKey->Value = 0;
+  GpioKey->Key.ScanCode = SCAN_NULL;
+  GpioKey->Key.UnicodeChar = L'f';
+  InitializeListHead (&GpioKey->Next);
+  return EFI_SUCCESS;
+}
+
+PLATFORM_GPIO_KBD_PROTOCOL mGpioKeyboard = {
+  GpioKeyboardRegister
+};
+
+EFI_STATUS
+EFIAPI
 HiKeyEntryPoint (
   IN EFI_HANDLE         ImageHandle,
   IN EFI_SYSTEM_TABLE   *SystemTable
@@ -255,5 +284,16 @@
                   EFI_NATIVE_INTERFACE,
                   &mAbootimg
                   );
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  Status = gBS->InstallProtocolInterface (
+                  &ImageHandle,
+                  &gPlatformGpioKeyboardProtocolGuid,
+                  EFI_NATIVE_INTERFACE,
+                  &mGpioKeyboard
+                  );
+DEBUG ((DEBUG_ERROR, "#%a, %d, Status:%r\n", __func__, __LINE__, Status));
   return Status;
 }
diff --git a/Platforms/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.inf b/Platforms/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.inf
index 3d55282..dcc2b9e 100644
--- a/Platforms/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.inf
+++ b/Platforms/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.inf
@@ -28,6 +28,7 @@
   EmbeddedPkg/EmbeddedPkg.dec
   MdePkg/MdePkg.dec
   MdeModulePkg/MdeModulePkg.dec
+  OpenPlatformPkg/Drivers/Keyboard/GpioKeyboardDxe/GpioKeyboardDxe.dec
   OpenPlatformPkg/Platforms/Hisilicon/HiKey/HiKey.dec
 
 [LibraryClasses]
@@ -50,6 +51,7 @@
 [Protocols]
   gAbootimgProtocolGuid
   gEfiBlockIoProtocolGuid
+  gPlatformGpioKeyboardProtocolGuid
 
 [Guids]
   gEfiEndOfDxeEventGroupGuid