#include "OB90A64M3.h"
#include "gpio.h"

volatile uint32_t g_GPIO0Interrupt;
volatile uint32_t g_GPIO1Interrupt;
volatile uint32_t g_GPIO2Interrupt;
volatile uint32_t g_GPIO3Interrupt;

void GPIO0_IRQHandler(void)
{
    g_GPIO0Interrupt = OB_GPIO0->IEST;
    OB_GPIO0->IESTC = g_GPIO0Interrupt;
}

void GPIO1_IRQHandler(void)
{
    g_GPIO1Interrupt = OB_GPIO1->IEST;
    OB_GPIO1->IESTC = g_GPIO1Interrupt;
}

void GPIO2_IRQHandler(void)
{
    g_GPIO2Interrupt = OB_GPIO2->IEST;
    OB_GPIO2->IESTC = g_GPIO2Interrupt;
}

void GPIO_SetPinMFType(OB_GPIO_Type* pGPIO, uint32_t nPinSel, uint32_t nMFType)
{
    if (pGPIO == OB_GPIO0)
    {
        if (nPinSel & GPIO_PIN0)
        {
            if (nMFType == GPIO_MF_ADC)
                pGPIO->MF0_b.PORT_0 = 2;

            else if (nMFType == GPIO_MF_PGA_I)
                pGPIO->MF0_b.PORT_0 = 3;
						
            else
                pGPIO->MF0_b.PORT_0 = 0;
        }

        else if (nPinSel & GPIO_PIN1)
        {
            if (nMFType == GPIO_MF_PGA_I)
                pGPIO->MF0_b.PORT_1 = 3;
            else
                pGPIO->MF0_b.PORT_1 = 0;
        }

        else if (nPinSel & GPIO_PIN2)
        {
            if (nMFType == GPIO_MF_PWMTM)
                pGPIO->MF0_b.PORT_2 = 1;
            else if (nMFType == GPIO_MF_ADC)
                pGPIO->MF0_b.PORT_2 = 2;
            else if (nMFType == GPIO_MF_TIMER16B1_CAP)
                pGPIO->MF0_b.PORT_2 = 4;
            else
                pGPIO->MF0_b.PORT_2 = 0;
        }

        else if (nPinSel & GPIO_PIN3)
        {
            if (nMFType == GPIO_MF_ADC)
                pGPIO->MF0_b.PORT_3 = 2;
            else if (nMFType == GPIO_MF_TIMER16B1_CAP)
                pGPIO->MF0_b.PORT_3 = 4;
            else
                pGPIO->MF0_b.PORT_3 = 0;
        }

        else if (nPinSel & GPIO_PIN4)
        {
            if (nMFType == GPIO_MF_PWMTM)
                pGPIO->MF0_b.PORT_4 = 1;
            else if (nMFType == GPIO_MF_ADC)
                pGPIO->MF0_b.PORT_4 = 2;
            else if (nMFType == GPIO_MF_ACMP_I)
                pGPIO->MF0_b.PORT_4 = 3;
            else if (nMFType == GPIO_MF_TIMER16B1_CAP)
                pGPIO->MF0_b.PORT_4 = 4;
            else
                pGPIO->MF0_b.PORT_4 = 0;
        }

        else if (nPinSel & GPIO_PIN5)
        {
            if (nMFType == GPIO_MF_ADC)
                pGPIO->MF0_b.PORT_5 = 2;
            else if (nMFType == GPIO_MF_ACMP_I)
                pGPIO->MF0_b.PORT_5 = 3;
            else if (nMFType == GPIO_MF_TIMER16B0_CAP)
                pGPIO->MF0_b.PORT_5 = 4;
            else
                pGPIO->MF0_b.PORT_5 = 0;
        }

        else if (nPinSel & GPIO_PIN6)
        {
            if (nMFType == GPIO_MF_ADC)
                pGPIO->MF0_b.PORT_6 = 2;
            else if (nMFType == GPIO_MF_ACMP_I)
                pGPIO->MF0_b.PORT_6 = 3;
            else if (nMFType == GPIO_MF_TIMER16B0_CAP)
                pGPIO->MF0_b.PORT_6 = 4;
            else
                pGPIO->MF0_b.PORT_6 = 0;
        }

        else if (nPinSel & GPIO_PIN7)
        {
            if (nMFType == GPIO_MF_ADC)
                pGPIO->MF0_b.PORT_7 = 2;
            else if (nMFType == GPIO_MF_ACMP_I)
                pGPIO->MF0_b.PORT_7 = 3;
            else if (nMFType == GPIO_MF_TIMER16B0_CAP)
                pGPIO->MF0_b.PORT_7 = 4;
            else
                pGPIO->MF0_b.PORT_7 = 0;
        }
    }
    //--------------------------------------------------------------------------------------------------------
    else if (pGPIO == OB_GPIO1)
    {
        if (nPinSel & GPIO_PIN0)
        {
            if (nMFType == GPIO_MF_ACMP_O)
                pGPIO->MF0_b.PORT_0 = 3;
            else if (nMFType == GPIO_MF_PGA_O)
                pGPIO->MF0_b.PORT_0 = 4;
            else
                pGPIO->MF0_b.PORT_0 = 0;
        }

        else if (nPinSel & GPIO_PIN1)
        {
            if (nMFType == GPIO_MF_PGA_I)
                pGPIO->MF0_b.PORT_1 = 3;
            else
                pGPIO->MF0_b.PORT_1 = 0;
        }

        else if (nPinSel & GPIO_PIN2)
        {
            if (nMFType == GPIO_MF_ADC)
                pGPIO->MF0_b.PORT_2 = 2;
            else if (nMFType == GPIO_MF_FAULT)
                pGPIO->MF0_b.PORT_2 = 5;
            else
                pGPIO->MF0_b.PORT_2 = 0;
        }

        else if (nPinSel & GPIO_PIN3)
        {
            if (nMFType == GPIO_MF_PWM)
                pGPIO->MF0_b.PORT_3 = 1;
            else
                pGPIO->MF0_b.PORT_3 = 0;
        }

        else if (nPinSel & GPIO_PIN4)
        {
            if (nMFType == GPIO_MF_PWM)
                pGPIO->MF0_b.PORT_4 = 1;
            else
                pGPIO->MF0_b.PORT_4 = 0;
        }

        else if (nPinSel & GPIO_PIN5)
        {
            if (nMFType == GPIO_MF_PWM)
                pGPIO->MF0_b.PORT_5 = 1;
            else
                pGPIO->MF0_b.PORT_5 = 0;
        }

        else if (nPinSel & GPIO_PIN6)
        {
            if (nMFType == GPIO_MF_PWM)
                pGPIO->MF0_b.PORT_6 = 1;
            else
                pGPIO->MF0_b.PORT_6 = 0;
        }

        else if (nPinSel & GPIO_PIN7)
        {
            if (nMFType == GPIO_MF_PWM)
                pGPIO->MF0_b.PORT_7 = 1;
            else
                pGPIO->MF0_b.PORT_7 = 0;
        }
        else if (nPinSel & GPIO_PIN8)
        {
            if (nMFType == GPIO_MF_PWM)
                pGPIO->MF1_b.PORT_8 = 1;
            else
                pGPIO->MF1_b.PORT_8 = 0;
        }
        else if (nPinSel & GPIO_PIN9)
        {
            if (nMFType == GPIO_MF_ADC)
                pGPIO->MF1_b.PORT_9 = 2;
            else
                pGPIO->MF1_b.PORT_9 = 0;
        }

        else if (nPinSel & GPIO_PIN10)
        {
            if (nMFType == GPIO_MF_PWMTM)
                pGPIO->MF1_b.PORT_10 = 1;
            else if (nMFType == GPIO_MF_ADC)
                pGPIO->MF1_b.PORT_10 = 2;
            else if (nMFType == GPIO_MF_TIMER16B1_CAP)
                pGPIO->MF1_b.PORT_10 = 4;
            else if (nMFType == GPIO_MF_FAULT)
                pGPIO->MF1_b.PORT_10 = 5;
            else
                pGPIO->MF1_b.PORT_10 = 0;
        }
    }
    //--------------------------------------------------------------------------------------------------------

    else if (pGPIO == OB_GPIO2)
    {
        if (nPinSel & GPIO_PIN0)
        {
            if (nMFType == GPIO_MF_ADC)
                pGPIO->MF0_b.PORT_0 = 2;
            else if (nMFType == GPIO_MF_PGA_I)
                pGPIO->MF0_b.PORT_0 = 3;
            else
                pGPIO->MF0_b.PORT_0 = 0;
        }

        else if (nPinSel & GPIO_PIN1)
        {
            if((nMFType == GPIO_MF_SPI_MASTER_MISO) || (nMFType == GPIO_MF_SPI_SLAVE_MISO ))
                pGPIO->MF0_b.PORT_1 = 1;
            else if (nMFType == GPIO_MF_ACMP_O)
                pGPIO->MF0_b.PORT_1 = 3;
            else if (nMFType == GPIO_MF_PGA_O)
                pGPIO->MF0_b.PORT_1 = 4;
            else
                pGPIO->MF0_b.PORT_1 = 0;
        }

       else if (nPinSel & GPIO_PIN2)
        {
            if( (nMFType == GPIO_MF_SPI_MASTER_SS )|| (nMFType == GPIO_MF_SPI_SLAVE_SS ))
                pGPIO->MF0_b.PORT_2 = 1;
            else if (nMFType == GPIO_MF_PGA_I)
                pGPIO->MF0_b.PORT_2 = 3;
            else
                pGPIO->MF0_b.PORT_2 = 0;
        }

        else if (nPinSel & GPIO_PIN3)
        {
            if ((nMFType == GPIO_MF_SPI_MASTER_CLK) || (nMFType == GPIO_MF_SPI_SLAVE_CLK) )
                pGPIO->MF0_b.PORT_3 = 1;
            else if (nMFType == GPIO_MF_ADC)
                pGPIO->MF0_b.PORT_3 = 2;
            else if (nMFType == GPIO_MF_PGA_I)
                pGPIO->MF0_b.PORT_3 = 3;
            else
                pGPIO->MF0_b.PORT_3 = 0;
        }

        else if (nPinSel & GPIO_PIN4)
        {
            if ((nMFType == GPIO_MF_SPI_MASTER_MOSI) || (nMFType == GPIO_MF_SPI_SLAVE_MOSI) )
                pGPIO->MF0_b.PORT_4 = 1;
            else if (nMFType == GPIO_MF_PGA_O)
                pGPIO->MF0_b.PORT_4 = 4;
            else
                pGPIO->MF0_b.PORT_4 = 0;
        }
        else if (nPinSel & GPIO_PIN5)
        {
            OB_SYSCON->CPUCHIPCTR0 = OB_SYSCON->CPUCHIPCTR0 & 0xFFFFFFFD;
            if (nMFType == GPIO_MF_SWD)
            {
                OB_SYSCON->CPUCHIPCTR0 = OB_SYSCON->CPUCHIPCTR0 | 0x02;
                pGPIO->MF0_b.PORT_5 = 0;
            }
            else if (nMFType == GPIO_MF_ADC)
                pGPIO->MF0_b.PORT_5 = 2;
            else if (nMFType == GPIO_MF_PWMTM)
                pGPIO->MF0_b.PORT_5 = 3;						
            else if (nMFType == GPIO_MF_TIMER16B1_CAP)
                pGPIO->MF0_b.PORT_5 = 4;
            else if (nMFType == GPIO_MF_UART0_TX)
                pGPIO->MF0_b.PORT_5 = 5;
            else if (nMFType == GPIO_MF_I2C0_SCL)
                pGPIO->MF0_b.PORT_5 = 6;
            else
                pGPIO->MF0_b.PORT_5 = 0;
        }


        else if (nPinSel & GPIO_PIN6)
        {
            OB_SYSCON->CPUCHIPCTR0 = OB_SYSCON->CPUCHIPCTR0 & 0xFFFFFFFD;

            if (nMFType == GPIO_MF_SWD)
            {
                OB_SYSCON->CPUCHIPCTR0 = OB_SYSCON->CPUCHIPCTR0 | 0x02;
                pGPIO->MF0_b.PORT_6 = 0;
            }
						else if (nMFType == GPIO_MF_ACMP_I)
                pGPIO->MF0_b.PORT_6 = 2;
            else if (nMFType == GPIO_MF_TIMER16B1_CAP)
                pGPIO->MF0_b.PORT_6 = 4;
            else if (nMFType == GPIO_MF_UART0_RX)
                pGPIO->MF0_b.PORT_6 = 5;
            else if (nMFType == GPIO_MF_I2C0_SDA)
                pGPIO->MF0_b.PORT_6 = 6;
            else
                pGPIO->MF0_b.PORT_6 = 0;
        }

        else if (nPinSel & GPIO_PIN7)
        {
            if ((nMFType == GPIO_MF_SPI_MASTER_SS) || (nMFType == GPIO_MF_SPI_SLAVE_SS))
                pGPIO->MF0_b.PORT_7 = 1;
						else if (nMFType == GPIO_MF_ACMP_I)
                pGPIO->MF0_b.PORT_7 = 2;
            else if (nMFType == GPIO_MF_FAULT)
                pGPIO->MF0_b.PORT_7 = 4;
            else if (nMFType == GPIO_MF_UART0_RX)
                pGPIO->MF0_b.PORT_7 = 5;
            else if (nMFType == GPIO_MF_I2C0_SDA)
                pGPIO->MF0_b.PORT_7 = 6;
            else
                pGPIO->MF0_b.PORT_7 = 0;
        }

        else if (nPinSel & GPIO_PIN8)
        {
            if ( (nMFType == GPIO_MF_SPI_MASTER_CLK) || (nMFType == GPIO_MF_SPI_SLAVE_CLK))
                pGPIO->MF1_b.PORT_8 = 1;
						else if (nMFType == GPIO_MF_ACMP_I)
                pGPIO->MF1_b.PORT_8 = 2;	
            else if (nMFType == GPIO_MF_PWMTM)
                pGPIO->MF1_b.PORT_8 = 3;
            else if (nMFType == GPIO_MF_TIMER16B1_CAP)
                pGPIO->MF1_b.PORT_8 = 4;
            else if (nMFType == GPIO_MF_UART0_TX)
                pGPIO->MF1_b.PORT_8 = 5;
            else if (nMFType == GPIO_MF_I2C0_SCL)
                pGPIO->MF1_b.PORT_8 = 6;
            else
                pGPIO->MF1_b.PORT_8 = 0;
        }

        else if (nPinSel & GPIO_PIN9)
        {
            OB_SYSCON->USRFLSHCTR0 = (OB_SYSCON->USRFLSHCTR0 & 0xFF00FFFF) | (0x5A << 16);
            if (nMFType == GPIO_MF_RESET)
            {
                OB_SYSCON->USRFLSHCTR0 = OB_SYSCON->USRFLSHCTR0 | 0x00FF0000;
                pGPIO->MF1_b.PORT_9 = 0;
            }
            else if ( (nMFType == GPIO_MF_SPI_MASTER_MOSI) || (nMFType == GPIO_MF_SPI_SLAVE_MOSI))
                pGPIO->MF1_b.PORT_9 = 1;
            else if (nMFType == GPIO_MF_ACMP_I)
                pGPIO->MF1_b.PORT_9 = 2;
            else if (nMFType == GPIO_MF_PWMTM)
                pGPIO->MF1_b.PORT_9 = 3;
            else if (nMFType == GPIO_MF_UART0_TX)
                pGPIO->MF1_b.PORT_9 = 5;
            else if (nMFType == GPIO_MF_I2C0_SCL)
                pGPIO->MF1_b.PORT_9 = 6;
            else
                pGPIO->MF1_b.PORT_9 = 0;
        }
        else if (nPinSel & GPIO_PIN10)
        {
            if ( (nMFType == GPIO_MF_SPI_MASTER_MISO) || (nMFType == GPIO_MF_SPI_SLAVE_MISO))
                pGPIO->MF1_b.PORT_10 = 1;
            else if (nMFType == GPIO_MF_INTERNAL_VOLTAGE)
                pGPIO->MF1_b.PORT_10 = 3;
            else if (nMFType == GPIO_MF_UART0_RX)
                pGPIO->MF1_b.PORT_10 = 5;
            else if (nMFType == GPIO_MF_I2C0_SDA)
                    pGPIO->MF1_b.PORT_10 = 6;
            else
                pGPIO->MF1_b.PORT_10 = 0;
        }
    }
    //-------------------------------------------------------------------------------------


    GPIO_SetFunMode(pGPIO,  nPinSel, nMFType);
}

