Running LEON3 on ZedBoard Tutorial

LEON3는 FPGA로 합성 가능한 soft-core processor 중 한 가지로, SPARC V8 아키텍쳐에 기반하고 있다[1]. 소스 코드는 Cobham Gaisler에서 제공하고 있으며, 연구/교육 목적으로 무료로 사용할 수 있다 (GNU GPL 라이센스). RTL을 직접 수정하며 프로세서를 더 잘 이해하고자 LEON3를 선택했다. LEON3를 합성해 ZedBoard에 올려보고, 그 위에 리눅스를 돌려보았다. 이 글에서는 ZedBoard에 LEON3를 올리고, 리눅스를 돌아가게 하는 것까지의 과정을 설명하고자 한다.

원래는 XUPV5-LX110T(ML509) 보드에 OpenSPARC을 올려보려 했으나 실패했다. OpenSPARC은 Sun에서 공개한 마이크로 프로세서이다[6,7]. OpenSPARC을 XUPV5-LX110T에 올리는 것에 많은 어려움이 있었다[8]. 개발 환경 구성이 너무 까다로웠다. 10년쯤 전에 공개된 아키텍쳐와 툴체인이므로, 현재의 환경에서 개발 환경을 구성하기가 힘들다. 소스 코드는 거의 관리되지 않고 있으며, 이를 사용하는 사람도 없는 것으로 보인다. 개발 도구 또한 아주 오래된 것을 사용해야만 한다. 여러가지 개발 도구를 설치해보았지만, ISE 10.1 버전 외에는 프로젝트 파일이 열리지 않는다. 그 외의 버전에서는 프로젝트 파일이 호환되지 않는다. 그리고 Xilinx에서 제공하는 툴 뿐 아니라, 여러가지 상용 검증 도구도 필요하다 (VCS, Vera, Debussy). 검증 도구 사용 방법도 알아야 하는 것은 물론이다.

이에 비해 LEON3는 상대적으로 잘 관리되고 있으며, 사용하는 사람도 많다 (메일링 리스트). 사용 방법도 인터넷 검색으로 쉽게 확인할 수 있었다. 개인적으로는 Realtime Embedded에서 제공하는 튜토리얼이 도움이 되었다[10]. LEON3, OpenRISC 1200, Nios2, MicroBlaze 모두 소개해주고 있다. LEON3가 가장 마음에 들었고, 접근성이 높아 이를 선택했다. Realtime Embedded의 글이 충분히 잘 설명하고 있으나, 시간이 많이 지났다는 점과 (버전 차이), 대상 보드가 다르다는 점, 실험 환경이 다르다는 점에서 ZedBoard에 바로 적용하기엔 어려운 점이 있었다.

Contents
1. ZedBoard 소개
2. 실험 환경 세팅
– 1) grlib 다운로드 및 설치
– 2) Xilinx Vivado 2013.4 설치
– 3) 리눅스 커널 패치 및 Digilent 드라이버 설치
3. LEON3 합성 및 ZedBoard에 업로드
– 1) grlib 소스 코드 패치
– 2) LEON3 합성
– 3) ZedBoard에 leon3mp.bit 업로드
4. grmon을 사용한 LEON3 접속 및 리눅스 부팅
– 1) grmon 설치
– 2) grmon을 사용해 LEON3에 접속
– 3) 리눅스 이미지 다운로드 및 부팅
5. 리눅스 이미지 생성 및 부팅
– 1) 필요 툴 다운로드 및 설치
– 2) buildroot
– 3) leon linux 빌드
– 4) mklinuximg
– 5) grmon를 사용해 LEON3 연결, 리눅스 부팅

1. ZedBoard 소개
ZedBoard
ZedBoard는 Zynq-7000 all-programmable SoC를 위한 개발 보드이다[4, 11]. Zynq-7000은 all-programmable SoC인 칩 자체를 의미하며, ZedBoard는 이것의 테스팅 및 개발을 위한 보드를 의미한다. Zynq-7000을 사용한 개발 보드는 ZedBoard 외에도 ZC702, ZC706 등이 있다[15]. 우리 연구실에 ZedBoard가 있어서 이를 사용해 LEON3를 올려보았다. ZedBoard의 개발 환경 세팅에 대해서는 이전에 알아본 적이 있다[16]. 당시에는 윈도우에서 환경을 구축했었는데, LEON3를 올리기 위해서는 리눅스에서 개발 환경을 구축해야 한다. ZedBoard 기본 사용 방법 및 개발 방법은 The Zynq Book[14], An FPGA Tutorial using the ZedBoard[17], ZedBoard Training and Videos[18], Zynq design from scratch[19]를 참고하면 된다. 그 외에 Xilinx Documentation도 잘 찾아보면 쉽게 설명된 것이 많다. ZedBoard와 Zynq-7000을 잘 몰라도 LEON3를 합성해 올릴 수는 있지만, 잘 알아야 예상치 못한 에러를 해결하기 쉽다.

