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 
}