'Linux'에 해당되는 글 4건

  1. 2009.05.19 2.6.28 커널로 갈아타기 - 커널을 보드에 올리기 (1) (1)
  2. 2009.05.13 리눅스에서 시간처리
  3. 2009.05.12 2.6.28 커널로 갈아타기 - 커널 받기
  4. 2009.05.10 2.6.28 커널로 갈아타기 - 개발 환경
2009.05.19 21:47

2.6.28 커널로 갈아타기 - 커널을 보드에 올리기 (1)

보드 준비 및 부트로더 확인


자..  재수가 있는지 확인해 봅시다.

보드에 커널을 올려서 제대로 돌아 가면 복권 당첨 된거고, 안 돌아 가면 당연한 겁니다. 

우선 보드를 준비해야 겠죠?

EZ-S2410은 다음과 같이 생겼죠..

 

 
[A007_001_EZ_S2410.jpg]

잘 생겼죠? (큼… 자기 자식 자랑하면 팔불출이라는데 )

 근데 제가 가지고 있는 보드는 좀 너덜 너덜 하군요..
USB 호스트 쪽이 안 된답니다.

아하 짠돌이 생산팀… .
새거 주지..

 시험을 하기 위해서
전원과 아답터 연결하고 , 시리얼 포트 연결 하고 , 이더넷 연결합니다.

 그리고 전원 올려서 부팅 메시지를 봅니다.

 제가 가진 S3C2410 부트로더 버전은 아래 부팅 메세지에서 볼수 있습니다.

일단 이 부분이 저하고 비슷해야 겠죠?

그래야

S3C2410 에 대하여 저와 동일하게 진행할 수 있지 않을까요?

 뭐 각자의 길을 가자면 가지요..

전 손해 볼 것 없습니다.

어찌되었든…

 부팅하면 다음과 같은 메시지가 나옵니다.

WELCOME EZBOOT V1.4 (FALINUX Co.,Ltd) ..........for EZ-S2410
Program  by You Young-chang, Oh Jae-Kyoung
Modified by Park Mun-Sik, Jang Hyung-Gi
Last Modify Apr  6 2007

NAND Chip Check .......................
  NAND Maker ID [EC]    NAND Size  ID [76]
  Detect SAMSUNG [ec:76] 64MByte
  BAD BLOCK SCAN ->
      BootLoader, Kernel, Ramdisk Bad Block [1]

CS8900 Init............................
  Mac Address  : [00 A2 55 F2 26 35]
  Detect value : [3000:3000]
  Chip ID      : [0E63:0009]

Quickly Autoboot [ENTER] / Goto BOOT-MENU press [space bar]..

EZBOOT>


 헉! 버전이 V1.4 라고 나오네요

 어허허…

최근 이지부트가 2.0인데.. 이게 언제적 부트로더여?

 일단 부트로더부터 업그레이드 해야 겠네요..

 제가 그랬죠?

 이 글들은 강좌가 아니라고

제가 진행해 가는 과정을 그래로 보여 주는 거라고..

 

자~~

부트로더 업그레이드 한번 해 봅시다.

 

이지부트 2.0으로 업그레이드


이지부트는 사실 내부적인 소스가 있고 외부적 소스가 있습니다.

하하하.. 완전한 공개는 힘들죠… ^^;

업체에서 요구한 부분들이나 저희 회사 나름대로 사전 진행하는 과정에서 발생한 소스들이 있는데 이것들은 공개 하기가 곤란하죠.

그래도 웬만한 것은 모두 다 공개해 갑니다. 감추고 있는 것은 1%로도 되지 않습니다.

어찌되었든

부트로더를 다운해야 겠죠?

부트로더가 어디있죠?

예 저희 회사 이지부트로더는 여기서 다운 받습니다.

http://ftp.falinux.com/ezboot/recommendation/

이걸 다운로드 받아 보겠습니다. 외부에서 관리해야 하기 때문에 colinux  상에서

 /project/ezboot_outsize/

라고 하는 디렉토리를 만들고 여기에 다운 받도록 하겠습니다.

[root@localhost ezboot_outside]# wget http://ftp.falinux.com/ezboot/recommendation/ezboot.tar.gz
--2009-05-10 02:57:58--  http://ftp.falinux.com/ezboot/recommendation/ezboot.tar.gz
Resolving ftp.falinux.com... 211.239.155.99
Connecting to ftp.falinux.com|211.239.155.99|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 291184 (284K) [application/x-gzip]
Saving to: `ezboot.tar.gz'

100%[=======================================================>] 291,184     --.-K/s   in 0.08s  

2009-05-10 02:57:58 (3.47 MB/s) - `ezboot.tar.gz' saved [291184/291184]

[root@localhost ezboot_outside]#


워낙 소스가 작기 때문에 금방 받습니다.

이제 압축을 풀어 봅시다.


다음과 같은 명령을 사용합니다.

[root@localhost ezboot_outside]# tar zxvf ezboot.tar.gz


이제 ezboot란 디렉토리가 생겼을 겁니다.

여기로 이동합니다.

[root@localhost ezboot_outside]# cd ezboot
[root@localhost ezboot]# ls
Makefile     arch_pxa255   ez-au1250_make.sh  ez-pxa270_make.sh   image
arch_au1250  arch_pxa270   ez-ep9312_make.sh  ez-s3c2440_make.sh  include
arch_ep9312  arch_s3c2440  ez-pxa255_make.sh  ez-x5_make.sh       main
[root@localhost ezboot]#


허걱~

S3c2410 이 없습니다.

오마이 갓….

어쩐지 수 많은 고객들이 난리더구만.. 허허…
어떻게 2410이 없을 수 있죠?

이번에 심각하게 반성해야 겠군요..

그렇다면 긴급 패치에 들어가야 하는데..

흠.. , 에혀… , 어떻게 해야 하나..

고민 고민…

(**) 여기서부터
(**) 여기까지 글을 쓰는 사이에 약간의 시간이 흘렀습니다. ^^

 

짜잔!

다음과 같은 EZ-S3C2410 추가된 파일을 FTP 에 올렸습니다.

ftp://ftp.falinux.com/ezboot/history/2009_05_10/ezboot-yyc.tar.gz

이것은 공식적인 버전이 아닙니다
나중에 개발팀에서 공식적인 버전을 올려 놓겠죠?

수정된 파일을 다운 로드 받은 후 앞에서와 동일한 방법으로 압축을 풉니다.

그리고 컴파일 합니다.