2. 실험 환경 세팅
LEON3를 합성하고 ZedBoard에 올리기 위해서는 grlib(LEON3 소스 코드), Vivado(개발 도구), digilent 드라이버를 다운받아 설치해야 한다.

1) grlib 다운로드 및 설치
gaisler-grlib-download
Cobham Gaisler 홈페이지에 접속해, LEON3/GRLIB source code와 GRFPU netlist를 다운로드한다[20].

$wget http://gaisler.com/products/grlib/grlib-gpl-1.4.1-b4156.tar.gz
$wget http://gaisler.com/products/grlib/grlib-netlists-gpl-1.4.1.tar.gz
$tar -xzvf grlib-gpl-1.4.1-b4156.tar.gz
$cd grlib-gpl-1.4.1-b4156
$tar -xzvf ../grlib-netlists-gpl-1.4.1.tar.gz

이렇게 설치한 grlib의 디렉토리 구조는 아래와 같다

$cd grlib-gpl-1.4.1-b4156
$tree -L 1
├── bin
├── boards
├── designs
├── doc
├── lib
├── Makefile
├── netlists
└── software

boards 디렉토리는 개발 보드별 설정 파일을 담고 있으며, designs 디렉토리는 개발 보드별 개발 환경을 담고 있다. designs 디렉토리에서 make 명령어를 사용해 LEON3를 합성하고, 이를 LEON3에 올릴 수 있다. ZedBoard의 경우, ./grlib-gpl-1.4.1-b4156/designs/leon3-xilinx-zc702에 해당한다. 환경 설정 및 합성 방법에 대한 설명이 이 디렉토리 아래의 README.txt에 설명되어 있으며, 이를 따라하면 된다.

2) Xilinx Vivado 2013.4 설치
xilinx-vivado-2013.4-download
Xilinx 홈페이지에 접속해 Vivado Design Suite 2013.4 버전을 다운로드한다. 반드시 Vivado Design Suite 2013.4 버전을 설치해야 한다(README.txt 참고). 그렇지 않으면 LEON3의 설정 및 합성이 제대로 되지 않는다.

설치는 매우 쉬운 편이며, 루트 권한으로 설치한 다음에 라이센스 설정만 해주면 된다.

$tar -xvf Xilinx_Vivado_SDK_2013.4_1210_1.tar
$cd Xilinx_Vivado_SDK_2013.4_1210_1
$sudo ./xsetup

더 자세한 설치 및 라이센스 설정 방법은 이 글에서 다루지 않으며, Xilinx 매뉴얼을 참고하기 바란다[22]. 윈도우에서의 설치 방법에 대해 간략하게 설명한 글을 참고할 수는 있으나, 큰 도움은 되지 않을 것 같다[16].

참고로, 본인은 설치 과정에서 Xilinx cable driver 설치 옵션을 선택하지 않았다. Ubuntu 14.04.2 Desktop, 64bit에서 이 옵션을 포함하여 설치하면 오류가 발생했다. Cable driver는 다음 단계에서 설치한다.

3) 리눅스 커널 패치 및 Digilent 드라이버 설치
리눅스에서 USB-UART를 사용하려면 리눅스 커널에서 지원을 해주어야 한다. CONFIG_USB_SERIAL_CYPRESS_M8=y, CONFIG_USB_ACM=y가 설정된 커널을 사용해야 한다[23]. 커널 옵션을 확인해보고, 리눅스 커널이 해당 옵션 없이 빌드되었다면 새로 빌드해야 한다. 커널 빌드 방법은 이전에 정리한 적 있으니 필요하면 참고하면 된다[24]. 정상적인 커널이라면 ZedBoard를 USB-UART 사용해 연결했을 때 /dev/ttyACM0 장치를 확인할 수 있다.

다음으로 Digilent의 드라이버를 설치한다.

$wget http://www.digilentinc.com/Data/Products/ADEPT2/digilent.adept.runtime_2.16.1-2_amd64.deb
$sudo dpkg -i digilent.adept.runtime_2.16.1-2_amd64.deb

기억나는대로 최대한 정리하였으나, 빠뜨린 것이 있을 수 있다. USB-JTAG, USB-UART가 제대로 동작하는지 확인해보기 위해 1) ZedBoard에 첨부된 SD 카드를 사용해 리눅스를 부팅하고, 부팅 메시지 확인, 2) 간단한 프로그램을 ZedBoard에 올려보고 제대로 올라가는지 확인하기 바란다.

만약에 문제가 있다면 어떻게든(?) 제대로 동작되게끔 해야 한다.

3. LEON3 합성 및 ZedBoard에 업로드
지금까지 ZedBoard 개발 환경을 설정하고 LEON3 소스 코드를 다운로드 받았다.
이제 LEON3를 합성하고 ZedBoard에 업로드할 수 있다.

1) grlib 소스 코드 패치
앞서 ZedBoard에 해당하는 디렉토리가 ./grlib-gpl-1.4.1-b4156/designs/leon3-xilinx-zc702라고 설명했다. 하지만 사실 ZedBoard와 ZC702는 다른 보드이며, 따라서 ZedBoard에 맞도록 설정을 바꿔주어야 한다[26,27]. ./grlib-gpl-1.4.1-b4156/designs/leon3-xilinx-zc702/leon3mp.xdc 파일을 수정해주어야 한다.

ZedBoard에 맞도록 설정을 바꿔주지 않으면, 나중에 grmon을 사용해 LEON3에 접속할 때 다음과 같은 에러가 발생한다[28].

$./grmon -xilusb -nb -u

  GRMON2 LEON debug monitor v2.0.65 32-bit eval version
  
  Copyright (C) 2015 Cobham Gaisler - All rights reserved.
  For latest updates, go to http://www.gaisler.com/
  Comments or bug-reports to support@gaisler.com
  
  This eval version will expire on 10/12/2015

Xilusb: Cable type/rev : 0x3 
 JTAG chain (2): xc7x020 zynq7000_arm_dap 
  Warning: Failed to call Tcl_Init. Some TCL functions won't be working properly
           To avoid this warning, see Installation section in the manual about
           the environment variable GRMON_SHARE
AMBA plug&play not found!
Failed to initialize target!
Exiting GRMON

ZedBoard에 맞추어 ./grlib-gpl-1.4.1-b4156/designs/leon3-xilinx-zc702/leon3mp.xdc의 핀을 설정해주어야 한다.

소스 코드 수정 이전

#set_property PACKAGE_PIN T22 [get_ports {led[0]}]

set_property PACKAGE_PIN P17 [get_ports {led[7]}]
set_property PACKAGE_PIN P18 [get_ports {led[6]}]
set_property PACKAGE_PIN W10 [get_ports {led[5]}]
set_property PACKAGE_PIN V7 [get_ports {led[4]}]
set_property PACKAGE_PIN W5 [get_ports {led[3]}]
set_property PACKAGE_PIN W17 [get_ports {led[2]}]
set_property PACKAGE_PIN D15 [get_ports {led[1]}]
set_property PACKAGE_PIN E15 [get_ports {led[0]}]

set_property IOSTANDARD LVCMOS18 [get_ports {led[7]}]
set_property IOSTANDARD LVCMOS18 [get_ports {led[6]}]
set_property IOSTANDARD LVCMOS18 [get_ports {led[5]}]
set_property IOSTANDARD LVCMOS18 [get_ports {led[4]}]
set_property IOSTANDARD LVCMOS18 [get_ports {led[3]}]
set_property IOSTANDARD LVCMOS18 [get_ports {led[2]}]
set_property IOSTANDARD LVCMOS18 [get_ports {led[1]}]
set_property IOSTANDARD LVCMOS18 [get_ports {led[0]}]

#LEFT btn
set_property PACKAGE_PIN G19 [get_ports {button[0]}] 
#RIGHT btn
set_property PACKAGE_PIN F19 [get_ports {button[1]}]
set_property PACKAGE_PIN J18 [get_ports {button[2]}] 
set_property PACKAGE_PIN K18 [get_ports {button[3]}] 

set_property PACKAGE_PIN N19 [get_ports {switch[0]}]
set_property PACKAGE_PIN N20 [get_ports {switch[1]}]
set_property PACKAGE_PIN N17 [get_ports {switch[2]}]
set_property PACKAGE_PIN N18 [get_ports {switch[3]}]
set_property PACKAGE_PIN M15 [get_ports {switch[4]}]
set_property PACKAGE_PIN M16 [get_ports {switch[5]}]
set_property PACKAGE_PIN P16 [get_ports {switch[6]}]
set_property PACKAGE_PIN R16 [get_ports {switch[7]}]

#create_clock -name clk100 -period 10.0 [get_ports gclk]
set_false_path -from  [get_clocks clk_fpga_0] -to [get_clocks clk_fpga_1]
set_false_path -from  [get_clocks clk_fpga_1] -to [get_clocks clk_fpga_0]

소스 코드 수정 이후

set_property IOSTANDARD LVCMOS33 [get_ports led]
set_property PACKAGE_PIN T22 [get_ports {led[0]}]
set_property PACKAGE_PIN T21 [get_ports {led[1]}]
set_property PACKAGE_PIN U22 [get_ports {led[2]}]
set_property PACKAGE_PIN U21 [get_ports {led[3]}]
set_property PACKAGE_PIN V22 [get_ports {led[4]}]
set_property PACKAGE_PIN W22 [get_ports {led[5]}]
set_property PACKAGE_PIN U19 [get_ports {led[6]}]
set_property PACKAGE_PIN U14 [get_ports {led[7]}]
 
set_property IOSTANDARD LVCMOS18 [get_ports switch]
set_property PACKAGE_PIN F22 [get_ports {switch[0]}]
set_property PACKAGE_PIN G22 [get_ports {switch[1]}]
set_property PACKAGE_PIN H22 [get_ports {switch[2]}]
set_property PACKAGE_PIN F21 [get_ports {switch[3]}]
set_property PACKAGE_PIN H19 [get_ports {switch[4]}]
set_property PACKAGE_PIN H18 [get_ports {switch[5]}]
set_property PACKAGE_PIN H17 [get_ports {switch[6]}]
set_property PACKAGE_PIN M15 [get_ports {switch[7]}]
 
set_property IOSTANDARD LVCMOS18 [get_ports button]
set_property PACKAGE_PIN R16 [get_ports {button[0]}] 
set_property PACKAGE_PIN N15 [get_ports {button[1]}]
set_property PACKAGE_PIN R18 [get_ports {button[2]}] 
set_property PACKAGE_PIN T18 [get_ports {button[3]}] 
 
set_false_path -from  [get_clocks clk_fpga_0] -to [get_clocks clk_fpga_1]
set_false_path -from  [get_clocks clk_fpga_1] -to [get_clocks clk_fpga_0]

2) LEON3 합성
./grlib-gpl-1.4.1-b4156/designs/leon3-xilinx-zc702 디렉토리에서 make 명령어를 사용해 LEON3를 합성할 수 있다. LEON3의 합성에 성공하면 ./grlib-gpl-1.4.1-b4156/designs/leon3-xilinx-zc702/leon3mp.bit 파일을 확인할 수 있다.

우선 Makefile이 지원하는 옵션을 확인해보자.
make help 명령어로 사용 가능한 옵션을 확인할 수 있다.
타겟 보드가 무엇인지에 따라 서로 다른 명령어를 사용해 LEON3를 합성한다.
XUPV5-LX110T(ML509)의 경우에는 make ise로, ZedBoard의 경우 make vivado로 합성한다.

$cd ./grlib-gpl-1.4.1-b4156/designs/leon3-xilinx-zc702
$make help

 interactive targets:

 make alint-launch         : start alint elaboration time linting
 make avhdl-launch         : start active-hdl gui mode
 make riviera-launch       : start riviera
 make vsim-launch          : start modelsim
 make ncsim-launch         : compile design using ncsim
 make actel-launch         : start Actel Designer for current project
 make ise-launch           : start ISE project navigator for XST project
 make ise-launch-synp      : start ISE project navigator for synplify project
 make quartus-launch       : start Quartus for current project
 make quartus-launch-synp  : start Quartus for synplify project
 make synplify-launch      : start synplify
 make vivado-launch        : start Vivado project navigator
 make planahead-launch     : start PlanAhead project navigator
 make xgrlib               : start grlib GUI

 batch targets:

 make alint-comp      : alint compilation time linting
 make avhdl           : compile design using active-hdl gui mode
 make vsimsa          : compile design using active-hdl batch mode
 make riviera         : compile design using riviera
 make vsim            : compile design using modelsim
 make ncsim           : compile design using ncsim
 make ghdl            : compile design using GHDL
 make actel           : synthesize with synplify, place&route Actel Designer
 make ise             : synthesize and place&route with Xilinx ISE
 make ise-map         : synthesize design using Xilinx XST
 make ise-prec        : synthesize with precision, place&route with Xilinx ISE
 make ise-synp        : synthesize with synplify, place&route with Xilinx ISE
 make isp-synp        : synthesize with synplify, place&route with ISPLever
 make quartus         : synthesize and place&route using Quartus
 make quartus-map     : synthesize design using Quartus
 make quartus-synp    : synthesize with synplify, place&route with Quartus
 make precision       : synthesize design using precision
 make synplify        : synthesize design using synplify
 make vivado          : synthesize and place&route with Xilinx Vivado
 make planahead       : synthesize and place&route with Xilinx PlanAhead
 make dc              : synthesize design usign Synopsys Design Compiler
 make fm              : Formal equivalence check using Synopsys Formality
 make scripts         : generate compile scripts only
 make clean           : remove all temporary files except scripts
 make distclean       : remove all temporary files

