logo
한국어 Select Language
FF 포럼
포럼지기에게 한 마디
공지사항
뉴스 EZ보드 통합 메뉴얼
FA-VUS 개발환경 !강추! 타켓보드 부팅-HyperTerminal 타켓보드 부팅-Tutty 타켓보드 부팅-minicom Windows환경-타겟 Linux 구동 Linux환경-타겟 Linux 구동 개발 시스템 구축 유형 페도라 설치 CentOS 설치 크로스 컴파일러 설치 TFTP 환경 구축 NFS 파일 시스템 구축 삼바 서버 구축 부트로더 부트로더 쓰기 커널 이미지 제작 및 설치 램디스크 이미지 제작 및 설치
임베디드 제품 사용기 오늘의 영어 휴게실 Appliance
강좌 & 팁
강좌 & 팁 EZ-보드 그래픽 & 멀티미디어 네트워크 프로그래밍 디바이스 드라이버 ImJa 솔루션 임베디드 FLEX 안드로이드 iOS 개발 FAIDE 하드웨어 C/C++ go언어 GNU C 레퍼런스 메뉴얼 ARM 루아 응용 프로젝트 이클립스 지그비 개발자 노트 권장도서 FPGA
VIVADO DSP HSIO Logic Zynq
함수설명
C 라이브러리 함수 커널 API 그래픽 라이브러리 - gxLib
자료실
자료실 FALINUX SDK ARM PC-V210 S3C6410
G100-S3C6410 S100-S3C6410 C221-S3C6410 N200-S3C6410 EZ-S3C6410
S5PV210
G100-S5PV210 S100-S5PV210 N200-S5PV210 C221-S5PV210
EZ-S3C2440 EZ-PXA270 EZ-X5 EZ-S2410 Auto Package
도와주세요
FAQ 도와주세요

  • 회원가입
  • ID/PW 찾기
 
  1. FAQ

  2. 도와주세요


최근 글

  • [특판][성Y인Y용Y품][...
  • 요즘 잘 나가는,,,
  • 요즘은 vmware 말고 ...
  • [docker] buildx 를 ...
  • buildroot 사용 관련
  • GPIO 제어 방법 문의 [1]
  • 임베디드 리눅스 개발...
  • make wandboard_quad ...
  • LCD 초기화 코드 좀 ... [1]
  • 임베디드 리눅스 커널...

최근 댓글

  • 오래 전에 해결법을 터득해서 ...
  • 비트 코인으로 작업하는 것은 ...
  • 10년차 임베 엔지니어 입니다. ...
  • 임베디드쪽이라면 SOC 쪽 displ...
  • 그렇군요 제가 질문이 잘못됬었...
  • 취준생으로서 포트폴리오를 만...
  • 제가 현재 취업준비생입니다. ...
  • 에프에이리눅스 보드는 아래 링...
  • 전체
  • 일반
  • X5
  • S2410
  • ESP-NS
  • S3C2440
  • EP9312
  • 구매
  • 기타

기타 [re] mmap 를 이용한 port 이용.

2007.01.13 21:46

장형기 조회 수:8618

안녕하세요..


//------------------------------------------------------------------------------
// 파일명   : 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 으로 읽어지는군요.
>
>코드에 뭔가 실수한게 있는지요? 조언부탁드립니다.
>
이 게시물을
  • Twitter
  • Facebook
  • Delicious
수정 삭제 목록

댓글 0

목록
번호 제목 글쓴이 날짜 조회 수
공지 포럼의 메뉴가 보이지 않아요! 장길석 2014.02.06 957672
공지 [중요 공지]제품 사용 및 기술 문의는 전화 상담을 받지 않습니다. 장길석 2012.11.09 1408555
공지 답글에 대한 공지 사항. falinux 2006.11.20 2424055
15341 [특판][성Y인Y용Y품][비아][시알][여성흥분제] 전부 1+1 vv8282.top 지금 확인해보세요~! dde33 2026.10.15 2
15340 요즘 잘 나가는,,, dde33 2026.09.12 845
15339 buildroot 사용 관련 로즈마리 2021.02.01 38167
15338 GPIO 제어 방법 문의 [1] 단순최고 2021.01.25 51084
15337 임베디드 리눅스 개발 보드 추천 nam 2019.12.06 48864
15336 make wandboard_quad 실행시 문제 gasi 2019.08.27 47085
15335 LCD 초기화 코드 좀 봐주세요 [1] 김용수 2019.07.12 63137
15334 임베디드 리눅스 커널 소스에 관해 질문드립니다 ! ekthatkxkd 2019.06.28 43730
15333 numpy,scipy 를 arm-linux-XXXX 로 크로스컴파일 하여 올릴수 있나요? 초보자 2019.06.24 49288
15332 I2C - deal with arbitration loss 오류가 궁금합니다. [1] S1eepingBeauty 2018.12.10 56771
15331 구형 EM-PXA270 보드 혹시 보유하시분 연락 주시면 감사드릴께요. file 존 2018.11.24 42753
15330 리눅스 GPIO 관련 센서의 단선 또는 고장유무 판별법이 궁금합니다. [2] S1eepingBeauty 2018.11.12 55127
15329 임베디드 리눅스에서 c 언어 디버깅 궁금합니다. [1] 존 2018.09.14 47073
15328 부팅 시간 문의 [1] nam 2018.06.29 45795
15327 localport? port? 검은고래 2018.06.29 39961
15326 fork()의 thread 멈추는 현상 [4] HwangRoy 2018.05.09 58616
15325 임베디드 리눅스 습득용 보드 판매하시나요? 임베디드초급자 2018.04.27 39719
15324 (도와주세요)네트워크 디바이스 드라이버 수정문제입니다. [1] Chanmini 2018.03.04 43602
15323 Ez x5 구합니다!! khobaik 2018.01.26 38317
15322 실행중 symbol not found 를 발생시키는 u-boot 본적 있으신가요 ? sayyouandme 2017.12.17 57350
첫 페이지 1 2 3 4 5 6 7 8 9 10 끝 페이지
쓰기
태그
부탁드립니다. ^^
  • 글을 작성하시려면 회원으로 가입하시고 로그인 하셔야 합니다.
  • 회원 가입은 주민등록번호가 필요 없으며, 메일 주소만 있으면 간단하게 가입하실 수 있습니다.
  • 본 포럼에 등록된 모든 글의 저작권은 작성하신 분께 있으며, 저작자의 허락 없이 다른 곳에 펌이나 도용하시면 안 됩니다.
  • 또한, 전자우편 수집 프로그램이나 그 밖의 기술적 장치를 이용하여 무단으로 이메일 주소 및 자료 수집되는 것을 거부하며,
  • 이를 위반 시 정보통신망 법에 의해 형사 처벌됨을 유념하시기 바랍니다.
  • FF 포럼
  • 강좌 & 팁
  • 함수설명
  • 자료실
  • 도와주세요