본문 바로가기

My Project/교통정리로봇

[교통정리로봇] 프로젝트 문서 2. 관련연구(두번째)

(2) ARM 보드 포팅

■ 부트로더(u-boot.bin)

부트로더의 주 임무는 커널이 동작할 수 있는 환경을 구성하고 커널을 시작하는 것입니다. 타겟보드에 부트로더가 없다면 Jflash를 사용하여 부트로더를 보드에 올려야 됩니다. 만약 부트로더가 존재 한다면Jflash를 사용하지 않아도 됩니다. 있는지 없는지는 부팅 했을 때 응답이 없다면 부트로더가 없는 것 입니다.

있다면 이 과정은 생략해도 됩니다.


CD파일이 있는 곳으로 이동합니다.


================================================================================================

[root@localhost]# cd /MV2440

[root@localhost MV2440]# cd source/Linux/mv2440_v2/240_320

================================================================================================


압축을 풉니다.


================================================================================================

[root@localhost 240_320]# tar xvf mv2440_uboot_dev.tar.gz

================================================================================================


풀린 경로로 이동을 한다.


================================================================================================

[root@localhost 240_320]# cd mv2440_uboot_dev

================================================================================================


/tftpboot 경로에 u-boot.bin 파일을 복사합니다. 리스트에 보면‘u-boot.bin’파일이 있습니다.


================================================================================================

[root@localhost mv2440_uboot_dev]# cp u-boot.bin /tftpboot

================================================================================================


 

• 부트로더 올리기

================================================================================================

[root@localhost MV2440]# minicom

================================================================================================


방법 1.

JFlash(JTage 케이블) 이용해서 부트로더 올리기(타겟보드에 부트로더(u-boot.bin)가 없을 때)

이 작업을 하기 위해서는 JTage 케이블이 필요합니다.(LAN선은 빼도 됩니다.)


Jflash 파일을 압축을 풀어 /tftpboot 경로로 복사합니다.


================================================================================================

[root@localhost MV2440]# cd tools/util/

================================================================================================


 


‘sjf2440.tar.gz’를 압축 풉니다.


================================================================================================

[root@localhost util]# tar xvf sjf2440.tar.gz

================================================================================================


압축을 풀고 압축을 푼 경로로 이동합니다.


================================================================================================

[root@localhost util]# cd sjf2440

[root@localhost sjf2440]# cp sjf2440 /tftpboot

================================================================================================


 

위 그림에서 sjf2440이 Jflash 입니다. 그 다음에 tftpboot 경로로 이동합니다.


================================================================================================

[root@localhost sjf2440]# cd /tftpboot

 [root@localhost tftpboot]# ./sjf2440 u-boot.bin /t=5       (t=5옵션은 플래쉬 타입, --help명령으로 확인)

================================================================================================

위 명령을 하면 선택을 3번하게 되어있습니다. 순차적으로 아래와 같이 선택을 합니다.


================================================================================================

[root@localhost tftpboot]# 0

[root@localhost tftpboot]# 0

[root@localhost tftpboot]# 2

================================================================================================


방법 2.

이 방법은 원래 부트로더가 존재하고 있을 때 다시 올리는 방법으로,  tftp를 이용해서 보드에 부트로더 전송을 하게 됩니다.


================================================================================================

[root@localhost MV2440]# minicom

MV2440 # tftp 30000000 u-boot.bin

MV2440 # nandw 0 20000 30000000

================================================================================================


■ 부트로더, ip설정

먼저 minicom을 실행합니다.

================================================================================================

[root@localhost tftpboot]# minicom

================================================================================================

‘Hit any key to stop autoboot: 1’ 글귀가 보이면 아무키나 누릅니다.

그리고 minicom 설정을 하는데 먼저,  Environment의 설정을 확인합니다.

================================================================================================

MV2440 # printenv

================================================================================================

이렇게 치게 되면, 밑에 그림처럼 나오게 됩니다.

 

설명을 하자면,

================================================================================================

ipaddr = 220.64.218.92          //타겟보드 주소