make vivado 명령을 사용해 LEON3를 합성한다.

$cd ./grlib-gpl-1.4.1-b4156/designs/leon3-xilinx-zc702
$make vivado

3) ZedBoard에 leon3mp.bit 업로드
합성 결과 나온 leon3mp.bit 파일을 ZedBoard에 올리면 된다.
make program-zc702 명령어를 사용해 leon3mp.bit을 ZedBoard에 올린다.

$make program-zc702
xmd
Xilinx Microprocessor Debugger (XMD) Engine
Xilinx EDK 2013.4 Build EDK_2013.4.20131205
Copyright (c) 1995-2013 Xilinx, Inc.  All rights reserved.

XMD% 
Programming Bitstream -- ./vivado/leon3-zc702/leon3-zc702.runs/impl_1/leon3mp.bit
Fpga Programming Progress ............10.........20.........30.........40.........50.........60.........70.........80.........90........Done
Successfully downloaded bit file.

JTAG chain configuration
--------------------------------------------------
Device   ID Code        IR Length    Part Name
 1       4ba00477           4        Cortex-A9
 2       23727093           6        XC7Z020


JTAG chain configuration
--------------------------------------------------
Device   ID Code        IR Length    Part Name
 1       4ba00477           4        Cortex-A9
 2       23727093           6        XC7Z020

--------------------------------------------------
Enabling extended memory access checks for Zynq.
Writes to reserved memory are not permitted and reads return 0.
To disable this feature, run "debugconfig -memory_access_check disable".

--------------------------------------------------

CortexA9 Processor Configuration
-------------------------------------
Version.............................0x00000003
User ID.............................0x00000000
No of PC Breakpoints................6
No of Addr/Data Watchpoints.........4

Connected to "arm" target. id = 64
Starting GDB server for "arm" target (id = 64) at TCP port no 1234
Note:: init_user command is Deprecated. Use ps7_post_config from ps7_init.tcl

프로그래밍에 성공하면 보드에 파란 불이 켜진다.

programmed-ZedBoard

4. grmon을 사용한 LEON3 접속 및 리눅스 부팅
이제 LEON3에 리눅스 이미지를 올려야 하는데, 이 때 필요한 것이 grmon이다. grmon은 일종의 디버깅 툴이며, LEON3에 접속해 LEON3의 상태를 확인하거나 리눅스 이미지를 올리고 실행할 수 있다. grmon 또한 Cobham Gaisler에서 제공한다.

1) grmon 설치

$wget http://www.gaisler.com/anonftp/grmon/grmon-eval-2.0.65.tar.gz
$tar -xzvf grmon-eval-2.0.65.tar.gz
$export GRMON_SHARE=/path/to/grmon/linux/share

Cobham Gaisler에서 제공하는 grmon이 32bit로 빌드되었기에 64bit Ubuntu에서 잘 동작하지 않을 수 있다. 라이브러리를 찾지 못하는 등의 문제가 발생할 수 있는데, 이는 적절히 해결하기 바란다 (어떻게 했는지 기억나지 않음). 32bit용 라이브러리를 설치와 심볼릭 링크 생성으로 해결할 수 있었다. 시행착오 과정에서 기록해둔 글이 도움이 될 수도 있을 것이다[29].

2) grmon을 사용해 LEON3에 접속
이렇게 설치한 grmon을 사용해 LEON3에 접속할 수 있다.

$cd ./grmon-eval-2.0.65/linux/bin
$./grmon -xilusb -nb -u

한 가지 유의할 점은, 현재까지 grmon은 Xilinx의 USB-JTAG을 지원하지 않는다는 점이다. USB-JTAG을 사용하면 케이블을 찾지 못한다. 따라서 반드시 parallel JTAB cable을 사용해야 한다.

3) 리눅스 이미지 다운로드 및 부팅
그럼 지금까지 만들어 올린 LEON3가 제대로 동작하는지 확인하기 위해, 이미 만들어져 있는 리눅스 이미지를 실행해보자. 이미 만들어져 있는 리눅스 이미지를 다운받고, grmon을 사용해 실행하자.

