본문 바로가기

LINUX/DEBIAN계열

target board 에 nfs 커널 올리기-XHybus320보드

XHybus보드를 VMware에 설치된 ubuntu 환경에서 nfs를 이용해서 작동하게 하고자 한다.
우선 이를 위해서 어떤 것이 필요할지를 생각해보자.

보드가 켜지기 위해서는 bootloader가 0x0번지에 있어야 할 것이다.
그리고 우리가 바라는 kernel image가 0x00040000 번지에 올라가야 kernel을 읽어서 작동하겠지?

bootloader를 보드에 굽기 위해서는 XDB를 이용해서 bootloader를 구워야 할 것이다.
이를 돕는 툴은  Marvell(R) Software Development Tools 을 사용했다.

 >>>보드에 부트로더 올리기<<<
1. xdb_v4.0_alpha.zip 압축풀고 설치를 해준다.
2. 설치를 하고 나면 인터넷 창이 열리면 거기서 왼쪽에 Software Development Tool Suite누르면 install now 버튼이 생긴다.
3. 설치시에 우리는 C\xdb 에다가 설치를 해준다.
4. 그리고 설치시에는 우리가 압축푼 디렉토리에서 시리얼을 잘 잡아준다...
5. 사용시에는 시리얼의 날짜가 되야 쓸수 있게 때문에 우리 컴퓨터의 날짜를 시리얼 보다 날짜가 앞에 되게 해준다.
6. 우리가 설치한 프로그램은 xdb를 이용해서 우리 보드의 Flash Memory에다가 BootRoader를 올리기 위한 프로그램이다.
7. [시작]-[프로그램]-[Marvell(R) Software Development Tools]-[Marvell(R) eXtreme Debugger 4.0]-[XDB Configurations]-[JTAG_WinCE]-[PXA320_WinCE]
8. 위의 것을 실행 시키면 처음에 우리는 다음과 같은 setting을 해줘야 한다.
=setting=
   [CPU-JTAG] 탭에 Target Connection 에 lpt1:1 을 usb0:0 으로 바꿔준다~! 나머지는 뭐 기본값임.
(이렇게 바꿔주는 이유는 우리가 사용하는 COM에는 페러렐포트가 없어서 usb를 쓴다...)
9. setting 설정이 끝나면 OK 버튼 클릭
10. 이제 우리는 xdb를 보드에 연결해 줘야 하는데 연결시에 보드의 전원을 끈다음에 연결해야 함을 잊지마라.
(전원을 끄지 않고서 xdb를 연결하면 보드에 과전류가 흘러서 회로가 타버릴 수 있다.)
11. 위의 유의 사항을 잘 참조해서 프로그램을 키고서 우리는 [Start]를 해준다.
12. 그러면 프로그램이 켜지는데 거기서 우리는 위의 [Flash]-[Burn Flash]를 선택해준다.
xbd가 연결되지 않으녕 [Falsh] 탭이 보이지 않는다.
13. 여기서 메모리 유형은 NAND Flash로 바꿔줘야함
14. 그리고 중간에 있는 탭들 중에서 4번째꺼에서 Flash를 initialize 선택하고서 exect해주고
그다음에는 Bab Block table 확인하는걸로 exect해준다.
(보다 정확히 Flash메모리를 지우는 방법은 initialize를 하기 전에 low level format을 해주는 것이다.)
15. 이제 중간에 있는 것중에서 1번째 탭으로 이동! ==> 이제 Flash메모리에 부트로더를 넣어줄껴!
[부트로더파일은 보드와 같이 있는 CD안에 Bootloader\image\boot.bin파일이다.]
16. 부트로더를 검색해서 찾는다...boot.bin 을 찾아주고서 0 번지에다가~ Burn 시켜줌!

이제 부트로더는 해결!!!

kernel Image를 올릴때는 tftp를 사용 할 것이다.
그리고 우리는 그 kernel image를 만들때 rootfilesystem을 nfs로 사용하도록 할 것이다.

이제부터 할 일들은 ubuntu안에서 해야 할 일들이다^^

위의 일을 하기 위해서는 tftp와 nfs를 설치해야 한다.

>>tftp와 nfs설치 명령 <<
$ sudo apt-get install nfs-kernel-server tftpd tftp xinetd
위의 명령어로
nfs-kernel-server, tftpd, tftp, xinetd 를 설치해준다.

그리고서 우린 tftp를 위해 설정을 해줘야 한다.

>>tftp설정<<
# vim /etc/xinetd.d/tftp
명령으로 tftp를 열고서(없으면 생김) 아래와 같이 작성해준다.