void GPIO_SetPinMode(OB_GPIO_Type* pGPIO, uint32_t nPinSel, uint32_t nPINMODE)
{
    if (nPinSel & GPIO_PIN0)
        pGPIO->MODE_b.MODEPIN0 = nPINMODE;

    else if (nPinSel & GPIO_PIN1)
        pGPIO->MODE_b.MODEPIN1 = nPINMODE;

    else if (nPinSel & GPIO_PIN2)
        pGPIO->MODE_b.MODEPIN2 = nPINMODE;

    else if (nPinSel & GPIO_PIN3)
        pGPIO->MODE_b.MODEPIN3 = nPINMODE;

    else if (nPinSel & GPIO_PIN4)
        pGPIO->MODE_b.MODEPIN4 = nPINMODE;

    else if (nPinSel & GPIO_PIN5)
        pGPIO->MODE_b.MODEPIN5 = nPINMODE;

    else if (nPinSel & GPIO_PIN6)
        pGPIO->MODE_b.MODEPIN6 = nPINMODE;

    else if (nPinSel & GPIO_PIN7)
        pGPIO->MODE_b.MODEPIN7 = nPINMODE;

    else if (nPinSel & GPIO_PIN8)
        pGPIO->MODE_b.MODEPIN8 = nPINMODE;

    else if (nPinSel & GPIO_PIN9)
        pGPIO->MODE_b.MODEPIN9 = nPINMODE;

    else if (nPinSel & GPIO_PIN10)
        pGPIO->MODE_b.MODEPIN10 = nPINMODE;

    else if (nPinSel & GPIO_PIN11)
        pGPIO->MODE_b.MODEPIN11 = nPINMODE;

    else if (nPinSel & GPIO_PIN12)
        pGPIO->MODE_b.MODEPIN12 = nPINMODE;

    else if (nPinSel & GPIO_PIN13)
        pGPIO->MODE_b.MODEPIN13 = nPINMODE;

    else if (nPinSel & GPIO_PIN14)
        pGPIO->MODE_b.MODEPIN14 = nPINMODE;

    else if (nPinSel & GPIO_PIN15)
        pGPIO->MODE_b.MODEPIN15 = nPINMODE;
}

