]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EmbeddedPkg/MetronomeDxe/Metronome.c
Change name to remove Template
[mirror_edk2.git] / EmbeddedPkg / MetronomeDxe / Metronome.c
diff --git a/EmbeddedPkg/MetronomeDxe/Metronome.c b/EmbeddedPkg/MetronomeDxe/Metronome.c
new file mode 100644 (file)
index 0000000..861bf24
--- /dev/null
@@ -0,0 +1,132 @@
+/** @file\r
+\r
+  Copyright (c) 2008-2009, Apple Inc. All rights reserved.\r
+  \r
+  All rights reserved. This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <PiDxe.h>\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/UefiLib.h>\r
+#include <Library/PcdLib.h>\r
+#include <Library/TimerLib.h>\r
+\r
+#include <Protocol/Metronome.h>\r
+\r
+\r
+\r
+/**\r
+  The WaitForTick() function waits for the number of ticks specified by \r
+  TickNumber from a known time source in the platform.  If TickNumber of \r
+  ticks are detected, then EFI_SUCCESS is returned.  The actual time passed \r
+  between entry of this function and the first tick is between 0 and \r
+  TickPeriod 100 nS units.  If you want to guarantee that at least TickPeriod \r
+  time has elapsed, wait for two ticks.  This function waits for a hardware \r
+  event to determine when a tick occurs.  It is possible for interrupt \r
+  processing, or exception processing to interrupt the execution of the \r
+  WaitForTick() function.  Depending on the hardware source for the ticks, it \r
+  is possible for a tick to be missed.  This function cannot guarantee that \r
+  ticks will not be missed.  If a timeout occurs waiting for the specified \r
+  number of ticks, then EFI_TIMEOUT is returned.\r
+\r
+  @param  This             The EFI_METRONOME_ARCH_PROTOCOL instance.\r
+  @param  TickNumber       Number of ticks to wait.\r
+\r
+  @retval EFI_SUCCESS           The wait for the number of ticks specified by TickNumber\r
+                                succeeded.\r
+  @retval EFI_TIMEOUT           A timeout occurred waiting for the specified number of ticks.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+WaitForTick (\r
+  IN EFI_METRONOME_ARCH_PROTOCOL  *This,\r
+  IN UINT32                       TickNumber\r
+  )\r
+{\r
+  //\r
+  // Fill me in\r
+  //\r
+  MicroSecondDelay (10 * TickNumber);\r
+  return EFI_UNSUPPORTED;\r
+}\r
+\r
+\r
+\r
+/**\r
+  Interface stucture for the Metronome Architectural Protocol.\r
+\r
+  @par Protocol Description:\r
+  This protocol provides access to a known time source in the platform to the\r
+  core.  The core uses this known time source to produce core services that \r
+  require calibrated delays.  \r
+\r
+  @param WaitForTick\r
+  Waits for a specified number of ticks from a known time source \r
+  in the platform.  The actual time passed between entry of this \r
+  function and the first tick is between 0 and TickPeriod 100 nS \r
+  units.  If you want to guarantee that at least TickPeriod time \r
+  has elapsed, wait for two ticks.\r
+\r
+  @param TickPeriod\r
+  The period of platform's known time source in 100 nS units.  \r
+  This value on any platform must be at least 10 uS, and must not \r
+  exceed 200 uS.  The value in this field is a constant that must \r
+  not be modified after the Metronome architectural protocol is \r
+  installed.  All consumers must treat this as a read-only field.\r
+\r
+**/\r
+EFI_METRONOME_ARCH_PROTOCOL gMetronome = {\r
+  WaitForTick,\r
+  100              \r
+};\r
+\r
+\r
+EFI_HANDLE  gMetronomeHandle = NULL;\r
+\r
+\r
+\r
+/**\r
+  Initialize the state information for the CPU Architectural Protocol\r
+\r
+  @param  ImageHandle   of the loaded driver\r
+  @param  SystemTable   Pointer to the System Table\r
+\r
+  @retval EFI_SUCCESS           Protocol registered\r
+  @retval EFI_OUT_OF_RESOURCES  Cannot allocate protocol data structure\r
+  @retval EFI_DEVICE_ERROR      Hardware problems\r
+\r
+**/\r
+EFI_STATUS\r
+MetronomeInitialize (\r
+  IN EFI_HANDLE         ImageHandle,\r
+  IN EFI_SYSTEM_TABLE   *SystemTable\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+  \r
+  //\r
+  // Do any hardware init required to make WaitForTick () to work here.\r
+  //\r
+\r
+  Status = gBS->InstallMultipleProtocolInterfaces (\r
+                  &gMetronomeHandle,\r
+                  &gEfiMetronomeArchProtocolGuid,   &gMetronome,\r
+                  NULL\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  return Status;\r
+}\r
+\r