참고 링크아래의 장형기팀장님께서 작성하신 강좌 글에 따라 그대로 따라하면서 촬영한 동영상을 아래의 링크에 올렸습니다. 학습에 참고하세요. ^^

EZ-보드 - GPIO 테스트 프로그램 따라하기 동영상

1. 개요

이 문서는 EZ-S3C2440 보드에서 GPIO를 테스트 하기 위한 디바이스 드라이버 및 테스트 프로그램입니다.
여기서는 디바이스 드라이버에 관한 전반적인 소스 설명은 하지 않기로 하겠습니다.
따라서 소스 코드를 먼저 보시고 분석을 하시기 바랍니다. 소스코드를 분석하여 수정하시면 다른 GPIO PORT도 사용 가능합니다.

이 디바이스 드라이버 및 테스트 프로그램은 GPIO 출력, GPIO 입력(KEY 입력), 인터럽트 사용에 대한 것입니다.

2. 작업환경

 

환경 내용 버전
리눅스 배포판 FedoraCore-3
ARM툴체인 arm-linux-gcc 3.4.3
KERNEL linux-2.6.21

3. 하드웨어 지식

이 프로그램은 EZ-S3C2440 보드에서 작업한 것으로 동작 여부를 확인 하기 위해서는 EZ-S3C2440 보드의 H2라고 적혀있는
80핀 커넥터 홀 부분에서 측정하면 됩니다.

테스트할 GPIO

GPIO 출력 : GPF Port 0 ~ 7

GPF0 : H2 - 41
GPF1 : H2 - 42
GPF2 : H2 - 43
GPF3 : H2 - 44
GPF4 : H2 - 45 ( DEBUG LED D3 )
GPF5 : H2 - 46 ( DEBUG LED D4 )
GPF6 : H2 - 67 ( DEBUG LED D5 )
GPF7 : H2 - 68 ( DEBUG LED D6 )

GPIO 입력 : GPG Port 11

GPG11 : H2 - 74 ( S4 : Switch )

GPIO 인터럽트 : GPG Port 5

EINT13(GPG5): H2 - 47 ( S3 : Switch )

참고GPF4 ~ GPF7 은 DEBUG LED와 연결되어 있습니다. 출력이 LOW 이면 LED가 ON 되고,
HIGH가 되면 LED가 OFF 됩니다.

GPG11은 스위치 입력을 위한 것으로 EZ-S3C2440보드의 S4 이라고 적혀있는 스위치를 누르면 됩니다.

GPG5는 인터럽트 테스트를 위한 것으로 인터럽트 번호는 EINT13으로 EZ-S3C2440보드의 S3 이라고
적혀있는 스위치를 누르면 됩니다.
인터럽트가 발생하면 DEBUG LED가 ON 되게 하였습니다.

4. 컴파일

Makefile 수정

1 #
2 # kernel 2.6 driver Makefile
3 #
4 obj-m := dev_gpio.o
5
6 KDIR := /staff/kernel/s3c2440/linux-2.6.21
7 PWD := $(shell pwd)
8
9 APP = app_gpio
10
11 default:
12 $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
13 arm-linux-gcc -o $(APP) $(APP).c
14
15 clean :
16 rm -rf *.ko
17 rm -rf *.mod.*
18 rm -rf .*.cmd
19 rm -rf *.o

위의 Makefile 중 6번째 라인인 KDIR := /staff/kernel/s3c2440/linux-2.6.21 부분만 커널의 위치에 맞게 수정해 주시면 됩니다.