$wget http://gaisler.com/anonftp/linux/linux-2.6/old/2.6.21/images/gr_xc3s_1500/image.dsu
$./grmon -xilusb -nb -u
  GRMON2 LEON debug monitor v2.0.65 32-bit eval version
   
  Copyright (C) 2015 Cobham Gaisler - All rights reserved.
  For latest updates, go to http://www.gaisler.com/
  Comments or bug-reports to support@gaisler.com
   
  This eval version will expire on 10/12/2015
 
Xilusb: Cable type/rev : 0x3 
 JTAG chain (2): xc7x020 zynq7000_arm_dap 
  GRLIB build version: 4156
  Detected frequency:  83 MHz
   
  Component                            Vendor
  LEON3 SPARC V8 Processor             Cobham Gaisler
  JTAG Debug Link                      Cobham Gaisler
  Generic AHB ROM                      Cobham Gaisler
  AHB/APB Bridge                       Cobham Gaisler
  LEON3 Debug Support Unit             Cobham Gaisler
  Xilinx MIG DDR2 Controller           Cobham Gaisler
  Generic UART                         Cobham Gaisler
  Multi-processor Interrupt Ctrl.      Cobham Gaisler
  Modular Timer Unit                   Cobham Gaisler
  General Purpose I/O port             Cobham Gaisler
  AHB Status Register                  Cobham Gaisler
   
  Use command 'info sys' to print a detailed report of attached cores
grmon2> load /path/to/image.dsu
  40000000 .stage2                   10.0kB /  10.0kB   [===============>] 100%
  40004000 .vmlinux                   3.1MB /   3.1MB   [===============>] 100%
  Total size: 3.10MB (1.53Mbit/s)
  Entry point 0x40000000
  Image /tmp/image.dsu loaded

grmon2> run
Booting Linux
Booting Linux...
PROMLIB: Sun Boot Prom Version 0 Revision 0
...
Execution Finished, Exiting

Please press Enter to activate this console. 

Sash command shell (version 1.1.1)
/>ls
bin
dev
etc
home
init
lib
mnt
proc
sbin
sys
tmp
usr
var
/>

리눅스 쉘에 접속한 것을 확인할 수 있다.

5. 리눅스 이미지 생성 및 부팅
다음으로 리눅스 이미지를 직접 만드는 방법에 대해 알아보자.

1) 필요 툴 다운로드 및 설치
리눅스 이미지를 생성하기 위해서는 네 가지가 필요하다. sparc-linux-ct-multilib-0.0.7, leon-buildroot-2013.02-1.0.3, leon-linux-3.10-3.10.58-1.0.4, mklinuximg-2.0.9가 필요하다. sparc-linux-ct-multilib-0.0.7는 SPARC용 바이너리를 생성하는 툴체인이며, buildroot는 LEON3에 올라갈 파일 시스템을 생성해준다. leon-linux는 파일 시스템과 커널을 합친 이미지를 만들어주며, mklinuximg를 이용해 LEON3에 올릴 수 있는 최종 이미지를 생성할 수 있다.

$wget http://gaisler.com/anonftp/linux/linux-3/toolchains/sparc-linux-4.4.2/sparc-linux-ct-multilib-0.0.7.tar.bz2
$wget http://gaisler.com/anonftp/linux/linux-3/distributions/buildroot/leon-buildroot-2013.02-1.0.3.tar.bz2
$wget http://gaisler.com/anonftp/linux/linux-3/kernel/leon-linux-3.10-3.10.58-1.0.4.tar.bz2
$wget http://gaisler.com/anonftp/linux/linux-3/kernel/mklinuximg-2.0.9.tar.bz2
$tar -xvf sparc-linux-ct-multilib-0.0.7.tar.bz2
$tar -xvf leon-buildroot-2013.02-1.0.3.tar.bz2
$tar -xvf leon-linux-3.10-3.10.58-1.0.4.tar.bz2
$tar -xvf mklinuximg-2.0.9.tar.bz2
$export PATH=$PATH:/path/to/sparc-linux-4.4.2-toolchains/multilib/bin

2) buildroot
우선 make install 명령어를 실행한다.

$cd /path/to/leon-buildroot-2013.02-1.0.3
$make install

다음으로 make build 명령어를 실행해, buildroot configuration을 수행한다.

$make build

다음과 같이 buildroot를 설정한다.

