준비운동하기

우선 시작하기 전에 저번 문서에서 언급한 준비물을 기억하는가??
독자의 기억력이 좋다면, 내가 이번 문서에서 사용할 보드가 어떤 것인지 알고 있을 것이다. 저번 문서도 그렇지만, 이 문서를 이해하려면 어느 정도 사전지식이 필요하다.
무턱대고 따라 해서 원하는 결과를 얻을 수는 있겠지만, 왠지 찝찝한 기분은 어쩔 수 없을 것이다. 이 문서를 보고 이해가 잘 안간다면, 다음의 사이트를 참고하자!

http://www.hybus.net/lecture/lecture_22.php

대략적인 동작 방식을 설명하면,

  1. host pc에다가 크로스 컴파일 환경을 만들어 준다.
  2. 부팅에 필요한 부트로더와 커널을 컴파일을 한 뒤 부트 이미지와 커널 이미지를 target board로 전송한다.
  3. GPIO를 제어하는 프로그램을 작성한다.

그럼 이제부터 본격적인 설치 및 설정에 들어가 보도록 한다.

host pc에 크로스 컴파일 환경 구축

target board에서 직접 컴파일 할 수가 없기 때문에 host pc에다가 board와 같은 환경을 구축해주어야 한다.
이전 문서에서도 언급했지만, 우리가 사용하는 아키텍쳐는 StrongArm-1110 이다.
target board와 같은 환경이라 함은 strong-arm 용 컴파일러 도구들을 말한다. 이 것들은 일반적으로 board를 개발하는 업체나 사이트에 가면 무료로 다운 받을 수 있도록 하고 있다. 필자의 보드 또한 그러했다.

http://www.hybus.net/download/download_1.php

☞ 사이트 중간에 보면, ‘ToolChain(wow 7.1 이후 버젼용)’ 이라고 되어 있는 rpm 파일 3개를 받으면 된다.
받았으면 설치를 해보자~!!

#rpm -Uvh arm-linux-*

설치를 해보았으면, 제대로 Path 가 걸렸는지 아무 경로나 가서 ‘Tab'키를 눌러보자!! arm-linux-gcc 가 뜨는가? 만일 안 나온다면, 제대로 안 걸린 것이다. 다음과 같이 하자.

#vi /root/.bash_profile
PATH=/usr/local/sbin:/usr/sbin/:/sbin:$PATH:$HOME/bin:/usr/local/arm-linux/bin

위와 같이 경로를 추가해준다. 그리고

#source /root/.bash_profile

해준다. 이것으로써 크로스 컴파일 환경은 만들어 주었다.
이제 본격적으로 소스를 컴파일 해보자!

#vi hello.c
#include <stdio.h>
main()
{
printf("hello\n");
}
#arm-linux-gcc -o hello hello.c

☞ 필자의 board는 기본적으로 ftp를 지원했다. 위에서 컴파일한 오브젝트 파일을 보드에서 다운로드 받아서 실행시키는 아주 간단한(?) 방법으로 테스트를 했다.

부트로더와 커널 컴파일하기

이 부분은 조금 난해한 부분이다. 아마도 필자의 target board 환경과 다르다면, 십중팔구 제대로 결과가 나오지 않을 것이다.
우선 부트로더부터 살펴보자. 부트로더라 하면 grub나 lilo 밖에는 없는 것으로 알고 있는 데, 사실은 그렇지가 않다. 이외에도 많은 부트로더가 있다. 필자의 보드에서는 ‘blob’ 라는 부트로더를 사용한다.
우선 부트로더를 컴파일 하기 위해서 source를 다운 받아야 한다.
또한 커널또한 받아야 한다. 왜냐하면, 부트로더가 컴파일 하는 데 필요하기 때문이다.
다음의 사이트에서 다운받도록 하자!

http://www.hybus.net/download/download_1.php

☞ ‘linux_hyper104.tgz' , ‘blob_2.0.5_pre2_hyper104.tgz' 을 다운받으면 된다.

우선 커널부터 압축을 풀어주고, 경로를 /usr/src/linux 로 바꾸어준다.

#tar xzvf linux_hyper104.tgz
#cp -rf linux-hyper104 /usr/src
#cd /usr/src
#ln -s linux-hyper104 linux
#cd linux
#make hyper104_config   -> .config 파일 생성
#make menuconfig   -> 'Load Configuration File'에서 .config 선택
#make dep

이제는 부트로더의 압축을 풀고, 컴파일해보자!

#tar xzvf blob_2_0_5_pre2_hyper104.tgz
#cd blob-2.0.5-pre2-hyper104
#./configure --with-linux-prefix=/usr/src/linux --with-board=hyper104
#make
#cd src/blob
#./Jflash-hyper104 blob    -> JTAG이라는 병렬포트를 이용해서 업로드 한다.

☞ 최신 커널(2.4.x)의 경우 Jflash-hyper104 프로그램이 제대로 동작하지 않을 수 있다.
이럴때는 위의 사이트에서 Jflash 소스를 따로 받아서 컴파일 해 주어야 한다.

#make

☞ 그런데 아래와 같이 컴파일 오류가 날 수가 있다.

Jflash.cpp:71 : 'main' must return 'int'
make: +++ [Jflash-hyper104]오류 1

이럴 경우 당황하지 말고, Jflash.cpp의 71번째 줄의 'void'를 ‘int'로 바꾸어 주면 된다.

이번에는 kernel 컴파일을 해보자!!
위에서 ‘make dep' 단계까지 했던 것을 기억하는가?
이어서 다음 단계로 넘어가자!

#make zImage
#make modules
#make modules_install
#cd arch/arm/boot
#cp zImage /tftpboot/    <- 왜 커널 이미지를 이곳으로 복사하는지는 아래에 설명하겠다

지금은 현재 부트로더만 target board에 올라가 있는 상태다. 그래서 host pc에 있는 커널 이미지를 target board에 전송하기 위해서는 tftp 와 bootp를 이용해야 한다.
여기서는 잠시 삼천포(?)가 아닌 host pc의 설정을 살펴보도록 하자!
이전 문서에서 보았겠지만, host pc에는 wowlinux 7.1이 설치되어 있다.
왜 최신 배포판을 설치하지 않았냐고 반문할지도 모르지만, 우리가 이 문서에서 올리려는 커널 버전이 2.4.5 이다. 그렇기에 이 버전과 가장 가까운 배포판을 찾다보니, wow 7.1을 선택하게 된 것이다.
우선 host pc에 tftp, bootp 패키지가 설치되었는지부터 확인하자.
만일 설치가 안 되었다면, 다음의 사이트에서 다운로드 받아, 설치하자.

http://www.hybus.net/download/download_1.php

☞ 중간에 bootp, tftp-server 에 있다.

설치했다면, 설정해보자!

제일 먼저 데몬를 실행을 체크해야 한다. 아래와 같이 Host PC에 세 개의 파일이 존재해야 한다.
없다면 생성을 해 주어야 한다.

[root@hybus root]# cat /etc/bootptab
hyper104:ht=1:ha=0x00D0CAD12577:ip=192.168.1.10:sm=255.255.255.0
 
//ht는 하드웨어 타입을 의미하고 1은 Ethernet을 의미 한다.
//ha는 타겟보드(Hyper104)의 MAC 어드레스이다.
//ip는 타겟보드(Hyper104)의 ip이다.

bootptab 파일은 bootp 를 위한 설정파일이다.
아래의 설정들은 xinetd 데몬에 등록시키는 파일들이다.

[root@hybus root]# cat /etc/xinetd.d/bootp 
service bootps 
{ 
    disable = no 
    socket_type = dgram 
    protocol = udp 
    wait = yes 
    user = root 
    server = /usr/sbin/bootpd 
} 
 
[root@hybus root]# cat /etc/xinetd.d/tftp 
service tftp 
{ 
    socket_type = dgram 
    protocol = udp 
    wait = yes 
    user = root 
    server = /usr/sbin/in.tftpd 
    server_args = -s /tftpboot 
    disable = no 
}

점검해야 할 사항 몇 가지를 적어준다.

1. 타겟보드에서 btp를 친 후, 호스트에서 bootpd가 뜨는지 확인을 한다. 데몬 확인은 ps aux 하시면 bootpd 데몬이 떠야 한다. 안 뜨면 인터넷 케이블이나, xined의 설정 문제이다.

2. 케이블도 문제가 아니고, xined의 문제도 아닐 경우는 방화벽의 문제도 있을 수가 있다. lokkit 명령으로 방화벽을 없애준다.

3. bootpd 가 뜬다면, 이건 bootptab 설정 문제이다. 재확인 하시고 데몬을 재 실행 하기 바란다.(/etc/rc.d/init.d/xinetd restart)


다시 target board로 돌아와서, 우선 부트로더만 올라간 board를 부팅시킨다.
부팅도중에 키(key)를 입력하면, boot> 라는 프롬프트가 뜬다.
그리고는 btp를 입력해보자!

boot>btp

♧ 만일 지정한 IP를 받아오지 못하면 위의 bootp 설정을 다시 한번 살펴보기 바란다.

boot>tftp zImage kernel

도중에 에러가 없었다면 성공적으로 커널 이미지가 board에 올라갔다고 보면 된다.
이제는 실제로 부팅을 해보자!
제대로 부팅이 된다면, 제대로 컴파일 된 것이다. 만일 중간에 멈추거나 에러가 난다면, 커널 옵션을 확인해본다.
커널을 다운로드 받은 뒤 전원을 끄면, 이전에 받았던 커널은 지워진다. 그래서 Flash rom 에다가 저장을 시켜야 한다.

boot>flash kernel

GPIO를 이용한 LED 제어 모듈 프로그램 구현

이 문서와 함께 첨부하는 파일 gpio.c 을 한 부분을 잠깐 보면, 다음과 같다.

GPDR = GPIO_GPIO(5);    -> GPIO 5번 key를 지정

☞ 아래처럼 헥사 값을 어떻게 수정하느냐에 따라 달라진다.

GAFR = 0x0000     -> LED 점등(파일명 : gpio_on.o)
or
GAFR = 0xFFFF     -> LED 소등(파일명 : gpio_off.o)

하나는 LED를 점등하는 모듈, 다른 하나는 LED를 소등하는 모듈 이렇게 각각 2개의 오브젝트 파일을 만든다. 이제는 응용프로그램을 컴파일 해야 할 차례다.

필자가 올려 놓은 board.tar 파일을 풀고

#make

해주면 컴파일 되어서 두개의 모듈 파일과 test 파일이 생성될 것이다.

이전 문서에서도 잠깐 언급했지만, 우리는 해당 모듈을 올려주고 응용프로그램에서 그것을 제어하는 방식으로 구현을 할 것이다.
우선 현재 LED 점멸 모듈과 응용 프로그램은 준비가 되었다.
이제는 자동으로 모듈을 올려주고 응용프로그램을 실행해줄 수 있는 lamp 라는 쉘 스크립트 파일을 작성해야 한다.
lamp라는 쉘 스크립트를 이용해서 target board 상에서 LED를 점멸 시켜 보자!!

☞ 필자가 문서상에서 소스를 펼쳐 보이지 않는 이유는 문서의 분량이 너무 방대해 질 것을 우려했기 때문이다. 이점 양해해주기 바란다. 물론 소스는 문서와 함께 게시판에 올릴 예정이다.
또한 쉘 스크립트 파일의 경우 자신의 환경(경로)에 맞게 수정해야 할 것이다. 그렇지 않으면 동작하지 않는다.

  • computer/embedded/임베디드_시스템을_이용한_웹상에서의_가전제품_제어하기2.txt
  • Last modified: 3 years ago
  • by likewind