이지부트 소스는 make 를 직접 사용하지 않고 몇가지 설정이 필요해서 이것을 쉘 스크립트로 만들었습니다.

그래서 다음과 같이 컴파일 해야 합니다.

[root@localhost ezboot]# ./ez-s3c2410_make.sh clean
[root@localhost ezboot]# ./ez-s3c2410_make.sh


./ez-s3c2410_make.sh clean 이 명령은 처음 한번만 하면 됩니다.

소스가 수정되면 ./ez-s3c2410_make.sh 이면 충분합니다.

이 처리 결과 다음과 같이 마지막에 메시지가 나오면 성공한 겁니다.

dd if=arch_s3c2410/start/start_org of=image/ezboot.ez-s3c2410 bs=1k conv=sync
1+1 records in
2+0 records out
2048 bytes (2.0 kB) copied, 0 s, Infinity B/s
dd if=main/main_org of=image/ezboot.ez-s3c2410 bs=1k seek=4
54+1 records in
54+1 records out
56128 bytes (56 kB) copied, 0 s, Infinity B/s
chmod 777 image/ezboot.ez-s3c2410
[root@localhost ezboot]#


부트로더 이미지는 image/ezboot.ez-s3c2410에 생겼습니다

그렇다면 이걸 tftp 프로토콜로 다운로드 받을 수 있겠 끔 옮겨야 겠죠?

[root@localhost ezboot]# cp image/ezboot.ez-s3c2410 /tftpboot/

자 이제 모두 끝났습니다.

다시 보드의 시리얼 에뮬레이터로 가 봅시다.

set 명령을 사용해서 컴파일된 부트로더를 받기 위한 환경 설정을 합니다.

^^;
  1. MAC Address            [00:a2:55:f2:26:35]
  2. LOCAL IP               [192.168.102.101]
  3. HOST IP                [192.168.10.61]
  4. Host tftp directory    []
  5. zImage      file name  [zImage.s2410]
  6. ram disk    file name  [ramdisk-12M.gz]
  7. boot loader file name  [ezboot.ez-s3c2410]

  A. Autoboot wait time     [3]
  B. Boot Menu Key          [ ]
  C. Copy Ramdisk [Y/N]     [Y]
  D. Architecture Number    [784]
  E. Console Serial Number  [2]
  F. NAND-Partition MByte   [2:5:57] (kernel:ramdisk:app)
  W. Watchdog (sec, off=0)  [0]

  K. Kernel CMD 1st [initrd=0x30800000,5M root=/dev/ram0 ramdisk=12288]
  M. Kernel CMD 2nd [console=ttySAC2,115200]
  N. Kernel CMD 3rd []

  L. Load Default
  P. Apply & Exit
  S. Save
  0. Exit

  Select >>


확인해봐야 하는 항목은 2번,3번,7번입니다. 
 
tfb 명령을 통해서 다운받고 부트로더 이미지 받고

EZBOOT>tfb
Receive ezboot.ez-s3c2410
Send ARP Packet
Send ARP Packet
ARP PACKET Resive
HOST MAC : [ 00 FF A7 1F 64 00 ]
HOST  IP : [192.168.10.61]
LOCAL IP : [192.168.102.101]
Resive Address  : 3100-0000
TFTP Request Send
OPTION [timeout 120 tsize 60224]
ALL DATA RESIVE OK [ 60224 bytes ]
    Erase : OK                                                                
    Write : OK                                                                
    Verify: OK                                                                

EZBOOT>


 rst 명령을 통해서 보드 리부팅 합니다.

EZBOOT>rst
System Soft Reset.......
0123B

WELCOME EZBOOT V2.3.04 (FALINUX Co.,Ltd) ......S3C2410(EZ-S3C2410) (266MHz)
Program by You Young-chang, Oh Jae-Kyong, Jang Hyung-Gi
Last Modify May 10 2009

  Detect Samsung NAND 64M 3.3V 8-bit Flash : vid=EC pid=76
  SIZE 64-Mbytes (page=512, block=16K)

ff ff ff : a5 a5 97
ecc correct addr=0x00100000
ecc fail addr=0x00100200
ff ff ff : 6a 99 97
ecc fail addr=0x00100400
ecc fail addr=0x00100600
ff ff ff : 56 69 6b
ecc fail addr=0x00100800

   :
   :

ff ff ff : 96 96 9b
ecc fail addr=0x00107800
ecc fail addr=0x00107a00
ecc fail addr=0x00107c00
ecc fail addr=0x00107e00
  diff magic [flash:20081103]
Quickly Autoboot [ENTER] / Goto BOOT-MENU press [space bar]..

  CS8900 Init ......
  Mac Address  : [00 FA 01 A2 13 04]
  Detect value : [3000:3000]
  Chip ID      : [0E63:0009]

EZBOOT>


이때 ecc fail 이라는 글자가 나온다고 당황하지 마시기 바랍니다.
이전 버전의 부트로더에서 ECC 체크를 하지 않았는데
2.0에서부터 ecc 체크를 하도록 했기 때문에 발생하는 것입니다.

 일단은 set 명령을 사용해서

^^;
   1) mac address            : 00:FA:01:A2:13:04
   2) local ip               : 192.168.102.101
   3) local netmask          : 255.255.0.0
   4) local gateway          : 192.168.10.1
   5) server ip              : 192.168.10.61
   6) zImage      file name  : zImage.ez-s3c2410
   7) ram disk    file name  : ramdisk-1.11-16M.gz
   8) boot loader file name  : ezboot.ez-s3c2410
   9) logo image  file name  :
  10) auto execute full name :
  11) autoboot wait time     : 3
  12) copy ramdisk [Y/N]     : Y
  13) arm kernel arch number : 3006
  14) nand part (B,C,L,K,R,A): 1,1,0,3,5,54
  15) watchdog  (sec, off=0) : 0
  16) KCMD 1 : mem=64M
  17) KCMD 2 : initrd=0x30800000,5M root=/dev/ram0 ramdisk=16384
  18) KCMD 3 : console=ttySAC2,115200
  19) KCMD 4 :
  20) KCMD 5 :
  21) KCMD 6 :

  L)  Load default
      LF) load KCMD2 root=flash
      LR) load KCMD2 root=ramdisk
  M)  generlate Mac address
  S)  Save to flash
  P)  aPply & exit
  Q)  Quit

Select >>



일단 자신의 네트워크 상황에 맞도록 2,3,4,5 항을 수정하십시오 위 예시는 제 보드의네트워크 설정입니다.