Target Architecture: SPARC
Target Architecture Variant: v8
Toolchain - Toolchain path (New): /path/to/sparc-linux-4.4.2-toolchains/multilib
Filesystem images - cpio the root filesystem: yes

마지막으로 Save an Alternate Configuration File을 선택해 설정을 종료한다. make build 명령어로 파일 시스템을 빌드하면 ./buildroot-git/output에서 생성된 파일을 확인할 수 있다.

$make build
$ls ./buildroot-git/output
rootfs.cpio  rootfs.tar

3) leon linux 빌드
다음으로 leon linux를 빌드한다. leon-linux-3.10-3.10.58-1.0.4.tar.bz2 파일에는 리눅스 커널이 없으므로, 이를 다운받아야 한다.

$cd /path/to/leon-linux-3.10-3.10.58-1.0.4/
$git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

LEON3에서 리눅스가 돌아갈 수 있도록 리눅스 소스 코드를 패치한다.

$cd linux
$git checkout v3.10
$patch -p1 < ../patches/0001-sparc32-leon-older-LEON3-4-designs-need-explicit-dat.patch
$patch -p1 < ../patches/0002-sparc32-leon-prevent-long-uart-fifo-discovery-loop.patch
$patch -p1 < ../patches/0003-Avoid-using-UART-during-PHY-initialization.patch
$patch -p1 < ../patches/0004-spi-add-support-for-aeroflex-gaisler-spimctrl.patch
$patch -p1 < ../patches/0005-apbuart-add-polling-callbacks-to-apbuart-driver.patch
$patch -p1 < ../patches/0006-apbuart-add-support-for-virtual-KGDB-GRMON-channel.patch
$patch -p1 < ../patches/0007-xsysace-Add-support-for-LEON-GRLIB-SoCs.patch
$patch -p1 < ../patches/0008-usb-gadget-Add-UDC-driver-for-Aeroflex-Gaisler-GRUSB.patch
$patch -p1 < ../patches/0009-greth-moved-TX-ring-cleaning-to-NAPI-rx-poll-func.patch
$patch -p1 < ../patches/0010-sparc32-dma_alloc_coherent-must-honour-gfp-flags.patch
$patch -p1 < ../patches/0011-sparc-Let-memset-return-the-address-argument.patch
$patch -p1 < ../patches/0012-sparc-leon-Fix-race-condition-between-leon_cycles_of.patch
$patch -p1 < ../patches/0013-sparc32-leon-Make-leon_dma_ops-available-when-CONFIG.patch
$patch -p1 < ../patches/0014-sparc32-Implement-xchg-and-atomic_xchg-using-ATOMIC_.patch
$patch -p1 < ../patches/0015-sparc32-leon-Align-ccall_info-to-prevent-unaligned-t.patch
$patch -p1 < ../patches/0016-sparc32-destroy_context-and-switch_mm-needs-to-disab.patch
$patch -p1 < ../patches/0017-sparc-optimize-MMU-fault-trap-entry.patch
$patch -p1 < ../patches/0018-sparc-leon-workaround-for-MMU-errata.patch
$patch -p1 < ../patches/0019-sparc-leon-Distinguish-between-IRQMP-and-IRQAMP-inte.patch

리눅스 설정 파일을 linux 소스 코드 디렉토리 아래에 복사한다.

$cd ..
$pwd
/path/to/leon-linux-3.10-3.10.58-1.0.4
$cp config/config_up linux/.config

앞서 생성한 파일 시스템을 적절한 위치로 옮긴다.

$cp /path/to/leon-buildroot-2013.02-1.0.3/buildroot-git/output/rootfs.cpio /path/to/leon-linux-3.10-3.10.58-1.0.4/../dist/.rootfs.cpio

마지막으로 make 명령어를 사용해 리눅스 이미지를 빌드한다.

$make build LINUX_TREE=linux

4) mklinuximg
마지막으로 mklinuximg를 사용해 LEON3에 올릴 수 있는 이미지를 생성한다.

$cd /path/to/mklinuximg-2.0.9
$./mklinuximg /path/to/leon-linux-3.10-3.10.58-1.0.4/linux/arch/sparc/boot/image image.dsu

이 과정에서 소스 코드 상의 버그로 인해 에러가 발생하는데, 코드를 보고 수정하면 된다. 리눅스 커널 버전을 확인하는 매크로에서 에러가 발생하며, 이를 수정하면 된다. (/path/to/mklinuximg-2.0.9/src/prom.c)

5) grmon를 사용해 LEON3 연결, 리눅스 부팅