그리고서 server의 directory 를 /tftpboot 로 설정해 줬기 때문에 그 directory를 만들어 준다.

# mkdir /tftpboot -p

이제 tftp에 대한 설정은 끝이 난 것이다.

그 다음으로 우리는 nfs에 대해 설정을 해줄 것인데... 이것을 설정하기 전에 우선 zImage를 make하자.

>>nfs를 rootfilesystem으로 사용하는 Image 만들기!!<<
zImage를 make하기 위해서는 cd안의 Kernel/linux.tar.gz 파일을 복사해서 압축을 푼 다음에...
그 linux directory안에서 일을 zImage를 만들 것이다.

그러기 위해서 우선 우리는 이미 nfs용으로 config되어 있는 파일을 가져다가 약산의 수정을 할 것이다.
바로 그 파일은 linux/arch/arm/configs  디렉토리 안의 WENDERS_NFS_defconfig 파일이다.
WENDERS_NFS_defconfig 파일의 200번째 줄을 수정해 줄 것이다.
그 과정은
 CONFIG_CMDLINE="root=/dev/nfs nfsroot=/PROJECT/WENDERS/Filesystem/rootfs_lite ip=192.168.1.50:192.168.1.100::255.255.255.0::eth1:on
 console=ttyS0,38400 rw mem=128M "
의 내용을


 CONFIG_CMDLINE="root=/dev/nfs nfsroot=/PROJECT/WENDERS/Filesystem/rootfs_gtk ip=192.168.1.50:192.168.1.100::255.255.255.0::eth1:on
 console=ttyS0,38400 rw mem=128M "
으로 바꿔줘야 한다.

이제 준비는 완료!! 
우리가 바꿔준 config를 사용해서 make 를 해보자!!
# make WENDERS_NFS_defconfig 명령어로 .config파일을 만들어서 설정해주자!!!


그리고 약간의 확인 과정이 필요하다.
# make menuconfig
명령으로 다음과 같은 사항을 확인하자!! 
확인 1.Filesystems ---> Network File Systems ---><*> NFS file system support 체크 됐는지 확인.


확인 2.Boot options ---> 3번째 라인(root filesystem)내용이 잘 반영되 있는지 확인.


확인 3.Device Drivers -->Character devices ---> X-HYPER320 IED drivers 안의 내용 확인.
(이 안의 내용을 module로 하게 할 수도 있고, built-in으로 만들수도 있다...)


위의 확인과정이 끝났으면 이제 make 명령으로 zImage를 만들어주자!!!


make의 결과로 zImage 는 linux/arch/arm/boot 디렉토리 안에 다음과 같이 생긴다.


이제 우리가 하지 않은것이 하나 있다.
바로 그것은 nfs설정~!
우선 nfs설정을 하기 전에 우리가 WENDERS_NFS_defconfig파일에 수정 해줬던 내용을 다시한번 보자!!
"root=/dev/nfs nfsroot=/PROJECT/WENDERS/Filesystem/rootfs_gtk ip=192.168.1.50:192.168.1.100::255.255.255.0::eth1:on console=ttyS0,38400 rw mem=128M "
위의 내용을 살펴보면.. 
우리가 보드에 올릴 root디렉토리는 nfs로 받을 것이라는것을 알려준다.
그리고 그 root 디렉토리는 우리 HOST의 /PROJECT/WENDERS/Filesystem/rootfs_gtk 디렉토리이다.
그리고 서로 주고받을 serverip(HOST의 ip)는 192.168.1.100 이고
clientip(TARGET의 ip)는 192.168.1.50 임을 알수 있다. 그리고 consol 은 ttyS0을 쓰고 bour rate 은 38400
read write가 가능하며 memory는 128MByte임을 알 수 있다.
알아본 내용중에 HOST에 있어야 할 root디렉토리가 target이 부팅 이후에 커널을 올리고 읽게 될 곳임을 알수 있을 것이다.
그렇기 때문에 우리는 저 디렉토리를 만들어주고 그 안에 필요한 여러 디렉토리들이 들어있어야 할 것이다.

>>nfs 설정<<
우선 
# mkdir -p /PROJECT/WENDERS/Filesystem/rootfs_gtk 명령으로 디렉토리를 만들어주고.

이 디렉토리 안에 cd 안에 들어있던 Filesystem/rootfs_gtk.tgz 파일을 이곳으로 복사해다가
압축을 풀어주면 준비가 된것이다.

