/**********************************************************************
* $Id$		lpc177x_8x_pinsel.h			2011-06-02
*//**
* @file		lpc177x_8x_pinsel.h
* @brief	Contains all macro definitions and function prototypes
*			support for Pin-connection block firmware library on LPC177x_8x
* @version	1.0
* @date		02. June. 2011
* @author	NXP MCU SW Application Team
* 
* Copyright(C) 2011, NXP Semiconductor
* All rights reserved.
*
***********************************************************************
* Software that is described herein is for illustrative purposes only
* which provides customers with programming information regarding the
* products. This software is supplied "AS IS" without any warranties.
* NXP Semiconductors assumes no responsibility or liability for the
* use of the software, conveys no license or title under any patent,
* copyright, or mask work right to the product. NXP Semiconductors
* reserves the right to make changes in the software without
* notification. NXP Semiconductors also make no representation or
* warranty that such application will be suitable for the specified
* use without further testing or modification.
* Permission to use, copy, modify, and distribute this software and its
* documentation is hereby granted, under NXP Semiconductors'
* relevant copyright in the software, without fee, provided that it
* is used in conjunction with NXP Semiconductors microcontrollers.  This
* copyright, permission, and disclaimer notice must appear in all copies of
* this code.
**********************************************************************/

/* Peripheral group ----------------------------------------------------------- */
/** @defgroup PINSEL	PINSEL (Pin Selection)
 * @ingroup LPC177x_8xCMSIS_FwLib_Drivers
 * @{
 */

#ifndef __LPC177X_8X_PINSEL_H
#define __LPC177X_8X_PINSEL_H

/* Includes ------------------------------------------------------------------- */
#include "LPC177x_8x.h"
#include "lpc_types.h"


/* Public Macros -------------------------------------------------------------- */
/** @defgroup PINSEL_Public_Macros PINSEL Public Macros
 * @{
 */

/* Macros define IOCON bits*/

/** Selects pin functions */
#define IOCON_FUNC_POS				(0)
#define IOCON_FUNC_MASK				(0x07<<IOCON_FUNC_POS)

/** Selects output function mode (on-chip pull-up/pull-down resistor control */
#define IOCON_MODE_POS				(3)
#define IOCON_MODE_MASK				(0x03<<IOCON_MODE_POS)
#define IOCON_MODE_PLAIN				((0<<IOCON_MODE_POS))
#define IOCON_MODE_PULLDOWN		((1<<IOCON_MODE_POS))
#define IOCON_MODE_PULLUP			((2<<IOCON_MODE_POS))
#define IOCON_MODE_REPEATER			((3<<IOCON_MODE_POS))

/** Hysteresis */
#define IOCON_HYS_POS				(5)
#define IOCON_HYS_MASK				(0x01<<IOCON_HYS_POS)
#define IOCON_HYS_ENABLE				((1<<IOCON_HYS_POS))

/** Input polarity */
#define IOCON_INVERT_POS				(6)
#define IOCON_INVERT_MASK			(0x01<<IOCON_INVERT_POS)
#define IOCON_INVERT_INPUT			(1<<IOCON_INVERT_POS)

/** Selects Analog/Digital mode */
#define IOCON_ADMODE_POS			(7)
#define IOCON_ADMODE_MASK			(0x01<<IOCON_ADMODE_POS)
#define IOCON_ANALOG_MODE			(0<<IOCON_ADMODE_POS)
#define IOCON_DIGITIAL_MODE			(1<<IOCON_ADMODE_POS)

/* Controls Glitch Filter */
#define IOCON_FILTER_POS				(8)
#define IOCON_FILTER_MASK				(0x01<<IOCON_FILTER_POS)
#define IOCON_10ns_FILTER_ENABLE			(0<<IOCON_FILTER_POS)
#define IOCON_10ns_FILTER_DISABLE			(1<<IOCON_FILTER_POS)

/** I2C 50ns glitch filter and slew rate control */ 
#define IOCON_HS_POS					(8)
#define IOCON_HS_MASK				(0x01<<IOCON_HS_POS)
#define IOCON_I2C_FILTER_ENABLE		(0<<IOCON_HS_POS)
#define IOCON_I2C_FILTER_DISABLE		(1<<IOCON_HS_POS)

/** Driver Output Slew Rate Control*/
#define IOCON_SLEW_POS				(9)
#define IOCON_SLEW_MASK				(0x01<<IOCON_SLEW_POS)
#define IOCON_SLEW_ENABLE			((1<<IOCON_SLEW_POS))