$ make clean
rm -rf *.ko
rm -rf *.mod.*
rm -rf .*.cmd
rm -rf *.o
$ make
make -C /staff/kernel/s3c2440/linux-2.6.21 SUBDIRS=/staff/tsheaven/em-s2440/trunk/prg/dev-gpio modules
make[1]: Entering directory `/staff/kernel/s3c2440/linux-2.6.21'

  WARNING: Symbol version dump /staff/kernel/s3c2440/linux-2.6.21/Module.symvers
           is missing; modules will have no dependencies and modversions.

  CC [M]  /staff/tsheaven/em-s2440/trunk/prg/dev-gpio/dev_gpio.o
/staff/tsheaven/em-s2440/trunk/prg/dev-gpio/dev_gpio.c: In function `gpio_init':
/staff/tsheaven/em-s2440/trunk/prg/dev-gpio/dev_gpio.c:226: warning: passing arg 2 of `request_irq'
 from incompatible pointer type
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /staff/tsheaven/em-s2440/trunk/prg/dev-gpio/dev_gpio.mod.o
  LD [M]  /staff/tsheaven/em-s2440/trunk/prg/dev-gpio/dev_gpio.ko
make[1]: Leaving directory `/staff/kernel/s3c2440/linux-2.6.21'
arm-linux-gcc -o app_gpio app_gpio.c
$ ls -al
total 108
drwxrwxrwx 3 tsheaven fa  4096 2008-06-20 22:48 .
drwxrwxrwx 9 tsheaven fa  4096 2008-06-19 22:01 ..
-rw-r--r-- 1 tsheaven fa   257 2008-06-20 22:48 .dev_gpio.ko.cmd
-rw-r--r-- 1 tsheaven fa  9236 2008-06-20 22:48 .dev_gpio.mod.o.cmd
-rw-r--r-- 1 tsheaven fa 14928 2008-06-20 22:48 .dev_gpio.o.cmd
drwxr-xr-x 2 tsheaven fa  4096 2008-06-20 22:48 .tmp_versions
-rwxrw-rw- 1 tsheaven fa   288 2008-06-20 18:32 Makefile
-rw-r--r-- 1 tsheaven fa     0 2008-06-20 18:30 Module.symvers
-rwxr-xr-x 1 tsheaven fa 12890 2008-06-20 22:48 app_gpio
-rwxr--r-- 1 tsheaven fa  3312 2008-06-20 22:28 app_gpio.c
-rwxrw-rw- 1 tsheaven fa  8019 2008-06-20 22:11 dev_gpio.c
-rwxrw-rw- 1 tsheaven fa   745 2008-06-20 18:29 dev_gpio.h
-rw-r--r-- 1 tsheaven fa  5799 2008-06-20 22:48 dev_gpio.ko
-rw-r--r-- 1 tsheaven fa   429 2008-06-20 22:48 dev_gpio.mod.c
-rw-r--r-- 1 tsheaven fa  1400 2008-06-20 22:48 dev_gpio.mod.o
-rw-r--r-- 1 tsheaven fa  4900 2008-06-20 22:48 dev_gpio.o
$

정상적으로 컴파일이 되었다면 dev_gpio.ko와 app_gpio 파일을 /nfs 로 복사합니다.

5. 테스트하기

컴파일이 정상적으로 되어 /nfs로 두개의 파일을 복사하였다면 EZ-S3C2440 보드를 부팅하여
nfs 접속을 합니다.

Welcome to FALinux (www.falinux.com)              
Linux Kernel 2.6.21-falinux                       
falinux login:
                                              
[root@falinux ~]$ mount -t nfs -o nolock,rsize=1024,wsize=1024 xxx.xxx.xxx.xxx:/nfs /mnt/nfs
[root@falinux ~]$ cd /mnt/nfs/
[root@falinux nfs]$ ls -al
drwxrwxrwx    2 1007     1001         4096 Jun 20  2008 .
drwxrwxrwx    3 root     root         4096 Jun 20  2008 ..
-rwxr-xr-x    1 1007     1001        12890 Jun 20  2008 app_gpio
-rw-r--r--    1 1007     1001         5799 Jun 20  2008 dev_gpio.ko

위의 dev_gpio.ko와 app_gpio 파일을 확인합니다.

  1. 디바이스 드라이버를 적재합니다.
[root@falinux nfs]$ insmod dev_gpio.ko 

register device S3C2440 GPIO F Port ver 1.00 OK (major=194)
  1. 정상적으로 적재되었는지 확인합니다.
[root@falinux nfs]$ lsmod 
Module                  Size  Used by    Not tainted
dev_gpio                3304  0 
  1. 인터럽트를 사용하므로 인터럽트가 정상적으로 등록되었는지 확인합니다.
[root@falinux nfs]$ cat  /proc/interrupts 
           CPU0
 30:      75399         s3c  S3C2410 Timer Tick
 32:          0         s3c  s3c2410-lcd
 33:          0         s3c  s3c-mci
 37:         13         s3c  s3c-mci
 42:          0         s3c  ohci_hcd:usb1
 43:          0         s3c  s3c2440-i2c
 52:          0     s3c-ext  s3c-mci
 57:          0     s3c-ext  EINT-TEST       <--------- 정상 인텁러트 확인
 60:        953     s3c-ext  eth0
 76:        368   s3c-uart2  s3c2440-uart
 77:        480   s3c-uart2  s3c2440-uart
 79:          0     s3c-adc  s3c2410_action
 80:          0     s3c-adc  s3c2410_action
 83:          0           -  s3c2410-wdt
 84:        422           -  AC97