serverip = 220.64.218.202       //데스크탑 주소

gatewayip = 220.64.218.1        //게이트웨이 주소

================================================================================================


이 주소들을 설정하기 위해서는 명령어 setenv를 사용하여 수정을 합니다.

================================================================================================

MV2440 # setenv ipaddr 220.64.218.97    //타겟보드 주소 변경

MV2440 # setenv serverip 220.64.218.215 //데스크탑 주소 변경

MV2440 # setenv gatewayip 220.64.218.1  //게이트웨이 주소 변경

================================================================================================

다 했다면 설정을 저장해야 합니다. 만약에 저장을 하지 않으면, 수정이 되지 않습니다.

저장은 saveenv로 저장을 하면 됩니다.

================================================================================================

MV2440 # saveenv

================================================================================================


■ zImage 만들기


커널소스 압축을 풉니다.


================================================================================================

[root@localhost]# cd /MV2440

[root@localhost MV2440]# cd source/Linux/mv2440_v2/240_320

[root@localhost 240_320]# tar xvf mv2440_kernel2.4.20_r1.1.tar.gz

[root@localhost 240_320]# cd mv2440_kernel2.4.20_r1.1

================================================================================================

‘mv2440_kernel2.4.20_r1.1.tar.gz’을 압축을 풉니다. 풀었다면 ‘mv2440_kernel2.4.20_r1.1’ 경로가 생성됩니다. 여기서부터 순서가

----------------------

menuconfig 셋팅

의존성 검사

커널을 이미지 만들기

----------------------


순서로 작업을 합니다.


• menuconfig 셋팅

 mv2440_kernel2.4.20_r1.1/ 경로로 이동합니다. 이동을 하여 make menuconfig라는 명령어를 칩니다.


================================================================================================

[root@localhost mv2440_kernel2.4.20_r1.1]# make menuconfig

================================================================================================

 


위 그림이 뜨게 됩니다. 위 그림에서 Load an Alternate Configuration File을 선택해서 경로명을 적어

줍니다. 그 경로명은, ‘arch/arm/def-configs/smdk2440a’ 라고 적고 Ok를 클릭 합니다.

여기서 오탈자가 있다면 Enter the name of the configuration 창이 다시 뜨게 됩니다.

그 다음에 Save Configuration to an Alternate File 선택하고 종료합니다.


• 의존성 검사

이곳에서는 오류가 나면 안 됩니다. 오류가 나면 다시 처음부터 해 보시길 바랍니다.


================================================================================================

[root@localhost mv2440_kernel2.4.20_r1.1]# make dep

================================================================================================


• 커널을 이미지 만들기

의존성 검사에서 오류가 나지 않았다면 zImage를 생성합니다.


================================================================================================

[root@localhost mv2440_kernel2.4.20_r1.1]# make zImage

================================================================================================


대소문자를 구별해야 합니다.

실행하면 arch/arm/boot에 ‘zImage’ 파일이 생성됩니다.


================================================================================================

[root@localhost mv2440_kernel2.4.20_r1.1]# cd arch/arm/boot

================================================================================================

 


이렇게 ‘zImage’ 파일이 생성이 되었으면 이 ‘zImage’ 파일을 /tftpboot로 복사를 시켜야 됩니다.

만약 /tftpboot 경로가 없다면 만들면 됩니다.(tftp를 설치했다면 자동으로 생성되어 있습니다.)

이 경로는 Desktop PC에서 타겟보드에 파일전송 할 때 PC가 기본적으로 이 경로를 검색하게 됩니다.

================================================================================================

[root@localhost boot]# cp zImage /tftpboot/

[root@localhost boot]# cd ../../../

================================================================================================


■ cramfs 파일시스템 만들기

루트 파일 시스템은 압축 읽기 전용 파일 시스템인 cramfs를 씁니다. cramfs는 초창기에 ‘리누즈 토발즈’가 만든 파일 시스템입니다.

리눅스에서 cramfs파일 시스템 이미지 파일을 마운트해서 그 내용을 보려면


