2016년 9월 13일 화요일

[FPGA] Altera DE2 보드에 LEON3 프로세서 로드(성공), 리눅스 돌리기(아직 성공 못함)

LEON3 는 open source soft-core processor 이다. SPARC V8 아키텍처에 기반하고 있다.
연구실에 있는 DE2 보드에 LEON3 프로세서를 로드하는데 성공했지만, 임베디드 리눅스를 돌리는 작업은 실패하였다.
이 블로그를 참고하였다.

0. 환경설정

리눅스의 config option에 CONFIG_USB_SERIAL과 CONFIG_USB_SERIAL_CYPRESS_M8 이 y 로 되어있어야 한다. m 으로 되어있다면 y로 바꿔주고 리눅스를 재컴파일하자.

1. LEON3 프로세서 로드

1) LEON3 프로세서 소스코드 다운로드

먼저 http://gaisler.com/index.php/downloads/leongrlib 에서 LEON3/GRLIB source code 와 GRFPU netlists for Xilinx and Altera 를 다운로드한다. grlib-netlists-gpl-1.5.0.tar.gz는 grlib-gpl-1.5.0-b4164 디렉토리 안에 압축을 푼다.

$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

designs 디렉토리는 개발 보드별 개발 환경을 담고 있다. DE2 보드의 경우 /home/jsim/fpga/grlib-gpl-1.5.0-b4164/designs/leon3-altera-de2-ep2c35 에서 LEON3 프로세서 소스코드를 컴파일 할 수 있다. 환경 설정과 합성 방법에 대한 설명은 동일 디렉토리의 README.txt를 참고하자. 내가 한 방법은 아래에 쓸 것이다.

2) Quartus II 13.0sp1 다운받기.

DE2 보드에 프로세서를 로드하기 위해서는 Altera에서 제공하는 Quartus 툴이 필요하다.
make를 하기 전에 quartus ii를 받아야 한다. DE2보드를 서포트하는 마지막 quartus ii 버전인 13.0sp1 버전을 다운 받자. 리눅스를 선택하고 Individual Files에서 Quartus II Software (includes Nios II EDS) 와 device support 파일인 Cyclone II, Cyclone III, Cyclone IV device support (includes all variations) 를 다운 받도록 한다. .run 파일이 받아질텐데 chmod로 실행권한을 주고 실행시킨다.

$chmod +x QuartusSetupWeb-13.0.1.232.run
$./QuartusSetup-13.0.1.232.run

3) PATH 설정

quartus bin과 linux 를 PATH 환경변수에 추가해야 make를 할 수 있다. /home/jsim (사용자 홈디렉토리)의 .bashrc 파일의 제일 아래에 다음을 추가한다.

QUARTUS_HOME=/home/jsim/altera/13.0sp1/quartus
PATH=$PATH:$QUARTUS_HOME/bin:$QUARTUS_HOME/linux

터미널을 종료하고 새로 켜서 바뀐 .bashrc를 적용시킨다.

4) make and synthesis

$cd /home/jsim/fpga/grlib-gpl-1.5.0-b4164/designs/leon3-altera-de2-ep2c35
$make xconfig

LEON3MP Design Configuration 창이 뜨면 Processor 버튼을 누르고, MMU 버튼을 눌러서 Enable MMU를 y로 바꿔준다. 그 후에 Save and Exit 버튼을 누르면 config.vhd 파일이 만들어진다.

$make quartus
기기 연결
$cd /home/jsim/altera/13.0sp1/quartus/bin
$sudo su
$./jtagd
$exit
$cd /home/jsim/fpga/grlib-gpl-1.5.0-b4164/designs/leon3-altera-de2-ep2c35
$make quartus-prog-fpga

를 하면 LEON3 프로세서(.sof 파일)가 DE2 보드에 올라가게 된다.

2. 리눅스 로드

grmon은 이용하여 리눅스 이미지를 올릴 것이다. grmon은 일종의 디버깅 툴로 LEON3에 접속해 LEON3의 상태를 확인하거나 리눅스 이미지를 올리고 실행할 수 있다.

1) grmon 설치

$wget http://www.gaisler.com/anonftp/grmon/grmon-eval-2.0.77.tar.gz
$tar -xzvf grmon-eval-2.0.77.tar.gz

2) PATH 설정

.bashrc에서 PATH 환경변수를 변경하자.

GRMON_HOME=/home/jsim/fpga/grmon-eval-2.0.77/linux
PATH=$PATH:$GRMON_HOME/share:$GRMON_HOME/lib

3) 리눅스 이미지를 다운

$wget http://gaisler.com/anonftp/linux/linux-2.6/old/2.6.21/images/gr_xc3s_1500/image.dsu

4) grmon 실행

$cd /home/jsim/fpga/grmon-eval-2.0.65/linux/bin
PATH 설정이 잘 안되었는지 quartus  linux 설정을 다시 해주고 grmon을 실행하였다.
$export LD_LIBRARY_PATH=/home/jsim/altera/13.0sp1/quartus/linux
필요한 패키지들도 설치해주었다. (32비트용 패키지)
$sudo apt-get install libnspr4:i386
$sudo apt-get install libusb-0.1-4:i386
이외에도 패키지가 더 필요하다고 하면 알맞는 패키지를 깔아주면 된다.
$./grmon -altjtag -nb -u
grmon2>
이라는 쉘이 뜬다. 다운로드 받은 리눅스 이미지를 로드해준다.
grmon2> load /home/jsim/fpga/image.dsu
grmon2> run

