위성 STB 개발을 위해서 필요한 개발환경을 만들기 위한 여러가지 방법들을 기술하고 있다.
주로 노트북(개발 PC)를 사용하기 때문에 여기서 설명하는 모든 것들은 필자가 사용하는 노트북(XNOTE LS40)을 기준으로 한다. 여기서는 앞의 문서(업무 PC 세팅하기, 개발 PC 설정 팁, 개발환경 구축하기 - 1.X86 기반의 QT)를 읽었다는 가정하에서 설명한다. 그러므로 중복되는 것은 최대한 피하도록 할 것이다.
개발환경 구축을 몇가지로 분류해보면 다음과 같다.
- usbtoserial 과 pcmcia card 잡기
- 커널 컴파일하기
- 필요한 패키지설치
- 세부 설정
- 테스트
위와 같은 순서대로 설명하도록 하겠다.
개념잡기
여기서는 대충 어떤 식으로 개발이 진행되는지 간략히 설명해보겠다. 우선 개발 PC 와 STB 은 시리얼 케이블과 LAN 케이블로 연결되어 있다. 개발 PC 가 노트북인 관계로 이런 이유 때문에 usbtoserial 케이블과 pcmcia card 가 추가적으로 필요하며, 리눅스에서 잡아줘야 한다. 시리얼의 경우, 터미널의 역할로서 사용되어지고, LAN 의 경우에는 개발 PC 가 DHCP 서버 역할을 하고 STB 가 클라이언트 역할을 해서 STB 가 부팅시에 LAN 으로 연결된 개발 PC로 부터 MAC Address 로 지정된 IP 를 할당받고, bootp 와 tftp 를 이용해서 NFS 부팅을 하게된다.
NFS 부팅을 함으로서, 컴파일 후 STB 으로 올릴 필요없이, 바로 개발 PC 에서 실행이 가능하다.
usbtoserial 과 pcmcia card 잡기
내가 가장 고생(?)을 했던 부분이다. 처음에 keyspan 에서 나온 usbtoserial 케이블을 사용했는데, 공교롭게도 2.6.8 커널에서는 지원이 안되었다. 결국 최신 커널 2.6.16 으로 올린 후에야 잡을 수 있었다. 커널 옵션은 'Device Drivers → USB support → USB Serial Converter support → USB Keyspan USA-xxx Serial Driver' 뿐만 아니라 하부 Firmware 도 모두 선택한다.
pcmcia card 의 경우, 기본 바닐라 커널에서는 문제없이 동작하지만, 새로 컴파일하게 된다면, 'Bus options (PCI, PCMCIA, EISA, MCA, ISA) → PCCARD (PCMCIA/CardBus) support' 하부의 모든 옵션을 선택한다. 커널 컴파일 후에 재부팅했다면, PCMCIA 카드의 경우
#/etc/init.d/pcmcia restart
서비스를 재시작한다. pcmcia card 에 불이 들어왔다면, 잡힌것이다.
주의할 사항
뒤에 가서 설명이 나오겠지만, pcmcia card 는 일반 LAN 카드이기 때문에 ethX 로 잡힌다. 그런데, 부팅후 pcmcia card 를 꽂으면 eth2 로 잡힌다. 하지만, 꽂은 상태에서 전원 부팅을 eth1 로 잡힌다. 이유는 노트북이 ieee1394 를 ethX 로 잡기 때문이다. 그래서 먼저 인식하는 순서대로 번호가 부여된다. 디바이스 번호는 항상 일정해야 하므로 한가지를 정해야 한다. 나의 경우 pcmcia card 를 eth1 로 잡기로 결정했다. 그래서 항상 부팅을 하기전에 pcmcia card 를 꼽아두어야 한다.
커널 컴파일하기
데비안에서 커널 컴파일하기 를 참고하기 바란다. 만일 keyspan 이 아닌 다른 제품이라면 바로 잡을 수도 있기 때문에, 이 과정이 필요 없을 수도 있다.
필요한 패키지설치
앞에서 설명한대로 개발 PC 에서 필요한 패키지는 다음과 같다.
- dhcp3-client, dhcp3-common, dhcp3-server
- minicom
- nfs-kernel-server
- pcmcia-cs
- tftp, tftpd
apt-get 을 이용해서 모두 설치한다. 여기서 주의할 것은 dhcp3 을 설치하는 것이다. dhcp 패키지와 혼동하지 않길 바란다.
세부 설정
tftp
#mkdir /tftpboot #cd /tftpboot #tar xzvf tftpboot.tgz // tftpboot.tgz 파일은 별로도 다운로드 받던지 구해야 한다
inted 데몬으로 돌리기 때문에 /etc/inetd.conf 파일에 다음을 추가한다.
tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /tftpboot
dhcp
/etc/dhcp3/dhcpd.conf 파일을 다음과 같이 수정한다.
# # Sample configuration file for ISC dhcpd for Debian # # $Id: _ea_b0_9c_eb_b0_9c_ed_99_98_ea_b2_bd_ea_b5_ac_ec_b6_95_ed_95_98_ea_b8_b0_2d_e2_91_a1_ec_9c_84_ec_84_b1STB,v 1.1 2013/06/07 03:35:46 root Exp root $ # # The ddns-updates-style parameter controls whether or not the server will # attempt to do a DNS update when a lease is confirmed. We default to the # behavior of the version 2 packages ('none', since DHCP v2 didn't # have support for DDNS.) ddns-update-style none; # option definitions common to all supported networks... option domain-name "kevin.tcom-dtvro.com"; option domain-name-servers 211.111.136.2; default-lease-time 600; max-lease-time 7200; # If this DHCP server is the official DHCP server for the local # network, the authoritative directive should be uncommented. #authoritative; # Use this to send dhcp log messages to a different log file (you also # have to hack syslog.conf to complete the redirection). log-facility local7; # No service will be given on this subnet, but declaring it helps the # DHCP server to understand the network topology. #subnet 10.152.187.0 netmask 255.255.255.0 { #} # This is a very basic subnet declaration. #subnet 10.254.239.0 netmask 255.255.255.224 { # range 10.254.239.10 10.254.239.20; # option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org; #} # This declaration allows BOOTP clients to get dynamic addresses, # which we don't really recommend. #subnet 10.254.239.32 netmask 255.255.255.224 { # range dynamic-bootp 10.254.239.40 10.254.239.60; # option broadcast-address 10.254.239.31; # option routers rtr-239-32-1.example.org; #} # A slightly different configuration for an internal subnet. allow bootp; subnet 10.0.2.0 netmask 255.255.255.0 { range 10.0.2.100 10.0.2.199; # option domain-name-servers ns1.internal.example.org; # option domain-name "internal.example.org"; option routers 10.0.2.1; option broadcast-address 10.0.2.255; default-lease-time 600; max-lease-time 7200; group { host redwood61.kevin.tcom-dtvro.com { hardware ethernet 00:02:14:00:10:97; fixed-address 10.0.2.151; filename "zImage.etbdb"; option root-path "/DATA/HardHat/devkit/ppc/405/target_td9000"; } host redwood62.kevin.tcom-dtvro.com { #hardware ethernet 00:0d:84:ff:ef:ff; hardware ethernet 00:02:14:00:10:B0; # MAC 주소의 경우, STB bootloader 의 bdinfo 명령어를 통해서 알 수 있다 #hardware ethernet 00:02:14:00:10:B2; #hardware ethernet 00:02:14:00:10:B3; #hardware ethernet 00:02:14:00:14:ee; #hardware ethernet 00:02:14:00:14:ac; #hardware ethernet 00:02:14:00:15:59; #hardware ethernet 00:02:14:00:15:42; #hardware ethernet 00:02:14:00:13:e4; #hardware ethernet 00:02:14:00:16:9a; fixed-address 10.0.2.152; filename "zImage.etbdb"; option root-path "/DATA/HardHat/devkit/ppc/405/target_td9000"; #option root-path "/DATA/HardHat/devkit/ppc/405/target_mac"; } host redwood63.kevin.tcom-dtvro.com { hardware ethernet 00:02:14:00:0a:a3; fixed-address 10.0.2.153; filename "zImage.treeboot"; #option root-path "/DATA/HardHat/devkit/ppc/405/target_mac"; option root-path "/DATA/HardHat/devkit/ppc/405/target_td100"; } host redwood64.kevin.tcom-dtvro.com { hardware ethernet 00:02:14:00:09:ec; fixed-address 10.0.2.154; filename "zImage.treeboot"; option root-path "/DATA/HardHat/devkit/ppc/405/target_td100"; } host mitv.kevin.tcom-dtvro.com { hardware ethernet 00:FF:AA:00:0D:59; fixed-address 10.0.2.99; # filename "zImage.etbdb"; option root-path "/DATA/Black/Working/SigmaDesign86xxARM/armutils/build_arm/root"; } } } # Hosts which require special configuration options can be listed in # host statements. If no address is specified, the address will be # allocated dynamically (if possible), but the host-specific information # will still come from the host declaration. #host passacaglia { # hardware ethernet 0:0:c0:5d:bd:95; # filename "vmunix.passacaglia"; # server-name "toccata.fugue.com"; #} # Fixed IP addresses can also be specified for hosts. These addresses # should not also be listed as being available for dynamic assignment. # Hosts for which fixed IP addresses have been specified can boot using # BOOTP or DHCP. Hosts for which no fixed address is specified can only # be booted with DHCP, unless there is an address range on the subnet # to which a BOOTP client is connected which has the dynamic-bootp flag # set. #host fantasia { # hardware ethernet 08:00:07:26:c0:a5; # fixed-address fantasia.fugue.com; #} # You can declare a class of clients and then do address allocation # based on that. The example below shows a case where all clients # in a certain class get addresses on the 10.17.224/24 subnet, and all # other clients get addresses on the 10.0.29/24 subnet. #class "foo" { # match if substring (option vendor-class-identifier, 0, 4) = "SUNW"; #} #shared-network 224-29 { # subnet 10.17.224.0 netmask 255.255.255.0 { # option routers rtr-224.example.org; # } # subnet 10.0.29.0 netmask 255.255.255.0 { # option routers rtr-29.example.org; # } # pool { # allow members of "foo"; # range 10.17.224.10 10.17.224.250; # } # pool { # deny members of "foo"; # range 10.0.29.10 10.0.29.230; # } #}
위의 파일에서 주의해서 봐야 할 것은 MAC 주소와 root-path 의 경로이다.
다음은 /etc/default/dhcp3-server 이다.
# Defaults for dhcp initscript # sourced by /etc/init.d/dhcp # installed at /etc/default/dhcp3-server by the maintainer scripts # # This is a POSIX shell fragment # # On what interfaces should the DHCP server (dhcpd) serve DHCP requests? # Separate multiple interfaces with spaces, e.g. "eth0 eth1". INTERFACES="eth1" # 앞에서 설명했듯이 pcmcia card 가 eth1 로 잡히기 때문이다
nfs
STB 가 개발 PC 로 NFS 마운트를 해야하기 때문에 설정이 필요하다. 설정 파일은 /etc/export 이다. 다음과 같이 설정한다.
# /etc/exports: the access control list for filesystems which may be exported # to NFS clients. See exports(5). /DATA/MPEG *(rw,sync) /DATA/uClinux-ARMpT110/target/DTVRo *(rw,sync) /DATA/Black/Working/SigmaDesign86xxARM/armutils/build_arm/root *(rw,no_root_squash,no_all_squash,sync) /DATA/HardHat/devkit/ppc/405/target_newmi *(rw,no_root_squash,no_all_squash,sync) /DATA/HardHat/devkit/ppc/405/target_td100 *(rw,no_root_squash,no_all_squash,sync) /DATA/HardHat/devkit/ppc/405/target_td9000 *(rw,no_root_squash,no_all_squash,sync) /DATA/HardHat/devkit/ppc/405/target_mac *(rw,no_root_squash,no_all_squash,sync)
network 설정
pcmcia card 에 IP 를 할당해야 한다. 설정파일은 /etc/network/interface 이다.
# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo iface lo inet loopback # The primary network interface auto eth0 iface eth0 inet dhcp auto eth1 # 앞에서 언급했듯이 pcmcia card 는 eth1 로 할당 된다 iface eth1 inet static address 10.0.2.1 # 할당 IP netmask 255.255.255.0
minicom
연결 설정은 다음과 같다.
Serial Device | /dev/ttyUSB0 |
Lockfile Location | /var/lock |
Callin Program | |
Callout Program | |
Bps/Par/Bits | 115200 8N1 |
Hardware Flow Control | No |
Software Flow Control | No |
소스파일 복사
전체 소스파일의 용량이 1G 가 넘는 관계로 외장 하드를 이용해서 다음과 같이 복사해야 한다.
#mkdir /DATA #mount /dev/sda2 /mnt #cd /mnt #cd 20051231 #tar xzf DATA_Green_20051231.tgz -C /DATA #tar xzf DATA_Red_20051231.tgz -C /DATA #tar xzf DATA_PPC405_20051231.tgz -C /DATA
압축을 푸는데 오랜시간이 걸리기 때문에, 커피한잔의 여유를 즐겨도 좋을 듯 하다.
테스트
이제 재부팅하자. 그리고 pcmcia card 에 제대로 IP 가 할당되었는지 확인한다. STB 과 연결된 케이블을 개발 PC 에 연결한다. 참고로 개발 PC 와 STB 은 크로스 케이블을 사용해야 한다.
#minicom
STB 의 전원을 넣는다. 콘솔에 부팅 메세지가 보이면, Serial 쪽은 성공이다. 나머지 부분을 테스트하기 위해서
SVR3000>nfsboot
개발 PC 로부터 자동으로 파일 시스템을 부팅해서 프롬프트까지 별다른 에러가 없다면 성공이다. root 로 로그인 해보자!
알려진 문제점
소스파일을 복사한 후 압축을 풀고나서 디렉토리들의 이름을 잘 확인하기 바란다. 나의 경우 HardHat-PPC405 라는 디렉토리가 생성되었는데, 나중에 디렉토리 이름때문에 STB 의 nfs 부팅이 제대로 안되는 문제가 발생했다.
결국 HardHat 으로 변경하고, /etc/export 파일의 디렉토리명을 바꿨더니, 잘 동작했다.