void GPIO_EnableINT(OB_GPIO_Type* pGPIO, uint32_t nPinSel, uint32_t nINTMODE)
{
    if (pGPIO == OB_GPIO0)
        NVIC_EnableIRQ(GPIO0_IRQn);
    else if (pGPIO == OB_GPIO1)
        NVIC_EnableIRQ(GPIO1_IRQn);
    else if (pGPIO == OB_GPIO2)
        NVIC_EnableIRQ(GPIO2_IRQn);
    // IEENS0
    if (nPinSel & GPIO_PIN0)
        pGPIO->IEENS0_b.GPIOXIEENS0 = nINTMODE;

    else if (nPinSel & GPIO_PIN1)
        pGPIO->IEENS0_b.GPIOXIEENS1 = nINTMODE;

    else if (nPinSel & GPIO_PIN2)
        pGPIO->IEENS0_b.GPIOXIEENS2 = nINTMODE;

    else if (nPinSel & GPIO_PIN3)
        pGPIO->IEENS0_b.GPIOXIEENS3 = nINTMODE;

    else if (nPinSel & GPIO_PIN4)
        pGPIO->IEENS0_b.GPIOXIEENS4 = nINTMODE;

    else if (nPinSel & GPIO_PIN5)
        pGPIO->IEENS0_b.GPIOXIEENS5 = nINTMODE;

    else if (nPinSel & GPIO_PIN6)
        pGPIO->IEENS0_b.GPIOXIEENS6 = nINTMODE;

    else if (nPinSel & GPIO_PIN7)
        pGPIO->IEENS0_b.GPIOXIEENS7 = nINTMODE;

    // IEENS1
    else if (nPinSel & GPIO_PIN8)
        pGPIO->IEENS1_b.GPIOXIEENS8 = nINTMODE;

    else if (nPinSel & GPIO_PIN9)
        pGPIO->IEENS1_b.GPIOXIEENS9 = nINTMODE;

    else if (nPinSel & GPIO_PIN10)
        pGPIO->IEENS1_b.GPIOXIEENS10 = nINTMODE;

    else if (nPinSel & GPIO_PIN11)
        pGPIO->IEENS1_b.GPIOXIEENS11 = nINTMODE;

    else if (nPinSel & GPIO_PIN12)
        pGPIO->IEENS1_b.GPIOXIEENS12 = nINTMODE;

    else if (nPinSel & GPIO_PIN13)
        pGPIO->IEENS1_b.GPIOXIEENS13 = nINTMODE;

    else if (nPinSel & GPIO_PIN14)
        pGPIO->IEENS1_b.GPIOXIEENS14 = nINTMODE;

    else if (nPinSel & GPIO_PIN15)
        pGPIO->IEENS1_b.GPIOXIEENS15 = nINTMODE;
}

void GPIO_EnablePinINTDebounce(OB_GPIO_Type* pGPIO, uint32_t nPinSel)
{
    pGPIO->IDBEN = pGPIO->IDBEN | nPinSel;
}

void GPIO_DisablePinINTDebounce(OB_GPIO_Type* pGPIO, uint32_t nPinSel)
{
    pGPIO->IDBEN = (pGPIO->IDBEN & (0xFFFFFFFF ^ nPinSel));
}

void GPIO_SetINTDebounce(OB_GPIO_Type* pGPIO, uint32_t nDebounce)
{
    pGPIO->IDBCU = nDebounce;
}

uint32_t GPIO_GetINTStatus(OB_GPIO_Type* pGPIO, uint32_t nPinSel)
{
    uint32_t nResult = (pGPIO->IEST & nPinSel);

    if (nResult > 0)
        return 1;

    return 0;
}

void GPIO_ClearINTStatus(OB_GPIO_Type* pGPIO, uint32_t nPinSel)
{
    pGPIO->IESTC = nPinSel;
}

void GPIO_SetTADC0(OB_GPIO_Type* pGPIO, uint32_t nPinSel, uint32_t nTADCMode)
{
    // TADC0S0
    if (nPinSel & GPIO_PIN0)
        pGPIO->TADC0S0_b.GPIOXTADCS0 = nTADCMode;

    else if (nPinSel & GPIO_PIN1)
        pGPIO->TADC0S0_b.GPIOXTADCS1 = nTADCMode;

    else if (nPinSel & GPIO_PIN2)
        pGPIO->TADC0S0_b.GPIOXTADCS2 = nTADCMode;

    else if (nPinSel & GPIO_PIN3)
        pGPIO->TADC0S0_b.GPIOXTADCS3 = nTADCMode;

    else if (nPinSel & GPIO_PIN4)
        pGPIO->TADC0S0_b.GPIOXTADCS4 = nTADCMode;

    else if (nPinSel & GPIO_PIN5)
        pGPIO->TADC0S0_b.GPIOXTADCS5 = nTADCMode;

    else if (nPinSel & GPIO_PIN6)
        pGPIO->TADC0S0_b.GPIOXTADCS6 = nTADCMode;

    else if (nPinSel & GPIO_PIN7)
        pGPIO->TADC0S0_b.GPIOXTADCS7 = nTADCMode;

    // TADC0S1
    else if (nPinSel & GPIO_PIN8)
        pGPIO->TADC0S1_b.GPIOXTADCS8 = nTADCMode;

    else if (nPinSel & GPIO_PIN9)
        pGPIO->TADC0S1_b.GPIOXTADCS9 = nTADCMode;

    else if (nPinSel & GPIO_PIN10)
        pGPIO->TADC0S1_b.GPIOXTADCS10 = nTADCMode;

    else if (nPinSel & GPIO_PIN11)
        pGPIO->TADC0S1_b.GPIOXTADCS11 = nTADCMode;

    else if (nPinSel & GPIO_PIN12)
        pGPIO->TADC0S1_b.GPIOXTADCS12 = nTADCMode;

    else if (nPinSel & GPIO_PIN13)
        pGPIO->TADC0S1_b.GPIOXTADCS13 = nTADCMode;

    else if (nPinSel & GPIO_PIN14)
        pGPIO->TADC0S1_b.GPIOXTADCS14 = nTADCMode;

    else if (nPinSel & GPIO_PIN15)
        pGPIO->TADC0S1_b.GPIOXTADCS15 = nTADCMode;
}

