AHAV9302를 reset하면 u-boot로 부팅을 시작하지만 리눅스가 부팅되지는 않는다. 왜냐하면, uImage, rImage를 지워버렸기 때문이다. 엄마 몰래 리눅스 포팅 강좌에 보면 tftp로 다운받는 방법이 나온다. 물론 그 방법이 편리하고 속도도 빠르기 때문에 권장을 하고 있다. 하지만 본인은 마이너한 걸 좋아하므로 시리얼 다운로드를 해보도록 한다.

u-boot의 문서를 확인해 본 결과 C-Kermit를 사용하기에 본인도 동일한 프로그램을 설치하여 사용하였다. http://www.denx.de/wiki/view/DULG/SystemSetup#Section_4.3. 에 보면 설정법이 나와 있다. 자신의 환경에 맞게 동일하게 설정한다. 본인의 설정을 보자면 ~/.kermrc 부분에서 set line /dev/ttyUSB0을 수정하였다.

1. $kermit
2. C-Kermit>connect
보드랑 PC를 연결한다(minicom과 같은 역할)
프로그램을 실행하여 기본적인 환경을 셋팅한다.
AHAV9302> setenv baudrate 115200
AHAV9302> setenv hostname apple
AHAV9302> setenv bootdelay 3
AHAV9302> setenv ethaddr 00:60:6E:F0:00:02
AHAV9302> setenv ipaddr 192.168.100.182
AHAV9302> setenv netmask 255.255.255.0
AHAV9302> setenv gatewayip 192.168.100.254
AHAV9302> setenv dnsip 203.255.112.34
AHAV9302> setenv dnsip2 192.135.250.69
AHAV9302> setenv serverip 192.168.100.250
AHAV9302> setenv bootfile "uImage"
AHAV9302> setenv kfaddr 0x60100000
AHAV9302> setenv rfaddr 0x60300000
AHAV9302> setenv kraddr 0xc3000000
AHAV9302> setenv rraddr 0xc2000000
AHAV9302> setenv iraddr 0xc0800000
AHAV9302> setenv bootargs console=ttyAM0,$(baudrate) root=/dev/ram rw initrd=$(iraddr) ip=$(ipaddr):$(serverip):$(gatewayip):$(netmask):$(hostname)::off init=/sbin/init
AHAV9302> setenv bootcmd 'cp.b $(kfaddr) $(kraddr) $(kisize); cp.b $(rfaddr) $(rraddr) $(risize); bootm $(kraddr) $(rraddr)'

AHAV9302> saveenv

기본적인 환경설정을 마친 뒤, uImage와 rImage를 다운로드 한다.
AHAV9302> protect off 0x60100000 0x602fffff
AHAV9302> erase 0x60100000 0x602fffff
AHAV9302> loadb 0xc0000000
kermit으로 램의 0xc0000000에 저장한다.
CTRL를 누른채 \, c 키 두 개를 순서대로 누르면 kermit 명령모드로 빠진다.
3. C-Kermit>send /bin uImage
램으로 uImage파일을 다운로드한다.
4. C-Kermit>connect
Total Size와 시작 주소를 표시해 준다.
이제 램으로 복사를 한다.
5. AHAV9302> cp.b 0xc0000000 0x60100000 $(filesize)
램의 0xc0000000에서 NOR의 0x60100000으로 파일의 크기만큼 복사한다.
AHAV9302> setenv kisize $(filesize)
AHAV9302> protect on 0x60100000 0x602fffff

AHAV9302> protect off 0x60300000 0x606fffff
AHAV9302> erase 0x60300000 0x606fffff
AHAV9302> loadb 0xc3000000
kermit으로 램의 0xc3000000에 저장한다.
CTRL를 누른채 \, c 키 두 개를 순서대로 누르면 kermit 명령모드로 빠진다.
3. C-Kermit>send /bin rImage
램으로 rImage파일을 다운로드한다.
4. C-Kermit>connect
Total Size와 시작 주소를 표시해 준다.
이제 램으로 복사를 한다.
5. AHAV9302> cp.b 0xc3000000 0x60300000 $(filesize)
램의 0xc3000000에서 NOR의 0x60300000으로 파일의 크기만큼 복사한다.
AHAV9302> setenv risize $(filesize)
AHAV9302> protect on 0x60300000 0x606fffff

AHAV9302> saveenv

AHAV9302> iminfo 0x60100000
AHAV9302> iminfo 0x60300000

AHAV9302> reset

정상적으로 리눅스 부팅까지 된다. 성공적이다.

AHAV9302보드의 MCU는 시리얼 다운로드를 지원한다. 그래서 JTAG 장비를 사지않더라도 저렴한 시리얼 케이블로 바이너리파일을 다운로드 할 수 있다.

엄마 몰래 리눅스 포팅강좌에는 u-boot에 대한 다운로드 방법이 간단해서인지 다운로드에 대한 자세한 사항이 없다. 그래서 직접 u-boot를 다운로드 해보기로 하였다.

(아마도 기본적으로 순대국밥님께서 미리 u-boot, uImage, rImage를 미리 다운로드 해놓아서 그런지도 모르겠다)

