#include "r_typedefs.h" #include "dr7f701684.dvf.h" #include "GPIO.h" /*-----------------use for RH850_F1KM_S1 --------------------*/ #define GPIO_STB_PROTECTED_WRITE(preg, pstatus, reg, value) \ do \ { \ (preg) = 0xA5U; \ (reg) = (value); \ (reg) = ~(value); \ (reg) = (value); \ } while ((pstatus) == 1U) #define GPIO_PORTN_BASE_ADDRESS 0xFFC10000UL typedef enum { GPIO_REG_PMC = 0U, GPIO_REG_PIPC, GPIO_REG_PM, GPIO_REG_PIBC, GPIO_REG_PFC, GPIO_REG_PFCE, GPIO_REG_PFCAE, GPIO_REG_PBDC, GPIO_REG_P, GPIO_REG_PU, GPIO_REG_PD, GPIO_REG_PDSC, GPIO_REG_PODC, GPIO_REG_PIS, GPIO_REG_PPCMD, GPIO_REG_PPROTS, } GPIO_Register_en_t; const uint16_t g_u16GPIOConfigArray[56U][2U] = { {0x0000u, 0x0000u}, {0x0000u, 0x0000u}, {0x0000u, 0x0000u}, {0x0000u, 0x0000u}, {0x0000u, 0x0000u}, {0x0000u, 0x0000u}, {0x0000u, 0x0000u}, {0x000Fu, 0x000Fu}, {0x1860u, 0x0000u}, {0x2070u, 0x0000u}, {0x679Fu, 0x7FFFu}, {0x0000u, 0x0000u}, {0x0000u, 0x0000u}, {0x0000u, 0x0000u}, {0x0000u, 0x0000u}, {0x0000u, 0x0000u}, {0x0000u, 0x0000u}, {0x0FFFu, 0x0000u}, {0x0000u, 0x0000u}, {0x0800u, 0x0000u}, {0x1FFFu, 0x1FFFu}, {0x0000u, 0x0000u}, {0x0000u, 0x0000u}, {0x0000u, 0x0000u}, {0x0000u, 0x0000u}, {0x0000u, 0x0000u}, {0x0000u, 0x0000u}, {0x0000u, 0x0000u}, {0x0000u, 0x0000u}, {0x003Bu, 0x0000u}, {0x007Fu, 0x007Fu}, {0x0000u, 0x0000u}, {0x0000u, 0x0000u}, {0x0000u, 0x0000u}, {0x4000u, 0x0000u}, {0x4000u, 0x0000u}, {0x0000u, 0x0000u}, {0x0000u, 0x0000u}, {0x4050u, 0x0000u}, {0x4010u, 0x0000u}, {0xBEEEu, 0x0000u}, {0xBFEFu, 0xFFFFu}, {0x0000u, 0x0000u}, {0x0000u, 0x0000u}, {0x0000u, 0x0000u}, {0x0000u, 0x0000u}, {0x0000u, 0x0000u}, {0x0000u, 0x0000u}, {0x0000u, 0x0000u}, {0x00FDu, 0x0000u}, {0x0000u, 0x0000u}, {0x0000u, 0x0000u}, {0x00FFu, 0x00FFu}, {0x0000u, 0x0000u}, {0x0201u, 0x0000u}, {0xFFFFu, 0xFFFFu}, }; static void GPIO_PIN_Init(GPIO_Config_Mode_en_t enGPIOConfigMode) { PORTPIBC0 = 0X0UL; PORTPIBC8 = 0X0UL; PORTPIBC9 = 0X0UL; PORTPIBC10 = 0X0UL; PORTPIBC11 = 0X0UL; PORTAPIBC0 = 0X0UL; PORTPBDC0 = 0X0UL; PORTPBDC8 = 0X0UL; PORTPBDC9 = 0X0UL; PORTPBDC10 = 0X0UL; PORTPBDC11 = 0X0UL; PORTAPBDC0 = 0X0UL; PORTPM0 = 0XFFFFUL; PORTPM8 = 0XFFFFUL; PORTPM9 = 0XFFFFUL; PORTPM10 = 0XFFFFUL; PORTPM11 = 0XFFFFUL; PORTAPM0 = 0XFFFFUL; PORTPMC0 = 0X0UL; PORTPMC8 = 0X0UL; PORTPMC9 = 0X0UL; PORTPMC10 = 0X0UL; PORTPMC11 = 0X0UL; PORTPIPC0 = 0X0UL; PORTPIPC10 = 0X0UL; PORTPIPC11 = 0X0UL; PORTPODC0 = 0X0UL; PORTPODC8 = 0X0UL; PORTPODC9 = 0X0UL; PORTPODC10 = 0X0UL; PORTPODC11 = 0X0UL; /******************************/ PORTPU0 = g_u16GPIOConfigArray[0U][enGPIOConfigMode]; PORTPD0 = g_u16GPIOConfigArray[1U][enGPIOConfigMode]; PORTPIS0 = g_u16GPIOConfigArray[2U][enGPIOConfigMode]; PORTPFC0 = g_u16GPIOConfigArray[3U][enGPIOConfigMode]; PORTPFCE0 = g_u16GPIOConfigArray[4U][enGPIOConfigMode]; PORTPFCAE0 = g_u16GPIOConfigArray[5U][enGPIOConfigMode]; PORTPIPC0 = g_u16GPIOConfigArray[6U][enGPIOConfigMode]; PORTP0 = g_u16GPIOConfigArray[7U][enGPIOConfigMode]; PORTPMC0 = g_u16GPIOConfigArray[8U][enGPIOConfigMode]; PORTPM0 = g_u16GPIOConfigArray[9U][enGPIOConfigMode]; PORTPIBC0 = g_u16GPIOConfigArray[10U][enGPIOConfigMode]; PORTPU8 = g_u16GPIOConfigArray[11U][enGPIOConfigMode]; PORTPD8 = g_u16GPIOConfigArray[12U][enGPIOConfigMode]; PORTPIS8 = g_u16GPIOConfigArray[13U][enGPIOConfigMode]; PORTPFC8 = g_u16GPIOConfigArray[14U][enGPIOConfigMode]; PORTPFCE8 = g_u16GPIOConfigArray[15U][enGPIOConfigMode]; PORTPFCAE8 = g_u16GPIOConfigArray[16U][enGPIOConfigMode]; PORTP8 = g_u16GPIOConfigArray[17U][enGPIOConfigMode]; PORTPMC8 = g_u16GPIOConfigArray[18U][enGPIOConfigMode]; PORTPM8 = g_u16GPIOConfigArray[19U][enGPIOConfigMode]; PORTPIBC8 = g_u16GPIOConfigArray[20U][enGPIOConfigMode]; PORTPU9 = g_u16GPIOConfigArray[21U][enGPIOConfigMode]; PORTPD9 = g_u16GPIOConfigArray[22U][enGPIOConfigMode]; PORTPIS9 = g_u16GPIOConfigArray[23U][enGPIOConfigMode]; PORTPFC9 = g_u16GPIOConfigArray[24U][enGPIOConfigMode]; PORTPFCE9 = g_u16GPIOConfigArray[25U][enGPIOConfigMode]; PORTPFCAE9 = g_u16GPIOConfigArray[26U][enGPIOConfigMode]; PORTP9 = g_u16GPIOConfigArray[27U][enGPIOConfigMode]; PORTPMC9 = g_u16GPIOConfigArray[28U][enGPIOConfigMode]; PORTPM9 = g_u16GPIOConfigArray[29U][enGPIOConfigMode]; PORTPIBC9 = g_u16GPIOConfigArray[30U][enGPIOConfigMode]; PORTPU10 = g_u16GPIOConfigArray[31U][enGPIOConfigMode]; PORTPD10 = g_u16GPIOConfigArray[32U][enGPIOConfigMode]; PORTPIS10 = g_u16GPIOConfigArray[33U][enGPIOConfigMode]; PORTPFC10 = g_u16GPIOConfigArray[34U][enGPIOConfigMode]; PORTPFCE10 = g_u16GPIOConfigArray[35U][enGPIOConfigMode]; PORTPFCAE10 = g_u16GPIOConfigArray[36U][enGPIOConfigMode]; PORTPIPC10 = g_u16GPIOConfigArray[37U][enGPIOConfigMode]; PORTP10 = g_u16GPIOConfigArray[38U][enGPIOConfigMode]; PORTPMC10 = g_u16GPIOConfigArray[39U][enGPIOConfigMode]; PORTPM10 = g_u16GPIOConfigArray[40U][enGPIOConfigMode]; PORTPIBC10 = g_u16GPIOConfigArray[41U][enGPIOConfigMode]; PORTPU11 = g_u16GPIOConfigArray[42U][enGPIOConfigMode]; PORTPD11 = g_u16GPIOConfigArray[43U][enGPIOConfigMode]; PORTPIS11 = g_u16GPIOConfigArray[44U][enGPIOConfigMode]; PORTPFC11 = g_u16GPIOConfigArray[45U][enGPIOConfigMode]; PORTPFCE11 = g_u16GPIOConfigArray[46U][enGPIOConfigMode]; PORTPFCAE11 = g_u16GPIOConfigArray[47U][enGPIOConfigMode]; PORTPIPC11 = g_u16GPIOConfigArray[48U][enGPIOConfigMode]; PORTP11 = g_u16GPIOConfigArray[49U][enGPIOConfigMode]; PORTPMC11 = g_u16GPIOConfigArray[50U][enGPIOConfigMode]; PORTPM11 = g_u16GPIOConfigArray[51U][enGPIOConfigMode]; PORTPIBC11 = g_u16GPIOConfigArray[52U][enGPIOConfigMode]; PORTAP0 = g_u16GPIOConfigArray[53U][enGPIOConfigMode]; PORTAPM0 = g_u16GPIOConfigArray[54U][enGPIOConfigMode]; PORTAPIBC0 = g_u16GPIOConfigArray[55U][enGPIOConfigMode]; } void GPIO_Init(GPIO_Config_Mode_en_t enGPIOConfigMode) { if (enGPIOConfigMode == GPIO_WAKEUP_MODE) { GPIO_PIN_Init(GPIO_WAKEUP_MODE); /*port buffer exit hold state*/ GPIO_STB_PROTECTED_WRITE(WPROTRPROTCMD0, WPROTRPROTS0, STBC_IOHOLDIOHOLD, 0x00U); } else { GPIO_PIN_Init(GPIO_SLEEP_MODE); } } static uint32_t GPIO_Get_Wake_Bit(GPIO_Wakeup_PIN_en_t enGPIOWakeupPIN) { uint32_t u32GPIOWakeBit = 0UL; switch (enGPIOWakeupPIN) { case GPIO_WAKEUP_PIN_P0_1: { u32GPIOWakeBit = 0x20UL; break; } case GPIO_WAKEUP_PIN_P0_2: { u32GPIOWakeBit = 0x40UL; break; } case GPIO_WAKEUP_PIN_P0_3: { u32GPIOWakeBit = 0x1000UL; break; } case GPIO_WAKEUP_PIN_P0_4: { u32GPIOWakeBit = 0x2000UL; break; } /*case GPIO_WAKEUP_PIN_P0_5: */ case GPIO_WAKEUP_PIN_P0_6: { u32GPIOWakeBit = 0x80UL; break; } /*case GPIO_WAKEUP_PIN_P0_7: */ case GPIO_WAKEUP_PIN_P0_10: { u32GPIOWakeBit = 0x200UL; break; } case GPIO_WAKEUP_PIN_P0_9: { u32GPIOWakeBit = 0x400UL; break; } case GPIO_WAKEUP_PIN_P0_13: { u32GPIOWakeBit = 0x800UL; break; } case GPIO_WAKEUP_PIN_P8_2: { u32GPIOWakeBit = 0x100000UL; break; } case GPIO_WAKEUP_PIN_P8_3: { u32GPIOWakeBit = 0x200000UL; break; } case GPIO_WAKEUP_PIN_P8_4: { u32GPIOWakeBit = 0x400000UL; break; } default: break; } return (~u32GPIOWakeBit); } void GPIO_Wakeup_PIN_Set(GPIO_Wakeup_PIN_en_t enGPIOWakeupPIN, GPIO_Wakeup_Trigger_Mode_en_t enGPIOTrigger) { uint32_t u32GPIORegisterAddress = 0xFFC34020U + 0X4U * enGPIOWakeupPIN; uint32_t u32GPIORegisterValue = GPIO_Get_Wake_Bit(enGPIOWakeupPIN); /*trigger type*/ *(uint8_t *)u32GPIORegisterAddress = enGPIOTrigger; /*trigger PIN*/ STBC_WUF0WUFMSK0 &= u32GPIORegisterValue; } static uint32_t GPIO_Register_Address_Cal(GPIO_Port_en_t enGPIOPort, GPIO_Register_en_t enGPIORegister) { uint32_t u32GPIOAddress = 0UL; uint32_t u32GPIOAddressBase = GPIO_PORTN_BASE_ADDRESS + enGPIOPort * 4UL; switch (enGPIORegister) { case GPIO_REG_PMC: { u32GPIOAddress = 0X400UL; break; } case GPIO_REG_PIPC: { u32GPIOAddress = 0X4200UL; break; } case GPIO_REG_PM: { u32GPIOAddress = 0x300UL; break; } case GPIO_REG_PIBC: { u32GPIOAddress = 0x4000UL; break; } case GPIO_REG_PFC: { u32GPIOAddress = 0X500UL; break; } case GPIO_REG_PFCE: { u32GPIOAddress = 0X600UL; break; } case GPIO_REG_PFCAE: { u32GPIOAddress = 0XA00UL; break; } case GPIO_REG_PBDC: { u32GPIOAddress = 0X4100UL; break; } case GPIO_REG_P: { u32GPIOAddress = 0X000UL; break; } case GPIO_REG_PU: { u32GPIOAddress = 0X4300UL; break; } case GPIO_REG_PD: { u32GPIOAddress = 0X4400UL; break; } case GPIO_REG_PDSC: { u32GPIOAddress = 0X4600UL; break; } case GPIO_REG_PODC: { u32GPIOAddress = 0X4500UL; break; } case GPIO_REG_PIS: { u32GPIOAddress = 0X4700UL; break; } case GPIO_REG_PPCMD: { u32GPIOAddress = 0X4C00UL; break; } case GPIO_REG_PPROTS: { u32GPIOAddress = 0X4B00UL; break; } default: break; } u32GPIOAddress += u32GPIOAddressBase; return u32GPIOAddress; } void GPIO_Config(GPIO_Config_st_t *pstGPIOConfig) { uint32_t u32GPIORegisterAddress = 0UL; uint16_t u16GPIORegisterValue = 0U; uint32_t u32GPIORegisterAddress2 = 0UL; uint16_t u16GPIORegisterValue2 = 0U; uint32_t u32GPIORegisterAddress3 = 0UL; uint16_t u16GPIORegisterValue3 = 0U; uint16_t u16GPIOBitOr = (1U << pstGPIOConfig->enGPIOPIN); uint16_t u16GPIOBitAnd = ~u16GPIOBitOr; /**********************Port initialization*******************/ /*******PDSCn**Lower drive strength********/ /*******PODCn**Push-pull********/ /*******PBDCn**Bidirectional mode disabled********/ /*******PDn**PUn**********/ if (pstGPIOConfig->enGPIOPort != GPIO_PORT_GROUP_AP0) { u32GPIORegisterAddress = GPIO_Register_Address_Cal(pstGPIOConfig->enGPIOPort, GPIO_REG_PU); u16GPIORegisterValue = (*((uint16_t *)(u32GPIORegisterAddress))); u32GPIORegisterAddress2 = GPIO_Register_Address_Cal(pstGPIOConfig->enGPIOPort, GPIO_REG_PD); u16GPIORegisterValue2 = (*((uint16_t *)(u32GPIORegisterAddress2))); if (pstGPIOConfig->enGPIOPull == GPIO_PULL_UP) { u16GPIORegisterValue2 &= u16GPIOBitAnd; u16GPIORegisterValue |= u16GPIOBitOr; } else if (pstGPIOConfig->enGPIOPull == GPIO_PULL_DOWN) { u16GPIORegisterValue &= u16GPIOBitAnd; u16GPIORegisterValue2 |= u16GPIOBitOr; } else /*GPIO_PULL_NONE*/ { u16GPIORegisterValue &= u16GPIOBitAnd; u16GPIORegisterValue2 &= u16GPIOBitAnd; } (*((uint16_t *)(u32GPIORegisterAddress))) = u16GPIORegisterValue; (*((uint16_t *)(u32GPIORegisterAddress2))) = u16GPIORegisterValue2; } /********PISn*********/ if (pstGPIOConfig->enGPIOPort != GPIO_PORT_GROUP_AP0) { u32GPIORegisterAddress = GPIO_Register_Address_Cal(pstGPIOConfig->enGPIOPort, GPIO_REG_PIS); u16GPIORegisterValue = (*((uint16_t *)(u32GPIORegisterAddress))); if (pstGPIOConfig->enGPIOCharacter == GPIO_Char_Schmitt1) { u16GPIORegisterValue &= u16GPIOBitAnd; } else if (pstGPIOConfig->enGPIOCharacter == GPIO_Char_Schmitt4) { u16GPIORegisterValue |= u16GPIOBitOr; } (*((uint16_t *)(u32GPIORegisterAddress))) = u16GPIORegisterValue; } /******PFCn**PFCEn**PFCAEn*******/ if (pstGPIOConfig->enGPIOPort != GPIO_PORT_GROUP_AP0) { u32GPIORegisterAddress = GPIO_Register_Address_Cal(pstGPIOConfig->enGPIOPort, GPIO_REG_PFC); u16GPIORegisterValue = (*((uint16_t *)(u32GPIORegisterAddress))); u32GPIORegisterAddress2 = GPIO_Register_Address_Cal(pstGPIOConfig->enGPIOPort, GPIO_REG_PFCE); u16GPIORegisterValue2 = (*((uint16_t *)(u32GPIORegisterAddress2))); u32GPIORegisterAddress3 = GPIO_Register_Address_Cal(pstGPIOConfig->enGPIOPort, GPIO_REG_PFCAE); u16GPIORegisterValue3 = (*((uint16_t *)(u32GPIORegisterAddress3))); switch (pstGPIOConfig->enGPIOAltFun) { default: case GPIO_ALTER_FUN_1: { u16GPIORegisterValue &= u16GPIOBitAnd; u16GPIORegisterValue2 &= u16GPIOBitAnd; u16GPIORegisterValue3 &= u16GPIOBitAnd; break; } case GPIO_ALTER_FUN_2: { u16GPIORegisterValue |= u16GPIOBitOr; u16GPIORegisterValue2 &= u16GPIOBitAnd; u16GPIORegisterValue3 &= u16GPIOBitAnd; break; } case GPIO_ALTER_FUN_3: { u16GPIORegisterValue &= u16GPIOBitAnd; u16GPIORegisterValue2 |= u16GPIOBitOr; u16GPIORegisterValue3 &= u16GPIOBitAnd; break; } case GPIO_ALTER_FUN_4: { u16GPIORegisterValue |= u16GPIOBitOr; u16GPIORegisterValue2 |= u16GPIOBitOr; u16GPIORegisterValue3 &= u16GPIOBitAnd; break; } case GPIO_ALTER_FUN_5: { u16GPIORegisterValue &= u16GPIOBitAnd; u16GPIORegisterValue2 &= u16GPIOBitAnd; u16GPIORegisterValue3 |= u16GPIOBitOr; break; } case GPIO_ALTER_FUN_6: { u16GPIORegisterValue |= u16GPIOBitOr; u16GPIORegisterValue2 &= u16GPIOBitAnd; u16GPIORegisterValue3 |= u16GPIOBitOr; break; } case GPIO_ALTER_FUN_7: { u16GPIORegisterValue &= u16GPIOBitAnd; u16GPIORegisterValue2 |= u16GPIOBitOr; u16GPIORegisterValue3 |= u16GPIOBitOr; break; } } (*((uint16_t *)(u32GPIORegisterAddress))) = u16GPIORegisterValue; (*((uint16_t *)(u32GPIORegisterAddress2))) = u16GPIORegisterValue2; (*((uint16_t *)(u32GPIORegisterAddress3))) = u16GPIORegisterValue3; } /*******Pn**********/ u32GPIORegisterAddress = GPIO_Register_Address_Cal(pstGPIOConfig->enGPIOPort, GPIO_REG_P); u16GPIORegisterValue = (*((uint16_t *)(u32GPIORegisterAddress))); if (pstGPIOConfig->enGPIOOutputValue == GPIO_Level_High) { u16GPIORegisterValue |= u16GPIOBitOr; } else { u16GPIORegisterValue &= u16GPIOBitAnd; } (*((uint16_t *)(u32GPIORegisterAddress))) = u16GPIORegisterValue; /*****PMCn**PIPCn***PIBCn*******/ u32GPIORegisterAddress = GPIO_Register_Address_Cal(pstGPIOConfig->enGPIOPort, GPIO_REG_PMC); u16GPIORegisterValue = (*((uint16_t *)(u32GPIORegisterAddress))); u32GPIORegisterAddress2 = GPIO_Register_Address_Cal(pstGPIOConfig->enGPIOPort, GPIO_REG_PIPC); u16GPIORegisterValue2 = (*((uint16_t *)(u32GPIORegisterAddress2))); u32GPIORegisterAddress3 = GPIO_Register_Address_Cal(pstGPIOConfig->enGPIOPort, GPIO_REG_PIBC); u16GPIORegisterValue3 = (*((uint16_t *)(u32GPIORegisterAddress3))); if (pstGPIOConfig->enGPIOMode == GPIO_MODE_ALTER_DIRECT) { u16GPIORegisterValue |= u16GPIOBitOr; u16GPIORegisterValue2 |= u16GPIOBitOr; u16GPIORegisterValue3 &= u16GPIOBitAnd; } else if (pstGPIOConfig->enGPIOMode == GPIO_MODE_ALTER_SOFTWARE) { u16GPIORegisterValue |= u16GPIOBitOr; u16GPIORegisterValue2 &= u16GPIOBitAnd; u16GPIORegisterValue3 &= u16GPIOBitAnd; } else /*if (pstGPIOConfig->enGPIOMode==GPIO_MODE_PORT)*/ { u16GPIORegisterValue &= u16GPIOBitAnd; u16GPIORegisterValue2 &= u16GPIOBitAnd; u16GPIORegisterValue3 |= u16GPIOBitOr; } if (pstGPIOConfig->enGPIOPort != GPIO_PORT_GROUP_AP0) { (*((uint16_t *)(u32GPIORegisterAddress))) = u16GPIORegisterValue; } if ((pstGPIOConfig->enGPIOPort == GPIO_PORT_GROUP_0) || (pstGPIOConfig->enGPIOPort == GPIO_PORT_GROUP_10) || (pstGPIOConfig->enGPIOPort == GPIO_PORT_GROUP_11)) { (*((uint16_t *)(u32GPIORegisterAddress2))) = u16GPIORegisterValue2; } (*((uint16_t *)(u32GPIORegisterAddress3))) = u16GPIORegisterValue3; /***************PMn*****************/ u32GPIORegisterAddress = GPIO_Register_Address_Cal(pstGPIOConfig->enGPIOPort, GPIO_REG_PM); u16GPIORegisterValue = (*((uint16_t *)(u32GPIORegisterAddress))); if (pstGPIOConfig->enGPIODir == GPIO_DIR_IN) { u16GPIORegisterValue |= u16GPIOBitOr; } else { u16GPIORegisterValue &= u16GPIOBitAnd; } (*((uint16_t *)(u32GPIORegisterAddress))) = u16GPIORegisterValue; } void GPIO_SET_KEPP(void) { GPIO_STB_PROTECTED_WRITE(WPROTRPROTCMD0, WPROTRPROTS0, STBC_IOHOLDIOHOLD, 0x00U); }