void GPIO_SetFunMode(OB_GPIO_Type* pGPIO, uint32_t nPinSel, uint32_t nFuSel)
{
    uint32_t Mode = 0x00;
    switch(nFuSel)
    {
        case GPIO_MF_TYPE_GPIO:
            break;

        case GPIO_MF_TIMER16B0_CAP:
        case GPIO_MF_TIMER16B1_CAP:
            Mode = GPIO_PINMODE_INPUT;
            break;

        case GPIO_MF_ACMP_O:
        case GPIO_MF_PGA_O:
            Mode = GPIO_PINMODE_PUSH_PULL;
            break;

        case GPIO_MF_ACMP_I:
        case GPIO_MF_PGA_I:
            Mode = GPIO_PINMODE_INPUT;
            break;

        case GPIO_MF_I2C0_SCL:
        case GPIO_MF_I2C0_SDA:
            Mode = GPIO_PINMODE_OPEN_DRAIN;
            break;

        case GPIO_MF_UART0_RX:
            Mode = GPIO_PINMODE_INPUT;
            break;

        case GPIO_MF_UART0_TX:
            Mode = GPIO_PINMODE_PUSH_PULL;
            break;

        case GPIO_MF_FAULT:
            Mode = GPIO_PINMODE_INPUT;
            break;

        case GPIO_MF_SPI_MASTER_SS:
        case GPIO_MF_SPI_MASTER_MOSI:
        case GPIO_MF_SPI_MASTER_MISO:
        case GPIO_MF_SPI_MASTER_CLK:
            Mode = GPIO_PINMODE_PULL_UP;
            break;

        case GPIO_MF_SPI_SLAVE_SS:
        case GPIO_MF_SPI_SLAVE_CLK:
        case GPIO_MF_SPI_SLAVE_MOSI:
        case GPIO_MF_SPI_SLAVE_MISO:
            Mode = GPIO_PINMODE_PULL_UP;
            break;

        case GPIO_MF_PWM:
        case GPIO_MF_PWMTM:
            Mode = GPIO_PINMODE_PUSH_PULL;
            break;

        case GPIO_MF_ADC:
            Mode = GPIO_PINMODE_INPUT;
            break;

        default:
            break;
    }
    GPIO_SetPinMode( pGPIO, nPinSel, Mode);
}