그리고 환경 저장을 하시고

tfb 명령을 수행하셔서 다시 한번 부트로더를 받습니다.

그리고

rst 명령을 사용하거나 전원을 껐다가 켜서 다시 보드를 부팅 시킵니다.

EZBOOT>rst
System Soft Reset.......
EZBOOT>0123B

WELCOME EZBOOT V2.3.04 (FALINUX Co.,Ltd) ......S3C2410(EZ-S3C2410) (266MHz)
Program by You Young-chang, Oh Jae-Kyong, Jang Hyung-Gi
Last Modify May 10 2009

  Detect Samsung NAND 64M 3.3V 8-bit Flash : vid=EC pid=76
  SIZE 64-Mbytes (page=512, block=16K)

Quickly Autoboot [ENTER] / Goto BOOT-MENU press [space bar].

  CS8900 Init ......
  Mac Address  : [00 FA 01 A2 13 04]
  Detect value : [3000:3000]
  Chip ID      : [0E63:0009]

EZBOOT>


보시는 바와 같이 깔끔하게 정리 됩니다.  하하

자 이제 부트로더를 업그레이드 했습니다.

  이제 커널만 올리면 됩니다. 음하하하



Trackback 0 Comment 1
  1. 지나가던행인 2009.06.05 19:43 신고 address edit & del reply

    어째선지, 글 끝에 밥 아저씨의 '참 쉽죠'라는 대사가 들린 듯한 데자뷰가 느껴지는군요 ㄱ-;;

2009.05.13 09:02

리눅스에서 시간처리

이 글은 예전에 내가 kelp 에 썼던 글인데 자료를 한군데로 모으는 의미로 여기에 옮긴다.
또한 원문에서 약간 이상한 부분은 수정한다.

정말 오랜만에 글 올리네요 ^^

제가 그동안 넘 바빠서요 쩝... 용서해 주세용...

APK009 시간 처리
==============================================

1. 개요

이 문서는 ESP-NS에서 동작하는 응용 프로그램에서
시간과 관련된 처리를 해야 하는 경우에 대한 소개입니다.
  
  
작성자 : 유영창 frog@falinux.com
작성일 : 2004년 9월 17일
수정일 : 2005년 3월 10일

   수정일 : 2009년 5월 13일


2. 달력 시간

임베디드 시스템의 경우 시간 관리는 거의 필수적인 사항이라고 봅니다.
그 만큼 시간에 관련된 처리는 자주 발생하는 프로그램 사항입니다.
  
그런데 시간의 의미는 여러가지가 있읍니다.
  
가장 먼저 생각 나는 것은 달력 시간입니다. 달력 시간이라는 것은
우리가 흔히 알고 있는 날짜와 관련된 시간을 말합니다.
  
"2004년 11월 12일 12시 30분 29 초"
  
이렇게 표시되는 것이죠...
  
이런 정보를 얻기 위해서는 어떻게 해야 할까요?
리눅스 응용프로그램에서는 어떤 함수를 사용해야 할까요?

2.1 time 함수

우선 가장 오래되고 전통적인 방법인 time 이라는 함수에 대하여 알아 봅시다.

이 함수는 다음과 같은 형태를 갖고 있읍니다.

time_t time (time_t *result) ;

이 함수를 사용하려면 #include <time.h> 를 포함해야 합니다.

이 함수는 협정 세계시간 1970년 1월 1일 00: 00: 00 시간 이후 경과된 초의 수를 result 에 지정된 변수에
넘겨 줍니다.
  
함수 반환값은 대부분의 경우 무시해도 됩니다. 이 함수가 실패할 가능성은 거의 없기 때문에
고민해서 저처럼 머리털 빠지지 않았으면 합니다.

이 함수의 사용은 다음과 같이 하면 됩니다.

    time_t     cur_time;

    time( &cur_time );

    printf( "time value %ld\n", cur_time );

이 예는 현재 시간을 받아서 초로 표시해 주는 예 입니다.

자..

여기서 한가지 이 함수와 관련된 문제를 밝혀 드리겠읍니다.

time_t 란 변수는 long int 형입니다.

그래서 이 값은 134217727 에서 -134217728 사이의 값을 가집니다.

이 값으로 표현할수 있는 최대 연도는 2038년으로 제한 됩니다.

그렇다면 이후의 날짜는 어떻게 설정할까요?

현재 glibc 를 사용하는 한 불가능합니다.

다른 유닉스 시스템 중 일부에서는 time64 라는 함수와 time64_t 라는 변수형을 선언해서
이 문제를 해결 하고 있지만 리눅스에서는 그 해결 방한을 아직까지 안 내놓은 것으로
압니다. ( 물론 제가 해결책을 인터넷에서 아직 발견하지 못했기 때문일 수도 있읍니다. )

이 시간의 문제는 단순히 함수만의 문제는 아닙니다.
리눅스 운영체제에서 사용하는 각종 시간 관련 함수들을 사용하는 유틸리티나 응용 프로그램에서
동시에 발생하는 문제 입니다.

이 문제를 해결하고 싶다면 시간과 관련된 함수를 자신이 직접 작성해서 해결하는 방법 이외에는
현재 대안은 없읍니다. 아니면 glibc 에서 해결해 주기를 기다려야 겠지요....


2.2 gmtime, localtime 함수

time 함수로 반환된 것은 초 단위로 연산하기 때문에 시간에 대한 연산을 하기에 편리합니다.
하지만 LCD 에 시간을 표시하거나 시간과 관련된 스케쥴링 처리를 다룰 경우에는
우리가 보통 표현하는 방법인 년 월 일 시 분 초 로 구별되어 표현되는 함수가 필요합니다.

이런 시간 형식으로 시간을 구하는 함수에는 gmtime 과 localtime이라는 두 함수가 있읍니다.


이 두 함수의 차이는 무엇일까요?

여러분이 국내에다 팔고 말 물건을 만든다면 그냥 gmtime 과 localtime 은 무시하고
쓰셔도 무방합니다.

이런 경우에는 그냥  localtime을 사용하실 것을 권장합니다.
이때 환경 변수에 설정할 것이 있는데 이것에 대한 것은  이 글을 계속 읽고 나시면 아실겁니다.
   
여러분이 시스템을 만든다고 합시다.

문제는 두 장비가 하나는 우리나라에 또 하나는 미국에 있다고 합시다.
여기서 생기는 문제는 우리나라와 미국은 시간대가 틀리다는 겁니다 .
   
