DTV 개발에서 가장 기본이 되는 프로그램을 컴파일하고, 이를 TV 에 다운로드하여 확인하는 방법에 대해서 설명한다.
나는 입사한 지, 7 개월이 되어서야 이 기본을 배울 수 있었다.

준비운동 하기

본격적으로 개발을 하기 전에 x86 을 타겟으로 하는 것이 아니기 때문에, 각종 장비들이 필요하다.

  1. 크로스 케이블(ethernet)
  2. Usb-to-Serial 케이블
  3. Usb-to-Ethernet 어댑터 2 개(USB 1.1, USB 2.0)
  4. 시리얼 케이블
  5. TV Set(47LH40-UA)
  6. 인터넷이 연결된 노트북
  7. http://ttssh2.sourceforge.jp 터미널 프로그램

위의 준비물이 모두 준비되었다면, 말로만 듣던 개발을 할 수 있다.
각각의 IP 할당은 다음과 같다. 차후에 있을 작업에서 참고하기 바란다.

TV IP address
IP addr 192.168.0.10
Gateway IP 192.168.0.1
Server IP 192.168.0.1
Notebook IP address
IP addr 10.177.160.69(DHCP)
Usb-to-Ethernet 192.168.0.1

소스 컴파일

자세한 컴파일 방법은 개발환경 구축하기 를 참고하기 바란다. 앞에서도 나왔지만, 각 모델마다 컴파일해야 하는 플랫폼이 다르다. 모델마다 해당 플랫폼을 검색하는 방법은 다음과 같다.

#cd ~/work/gp
#find -name *47LH40-UA*
./src/apps/prj/atsc_saturn5/model/47LH40-UA.cfg
...
#cd src/apps/prj/atsc_saturn5
#make
#make epk           // .epk 파일 생성

생성된 .epk 파일에 접근하기 위해서는 중계서버(바이너리 이미지만 저장)를 네트워크 드라이버로 등록해놓는 것이 편리하다. 나의 경우, 중계서버는 156.147.69.181 이다.
앞서 컴파일을 통해 생성된 .epk 파일은 '\saturn6\wjkim\pak-atsc_saturn5' 아래에 있다. 여러가지의 .epk 파일이 있는데, 이 중에서 다운로드 할 파일은 다음과 같다.

종류 파일이름 설명
개발버전 0.1.47.57.epk load 명령을 사용하여 kernel, rootfs 등을 각각 굽기 귀찮을 때 사용하면 편리하다. setenv autoboot y 를 통해서 auto booting 도 해볼 수 있다.
인증버전 model_0.1.47.57_flash.epk 인증을 위한 버전으로 부팅 속도 및 이미지 사이즈를 줄인 것으로 개발하기에는 부적절하다. 따로 auto booting option 설정을 하지 않아도 auto booting 이 된다.
#cd work/gp/src
#make 
#make epk
#cd work/gp2/src/apps/prj/dvb_saturn6              // 각 프로젝트 별로 선택
#make GP2_DVB_EU.cfg
#make epk GP2_DVB_EU.cfg                           // model 디렉토리 아래에 각각 .cfg 파일을 선택

'config.mk' 파일을 수정하면 된다. 예를 들어 dvb_saturn6 프로젝트에서 컴파일 시, IPM 모듈을 빼고 싶다면, 아래와 같이 수정한다.

...
INCLUDE_IPM = NO
...

로컬 설정하기

로컬이라 함은 노트북을 말한다. 노트북에 연결되어야 하는 것은 Usb-to-Serial 케이블과 Usb-to-Ethernet 어댑터이다. 이를 연결하고 각각의 드라이버를 설치를 해야 한다.
Usb-to-Ethernet 어댑터를 인식하면, 서두에 나왔던 IP 주소를 참고하여 192.168.0.1 로 할당해주어야 한다.

항목 다음 IP 주소 사용
IP 주소 192.168.0.1
서브넷 마스크 255.255.255.0

나머지 항목은 공란으로 비워둔다.
타겟에서 .epk 파일을 다운로드하기 위해서는 tftp 를 사용한다. 즉 로컬이 tftp 서버가 되어야 한다는 뜻이다. 이를 위해 앞에서 언급했던 tftpd32 라는 프로그램을 실행한다.
아래 그림과 같이 설정한다.

디버깅 메세지를 보기위해 tera term 이라는 프로그램을 사용한다. 해당 모델(47LH40-UA)의 경우, 'Baud rate → 115200' 으로 설정한다.

TV 와 노트북 연결하기

