안녕하세요..


//------------------------------------------------------------------------------
// 파일명   : 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 으로 읽어지는군요.
>
>코드에 뭔가 실수한게 있는지요? 조언부탁드립니다.
>