만약 debugging mode가 아니라고 뜬다면 DE2 보드의 KEY1 을 눌러주고 다시 실행시켜본다. KEY1을 누르면 디버깅 모드가 된다.

나의 경우

grmon2> run
Booting Linux
Booting Linux...
PROMLIB: Sun Boot Prom Version 0 Revision 0
Linux version 2.6.21.1 (daniel@neptune) (gcc version 3.4.4) #81 Thu Dec 6 10:27:29 CET 2007
ARCH: LEON
             Vendors         Slaves
Ahb masters:
 0( 1:  3| 0):   VENDOR_GAISLER    GAISLER_LEON3 
 1( 1: 1c| 0):   VENDOR_GAISLER  GAISLER_AHBJTAG 
Ahb slaves:
 0( 4:  f| 0):       VENDOR_ESA        ESA_MCTRL 
 +0: 0x0 (raw:0x3e002)
 +1: 0x0 (raw:0x20000002)
 +2: 0x0 (raw:0x40030002)
 1( 1:  6| 0):   VENDOR_GAISLER   GAISLER_APBMST 
 +0: 0x80000000 (raw:0x8000fff2)
 2( 1:  4| 0):   VENDOR_GAISLER GAISLER_LEON3DSU 
 +0: 0x90000000 (raw:0x9000f002)
 3( 1:  9| 0):   VENDOR_GAISLER   GAISLER_SDCTRL 
 +0: 0x40000000 (raw:0x4003ff82)
 +1: 0xfff00100 (raw:0x10fff3)
Apb slaves:
 0( 4:  f| 0):       VENDOR_ESA        ESA_MCTRL 
 + 0: 0x80000000 (raw:0xfff1) 
 1( 1:  c| 2):   VENDOR_GAISLER  GAISLER_APBUART 
 + 0: 0x80000100 (raw:0x10fff1) 
 2( 1:  d| 0):   VENDOR_GAISLER    GAISLER_IRQMP 
 + 0: 0x80000200 (raw:0x20fff1) 
 3( 1: 11| 8):   VENDOR_GAISLER  GAISLER_GPTIMER 
 + 0: 0x80000300 (raw:0x30fff1) 
 4( 1: 6c| 0):   VENDOR_GAISLER Unknown device 6c 
 + 0: 0x80000400 (raw:0x40fff1) 
 5( 1: 60| 5):   VENDOR_GAISLER      GAISLER_KBD 
 + 0: 0x80000500 (raw:0x50fff1) 
 6( 1: 61| 0):   VENDOR_GAISLER      GAISLER_VGA 
 + 0: 0x80000600 (raw:0x60fff1) 
 7( 1: 1a| 0):   VENDOR_GAISLER  GAISLER_PIOPORT 
 + 0: 0x80000900 (raw:0x90fff1) 
 8( 1: 1a| 0):   VENDOR_GAISLER  GAISLER_PIOPORT 
 + 0: 0x80000a00 (raw:0xa0fff1) 
 9( 1: 52| 1):   VENDOR_GAISLER Unknown device 52 
 + 0: 0x80000f00 (raw:0xf0fff1) 
TYPE: Leon2/3 System-on-a-Chip
Ethernet address: 0:0:0:0:0:0
CACHE: direct mapped cache, set size 4k
CACHE: not flushing on every context switch
Boot time fixup v1.6. 4/Mar/98 Jakub Jelinek (jj@ultra.linux.cz). Patching kernel for srmmu[Leon2]/iommu
node 2: /cpu00 (type:cpu) (props:.node device_type mid mmu-nctx clock-frequency uart1_baud uart2_baud )
PROM: Built device tree from rootnode 1 with 918 bytes of memory.
DEBUG: psr.impl = 0xf  fsr.vers = 0x7
Built 1 zonelists.  Total pages: 1207
Kernel command line: console=ttyS0,38400 rdinit=/sbin/init 
PID hash table entries: 32 (order: 5, 128 bytes)
Todo: init master_l10_counter
Attaching grlib apbuart serial drivers (clk:50hz):
Console: colour dummy device 80x25
Dentry cache hash table entries: 1024 (order: 0, 4096 bytes)
Inode-cache hash table entries: 1024 (order: 0, 4096 bytes)
Memory: 4296k/8192k available (1536k kernel code, 3896k reserved, 180k data, 1440k init, 0k highmem)
Mount-cache hash table entries: 512
NET: Registered protocol family 16
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 512 (order: 0, 4096 bytes)
TCP bind hash table entries: 512 (order: -1, 2048 bytes)
TCP: Hash tables configured (established 512 bind 512)
TCP reno registered

라고 뜬 뒤 깜깜 무소식이다.리눅스 이미지가 커서 더 작게 만들어야 하는것인지 확인을 해봐야 할 듯 싶다. 바쁜 일을 마무리하고 다음주나 다다음주 쯤에 한 번 더 시도해볼 듯 하다.