/*----------------------------------------------------------------------------* * NAME * I2CcommsInit * * DESCRIPTION * This function initialises the I2C * * RETURNS * Nothing * *----------------------------------------------------------------------------*/ extern void I2CcommsInit(void) { /* Initialise I2C if it is not already initialised */ if(!i2c_initialised) { i2c_initialised = TRUE; PioSetModes( ((0x01L << I2C_SDA_PIO) | (0x01L << I2C_SCL_PIO)), pio_mode_user); /* Configure the PIOs as Input */ PioSetDirs( ((0x01L << I2C_SDA_PIO) | (0x01L << I2C_SCL_PIO)), FALSE); PioSetPullModes(((0x01L << I2C_SDA_PIO) | (0x01L << I2C_SCL_PIO)), pio_mode_strong_pull_down); PioSetEventMask(((0x01L << I2C_SDA_PIO) | (0x01L << I2C_SCL_PIO)), pio_event_mode_disable); /* Configure the I2C controller */ I2cInit(I2C_SDA_PIO, I2C_SCL_PIO, I2C_POWER_PIO_UNDEFINED, pio_i2c_pull_mode_strong_pull_up); /* Configure pull mode of the I2C pins */ PioSetI2CPullMode(pio_i2c_pull_mode_strong_pull_up); /* Configure the I2C clock */ I2cConfigClock(I2C_SCL_100KBPS_HIGH_PERIOD, I2C_SCL_100KBPS_LOW_PERIOD); // I2cConfigClock(I2C_SCL_400KBPS_HIGH_PERIOD, I2C_SCL_400KBPS_LOW_PERIOD); /* Enable the I2C controller */ I2cEnable(TRUE); } }
void LcdDisplayInitI2c(void) { I2cEnable(TRUE); /* I2cInit(uint8 sda_pio, uint8 scl_pio, uint8 power_pio, pio_pull_mode pull); */ /* I2cInit() resets clock to 100kHz. */ I2cInit(PIO_SDA, PIO_SCL, I2C_POWER_PIO_UNDEFINED, pio_i2c_pull_mode_strong_pull_up); I2cConfigClock(I2C_SCL_400KBPS_HIGH_PERIOD, I2C_SCL_400KBPS_LOW_PERIOD); } /* LcdDisplayInitI2c */
/** Initializes the host controller to execute I2C commands. @param I2cControllerIndex Index of I2C controller in LPSS device. 0 represents I2C0, which is PCI function 1 of LPSS device. @return EFI_SUCCESS Opcode initialization on the I2C host controller completed. @return EFI_DEVICE_ERROR Device error, operation failed. **/ EFI_STATUS I2CInit ( UINT8 I2cControllerIndex, UINT16 SlaveAddress ) { EFI_STATUS Status; UINT32 NumTries = 0; UINTN I2CBaseAddress; UINT16 I2cMode; UINTN PciMmBase=0; PciMmBase = MmPciAddress ( 0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPSS_I2C, (I2cControllerIndex + 1), 0 ); I2CBaseAddress = I2CLibPeiMmioRead32 (PciMmBase+R_PCH_LPSS_I2C_BAR); // // Verify the parameters // if (1023 < SlaveAddress ) { Status = EFI_INVALID_PARAMETER; DEBUG((EFI_D_INFO,"I2cStartRequest Exit with Status %r\r\n", Status)); return Status; } if(I2CBaseAddress == (PEI_TEPM_LPSS_I2C0_BAR + I2cControllerIndex * PCI_CONFIG_SPACE_SIZE)) { return EFI_SUCCESS; } ProgramPciLpssI2C(); I2CBaseAddress = (UINT32) (PEI_TEPM_LPSS_I2C0_BAR + I2cControllerIndex * PCI_CONFIG_SPACE_SIZE); DEBUG ((EFI_D_ERROR, "I2CBaseAddress = 0x%x \n",I2CBaseAddress)); NumTries = 10000; // 1 seconds while ((1 == ( I2CLibPeiMmioRead32 ( I2CBaseAddress + R_IC_STATUS) & STAT_MST_ACTIVITY ))) { MicroSecondDelay(10); NumTries --; if(0 == NumTries) return EFI_DEVICE_ERROR; } Status = I2cDisable (I2cControllerIndex); DEBUG((EFI_D_INFO, "I2cDisable Status = %r\r\n", Status)); I2cBusFrequencySet(I2CBaseAddress, 400 * 1000, &I2cMode);//Set I2cMode I2CLibPeiMmioWrite16(I2CBaseAddress + R_IC_INTR_MASK, 0x0); if (0x7F < SlaveAddress) { SlaveAddress = (SlaveAddress & 0x3ff ) | IC_TAR_10BITADDR_MASTER; } I2CLibPeiMmioWrite16 (I2CBaseAddress + R_IC_TAR, (UINT16) SlaveAddress ); I2CLibPeiMmioWrite16 (I2CBaseAddress + R_IC_RX_TL, 0); I2CLibPeiMmioWrite16 (I2CBaseAddress + R_IC_TX_TL, 0 ); I2CLibPeiMmioWrite16 (I2CBaseAddress + R_IC_CON, I2cMode); Status = I2cEnable(I2cControllerIndex); DEBUG((EFI_D_INFO, "I2cEnable Status = %r\r\n", Status)); I2CLibPeiMmioRead16 ( I2CBaseAddress + R_IC_CLR_TX_ABRT ); return EFI_SUCCESS; }
/** Initializes the host controller to execute I2C commands. @param I2cControllerIndex Index of I2C controller in LPSS device. 0 represents I2C0, which is PCI function 1 of LPSS device. @return EFI_SUCCESS Opcode initialization on the I2C host controller completed. @return EFI_DEVICE_ERROR Device error, operation failed. **/ EFI_STATUS I2CInit ( IN UINT8 I2cControllerIndex, IN UINT16 SlaveAddress ) { EFI_STATUS Status=RETURN_SUCCESS; UINT32 NumTries = 0; UINTN GnvsI2cBarAddr=0; // // Verify the parameters // if ((1023 < SlaveAddress) || (6 < I2cControllerIndex)) { Status = RETURN_INVALID_PARAMETER; DEBUG((EFI_D_INFO,"I2CInit Exit with RETURN_INVALID_PARAMETER\r\n")); return Status; } MmioWrite32 ( mI2CBaseAddress + R_IC_TAR, (UINT16)SlaveAddress ); mI2CSlaveAddress = SlaveAddress; // // 1.PEI: program and init ( before pci enumeration). // 2.DXE:update address and re-init ( after pci enumeration). // 3.BDS:update ACPI address and re-init ( after acpi mode is enabled). // if(mI2CBaseAddress == mLpssPciDeviceList[I2cControllerIndex + 1].Bar0) { // // I2CInit is already called. // GnvsI2cBarAddr=GetI2cBarAddr(I2cControllerIndex); if((GnvsI2cBarAddr == 0)||(GnvsI2cBarAddr == mI2CBaseAddress)) { DEBUG((EFI_D_INFO,"I2CInit Exit with mI2CBaseAddress:%x == [%x].Bar0\r\n",mI2CBaseAddress,I2cControllerIndex+1)); return RETURN_SUCCESS; } } Status=ProgramPciLpssI2C(I2cControllerIndex); if(Status!=EFI_SUCCESS) { return Status; } mI2CBaseAddress = (UINT32) mLpssPciDeviceList[I2cControllerIndex + 1].Bar0; DEBUG ((EFI_D_ERROR, "mI2CBaseAddress = 0x%x \n",mI2CBaseAddress)); // // 1 seconds. // NumTries = 10000; while ((1 == ( MmioRead32 ( mI2CBaseAddress + R_IC_STATUS) & STAT_MST_ACTIVITY ))) { MicroSecondDelay(10); NumTries --; if(0 == NumTries) { DEBUG((EFI_D_INFO, "Try timeout\r\n")); return RETURN_DEVICE_ERROR; } } Status = I2cDisable(); DEBUG((EFI_D_INFO, "I2cDisable Status = %r\r\n", Status)); I2cBusFrequencySet(400 * 1000); MmioWrite32(mI2CBaseAddress + R_IC_INTR_MASK, 0x0); if (0x7f < SlaveAddress ) SlaveAddress = ( SlaveAddress & 0x3ff ) | IC_TAR_10BITADDR_MASTER; MmioWrite32 ( mI2CBaseAddress + R_IC_TAR, (UINT16)SlaveAddress ); MmioWrite32 ( mI2CBaseAddress + R_IC_RX_TL, 0); MmioWrite32 ( mI2CBaseAddress + R_IC_TX_TL, 0 ); MmioWrite32 ( mI2CBaseAddress + R_IC_CON, mI2cMode); Status = I2cEnable(); DEBUG((EFI_D_INFO, "I2cEnable Status = %r\r\n", Status)); MmioRead32 ( mI2CBaseAddress + R_IC_CLR_TX_ABRT ); return EFI_SUCCESS; }