$cd /path/to/grmon
$./grmon -xilusb -nb -u
grmon2> load /path/to/image.dsu 
  40000000 .text                      4.2kB /   4.2kB   [===============>] 100%
  400010F0 .data                       80B              [===============>] 100%
  40004000 .vmlinux                   7.2MB /   7.2MB   [===============>] 100%
  4072B0C0 .startup_prom             39.6kB /  39.6kB   [===============>] 100%
  Total size: 7.20MB (1.52Mbit/s)
  Entry point 0x40000000
  Image /path/to/image.dsu loaded
grmon2> run
...
Welcome to Buildroot
buildroot login: root
#

References:
[1] LEON3 Processor, http://www.gaisler.com/index.php/products/processors/leon3
[2] Soft microprocessor, Wikipedia, https://en.wikipedia.org/wiki/Soft_microprocessor
[3] Cobham Gaisler, http://www.gaisler.com/
[4] ZedBoard, http://zedboard.org/product/zedboard
[5] Xilinx University Program XUPV5-LX110T Development System, Xilinx, http://www.xilinx.com/univ/xupv5-lx110t.htm
[6] OpenSPARC Overview, Oracle, http://www.oracle.com/technetwork/systems/opensparc/index.html
[7] OpenSPARC, Wikipedia, https://en.wikipedia.org/wiki/OpenSPARC
[8] 허태경, 20150721, https://gumdaeng.com/2015/07/21/20150721/
[9] LEON SPARC Mailing List, https://groups.yahoo.com/neo/groups/leon_sparc/info
[10] CoreX, Realtime Embedded, http://www.rte.se/blog/blogg-modesty-corex/index
[11] ZedBoard Zynq-7000 Development Board, Digilent, http://www.digilentinc.com/Products/Detail.cfm?NavPath=2,400,1028&Prod=ZEDBOARD&CFID=13708886&CFTOKEN=bf9bf59caa35919f-A2243CAC-5056-0201-026AF17F0DA09716
[12] Zynq-7000 All Programmable SoC, Xilinx, http://www.xilinx.com/products/silicon-devices/soc/zynq-7000.html
[13] What is ZYNQ? (Lesson 1), Microelectronic Systems Design Research Group, https://www.youtube.com/watch?v=zD-5LQCOelI
[14] The Zynq Book, http://www.zynqbook.com/
[15] Zynq-7000 Boards, Kits, and Modules, Xilinx, http://www.xilinx.com/products/boards-and-kits/device-family/nav-zynq-7000.html
[16] 허태경, ZedBoard 개발 환경 세팅 및 리눅스 부팅, https://gumdaeng.com/2014/12/15/zedboard-development-environment-setting-and-linux-booting/
[17] Pete Johnson, An FPGA Tutorial using the ZedBoard, http://www.beyond-circuits.com/wordpress/tutorial/
[18] Training and Videos, ZedBoard, http://zedboard.org/support/trainings-and-videos
[19] Sven Andersson, Zynq design from scratch. Part 1., http://svenand.blogdrive.com/archive/160.html
[20] Download LEON/GRLIB, Cobham Gaisler, http://gaisler.com/index.php/downloads/leongrlib
[21] Downloads, Xilinx, http://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/vivado-design-tools/2013-4.html
[22] Xilinx Design Tools: Installation and Licensing Guide, Xilinx, http://www.xilinx.com/support/documentation/sw_manuals/xilinx14_2/iil.pdf
[23] Cypress-USB2UART-Ver1.0G driver for Linux?, ZedBoard, http://zedboard.org/content/cypress-usb2uart-ver10g-driver-linux
[24] 허태경, Kernel Compile and Multi-booting using Grub2, https://gumdaeng.com/2014/07/04/kernel-compile-and-multi-booting-using-grub2/
[25] Digilent Adept, Digilent, http://www.digilentinc.com/Products/Detail.cfm?Prod=ADEPT2
[26] leon3 with grmon on Xilinx zc702, https://groups.yahoo.com/neo/groups/leon_sparc/conversations/topics/23930
[27] Differences between ZedBoard and Xilinx Zynq-7000 SoC ZC702 Evaluation Kit, ZedBaord, http://zedboard.org/content/differences-between-zedboard-and-xilinx-zynq-7000-soc-zc702-evaluation-kit
[28] GRMON Cannot Start, https://groups.yahoo.com/neo/groups/leon_sparc/conversations/topics/23241
[29] 허태경, https://gumdaeng.com/2015/07/23/20150723/

Advertisements
Tagged with: , , , , , , , , , , , , , , , , , , ,
Posted in FPGA

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

Recent Posts
누적 방문자 수
  • 142,141 hits
%d bloggers like this: