全部博文(173)
分类: 嵌入式
2012-03-27 09:55:34
参考
一、编译环境搭建(安装无mmu的uclinux)
VMware上安装Ubuntu10.04*1
默认情况下,Ubuntu中的vi编辑器并不好用,左右键不正常,需先安装vim-full,但ubuntu-10.04-desk-i386.iso中的默认的源无法访问了。由于无法直接在WINDOWS和Vmware中直接传递大型的文件(尽管已经安装Vmware Tools),所以必须进行SAMBA服务器的配置。
二、配置SAMBA
使用sudo apt-get install samba安装samba软件包
修改SAMBA配置文件/etc/samba/smb.conf:
[share]
guest ok = yes
writeable = yes
browseable = yes
path = /home/share
3)激活配置文件source smb.conf
4)更改path中文件的权限:sudo chmod 777 /home/share.如果不进行更改:在windows中出现以下错误:
InstallNios2Linux
1)安装或下载源码和编译工具。
sudo apt-get install git-core git-gui make gcc ncurses-dev bison flex gawk \ gettext ccache zlib1g-dev libx11-dev texinfo liblzo2-dev pax-utils uboot-mkimage corkscrew
在编译工具链之前,先安装以上这些工具。如若不安装完全,在后面的编译工具链和编制内核的时候可能出现错, Ncurses是一个能提供基于文本终端窗口功能的动态库。在Ubuntu安装的时候应注意,安装ncurses-dev库时可能会显示 “无法找到软件包ncurses-dev”,如下图:
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
E: 无法找到软件包ncurses-dev
注意,选取libncurses5-dev而非ncurses-dev
2).sudo apt-get insatll libncurses5-dev
3). 在完成了上述库的安装后,可按下一条命令检查是否安装完全。
sudo apt-get install git-core git-gui make gcc libncurses5-dev bison flex gawk gettext ccache zliblg-dev texinfo liblzo2-dev paxutils uboot-mkimage corkscrew
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
git-core已经是最新的版本了。
git-gui已经是最新的版本了。
make已经是最新的版本了。
gcc已经是最新的版本了。
libncurses5-dev已经是最新的版本了。
bison已经是最新的版本了。
flex已经是最新的版本了。
gawk已经是最新的版本了。
gettext已经是最新的版本了。
ccache已经是最新的版本了。
4).检查默认的shell是否是bash
ls -l /bin/sh
lrwxrwxrwx 1 root root 4 2010-09-03 19:22 /bin/sh -> dash
6).如若不是,需改成bash
sudo rm /bin/sh
sudo ln -s bash /bin/sh
lrwxrwxrwx 1 root root 4 2010-09-03 19:23 /bin/sh -> bash
7).注销重新登录,检查’cc’是否链接向了’gcc’
which gcc
/usr/bin/gcc
tlinux@tlinux-desktop:uClinux-dist$ gcc -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v—with-pkgversion=’Ubuntu 4.4.3-4ubuntu5’—with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs—enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr—enable-shared—enable-multiarch—enable-linker-build-id—with-system-zlib—libexecdir=/usr/lib—without-included-gettext—enable-threads=posix—with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls—enable-clocale=gnu—enable-libstdcxx-debug—enable-plugin—enable-objc-gc—enable-targets=all—disable-werror—with-arch-32=i486 --with-tune=generic—enable-checking=release—build=i486-linux-gnu—host=i486-linux-gnu—target=i486-linux-gnu
Thread model: posix
gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)
tlinux@tlinux-desktop:uClinux-dist$ which cc
/usr/bin/cc
tlinux@tlinux-desktop:uClinux-dist$ cc -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v—with-pkgversion=’Ubuntu 4.4.3-4ubuntu5’—with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs—enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr—enable-shared—enable-multiarch—enable-linker-build-id—with-system-zlib—libexecdir=/usr/lib—without-included-gettext—enable-threads=posix—with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls—enable-clocale=gnu—enable-libstdcxx-debug—enable-plugin—enable-objc-gc—enable-targets=all—disable-werror—with-arch-32=i486 --with-tune=generic—enable-checking=release—build=i486-linux-gnu—host=i486-linux-gnu—target=i486-linux-gnu
Thread model: posix
gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)
如若不是,则需修改:
cd /usr/bin
ln –s gcc cc
8)、下载nios2-linux软件包。这里是最新的nios2-linux-20100621.tar
9)、校验工具包
10)、解压工具包并checkout
tlinux@tlinux-desktop:share$ tar xf nios2-linux-20100621.tar
tlinux@tlinux-desktop:share$ cd nios2-linux/
tlinux@tlinux-desktop:nios2-linux$ ./checkout
Checking out files: 100% (20582/20582), done.
Checking out files: 100% (32524/32524), done.
Checking out files: 100% (9577/9577), done.
Checking out files: 100% (8238/8238), done.
Checking out files: 100% (186060/186060), done.
11)、编译工具链tools chain或者下载编译好的工具链并且修改PATH
tar jxvf nios2gcc-20080203.tar.bz2
在~/.bashrc 中修改
PATH=$PATH:/opt/nios2/bin
增加命令的搜寻路径
检查成功安装工具链
lulin@lulinVMware:/home/niosPrj/nios2-linux/linux-2.6$ nios2-linux-uclibc-gcc -v
Reading specs f
rom /opt/nios2/lib/gcc/nios2-linux-uclibc/3.4.6/specs
Configured with: /root/buildroot/toolchain_build_nios2/gcc-3.4.6/configure --prefix=/opt/nios2 --
build=i386-pc-linux-gnu --host=i386-pc-linux-gnu --target=nios2-linux-uclibc --enable-language
s=c,c++ --disable-__cxa_atexit --enable-target-optspace --with-gnu-ld --disable-shared --disabl
e-nls --enable-threads --enable-multilib
Thread model: posix
gcc version 3.4.6
更新配置
tlinux@tlinux-desktop:uClinux-dist$ Source ~/.bashrc
12)、查看分支
tlinux@tlinux-desktop:nios2-linux$ cd uClinux-dist/
tlinux@tlinux-desktop:uClinux-dist$ git branch -a
test-nios2
• trunk
remotes/origin/HEAD -> origin/test-nios2
remotes/origin/test-nios2
remotes/origin/trunk
remotes/origin/unstable
tlinux@tlinux-desktop:uClinux-dist$ git checkout test-nios2
Checking out files: 100% (150861/150861), done.
Switched to branch ‘test-nios2’
tlinux@tlinux-desktop:nios2-linux$ cd linux-2.6
git branch -a
• nios2mmu
test-nios2
remotes/origin/HEAD -> origin/test-nios2
remotes/origin/master
remotes/origin/nios2-mmu-nommu-merge
remotes/origin/nios2mmu
remotes/origin/test-lm32
remotes/origin/test-nios2
remotes/origin/unstable
remotes/origin/unstable-nios2mmu
remotes/origin/v2.6.21-nios2mmu
git checkout test-nios2
Checking out files: 100% (21499/21499), done.
Switched to branch ‘test-nios2’
13)、默认情况下编译一次验证开发包的正确性
tlinux@tlinux-desktop:uClinux-dist$ :make menuconfig
屏幕过小出现问题:
扩大窗口
重新make menuconfig
--- Select the Vendor you wish to target
Vendor (Altera) --->
--- Select the Product you wish to target
Altera Products (nios2) --->
--- Kernel is linux-2.6.x
Libc Version (None) --->
[*] Default all settings (lose changes)
[ ] Customize Kernel Settings (NEW)
[ ] Customize Application/Library Settings (NEW)
[ ] Update Default Vendor Settings (NEW)
Do you wish to save your new kernel configuration?
< Yes > < No >
结果可能出现一个[Y/N]的选择,直接按回车即可。
选择quartus设计文件
make
vendor_hwselect SYSPTF=
system.ptf为quartus工程文件
选择linux系统运行的硬件
--- Please select which CPU you wish to build the kernel against:
(1) cpu - Class: altera_nios2 Type: f Version: 7.08100
Selection: 1
--- Please select a device to execute kernel from:
(1) onchip_mem
Class: altera_avalon_onchip_memory2
Size: 4096 bytes
(2) altmemddr
Class: ddr2_high_perf
Size: 1073741824 bytes
Selection: 2
保存配置后make
root@tlinux-desktop:/home/nios2-linux/uClinux-dist# make
最后出现提示表明开发包正确。
cp /home/nios2-linux/uClinux-dist/linux-2.6.x/arch/nios2/boot/zImage /home/nios2-linux/uClinux-dist/images/zImage.initramfs.gz
cp /home/nios2-linux/uClinux-dist/linux-2.6.x/System.map /home/nios2-linux/uClinux-dist/images/System.map.initramfs.gz
cp /home/nios2-linux/uClinux-dist/linux-2.6.x/vmlinux /home/nios2-linux/uClinux-dist/images/linux.initramfs.gz
nios2-linux-gnu-strip -g /home/nios2-linux/uClinux-dist/images/linux.initramfs.gz
ln -sf zImage.initramfs.gz /home/nios2-linux/uClinux-dist/images/zImage
nios2-linux-gnu-strip -g /home/nios2-linux/uClinux-dist/images/zImage.initramfs.gz
make[4]:正在离开目录 ‘/home/nios2-linux/uClinux-dist/vendors/Altera/nios2’
make[3]:正在离开目录 ‘/home/nios2-linux/uClinux-dist/vendors/Altera/nios2’
make[2]:正在离开目录 ‘/home/nios2-linux/uClinux-dist/vendors/Altera/nios2’
make[1]:正在离开目录 ‘/home/nios2-linux/uClinux-dist/vendors’
四、定制开发板
Create a Nios II design with MMU
The low memory, which kernel can access without TLB, is 0x0-0x1fffffff physical address (512MB span). Divide this by 2 gives 256MB. In order to run a single kernel image on different hardware using fdt, we should setup a hardware design guide line that sdram base should be at 0x10000000 physical address. All other components, such as flash, serial and ethernet, should be placed in 0x00000000-0x0fffffff (256MB span).
1. Add a 512B or 1KB dual-port tightly coupled memory. Connect one port to tightly_coupled_instruction_master, and the other port to tightly_coupled_data_master. Both ports must be located at the same address.
2. Include MMU to your Nios II processor using SOPC builder. Assign "Fast TLB Miss Exception Vector" to the tightly coupled memory. You may use default MMU setting.
Board layer
The kernel and uClinux-dist support boards definition.
1、add a new board to kernel using neek as a template在linux-2.6和uClinux-dist两个目录下,分支均为默认。
linux-2.6分支为nios2mmu
cd nios2-linux/linux-2.6
git checkout nios2mmu
uClinux-dist分支为trunk
cd nios2-linux/uClinux-dist
git checkout trunk
编译工具链(移植带mmu的linux系统必须编译安装完整的工具链)
lulin@lulinVMware:/home/niosPrj/nios2-linux$ cd toolchain-build
lulin@lulinVMware:/home/niosPrj/nios2-linux/ toolchain-build $git clean –f –x –d
lulin@lulinVMware:/home/niosPrj/nios2-linux/ toolchain-build $ make gcc elf2flt gdb-host
编译时可能会出错,但只要生成了nios2-linux-gnu-gcc等核心程序就可以了。再修改PATH环境变量。
复制板设置
cd nios2-linux/linux-2.6/arch/nios2/boards/
cp -a 3c120 my_nios2
Edit Kconfig in boards dir to include your board.
menu “NiosII board configuration”
choice
prompt “board configuration”
config 3C120
bool “3C120 dev board”
help
The Altera 3C120 dev board support.
config NEEK
bool “Nios Embedded Evaluation Kit”
help
The Altera Nios Embedded Evaluation Kit support.
config MY_NIOS2
bool “My Nios2 Custom Board”
help
My Nios2 Cusotm Board support.
endchoice
source “arch/nios2/boards/3c120/Kconfig”
source “arch/nios2/boards/neek/Kconfig”
source “arch/nios2/boards/my_nios2/Kconfig”
endmenu
Edit Makefile in boards dir to include your board.
board-$(CONFIG_3C120) := 3c120
board-$(CONFIG_NEEK) := neek
board-$(CONFIG_MY_NIOS2) := my_nios2
BOARD := $(board-y)
export BOARD
ifneq ($(board-y),)
core-y += arch/$(ARCH)/boards/$(BOARD)/
KBUILD_AFLAGS += -Iarch/$(ARCH)/boards/$(BOARD)/include
KBUILD_CPPFLAGS += -Iarch/$(ARCH)/boards/$(BOARD)/include
KBUILD_CFLAGS += -Iarch/$(ARCH)/boards/$(BOARD)/include
endif
Edit Kconfig in boards/my_nios2 dir.
if MY_NIOS2
choice
prompt “FPGA configuration”
config MY_NIOS2_FPGA
bool “MY_NIOS2_FPGA”
help
Adapt the kernel to custom FPGA configuration. You will
need to generate a header file for your desgin using the
“sopc-create-header-files” scripts provided by Altera.
The file “include/asm-nios2/my_nios2_fpga.h” will be used.
endchoice
endif
生成内核头文件
The new kernel doesn't use hwselect script, it uses sopc generated header instead.
Run this in your quartus project dir (with quartus 8.1 or later),
sopc-create-header-files --single my_nios2_fpga.h
sopc-create-header-files: Using SOPC design file ./DE3_SOPC.sopcinfo found in . swinfo2header: Creating macro file ‘my_nios2_fpga.h’ for module ‘cpu’
sopc-create-header-files在quartus/sopc_builder/bin/中
将my_nios2_fpga.h复制到linux系统nios2的nios2-linux/linux-2.6/arch/nios2/boards/my_niso2/include/asm中
配置nios2-linux/linux-2.6/arch/nios2/boards/my_niso2/config.c
根据生成的my_nios2_fpga.h配置相应的结构,在我的实验中修改:
#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
static struct mtd_partition nios2_partitions[]
//This following is added by lulin.
#if defined(CONFIG_USB_ISP1760_HCD) || defined(CONFIG_USB_ISP1760_HCD_MODULE)
#ifdef CONFIG_GENERIC_GPIO
struct altera_pio_port altera_pio_ports[] = {
{PIO_LED_BASE},
{PIO_BUTTON_BASE} //与my_nios2_fpga.h对应
};
还要删除其中一些板上没有的项,主要是flash和tse相关项。
否则make编译时会出错,根据出错的地方直接删除即可,可以参考文件夹中的config.c文件。
修改nios2-linux/linux-2.6/arch/nios2/boards/my_niso2/include/asm/nios.h
#ifndef _ASM_NIOS2_H__
#define _ASM_NIOS2_H__
#if defined(CONFIG_MY_NIOS2_FPGA)
#include
/* Added compability mode with macro names from "old" design...
* FIXME: we should really fix drivers instead. but this makes it
* easier to switch between old and new design...
*/
/*#define CONFIG_ALTERA_CYCLONE_III*/
#define DDR2_TOP_BASE ALTMEMDDR_BASE
#define DDR2_TOP_SPAN ALTMEMDDR_SPAN
#define TIMER_1MS_FREQ TIMER_FREQ
#define TIMER_1MS_BASE TIMER_BASE
#define TIMER_1MS_SPAN TIMER_SPAN
#define TIMER_1MS_IRQ TIMER_IRQ //与my_nios2_fpga.h头文件对应
/* value of GPIO_LED1 is identify the number of LED on the board*/
#define GPIO_LED1 2
#else
#error "No FPGA configuration selected"
#endif
上述修改项与生成的my_nios2_fpga.h头文件对应。
重新配置内核
--- Kernel is linux-2.6.x
--- Libc is None [ ] Default all settings (lose changes) [*] Customize Kernel Settings [ ] Customize Application/Library Settings (NEW) [ ] Update Default Vendor Settings
选择my_nios2配置
make menuconfig
进入kernel config->niosII configure->board configuration
选择my nios2 custom board
root@tlinux-desktop:/home/nios2-linux/uClinux-dist# make
生成内核镜像,将/nios2-linux/uClinux-dist/image中的linux.initramfs.gz复制到C:\altera\91\nios2eds的example中。
下载内核并运行
运行C:\altera\91\nios2eds中的Nios II Command Shell.bat下载sof文件:[NiosII EDS]$ nios2-configure-sof DE3_DDR2_time_limited.sof
下载镜像文件到DDR2 SDRAM:
[NiosII EDS]$ nios2-download -g linux.initramfs.gz
下载完成后,打开nios终端:
[NiosII EDS]$ nios2-terminal
nios2-terminal: connected to hardware target using JTAG UART on cable
nios2-terminal: “USB-Blaster [USB-0]”, device 1, instance 0
nios2-terminal: (Use the IDE stop button or Ctrl-C to terminate)
Linux version 2.6.34-00692-g5bc7853-dirty (root@tlinux-desktop) (gcc version 4.1
.2) #47 Fri Sep 3 09:04:35 CST 2010
bootconsole [early0] enabled
early_console initialized at 0xe8000068
Linux/Nios II-MMU
init_bootmem_node(?,0x4c6, 0x0, 0x8000)
free_bootmem(0x4c6000, 0x7b3a000)
reserve_bootmem(0x4c6000, 0x1000)
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 32512
Kernel command line:
PID hash table entries: 512 (order: -1, 2048 bytes)
Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
We have 32768 pages of RAM
Memory available: 125048k/4884k RAM, 0k/0k ROM (1684k kernel code, 3199k data)
Hierarchical RCU implementation.
NR_IRQS:32
Calibrating delay loop... 65.74 BogoMIPS (lpj=328704)
Mount-cache hash table entries: 512
NET: Registered protocol family 16
init_BSP(): registering device resources
bio: create slab
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
Switching to clocksource timer
JFFS2 version 2.2. (NAND) © 2001-2006 Red Hat, Inc.
msgmni has been set to 244
Block layer SCSI generic (bsg) driver version 0.4 loaded (major 254)
io scheduler noop registered
io scheduler deadline registered
io scheduler cfq registered (default)
ttyJ0 at MMIO 0x8000068 (irq = 3) is a Altera JTAG UART
console [ttyJ0] enabled, bootconsole disabled
console [ttyJ0] enabled, bootconsole disabled
Initializing USB Mass Storage driver...
usbcore: registered new interface driver usb-storage
USB Mass Storage support registered.
mice: PS/2 mouse device common for all mice
Freeing unused kernel memory: 2716k freed (0xc01a6000 - 0xc044c000)
ifconfig: socket: Address family not supported by protocol
Welcome to
____ _ _
/ __| ||_|
_ _| | | | _ ____ _ _ _ _
| | | | | | || | _ \| | | |\ \/ /
| |_| | |__| || | | | | |_| |/ \
| ___\____|_||_|_| |_|\____|\_/\_/
| |
|_|
For further information check:
BusyBox v1.16.2 (2010-08-26 19:16:26 CST) hush - the humble shell
Enter ‘help’ for a list of built-in commands.
root:/>