Library designed as an interface to the mbed Pin Connect Block

PinConnectBlock.c

Committer:
Blaze513
Date:
2011-11-29
Revision:
2:ab6e423ac150
Parent:
0:1b1cf3daf204

File content as of revision 2:ab6e423ac150:

#include "PinConnectBlock.h"

unsigned char PinConnectBlock::ValidateInput(
    unsigned char Port, unsigned char Pin, unsigned char Mode)
{
    switch (Port)
    {
        case 0:
            if (Pin < 2)
            {
                return 0x00;
            }
            if ((Pin > 3) && (Pin < 12))
            {
                return 0x00;
            }
            if ((Pin > 14) && (Pin < 19))
            {
                return 0x00;
            }
            if ((Pin > 22) && (Pin < 27))
            {
                return 0x00;
            }
            if ((Mode & 0x03) != 0x03)
            {
                if (Pin < 4)
                {
                    return 0x00;
                }
                if ((Pin > 26) && (Pin < 29) && !(Mode & 0x1C))
                {
                    return 0x00;
                }
            }
            if ((Pin > 18) && (Pin < 23) && ((Mode & 0x03) != 0x02))
            {
                return 0x00;
            }
            if ((Pin > 28) && (Pin < 31) && !(Mode & 0x0E))
            {
                return 0x00;
            }
            if (Pin < 4)
            {
                return 0x0C;
            }
            if (Pin < 15)
            {
                return 0x02 | ((Mode & 0x03) ? 0x0C : 0x00)
                    | ((Mode & 0x0C) ? 0x14 : 0x00)
                    | ((Mode & 0x10) ? 0x24 : 0x00);
            }
            if (Pin < 23)
            {
                return 0x0C;
            }
            if (Pin < 29)
            {
                return (((Mode & 0x03) == 0x03) ? 0x0C : 0x00)
                    | ((Mode & 0x0C) ? 0x14 : 0x00)
                    | ((Mode & 0x10) ? 0x24 : 0x00);
            }
            if (Pin < 31)
            {
                return ((Mode & 0x02) ? 0x0C : 0x00)
                    | ((Mode & 0x0C) ? 0x14 : 0x00);
            }
            if (Pin > 30)
            {
                return 0x02 | ((Mode & 0x03) ? 0x0C : 0x00)
                    | ((Mode & 0x0C) ? 0x14 : 0x00)
                    | ((Mode & 0x10) ? 0x24 : 0x00);
            }
            break;
        case 1:
            if ((Pin > 17) && (Pin < 25))
            {
                return 0x00;
            }
            if ((Pin > 25) && (Pin < 30))
            {
                return 0x00;
            }
            if (!(Mode & 0x02))
            {
                if (Pin < 2)
                {
                    return 0x00;
                }
                if (Pin == 4)
                {
                    return 0x00;
                }
                if ((Pin > 7) && (Pin < 11))
                {
                    return 0x00;
                }
                if ((Pin > 13) && (Pin < 18))
                {
                    return 0x00;
                }
            }
            if ((Pin == 25) && ((Mode & 0x03) != 0x02))
            {
                return 0x00;
            }
            if ((Pin > 29) && (Pin < 32) && ((Mode & 0x03) != 0x01))
            {
                return 0x00;
            }
            if (Pin < 2)
            {
                return 0x0C;
            }
            if (Pin < 4)
            {
                return 0x02 | ((Mode & 0x03) ? 0x0C : 0x00)
                    | ((Mode & 0x0C) ? 0x14 : 0x00)
                    | ((Mode & 0x10) ? 0x24 : 0x00);
            }
            if (Pin == 4)
            {
                return 0x0C;
            }
            if (Pin < 8)
            {
                return 0x02 | ((Mode & 0x03) ? 0x0C : 0x00)
                    | ((Mode & 0x0C) ? 0x14 : 0x00)
                    | ((Mode & 0x10) ? 0x24 : 0x00);
            }
            if (Pin < 11)
            {
                return 0x0C;
            }
            if (Pin < 14)
            {
                return 0x02 | ((Mode & 0x03) ? 0x0C : 0x00)
                    | ((Mode & 0x0C) ? 0x14 : 0x00)
                    | ((Mode & 0x10) ? 0x24 : 0x00);
            }
            if (Pin < 18)
            {
                return 0x0C;
            }
            if ((Pin == 25) && ((Mode & 0x03) == 0x02))
            {
                return 0x0C;
            }
            if ((Pin > 29) && (Pin < 32) && ((Mode & 0x03) == 0x01))
            {
                return 0x0C;
            }
            if (Pin > 31)
            {
                return 0x02 | ((Mode & 0x03) ? 0x0C : 0x00)
                    | ((Mode & 0x0C) ? 0x14 : 0x00)
                    | ((Mode & 0x10) ? 0x24 : 0x00);
            }
            break;
        case 2:
            if ((Pin > 7) && (Pin < 10))
            {
                return 0x00;
            }
            if ((Pin < 11) && ((Mode & 0x03) != 0x03))
            {
                return 0x00;
            }
            if ((Pin > 10) && (Pin < 14) && ((Mode & 0x03) != 0x02))
            {
                return 0x00;
            }
            if (Pin < 14)
            {
                return 0x0C;
            }
            if (Pin > 13)
            {
                return 0x02 | ((Mode & 0x03) ? 0x0C : 0x00)
                    | ((Mode & 0x0C) ? 0x14 : 0x00)
                    | ((Mode & 0x10) ? 0x24 : 0x00);
            }
            break;
        case 3:
            if (Pin == 26)
            {
                return 0x00;
            }
            if ((Pin == 25) && ((Mode & 0x03) != 0x01))
            {
                return 0x00;
            }
            if (Pin < 25)
            {
                return 0x02 | ((Mode & 0x03) ? 0x0C : 0x00)
                    | ((Mode & 0x0C) ? 0x14 : 0x00)
                    | ((Mode & 0x10) ? 0x24 : 0x00);
            }
            if (Pin == 25)
            {
                return 0x0C;
            }
            if (Pin > 26)
            {
                return 0x02 | ((Mode & 0x03) ? 0x0C : 0x00)
                    | ((Mode & 0x0C) ? 0x14 : 0x00)
                    | ((Mode & 0x10) ? 0x24 : 0x00);
            }
            break;
        case 4:
            if ((Pin > 27) && (Pin < 30))
            {
                return 0x00;
            }
            if (Pin < 28)
            {
                return 0x02 | ((Mode & 0x03) ? 0x0C : 0x00)
                    | ((Mode & 0x0C) ? 0x14 : 0x00)
                    | ((Mode & 0x10) ? 0x24 : 0x00);
            }
            if (Pin > 29)
            {
                return 0x02 | ((Mode & 0x03) ? 0x0C : 0x00)
                    | ((Mode & 0x0C) ? 0x14 : 0x00)
                    | ((Mode & 0x10) ? 0x24 : 0x00);
            }
            break;
        default:
            return 0x01 | ((Pin > 31) ? 0x02 : 0x00)
                | ((Mode & 0x03) ? 0x0C : 0x00)
                | ((Mode & 0x0C) ? 0x14 : 0x00)
                | ((Mode & 0x10) ? 0x24 : 0x00);
    }
    return 0xFF;
}

void PinConnectBlock::SetPinConnection(
    unsigned char Port, unsigned char Pin, unsigned char Mode)
{
    if (!((Port == 1) && (Pin < 18) && (Mode & 0x02)))
    {
        SetFunctionMode(Port, Pin, Mode & 0x03);
    }
    if (!((Port == 0) && (Pin > 26)))
    {
        SetResistorMode(Port, Pin, (Mode & 0x0C) >> 2);
    }
    if (!((Port == 0) && (Pin > 26) && (Pin < 29)))
    {
        SetOpenDrainMode(Port, Pin, Mode & 0x10);
    }
    return;
}

unsigned char PinConnectBlock::GetPinConnection(
    unsigned char Port, unsigned char Pin)
{
    return GetFunctionMode(Port, Pin)
        | (GetResistorMode(Port, Pin) << 2)
        | (GetOpenDrainMode(Port, Pin) ? 0x10 : 0x00);
}

void PinConnectBlock::SetFunctionMode(
    unsigned char Port, unsigned char Pin, unsigned char Mode)
{
    Port *= 2;
    if (Pin >= 16)
    {
        Port++;
        Pin -= 16;
    }
    Pin *= 2;
    *((unsigned long*)&LPC_PINCON->PINSEL0 + Port)
        &= ~(0x00000003 << Pin);
    *((unsigned long*)&LPC_PINCON->PINSEL0 + Port)
        |= (unsigned long)Mode << Pin;
}