우리나라보다 미국은 12시간 정도의 차이가 납니다.

이런 경우 두 장비간에 10:00 시간에 상호 동기를 맞추기 위한 통신을 시작 하자고 하거나
어떤 데이터의 기록 시간을 정한다고 한다면 문제가 생깁니다. 우리나라의 10:00와
미국의 10:00는 다른 시간 시점이 되기 때문입니다.

이럴 경우에는 세계 기준 시간을 사용하는 것이 정확한 것입니다.
   
즉 세계 기준 시간인 10:00 에 서로 통신하기로 한다면
우리나라와 미국이 서로 시간대가 틀리더라도 아무 문제가 없다는 것입니다.

왜냐하면 세계 기준 시간은 서로 다른 위치에 있어도 동일한 시간을 가리키기 때문입니다.

리눅스 시스템은 원칙적으로 커널에서 관리하는 내부 시간은 세계 기준 시간이라고 봅니다.

이 세계 기준 시간을 가져오는 함수가 gmtime 이라는 함수 입니다.

반면에 세계 기준 시간에 해당하는 우리나라의 시간을 구하는 함수는 localtime 입니다.

그래서 gmtime으로 구한 함수는 시스템에 내부적으로 설정된 시간이고 localtime은
그 시간을 각 지역에 맞도록 변환한 시간입니다.

이 localtime 은 환경 변수 TZ 라는 것에 영향을 받습니다.

이 TZ 값을 보려면 다음과 같은 명령을 사용하면 보입니다.

    
# echo $TZ

아마도 ESP-NS 에서는 이 값 이 아무런 값으로도 설정 되어 있지 않을 겁니다.

이런 경우에는 gmtime 에서 구한 시간과 localtime에서 구한 시간은 동일한 시간값으로
구해집니다.

이때의 시스템 시간을 보려면 다음 명령을 치면 됩니다.

# date
Thu Jan  1 01:14:30 Universal 1970

이렇게 나온 것은 ESP-NS 가 초기 생산시에는 시간을 설정하지 않아서 입니다.
이 부분은 이후에 RTC에 대한 설명을 할때 다시 설명할 것입니다.

일단 임시로 시간을 설정하려면 다음과 같이 설정해야 합니다.
설정하려는 시간이 2005년 3월 8일 23시 21분 00 초 라면
      
# date -s 030823212005.00
Tue Mar  8 23:21:00 Universal 2005

와 같이 해 주어야 합니다.

보시는 바와 같이 date -s 명령의 형식은 다음과 같습니다.

YYYY년 MM 월 DD 일 HH 시 NN 분 SS 초 라면

date -s MMDDHHNNYYYY.SS

이런식으로 들어 갑니다.

자 이 상태에서 TZ 값을 우리나라 시간대로 맞추어 봅시다.
다음과 같이 하면 됩니다.

# export env TZ=GMT-09:00:00

이렇게 설정한 상태에서 date 명령을 사용하여 시간을 보면 다음과 같이
나옵니다.

[root@ez-x5 /acu]$ date
Wed Mar  9 08:25:13 GMT 2005

표출된 시간을 보면 알겠지만 시스템에 설정된 시간보다 9시간이 지난 시간이
표출됩니다.

여기서 TZ 환경 변수에 대하여 조금 더 자세하게(?) 알아 보겠읍니다.

이 TZ 환경 변수는 보통 부팅시에 초기화 스크립트에 의해서 설정됩니다.

리눅스 시스템이 설치된 지역을 나타내는 지명을 쓰는 경우가 일반적입니다.

예를 들어 TZ=Seoul 과 같은 형식입니다.

하지만 이렇게 설정하는 것은 timezone 파일이 필요하고 복잡하므로

저는 GMT-09:00:00 에 대한 것만 설명하려 합니다.
제 경험으로는 이정도면 충분하고 설정도 간단하기 때문입니다.

TZ 환경 변수에 GMT형식으로 설정하는 것은
localtime 함수에 얼마의 시간을 더하거나 빼는가를 지정하는 것입니다.

형식은 다음과 같습니다.
GMT[+/-][HH:MM:SS]

GMT 란 문자열은 GMT 형식을 나타내고
+ 또는 - 는 그리니치 천문대를 중심으로 서쪽에 있으면 + 동쪽에 있으면 - 입니다.

우리나라는 동쪽에 위치하고 9시간의 차이가 있으므로

TZ=GMT-09:00:00 으로 설정하는 것입니다.

이 값은 ESP-NS 의 경우에는

/etc/rc.d/rc.local 파일에 마지막에

export env TZ=GMT-09:00:00

란 항목을 넣으시면 됩니다.

이제 gmtime 의 함수와 localtime 함수의 형식을 알아 봅시다.

이 함수의 사용법은 다음과 같습니다.
    
    struct tm *localtime (const time_t *time)
    struct tm *gmtime(const time_t *time)

이 함수에서 사용하는 time 은 time 함수에서 구한 값의 변수 주소를 지정하면 되고
그 결과로 tm 구조체의 주소를 반환합니다.

사용 예는 다음과 같습니다.

    time_t     cur_time;
    struct tm *tm_data;

    time( &cur_time );

    tm_data = gmtime( &cur_time );
    printf( "GMT   TIME %04d-%02d-%02d %02d:%02d:%02d\n",
                       tm_data->tm_year + 1900,
                       tm_data->tm_mon +1,
                       tm_data->tm_mday,
                       tm_data->tm_hour,
                       tm_data->tm_min,
                       tm_data->tm_sec );

    tm_data = localtime( &cur_time );
    printf( "LOCAL TIME %04d-%02d-%02d %02d:%02d:%02d\n",
                       tm_data->tm_year + 1900,
                       tm_data->tm_mon +1,
                       tm_data->tm_mday,
                       tm_data->tm_hour,
                       tm_data->tm_min,
                       tm_data->tm_sec );
    

   tm 구조체에서 우리가 주로 쓰고 알아야 하는 필드 변수는 다음과 같습니다.

 
     int tm_sec          : 0 에서 59 까지의 범위를 갖는 초(second)
     int tm_min          : 0 에서 59 까지의 범위를 갖는 분(minute)
     int tm_hour         : 0 에서 23까지의 범위를 갖는 시(hours)
     int tm_mday         : 1 에서 31까지의 범위를 갖는 달
     int tm_mon          : 0 에서 11까지의 범위를 갖는 달
     int tm_year         : 1900년 이후의 년(year)
     int tm_wday         : 0 에서 6의 범위를 갖는, 일요일을 기점으로 해서
                           요일에 해당하는 수

