#ifndef _PXA255_GPIO_H_
#define _PXA255_GPIO_H_

#include "mem.h"
#include "CPU.h"
#include "pxa255_IC.h"

/*
	PXA255 OS GPIO controller

*/

#define PXA255_GPIO_BASE		0x40E00000UL
#define PXA255_GPIO_SIZE		0x00001000UL


typedef struct{

	Pxa255ic* ic;
	
	UInt32 latches[3];		//what pxa wants to be outputting
	UInt32 inputs[3];		//what pxa is receiving	[only set by the pxa255gpioSetState() API]
	UInt32 levels[3];		//what pxa sees (it differs from above for IN pins)
	UInt32 dirs[3];			//1 = output
	UInt32 riseDet[3];		//1 = rise detect
	UInt32 fallDet[3];		//1 = fall detect
	UInt32 detStatus[3];		//1 = detect happened
	UInt32 AFRs[6];			//1, 2, 3 = alt funcs
	
}Pxa255gpio;

#define PXA255_GPIO_LOW			0		//these values make it look like all HiZ, AFR, and nonexistent pins have pullups to those who dumbly assume gpioGEt returns a boolean
#define PXA255_GPIO_HIGH		1
#define PXA255_GPIO_HiZ			2
#define PXA255_GPIO_AFR1		3
#define PXA255_GPIO_AFR2		4
#define PXA255_GPIO_AFR3		5
#define PXA255_GPIO_NOT_PRESENT		6

Boolean pxa255gpioInit(Pxa255gpio* gpio, ArmMem* physMem, Pxa255ic* ic);

//for external use :)
UInt8 pxa255gpioGetState(Pxa255gpio* gpio, UInt8 gpioNum);
void pxa255gpioSetState(Pxa255gpio* gpio, UInt8 gpioNum, Boolean on);	//we can only set value (and only of input pins), not direction

#endif