![](/zbxe/layouts/mr_layouts_1st/images/default/blank.gif)
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 )
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 파일을 확인합니다.
- 디바이스 드라이버를 적재합니다.
[root@falinux nfs]$ insmod dev_gpio.ko register device S3C2440 GPIO F Port ver 1.00 OK (major=194)
- 정상적으로 적재되었는지 확인합니다.
[root@falinux nfs]$ lsmod Module Size Used by Not tainted dev_gpio 3304 0
- 인터럽트를 사용하므로 인터럽트가 정상적으로 등록되었는지 확인합니다.
[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]$
- 디바이스 드라이버가 정상적으로 적재되었다면 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]$
- 테스트 프로그램 실행하기
테스트 프로그램은 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 보드를 사용하는데 조금이나마 도움이 되었으면 합니다.
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
70번째 줄에서 GPE11로 되어있는데 GPG5가 되어야 되는것 아닌가요?
뭔가 의미가 있는것인지 아님 단순히 잘못 입력하신것인지 궁금합니다~