2010-01-28 22:32:01 +01:00
|
|
|
/** @file
|
|
|
|
|
|
|
|
Copyright (c) 2008-2009, Apple Inc. All rights reserved.
|
|
|
|
|
|
|
|
All rights reserved. This program and the accompanying materials
|
|
|
|
are licensed and made available under the terms and conditions of the BSD License
|
|
|
|
which accompanies this distribution. The full text of the license may be found at
|
|
|
|
http://opensource.org/licenses/bsd-license.php
|
|
|
|
|
|
|
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
|
|
|
#include <Uefi.h>
|
|
|
|
|
|
|
|
#include <Library/IoLib.h>
|
|
|
|
#include <Library/OmapLib.h>
|
|
|
|
#include <Library/UefiBootServicesTableLib.h>
|
|
|
|
|
|
|
|
#include <Protocol/EmbeddedGpio.h>
|
|
|
|
|
|
|
|
#include <Omap3530/Omap3530.h>
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
Get (
|
|
|
|
IN EMBEDDED_GPIO *This,
|
|
|
|
IN EMBEDDED_GPIO_PIN Gpio,
|
|
|
|
OUT UINTN *Value
|
|
|
|
)
|
|
|
|
{
|
|
|
|
UINTN Port;
|
|
|
|
UINTN Pin;
|
|
|
|
UINT32 DataInRegister;
|
|
|
|
|
|
|
|
if (Value == NULL)
|
|
|
|
{
|
|
|
|
return EFI_UNSUPPORTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
Port = GPIO_PORT(Gpio);
|
|
|
|
Pin = GPIO_PIN(Gpio);
|
|
|
|
|
|
|
|
DataInRegister = GpioBase(Port) + GPIO_DATAIN;
|
|
|
|
|
|
|
|
if (MmioRead32(DataInRegister) & GPIO_DATAIN_MASK(Pin)) {
|
|
|
|
*Value = 1;
|
|
|
|
} else {
|
|
|
|
*Value = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return EFI_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
Set (
|
|
|
|
IN EMBEDDED_GPIO *This,
|
|
|
|
IN EMBEDDED_GPIO_PIN Gpio,
|
|
|
|
IN EMBEDDED_GPIO_MODE Mode
|
|
|
|
)
|
|
|
|
{
|
|
|
|
UINTN Port;
|
|
|
|
UINTN Pin;
|
|
|
|
UINT32 OutputEnableRegister;
|
|
|
|
UINT32 SetDataOutRegister;
|
|
|
|
UINT32 ClearDataOutRegister;
|
|
|
|
|
|
|
|
Port = GPIO_PORT(Gpio);
|
|
|
|
Pin = GPIO_PIN(Gpio);
|
|
|
|
|
|
|
|
OutputEnableRegister = GpioBase(Port) + GPIO_OE;
|
|
|
|
SetDataOutRegister = GpioBase(Port) + GPIO_SETDATAOUT;
|
|
|
|
ClearDataOutRegister = GpioBase(Port) + GPIO_CLEARDATAOUT;
|
|
|
|
|
|
|
|
switch (Mode)
|
|
|
|
{
|
|
|
|
case GPIO_MODE_INPUT:
|
|
|
|
MmioAndThenOr32(OutputEnableRegister, ~GPIO_OE_MASK(Pin), GPIO_OE_INPUT(Pin));
|
|
|
|
break;
|
|
|
|
|
|
|
|
case GPIO_MODE_OUTPUT_0:
|
2010-02-15 21:40:51 +01:00
|
|
|
MmioWrite32 (ClearDataOutRegister, GPIO_CLEARDATAOUT_BIT(Pin));
|
2010-01-28 22:32:01 +01:00
|
|
|
MmioAndThenOr32(OutputEnableRegister, ~GPIO_OE_MASK(Pin), GPIO_OE_OUTPUT(Pin));
|
|
|
|
break;
|
|
|
|
|
|
|
|
case GPIO_MODE_OUTPUT_1:
|
2010-02-15 21:40:51 +01:00
|
|
|
MmioWrite32 (SetDataOutRegister, GPIO_SETDATAOUT_BIT(Pin));
|
2010-01-28 22:32:01 +01:00
|
|
|
MmioAndThenOr32(OutputEnableRegister, ~GPIO_OE_MASK(Pin), GPIO_OE_OUTPUT(Pin));
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
return EFI_UNSUPPORTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
return EFI_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
GetMode (
|
|
|
|
IN EMBEDDED_GPIO *This,
|
|
|
|
IN EMBEDDED_GPIO_PIN Gpio,
|
|
|
|
OUT EMBEDDED_GPIO_MODE *Mode
|
|
|
|
)
|
|
|
|
{
|
|
|
|
return EFI_UNSUPPORTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
SetPull (
|
|
|
|
IN EMBEDDED_GPIO *This,
|
|
|
|
IN EMBEDDED_GPIO_PIN Gpio,
|
|
|
|
IN EMBEDDED_GPIO_PULL Direction
|
|
|
|
)
|
|
|
|
{
|
|
|
|
return EFI_UNSUPPORTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
EMBEDDED_GPIO Gpio = {
|
|
|
|
Get,
|
|
|
|
Set,
|
|
|
|
GetMode,
|
|
|
|
SetPull
|
|
|
|
};
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
GpioInitialize (
|
|
|
|
IN EFI_HANDLE ImageHandle,
|
|
|
|
IN EFI_SYSTEM_TABLE *SystemTable
|
|
|
|
)
|
|
|
|
{
|
|
|
|
EFI_STATUS Status;
|
|
|
|
|
|
|
|
Status = gBS->InstallMultipleProtocolInterfaces(&ImageHandle, &gEmbeddedGpioProtocolGuid, &Gpio, NULL);
|
|
|
|
return Status;
|
|
|
|
}
|