조심해야 하는 것은 구해진 년도는 1900을 더해 주어야 우리가 사용하는 년도가 된다는 것과
월은 1 을 더해 주어야 우리가 사용하는 월이 된다는 점입니다.

또 한가지 요일을 표현하는 tm_wday는 일=0 월=1 화=2 수=3 목=4 금=5 토=6 라는 점입니다.
우리나라 사람들은 일주일의 시작을 월요일 부터라고 생각하지만 
미국 사람들은 일요일 부터라고 생각합니다.

시간을 나타내는 문자열의 함수를 glibc 에 있는 것을 사용하면
우리나라 실정에는 조금 불편합니다. 그래서 저는 위와 같은 형식으로 직접 문자열로
변환해 사용합니다.


2.3 mktime 함수

  
지금까지 초를 시간으로 변환하는 함수를 알아 보았는데
당연히 반대 함수도 있겠죠?

예를 들어 2005년 9월 12일 18시 30분 40 초를 초로 바꾸려면

mktime 함수를 사용해야 합니다.

이 함수의 형식은 다음과 같습니다.

time_t mktime(struct tm *brokentime)

tm 구조체는 앞에서 설명한 것과 같습니다.

위 시간을 초로 바꾸는 예제는 다음과 같습니다.

    time_t     timev;
    struct tm  tm_src;
    struct tm *tm_data;

    tm_src.tm_year = 2005 - 1900;
    tm_src.tm_mon  =    9 - 1;
    tm_src.tm_mday =   12;
    tm_src.tm_hour =   18;
    tm_src.tm_min  =   30;
    tm_src.tm_sec  =   40;

    timev = mktime( &tm_src  );
 
    tm_data = gmtime( &timev );
    printf( "GMT   TIME %04d-%02d-%02d %02d:%02d:%02d\n",
                       tm_data->tm_year + 1900,
                       tm_data->tm_mon +1,
                       tm_data->tm_mday,
                       tm_data->tm_hour,
                       tm_data->tm_min,
                       tm_data->tm_sec );

    tm_data = localtime( &timev );
    printf( "LOCAL TIME %04d-%02d-%02d %02d:%02d:%02d\n",
                       tm_data->tm_year + 1900,
                       tm_data->tm_mon +1,
                       tm_data->tm_mday,
                       tm_data->tm_hour,
                       tm_data->tm_min,
                       tm_data->tm_sec );

3. gettimeofday 함수 ( 정밀 시간 )

임베디드 시스템에서는 초 단위의 시간만으로는 I/O 제어를 하거나 통신 재 전송 시간 관리
같은 매우 짧은 시간 간격의 제어가 불가능합니다.

그래서 매우 정밀한 시간 측정이 필요한데 이럴때 사용하는 것이 gettimeofday 라는 함수
입니다.

이 함수는 다음과 같은 형식을 가지고 있읍니다.

   
   int gettimeofday (struct timeval *tp, struct timezone *tzp)

   여기서 tzp 매개변수는 무조건 NULL 이라고 생각하시면 됩니다.
  
   timeval 구조체는 다음과 필드 변수를 가지고 있읍니다.

   long int tv_sec : time 함수에서 구한 값과 같은 의미로
                     협정 세계시간 1970년 1월 1일 00: 00: 00 시간 이후
                     경과된 초입니다.

   long int tv_usec : 마이크로초(microsecond)로 표현된 시간값인데 부가적으로
                      흐른 시간 마이크로 초입니다.


   이 함수를 사용하는 예는 다음과 같습니다.

    struct timeval tp;
    int lp;

    for( lp = 0; lp < 1000; lp++ )
    {
        gettimeofday ( &tp, NULL );
        printf( "Sec %ld uSec %ld\n", tp.tv_sec, tp.tv_usec );
    }

    이 함수를 저는 주로 지나간 시간을 측정하는 용도로 사용합니다.
    또한 대부분의 경우 미리 초 단위로 측정하면 되기 때문에
    다음과 같은 함수를 만들어서 사용합니다.

 
    static struct timeval  __mclock_start;   // 기준 시작 시간
   
    void mclock_init( void )
    {
        gettimeofday( &__mclock_start, NULL );
    }
   
    long int mclock( void )
    {
        struct timeval timecurrent;
        struct timeval timeresult;
       
        gettimeofday( &timecurrent, NULL );
       
        timeresult.tv_sec  = timecurrent.tv_sec  - __mclock_start.tv_sec;
        timeresult.tv_usec = timecurrent.tv_usec - __mclock_start.tv_usec;
   
        if( timeresult.tv_usec < 0 )
        {
            timeresult.tv_sec--;
            timeresult.tv_usec += 1000000;
        }
       
        return timeresult.tv_sec * 1000 + ( timeresult.tv_usec / 1000 );
    }
   
    void mclock_test( void )
    {
        long int start_mclock;
        int lp;
   
        mclock_init();  // 프로그램 전체에서 한번만 설정해 주면 된다.
   
        for( lp = 0; lp < 10000; lp++ )
        {
            printf( "mclokc : %ld m Sec \n", mclock() );
        }
       
    }

*** clock 함수의 문제

10mSec 이상의 정밀한 측정시에 리눅스 커널에서 제공하는 CPU 의 경과 시간을 측정함수 중에는
clock 이라는 함수가 있읍니다. 이 함수가 정상적으로 동작만 한다면야 50mSec 이상의 처리
시간 간격을 허용하는 경우라면 무척 편리한 함수가 될 겁니다.

그러나 실제로 제가 시험해 보았을때는 이 함수는 제대로 동작하지 않았읍니다.
원인을 찾아 보고 싶었지만 저의 귀차니즘으로 인하여 관뒀읍니다.

getimeofday라는 막강한 함수가 있어서지요
시간이 나시는 분들이 계시면 한번 쯤 도전해 보시기 바랍니다.
왜 동작하지 않는지 ....

4. sleep,usleep 함수

프로그램을 작성하다보면 일정 시간을 멈출 필요가 있을때가 있읍니다.
이럴때 사용할수 있는 함수는 두가지가 있읍니다.

하나는 sleep 이고 또 하나는 usleep 입니다.

두 함수다 모두 프로세스를 잠들게 합니다.
sleep 는 초 단위 간격으로 잠들게 하고 usleep 는 마이크로초 즉 0.000001 단위로 잠들게 제어할수있습니다.

