/** @file * * Copyright (c) 2021, Rockchip Limited. All rights reserved. * * SPDX-License-Identifier: BSD-2-Clause-Patent * **/ #include #include #include #include void DebugPrintHex(void *buf, UINT32 width, UINT32 len) { UINT32 i,j; UINT8 *p8 = (UINT8 *) buf; UINT16 *p16 = (UINT16 *) buf; UINT32 *p32 =(UINT32 *) buf; j = 0; for (i = 0; i < len; i++) { if (j == 0) { DebugPrint(DEBUG_ERROR, "%p + 0x%x:",buf, i * width); } if (width == 4) { DebugPrint(DEBUG_ERROR, "0x%08x,", p32[i]); } else if (width == 2) { DebugPrint(DEBUG_ERROR, "0x%04x,", p16[i]); } else { DebugPrint(DEBUG_ERROR, "0x%02x,", p8[i]); } if (++j >= (16/width)) { j = 0; DebugPrint(DEBUG_ERROR, "\n",""); } } DebugPrint(DEBUG_ERROR, "\n",""); } void EFIAPI DwEmmcDxeIoMux(void) { /* sdmmc0 iomux */ } void EFIAPI SdhciEmmcDxeIoMux(void) { /* sdmmc0 iomux */ BUS_IOC->GPIO2A_IOMUX_SEL_L = (0xFFFFUL << 16) | (0x1111); //EMMC_CMD,EMMC_CLKOUT,EMMC_DATASTROBE,EMMC_RSTN BUS_IOC->GPIO2D_IOMUX_SEL_L = (0xFFFFUL << 16) | (0x1111); //EMMC_D0,EMMC_D1,EMMC_D2,EMMC_D3 BUS_IOC->GPIO2D_IOMUX_SEL_H = (0xFFFFUL << 16) | (0x1111); //EMMC_D4,EMMC_D5,EMMC_D6,EMMC_D7 } #define NS_CRU_BASE 0xFD7C0000 #define CRU_CLKSEL_CON59 0x03EC #define CRU_CLKSEL_CON78 0x0438 void EFIAPI Rk806SpiIomux(void) { /* io mux */ //BUS_IOC->GPIO1A_IOMUX_SEL_H = (0xFFFFUL << 16) | 0x8888; //BUS_IOC->GPIO1B_IOMUX_SEL_L = (0x000FUL << 16) | 0x0008; PMU1_IOC->GPIO0A_IOMUX_SEL_H = (0x0FF0UL << 16) | 0x0110; PMU1_IOC->GPIO0B_IOMUX_SEL_L = (0xF0FFUL << 16) | 0x1011; MmioWrite32(NS_CRU_BASE + CRU_CLKSEL_CON59, (0x00C0UL << 16) | 0x0080); } void EFIAPI NorFspiIomux(void) { /* io mux */ MmioWrite32(NS_CRU_BASE + CRU_CLKSEL_CON78, (((0x3 << 12) | (0x3f << 6)) << 16) | (0x0 << 12) | (0x3f << 6)); #define FSPI_M1 #if defined(FSPI_M0) /*FSPI M0*/ BUS_IOC->GPIO2A_IOMUX_SEL_L = ((0xF << 0) << 16) | (2 << 0); //FSPI_CLK_M0 BUS_IOC->GPIO2D_IOMUX_SEL_L = (0xFFFFUL << 16) | (0x2222); //FSPI_D0_M0,FSPI_D1_M0,FSPI_D2_M0,FSPI_D3_M0 BUS_IOC->GPIO2D_IOMUX_SEL_H = ((0xF << 8) << 16) | (0x2 << 8); //FSPI_CS0N_M0 #elif defined(FSPI_M1) /*FSPI M1*/ BUS_IOC->GPIO2A_IOMUX_SEL_H = (0xFF00UL << 16) | (0x3300); //FSPI_D0_M1,FSPI_D1_M1 BUS_IOC->GPIO2B_IOMUX_SEL_L = (0xF0FFUL << 16) | (0x3033); //FSPI_D2_M1,FSPI_D3_M1,FSPI_CLK_M1 BUS_IOC->GPIO2B_IOMUX_SEL_H = (0xF << 16) | (0x3); //FSPI_CS0N_M1 #else /*FSPI M2*/ BUS_IOC->GPIO3A_IOMUX_SEL_L = (0xFFFFUL << 16) | (0x5555); //[FSPI_D0_M2-FSPI_D3_M2] BUS_IOC->GPIO3A_IOMUX_SEL_H = (0xF0UL << 16) | (0x50); //FSPI_CLK_M2 BUS_IOC->GPIO3C_IOMUX_SEL_H = (0xF << 16) | (0x2); //FSPI_CS0_M2 #endif } UINT32 EFIAPI I2cGetBase ( UINT32 id ) { UINT32 Base = 0; switch (id) { case 0: Base = 0xFD880000; break; case 1: Base = 0xFEA90000; /* io mux */ //BUS_IOC->GPIO0B_IOMUX_SEL_H = (0x0FF0UL << 16) | 0x0990; //PMU2_IOC->GPIO0B_IOMUX_SEL_H = (0x0FF0UL << 16) | 0x0880; break; case 2: Base = 0xFEAA0000; /* io mux */ BUS_IOC->GPIO0B_IOMUX_SEL_H = (0xF000UL << 16) | 0x9000; BUS_IOC->GPIO0C_IOMUX_SEL_L = (0x000FUL << 16) | 0x0009; PMU2_IOC->GPIO0B_IOMUX_SEL_H = (0xF000UL << 16) | 0x8000; PMU2_IOC->GPIO0C_IOMUX_SEL_L = (0x000FUL << 16) | 0x0008; break; case 3: Base = 0xFEAB0000; break; case 4: Base = 0xFEAC0000; break; case 5: Base = 0xFEAD0000; break; default: break; } return Base; } #define GPIO4_BASE 0xFEC50000 #define GPIO_SWPORT_DR_L 0x0000 #define GPIO_SWPORT_DDR_L 0x0008 void EFIAPI UsbPortPowerEnable (void) { MmioWrite32(GPIO4_BASE + GPIO_SWPORT_DR_L, (0x0100UL << 16) | 0x0100); MmioWrite32(GPIO4_BASE + GPIO_SWPORT_DDR_L, (0x0100UL << 16) | 0x0100); } void EFIAPI Usb2PhySuspend (void) { MmioWrite32(0xfd5d4008, 0x20000000); MmioWrite32(0xfd5d8008, 0x20000000); MmioWrite32(0xfd5dc008, 0x20000000); } void EFIAPI Usb2PhyResume (void) { MmioWrite32(0xfd5d4008, 0x20000000); MmioWrite32(0xfd5d8008, 0x20000000); MmioWrite32(0xfd5dc008, 0x20000000); MmioWrite32(0xfd7f0a10, 0x07000700); MmioWrite32(0xfd7f0a10, 0x07000000); } void EFIAPI Pcie30IoInit(void) { /* Set reset and power IO to gpio output mode */ MmioWrite32(0xFD5F808C, 0xf << (8 + 16)); /* gpio4b6 to gpio mode -> reset */ MmioWrite32(0xFEC50008, 0x40004000); /* output */ MmioWrite32(0xFD5F8070, 0xf << (12 + 16)); /* gpio3c3 to gpio mode -> power */ MmioWrite32(0xFEC4000c, 0x80008); /* output */ } void EFIAPI Pcie30PowerEn(void) { MmioWrite32(0xFEC40004, 0x80008); /* output high to enable power */ } void EFIAPI Pcie30PeReset(BOOLEAN enable) { if(enable) MmioWrite32(0xFEC50000, 0x40000000); /* output low */ else MmioWrite32(0xFEC50000, 0x40004000); /* output high */ }