Err:          0
[root@falinux nfs]$
  1. 디바이스 드라이버가 정상적으로 적재되었다면 EZ-S3C2440보드이 S3 스위치를 누르면 인터럽터 동작 메세지와 함께 DEBUG LED 하나가 ON되는지 확인해 보세요.
[root@falinux nfs]$
--> gpio_btn_interrupt) Rising edge triggered interrupt irq [57]
--> gpio_btn_interrupt) Rising edge triggered interrupt irq [57]
--> gpio_btn_interrupt) Rising edge triggered interrupt irq [57]
--> gpio_btn_interrupt) Rising edge triggered interrupt irq [57]
--> gpio_btn_interrupt) Rising edge triggered interrupt irq [57]
--> gpio_btn_interrupt) Rising edge triggered interrupt irq [57]
--> gpio_btn_interrupt) Rising edge triggered interrupt irq [57]
--> gpio_btn_interrupt) Rising edge triggered interrupt irq [57]
--> gpio_btn_interrupt) Rising edge triggered interrupt irq [57]
--> gpio_btn_interrupt) Rising edge triggered interrupt irq [57]
--> gpio_btn_interrupt) Rising edge triggered interrupt irq [57]
--> gpio_btn_interrupt) Rising edge triggered interrupt irq [57]

Enter키를 누르면 프롬프트가 나옵니다.

[root@falinux nfs]$
[root@falinux nfs]$
참고이 인터럽트는 키가 눌러졌다가 OFF 될때 즉, LOW->HIGH가 될때 검출하게 해 놓았습니다.
소스 코드의 66 ~ 70 라인의 설정을 확인 해 보세요.

dev_gpio.c

66     // 인터럽트 설정 ====================================================^M
67     // IRQT_FALLING, IRQT_RISING, IRQT_LOW, IRQT_HIGH^M
68     gpio_direction_input( S3C2410_GPG5  );      // 입력 설정
69     set_irq_type( IRQ_EINT13, IRQT_RISING  );   // RISING edge
70     s3c2410_gpio_pullup( S3C2410_GPE11, 1 );    // pullup enable

이 코드에서 주의 사항은 인터럽트 설정을 위해서는 다음 순서로 하셔야 합니다.

  1. GPIO를 입력상태로 만든다
  2. 인터럽트의 Edge상태를 설정한다.
  3. 내부 풀업을 Enable 할 것인지 Desable 할 것인지 설정한다.
  1. 테스트 프로그램 실행하기

테스트 프로그램은 GPIO ON/OFF, 키 입력을 테스트하게 만들어 놓았습니다.

[root@falinux nfs]$ ./app_gpio

  Program Ver Ver 1.00  Jun 20 2008 22:57:10

  k. gpio read  Switch           ez) k 0
  s. gpio set   0 ~ 7            ex) s 5
  c. gpio clr   0 ~ 7            ex) c 5

     0 : GPF0   2 : GPF1
     1 : GPF2   3 : GPF3
     4 : GPF4   5 : GPF5
     6 : GPF6   7 : GPF7

[root@falinux nfs]$

./app_gpio 라고 입력하면 도움말이 나옵니다.

k 옵션은 키입력으로 EZ-S3C2440 보드의 S4 스위치를 누르면 ON/OFF 상태를 표출합니다.
s 옵션은 GPIO F Port를 HIGH 상태로 만듭니다.
c 옵션은 GPIO F Port를 LOW 상태로 만듭니다.

키 입력 테스트

1초에 한번씩 읽어오게 하였습니다. 종료는 Ctrl + c 를 누르면 됩니다.

[root@falinux nfs]$ ./app_gpio k 0

  Program Ver Ver 1.00  Jun 20 2008 23:31:30

  Switch Button Push.

  GPG11 Switch OFF
  GPG11 Switch OFF
  GPG11 Switch OFF
  GPG11 Switch OFF
  GPG11 Switch ON
  GPG11 Switch ON
  GPG11 Switch ON
  GPG11 Switch OFF
  GPG11 Switch OFF
  GPG11 Switch OFF
  GPG11 Switch ON
  GPG11 Switch ON
  GPG11 Switch ON
  GPG11 Switch OFF
  GPG11 Switch OFF