그...러...나

usleep 이 정말 0.000001 초 단위로 잠들게 할수 있는냐?

아니죠.. 왜냐?

프로세스가 잠들기 때문이죠....

제 실험 결과는 19 미리 초 이하 즉 0.019 초 이하로는 잠들게 할수 없읍니다.
무척 슬픈 일이죠...

이말은 usleep 함수에서 문제가 될수 있읍니다.

그래서 정확하게 지연을 주고 싶다면
( 물론 하나의 프로세스만 수행되고 있어서 프로세스 스케쥴이 전환되지 않는다는 가정하에서 )

gettimeofday 함수를 이용하여 반복문을 사용하는 것이 더 정확합니다.
   
sleep 함수와  usleep의 형식은 다음과 같습니다.

       #include <unistd.h>

       unsigned int sleep (unsigned int seconds);
       void         usleep(unsigned long usec);

sleep 함수를 사용하는 예제는 다음과 같습니다 .

    printf( "sleep start\n" );
    sleep(2);
    printf( "sleep end\n" );


usleep 함수를 사용하는 예제는 다음과 같습니다 .

    long int old,cur;

    mclock_init();
    printf( "usleep start\n" );
   
    old = mclock();
    usleep(1);
    cur =  mclock();
    printf( "mclock : %ld m Sec \n", cur - old );
    printf( "usleep end\n" );

5. RTC 와 시간 설정 및 관리

이제 시간과 관련한 마지막 문제인 RTC 라고 불리는 시계칩과
리눅스 시간설정과 관리에 대한 문제에 대하여 이야기 해야 겠습니다.

임베디드 시스템에서는 시간 설정은 반드시라고 할 만큼 일어나는 문제 입니다.

그런데

임베디드 리눅스 응용 프로그램을 작성하는 프로그래머가 부딪히는 문제 중 하나는

RTC라고 하는 시계 칩과 리눅스 시스템의 시간과의 동기화 문제와
시간이 변경될때 뜻하지 않는 여러가지 문제점에 봉착한다는 것입니다.

이 문제를 하나씩 따져 봅시다.

5.1 RTC 와 시스템 시간 관리

보통 임베디드 시스템에는 RTC 라는 시계 칩을 가지게 됩니다. CPU에
포함되었든 외부장치에 붙었든 이 칩은 시스템에 전원이 나가도
동작합니다.

ESP-NS 보드에는 DS1307 이라는 RTC 를 사용합니다.

자 여기서 질문이 있읍니다.

리눅스 커널에서 사용하는 시간은 어디에 기준을 맞출까요?

1) RTC와 연동되어 시간을 관리한다.
2) OS 타이머를 이용하여 관리한다.
3) 내부 타이머를 이용하여 관리한다.

예...

정답은 2 번이 되겠읍니다.

이말은 여러분이 아무리 date 명령을 사용하여 리눅스 시간을 변경해도
보드 전원을 내렸다 재 부팅하면 말짱 꽝이라는 말입니다 ㅜㅜ

리눅스 시스템은 자주 껐다가 켜졌다가 하는 시스템으로 사용되기 보다는 계속 켜져 있는 시스템으로
적합한 시스템입니다.

또한 RTC는 생각보다 오차가 큰 시계입니다.
전원에도 영향을 받고 온도에도 영향을 받습니다. (물론 미미합니다만 ㅜㅜ )

그에 반해서 대부분의 시스템에서 사용하는 OS 타이머는 분해능이 높기 때문에
무척 높은 정확도를 가집니다.

그래서 리눅스 시스템은 RTC를 믿지 않고 자신이 계산하는 시간을 신봉합니다.

즉.....

리눅스 시스템은 주기적으로 자신의 시간으로 RTC를 설정할 필요가 있는 겁니다 .

RTC의 시간을 가져와서 자신의 시간과 맞추는 경우는 부팅할때 딱! 한번 뿐입니다.

그 외에는 RTC를 못 믿기 때문에 리눅스 커널 시간을 RTC에 주기적으로 설정하는 것이
맞는 방법이라는 것입니다.

물론 RTC의 오차라는 것이 몇년에 몇초 정도의 오차이기 때문에 아주 크리틸컬한
시스템이 아니라면 굳이 동기화 시킬 필요는 없읍니다
그래서 저는 동기화 처리 프로세스 프로그램을 따로 만들지는 않는 매우 게으른
프로그래머입니다. ( 아.. 이 성격 고쳐야 하는데 쩝 )

그...러...나

외부에서 또는 사용자의 조작으로 인하여 시간을 수정한다면
당연히 시간을 설정하는 함수 또는 유틸리티를 알고 있어야 합니다.

자...

그런데 앞에서 이야기 했지만 이럴 경우 date 명령이나  settimeofday 함수를 이용해 봤자
RTC의 시간은 수정되지 않습니다. 그래서 전원을 내렸다가 올려 버리면 말짱 꽝입니다.

그렇다면 이것을 어떻게 해결해야 할까요?

우선 보드가 부팅 되었을때 RTC 에서 시간을 가져와서 시스템 시간을 설정하도록 해야 겠지요?

가장 쉬운것은 보드에 hwclock 라는 프로그램이 있을 경우입니다. busybox에서 옵션으로
이 프로그램을 선택할수 있을 겁니다.


Trackback 0 Comment 0
2009.05.12 13:26

2.6.28 커널로 갈아타기 - 커널 받기

리눅스 커널 구하기 

제는 커널 2.6 이후부터 커널 개발자들에게 정말 감사해 합니다.
리눅스 커널 소스에 임베디드를 위한 커널 패치가 모두 포함되었기 때문이죠

그분 들에게 축복이 있으라~~

옛날에는 arm 패치니 하는 것들이 있었는데 지금은 그냥 그 단계가 싹 사라진 거죠.

자..

일단 최소한 오늘은 리눅스 커널 소스는 다운 받아야 합니다.

벌써 진입부에서 지쳐 버리면 안 되거든요…

우선 리눅스 커널를 구할 수 있는 곳은 어디 일까요?


그림에 보듯이

    www.kernel.org

로 가면 됩니다.

 

벌써 이글을 쓰는 시점에 2.6.30으로 마구 마구 달리고 있네요

하여간 부지런한 분들입니다.

제가 디바이스 드라이버 개정판 못 내는 이유가 저 이유입니다.  ㅠㅠ

어쨌든 우리는 2.6.28 을 받아야 합니다.

