www.pudn.com > iMagic_2006_0428_v098r23.rar > hpio.c
#include "hpio.h"
/**************************************************************************/
//TYPE DEFINE and GLOBAL variable
/***************************************************************************/
#define MAX_HPIO 8
typedef struct
{
BYTE* psrc[MAX_HPIO];
BYTE srcidx[MAX_HPIO];
}HPIO;
static HPIO hpio;
/**************************************************************************/
//DEFINE VALUE
/***************************************************************************/
//PIO TYPE
#define INPUT 0
#define OUTPUT 1
//PIO SELECT
#define GPIO 0xa8020204
#define SGPIO 0xa802020C
#define VGPIO0 0xa8020214
#define VGPIO1 0xa802021C
#define AGPIO 0xa8020224
#define FGPIO0 0xa802022C
#define FGPIO1 0xa8020234
#define UGPIO 0xa802023C
#define EGPIO 0xa8020244
//this is temporarily in here
#ifdef AUDIO_EXTRA_POWER
const DWORD AudioExtraPower = AUDIO_EXTRA_POWER;
#else
const DWORD AudioExtraPower = 0;
#endif
/**************************************************************************/
//MACRO
/***************************************************************************/
//x <- PIO SELECT
//y <- bit index of PIO SELECT
//z <- bit index of HPIO
//w <- PIO TYPE
#define ADDHPIO(x, y, z, w) (*(DWORD*)x) |= (0x00010001 << y); \
(*(DWORD*)(((BYTE*)x - 4))) &= ~(0x1 << (y + 16)); \
(*(DWORD*)(((BYTE*)x - 4))) |= (w << (y + 16)); \
hpio.psrc[z] = (BYTE*)x; \
hpio.srcidx[z] = y; \
void HpioInit()
{
BYTE i;
for(i = 0 ; i < MAX_HPIO; i++)
{
hpio.psrc[i] = 0;
hpio.srcidx[i] = 0;
}
#if 1 //This is only an example, please make sure the gpio which you use is
//unused in your system
//bit0
ADDHPIO(SGPIO, 3, 0, OUTPUT); //add GPIO bit 3 to HPIO bit 0, output mode
//testing
HpioWrite(0, 1);
DPrintf("%d", HpioRead(0));
HpioWrite(0, 0);
DPrintf("%d", HpioRead(0));
HpioWrite(0, 1);
DPrintf("%d", HpioRead(0));
HpioWrite(0, 0);
DPrintf("%d", HpioRead(0));
//bit1
ADDHPIO(SGPIO, 4, 1, OUTPUT); //add GPIO bit 4 to HPIO bit 1, output mode
//bit2
ADDHPIO(SGPIO, 5, 2, OUTPUT); //add GPIO bit 5 to HPIO bit 2, output mode
//bit3
ADDHPIO(SGPIO, 8, 3, OUTPUT); //add GPIO bit 8 to HPIO bit 3, output mode
//bit4
ADDHPIO(VGPIO1, 11, 4, OUTPUT); //add VGPIO1 bit 11 to HPIO bit 4, output mode
//bit5
//bit6
//bit7
#endif
#if 1
ADDHPIO(SGPIO, 3, 0, OUTPUT); //add SGPIO bit 3 to HPIO bit 0, output mode,SensorLDO
ADDHPIO(SGPIO, 8, 1, OUTPUT); //add SGPIO bit 8 to HPIO bit 1, output mode,SD card LDO
ADDHPIO(SGPIO, 6, 2, OUTPUT); //add SGPIO bit 8 to HPIO bit 1, output mode,Nand flash LDO
// ADDHPIO(SGPIO, 7, 2, OUTPUT); //add SGPIO bit 7 to HPIO bit 2, output mode
#if 0
ADDHPIO(VGPIO1, 27 - 16 , 3, OUTPUT); //Use VGPIO 27 as LCM reset pin
HpioWrite(3, 1); //set VGPIO 27 default value to 1
#endif
ADDHPIO(SGPIO, 4, 4, OUTPUT); //add SGPIO bit 4 to HPIO bit 4, output mode, Flash LDO
ADDHPIO(SGPIO, 5, 5, OUTPUT); //add SGPIO bit 5 to HPIO bit 5, output mode, Torch LDO
HpioWrite(0, 0);
HpioWrite(1, 0);
HpioWrite(4, 0);
HpioWrite(5, 0);
#endif
}
void HpioCfg(BYTE bit, BYTE mode) //mode=> INPUT or OUTPUT
{
*(hpio.psrc[bit] - 4) |= (mode << (hpio.srcidx[bit] + 16));
}
BYTE HpioRead(BYTE bit)
{
return (*(DWORD*)(hpio.psrc[bit] - 4) >> hpio.srcidx[bit]) & 0x1;
}
void HpioWrite(BYTE bit, BYTE value)
{
if(value)
{
*(DWORD*)(hpio.psrc[bit] - 4) |= ((0x1) << hpio.srcidx[bit]);
}
else
{
*(DWORD*)(hpio.psrc[bit] - 4) &= ~(0x1 << hpio.srcidx[bit]);
}
}
// interface to control external power switch to turn off USB transceiver
// and external pull-up circuit
// customize the function to control GPIO
void HpioUsbPower(HPIOUSBCONTROL eControl)
{
*(volatile DWORD*)GPIO &= 0xFFFDFFFD; // GPCFG[1]: default
if(kHPIOUSBOFF == eControl){ // turn USB off
*(volatile DWORD*)(GPIO-4) &= 0xFFFDFFFD; // GPDAT[1]: input
DPrintf("Turn USB off: CFG %x, DAT %x", *(volatile DWORD*)GPIO, *(volatile DWORD*)(GPIO-4));
}else if(kHPIOUSBON == eControl){ // turn USB on
*(volatile DWORD*)(GPIO-4) |= 0x00020000; // GPDAT[1]: output
*(volatile DWORD*)(GPIO-4) &= 0xfffffffd; // GPDAT[1]: low
DPrintf("Turn USB on: CFG %x, DAT %x", *(volatile DWORD*)GPIO, *(volatile DWORD*)(GPIO-4));
}
}
void HpioCardPowerUp()
{
DPrintf("card power up");
///HpioWrite(0, 1); //for example
}
void HpioCardPowerDown()
{
DPrintf("card power down");
///HpioWrite(0, 0); //for example
}