'2008/01/23'에 해당되는 글 2건

  1. 2008/01/23 GPIO
  2. 2008/01/23 루트 파일 시스템 만들기

GPIO

Linux/Embedded 2008/01/23 21:42

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인 경우 키가 눌린 것이다.


크리에이티브 커먼즈 라이선스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by Daniel Kwon

임베디드 리눅스를 설치할 때 커널 이미지와 함께 반드시 꼭 작성해야 하는 것이 루트 파일 시스템이다. 루트 파일 시스템은 "/"로 마운트될 수 있는 파일 시스템을 말한다. 즉, /etc, /usr, /var, /tmp 등등 중요한 모든 파일 디렉토들이 설정되어 있으며, 필요한 명령이나 설정 파일이 들어 있는 이미지를 생각하면 된다.

임베디드 장비는 리소스의 제한이 많기 때문에 루트 파일 시스템에 들어가는 내용을 필요한 내용만 가지도록 최소화 시킬 필요가 있다. 따라서, 실행을 위한 프로그램 뿐만 아니라 관련된 라이브러리들도 필요한 것들로만 배치해야 한다. 일반적인 리눅스 명령과 연관된 프로그램들의 경우에는 busybox와 같은 프로그램을 대신 사용하면 용량을 절약할 수 있다. 라이브러리의 경우에는 glibc의 경량화 버전을 찾아서 사용하면(이전 포스팅 중에 몇몇 사이트를 적어놨다) 도움이 된다. 추가적으로 필요한 라이브러리가 어떤 것이 있는지 확인하려면 'ldd' 명령을 사용하면 된다.

[ ~]# ldd /bin/bash



이 명령을 사용하면 관련된 라이브러리 목록을 볼 수 있다.

다음은 필요한 파일들이 선택된 상태에서 루트 파일 시스템을 만드는 방법을 두 가지 형태로 살펴보도록 하겠다.

램 디스크

램디스크를 사용하기 위해서는 루프백 디바이스 지원과 램디스크 지원을 먼저 설정해야 한다.
각각은 커널 설정화면에서 "Block devices" 메뉴에서 "Loopback device support"와 "RAM disk support"를 통해서 할 수 있다.

이미지를 만들기 위해서는 먼저 루프백 디바이스가 사용 가능한지 확인해 봐야 한다.

ls /dev/loop*

루프백 디바이스가 존재한다면, 원하는 크기만큼의 파일을 만든 다음 루프백 디바이스와 연결해 주어야 한다.

dd if=/dev/zero of=my_ram_disk bs=1k count=8192

losetup /dev/loop0 my_ram_disk

mke2fs -j /dev/loop0



먼저 8MB짜리 파일을 하나 만든 후 루프백 디바이스 0번과 연결해 준다(용량은 필요에 따라 조절해 주면 된다). 다음에는 my_ram_disk를 포맷하기 위해 연결된 루프백 장치에 대해서 저널링 형태로 포맷하도록 mke2fs 명령을 호출한다. ext3 형태로 해당 파일이 포맷된다.

파일 시스템 내에 내용을 채워 넣기 위해서는 (디렉토리 구조나 필요한 명령어들의 배치), 우선 해당 파일을 마운트를 시켜야 한다. 여기에서는 기존에 ramdisk 이미지가 하나 있는 상태를 가정하겠다. ramdisk-rebis.gz이 있는 경우에 먼저 이것을 풀어 놓고 진행한다.

gunzip ramdisk-rebis.gz
mkdir my_old
mount -o loop ramdisk-rebis ./my_old

mkdir my_tmp
mount -o loop my_ram_disk  ./my_tmp
mv ./my_old/*  ./my_tmp/
cd ./my_tmp



먼저 기존 램디크를 푼다. 다음에는 새로 마운트하려는 파일에 대한 디렉토리를 생성해주고 루프백 디바이스 형태로 my_ram_disk를 my_tmp에 마운트 한다. 일단, 기존에 가지고 있던 내용들을 my_tmp에 넣은 후에 필요하면 추가적인 내용 변경을 해주면 된다.

내용의 추가 및 변경이 모두 이루어졌으면 다음에는 해당 디렉토리를 언마운트하고 파일을 압축한다.

cd ..
umount ./my_tmp
gzip my_ram_disk
file my_ram_disk.gz


먼저 해당 디렉토리에서 빠져 나온 후 언마운트를 한다. 다음에는 해당하는 파일을 gzip을 사용해서 압축한다. 마지막으로 해당 파일이 정상적인 형태로 압축되었는지 확인해 본다.

JFFS2 파일 시스템 만들기

램디스크는 램에 올라가 있는 파일 시스템으로서 전원이 나가면 내용도 사라져 버리게 된다. 플래쉬 메모리를 하드 디스크처럼 사용할 수 있다면 이러한 문제를 겪지 않아도 될 것이다. 플래쉬는 Read-Write의 횟수에 제한이 있기 때문에 균등하게 영역을 사용할 수 있도록 해주는 것이 필요하다. 이러한 점을 고려해서 나온게 JFFS, JFFS2 파일 시스템이다. JFFS는 MTD(Memory Technology Device) 계층 위에서 동작하기 때문에 보드용 커널을 컴파일 할 때 이 부분도 같이 설정해 주어야 한다.

커널 설정 화면에서 "Filesystems" > "Miscellaneous filesystems" 에 보면 "Journalling Flash File System v2 (JFFS2) support" 화면을 볼 수 있다. 이것을 선택해 준다.  또한, MTD를 설정하기 위해서는 "Device Drivers" 에서 "Memory Technology Device (MTD) support"를 선택해 주면 된다. 추가로 "RAM/ROM/Flash chip drivers" 및 "Mappping drivers for chip access"에서 하드웨어에 관련되서 필요한 내용들을 선택한다.

이와 함께 해당 보드와 연관된 디렉토리 (drivers/mtd/maps/<보드파일>)에서 타겟 시스템을 위한 메모리 맵 정보를 확인할 수 있고 수정할 수 도 있다.

jffs 파일 시스템을 만드는 것도 램디스크를 만드는 것과 유사하다. 약간의 차이점은 단순히 압축하는 것이 아니고, mkfs.jffs2 명령을 사용해서 이미지를 만든 다는 점이다.  mkfs.jffs2 명령도 미리 설치해 두어야 한다.

예) mkfs.jffs2 -e 0x40000 -d my_disk_dir -p -o my_jffs.img


만들어진 my_jffs.img는 플래쉬에 퓨징(Fusing)하면 된다.

JFFS2의 공식 사이트 : http://sourceware.org/jffs2/

크리에이티브 커먼즈 라이선스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by Daniel Kwon