/** Controls sink current capability of the pin*/
#define IOCON_HIDRIVE_POS				(9)
#define IOCON_HIDRIVE_MASK			(0x01<<IOCON_HIDRIVE_POS)
#define IOCON_I2CMODE_FASTPLUS		(1<<IOCON_HIDRIVE_POS)

/** Controls open-drain mode */
#define IOCON_OD_POS					(10)
#define IOCON_OD_MASK				(0x01<<IOCON_OD_POS)
#define IOCON_OPENDRAIN_MODE		(1<<IOCON_OD_POS)

/** DAC enable control */
#define IOCON_DACEN_POS				(16)
#define IOCON_DACEN_MASK			(0x01<<IOCON_DACEN_POS)
#define IOCON_DAC_ENABLE				(1<<IOCON_DACEN_POS)

/* Macros define for Return Code */
typedef    int32_t		PINSEL_RET_CODE;
#define	PINSEL_RET_OK				(0)
#define	PINSEL_RET_INVALID_PIN		(0x10000001)
#define	PINSEL_RET_NOT_SUPPORT		(0x10000002)
#define	PINSEL_RET_ERR				(-1)

/**
 * @}
 */

/** @defgroup PINSEL_Public_Types PINSEL Public Types
 * @{
 */
 

typedef enum
{
	PINSEL_BASICMODE_PLAINOUT  = 0,	/**< Plain output */
	PINSEL_BASICMODE_PULLDOWN,		/**< Pull-down enabled */
  	PINSEL_BASICMODE_PULLUP,		/**< Pull-up enabled (default) */
	PINSEL_BASICMODE_REPEATER		/**< Repeater mode */
}PinSel_BasicMode;

typedef enum
{
	/** Fast mode (400 kHz clock rate) and standard (100 kHz clock rate) */
	PINSEL_I2CMODE_FAST_STANDARD  = 0,
	/** Open drain I/O (not I2C). No glitch filter, 3 mA typical output drive */
	PINSEL_I2CMODE_OPENDRAINIO,
	/** Fast Mode Plus I2C. This includes a filter for <50 ns glitches */
	PINSEL_I2CMODE_FASTMODEPLUS,
}PinSel_I2cMode;

typedef enum
{
	/** Type D IOCON registers */
	PINSEL_PIN_TYPE_D,
	/** Type A IOCON registers */
	PINSEL_PIN_TYPE_A,
	/** Type U IOCON registers */
	PINSEL_PIN_TYPE_U,
	/** Type I IOCON registers */
	PINSEL_PIN_TYPE_I,
	/** Type W IOCON registers */
	PINSEL_PIN_TYPE_W,
	/** Unknown type */
	PINSEL_PIN_TYPE_UNKNOWN,
}PinSel_PinType;


/**
 * @}
 */
 

/* Public Functions ----------------------------------------------------------- */
/** @defgroup PINSEL_Public_Functions PINSEL Public Functions
 * @{
 */
 PinSel_PinType 	  PINSEL_GetPinType(uint8_t portnum, uint8_t pinnum);
PINSEL_RET_CODE PINSEL_ConfigPin(uint8_t portnum, uint8_t pinnum, uint8_t funcnum);
PINSEL_RET_CODE PINSEL_SetPinMode(uint8_t portnum, uint8_t pinnum, PinSel_BasicMode modenum);
PINSEL_RET_CODE PINSEL_SetHysMode(uint8_t portnum, uint8_t pinnum, FunctionalState NewState);
PINSEL_RET_CODE PINSEL_SetInvertInput(uint8_t portnum, uint8_t pinnum, FunctionalState NewState);
PINSEL_RET_CODE PINSEL_SetSlewMode(uint8_t portnum, uint8_t pinnum, FunctionalState NewState);
PINSEL_RET_CODE PINSEL_SetI2CMode(uint8_t portnum, uint8_t pinnum, PinSel_I2cMode I2CMode);
PINSEL_RET_CODE PINSEL_SetOpenDrainMode(uint8_t portnum, uint8_t pinnum, FunctionalState NewState);
PINSEL_RET_CODE PINSEL_SetAnalogPinMode (uint8_t portnum, uint8_t pinnum, uint8_t enable);
PINSEL_RET_CODE PINSEL_DacEnable (uint8_t portnum, uint8_t pinnum, uint8_t enable);
PINSEL_RET_CODE PINSEL_SetFilter (uint8_t portnum, uint8_t pinnum, uint8_t enable);
PINSEL_RET_CODE PINSEL_SetI2CFilter (uint8_t portnum, uint8_t pinnum, uint8_t enable);


/**
 * @}
 */

#endif /* LPC177x_8x_PINSEL_H */

/**
 * @}
 */

/* --------------------------------- End Of File ------------------------------ */

