📄 gpio_api.c
字号:
/******************************************************************************
* File name : Gpio_api.c
* Start date : 2003. 5. 13
* By : Taejin Kwon
* Contact : eric.kwon@samsung.com
* Description: APIs for GPIO
*
*****************************************************************************/
/******************************************************************************
* INCLUDES *
******************************************************************************/
#include "Basic_typedefs.h"
#include "Sys_call_abstract.h"
#include "S5h_types.h"
#include "S5h_common_reg.h"
#include "Select_cap.h"
#include "Custom.h"
#include "Gpio_api.h"
#include "..\..\api\s5h_capability.h"
/******************************************************************************
* Global Defines
******************************************************************************/
SysHisr_t gEINTG_SrqHisr;
#ifndef _FP_IS_MICOM
volatile UCHAR _gKey_pos = 0;
#endif
extern S5H_FPCALLBACK AttachedKeySendCallback;
/******************************************************************************
* Function Defines
******************************************************************************/
#if DOUBLE_LOGO_GPIO//By May 060412
void SetInputModeGPIO_16(void)
{
unsigned int temp0,temp1;
temp0 = rPCON1_H;
temp1 = rPCON1_L;
temp0&= ~0x1c;
IO_WData32_EX((unsigned char *)&rPCON1_H, temp0 ,temp1);
}
unsigned char GetPortGPIO_16(void)
{
unsigned char ui8Temp = 0;
unsigned char iodata;
unsigned char iomask = (1<<6);
ui8Temp = rPDAT1_L;
iodata = (ui8Temp & iomask);
return (iodata?1:0);
}
#endif
/******************SET GPIO12 INPUT***************************/
unsigned int GPIOOutputTemp = 0x3f;
#if 0
void SetInputModeGPIO12(void)
{
unsigned int temp0,temp1;
temp0 = rPCON1_H;
temp1 = rPCON1_L;
temp1 &= ~0x1c0; /*~(111 000 000)*/
IO_WData32_EX((unsigned char *)&rPCON1_H,temp0 ,temp1);
}
unsigned char GetPortGPIO12(void)
{
//unsigned int ui16Temp = 0;
unsigned char ui8Temp = 0;
unsigned char iodata;
unsigned char iomask = (1<<2);
ui8Temp = rPDAT1_L;
iodata = (ui8Temp & iomask);
/* ui16Temp = rPDAT1_L;
iodata = (ui16Temp & iomask);*/
return (iodata?1:0);
}
#endif
/******************SET GPIO10 OUTPUT***************************//*lucy add for vfd port*/
void SetOutputModeGPIO10(void)
{
unsigned int temp0,temp1;
temp0 = rPCON1_H;
temp1 = rPCON1_L;
temp1 &= ~0x07; /*~(111)*/
temp1 |= 0x01; /*001*/
IO_WData32_EX((unsigned char *)&rPCON1_H,temp0 ,temp1);
}
void SetPortGPIO10(void)
{
GPIOOutputTemp |= 0x01;
IO_WData32_EX((unsigned char *)&rPDAT1_H, 0 , GPIOOutputTemp);
}
void ClrPortGPIO10(void)
{
unsigned int temp0;
GPIOOutputTemp &= ~0x01;
temp0 = GPIOOutputTemp;
IO_WData32_EX((unsigned char *)&rPDAT1_H, 0 , GPIOOutputTemp);
}
/******************SET GPIO11 INPUT***************************/
void SetInputModeGPIO11(void)
{
unsigned int temp0,temp1;
temp0 = rPCON1_H;
temp1 = rPCON1_L;
temp1 &= ~0x038; /*~(000 111 000)*/
IO_WData32_EX((unsigned char *)&rPCON1_H,temp0 ,temp1);
}
unsigned char GetPortGPIO11(void)
{
//unsigned int ui16Temp = 0;
unsigned char ui8Temp = 0;
unsigned char iodata;
unsigned char iomask = (1<<1);
ui8Temp = rPDAT1_L;
iodata = (ui8Temp & iomask);
/* ui16Temp = rPDAT1_L;
iodata = (ui16Temp & iomask);*/
return (iodata?1:0);
}
/******************SET GPIO11 OUTPUT***************************/
void SetOutputModeGPIO11(void)
{
unsigned int temp0,temp1;
temp0 = rPCON1_H;
temp1 = rPCON1_L;
temp1 &= ~0x38; /*~(111 000)*/
temp1 |= 0x08; /*001 000*/
IO_WData32_EX((unsigned char *)&rPCON1_H,temp0 ,temp1);
}
void SetPortGPIO11(void)
{
GPIOOutputTemp |= 0x02;
IO_WData32_EX((unsigned char *)&rPDAT1_H, 0 , GPIOOutputTemp);
}
void ClrPortGPIO11(void)
{
unsigned int temp0;
GPIOOutputTemp &= ~0x02;
temp0 = GPIOOutputTemp;
IO_WData32_EX((unsigned char *)&rPDAT1_H, 0 , GPIOOutputTemp);
}
#if 0
/******************SET GPIO12 OUTPUT***************************/
void SetOutputModeGPIO12(void)
{
unsigned int temp0,temp1;
temp0 = rPCON1_H;
temp1 = rPCON1_L;
temp1 &= ~0x1c0; /*~(111 000 000)*/
temp1 |= 0x40; /*001 000 000*/
IO_WData32_EX((unsigned char *)&rPCON1_H,temp0 ,temp1);
}
void SetPortGPIO12(void)
{
GPIOOutputTemp |= 0x04;
IO_WData32_EX((unsigned char *)&rPDAT1_H, 0 , GPIOOutputTemp);
}
void ClrPortGPIO12(void)
{
unsigned int temp0;
GPIOOutputTemp &= ~0x04;
temp0 = GPIOOutputTemp;
IO_WData32_EX((unsigned char *)&rPDAT1_H, 0 , GPIOOutputTemp);
}
#endif
/******************SET GPIO13 OUTPUT***************************/
void SetOutputModeGPIO13(void)
{
unsigned int temp0,temp1;
temp0 = rPCON1_H;
temp1 = rPCON1_L;
temp1 &= ~0xe00; /*~(111 000 000 000)*/
temp1 |= 0x200; /*001 000 000 000*/
IO_WData32_EX((unsigned char *)&rPCON1_H,temp0 ,temp1);
}
void SetPortGPIO13(void)
{
GPIOOutputTemp |= 0x08;
IO_WData32_EX((unsigned char *)&rPDAT1_H, 0 , GPIOOutputTemp);
}
void ClrPortGPIO13(void)
{
unsigned int temp0;
GPIOOutputTemp &= ~0x08;
temp0 = GPIOOutputTemp;
IO_WData32_EX((unsigned char *)&rPDAT1_H, 0 , GPIOOutputTemp);
}
#if 0//Lumin20050822==>optimized
void SetInputMode(unsigned char port,unsigned char io)
{
UINT32 ui32Temp = 0;
unsigned long mask = ~(3<<(io<<1));
//set rPCONX = 00
switch(port){
case 0:
ui32Temp = (UINT)( (UINT32)rPCON0_H << 16 ) |rPCON0_L;
ui32Temp &= mask;
WRITE32 ((UINT8 *)&rPCON0_H, (UINT32)mask );
break;
case 1:
ui32Temp = (UINT)( (UINT32)rPCON1_H << 16 ) |rPCON1_L;
ui32Temp &= mask;
WRITE32 ((UINT8 *)&rPCON1_H, (UINT32)mask );
break;
case 2:
ui32Temp = (UINT)( (UINT32)rPCON2_H << 16 ) |rPCON2_L;
ui32Temp &= mask;
WRITE32 ((UINT8 *)&rPCON2_H, (UINT32)mask );
break;
case 3:
ui32Temp = (UINT)( (UINT32)rPCON3_H << 16 ) |rPCON3_L;
ui32Temp &= mask;
WRITE32 ((UINT8 *)&rPCON3_H, (UINT32)mask );
break;
#if 0
case 4:
ui32Temp = (UINT)( (UINT32)rPCON4_H << 16 ) |rPCON4_L;
ui32Temp &= mask;
WRITE32 ((UINT8 *)&rPCON4_H, (UINT32)mask );
break;
#endif
}
}
void SetOutputMode(unsigned char port,unsigned char io)
{
UINT32 ui32Temp = 0;
unsigned long mask1 = (1<<(io<<1));
unsigned long mask2 = ~(2<<(io<<1));
//set rPCONX = 01
switch(port){
case 0:
ui32Temp = (UINT)( (UINT32)rPCON0_H << 16 ) |rPCON0_L;
ui32Temp |= mask1;
ui32Temp &= mask2;
WRITE32 ((UINT8 *)&rPCON0_H, ui32Temp );
break;
case 1:
ui32Temp = (UINT)( (UINT32)rPCON1_H << 16 ) |rPCON1_L;
ui32Temp |= mask1;
ui32Temp &= mask2;
WRITE32 ((UINT8 *)&rPCON1_H, ui32Temp );
break;
case 2:
ui32Temp = (UINT)( (UINT32)rPCON2_H << 16 ) |rPCON2_L;
ui32Temp |= mask1;
ui32Temp &= mask2;
WRITE32 ((UINT8 *)&rPCON2_H, ui32Temp );
break;
case 3:
ui32Temp = (UINT)( (UINT32)rPCON3_H << 16 ) |rPCON3_L;
ui32Temp |= mask1;
ui32Temp &= mask2;
WRITE32 ((UINT8 *)&rPCON3_H, ui32Temp );
break;
#if 0
case 4:
ui32Temp = (UINT)( (UINT32)rPCON4_H << 16 ) |rPCON4_L;
ui32Temp |= mask1;
ui32Temp &= mask2;
WRITE32 ((UINT8 *)&rPCON4_H, ui32Temp );
break;
#endif
}
}
void SetGpioPort(unsigned char port,unsigned char io)
{
UINT32 ui32Temp = 0;
unsigned char iomask = (1<<io);
SetOutputMode(port,io);
switch(port){
case 0:
// OUT_High(rPDAT0,iomask);
ui32Temp = (UINT)( (UINT32)rPDAT0_H << 16 ) |rPDAT0_L;
ui32Temp |= iomask;
WRITE32 ((UINT8 *)&rPDAT0_H, ui32Temp );
break;
case 1:
// OUT_High(rPDAT1,iomask);
ui32Temp = (UINT)( (UINT32)rPDAT1_H << 16 ) |rPDAT1_L;
ui32Temp |= iomask;
WRITE32 ((UINT8 *)&rPDAT1_H, ui32Temp );
break;
case 2:
// OUT_High(rPDAT2,iomask);
ui32Temp = (UINT)( (UINT32)rPDAT2_H << 16 ) |rPDAT2_L;
ui32Temp |= iomask;
WRITE32 ((UINT8 *)&rPDAT2_H, ui32Temp );
break;
case 3:
// OUT_High(rPDAT3,iomask);
ui32Temp = (UINT)( (UINT32)rPDAT3_H << 16 ) |rPDAT3_L;
ui32Temp |= iomask;
WRITE32 ((UINT8 *)&rPDAT3_H, ui32Temp );
break;
#if 0
case 4:
// OUT_High(rPDAT4,iomask);
ui32Temp = (UINT)( (UINT32)rPDAT4_H << 16 ) |rPDAT4_L;
ui32Temp |= iomask;
WRITE32 ((UINT8 *)&rPDAT4_H, ui32Temp );
break;
#endif
}
}
void ClrGpioPort(unsigned char port,unsigned char io)
{
UINT32 ui32Temp = 0;
unsigned char iomask = (1<<io);
SetOutputMode(port,io);
switch(port){
case 0:
// OUT_Low(rPDAT0,iomask);
ui32Temp = (UINT)( (UINT32)rPDAT0_H << 16 ) |rPDAT0_L;
ui32Temp &= ~iomask;
WRITE32 ((UINT8 *)&rPDAT0_H, ui32Temp );
break;
case 1:
// OUT_Low(rPDAT1,iomask);
ui32Temp = (UINT)( (UINT32)rPDAT1_H << 16 ) |rPDAT1_L;
ui32Temp &= ~iomask;
WRITE32 ((UINT8 *)&rPDAT1_H, ui32Temp );
break;
case 2:
// OUT_Low(rPDAT2,iomask);
ui32Temp = (UINT)( (UINT32)rPDAT2_H << 16 ) |rPDAT2_L;
ui32Temp &= ~iomask;
WRITE32 ((UINT8 *)&rPDAT2_H, ui32Temp );
break;
case 3:
// OUT_Low(rPDAT3,iomask);
ui32Temp = (UINT)( (UINT32)rPDAT3_H << 16 ) |rPDAT3_L;
ui32Temp &= ~iomask;
WRITE32 ((UINT8 *)&rPDAT3_H, ui32Temp );
break;
#if 0
case 4:
// OUT_Low(rPDAT4,iomask);
ui32Temp = (UINT)( (UINT32)rPDAT4_H << 16 ) |rPDAT4_L;
ui32Temp &= ~iomask;
WRITE32 ((UINT8 *)&rPDAT4_H, ui32Temp );
break;
#endif
}
}
unsigned char GetGpioPort(unsigned char port,unsigned char io)
{
UINT32 ui32Temp = 0;
unsigned char iodata;
unsigned char iomask = (1<<io);
SetInputMode(port,io);
switch(port){
case 0:
// iodata = (rPDAT0&iomask);
ui32Temp = (UINT)( (UINT32)rPDAT0_H << 16 ) |rPDAT0_L;
iodata = (ui32Temp&iomask);
break;
case 1:
// iodata = (rPDAT1_H&iomask);
ui32Temp = (UINT)( (UINT32)rPDAT1_H << 16 ) |rPDAT1_L;
iodata = (ui32Temp&iomask);
break;
case 2:
// iodata = (rPDAT2_H&iomask);
ui32Temp = (UINT)( (UINT32)rPDAT2_H << 16 ) |rPDAT2_L;
iodata = (ui32Temp&iomask);
break;
case 3:
// iodata = (rPDAT3_H&iomask);
ui32Temp = (UINT)( (UINT32)rPDAT3_H << 16 ) |rPDAT3_L;
iodata = (ui32Temp&iomask);
break;
#if 0
case 4:
// iodata = (rPDAT4_H&iomask);
ui32Temp = (UINT)( (UINT32)rPDAT4_H << 16 ) |rPDAT4_L;
iodata = (ui32Temp&iomask);
break;
#endif
}
return (iodata?1:0);
}
/******************************************************************************
* Function name : GPIO_Init
* Arguments :
* Return :
* By : Taejin Kwon
* Description : Initialize GPIO
* Ref. Developer's Toolkit #08
*****************************************************************************/
void GPIO_Init( void )
{
#if 0
#if 0
rPCON0_H = (1<<14)|(1<<12)|(1<<10)|(1<<8)|(2<<6)|(2<<4)|(2<<2)|(2<<0);
rPDAT0_H = (0<<7) |(0<<6) |(1<<5) |(1<<4)|(0<<3)|(0<<2)|(0<<1)|(0);
rPCON1_H = (0<<14)|(0<<12)|(1<<10)|(1<<8)|(1<<6)|(1<<4)|(1<<2)|(1<<0);
rPDAT1_H = (0<<7) |(0<<6) |(0<<5) |(0<<4)|(1<<3)|(0<<2)|(0<<1)|(1);
#if 1
rPCON2_H = (2<<14)|(2<<12)|(2<<10)|(2<<8)|(2<<6)|(1<<4)|(0<<2)|(1<<0); //macroliu20040327 P2.1 SPD_Sense
#else
rPCON2_H = (2<<14)|(2<<12)|(2<<10)|(2<<8)|(2<<6)|(1<<4)|(1<<2)|(1<<0);
#endif
rPDAT2_H = (0<<7) |(0<<6) |(0<<5) |(0<<4)|(0<<3)|(0<<2)|(0<<1)|(1);
//rP2PUR = 1<<7;
rPCON3_H = (0<<14)|(0<<12)|(1<<10)|(0<<8)|(1<<6)|(0<<4)|(0<<2)|(1<<0); //macroliu20040327 P3.7 SPD_Sense
rPDAT3_H = (0<<7) |(0<<6) |(0<<5) |(0<<4)|(0<<3)|(0<<2)|(0<<1)|(1);
rCKOCON = 0x145;
rPCON4_H = (2<<14)|(2<<12)|(2<<10)|(2<<8)|(2<<6)|(2<<4)|(1<<2)|(1<<0);
rPDAT4_H = (0<<7) |(0<<6) |(0<<5) |(0<<4)|(0<<3)|(0<<2)|(0<<1)|(0);
#else
WRITE32 ( (UINT8 *)&rPCON0_H, (UINT32)( (1<<14)|(1<<12)|(1<<10)|(1<<8)|(2<<6)|(2<<4)|(2<<2)|(2<<0) ) );
WRITE32 ( (UINT8 *)&rPDAT0_H, (UINT32)( (0<<7) |(0<<6) |(1<<5) |(1<<4)|(0<<3)|(0<<2)|(0<<1)|(0) ) );
WRITE32 ( (UINT8 *)&rPCON1_H, (UINT32)( (0<<14)|(0<<12)|(1<<10)|(1<<8)|(1<<6)|(1<<4)|(1<<2)|(1<<0) ) );
WRITE32 ( (UINT8 *)&rPDAT1_H, (UINT32)( (0<<7) |(0<<6) |(0<<5) |(0<<4)|(1<<3)|(0<<2)|(0<<1)|(1) ) );
#if 1
WRITE32 ( (UINT8 *)&rPCON2_H, (UINT32)((2<<14)|(2<<12)|(2<<10)|(2<<8)|(2<<6)|(1<<4)|(0<<2)|(1<<0))); //macroliu20040327 P2.1 SPD_Sense
#else
WRITE32 ( (UINT8 *)&rPCON2_H, (UINT32)((2<<14)|(2<<12)|(2<<10)|(2<<8)|(2<<6)|(1<<4)|(1<<2)|(1<<0) ));
#endif
WRITE32 ( (UINT8 *)&rPDAT2_H, (UINT32)((0<<7) |(0<<6) |(0<<5) |(0<<4)|(0<<3)|(0<<2)|(0<<1)|(1) ));
//rP2PUR = 1<<7;
WRITE32 ( (UINT8 *)&rPCON3_H, (UINT32)((0<<14)|(0<<12)|(1<<10)|(0<<8)|(1<<6)|(0<<4)|(0<<2)|(1<<0))); //macroliu20040327 P3.7 SPD_Sense
WRITE32 ( (UINT8 *)&rPDAT3_H, (UINT32)((0<<7) |(0<<6) |(0<<5) |(0<<4)|(0<<3)|(0<<2)|(0<<1)|(1) ));
//rCKOCON = 0x145;
WRITE32 ( (UINT8 *)&rPCON4_H, (UINT32)((2<<14)|(2<<12)|(2<<10)|(2<<8)|(2<<6)|(2<<4)|(1<<2)|(1<<0) ));
WRITE32 ( (UINT8 *)&rPDAT4_H, (UINT32)((0<<7) |(0<<6) |(0<<5) |(0<<4)|(0<<3)|(0<<2)|(0<<1)|(0) ));
#endif
#endif
}
void Init_GPIO ( void )
{
GPIO_Init ();
}
void DeInit_GPIO( void )
{
/* Nothing */
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -