1.1. 시작하기전에

STLinux의 개발환경은 RPM(RedHat Package Manager)파일형태로 배포됩니다. 우선 우리는 이것을 설치할수 있는 리눅스(Linux) 배포판이 설치된 인터넷 연결이 가능한 Host PC 한대가 필요합니다.

일반적으로 아래의 32bit 리눅스(Linux) 배포판들은 인터넷으로부터 쉽게 다운로드 받아서 설치할수 있으며 STLinux의 RPM(RedHat Package Manager)파일들을 무난하게 설치하여 사용할수 있다고 할수 있습니다. 배포판 설치시에 방화벽이나 SELinux(Security Enhanced Linux) 기능은 비활성화 하거나 이를 잘 다룰수 있어야 합니다.

본 문서는 "RedHat Enterprise Linux Server version 5.3"을 Host PC에 설치하고 STLinux v2.3 을 설치하는 과정을 다루는 것을 기준으로 합니다. (참고: RedHat Enterprise Linux 설치)

보다 자세한 정보를 원하신다면 [http]STMicroelectronics[]사에서 운영하는 [http]STLinux 홈페이지[]를 방문하세요.

1.2. STLinux 배포본의 설치

일단 리눅스(Linux)가 설치된 Host PC 에는 STLinux 배포본을 설치해야 합니다. STLinux 배포본은 [ftp]ftp://ftp.stlinux.com/pub/stlinux/[] 에서 최근 버전을 다운로드 받을수 있습니다.

STLinux 배포본을 리눅스(Linux)가 설치된 Host PC 에 설치합니다. 설치과정에서는 Host PC 의 root계정으로 로그인(Login)하여 진행해야 합니다. 다음과 같은 순서로 다운로드 및 설치를 진행합니다.

  1. 리눅스가 설치된 Host PC 의 root 계정으로 로그인(Login) 합니다.
  2. 만약 이전에 설치한 STLinux 배포본이 있다면 이를 Uninstall합니다. (처음 설치하시는 경우라면 이 과정은 생략하셔도 됩니다.)
    [root@STLinux ~]# rpm –e –nodeps `rpm –qa | grep stlinux23`
    [root@STLinux ~]# rm –rf /opt/STM/STLinux-2.3
    
  3. 다운로드 받은 파일을 저장할 디렉토리 "~/download"를 만들고 STLinux의 iso 이미지 파일을 다운로드 받습니다.
    [root@STLinux ~]# mkdir -p ~/download
    [root@STLinux ~]# wget ftp://ftp.stlinux.com/pub/stlinux/2.3/iso/STLinux-2.3-sh4-03-11-07.iso -P ~/download/
    
  4. "/mnt/cdrom" 디렉토리를 만들고 해당 디렉토리에 다운로드 받은 STLinux의 iso 이미지 파일을 마운트(mount) 하고 "/mnt/cdrom"으로 이동하여 "./install all-sh4-glibc"를 실행하여 설치합니다. (만약 uclibc를 사용하시려고 계획하셨다면 "./install all-sh4-uclibc"를 실행하여 설치를 진행하시면 됩니다.
    [root@STLinux ~]# mkdir -p /mnt/cdrom
    [root@STLinux ~]# mount -o loop,ro -t iso9660 -r ~/download/STLinux-2.3-sh4-03-11-07.iso /mnt/cdrom
    [root@STLinux ~]# cd /mnt/cdrom
    [root@STLinux cdrom]# ./install all-sh4-glibc
    
  5. STAPI관련 패키지(Package)도 다운로드 받기 위해서 stmyum 의 설정파일에 해당 정보를 추가하여야합니다. 아래의 내용을 "/opt/STM/STLinux-2.3/host/etc/yum.conf"파일에 추가합니다. (그 밖에 필요한 패키지들을 이러한 식으로 추가설정할수 있습니다.)
    [STLinux_Distribution_STAPI]
    name=STLinux Distribution 2.3 STAPI
    baseurl=http://www.stlinux.com/pub/stlinux/2.3/stapi/RPMS
    gpgkey=http://www.stlinux.com/pub/stlinux/2.3/STLinux/gpg_key
    gpgcheck=0
    
  6. STLinux 전체를 업데이트(Update)합니다. 단, Host PC는 인터넷 연결이 가능한 상태에 있어야 합니다. (이 과정은 인터넷 속도에 따라서 상당히 오래 걸릴수도 있습니다.)
    [root@STLinux cdrom]# /opt/STM/STLinux-2.3/host/bin/stmyum update
    ....
    Transaction Summary
    =============================================================================
    Install
    XXX Package(s)
    Update
    XXX Package(s)
    Remove
    XXX Package(s)
    Total download size: XXX M
    Is this ok [y/N]: y
    ....
    
    "stmyum update"을 하면 이전에 작업했던 소스들과 버전호환성 문제로 빌드가 안되거나 대규모 수정이 필요한 상황이 있을수 있습니다. 이 경우 해당 문제가 되는 패키지를 Migration 해야 할수도 있습니다.

    확인된 문제사항은 다음과 같습니다.
    • STLinux v2.3 에서 STLinux v2.2의 u-boot버전이 빌드오류가 발생합니다.
    • u-boot 과 Linux kernel이 시점적으로 비슷한 시기의 버전이 아닌 경우 헤더호환문제가 있는 경우가 있습니다.
    • gcc 4.2.4-51이상의 버전에서 u-boot-sh4-1.3.1_stm23_0043 이 빌드되지 않습니다.
  7. 설치된 STLinux의 경로입력을 간단히 하기 위해서 PATH 환경변수에 경로를 추가합니다.
    [root@STLinux ~]# echo "export PATH=/opt/STM/STLinux-2.3/devkit/sh4/bin:\${PATH}" >> ~/.bash_profile
    [root@STLinux ~]# echo "export PATH=/opt/STM/STLinux-2.3/host/bin:\${PATH}" >> ~/.bash_profile
    [root@STLinux ~]# source ~/.bash_profile
    


  8. 이제 기본적인 개발환경의 설치가 끝났습니다.

    지금까지의 설치과정에서 보다시피 STLinux는 편리한 패키지(Package) 관리툴을 제공합니다. 직접 [ftp]ftp://ftp.stlinux.com/pub/stlinux/[] 에서 RPM(RedHat Package Manager)파일을 다운로드 받아서 설치할수도 있으나 stmyum 이라는 유틸리티를 통해서 보다 편리하게 설치 및 업데이트(Update)를 할 수가 있습니다.

  9. rpm 유틸리티의 기본 사용법
    • 패키지(Package) 설치
      rpm –ivh <rpm file>
      
    • 설치된 패키지(Package) 업데이트(Update)
      rpm –Uvh <rpm file>
      
    • 패키지(Package) 삭제하기
      rpm –e <package name>
      
    • 설치된 패키지(Package) 목록 보기
      rpm –qa
      
  10. stmyum 유틸리티 기본 사용법
    • 패키지(Package) 설치
      stmyum install <package name>
      
    • 설치된 패키지(Package) 업데이트(Update)
      stmyum update <package name>
      
    • 패키지(Package) 삭제하기
      stmyum remove <package name>
      
    • 설치된 패키지(Package) 목록 보기
      stmyum list
      


1.3. U-boot bootloader build

부트로더(Boot loader)의 소스는 "/opt/STM/STLinux-2.3/devkit/sources/u-boot/"디렉토리 밑에 있습니다. 이것을 그대로 해당 디렉토리에서 빌드 및 수정작업을 하기보다는 자신의 작업디렉토리로 복사해서 작업하는게 좋습니다.

  1. 다음과 같이 u-boot source를 자신의 작업디렉토리로 복사합니다. (본 문서에서는 작업디렉토리를 "~/project/stprj"로 설정하였고 version 1.3.1_stm23_0044을 기준으로 설명합니다.)
    [root@STLinux ~]# mkdir –p ~/project/stprj
    [root@STLinux ~]# cp –a /opt/STM/STLinux-2.3/devkit/sources/u-boot/u-boot-sh4-1.3.1_stm23_0044 ~/project/stprj/
    
  2. 자신의 보드(Board)에 맞는 빌드설정을 하기 위해서 기존에 만들어져 있는 프로파일(Profile)로부터 새로운 프로파일(Profile)로 복사합니다. (본 문서에서는 프로파일 "5197cab"을 기준으로 새로운 프로파일인 "stprj"를 만드는것으로 설명합니다.)
    [root@STLinux ~]# cd ~/projtect/stprj/u-boot-sh4-1.3.1_stm23_0044/
    [root@STLinux u-boot-sh4-1.3.1_stm23_0044]# ls ./board/
    5197cab
    a3000
    adder
    .
    .
    .
    mb411
    mb442
    mb448
    mb519
    mb618
    mb628
    mb671
    mb680
    mb704
    [root@STLinux u-boot-sh4-1.3.1_stm23_0044]# cp -a ./board/5197cab ./board/stprj
    [root@STLinux u-boot-sh4-1.3.1_stm23_0044]# mv ./board/stprj/init-5197cab.S ./board/stprj/init-stprj.S
    [root@STLinux u-boot-sh4-1.3.1_stm23_0044]# mv ./board/stprj/5197cab.c ./board/stprj/stprj.c
    [root@STLinux u-boot-sh4-1.3.1_stm23_0044]# cp ./include/configs/5197cab.h ./include/configs/stprj.h
    
  3. Text 편집기(예: vim)로 u-boot의 Makefile을 편집하는데 5197cab_config 부분을 찾아서 참고하면서 그 밑에 아래와 같이 추가합니다.
    5197cab_config \
    5197cabse_config :              unconfig
            @ >include/config.h
            @echo "#define CONFIG_SH_STX5197   1" >>include/config.h
            @echo "#define CONFIG_SH_5197CAB   1" >>include/config.h
            $(if $(findstring se,$@), \
            @echo "#define CONFIG_SH_SE_MODE   1" >>include/config.h)
            $(if $(findstring se,$@), \
            @echo "TEXT_BASE = 0x83F00000" >$(obj)board/5197cab/config.tmp)
            @./mkconfig -a 5197cab sh sh 5197cab "" stx5197
    
    ###########################################
    ### 5197cab_config를 참고하여 새로 추가한 부분
    ###########################################
    stprj_config \
    stprjse_config :              unconfig
            @ >include/config.h
            @echo "#define CONFIG_SH_STX5197   1" >>include/config.h
            @echo "#define CONFIG_SH_STPRJ     1" >>include/config.h
            $(if $(findstring se,$@), \
            @echo "#define CONFIG_SH_SE_MODE   1" >>include/config.h)
            $(if $(findstring se,$@), \
            @echo "TEXT_BASE = 0x83F00000" >$(obj)board/stprj/config.tmp)
            @./mkconfig -a stprj sh sh stprj "" stx5197
    
  4. "./board/stprj/config.mk"의 TEXT_BASE의 값을 수정해야 하는데 이것은 자신의 보드 (Board)에 따라서 값이 달라질수 있습니다. 이러한 TEXT_BASE의 값을 결정하는 공식은 다음과 같은 계산에 의해서 결정해야 하는데 이는 결국 SDRAM의 마지막 1Mbytes 영역에 u-boot을 올려서 실행하겠다는 의도로 나온 계산이라고 보시면 틀리지 않습니다.
    TEXT_BASE = <SDRAM의 base주소> + (<SDRAM의 size> - 1Mbytes)
    
    본 문서에서는 SDRAM의 base주소는 84000000H, SDRAM의 size는 64Mbytes를 기준으로 다음과 같이 "./board/stprj/config.mk"를 수정하였습니다.
    #
    # stprj board
    #
    # Installs at SDRAM BASE + 63M in cache region
    TEXT_BASE = 0x87F00000
    PLATFORM_LDFLAGS +=
    
  5. 자신의 Board에서 만약 Flash chip의 write기능을 사용하기 위한 Vpp 전압을 제어하는 부분이 구현되어야 하는 경우라면 소스파일인 "./board/stprj/stprj.c"에 flashWriteEnable 및 flashWriteDisable함수에 구현해 해당 Vpp제어부분을 적절하게 구현해 넣어야 합니다.
  6. 자신의보드에 맞는 설정을 하기 위해서 헤더파일인 "./include/configs/stprj.h"를 수정합니다.
  7. "./include/asm-sh/io.h"에 CONFIG_SH_STPRJ에 대한 부분을 추가합니다.
    #if defined(CONFIG_SH_MB411) || \
            defined(CONFIG_SH_MB442) || \
            defined(CONFIG_SH_MB448) || \
            defined(CONFIG_SH_HMS1) || \
            defined(CONFIG_SH_MB519) || \
            defined(CONFIG_SH_MB618) || \
            defined(CONFIG_SH_MB628) || \
            defined(CONFIG_SH_MB671) || \
            defined(CONFIG_SH_MB680) || \
            defined(CONFIG_SH_PDK7105) || \
            defined(CONFIG_SH_IPIDTV7105) || \
            defined(CONFIG_SH_MB704) || \
            defined(CONFIG_SH_5197CAB) || \
            defined(CONFIG_SH_CB101) || \
            defined(CONFIG_SH_CB102) || \
            defined(CONFIG_SH_STPRJ)
    # include "asm/io_stb1eval.h"
    #else
    # error "What system is this?"
    #endif
    
  8. U-boot 를 빌드합니다.
    [root@STLinux
    [root@STLinux
    [root@STLinux
    [root@STLinux
    ~]# cd ~/project/stprj/u-boot-sh4-1.3.1_stm23_0044/
    u-boot-sh4-1.3.1_stm23_0044]# make mrproper
    u-boot-sh4-1.3.1_stm23_0044]# make stprj_config
    u-boot-sh4-1.3.1_stm23_0044]# make
    
    빌드가 완료되면 u-boot, u-boot.bin, u-boot.map, u-boot.srec 가 생성됩니다. 여기서 우리가 flash에 write하게 될 파일은 u-boot.bin이며 GDB로 load하는 것은 ELF포맷인 u-boot파일이 사용됩니다.
  9. U-boot를 stprj board 에 flash로 write 하기 위해서 sh4-linux-gdb를 통해서 u-boot을 실행합니다. stprj board는 “ST Micro Connect”에 연결되어 있어야 하고 board내의
Serial console도 볼수 있도록 미리 준비해주어야 합니다. Board마다 접속하는 profile이름이 다르므로 이 부분은 각자 해결하셔야 할겁니다. (이 문서에서는 “ST Micro Connect”의 IP를 192.168.33.2로 설정하였다고 가정하고 작성되었습니다.)
[root@STLinux u-boot-sh4-1.3.1_stm23_0044]# sh4-linux-gdb ./u-boot
GNU gdb STMicroelectronics/Linux Base 6.8-41 [build Aug 3 2009]
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=i686-pc-linux-gnu --target=sh4-linux"...
(gdb) 5197cabbypass 192.168.33.2
The target is assumed to be little endian
0xa0000000 in ?? ()
(gdb) load
Loading section .text, size 0x1195c lma 0x87f00000
Loading section .rodata, size 0x750 lma 0x87f1195c
Loading section .rodata.str1.4, size 0x3e74 lma 0x87f120ac
Loading section .data, size 0xb50 lma 0x87f15f20
Loading section .u_boot_cmd, size 0x4b4 lma 0x87f16a70
Start address 0x87f00000, load size 93988
Transfer rate: 236 KB/sec, 18797 bytes/write.
(gdb) compare-sections
Section .text, range 0x87f00000 -- 0x87f1195c: matched.
Section .rodata, range 0x87f1195c -- 0x87f120ac: matched.
Section .rodata.str1.4, range 0x87f120ac -- 0x87f15f20: matched.
Section .data, range 0x87f15f20 -- 0x87f16a70: matched.
Section .u_boot_cmd, range 0x87f16a70 -- 0x87f16f24: matched.
(gdb) continue
Continuing.
GDB명령 compare-sections에서 matched로 나와야만 정상적인 실행이 됩니다. 마지막에 "Continuing." 메시지가 나온후 compare-sections가 matched가 아니면 다시 Ctrl-C키를 누
른후 load명령부터 다시 수행해보시면 matched라고 될때가 있습니다. 이때 Serial console상테 보면 u-boot의 부트메세지가 정상적으로 출력되는 것을 보실수 있습니다. Serial console로 아무키나 전송하면 프롬프트로 진입하게 됩니다.
U-Boot 1.3.1 (Aug 20 2009 - 18:16:28) - stm23_0044
DRAM: 64 MiB
NOR:
8 MiB
*** Warning - bad CRC, using default environment
In:
serial
Out: serial
Err: serial
Hit any key to stop autoboot: 15
stprj>
이제 빌드된 u-boot.bin을 serial로 전송하여 flash에 write 합니다. (이때 Serial console을 통해서 Ymodem으로 파일을 전송해야 되므로 Serial console terminal 프로그램이 Ymodem을 지원해야 합니다. 예를 들어서 SecureCRT같은 Terminal 프로그램이 Ymodem을 지원합니다.)
stprj> run updateboot
Un-Protect Flash Sectors 0-1 in Bank # 1
.. done
Erase Flash Sectors 0-1 in Bank # 1
.. done
## Ready for binary (ymodem) download to 0x84000000 at 115200 bps...
CCCC
Starting ymodem transfer. Press Ctrl+C to cancel.
Transferring u-boot.bin...
100%
91 KB
6 KB/s 00:00:15
0 Errors
xyzModem - CRC mode, 737(SOH)/0(STX)/0(CAN) packets, 6 retries
## Total Size
= 0x00016f24 = 93988 Bytes
Copy to Flash
........ done
Protect Flash Sectors 0-1 in Bank # 1
.. done
stprj>





/*

[ FrontPage | PrintView | RawView | RSS ]

Copyright ⓒ MINZKN.COM
All Rights Reserved.

MINZKN

----

*/