From 406d8575444ec50c7948a1b167673a993413c4e5 Mon Sep 17 00:00:00 2001 From: Michael Kinney Date: Thu, 7 Jan 2016 22:43:22 +0000 Subject: [PATCH] QuarkPlatformPkg/PlatformEarlyInit: Configure GPIO expander Configure GPIO expander in PEI phase 1) Configure all GPIO expander pins connected to Reset Button as inputs 2) Configure multiplexer for I2C to route I2C bus to Arduino Header Cc: Kelly Steele Cc: Jiewen Yao Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Michael Kinney Reviewed-by: Kelly Steele git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@19620 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Platform/Pei/PlatformInit/CommonHeader.h | 3 +- .../Pei/PlatformInit/PlatformEarlyInit.c | 214 +++++++++++++++++- .../Pei/PlatformInit/PlatformEarlyInit.inf | 3 +- 3 files changed, 217 insertions(+), 3 deletions(-) diff --git a/QuarkPlatformPkg/Platform/Pei/PlatformInit/CommonHeader.h b/QuarkPlatformPkg/Platform/Pei/PlatformInit/CommonHeader.h index 3630f347b6..98284958a4 100644 --- a/QuarkPlatformPkg/Platform/Pei/PlatformInit/CommonHeader.h +++ b/QuarkPlatformPkg/Platform/Pei/PlatformInit/CommonHeader.h @@ -3,7 +3,7 @@ Common header file shared by all source files. This file includes package header files, library classes and protocol, PPI & GUID definitions. -Copyright (c) 2013 Intel Corporation. +Copyright (c) 2013 - 2016 Intel Corporation. This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License @@ -78,6 +78,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include #include #include +#include #include diff --git a/QuarkPlatformPkg/Platform/Pei/PlatformInit/PlatformEarlyInit.c b/QuarkPlatformPkg/Platform/Pei/PlatformInit/PlatformEarlyInit.c index 32ae3e0891..756cc4a7a3 100644 --- a/QuarkPlatformPkg/Platform/Pei/PlatformInit/PlatformEarlyInit.c +++ b/QuarkPlatformPkg/Platform/Pei/PlatformInit/PlatformEarlyInit.c @@ -6,7 +6,7 @@ This PEIM initialize platform for MRC, following action is performed, 4. Calls MRC to initialize memory and install a PPI notify to do post memory initialization. This file contains the main entrypoint of the PEIM. -Copyright (c) 2013 Intel Corporation. +Copyright (c) 2013 - 2016 Intel Corporation. This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License @@ -192,6 +192,212 @@ SetLanControllerMacAddr ( PciWrite16 (DevPcieAddr + PCI_COMMAND_OFFSET, SaveCmdReg); } +/** + Initialize state of I2C GPIO expanders. + + @param PlatformType Platform type for GPIO expander init. + +**/ +EFI_STATUS +EarlyPlatformConfigGpioExpanders ( + IN CONST EFI_PLATFORM_TYPE PlatformType + ) +{ + EFI_STATUS Status; + EFI_I2C_DEVICE_ADDRESS I2CSlaveAddress; + UINTN Length; + UINTN ReadLength; + UINT8 Buffer[2]; + + // + // Configure GPIO expanders for Galileo Gen 2 + // Route I2C pins to Arduino header + // Set all GPIO expander pins connected to the Reset Button as inputs + // + if (PlatformType == GalileoGen2) { + // + // Configure AMUX1_IN (EXP2.P1_4) as an output + // + PlatformPcal9555GpioSetDir ( + GALILEO_GEN2_IOEXP2_7BIT_SLAVE_ADDR, // IO Expander 2. + 12, // P1-4. + FALSE // Configure as output + ); + + // + // Set AMUX1_IN(EXP2.P1_4) low to route I2C to Arduino Shield connector + // + PlatformPcal9555GpioSetLevel ( + GALILEO_GEN2_IOEXP2_7BIT_SLAVE_ADDR, // IO Expander 2. + 12, // P1-4. + FALSE // Set pin low + ); + + // + // Configure Reset Button(EXP1.P1_7) as an input + // + PlatformPcal9555GpioSetDir ( + GALILEO_GEN2_IOEXP1_7BIT_SLAVE_ADDR, // IO Expander 1. + 15, // P1-7. + TRUE + ); + + // + // Disable pullup on Reset Button(EXP1.P1_7) + // + PlatformPcal9555GpioDisablePull ( + GALILEO_GEN2_IOEXP1_7BIT_SLAVE_ADDR, // IO Expander 1. + 15 // P1-7. + ); + + // + // Configure Reset Button(EXP2.P1_7) as an input + // + PlatformPcal9555GpioSetDir ( + GALILEO_GEN2_IOEXP2_7BIT_SLAVE_ADDR, // IO Expander 2. + 15, // P1-7. + TRUE + ); + + // + // Disable pullup on Reset Button(EXP2.P1_7) + // + PlatformPcal9555GpioDisablePull ( + GALILEO_GEN2_IOEXP2_7BIT_SLAVE_ADDR, // IO Expander 2. + 15 // P1-7. + ); + } + + // + // Configure GPIO expanders for Galileo Gen 2 + // Set all GPIO expander pins connected to the Reset Button as inputs + // Route I2C pins to Arduino header + // + if (PlatformType == Galileo) { + // + // Detect the I2C Slave Address of the GPIO Expander + // + if (PlatformLegacyGpioGetLevel (R_QNC_GPIO_RGLVL_RESUME_WELL, GALILEO_DETERMINE_IOEXP_SLA_RESUMEWELL_GPIO)) { + I2CSlaveAddress.I2CDeviceAddress = GALILEO_IOEXP_J2HI_7BIT_SLAVE_ADDR; + } else { + I2CSlaveAddress.I2CDeviceAddress = GALILEO_IOEXP_J2LO_7BIT_SLAVE_ADDR; + } + DEBUG ((EFI_D_INFO, "Galileo GPIO Expender Slave Address = %02x\n", I2CSlaveAddress.I2CDeviceAddress)); + + // + // Set I2C_MUX (GPORT1_BIT5) low to route I2C to Arduino Shield connector + // + + // + // Select GPIO Expander GPORT1 + // + Length = 2; + Buffer[0] = 0x18; //sub-address + Buffer[1] = 0x01; //data + Status = I2cWriteMultipleByte ( + I2CSlaveAddress, + EfiI2CSevenBitAddrMode, + &Length, + &Buffer + ); + ASSERT_EFI_ERROR (Status); + + // + // Read "Pin Direction" of GPIO Expander GPORT1 + // + Length = 1; + ReadLength = 1; + Buffer[1] = 0x1C; + Status = I2cReadMultipleByte ( + I2CSlaveAddress, + EfiI2CSevenBitAddrMode, + &Length, + &ReadLength, + &Buffer[1] + ); + ASSERT_EFI_ERROR (Status); + + // + // Configure GPIO Expander GPORT1_BIT5 as an output + // + Length = 2; + Buffer[0] = 0x1C; //sub-address + Buffer[1] = (UINT8)(Buffer[1] & (~BIT5)); //data + + Status = I2cWriteMultipleByte ( + I2CSlaveAddress, + EfiI2CSevenBitAddrMode, + &Length, + &Buffer + ); + ASSERT_EFI_ERROR (Status); + + // + // Set GPIO Expander GPORT1_BIT5 low + // + Length = 2; + Buffer[0] = 0x09; //sub-address + Buffer[1] = (UINT8)(~BIT5); //data + + Status = I2cWriteMultipleByte ( + I2CSlaveAddress, + EfiI2CSevenBitAddrMode, + &Length, + &Buffer + ); + ASSERT_EFI_ERROR (Status); + + // + // Configure RESET_N_SHLD (GPORT5_BIT0) and SW_RESET_N_SHLD (GPORT5_BIT1) as inputs + // + + // + // Select GPIO Expander GPORT5 + // + Length = 2; + Buffer[0] = 0x18; + Buffer[1] = 0x05; + Status = I2cWriteMultipleByte ( + I2CSlaveAddress, + EfiI2CSevenBitAddrMode, + &Length, + &Buffer + ); + ASSERT_EFI_ERROR (Status); + + // + // Read "Pin Direction" of GPIO Expander GPORT5 + // + Length = 1; + ReadLength = 1; + Buffer[1] = 0x1C; + Status = I2cReadMultipleByte ( + I2CSlaveAddress, + EfiI2CSevenBitAddrMode, + &Length, + &ReadLength, + &Buffer[1] + ); + ASSERT_EFI_ERROR (Status); + + // + // Configure GPIO Expander GPORT5_BIT0 and GPORT5_BIT1 as inputs + // + Length = 2; + Buffer[0] = 0x1C; + Buffer[1] = Buffer[1] | BIT0 | BIT1; + Status = I2cWriteMultipleByte ( + I2CSlaveAddress, + EfiI2CSevenBitAddrMode, + &Length, + &Buffer + ); + ASSERT_EFI_ERROR (Status); + } + + return EFI_SUCCESS; +} + /** This is the entrypoint of PEIM @@ -304,6 +510,12 @@ PeiInitPlatform ( DEBUG ((EFI_D_INFO, "Platform Erratas After MRC\n")); PlatformErratasPostMrc (); + // + // + // + DEBUG ((EFI_D_INFO, "EarlyPlatformConfigGpioExpanders ()\n")); + EarlyPlatformConfigGpioExpanders (PlatformType); + // // Now that all of the pre-permanent memory activities have // been taken care of, post a call-back for the permanent-memory diff --git a/QuarkPlatformPkg/Platform/Pei/PlatformInit/PlatformEarlyInit.inf b/QuarkPlatformPkg/Platform/Pei/PlatformInit/PlatformEarlyInit.inf index dd373defdb..1de8efd33e 100644 --- a/QuarkPlatformPkg/Platform/Pei/PlatformInit/PlatformEarlyInit.inf +++ b/QuarkPlatformPkg/Platform/Pei/PlatformInit/PlatformEarlyInit.inf @@ -36,7 +36,7 @@ # memory specific stuff like build memory map, build # resource description hob for DXE phase,etc. # Bootmode.c - Detect boot mode. -# Copyright (c) 2013 Intel Corporation. +# Copyright (c) 2013 - 2016 Intel Corporation. # # This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License @@ -110,6 +110,7 @@ QNCAccessLib PlatformHelperLib PlatformPcieHelperLib + I2cLib [Guids] gEfiMemoryConfigDataGuid # ALWAYS_CONSUMED L"MemoryConfig" -- 2.39.2