[root@falinux nfs]$

GPIO 출력 테스트

현재 GPIO F Port 0 ~ 7 번까지만 동작하게 되어 있습니다.

GPF0 ~ GPF3까지는 EZ-S3C2440보드의 H2 - 41 ~ 44 를 측정장비(테스트기...)로 확인이 가능하며,
GPF4 ~ GPF7까지는 EZ-S3C2440보드의 H2 - 45, 46, 67, 68 를 측정장비(테스트기...)로 확인하거나,
EM-S3C2440모듈의 DEBUG LED D3, D4, D5, D6 를 통하여 확인 할 수 있습니다.
ON 테스트시는 GPIO가 HIGH 상태이므로 DEBUG LED는 OFF 되는 것이 정상입니다.

ON 테스트

[root@falinux nfs]$ ./app_gpio s 0

  Program Ver Ver 1.00  Jun 20 2008 23:31:30

  GPIO-F 0 HIGH ...

[root@falinux nfs]$ ./app_gpio s 1

  Program Ver Ver 1.00  Jun 20 2008 23:31:30

  GPIO-F 1 HIGH ...

[root@falinux nfs]$ ./app_gpio s 2

  Program Ver Ver 1.00  Jun 20 2008 23:31:30

  GPIO-F 2 HIGH ...

[root@falinux nfs]$ ./app_gpio s 3

  Program Ver Ver 1.00  Jun 20 2008 23:31:30

  GPIO-F 3 HIGH ...

[root@falinux nfs]$ ./app_gpio s 4

  Program Ver Ver 1.00  Jun 20 2008 23:31:30

  GPIO-F 4 HIGH ...

[root@falinux nfs]$ ./app_gpio s 5

  Program Ver Ver 1.00  Jun 20 2008 23:31:30

  GPIO-F 5 HIGH ...

[root@falinux nfs]$ ./app_gpio s 6

  Program Ver Ver 1.00  Jun 20 2008 23:31:30

  GPIO-F 6 HIGH ...

[root@falinux nfs]$ ./app_gpio s 7

  Program Ver Ver 1.00  Jun 20 2008 23:31:30

  GPIO-F 7 HIGH ...

[root@falinux nfs]$

현재 GPIO F Port 0 ~ 7 번까지만 동작하게 되어 있습니다.

GPF0 ~ GPF3까지는 EZ-S3C2440보드의 H2 - 41 ~ 44 를 측정장비(테스트기...)로 확인이 가능하며,
GPF4 ~ GPF7까지는 EZ-S3C2440보드의 H2 - 45, 46, 67, 68 를 측정장비(테스트기...)로 확인하거나,
EM-S3C2440모듈의 DEBUG LED D3, D4, D5, D6 를 통하여 확인 할 수 있습니다.
ON 테스트시는 GPIO가 LOW 상태이므로 DEBUG LED는 ON 되는 것이 정상입니다.

OFF 테스트

[root@falinux nfs]$ ./app_gpio c 0

  Program Ver Ver 1.00  Jun 20 2008 23:31:30

  GPIO-F 0 LOW ...

[root@falinux nfs]$ ./app_gpio c 1

  Program Ver Ver 1.00  Jun 20 2008 23:31:30

  GPIO-F 1 LOW ...

[root@falinux nfs]$ ./app_gpio c 2

  Program Ver Ver 1.00  Jun 20 2008 23:31:30

  GPIO-F 2 LOW ...

[root@falinux nfs]$ ./app_gpio c 3

  Program Ver Ver 1.00  Jun 20 2008 23:31:30

  GPIO-F 3 LOW ...

[root@falinux nfs]$ ./app_gpio c 4

  Program Ver Ver 1.00  Jun 20 2008 23:31:30

  GPIO-F 4 LOW ...

[root@falinux nfs]$ ./app_gpio c 5

  Program Ver Ver 1.00  Jun 20 2008 23:31:30

  GPIO-F 5 LOW ...

[root@falinux nfs]$ ./app_gpio c 6

  Program Ver Ver 1.00  Jun 20 2008 23:31:30

  GPIO-F 6 LOW ...

[root@falinux nfs]$ ./app_gpio c 7

  Program Ver Ver 1.00  Jun 20 2008 23:31:30

  GPIO-F 7 LOW ...

[root@falinux nfs]$

6. 마치며

이 소스 코드가 EZ-S2440 보드를 사용하는데 조금이나마 도움이 되었으면 합니다.