[[labs.beatcraft.com]]~
[[DE0-Nano]]~
#contents
* DE0-Nano/Nios II uClinux [#y03073d1]
This article explains how to install uCLinux on DE0-Nano, a FPGA board developed by Terasic Technologies Inc.~
#ref(DE0Nano.jpg,,40%)~
~
The hardware specification of DE0-Nano is listed below. For the details, please look at [[DE0-Nano Specification>http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=165&No=593&PartNo=2]].~
~
-FPGA
-- Cyclone IV EP4CE22F17C6N ~
- Memory ~
-- 32MB SDRAM ~
-- 2Kb I2C EEPROM ~
- INPUT/OUTPUT
-- LED: 8(Green) ~
-- Push button: 2 ~
-- Dip switch: 4 ~
- Clock System ~
-- Clock Oscillator: 50MHz (On-board)~
- Power Supply ~
-- USB: Type mini-AB port (5V) ~
For the installation procedure and operation check of the board, please follow the instructions written at the URL below.~
[[Running uClinux on Terasic DE0-Nano Altera Board>http://www.ccm.ece.vt.edu/twiki/bin/view/Main/LinuxOnNIOS2InstallationDE0Nano]] ~
**uClinux (Nios II version) Built Environment [#yb9a4554]
The built environment for Nios II uClinux is created on VMware. The settings for the OS and hardware are listed below.~
- OS: Ubuntu 12.04.2 Desktop(32bit Version)~
- Disk space: 30GB~
- FPGA Development Tool: Quartus II Web Edition 11.1sp2 Web editon (Linux Version)~
The disk space, which WMware allocates for is 30GB. 9GB is used for downloading and extracting the Nios II uClinux project. 9GB is also consumed for downloading and installing Quartus II.~
~
The version of Quartus II is 11.1sp2, and it is free version, too.~
Nios II EDS is installed as a part of Quartus II's installation process~
** Configuring Preference of Ubuntu[#p50ecd24]
Installing Ubuntu 12.04.2 Desktop (32bit Version) on VMware, update the OS and install the packages.~
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install ssh
$ sudo apt-get install build-essential vim
$ sudo apt-get install automake git-core libncurses5-dev bison flex gawk
$ sudo apt-get install gettext ccache zlib1g-dev libx11-dev texinfo \
liblzo2-dev pax-utils uboot-mkimage corkscrew mtd-utils subversion
Change from the standard shell to bash.~
$ sudo dpkg-reconfigure dash
** Obtaining and Configuring the Files for Nios II uClinux[#me210eb5]
Checkout the project of Nios II uClinux.~
~
4.1GB of disk space is consumed for checking-out Nios II uClinux. Totally, 9GB of disk space is required as the extraction of the archive, checking the branch, and build process are included.~
$ cd ~
$ svn co http://www.ccm.ece.vt.edu/usvn/svn/alteraApps/trunk/uClinux/ --username=anonymous --password=anonymous
~
Now, toolchain is installed. The toolchain used here is located at uClinux/tools/nios2gcc-20080203.bz2. To extract nios2gcc-20080203.tar.bz2, opt directly is created. The environment variable is added at the end of ${HOME}/.bashrc.~
$ cd uClinux/tools/
$ tar xvfj nios2gcc-20080203.tar.bz2
$ vi ~/.bashrc
...<skip>
PATH=$PATH:${HOME}/uClinux/tools/opt/nios2/bin
$ source ~/.bashrc
Extract the DE0-Nano project file (simple.zip).~
$ cd uClinux/hardware/DE0-Nano
$ unzip simple.zip
Extract nios2-linux-20090929.tar, which is located at the directory of uClinux/distro/.~
$ cd ~/uClinux/distro/
$ tar xvf nios2-linux-20090929.tar
After the extraction of tar file is completed, these files are created under the directory of nios2-linux.~
$ ls nios2-linux
3c120_default elf2flt linux-2.6 u-boot use_git_for_update
README gcc3 sshkey uClibc use_http_for_update
binutils glibc toolchain-build uClinux-dist use_ssh443_for_update
checkout insight toolchain-mmu update
~
Moving the directory of nios2-linux, execute the script of checkout, and checkout a working copy from the specific repository. Completing the execution of the script, move to the directory of linux-2.6, and checkout the branch of DE0-Nano (test-nios2). This checkout is also repeated at the directory of uClinux-dist.~
$ cd nios2-linux
$ ./checkout
$ cd linux-2.6
$ git branch -a
* nios2mmu
test-nios2
remotes/origin/HEAD -> origin/test-nios2
remotes/origin/master
remotes/origin/nios2mmu
remotes/origin/test-lm32
remotes/origin/test-nios2
remotes/origin/unstable
remotes/origin/unstable-nios2mmu
$ git checkout test-nios2
$ cd ../uClinux-dist
$ git branch -a
test-nios2
* trunk
remotes/origin/HEAD -> origin/test-nios2
remotes/origin/test-nios2
remotes/origin/trunk
remotes/origin/unstable
$ git checkout test-nios2
Caution: Do not recommend to use any nios2-linux, which is newer than nios2-linux-20090929.tar. At [[Altera Wiki/Install Nios II Linux>http://www.alterawiki.com/wiki/Install_Nios_II_Linux]], nios2-linux-20100621.tar is used. However, since newer versions of uClinux, which is contained in the tar file of nios2-linux, is merged with mmu kernel, there are gaps between the branches uClinux. Because some issues are recognized, nios2-linux-20090929 is used for this article.~
** Creating Nios II uClinux zImage[#y991b998]
At uClinux directory, executing make menuconfig, make sure that its configuration is set for DE0-Nano. The key check points are Vender and Altera Products, and these parts are defined as only Altera and nios2, respectively. Make sure that “Kernel is linux-2.6.x” is shown.~
As make menuconfig is executed, an error message, Run”make hwselect SYSPTF=<system.ptf>” first, appears. After menuconfig is completed, using the project file for DE0-Nano, execute male vender_hwselect SYSPTF=... The project file is located at uClinux/hardware/DE0-Nano?simple/DE0_Nano_SOPC.ptf. At the part of CPU SDRAM, select 1. Then, the preparation for creating zImage is ended.~
After make command is ended, zImage is created at the image directory.~
A part of log, which is generated at executing of make menuconfig and make, is shown below.~
~
$ make menuconfig
Vendor/Product Selection --->
--- Select the Vendor you wish to target
Vendor (Altera) --->
--- Select the Product you wish to target
Altera Products (nios2) --->
Kernel/Library/Defaults Selection --->
--- Kernel is linux-2.6.x
Libc Version (None) --->
[ ] Default all settings (lose changes)
[ ] Customize Kernel Settings
[ ] Customize Application/Library Settings
[ ] Update Default Vendor Settings
$ make vendor_hwselect SYSPTF=/home/beat/uClinux/hardware/DE0-Nano/simple/DE0_Nano_SOPC.ptf
...<skip>
scripts/kconfig/conf -s arch/nios2/Kconfig
no emulation specific options.
RUNNING hwselect
--- Please select which CPU you wish to build the kernel against:
(1) cpu - Class: altera_nios2 Type: f Version: 7.08101
Selection:
Invalid response, please try again.
Selection: 1
--- Please select a device to execute kernel from:
(1) sdram
Class: altera_avalon_new_sdram_controller
Size: 33554432 bytes
Selection: 1
...<skip>
$ make
$ ls images
romfs-inst.log zImage
** Installing Quartus II and Nios II EDS[#e8a16e93]
Download Quartus II 11.1sp2 Web Edition (Linux version) from the download page of Altera, Inc.~
~
https://www.altera.com/jp/download/dnl-index.jsp ~
~
The size of the file is about 3GB, and the required disk space for installation is at most 6 GB. The home directory is selected for the installation process.~
$ chmod +x 11.0sp1_quartus_free_linux.sh
$ ./11.0sp1_quartus_free_linux.sh
Add the PATHs for Quartus II and Nios II EDS.~
$ export PATH=$PATH:/home/beat/altera/11.1sp2/quartus/bin
$ export PATH=$PATH:/home/beat/altera/11.1sp2/nios2eds/bin
$ export PATH=$PATH:/home/beat/altera/11.1sp2/quartus/sopc_builder/bin
$ export PATH=$PATH:/home/beat/altera/11.1sp2/nios2eds/bin/gnu/H-i686-pc-linux-gnu/bin
**Creating the Configuration File for DE0-Nano[#ce38ead5]
The configuration file of DE0-Nano (DE0_Nano.sof) is created.~
~
Starting up Quartus II, select ${HOME}/uClinux/hardware/DE0-Nano/simple/DE0_Nano.qpf from Open Existing Project.~
$ quartus
Booting up SOPC Builder (QuartusII menu bar Tools → SOPC Builder)~
~
At this moment, a warning dialog appears, saying that a project file is created with 10.1.
This waring is not critical for the current condition, so please click OK.~
Also, a message dialog that urges to install QSYS. QSYS will not be used here. Click x at the upper-right conner and close the dialog.~
~
To create DE0_Nano_SOPC.sopc, click the Generate button at the bottom of the screen of SOCP builder. The created file is saved.~
Return to Quartus II, slect Processing from the menu. Then, execute Start Compilation. After De0_Nanp.sof is created, it is saved.~
** Installing USB-Blaster[#i4eef35e]
USB-Blaster is configured for setting up and installing the image of DE0-Nano from its host machine. The new rules, which are shown below, are added to the file of udev/rules.d. As DE0-Nano is attached, it is recognized as USB-Blaster.~
$ lsusb
...<略>
Bus 002 Device 008: ID 09fb:6001 Altera Blaster
$ sudo vi /etc/udev/rules.d/51-usbblaster.rules
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="09fb",
ATTR{idProduct}=="6001", MODE="0666",
NAME="bus/usb/$env{BUSNUM}/$env{DEVNUM}", RUN+="/bin/chmod 0666 %c"
$ sudo udevadm control --reload-rules
** Booting up Nios II uClinix [#d536996c]
To start up uClinux, execute the environment variable configuration script, nios2_command_shell.sh. nios2_command_shell.sh is located at ${HOME}/altera/11.1sp2/nios2eds/. While executing the script, shell will be changed.~
~
DE0-Nano is connected and set up with configure, then the created zImage is installed. After the completion of installing zImage, execute nios2-terminal command. To command nios2-terminal, the booting of Nios II uClinux begins.~
~
The log shown below is resulted form executing the commands after Nios II uClinux is booted.~
$ cd altera/11.1sp2/nios2eds/
$ ./nios2_command_shell.sh
$ nios2-configure-sof ~/uClinux/hardware/DE0-Nano/simple/DE0_Nano.sof
/home/beat/altera/11.1sp2/quartus/adm/qenv.sh: line 87: warning: setlocale:
LC_CTYPE: cannot change locale (en_US): No such file or directory
Info: *******************************************************************
Info: Running Quartus II 32-bit Programmer
Info: Command: quartus_pgm --no_banner --mode=jtag -o p;/home/beat/uClinux /hardware/DE0-Nano/simple/DE0_Nano.sof
Info (213045): Using programming cable "USB-Blaster [2-2.1]"
Info (213011): Using programming file /home/beat/uClinux/hardware/DE0-Nano/simple/DE0_Nano.sof with checksum 0x003F2B7E for device EP4CE22F17@1
Info (209060): Started Programmer operation at Wed Mar 6 20:45:12 2013
Info (209016): Configuring device index 1
Info (209017): Device 1 contains JTAG ID code 0x020F30DD
Info (209007): Configuration succeeded -- 1 device(s) configured
Info (209011): Successfully performed operation(s)
Info (209061): Ended Programmer operation at Wed Mar 6 20:45:13 2013
Info: Quartus II 32-bit Programmer was successful. 0 errors, 0 warnings
Info: Peak virtual memory: 104 megabytes
Info: Processing ended: Wed Mar 6 20:45:13 2013
Info: Elapsed time: 00:00:05
Info: Total CPU time (on all processors): 00:00:01
$ ./altera/11.1sp2/nios2eds/nios2_command_shell.sh
------------------------------------------------
Altera Nios2 Command Shell [GCC 4]
Version 11.1sp2, Build 259
------------------------------------------------
$ nios2-download -g ~/uClinux/distro/nios2-linux/uClinux-dist/images/zImage
Using cable "USB-Blaster [2-2.1]", device 1, instance 0x00
Pausing target processor: OK
Initializing CPU cache (if present)
OK
Downloaded 1349KB in 343.0s (3.9KB/s)
Verified OK in 3.4s (396.7KB/s)
Starting processor at address 0x02500000
$ nios2-terminal
nios2-terminal: connected to hardware target using JTAG UART on cable
nios2-terminal: "USB-Blaster [2-2.1]", device 1, instance 0
nios2-terminal: (Use the IDE stop button or Ctrl-C to terminate)
Uncompressing Linux... Ok, booting the kernel.
Linux version 2.6.30 (beat@DE0NanoVM) (gcc version 3.4.6) #2 PREEMPT Wed Mar 6 15:44:48 JST 2013
uClinux/Nios II
Built 1 zonelists in Zone order, mobility grouping off. Total pages: 8128
Kernel command line:
NR_IRQS:32
PID hash table entries: 128 (order: 7, 512 bytes)
Dentry cache hash table entries: 4096 (order: 2, 16384 bytes)
Inode-cache hash table entries: 2048 (order: 1, 8192 bytes)
Memory available: 29976k/2492k RAM, 0k/0k ROM (1669k kernel code, 823k data)
Calibrating delay loop... 49.04 BogoMIPS (lpj=245248)
Mount-cache hash table entries: 512
net_namespace: 264 bytes
NET: Registered protocol family 16
init_BSP(): registering device resources
bio: create slab <bio-0> at 0
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 1024 (order: 1, 8192 bytes)
TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
TCP: Hash tables configured (established 1024 bind 1024)
TCP reno registered
NET: Registered protocol family 1
io scheduler noop registered
io scheduler deadline registered (default)
ttyJ0 at MMIO 0x4001030 (irq = 1) is a Altera JTAG UART
console [ttyJ0] enabled
dm9000 Ethernet Driver, V1.31
TCP cubic registered
NET: Registered protocol family 17
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
Freeing unused kernel memory: 596k freed (0x21da000 - 0x226e000)
Shell invoked to run file: /etc/rc
Command: hostname uClinux
Command: mount -t proc proc /proc -o noexec,nosuid,nodev
Command: mount -t sysfs sysfs /sys -o noexec,nosuid,nodev
Command: mount -t devpts devpts /dev/pts -o noexec,nosuid
Command: mount -t usbfs none /proc/bus/usb
mount: mounting none on /proc/bus/usb failed: No such file or directory
Command: mkdir /var/tmp
Command: mkdir /var/log
Command: mkdir /var/run
Command: mkdir /var/lock
Command: mkdir /var/empty
Command: ifconfig lo 127.0.0.1
Command: route add -net 127.0.0.0 netmask 255.0.0.0 lo
Command: cat /etc/motd
Welcome to
____ _ _
/ __| ||_|
_ _| | | | _ ____ _ _ _ _
| | | | | | || | _ \| | | |\ \/ /
| |_| | |__| || | | | | |_| |/ \
| ___\____|_||_|_| |_|\____|\_/\_/
| |
|_|
For further information check:
http://www.uclinux.org/
Execution Finished, Exiting
Sash command shell (version 1.1.1)
/>
/> cat /proc/cpuinfo
CPU: NIOS2
MMU: none
FPU: none
Clocking: 100.0MHz
BogoMips: 49.04
Calibration: 24524800 loops
/> cat /proc/meminfo
MemTotal: 30572 kB
MemFree: 28880 kB
Buffers: 0 kB
Cached: 780 kB
SwapCached: 0 kB
Active: 192 kB
Inactive: 536 kB
Active(anon): 0 kB
Inactive(anon): 0 kB
Active(file): 192 kB
Inactive(file): 536 kB
Unevictable: 0 kB
Mlocked: 0 kB
MmapCopy: 244 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 0 kB
Mapped: 0 kB
Slab: 508 kB
SReclaimable: 160 kB
SUnreclaim: 348 kB
PageTables: 0 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 15284 kB
Committed_AS: 0 kB
VmallocTotal: 0 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
/> dmesg
Linux version 2.6.30 (beat@DE0NanoVM) (gcc version 3.4.6) #2 PREEMPT Wed Mar 6 15:44:48 JST 2013
uClinux/Nios II
On node 0 totalpages: 8192
free_area_init_node: node 0, pgdat 021d6a60, node_mem_map 02274000
DMA zone: 64 pages used for memmap
DMA zone: 0 pages reserved
DMA zone: 8128 pages, LIFO batch:0
Built 1 zonelists in Zone order, mobility grouping off. Total pages: 8128
Kernel command line:
NR_IRQS:32
PID hash table entries: 128 (order: 7, 512 bytes)
Dentry cache hash table entries: 4096 (order: 2, 16384 bytes)
Inode-cache hash table entries: 2048 (order: 1, 8192 bytes)
Memory available: 29976k/2492k RAM, 0k/0k ROM (1669k kernel code, 823k data)
Calibrating delay loop... 49.04 BogoMIPS (lpj=245248)
Mount-cache hash table entries: 512
net_namespace: 264 bytes
NET: Registered protocol family 16
init_BSP(): registering device resources
bio: create slab <bio-0> at 0
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 1024 (order: 1, 8192 bytes)
TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
TCP: Hash tables configured (established 1024 bind 1024)
TCP reno registered
NET: Registered protocol family 1
io scheduler noop registered
io scheduler deadline registered (default)
ttyJ0 at MMIO 0x4001030 (irq = 1) is a Altera JTAG UART
console [ttyJ0] enabled
dm9000 Ethernet Driver, V1.31
TCP cubic registered
NET: Registered protocol family 17
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
Freeing unused kernel memory: 596k freed (0x21da000 - 0x226e000)
/> ifconfig -a
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
/> ls -l /bin
-rwxr-xr-x 1 1000 1000 146884 Mar 5 2013 boa
-rwxr-xr-x 1 1000 1000 119578 Mar 5 2013 busybox
lrwxrwxrwx 1 1000 1000 7 Mar 5 2013 cp
lrwxrwxrwx 1 1000 1000 7 Mar 5 2013 dd
-rwxr-xr-x 1 1000 1000 52289 Mar 5 2013 dhcpcd
lrwxrwxrwx 1 1000 1000 7 Mar 5 2013 dmesg
-rwxr-xr-x 1 1000 1000 67414 Mar 5 2013 ftp
-rwxr-xr-x 1 1000 1000 67272 Mar 5 2013 ftpd
-rwxr-xr-x 1 1000 1000 24082 Mar 5 2013 inetd
-rwxr-xr-x 1 1000 1000 20892 Mar 5 2013 init
lrwxrwxrwx 1 1000 1000 7 Mar 5 2013 login
lrwxrwxrwx 1 1000 1000 7 Mar 5 2013 mount
lrwxrwxrwx 1 1000 1000 7 Mar 5 2013 netstat
lrwxrwxrwx 1 1000 1000 7 Mar 5 2013 ping
lrwxrwxrwx 1 1000 1000 7 Mar 5 2013 rm
-rwxr-xr-x 1 1000 1000 49587 Mar 5 2013 sh
-rwxr-xr-x 1 1000 1000 30050 Mar 5 2013 telnetd
/> ls -l /sbin
lrwxrwxrwx 1 1000 1000 14 Mar 5 2013 ifconfig
lrwxrwxrwx 1 1000 1000 14 Mar 5 2013 insmod
lrwxrwxrwx 1 1000 1000 14 Mar 5 2013 lsmod
lrwxrwxrwx 1 1000 1000 14 Mar 5 2013 modprobe
lrwxrwxrwx 1 1000 1000 14 Mar 5 2013 rmmod
lrwxrwxrwx 1 1000 1000 14 Mar 5 2013 route
/> ls -l /usr/bin
lrwxrwxrwx 1 1000 1000 17 Mar 5 2013 passwd
lrwxrwxrwx 1 1000 1000 17 Mar 5 2013 wget
/> ls -l /usr/sbin
/> busybox --help
BusyBox v1.15.0.svn (2013-03-06 15:43:22 JST) multi-call binary
Copyright (C) 1998-2008 Erik Andersen, Rob Landley, Denys Vlasenko
and others. Licensed under GPLv2.
See source distribution for full notice.
Usage: busybox [function] [arguments]...
or: function [arguments]...
BusyBox is a multi-call binary that combines many common Unix
utilities into a single executable. Most people will create a
link to busybox for each function they wish to use and BusyBox
will act like whatever it was invoked as!
Currently defined functions:
cp, dd, dmesg, ifconfig, insmod, login, lsmod, modprobe, mount,
netstat, passwd, ping, rm, rmmod, route, wget
/>
* Tips [#wd57fb71]
To install Quartus II on web edition on Windows 7 64bit, please look at the URL below as reference.~
- How to Install Altera Quartus II Web Edition~
http://keitetsu.ninja-web.net/fpga_quartus2_install.html~
~
Installing it Windows 7, JTAG server may not work and DE0-Nano and other connected boards may not be recognized by Quartus II. If these thing happen, please visit the URL shown below for the farther information.~
- How to Fix when Quartus II v12 does not recognizes USB-Blaster~
http://keitetsu.blogspot.jp/2012/06/quartus-ii-v120usb-blaster.html ~
* Reference[#vc3284eb]
Kobayashi, M. “Introduction to Development of Embedded System, Studying with an FPGA Board [Altera Version]”, pp383,~
Tokyo, Gijutysu-Hyohron Co.,Ltd., 2011.~
* Revision History [#gf841f41]
>
- 2013/07/01 This article is initially uploaded~