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
  • 구매
  • 기타

S3C2440 gpio 제어 (소스 문제점 지적 부탁드립니다.)

2009.07.02 16:39

만뎅 조회 수:25574

안녕하세요.

 

gpio제어 학습을 해보려고 여기저기 참고해서 소스를 작성했습니다만, 역시 실력이 개발이라 오류가 발생하네요.

전체 소스입니다. 제가 무엇을 잘못했는지.. 조언 부탁드립니다.

 

아래는 s3c2440a 메뉴얼에서 발췌한 GPF 레지스터 정보입니다.

PORT F CONTROL REGISTERS (GPFCON, GPFDAT)
If GPF0–GPF7 will be used for wake-up signals at power down mode, the ports will be set in interrupt mode.
Register        Address            R/W       Description                                       Reset Value
GPFCON     0x56000050     R/W       Configures the pins of port F           0x0
GPFDAT     0x56000054     R/W       The data register for port F               Undef.
GPFUP         0x56000058    R/W       Pull-up disable register for port F     0x000
Reserved       0x5600005c     –            –                                                         –

 

 gpio_dev.c 디바이스 파일입니다.

 

#include <linux/module.h> // 모듈에 관한 정의
#include <linux/init.h>  // init_module()과 cleanup_module()
#include <linux/fs.h>   // file_operations 구조체
#include <asm/uaccess.h> // copy_to_user()
#include <asm/io.h>    // GPIO controller에 관한 정의

 

#define DEV_NAME "gpio"
#define DEV_MAJOR 250

 

#define rGPFCON (*(volatile unsigned *)0x56000050)
#define rGPFDAT (*(volatile unsigned *)0x56000054)
#define rGPFUP  (*(volatile unsigned *)0x56000058)

 

int gpio_open(struct inode *inode, struct file *filp)
{
 printk("gpio driver open\n");
 
 return 0;
}

 

ssize_t gpio_write(struct file *filp, void *buf, size_t count, loff_t *f_pos)
{
  unsigned int buffer;
 
 copy_from_user(buffer,(int *)buf, sizeof(buffer));

 

 rGPFCON = (rGPFCON &~(0x3<<14))|(0x1<<14);     // GPF 7번 핀을 출력으로 설정
 rGPFUP  = rGPFUP|(0x1<<7);             // 출력으로 사용하기 위해 GPF 7번 핀의 풀업제거
 rGPFDAT = (rGPFDAT &~(0x1<<7))|((buffer & 0x1)<<7); // GPF 7번핀에 데이터 쓰기
 
 return 0;
}

 

int gpio_release(struct inode *inode, struct file *filp)
{
 printk("gpio driver close\n");

 return 0;
}

 

struct file_operations gpio_fops =
{
 .owner    = THIS_MODULE,
  .write  = gpio_write,
 .open   = gpio_open,
 .release = gpio_release,
};

 

int gpio_init(void)
{
 int result;
 
 printk("call gpio_init\n");
 
 result = register_chrdev(DEV_MAJOR, DEV_NAME, &gpio_fops);
 if(result < 0) return result;
  
 return 0;
}

 

int gpio_exit(void)
{
 printk("call gpio_exit\n");
 
 unregister_chrdev(DEV_MAJOR, DEV_NAME);
}

 

module_init(gpio_init);
module_exit(gpio_exit);

MODULE_LICENSE("Dual BSD/GPL");

 

gpio_app.c 응용프로그램 파일입니다..

 

#include <stdio.h>
#include <fcntl.h> // open()의 flag 정의
#include <errno.h> // error 값 정의

 

int main(void)
{
 int fd, buf;
 
 printf("device file open\n");
 
 fd=open("/dev/gpio", O_RDWR|O_NDELAY);
 if(fd<0) {
  perror("/dev/gpio open error");
  exit(1);
 }
  
 for(buf=0;buf<10;buf++) {
  write(fd, buf, sizeof(buf));
  sleep(1);
 }


 close(fd);
 return 0;
}


 

make 메시지 입니다.

 

[hdd@hdd-server nfs]$ make
make -C /opt/linux-2.6.21 SUBDIRS=/home/nfs modules
make[1]: Entering directory `/opt/linux-2.6.21'
  CC [M]  /home/nfs/gpio_dev.o
/home/nfs/gpio_dev.c: In function `gpio_write':
/home/nfs/gpio_dev.c:25: warning: passing arg 1 of `copy_from_user' makes pointer from integer without a cast
/home/nfs/gpio_dev.c: At top level:
/home/nfs/gpio_dev.c:44: warning: initialization from incompatible pointer type
/home/nfs/gpio_dev.c: In function `__exittest':
/home/nfs/gpio_dev.c:69: warning: return from incompatible pointer type
/home/nfs/gpio_dev.c: In function `gpio_write':
/home/nfs/gpio_dev.c:23: warning: 'buffer' might be used uninitialized in this function
/home/nfs/gpio_dev.c: In function `gpio_exit':
/home/nfs/gpio_dev.c:66: warning: control reaches end of non-void function
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/nfs/gpio_dev.mod.o
  LD [M]  /home/nfs/gpio_dev.ko