================================================================================================

 # mount -o loop [파일명] [폴더명]

================================================================================================


위 명령어와 같이 치게 되면 내용을 볼 수 있습니다. 하지만 이렇게 마운트 했던 내용은 재부팅시 모두 사라지게 됩니다.

반대로 cramfs 파일을 만들려면,


================================================================================================

# mkfs.cramfs [폴더명] [파일명]

================================================================================================

이런 식으로 적어 주면 cramfs 파일을 생성하게 됩니다.


• root.cramfs 와 sml2440_anycall.cramfs 파일 마운트하기

먼저 root.cramfs 와 sml2440_anycall.cramfs 파일 마운트를 하는 이유는 프로젝트에 맞는 cramfs 파일을 만들기 위해서 이 두 cramfs의 파일들을 써야 되기 때문에 하게 됩니다.

일단 MV2440의 CD복사한 경로로 이동합니다.


================================================================================================

[root@localhost mv2440_uboot_dev]# cd /MV2440

================================================================================================


cramfs 파일이 저장된 곳으로 이동합니다.


================================================================================================

[root@localhost MV2440]# cd source/Linux/BIN/Filesystemimage

================================================================================================


 


이 root.cramfs 와 sml2440_anycall.cramfs 파일을 /tftpboot로 복사 합니다.

================================================================================================

[root@localhost Filesystemimage]# cp * /tftpboot

================================================================================================


그다음 tftpboot 경로로 이동합니다.


================================================================================================

[root@localhost ~]# cd /tftpboot

================================================================================================


두 파일을 마운트 합니다. 이 두 파일 중에 먼저 root.cramfs를 마운트 하겠습니다.


================================================================================================

[root@localhost tftpboot]# mkdir root/  //마운트 될 경로 만든다.

[root@localhost tftpboot]# mount -o loop root.cramfs root/

================================================================================================


그리고 프로젝트에서 기본적으로 사용 할 cramfs 파일시스템을 만들기 위해 임의의 폴더를 만듭니다.


================================================================================================

[root@localhost ~]# mkdir basic

================================================================================================


mc라는 프로그램을 사용하여 root폴더의 파일을 basic폴더로 모두 복사 합니다. 여기서 ‘mc’라는 프로그램은 복사가 힘든 파일이라도 복사를 가능하게 하는 프로그램입니다. 만약 mc가 없다면 yum으로 설치를 하면 됩니다.


================================================================================================

[root@localhost tftpboot]# yum -install -y mc

[root@localhost tftpboot]# mc

================================================================================================

 

이번에는 sml2440_anycall.cramfs를 마운트 합니다. 이 cramfs파일에는 2440보드에 필요한 라이브러리가 많이 존재하고 있기 때문에 그 라이브러리를 사용하기 위해 마운트를 합니다.

이 파일도 위 root.cramfs파일과 같이 먼저 폴더를 만든 뒤에 마운트를 시키면 됩니다.


================================================================================================

[root@localhost tftpboot]# mkdir sml2440

[root@localhost tftpboot]# mount -o loop sml2440_anycall.cramfs sml2440

================================================================================================


 

그리고 mc로 필요한 라이브러리를 복사를 합니다. 필요한 라이브러리는

