GPIO (General Purpose Input Output) 장치는 임베디드 환경처럼 새로운 포트의 추가가 용이하지 않을 때 사용할 수 있는 방법이다. GPIO를 사용하면 특정 포트를 입력 혹은 출력 용으로 변경하여 사용할 수 있다.
각 보드에는 GPIO 포트 관련 레지스터에 대한 정보들이 같이 제공된다.
GPIO를 제어하는 레지스터는 세 가지로 나누어 볼 수 있다.
GP?CON : 핀의 사용 방법을 결정한다.
GP?DAT : GPIO의 출력으로 사용될 때 이 레지스터에 1을 쓰면 전압이 구동되고, 0을 쓰면 0V가 된다. 입력으로 사용될 때에는 전압이 구동된 상태이면 1이 되고, 0V인 경우에는 레지스터값이 0이 된다.
GP?UP : Pullup 레지스터로서 입력신호에 대해서 약하게 전압이 구동될 수 있는 풀업 저항이며, 출력 신호의 경우에는 풀업 저항을 제거한다.
Rebis 보드의 경우 S3C2440을 사용하는데, 여기에서는 GPIO 포트는 다음과 같다.
s3c2440x는 130개의 다기능(Multi-functional) Input/Output 포트핀을 가지고 있으며, 총 8개의 포트 그룹으로 나누어 관리한다.
- Port A (GPA) : 25-output port
- Port B (GPB) :11-input/output port
- Port C (GPC) : 16-input/output port
- Port D (GPD) : 16-input/output port
- Port E (GPE) : 16-input/output port
- Port F (GPF) : 8-input/output port
- Port G (GPG) : 16-input/output port
- Port H (GPH) : 9-input/output port
- Port J (GPJ) : 13-input/output port
각 포트 핀은 일반적인 Input/Output 기능 외에 다른 신호 핀으로 사용될 수 있도록 다중 송신 (Multiplexed) 방식으로 되어 있다.
각 레지스터의 하드웨어 주소는 마찬가지로 보드에서 제공해주며, s3c2440 계열인 경우에는 커널의 include/asm/arch-s3c2440/s3c2440.h 에서 확인할 수 있다. 여기서는 Rebis 보드에 대해 LED 테스트와 Keypad 테스트를 다루고자 한다.
LED 테스트
먼저, LED에 대한 회로도를 보겠다.
Rebis 보드에는 세 개의 LED가 있으며, 회로도에서 보는 것처럼 GPE 12번 핀, GPG 5번 핀, GPE 11번 핀을 사용한다.
해당 포트를 쓰기 위해서는 각각에 대한 Control 레지스터에 대해서 다음과 같이 설정한다.
GPECON[23:22] 를 01로 설정 : GPE11을 output 모드로 설정하게 됨
GPGCON[11:10] 를 01로 설정 : GPG5를 output 모드로 설정하게 됨
GPECON[25:24] 를 01로 설정 : GPE12를 output 모드로 설정하게 됨
GPEUP, GPGUP 은 disable 상태로 둠
해당 LED를 설정하려면 먼저 해당 레지스터에서 값을 읽으려는 부분을 clear 시킨 후 값을 서야만 정상적으로 동작한다(이때, clear 한 부분에 대해서만 값을 변경한다). 레지스터의 주소는 다음과 같다.
rGPGCON : 0xF0E00000 + 0x60
rGPGDAT : 0xF0E0000 + 0x64
rGPGUP : 0xF0E00000 + 0x68
rGPECON : 0xF0E00000 + 0x40
rGPEDAT : 0xF0E00000 + 0x44
rGPEUP : 0xF0E00000 + 0x48
미완성 예제
컴파일 방법 : arm-linux-gcc led_drv.c -c -D__KERNEL__ -DMODULE -I<커널소스의 헤더파일 디렉토리>
컴파일된 파일을 보드가 가져갈 수 있는 NFS export 경로에 올리고, 보드에서 insmod로 테스트하면 된다.
Keypad 테스트
위 회로도를 보면 KEYOUT은 GPB0~GPB4핀에 연결되어 있으며, KEYIN은 GPF3~GPF7에 연결되어 있는 것을 알 수 있다. 아무 키도 눌리지 않았을 때에는 KEYIN이 VDD에 연결되어 있기 때문에 기본값으로 '1' 값이 들어오게 된다. 따라서, 키가 눌렸는지 확인하려면 KEYOUT의 GPBDAT 값을 '0'으로 먼저 설정해 주어야 한다.
rGPBCON : 0xF0E00000 + 0x10
rGPBDAT : 0xF0E0000 + 0x14
rGPBUP : 0xF0E00000 + 0x18
rGPFCON : 0xF0E00000 + 0x50
rGPFDAT : 0xF0E00000 + 0x54
rGPFUP : 0xF0E00000 + 0x58
rGPFDAT를 통해서 현재 눌려진 키스캔 값을 얻을 수 있다.
rGPFDAT값을 읽기 위해서는 먼저 rGPBCON에 다음과 같은 형태로 얻고자 하는 키보드 관련 부분을 설정해 준다. 먼저 GPBCON을 output 모드로 설정한다. 또한, GPBDAT를 1(High)로 설정하고 GPBUP은 disable 시킨다.
rGPBCON &= ~(0x3ff); // GPxCON은 2비트씩이 하나를 나타내기 때문에 총 10비트 clear
rGPBCON |= (0x1 << 8); // 읽고자 하는 키의 위치를 01(Output 모드)로 함
키 값을 읽기 위해서는 GPFCON3~7을 Input 모드로 설정해 주고 GPFUP은 Disable 시킨다. 키값을 읽기 위해서는 GPFDAT부분에 대해서 0이 되었는지를 확인하면 된다. REBIS 보드의 경우에는 총 25개의 키가 있기 때문에 각각에 대해서 체크하면 된다. 즉, KEYOUT부분이 바뀔때마다 KEYIN0~4를 각각 체크해서 값이 0인 경우 키가 눌린 것이다.
'Linux > Embedded' 카테고리의 다른 글
| GPIO (0) | 2008/01/23 |
|---|---|
| 루트 파일 시스템 만들기 (0) | 2008/01/23 |
| Rebis 보드용 2.4.18 커널에 시스템 호출 추가하기 (0) | 2008/01/22 |
| Rebis 보드에 커널 이미지 올리기 위한 설정 과정 및 강의자료 (0) | 2008/01/18 |
| Embedded Linux 관련 링크들 (0) | 2007/10/08 |
led_drv.c
이올린에 북마크하기
이올린에 추천하기


댓글을 달아 주세요