unsigned char PinConnectBlock::GetFunctionMode(
    unsigned char Port, unsigned char Pin)
{
    Port *= 2;
    if (Pin >= 16)
    {
        Port++;
        Pin -= 16;
    }
    Pin *= 2;
    return (*((unsigned long*)&LPC_PINCON->PINSEL0 + Port)
        & (0x00000003 << Pin)) >> Pin;
}

void PinConnectBlock::SetResistorMode(
    unsigned char Port, unsigned char Pin, unsigned char Mode)
{
    Port *= 2;
    if (Pin >= 16)
    {
        Port++;
        Pin -= 16;
    }
    Pin *= 2;
    *((unsigned long*)&LPC_PINCON->PINMODE0 + Port)
        &= ~(0x00000003 << Pin);
    *((unsigned long*)&LPC_PINCON->PINMODE0 + Port)
        |= (unsigned long)Mode << Pin;
    return;
}

unsigned char PinConnectBlock::GetResistorMode(
    unsigned char Port, unsigned char Pin)
{
    Port *= 2;
    if (Pin >= 16)
    {
        Port++;
        Pin -= 16;
    }
    Pin *= 2;
    return (*((unsigned long*)&LPC_PINCON->PINMODE0 + Port)
        & (0x00000003 << Pin)) >> Pin;
}

void PinConnectBlock::SetOpenDrainMode(
    unsigned char Port, unsigned char Pin, bool Mode)
{
    if (Mode)
    {
        *((unsigned long*)&LPC_PINCON->PINMODE_OD0 + Port)
            |= 0x00000001 << Pin;
    }
    else
    {
        *((unsigned long*)&LPC_PINCON->PINMODE_OD0 + Port)
            &= ~(0x00000001 << Pin);
    }
    return;
}

bool PinConnectBlock::GetOpenDrainMode(unsigned char Port, unsigned char Pin)
{
    return (*((unsigned long*)&LPC_PINCON->PINMODE_OD0 + Port)
        & (0x00000001 << Pin)) >> Pin;
}

void PinConnectBlock::SetTraceMode(bool Mode)
{
    if (Mode)
    {
        LPC_PINCON->PINSEL10 |= 0x00000008;
    }
    else
    {
        LPC_PINCON->PINSEL10 &= ~0x00000008;
    }
    return;
}

bool PinConnectBlock::GetTraceMode()
{
    return (LPC_PINCON->PINSEL10 & 0x00000008) != 0x00000000;
}

void PinConnectBlock::SetI2C0Mode(unsigned char Mode)
{

    if (!(Mode & 0x01))
    {
        LPC_PINCON->I2CPADCFG |= 0x0000000A;
    }
    else
    {
        LPC_PINCON->I2CPADCFG &= ~0x0000000A;
    }
    if (Mode & 0x02)
    {
        LPC_PINCON->I2CPADCFG |= 0x00000005;
    }
    else
    {
        LPC_PINCON->I2CPADCFG &= ~0x00000005;
    }
    return;
}

unsigned char PinConnectBlock::GetI2C0Mode()
{
    unsigned char Result = 0x00;

    if (!(LPC_PINCON->I2CPADCFG & 0x0000000A))
    {
        Result |= 0x01;
    }
    else if (!(LPC_PINCON->I2CPADCFG & 0x00000002))
    {
        Result |= 0x04;
    }
    else if (!(LPC_PINCON->I2CPADCFG & 0x00000008))
    {
        Result |= 0x08;
    }
    if ((LPC_PINCON->I2CPADCFG & 0x00000005) == 0x00000005)
    {
        Result |= 0x02;
    }
    else if (LPC_PINCON->I2CPADCFG & 0x00000001)
    {
        Result |= 0x10;
    }
    else if (LPC_PINCON->I2CPADCFG & 0x00000004)
    {
        Result |= 0x20;
    }
    return Result;
}