#include
#include
#include
#include
#include
#include
#include
#include
#include

#define IO_BASE_ADDR 0x40000000
#define IO_SIZE 0x0C000000

#define IO_GAFR0_L_ADDR 0x40E00054
#define IO_GPDR0_ADDR 0x40E0000C
#define IO_GPSR0_ADDR 0x40E00018
#define IO_GPCR0_ADDR 0x40E00024
#define IO_GRER0_ADDR 0x40E00030
#define IO_GEDR0_ADDR 0x40E00048
#define IO_GFER0_ADDR 0x40E0003C

#define IO_GAFR0_L_OFFSET ( IO_GAFR0_L_ADDR - IO_BASE_ADDR )
#define IO_GPDR0_OFFSET ( IO_GPDR0_ADDR - IO_BASE_ADDR )
#define IO_GPSR0_OFFSET ( IO_GPSR0_ADDR - IO_BASE_ADDR )
#define IO_GPCR0_OFFSET ( IO_GPCR0_ADDR - IO_BASE_ADDR )
#define IO_GRER0_OFFSET ( IO_GRER0_ADDR - IO_BASE_ADDR )
#define IO_GEDR0_OFFSET ( IO_GEDR0_ADDR - IO_BASE_ADDR )
#define IO_GFER0_OFFSET ( IO_GFER0_ADDR - IO_BASE_ADDR )


#define IO_GPIO3 (1<<3)
#define IO_GPIO4 (1<<4)
#define IO_GPIO5 (1<<5)

int main( int argc, char **argv )
{
int fd;

void *baseaddr;
unsigned long *gpdr0;
unsigned long *gpsr0;
unsigned long *gpcr0;
unsigned long *gafr0;
unsigned long *grer0;
unsigned long *gedr0;
unsigned long *gfer0;

fd = open( "/dev/mem", O_RDWR|O_SYNC );
if( fd < 0 )
{
perror( "/dev/mem open error" );
exit(1);
}

// IO 메모리를 얻는다.
baseaddr = mmap( 0, // 커널에서 알아서 할당요청
IO_SIZE, // 할당 크기
PROT_READ|PROT_WRITE, MAP_SHARED, // 할당 속성
fd, // 파일 핸들
IO_BASE_ADDR ); // 매핑 대상의 물리주소
printf( "IO ADDR %p
", baseaddr );

if( baseaddr != NULL )
{
// GPIO 어드레스
gafr0 = (unsigned long *) ( (unsigned char *)baseaddr +
IO_GAFR0_L_OFFSET );
gplr0 = (unsigned long *) ( (unsigned char *)baseaddr +
IO_GPLR0_OFFSET );
gpdr0 = (unsigned long *) ( (unsigned char *)baseaddr +
IO_GPDR0_OFFSET );
gpsr0 = (unsigned long *) ( (unsigned char *)baseaddr +
IO_GPSR0_OFFSET );
gpcr0 = (unsigned long *) ( (unsigned char *)baseaddr +
IO_GPCR0_OFFSET );
grer0 = (unsigned long *) ( (unsigned char *)baseaddr +
IO_GRER0_OFFSET );
gfer0 = (unsigned long *) ( (unsigned char *)baseaddr +
IO_GFER0_OFFSET );
gedr0 = (unsigned long *) ( (unsigned char *)baseaddr +
IO_GEDR0_OFFSET );

*gafr0=0x00; //범용으로 설정
*gpdr0=0x30; // gpio4,5 출력 나머지 입력으로 설정
*grer0|=IO_GPIO3; //gpio3 상승 엣지 검출 허가.

printf( "GPDR0 STATE %08X
", *gpdr0 );
printf( "GAFR0 STATE %08X
", *gafr0 );
printf( "GRER0 STATE %08X
", *grer0 );
printf( "GEDR0 STATE %08X
", *gedr0 );

while(1)
{

if(*gedr0== (*gedr0 | IO_GPIO3))

{
*gpcr0 = IO_GPIO4; printf( "ON4
" );
sleep(1);
*gpsr0 = IO_GPIO4; printf( "Off4
" );
sleep(1);

*gpcr0 = IO_GPIO5; printf( "ON5
" );
sleep(1);
*gpsr0 = IO_GPIO5; printf( "Off5
" );

*gedr0 |= IO_GPIO3; // gedr0 clear
}
}


if( baseaddr != NULL ) munmap( baseaddr, IO_SIZE ); // 매핑된것
해제
}

close( fd );

return 0;
}


장형기 wrote..
: 안녕하세요.
:
: 뭔가 레지스트 설정을 잘못하셨거나, 설정을 빠뜨리시지는 않으셨나요??
:
: 아니면 다른 곳에서 이 GPIO를 건드리고 계시든지...
:
: 또는 GPIO를 인터럽트로 사용하셨다고 하셨는데... 입력 전압은 얼마인지??
:
: 소스를 한번 올려 주세요...
:
: 그럼 수고하세요..
:
:
:
: 왕초보 wrote..
: : GPIO0,1은 계속해서 인터럽트가 걸리는데요..
: : 3번 부터는 한번 걸리고는 반응이 없습니다.
: : developer sheet보고 레지스터란 레지스터는 보았는데..
: : 왜 그런지 모르겠습니다.
: : 어떤 걸 건드려야 하는지..ㅜ.ㅜ
: : 안걸리면 안걸리지 왜 한번인지..
: : GAFR0을 00을 줬는데...
: : 0,1은GEDR0에 값이 셋되는걸 확인했는데 3번부터는 셋이 안되고
: : 한번만 실행됩니다..이런일이...
: : 도와주세요~!~!