우선 본인은 VMWARE에서 우분투 9.04에 커널 2.6.28-14-generic를 사용하고 있다. 그리고 USB to SERIAL 컨버터를 사용하여 보드와 연결해서 사용중이다. 초기 다운로드는 랜으로 다운로드 할 수 없고, 무조건 시리얼 다운로드만 사용된다.(물론 JTAG는 제외된다)

기본적으로 설치되어 있는 NOR 메모리의 내용을 지워보기로 한다.

1. $minicom
본인은 USB to SERIAL를 사용하고 있으므로 minicom의 설정을 바꿨다. 우선 USB to SERIAL를 연결하면 자동으로 시리얼 장치로 인식이 되었다. 그리고 $ls /dev|grep USB를 해본 결과 ttyUSB0으로 나타났다. ttyUSB0을 사용하여야 하므로 minicom에서 CTRL-A O를 눌러 설정화면으로 들어간다. 그리고 Serial port setup를 선택하여 설정을 하였다. A - Serial Device에 있는 값을 /dev/ttyUSB0을 변경한다. 그리고 E - Bps/Par/Bits를 선택하면 다시 Speed를 설정할 수 있는데 115200으로 선택한다. 그리고 저장을 하고 설정화면을 빠져나간다. 이로써 기본적인 minicom에 대한 설정은 마쳤다.

보드를 리셋하게 되면 기본적으로 u-boot가 동작을 하게 되고 임베디드 리눅스를 부팅한다. 하지만!! NOR 메모리의 내용을 지우고 처음부터 다운로드하는 과정을 하기로 하였으므로 리셋을 하고 난 뒤 Hit any key to stop autoboot 부분에서 아무키나 눌러서 부팅을 멈추고 u-boot로 들어간다.
2. AHAV9302> protect off 60000000 60ffffff
3. AHAV9302> erase 60000000 60ffffff
u-boot, uImage, rImage부분을 protect on 되어 있으므로 NOR을 지우기 위해 protect를 해제한다. 그리고 NOR 모두를 지운다. 16진수 값으로 저 범위의 값은 0x1000000이다. 이는 16MB의 값을 가지므로 NOR을 모두 보호해제하고 지운다는 뜻이 된다. 이제는 리셋을 해보아도 부팅이 되지 않는다. 왜!! 모두 날라가 버렸기 때문이다.

지금부터 u-boot의 시리얼 다운로드를 해보기로 한다.
http://arm.cirrus.com/files/index.php?path=download/ 에서 Download_1-0-5.tar.gz를 다운로드 받고 압축을 풀자. 하위 디렉토리에 리눅스용 download가 바로 시리얼 다운로드 툴이다.
4. $./download -p USB0 u-boot.bin
본인은 USB to Serial을 사용하므로 -p 옵셥을 붙여서 포트를 따로 설정해주었다. 그리고 u-boot.bin은 당근이 강좌에 있는 u-boot, kernel, ramdisk 이미지입니다라는 글에 있는 base.zip을 받아서 압축을 풀어보면 그 안에 있다.
위의 명령을 실행시키면 USB to Serial 포트를 확인 한 뒤 시리얼 다운로드 모드가 될 때까지 기다리게 된다. 보드에 있는 BOOT버튼을 누르고 /POR버튼을 누른 뒤 떼면 다운로드를 시작한다. 혹시 동작하지 않으면 보드의 전원을 끄고 다시 연결해서 재시도해 본다.

'당근이의 AVR 갖구 놀기'(이하 당근이)는 AVR을 한 번 만져본 사람이라면 누구나 한번씩은 방문해봤을 만큼 유명한 네이버 카페 중 하나이다.

처음에는 AVR에 관한 질의가 있어서 찾게 되었고, 많은 부분에 대한 문제해결을 본 게 계기가 되어 내게는 네이버에서 가장 즐겨찾는 카페중 하나가 되었다.
그리고, 현재는 엄마 몰래 리눅스 포팅이라는 강좌를 알게 되어서 자주 들락날락 거리고 있는 중이다.

학부 4학년때 처음으로 임베디드 리눅스에 대한 수업을 듣고 임베디드에 대해 관심을 가지게 되었다. 하지만 그 이후에는 고가의 관련장비도 문제거니와, 다른 프로젝트에 심혈을 기울이고 있는터라, 한동안 잊게 되었다.

그렇게 시간은 흘렀고, 현재 백수로 있는 동안 프로그래밍에 대한 감도 떨어지는 것 같아서 엄마 몰래 리눅스 포팅이라는 강좌를 계기로 다시금 관심분야에 대한 눈을 돌리고자 한다.

vmware에서 usb-to-serial을 사용할 경우.
(본인은 vmware v5에 ubuntu 8.10을 설치한 상태)
WindowsXP의 경우는 usb-to-serial을 사용할 경우 가상 포트로 COMn이 잡히게 되어
Linux도 동일하게 가상포트로 잡히는 걸로 생각하였다.
(Windows COM1 == Linux ttyS0 과 동일하다
Windows의 경우 1부터 시작하나 Linux는 0부터 시작하게 된다. 0앞의 S는 serial을 뜻함)
하지만 Linux는 ttyUSB0으로 인식되었다.
(minicom에서 포트를 ttyS0 부터 계속 인식시켜서 안되길래
인터넷을 검색해본 결과 usb-to-serial은 ttyUSBn으로 인식된다는 것을 알았다)

minicom 에서 usb-to-serial은 ttyUSBn으로 할 것!!

+ Recent posts