그리고 위에 만들어준 /PROJECT/WENDERS/Filesystem/rootfs_gtk 디렉토리가 외부에서 접근이 가능해야 하기 때문에
/etc/exports 파일에다가 다음과 같이 한줄을 추가해준다.
(지금 만든 이 디렉토리는 nfs로 사용 할 녀석이다. 이 녀석을 사요하는 녀석은 외부에서 접근해 오는 타겟(보드) 이다.)
/PROJECT/WENDERS/Filesystem/rootfs_gtk *(rw,no_root_squash)


이제 모든 준비는 완료!!!

환경이 모두 만들어졌다. 이제는 우리가 만든 nfs용 zImage를 tftp를 이용해서 보드로 올려보자!!

우리는 보드의 상태를 보기 위해서 minicom을 사용할 것이다.
다음의 명령어로 minicom을 설치하고 계속해서 minicom의 설정값을 바꿔보자.

# apt-get install minicom
minicom다운.

$ minicom -s 
이 명령어로 minicom 설정창을 열어준다.


serial port setup 설정에서 설정을 다음과 같이 바꿔준다.


세팅을 마친후에는 Save setup as dfl 로 기본값으로 저장을 해주고.
Exit 또는 Exit from Minicom 으로 나와준다.


Exit 로 나오게 되면 minicom 초기화가 이루어지고 main화면을 볼 수 있다.
만약 Exit from Minicom 으로 나왔다면 다시
$ minicom
명령으로 minicom을 켤 수 있다.

<초기화 화면>


<main 화면>



minicom이 켜진 상태에서 Target(보드)를 켜면 보드의 부팅부터 해서 보드의 동작을 볼 수가 있다.

보드를 키면 보드는 3초간 자신의 부팅을 stop하고서 우리가 blob에 명령을 줄수 있는 것으로 가게 해준다.
우린 그 3초 안에 space를 눌러서 그 모드로 들어가자!!
이제 우린 tftp를 이용해서 Target에다가 zImage를 올려주자!!

그런데 이 zImage를 올리기 전에 우린 살짝 만져줄 것이 있다.
현재 우리 COM의 IP주소가 192.168.1.100 인지 확인 해야 한다.
# ifconfig 명령으로 확인.

VMware 나 virtualbox 같은 가상머신으로 리눅스를 돌리고 있다면...
네트워크를 Bridged로 설정해서 
# ifconfig <ethernet name> 192.168.1.100 up
명령으로 ip 주소를 넣어주자~! 
이 주소는 우리가 nfs를 설정할때 server로 사용한다고 한 ip주소다!!
이렇게 해야 Target과 Host간에 nfs로 연결이 되겠지?!^^
(Bridged로 설정을 해줘야 실제적으로 네트워크에 접근해서 그 주소가 반영되기 때문!!)

minicom 을 켜고서 Target을 키고서 3초간 기다려줄때 space를 누르면 다음과 같은 화면이 뜬다.


blob> setip  명령으로 현재 Target에 설정돼 있는 ip설정 값을 보자.


그림과 같이 server와 client가 각각 192.168.1.100   192.168.1.50  이 아니라면 
blob> setip serverip 192.168.1.100
blob> setip clientip 192.168.1.50
명령으로 설정을 해주자!!


blob> tftp zImage
이 간단한 명령이 zImage를 보드의 메모리(0x80800000)로 올려준다.
이때 zImage가 올라가는건 우리가 tftp설정을 할때 /tftpboot 라는 디렉토리를 tftp가 사용할 루트 디렉토리로 설정했다.
그리고 우리가 make로 만든 zImage파일을 그 /tftpboot 디렉토리에 옮겼다.
위 명령에서 적을 zImage는 /tftpboot디렉토리 안에 있는 zImage를 가리키는 거다.


위 명령어로는 메모리 상에만 올린것이다. 전원을 껏다 키면 없어지는 것이지.
이것을 막기 위해서 우리는 Flash memory에다가 구워줘야 한다.

blob> nandwrite -z 0x80800000 0x00040000 0x00200000
위 명령으로 Flash 메모리로 옮기는 것이다.
정확히 해석해보자.
-z 옵션은 zImage 임을 명해주는 것이다.
0x80800000 으로부터 0x00040000 에다가 0x00200000 만큼의 데이터를 쓴다는 것이다.
이때 0x80800000 은 금방 tftp로  zImage를 올려놓은 메모리의 시작 주소이다.
0x000400000 은 Flash 메모리의 주소로 커널이 올라가야 할 주소이다.
이 Flash 메모리의 주소는 이미 맵핑 되어있다.(매뉴얼 참조)


이제 reboot 명령을 날려보면 보드가 다시 켜지면서 잘~ 될 것이다.