Usb-to-Serial 케이블과 Usb-to-Ethernet 어댑터에 각각 시리얼 케이블과 크로스 케이블을 이용하여 TV 와 연결한다. TV 쪽에 연결되는 크로스케이블의 끝에는 반드시 USB1.1 이 지원되는 Usb-to-Ethernet 어댑터가 연결되어야 한다.

TV 의 부팅 환경 설정하기

앞서 IP 할당표에 나와있는 대로, TV 의 IP 를 지정해주어야 한다. 지정하기에 앞서 현재 TV 에 설정된 환경을 봐야 한다.
모두 연결되어 있는 상태에서 TV 전원을 켜자마자, 엔터키를 누르고 있으면, 아래와 같이 부트로더로 진입하게 된다.

-------------------------------------
 Fast-boot interrupted. (key=0xd)
 Stop kernel booting.
-------------------------------------
In      : serial
Out     : serial
Err     : serial
USB     :
??? Waiting for Peripheral Connecting Fail...
usb init failed
Error, couldn't init Lowlevel part
USB     : Host type : 0
USB Port: 1
Hit any key to stop autoboot:  0
mstar #

저장되어 있는 환경변수 값을 보기 위해, printenv 명령어를 실행한다.

mstar # printenv   // printenv 명령어 입력
bootcmd=cp2ram kernel 0x80C00000; appxip; bootm 0x80C00000
bootdelay=3
baudrate=115200
ethaddr=00:02:3e:26:0a:55
lserverip=156.147.69.181
ipaddr=192.168.0.10
gatewayip=192.168.0.1
netmask=255.255.255.0
bootargs=root=/dev/mtdblock3 rootfstype=squashfs lpj=105984
hostname=saturn6
rootfs=flash
verify=n
appxip=y
memsize=192
ethact=
silent=n
silent_app=n
silent_ker=n
serverip=192.168.0.1      // 192.168.0.1 로 수정해야함
autoboot=n
stdin=serial
stdout=serial
stderr=serial
 
Environment size: 438/131068 bytes
mstar #

주석에 나온대로 IP 를 바꾸어준다. 바꿔준 환경변수는 재부팅 시, 지워지기 때문에, 플래시 메모리에 저장한다(saveenv).

mstar # setenv serverip '192.168.0.1'
mstar # saveenv
mstar # reboot

타겟을 재부팅하고, printenv 명령어를 통해 제대로 변경이 되었는지 확인한다.

.epk 다운로드 하기

중계서버에 있는 .epk 파일을 로컬의 D 드라이브에 저장한다. .epk 파일을 타겟으로 다운로드하기 위해 아래와 같이 입력한다.

mstar # swu 47LH40-UA_0.1.47.94_flash.epk
TFTP from server 192.168.0.1; our IP address is 192.168.0.10
Filename '47LH40-UA_0.1.47.94_flash.epk'.
Load address: 0x82000000
Loading: T #################################################################
         #################################################################
...
...
done
Bytes transferred = 21268028 (144863c hex)
PAK Model : ATSC-SATURN5
         Dev mode : Release Mode
         PAK type : root
         SW Version : 1
         SW Date : 20090312
Erasing Nand(a0000+50000)... OK
Update Nand BBM Info... OK
Writing to Nand(a0000+50000)...OK
PAK Model : ATSC-SATURN5
         Dev mode : Release Mode
         PAK type : mode
         SW Version : 30400
         SW Date : 20090312
Erasing Nand(220000+20000)... OK
Update Nand BBM Info... OK
Writing to Nand(220000+20000)...OK
PAK Model : ATSC-SATURN5
         Dev mode : Release Mode
         PAK type : kern
         SW Version : 1
         SW Date : 20090312
Erasing Nand(2340000+214000)... OK
Update Nand BBM Info... OK
Writing to Nand(2340000+214000)...OK
PAK Model : ATSC-SATURN5
         Dev mode : Release Mode
         PAK type : lgap
         SW Version : 30400
         SW Date : 20090312
Erasing Nand(25c0000+4e0000)... OK
Update Nand BBM Info... OK
Writing to Nand(25c0000+4e0000)...OK
PAK Model : ATSC-SATURN5
         Dev mode : Release Mode
         PAK type : lgre
         SW Version : 1
         SW Date : 20090312
Erasing Nand(2ec0000+380000)... OK
Update Nand BBM Info... OK
Writing to Nand(2ec0000+380000)...OK
PAK Model : ATSC-SATURN5
         Dev mode : Release Mode
         PAK type : lgfo
         SW Version : 1
         SW Date : 20090312
Erasing Nand(3240000+2c4000)... OK
Update Nand BBM Info... OK
Writing to Nand(3240000+2c4000)...OK
PAK Model : ATSC-SATURN5
         Dev mode : Release Mode
         PAK type : eman
         SW Version : 1
         SW Date : 20090312
Erasing Nand(240000+3cc000)... OK
Update Nand BBM Info... OK
Writing to Nand(240000+3cc000)...OK
PAK Model : ATSC-SATURN5
         Dev mode : Release Mode
         PAK type : ezca
         SW Version : 1
         SW Date : 20090312
Erasing Nand(740000+2a8000)... OK
Update Nand BBM Info... OK
Writing to Nand(740000+2a8000)...OK
PAK Model : ATSC-SATURN5
         Dev mode : Release Mode
         PAK type : boot
         SW Version : 30400
         SW Date : 20090312
Erasing Nand(20000+38000)... OK
Update Nand BBM Info... OK
Writing to Nand(20000+38000)...OK
Erasing Nand(80000+4000)... OK
Update Nand BBM Info... OK
Writing to Nand(80000+4000)...OK
mstar # reboot

실제로 다운로드하는 과정에서 10 번에 7 번 정도는 다운로드가 잘 되었지만, 나머지는 타임아웃 에러가 발생했다. 아직 정확한 원인은 잘 모르겠다. 하지만, 에러가 발생할 때마다, 타겟과 로컬에 연결된 케이블들을 뺏다 꽂았다.
다운로드가 완료되면, 각각의 nand 플래시 메모리 파티션에 write 한다. write 가 완료되면, 재부팅한다. 다운로드가 제대로 되었다면, 부팅이 정상적으로 수행되고 A/V 가 재생될 것이다.

주의 사항

이 내용은 내가 사용했던, 47LH40-UA 모델만 해당되는 것일 지도 모르겠다. 하지만, 나중에 같은 삽질을 반복하지 않기 위해서 작성한다.
해당모델은 saturn5 를 사용하는데, gp 코드를 최신 릴리즈 상태로 업데이트(svn update)하고 컴파일한 바이너리 파일을 다운로드 했다. 재부팅후, 아래와 같은 에러메세지가 발생했다.

usb init failed
Error, couldn't init Lowlevel part
USB     : Host type : 0
USB Port: 1
Hit any key to stop autoboot:  0
Partition Image Size Zero Length Case!! ==> Skipped!!
Partition Image Size Zero Length Case!! ==> Skipped!!
fontxip is not set!!
[5593] ## Booting image at 80c00000 ...
Bad Magic Number       // 에러 메세지
mstar #

'Bad Magic Number' 라는 메세지는 기존의 플래시 메모리 파티션과 새로 다운로드하여 write 된 플래시 메모리 파티션이 맞지 않을 때 발생한다. 이때는 다시 프로그램을 다운로드 한 뒤에, 부트로더로 부팅하여 아래와 같이 명령어를 실행한다.

mstar # mtdinfo
MTD Partition Information -----------------------------------------------------------------------------
 
cur epk ver : 0x030400
old epk ver : 0x000000
 
[ 0] "bbminfo"   : 0x00000000-0x00020000 (0x00020000)
[ 1] "boot"      : 0x00020000-0x00060000 (0x00040000)  : "u-boot-nand.bin"[222148] - 0x030400 : (U/V)
[ 2] "mtdinfo"   : 0x00080000-0x000a0000 (0x00020000)  : "MTD.INFO"[0] - 0x000000 : (U/V)
[ 3] "rootfs"    : 0x000a0000-0x00220000 (0x00180000)  : "rootfs_flash.squashfs"[315392] - 0x000001 : (U/V)
[ 4] "model"     : 0x00220000-0x00240000 (0x00020000)  : "model.jffs2"[131072] - 0x030400 : (U/V)
[ 5] "emanual"   : 0x00240000-0x00740000 (0x00500000)  : "emanual.squashfs"[3977216] - 0x000001 : (U/V)
[ 6] "ezcal"     : 0x00740000-0x00b40000 (0x00400000)  : "ezcal.squashfs"[2772992] - 0x000001 : (U/V)
[ 7] "kernel"    : 0x02340000-0x025c0000 (0x00280000)  : "uImage_flash"[2171109] - 0x000001 : (U/V)
[ 8] "lgapp"     : 0x025c0000-0x02ec0000 (0x00900000)  : "lgapp_flash.lzo"[5110811] - 0x030400 : (U/V)
[ 9] "lgres"     : 0x02ec0000-0x03240000 (0x00380000)  : "lgres.squashfs"[3670016] - 0x000001 : (U/V)
[10] "lgfont"    : 0x03240000-0x03b40000 (0x00900000)  : "lgfont.img"[2895872] - 0x000001 : (U/V)
[11] "kernel"    : 0x00b40000-0x00dc0000 (0x00280000)  : "uImage_flash"[0] - 0x000000 : (u/V)
[12] "lgapp"     : 0x00dc0000-0x016c0000 (0x00900000)  : "lgapp_flash.lzo"[0] - 0x000000 : (u/V)
[13] "lgres"     : 0x016c0000-0x01a40000 (0x00380000)  : "lgres.squashfs"[0] - 0x000000 : (u/V)
[14] "lgfont"    : 0x01a40000-0x02340000 (0x00900000)  : "lgfont.img"[0] - 0x000000 : (u/V)
[15] "recdb"     : 0x03b40000-0x03b60000 (0x00020000)
[16] "system"    : 0x03b60000-0x03ba0000 (0x00040000)
[17] "user"      : 0x03ba0000-0x03e00000 (0x00260000)
[18] "reserved"  : 0x03e00000-0x04000000 (0x00200000)
 
A.      Add    flash partition
E.      Edit   flash partition
R.      Remove flash partition
 
D.       Default Normal
F.       Default Flash
L.       Load
S.       Save
Q.       Exit
 
select  :

'D' 나 'F' 를 입력하면, mtd 파티션을 기본 설정 파티션으로 바뀌게 된다.
다시 한번 다운로드 한다.

인증 epk 와 개발 epk 의 차이

가장 큰 다른 점이라고 한다면, 파일 이름일 것이다.
인증 epk 의 경우, 가장 최종 이미지이기 때문에 기본 기능 외의 모든 기능을 최소화 시켰다. 따라서 디버깅을 하기에는 적합하지 않다.
또한 부트로더, 커널, 애플리케이션을 모두 합쳐서 만들어졌기 때문에, 이를 write 하는 것만으로도 정상적인 기능 동작이 가능하다.

개발 epk 는 인증 epk 에 비해 파일 사이즈가 크다. 그 이유는 디버깅에 필요한 요소들을 포함하기 때문이다. 가장 큰 차이점으로 완벽한 쉘의 제공을 들 수 있다.
또한 부팅 시 부트로더, 커널 까지만 부팅하고 나머지 애플리케이션은 nfs 를 통해 다운로드 한다.

이 문서에서 사용하고 있는 47LH40-UA 모델의 경우, 개발 epk 를 다운로드 하면 usb-to-ethernet 을 인식하지 못하여 nfs 를 이용한 다운로드를 할 수 없다.
다음은 개발 epk 로 다운로드 한 후 부팅한 모습이다.

...
[    3.116000] Initializing USB Mass Storage driver...
[    3.122000] usbcore: registered new interface driver usb-storage
[    3.129000] USB Mass Storage support registered.
ifconfig: SIOCSIFADDR: No such device               // usb-to-ethernet 을 인식하지 못함 
route: ioctl 0x890b failed: Network is unreachable      
starting pid 795, tty '/dev/console': '-/bin/sh'
 
 
BusyBox v1.10.1 (2009-01-20 15:54:12 KST) built-in shell (ash)
Enter 'help' for a list of built-in commands.
 
 
Processing /etc/profile...
 
Done
 
/lgsw # ls
go.sh   nfs.sh            //  go.sh 는 tftp 를 사용하여 app 를 다운로드 할 수 있게 함, nfs.sh 는 nfs 를 사용하여 app 를 다운로드 할 수 있게 함
/lgsw #

다운로드 시간 단축 하기

make epk 를 통해서 만들어진 epk 파일은 용량이 매우 크다. 때문에 다운로드하는데 오랜 시간이 걸린다. 따라서 이 시간을 줄이기 위해서는 수정한 바이너리 이미지만 다운로드 하면 된다.
참고로 epk 파일은 부트로더, 커널, 파일시스템, 애플리케이션이 모두 합쳐진 것이다.
예를 들어 애플리케이션만 수정했다면, lgapp_flash.lzo 파일만 다운로드 하면 된다. 다운로드 하는 방법은 아래와 같다.

mstar # load lgapps
TFTP from server 192.168.0.1; our IP address is 192.168.0.10
Filename 'lgapp_flash.lzo'.
Load address: 0x82000000
Loading: T ##################
...

각각 부트로더, 커널, 파일시스템, 애플리케이션에 해당하는 명령어와 파일명은 다음과 같다.

위치 명령어 파일명
부트로더 load bootloader u-boot-nand.bin
커널 load kernel uImage_flash
파일시스템 load rootfs rootfs_flash.squashfs
애플리케이션 load lgapps lgapp_flash.lzo
  • computer/lg/dtv_개발하기.txt
  • Last modified: 3 years ago
  • by likewind