복사할 파일 /tftpboot/sml2440/Qtopia/qt-2.3.7/lib/* (/fonts폴더제외)

복사될 경로 /tftpboot/basic/lib/

입니다.


================================================================================================

[root@localhost tftpboot]# mc

================================================================================================


 

다 이동을 한 뒤에 basic 파일을 보게 되면 qt 파일이 심볼릭 링크가 걸려 있는 것을 보게 될 겁니다.

이 심볼릭 링크를 지우고 qt폴더를 다시 생성을 합니다. 그리고 qt폴더 안에 lib폴더를 생성합니다.

 

================================================================================================

[root@localhost basic]# rm qt -f

[root@localhost basic]# mkdir qt

[root@localhost basic]# cd qt

[root@localhost qt]# mkdir lib

================================================================================================


이 /tftpboot/basic/qt/lib폴더에 sml2440/Qtopia/qt-2.3.7/lib 안에 있는 fonts폴더를 복사 시킵니다.

그리고 sml2440/lib폴더의 파일들을 mc를 사용하여 전부 basic/lib로 복사합니다.

 

터치스크린을 사용하기 위해서 sml2440/tmp 폴더 안에 있는‘pointercal’파일을 basic/mnt/etc 안에

복사를 시킵니다. 만약 이것이 없다면 좌표를 인식 못해, 터치스크린을 사용할 수 없습니다.


qta-3.3.3의 라이브러리 파일을 basic.cramfs에 포함시키기 위해 복사를 합니다.


================================================================================================

[root@localhost tftpboot]# cp /root/qta-3.3.3/lib/libqte.so ./basic/lib/

[root@localhost tftpboot]# cp /root/qta-3.3.3/lib/libqte.so.3 ./basic/lib

[root@localhost tftpboot]# cp /root/qta-3.3.3/lib/libqte.so.3.3 ./basic/lib/

[root@localhost tftpboot]# cp /root/qta-3.3.3/lib/libqte.so.3.3.3 ./basic/lib/

================================================================================================


파일들을 복사 한 뒤 마지막으로 basic폴더 안에 있는 linuxrc파일을 수정을 해야 합니다.


================================================================================================

[root@localhost tftpboot]# vi linuxrc

================================================================================================



#!/bin/sh

echo "mount /etc as ramfs"

/bin/mount -n -t ramfs ramfs /etc

/bin/cp -a /mnt/etc/* /etc

 

echo "re-create the /etc/mtab entries"

# re-create the /etc/mtab entries

/bin/mount -f -t cramfs -o remount,ro /dev/mtdblock/3 /

/bin/mount -f -t ramfs ramfs /etc

 

########################################## NETWORK ##########################################

ifconfig eth0 220.64.218.97                                                                 #

ifconfig lo 127.0.0.1                                                                       #

route add default gw 220.64.218.1                                                           #

#############################################################################################

 

#############################################NFS##########################################

mkdir /etc/tmp/qta                          #

#       for     nfs pc - mv2440_board                                                     #

mount -t nfs 220.64.218.215:/root/qta-3.3.3 /etc/tmp/qta   #

export QTDIR=/etc/tmp/qta                                #

###############################################################################################

 

 

#########################################TOUCH SCREEN######################################

# for installing qt-embedded-3.3.3 LIBRARY and touchscreen       #

                                                                                              #

ln -s /dev/fb/0 /dev/fb0                                                                      #

ln -s /dev/touchscreen/0 /dev/h3600_tsraw                                                     #

                                                                                              #

export QWS_MOUSE_PROTO=linuxtp:/dev/touchscreen/0                                             #

export QTDIR=/qt                                                                              #

export LD_LIBRARY_PATH=/qt/lib:$LD_LIBRARY_PATH                                               #

###############################################################################################

 

exec /sbin/init


여기에서 NETWORK와 NFS와 TOUCH SCREEN를 대해서 설명하면 먼저,

==========NETWORK==========

eth0 의 주소는 타겟보드 주소

lo는 localhost

gw는 gateway 주소

==========NFS==========

공유를 하고자한다면 앞의 주석부분 “#‘을 삭제시켜줍니다.

이 항목은 NFS이용해 데스크탑의 파일시스템을 공유하는 것입니다 .

================================================================================================

mkdir /etc/tmp/qta      //타겟보드에 /etc/tmp/qta를 생성 => 공유폴더가 될 예정

mount -t nfs 220.64.218.215:/root/qta-3.3.3 /etc/tmp/qta

//220.64.218.215 데스크탑의 /root/qta-3.3.3의 경로를 마운트해서 타겟보드의 /etc/tmp/qta경로에

나오게 합니다. 데스크탑에 /root/qta-3.3.3폴더가 없다면 만들면 됩니다.

================================================================================================


==========TOUCH SCREEN==========

이 항목은 터치스크린을 가능케 하는 것입니다. 단순히 적는다고 되는 건 아니지만 적어주면 됩니다.


이렇게  basic에 복사된 내용들을 basic.cramfs파일로 만듭니다.


================================================================================================

[root@localhost tftpboot]# mkfs.cramfs basic/ basic.cramfs

================================================================================================


이렇게 확인을 한 뒤에 생성된 ‘basic.cramfs’를 타겟보드에 올립니다.

================================================================================================

[root@localhost tftpboot]# mimicom

================================================================================================

Hit any key to stop autoboot : 1 나오면 아무키나 누릅니다.

그리고 ‘basic.cramfs’ 파일을 올립니다.

================================================================================================

MV2440# tftp 30000000 basic.cramfs

MV2440# nandw 80 e01000 30000000 (e01000은 사이즈이다.-16진수-상황에 파일크기는 달라질 수 있음)

================================================================================================

이렇게 올린 뒤에 boot 명령어를 사용하여 보드에 접속을 합니다. 그리고 확인을 합니다.

================================================================================================

MV2440# boot

# cd etc/tmp/qta/

# ls

================================================================================================

부팅이 되었다면 nfs로 공유된 곳으로 이동해서 예제 파일들을 실행해본다.

 

================================================================================================ 

# cd examples/hello

# ./hello -qws

================================================================================================

 


밑의 그림처럼 hello world가 뜨게 됩니다.


 


만약 컴파일이 되어 있지 않다면 ARM용 컴파일을 해줍니다.

================================================================================================

※ ARM용 컴파일 법

[root@localhost hello]# qmake ?spec $QTDIR/mkspecs/qws/linux-arm-g++ [pro파일]                  [ ] 사이에 있는 것은 하지 않아도 됩니다.

[root@localhost hello]# make

================================================================================================

※ 보드에서 바로 프로그램 실행하기

보드에서 바로 프로그램을 실행하기 위해서는 보드에 올라갈 cramfs파일 안에 그 프로그램의 실행파일이 존재해야 합니다. 그렇기 때문에, 실행파일을 cramfs 파일을 만들 폴더에 복사를 시켜 두어야 하는데, 그 위치는 만들 폴더 속/mnt/etc 안에 폴더를 만들어서 복사를 시키면 됩니다.


================================================================================================

[root@localhost tftpboot]# cp /root/project/* /tftpboot/project/mnt/etc/tmp/project

================================================================================================


그 다음에 linuxrc를 vi 편집기로 들어가서 다음 내용을 추가 시켜 주면 바로 실행이 됩니다.


================================================================================================
cd mnt/etc/project/

./project -qws

================================================================================================

#!/bin/sh

echo "mount /etc as ramfs"

/bin/mount -n -t ramfs ramfs /etc

/bin/cp -a /mnt/etc/* /etc

 

echo "re-create the /etc/mtab entries"

# re-create the /etc/mtab entries

/bin/mount -f -t cramfs -o remount,ro /dev/mtdblock/3 /

/bin/mount -f -t ramfs ramfs /etc

 

########################################## NETWORK ##########################################

ifconfig eth0 220.64.218.97                                                                 #

ifconfig lo 127.0.0.1                                                                       #

route add default gw 220.64.218.1                                                           #

#############################################################################################

 

######################################### TOUCH SCREEN ########################################

# for installing qt-embedded-3.3.3 LIBRARY and touchscreen                                    #

                                                                                              #

ln -s /dev/fb/0 /dev/fb0                                                                      #

ln -s /dev/touchscreen/0 /dev/h3600_tsraw                                                     #

                                                                                              #

export QWS_MOUSE_PROTO=linuxtp:/dev/touchscreen/0                                             #

export QTDIR=/qt                                                                              #

export LD_LIBRARY_PATH=/qt/lib:$LD_LIBRARY_PATH                                               #

###############################################################################################

 

cd /etc/tmp/project/

./project -qws

 

exec /sbin/init