ARM 칩에 대한 GPIO 테스트프로그램은 이미 "EZ-S3C2440 보드의 GPIO 테스트 프로그램"에 올리고 어떻게 컴파일하는지 설명을 드렸습니다. 이번에 다시 EZ-AU1200에 대해서 올리는 이유는 CPU 칩에 따라서 호출할 수 있는 함수가 조금씩 다르다고 합니다. 일반 에플리케이션 프로그램 같은 경우 ARM용 프로그램도 컴파일러만 변경하면 대부분 MIPS 용 프로그램으로 재 컴파일될 수 있습니다.
그러나 디바이스 드라이버는 하드웨어에 매우 밀접하다 보니 아무래도 칩마다 사용할 수 있는 최 하위 함수가 다른 것으로 생각됩니다. 이런 이유로 EZ-AU1200에 대한 GPIO 테스트 프로그램을 첨부합니다. 이전에 올려드린 EZ-S3C2440 샘플과 비교하면 좋은 참고가 되지 않을까 싶습니다.
이번 샘플도 역시 (주)에프에이리눅스의 장형기 팀장님께서 제공해 주셨습니다. 이 글을 빌어 장형기 팀장님께께 감사의 말씀을 올립니다.
- 샘플 다운로드:dev-gpio-au1250.tar.gz
커널 소스 준비하기
커널 소스 다운로드 및 풀기
FALINUX SDK에 있는 커널 소스를 내려 받아 적당한 곳에 풀기를 합니다. 제 홈 디렉토리는 /home/jwjw 이며, /home/jwjw/ez-board/ 에 풀기를 하겠습니다.
- http://ftp.falinux.com/kernel/recommendation/ 에서 linux-2.6.21.tar.gz 를 내려 받습니다.
*** 버전없으로 커널 소스의 파일명이 변경될 수 있습니다. - /home/jwjw/ez-board에 압축 풀기를 합니다.
]$ cd /home/jwjw/ez-board
]$ tar zxvf linux-2.6.21.tar.gz
압축 파일 풀기를 마치면 커널 소스는 /home/jwjw/ez-board/linux-2.6.21 에 풀립니다.
커널 소스 컴파일하기
디바이스 프로그램이 컴파일하기 위해서는 커널 소스부터 먼저 컴파일해 놓아야 합니다.
]$ cd /home/jwjw/ez-board/linux-2.6.21 ]$ ./falinux-config.sh ez-au1200 ]$ make distclean // 모든 환경 설정 및 컴파일 결과를 삭제 ]$ ./falinux-config.sh ez-au1200 // 미리 준비된 기본 값을 환경 값을 생성 ]$ make clean ]$ make zImage // zImage에서 I 가 영문 대문자 I(아이)임에 주의하세요.
이제 커널 소스 준비는 끝났습니다. ^^
샘플 프로그램 컴파일 및 실행하기
샘플 프로그램 풀기
본 강좌에 첨부된 dev-gpio-au1250.tar.gz 파일을 역시 적당한 곳에 풀기를 합니다. 저는 /home/jwjw/ez-board 에 풀겠습니다.
]$ cd /home/jwjw/ez-board ]$ tar zxvf dev-gpio-au1250.tar.gz
샘플 프로그램 컴파일 및 실행하기
]$ cd /home/jwjw/ez-board/dev-gpio
]$ make clean
]$ make
make -C /home/jwjw/ez-board/linux-2.6.21 SUBDIRS=/home/jwjw/ez-board/dev-gpio modules
make[1]: Entering directory `/home/jwjw/ez-board/linux-2.6.21'
CC [M] /home/jwjw/ez-board/dev-gpio/dev_gpio.o
/home/jwjw/ez-board/dev-gpio/dev_gpio.c: In function `gpio_ioctl':
/home/jwjw/ez-board/dev-gpio/dev_gpio.c:160: warning: unused variable `rtn'
/home/jwjw/ez-board/dev-gpio/dev_gpio.c: In function `hw_gpio_set':
/home/jwjw/ez-board/dev-gpio/dev_gpio.c:98: warning: control reaches end of non-void function
/home/jwjw/ez-board/dev-gpio/dev_gpio.c: In function `hw_gpio_clr':
/home/jwjw/ez-board/dev-gpio/dev_gpio.c:114: warning: control reaches end of non-void function
/home/jwjw/ez-board/dev-gpio/dev_gpio.c: In function `hw_gpio_in':
/home/jwjw/ez-board/dev-gpio/dev_gpio.c:122: warning: 'rtn' might be used uninitialized in this function
Building modules, stage 2.
MODPOST 1 modules
CC /home/jwjw/ez-board/dev-gpio/dev_gpio.mod.o
LD [M] /home/jwjw/ez-board/dev-gpio/dev_gpio.ko
make[1]: Leaving directory `/home/jwjw/ez-board/linux-2.6.21'
cp -f dev_gpio.ko /nfs/au1200/. // 이 행의 내용은 무시합니다.
cp: cannot create regular file `/nfs/au1200/.': 그런 파일이나 디렉토리가 없음 // 이 행의 내용은 무시합니다.
make: *** [default] 오류 1
]$
마지막에 /nfs/au1200 에러는 결과물을 복사하는 스크립트이므로 무시합니다. 이 에러 외에 캡쳐 화면에서처럼 에러 없이 빌드되면 성공한 것입니다.
이제 테스트해 보겠습니다. 아래의 화면은 EZ-AU1200에서 작업하는 내용입니다.
// 이 화면은 EZ-AU1200에서 실행한 모습입니다. ]$ mount -t nfs -o nolock 192.168.10.99:/home/jwjw /mnt/nfs ]$ cd /mnt/nfs/ez-board/dev-gpio ]$ insmod dev_gpio.ko // 디바이스드라이버가 제대로 커널에 올라왔는지 확인합니다. register device gpio ctrl ver 0.10 OK (major=241) // Good!! ]$
본 샘플은 "EZ-S3C2440 보드의 GPIO 테스트 프로그램"과 테스트하는 방법이 조금 틀립니다. EZ-S3C2440용 샘플도 장형기팀장님께서 작성하셨습니다만, 이먼 EZ-AU1200 샘플에는 인터럽트처리가 빠져 있어서,
- 디바이스 드라이버 만으로 테스트가 안 됩니다.
- make 후에 함께 컴파일된 app_gpio 를 실행해 주셔야 하며,
- EZ-S3C2440 샘플에서는 S3버튼을 이용했지만 이번 샘플은 모듈 위에 있는 두개의 스위치로 더욱 간단하게 테스트할 수 있습니다.
이제 app_gpio를 실행합니다.
// 이 화면은 EZ-AU1200에서 실행한 모습입니다. ]$ ./app_gpio KEY_1 OFF KEY_2 OFF KEY_1 OFF // 계속 스크롤됩니다. KEY_2 OFF KEY_1 OFF KEY_2 OFF KEY_1 OFF KEY_2 OFF KEY_1 OFF KEY_2 OFF KEY_1 OFF
이제 모듈 위에 있는 버튼 중 어느 하나를 눌러 보세요.
버튼을 누를 때 마다 화면 출력 문자열이 아래와 같이 변경됩니다.
// 이 화면은 EZ-AU1200에서 실행한 모습입니다. : KEY_1 OFF KEY_2 OFF KEY_1 OFF // 계속 스크롤됩니다. KEY_2 OFF KEY_1 ON // 왼쪽 버튼을 눌렀을 때 KEY_2 OFF KEY_1 ON // 왼쪽 버튼을 눌렀을 때 KEY_2 OFF KEY_1 ON // 왼쪽 버튼을 눌렀을 때 KEY_2 OFF KEY_1 OFF
사진만으로는 테스트하는 모습을 설명하기 힘들어서 동영상으로 준비해 보았습니다.