홈페이지에 보면

     http://www.kernel.org/pub/
     ftp://ftp.kernel.org/pub/

에서 받을 수도 있고 미러 사이트들이 있다는 것도 알 수 있습니다.
아무래도 한국에 있는 미러 사이트가 좀 빠릅니다.

하지만 전 다운로드 하면서 커피한잔과 인터넷 서핑이라는 여유를 즐기기 위해서
아래 링크에서 받기로 했습니다.

      http://www.kernel.org/pub/linux/kernel/v2.6/ linux-2.6.28.10.tar.gz

후후..

2.6.28에 10이 더 붙은 놈이군요..

뭐 2.6.29 버전을 하고 싶다는 욕망이 있지만 일단 참아 보렵니다.

원래 목표대로 가야 하지 않겠습니까?

후후

이걸 윈도우에서 클릭해서 다운로드를 받을 수 있겠지만 coLinux에서 명령행으로 받아 보기로 했습니다.

아..

참…

리눅스에서 작업 디렉토리는

    /project/linux_2628/trunk

로 하기로 했습니다.

이걸 일단 포팅을 공개적으로 하기 위해서 svn 공개 리포지토리를 하나 만들겠습니다.

외부에서 다운 로드만 가능하게 하도록 하겠습니다.
저는 당근 커밋 권한이 있겠죠?
여러분들은 브라우징 권한만 있고요…

         svn://svn.falinux.com/linux_2628/trunk/ 로 하죠..
         /project/linux_2628/trunk


자신의 컴퓨터에 체크 아웃을 하시려면 다음과 같이 합니다.

[root@localhost linux_2628]# svn co svn://svn.falinux.com/linux_2628/trunk/
체크아웃된 리비전 1.

자…

이제 이 디렉토리에 커널 소스를 가져 옵시다.

웹 파일 가져 오는 리눅스 명령 중에 wget 이라고 하는 명령이 있습니다.

이걸 한번 사용해 보겠습니다.

[root@localhost linux_2628]# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.28.10.tar.gz
--2009-05-05 03:38:06--  http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.28.10.tar.gz
Resolving www.kernel.org... 204.152.191.37, 130.239.17.4, 149.20.20.133, ...
Connecting to www.kernel.org|204.152.191.37|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 66796955 (64M) [application/x-gzip]
Saving to: `linux-2.6.28.10.tar.gz'

100%[=========================================================>] 66,796,955  2.82M/s   in 25s    

2009-05-05 03:38:32 (2.58 MB/s) - `linux-2.6.28.10.tar.gz' saved [66796955/66796955]

[root@localhost linux_2628]#



받은 파일의 압축을 풉니다.

[root@localhost linux_2628]# ls
linux-2.6.28.10.tar.gz  trunk
[root@localhost linux_2628]# mv linux-2.6.28.10.tar.gz trunk/
[root@localhost linux_2628]# cd trunk/
[root@localhost trunk]# tar zxvf linux-2.6.28.10.tar.gz

생성된 linux-2.6.28.10 디렉토리에 linux 라고 하는 이름으로 링크를 겁니다.

이렇게  하는 이유는 현재 작업중인 리눅스 커널을 명기 하기 위한 것도 있고
나중에 패치를 만들 때  디렉토리 명을 통일하기 위한 것도 있습니다.

[root@localhost trunk]# ln -s linux-2.6.28.10 linux

일단 전 여기까지 작업을 하고 서브버전 커밋 했습니다.

아..

깜빡 잊었는데요..

전 주로 작업할 때 root 권한으로 합니다.

저의 이 무식한 행위를 이해해 주세요..
Trackback 3 Comment 0
2009.05.10 13:55

2.6.28 커널로 갈아타기 - 개발 환경

들어가며

저돌적인 학습 욕구가 왕성한 초보자 분들이 가장 먼저 무한 삽질의 세계에 빠져 들면서 혼란스러워 하는 것이 바로 개발 환경 구축이죠..

윈도우 프로그램의 개발 환경은 솔찍하게 그냥 간단합니다.

상용 패키지 하나 깔면 끝~~~ ( 뭐 어둠의 경로를 애용하시는 분들이 더 많다는 소문도 있지만 쩝~ )

임베디드 컨트롤러 특히 8비트 프로세서들의 개발 환경도 조금 복잡하지만 에뮬레이터 한 개와 상용 패키지 하나 깔면 끝~~

근데…

이놈의 임베디드 리눅스 하려면 ( 물론 돈 안 들이려고 하는 조건일 때 )

뭐가 이리 복잡하고 할 수 있는 다양한 방법이 존재 하는지

그래서 처음부터 좌절하는 경향이 있죠..

그래서 이번 진행 과정에 사용되는 환경에 대하여 제가 사용하고 있는 환경을 공개하겠습니다

 

개발 환경

커널을 포팅하는 과정은 다음과 같은 행위의 반복입니다.

1) 커널을 수정한다.
2) 커널을 컴파일 한다.
3) 커널을 보드에 올린다.
4) 보드를 리부팅한다.
5) 커널이 부팅된 후 진행 상태를 커널 메시지로 관찰한다.
6) 버그나 다음 작업 진행을 위해서 1) 부터 다시 시작한다.

자 이런 행위를 하기 위해서 필요한 것들이 무엇일까요?  

우선 개발용 컴퓨터와 커널이 포팅되는 타켓이 필요하겠죠? 

그 외에 파워써플라이와 오실로스코프가 있으면 좋겠지만 사실 하드웨어가 이상이 없다면 굳이 필요 없습니다. 파워 써플라이는 아답터로 대신 할테고 하드웨어 상태가 오실로스코프를 쓸 정도면 초보자들은 일단 손을 띄시는 것이 정신 건강에 이롭습니다.  

이제 개발용 컴퓨터와 타켓은 서로 연결되어야 합니다.

뭘로 연결될까요?
예 그렇습니다.
시리얼 케이블과 이더넷 네트워크 케이블입니다. 

네트워크 구성은 아무래도 컴퓨터와 보드를 직접 연결하기 보다는 네트워크 허브나 공유기를 이용하시면 더 편하지요.. 

전 당연히 허브를 이용한 구성으로 작업 하고 있습니다.

제 시스템 환경 구성은 다음 그림과 같습니다.

 

 

자 이제 하드웨어 와 시스템 구성은 되었습니다.  

그 다음 하는 것은 ?

1) 커널을 수정한다.

그렇습니다.

커널을 수정해야 합니다.  

커널은 컴퓨터에서 수정해야 하는데 해당 컴퓨터는 운영체제가 있어야 겠죠… 

저는 개발 환경 운영체제가 윈도우 XP 를 사용합니다.  

허허~~

많은 분들이 제가 열혈 리눅서라고 착각하시는 분들이 있고 제가 리눅스 운영체제에서 모든 작업을 할 것이라고 상상하시는 분들이 있을지 모르지만  

전 VI 에디터도 잘 못 씁니다. 물론 사용할 수야 있지만 저희 회사에 근무하고 계시는 켈프 짱이신 박진호씨의 화려한 VI 사용 실력을 보면 전 그냥 쭈구러 듭니다.

 리눅스 명령어도 사실 몇 개 밖에 모릅니다.  

하하 

그래도 임베디드 리눅스와 관련된 기술만은 타의 추종을 불허 한다고 자신..
( 퍽~~~ ㅠㅠ 죄송합니다. 잠시 오버 했습니다. ) 

어쩄든 윈도우에서 편집기 돌려 리눅스 커널 소스를 수정합니다.  

오호 … 그런데  혹시 아십니까? 

리눅스 커널소스를 윈도우에서 압출을 풀면 쪼까 문제가 된다는 것을?

리눅스 커널 소스는 원칙적으로 리눅스 파일 시스템을 이용한다는 가정하에 구성되고 있습니다.  

가장 대표적인 것이 심볼릭 링크 입니다.
또 한가지는 소스 파일 중 어셈블러 파일일 경우 확장자가 대문자인경우와 소문자인 경우가 약간 차이가 납니다.  

어찌 되었던

리눅스 커널 소스는 리눅스 파일 시스템에서 압축을 풀고 작업을 해야 합니다.  (반드시는 아닙니다.)

자 ..

그렇다면 아무래도 리눅스 시스템이 필요하겠죠? 

그런데 눈치 채셨겠지만 개발 시스템 구성상 전 이미 운영체제를 XP 로 설치한 상태이고 리눅스는 멀티 부팅하기 귀찮아 합니다.  

그래서 저는 coLinux를 사용합니다.

 이거 저에게는 노트북에도 설치해서리 현장에 갈 경우 씁니다.
아니면 다른 실험실 같은 곳에서 개발 작업이나 연구를 해야 할 때 씁니다.  

한마디로 죽이는 놈이 coLinux 입니다.  

coLinux 설치방법은 저희 회사 포럼에 잘 나와 있죠. 바로 여기

http://forum.falinux.com/zbxe/?mid=coLinux


이 강좌에 글을 따라 하실 때 먼저 브릿지 모드로 네트워크를 설정하는 강좌를 먼저읽고 진행하기를 권장합니다.

http://forum.falinux.com/zbxe/?document_srl=507011

솔직히 제 경험상 가장 실패 율이 적습니다.

그런데 위 강좌 글을 따라 하면 2 % 부족함을 느낄 겁니다.

 예 ..

그렇습니다.

 진행을 하다 보면 이것저것 필요한 개발 패키지와 시스템이 설치 되어 있어야 합니다.

 이걸 또 일일이 찾아 다니며 필요한 것들이 무엇인가 찾고 하는 것도 그리 쉬운 것이 아니죠…

그래서 제가 여러분들에게 선물을 하나 하기로 했습니다 .

그게 뭐냐?

제가 사용하고 있는 coLinux 이미지를 공개 하기로 한 것이죠

  공개 coLinux 이미지 내용 

 이 이미지는 다음과 같은 환경 조건을 가지고 있습니다.

 

파일 시스템 크기 :  6G
배포판 기반  : 페도라 9 ( 가장 최신것으로 업데이트 된 상태임 )
네트워크  : 100.100.100.100 
넷마스크  : 255.255.0.0

설치된 크로스 컴파일러 :

arm 용 3.4.3
mips 용 3.4.3
mingw 윈도우용 컴파일러

네트워크 서버 :

tftp 서버    /tftpboot/  디렉토리 서비스
nfs 서버   /nfs/ 디렉토리 서비스
삼바서버   /project/ 디렉토리 서비스

각종 리눅스 개발 툴에 필요한 패키지 대부분 설치
man 페이지 : 한글 맨페이지 및 영문 맨페이지

사용자 명은 : user
암호   : user

Root 암호는 : root

 이거 어디서 받냐고요? 여기서 받습니다.

http://ftp.falinux.com/colinux/fedora9/Fedora9-6G-2009-05-05-yyc.img

이 이미지는 우선 포럼에서

http://forum.falinux.com/zbxe/?document_srl=505577 글을 보고

colinux 설치 하신 후

제가 올린 위 이미지로 살포시 바꾸시기 바랍니다.

이 이미지에 보면 내부에 /root 에 스크립트 파일이 하나 있습니다.
이건 ip와 라우터를 쉘 스크립트로 바꾸는 예제인데 혹시나 해서 하나 만들어 넣었습니다.

필요하시면 참조 하세요..
 

자 이제 제가 올려 드린 colinux 환경이라고 하면 

윈도우에서 삼바로 접근해야 할겁니다.  

네트워크 설정이

윈도우는 100.100.100.101 이고 colinux 페도라 배포판이 100.100.100.100이라면 

윈도우 탐색기에서 \\100.100.100.100\ 이렇게 하시면

Colinux 페도라의 project 에 접근 하실 수 있겠죠… 

이 네트워크 디렉토리를 이용해서 윈도우에서 편집 할 수 있을 겁니다.

 그렇지만 아직 우리는 문제가 있죠?

coLinux 에 접근 할 수 있는 방법을 알려 드려야 하는데

텔넷으로 접근해야 겟죠?

 전 tocken plus 라는 프로그램을 사용합니다 .
여기에 가시면 됩니다.

http://www.bomul.com/pds/view.html?id=53252

한국 분들이 만든 건데 미국에 회사를 차렸나 봐요..

http://choung.net/

하지만 장길석씨는 공개된 프로그램을 이용하라고 하네요
이것도 공짜거든요…

여기에 해당 글 있습니다.

http://forum.falinux.com/zbxe/?mid=manual_booting_win_tutty

시리얼 포트를 연결해서 부팅 메시지 보는 법이나

텔넷을 이용해서 리눅스 컴파일 서버에 접속하는 법은

EZ 보드 통합 매뉴얼을 참고 해 주시기 바랍니다.

기타 진행 사항은 다음 강좌에서 설명할 겁니다

Trackback 1 Comment 0


티스토리 툴바