make[1]: Leaving directory `/opt/linux-2.6.21'
arm-linux-gcc -o gpio_app gpio_app.c

 

타켓 시스템으로 옮겨와서 실행

[root@falinux nfs]$ insmod gpio_dev.ko

[root@falinux nfs]$ mknod /dev/gpio c 250 0

[root@falinux nfs]$ lsmod
Module                  Size  Used by    Not tainted
gpio_dev                1888  0

[root@falinux nfs]$ ./gpio_app
device file open
Segmentation fault

 

커널 메시지를 살펴보니...

[root@falinux nfs]$ dmesg

...

call gpio_init
gpio driver open
Unable to handle kernel NULL pointer dereference at virtual address 00000004
pgd = c0df0000
[00000004] *pgd=30dee031, *pte=00000000, *ppte=00000000
Internal error: Oops: 817 [#1]
Modules linked in: gpio_dev
CPU: 0
PC is at __memzero+0x60/0x80
LR is at __lock_text_end+0x638/0x8f0
pc : [<c014aa60>]    lr : [<c02c8718>]    Not tainted
sp : c0d95f38  ip : 0000001c  fp : c0d95f54
r10: 40135f6c  r9 : c0d94000  r8 : 00000000
r7 : c0d95f78  r6 : 00000000  r5 : c05b5520  r4 : 00000004
r3 : 00000000  r2 : 00000000  r1 : 00000004  r0 : 00000004
Flags: nzcv  IRQs on  FIQs on  Mode SVC_32  Segment user
Control: C000717F
Table: 30DF0000  DAC: 00000015
Process gpio_app (pid: 978, stack limit = 0xc0d94250)
Stack: (0xc0d95f38 to 0xc0d96000)
5f20:                                                       00000004 00000004
5f40: bf00005c 00000004 c0d95f74 c0d95f58 c0086450 bf000030 c05b5540 c05b5520
5f60: c0d95f78 00000000 c0d95fa4 c0d95f78 c0086544 c00863a0 00000000 00000000
5f80: 00000000 4001c3bc bed93c84 00008694 00000004 c0028dc4 00000000 c0d95fa8
5fa0: c0028c20 c0086508 4001c3bc bed93c84 00000003 00000000 00000004 00000000
5fc0: 4001c3bc bed93c84 00008694 00000001 401397fc 000085e8 40135f6c bed93c54
5fe0: 00000000 bed93c3c 00003d10 400df400 60000010 00000003 00000000 00000000
Backtrace:
[<bf000020>] (gpio_write+0x0/0x9c [gpio_dev]) from [<c0086450>] (vfs_write+0xc0/0xf4)
 r4 = 00000004
[<c0086390>] (vfs_write+0x0/0xf4) from [<c0086544>] (sys_write+0x4c/0x74)
 r7 = 00000000  r6 = C0D95F78  r5 = C05B5520  r4 = C05B5540
[<c00864f8>] (sys_write+0x0/0x74) from [<c0028c20>] (ret_fast_syscall+0x0/0x2c)
 r8 = C0028DC4  r7 = 00000004  r6 = 00008694  r5 = BED93C84
 r4 = 4001C3BC
Code: e49de004 e3110008 18a0000c e3110004 (14802004)
gpio driver close


 

 

이 게시물을
  • Twitter
  • Facebook
  • Delicious
목록

댓글 2

  • 장형기

    2009.07.06 23:36

    안녕하세요..

     

    소스상에서 GPIO 레지스트의 물리주소를 직접제어하셨네요...

    이미 S3C2440에는 커널에서 GPIO를 접근할 수 있는 함수를 제공하고 있습니다.

     

    arch/arm/plat-s3c24xx/gpio.c  를 참조하세요.

     

    GPIO 상태 설정

        s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function)

        s3c2410_gpio_pullup(unsigned int pin, unsigned int to)

     

    GPIO 출력

         s3c2410_gpio_setpin(unsigned int pin, unsigned int to)

     

    GPIO 입력

         s3c2410_gpio_getpin(unsigned int pin)

     

    관련  Pin 과 function 은 include/asm/arch/regs-gpio.h  를 참조하세요..

     

     

    예로 설명하자면...

     

    rGPFCON = (rGPFCON &~(0x3<<14))|(0x1<<14);     // GPF 7번 핀을 출력으로 설정

    -->>  s3c2410_gpio_cfgpin(S3C2410_GPF7, S3C2410_GPF7_OUTP);

     

    rGPFUP  = rGPFUP|(0x1<<7);             // 출력으로 사용하기 위해 GPF 7번 핀의 풀업제거

    --->  s3c2410_gpio_pullup(S3C2410_GPF7,  0);

     

    rGPFDAT = (rGPFDAT &~(0x1<<7))|((buffer & 0x1)<<7); // GPF 7번핀에 데이터 쓰기

    --->  s3c2410_gpio_setpin(S3C2410_GPF7,  1);

     

     

    그럼 좋은 하루 되세요..


     

    댓글

  • 만뎅

    2009.07.15 16:17

    장형기님, 안녕하세요.

    아직 소스 분석하는 요령이 부족하여 함수를 이해하는데 어려움이 있었는데 조언 감사드립니다.

    좋은 하루되세요!

    댓글

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