도와주세요!!
글 수 15,339
2007.01.13 12:46:09 (*.138.143.52)
7162
안녕하세요..
//------------------------------------------------------------------------------
// 파일명 : io.c
// 저작권 : FA리눅스주식회사
// 설 명 : 내부 I/O 처리 함수이다.
//------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <tlist.h>
#include <cfg.h>
#include <gdef.h>
#include <uds.h>
#include <time.h>
#include <io.h>
#define GPIO_BASE_ADDR 0x80000000
#define GPIO_SIZE 0x00950000
#define GPIO_PADR_OFFSET ( 0x00840000 ) // 포트 A 데이터
#define GPIO_PADDR_OFFSET ( 0x00840010 ) // 포트 A 입출력 방향 1 = 출력
//-------------------------------------------------------------------------------
// 설명 : 광역 변수
//-------------------------------------------------------------------------------
int gpio_fd = -1;
volatile void *gpio_baseaddr = NULL;
volatile unsigned long *gpio_padr = NULL;
volatile unsigned long *gpio_paddr = NULL;
//-------------------------------------------------------------------------------
// 설명 : GPIO를 초기화 처리를 한다.
// 매개 : 없음
// 반환 : 없음
//-------------------------------------------------------------------------------
void io_gpio_init( void )
{
unsigned long state;
unsigned long in_state;
// GPIO 설정
gpio_fd = open( "/dev/mem", O_RDWR|O_SYNC );
if( gpio_fd < 0 )
{
perror( "/dev/mem open error" );
exit(1);
}
// IO 메모리를 얻는다.
gpio_baseaddr = mmap( 0, // 커널에서 알아서 할당요청
GPIO_SIZE, // 할당 크기
PROT_READ|PROT_WRITE, MAP_SHARED, // 할당 속성
gpio_fd, // 파일 핸들
GPIO_BASE_ADDR ); // 매핑 대상의 물리주소
printf( "GPIO ADDR %pn", gpio_baseaddr );
if( gpio_baseaddr != NULL )
{
gpio_padr = (unsigned long *) ( (unsigned char *)gpio_baseaddr + GPIO_PADR_OFFSET );
gpio_paddr = (unsigned long *) ( (unsigned char *)gpio_baseaddr + GPIO_PADDR_OFFSET );
/* --------------------------------------
// 출력으로 방향을 정할 경우.
// state = *gpio_paddr;
// state |= 0xFF;
// *gpio_paddr = state;
// state = *gpio_padr;
// state &= ~( 0x0A );
// *gpio_padr = state;
-----------------------------------------*/
// 입력으로 방향을 정할 경우.
state = *gpio_paddr;
state &= ~( 0xFF );
*gpio_paddr = state;
in_state = *gpio_padr;
printf( "GPIO IN State [0x%x]n", in_state );
}
}
//-------------------------------------------------------------------------------
// 설명 : GPIO를 클리어 처리를 한다.
// 매개 : 없음
// 반환 : 없음
//-------------------------------------------------------------------------------
void io_gpio_shotdown( void )
{
if( gpio_baseaddr != NULL ) munmap( (void *) gpio_baseaddr, (size_t) GPIO_SIZE ); // 매핑된것 해제
if( gpio_fd >= 0 ) close( gpio_fd );
}
//-------------------------------------------------------------------------------
// 설명 : 내부 IO 초기화 처리를 한다.
// 매개 : 없음
// 반환 : 없음
//-------------------------------------------------------------------------------
void io_open( void )
{
io_gpio_init();
}
//-------------------------------------------------------------------------------
// 설명 : 내부 IO 포트를 닫는다.
// 매개 : 없음
// 반환 : 없음
//-------------------------------------------------------------------------------
void io_close ( void )
{
io_gpio_shotdown();
}
가지고 계신 소스와 비교하셨어 해 보세요...
그럼 수고하세요..
>안녕하세요.
>보드는 EZ-EP9312 사용하구요.
>커널은 2.6.13.5-ez-ep931x 입니다.
>
>memory mapping 을 하여 GPIO_PADR 데이터를 읽고자 합니다.
>아래와 같은 테스트 코드를 작성했습니다.
>
> 26 #include <termios.h> /* getch */
> 27 #include <unistd.h>
> 28 #include <sys/mman.h>
> 29 #include <asm/io.h>
> 30 #include <asm/arch/regmap.h>
> 31
> 32 #define DEF_DEV_FILE "/dev/mem"
> 33 #define DEF_SIZE 4096 //0xF4
> 34
> 35 int main( int argc, char **argv )
> 36 {
> 37 int fd;
> 38 void *baseaddr ;
> 39
> 40 unsigned int *padr;
> 41
> 42 if( (fd = open( DEF_DEV_FILE, O_RDWR | O_SYNC)) < 0 )
> 43 {
> 44 perror( DEF_DEV_FILE" open : error ") ;
> 45 exit(0);
> 46 }
> 47
> 48 if( (baseaddr = (char *)mmap( 0, DEF_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, GPIO_PADR) ) <= 0 )
> 49 {
> 50 perror( DEF_DEV_FILE" mmap: error ") ;
> 51 exit(0);
> 52 }
> 53
> 54 #if 0
> 55
> 56 #define IO_BASE_VIRT 0xE0000000 /* Virtual address of IO */
> 57 #define IO_BASE_PHYS 0x80000000 /* Physical address of IO */
> 58 #define GPIO_OFFSET 0x040000
> 59
> 60 #define EP93XX_APB_BASE (IO_BASE_VIRT | 0x00800000)
> 61 #define GPIO_BASE (EP93XX_APB_BASE|GPIO_OFFSET)
> 62 #define GPIO_PADR (GPIO_BASE+0x00) /* GPIO port A Aata register */
> 63
> 64
> 65 cat /proc/iomem
> 66 e0830000-e0830fff : 0x80830000:security
> 67 e0840000-e0840fff : 0x80840000:gpio
> 68 e0880000-e0880fff : 0x80880000:ac97
> 69
> 70 #endif
> 71
> 72 padr = (unsigned int*) (baseaddr) ;
> 73
> 74 printf("value [0x%x] %xrn",*padr, GPIO_PADR) ;
> 75
> 76 if( baseaddr != NULL ) munmap(baseaddr, DEF_SIZE) ;
> 77
> 78 close( fd ) ;
> 79
> 80 return 0 ;
> 81 }
>
>실행하면 생각한 값과 다른값을 가져옵니다.
>
>[root@falinux mem-gpio-ex]$ ./mem-gpio-ex
>value [0x0] e0840000
>[root@falinux mem-gpio-ex]$
>
>32bit 레지스터 GPIO_PADR 의 경우 하위 8bit모두 HIGH 상태여 0xFF를 가져와야 할꺼같은데
>그런데 0x0 으로 읽어지는군요.
>
>코드에 뭔가 실수한게 있는지요? 조언부탁드립니다.
>
//------------------------------------------------------------------------------
// 파일명 : io.c
// 저작권 : FA리눅스주식회사
// 설 명 : 내부 I/O 처리 함수이다.
//------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <tlist.h>
#include <cfg.h>
#include <gdef.h>
#include <uds.h>
#include <time.h>
#include <io.h>
#define GPIO_BASE_ADDR 0x80000000
#define GPIO_SIZE 0x00950000
#define GPIO_PADR_OFFSET ( 0x00840000 ) // 포트 A 데이터
#define GPIO_PADDR_OFFSET ( 0x00840010 ) // 포트 A 입출력 방향 1 = 출력
//-------------------------------------------------------------------------------
// 설명 : 광역 변수
//-------------------------------------------------------------------------------
int gpio_fd = -1;
volatile void *gpio_baseaddr = NULL;
volatile unsigned long *gpio_padr = NULL;
volatile unsigned long *gpio_paddr = NULL;
//-------------------------------------------------------------------------------
// 설명 : GPIO를 초기화 처리를 한다.
// 매개 : 없음
// 반환 : 없음
//-------------------------------------------------------------------------------
void io_gpio_init( void )
{
unsigned long state;
unsigned long in_state;
// GPIO 설정
gpio_fd = open( "/dev/mem", O_RDWR|O_SYNC );
if( gpio_fd < 0 )
{
perror( "/dev/mem open error" );
exit(1);
}
// IO 메모리를 얻는다.
gpio_baseaddr = mmap( 0, // 커널에서 알아서 할당요청
GPIO_SIZE, // 할당 크기
PROT_READ|PROT_WRITE, MAP_SHARED, // 할당 속성
gpio_fd, // 파일 핸들
GPIO_BASE_ADDR ); // 매핑 대상의 물리주소
printf( "GPIO ADDR %pn", gpio_baseaddr );
if( gpio_baseaddr != NULL )
{
gpio_padr = (unsigned long *) ( (unsigned char *)gpio_baseaddr + GPIO_PADR_OFFSET );
gpio_paddr = (unsigned long *) ( (unsigned char *)gpio_baseaddr + GPIO_PADDR_OFFSET );
/* --------------------------------------
// 출력으로 방향을 정할 경우.
// state = *gpio_paddr;
// state |= 0xFF;
// *gpio_paddr = state;
// state = *gpio_padr;
// state &= ~( 0x0A );
// *gpio_padr = state;
-----------------------------------------*/
// 입력으로 방향을 정할 경우.
state = *gpio_paddr;
state &= ~( 0xFF );
*gpio_paddr = state;
in_state = *gpio_padr;
printf( "GPIO IN State [0x%x]n", in_state );
}
}
//-------------------------------------------------------------------------------
// 설명 : GPIO를 클리어 처리를 한다.
// 매개 : 없음
// 반환 : 없음
//-------------------------------------------------------------------------------
void io_gpio_shotdown( void )
{
if( gpio_baseaddr != NULL ) munmap( (void *) gpio_baseaddr, (size_t) GPIO_SIZE ); // 매핑된것 해제
if( gpio_fd >= 0 ) close( gpio_fd );
}
//-------------------------------------------------------------------------------
// 설명 : 내부 IO 초기화 처리를 한다.
// 매개 : 없음
// 반환 : 없음
//-------------------------------------------------------------------------------
void io_open( void )
{
io_gpio_init();
}
//-------------------------------------------------------------------------------
// 설명 : 내부 IO 포트를 닫는다.
// 매개 : 없음
// 반환 : 없음
//-------------------------------------------------------------------------------
void io_close ( void )
{
io_gpio_shotdown();
}
가지고 계신 소스와 비교하셨어 해 보세요...
그럼 수고하세요..
>안녕하세요.
>보드는 EZ-EP9312 사용하구요.
>커널은 2.6.13.5-ez-ep931x 입니다.
>
>memory mapping 을 하여 GPIO_PADR 데이터를 읽고자 합니다.
>아래와 같은 테스트 코드를 작성했습니다.
>
> 26 #include <termios.h> /* getch */
> 27 #include <unistd.h>
> 28 #include <sys/mman.h>
> 29 #include <asm/io.h>
> 30 #include <asm/arch/regmap.h>
> 31
> 32 #define DEF_DEV_FILE "/dev/mem"
> 33 #define DEF_SIZE 4096 //0xF4
> 34
> 35 int main( int argc, char **argv )
> 36 {
> 37 int fd;
> 38 void *baseaddr ;
> 39
> 40 unsigned int *padr;
> 41
> 42 if( (fd = open( DEF_DEV_FILE, O_RDWR | O_SYNC)) < 0 )
> 43 {
> 44 perror( DEF_DEV_FILE" open : error ") ;
> 45 exit(0);
> 46 }
> 47
> 48 if( (baseaddr = (char *)mmap( 0, DEF_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, GPIO_PADR) ) <= 0 )
> 49 {
> 50 perror( DEF_DEV_FILE" mmap: error ") ;
> 51 exit(0);
> 52 }
> 53
> 54 #if 0
> 55
> 56 #define IO_BASE_VIRT 0xE0000000 /* Virtual address of IO */
> 57 #define IO_BASE_PHYS 0x80000000 /* Physical address of IO */
> 58 #define GPIO_OFFSET 0x040000
> 59
> 60 #define EP93XX_APB_BASE (IO_BASE_VIRT | 0x00800000)
> 61 #define GPIO_BASE (EP93XX_APB_BASE|GPIO_OFFSET)
> 62 #define GPIO_PADR (GPIO_BASE+0x00) /* GPIO port A Aata register */
> 63
> 64
> 65 cat /proc/iomem
> 66 e0830000-e0830fff : 0x80830000:security
> 67 e0840000-e0840fff : 0x80840000:gpio
> 68 e0880000-e0880fff : 0x80880000:ac97
> 69
> 70 #endif
> 71
> 72 padr = (unsigned int*) (baseaddr) ;
> 73
> 74 printf("value [0x%x] %xrn",*padr, GPIO_PADR) ;
> 75
> 76 if( baseaddr != NULL ) munmap(baseaddr, DEF_SIZE) ;
> 77
> 78 close( fd ) ;
> 79
> 80 return 0 ;
> 81 }
>
>실행하면 생각한 값과 다른값을 가져옵니다.
>
>[root@falinux mem-gpio-ex]$ ./mem-gpio-ex
>value [0x0] e0840000
>[root@falinux mem-gpio-ex]$
>
>32bit 레지스터 GPIO_PADR 의 경우 하위 8bit모두 HIGH 상태여 0xFF를 가져와야 할꺼같은데
>그런데 0x0 으로 읽어지는군요.
>
>코드에 뭔가 실수한게 있는지요? 조언부탁드립니다.
>