uCLinux在NiosII平台上的移植.docx
《uCLinux在NiosII平台上的移植.docx》由会员分享,可在线阅读,更多相关《uCLinux在NiosII平台上的移植.docx(38页珍藏版)》请在冰豆网上搜索。
uCLinux在NiosII平台上的移植
uCLinux在NiosII平台上的移植
一、编译环境搭建
VMware上安装Ubuntu9.04*1
配置一些比较快的源
默认情况下,Ubuntu中的vi编辑器并不好用,左右键不正常,需先安装vim-full,但ubuntu-9.04-desktop-i386.iso中的默认的源无法访问了。
sudoapt-getinstall 命令全都是“failedtofetch”的错误。
需要修改/etc/apt/sources.list源文件。
可用gedit命令。
输入用户密码。
但若把源地址一项一项添加很费事,易出错,从windows环境下又无法向VMware中粘贴。
sshd,vsftpd没有安装,share-folder在Ubuntu环境下无法使用。
现在,还有一种方法,可在VMware环境下,从外部的ftp服务器上把事先已传上去的sources.list文件下载下来。
先配置网络
sudovi/etc/network/interfaces
配置域名服务器
sudovi/etc/resolv.conf
sudo/etc/init.d/networkingrestart
从ftp上下载source.list文件,然后执行sudomvsources.list/etc/apt 命令
之后,
sudoapt-getupdate //升级安装的软件包。
sudoapt-getinstallvim-full //安装vim-full,便于以后的编辑
sudoapt-getinstallopenssh-server //安装sshd,便于远程登录
sudoapt-getinstallvsftpd //安装vsftpd,便于以后与物理机间传送文件
sudoapt-getinstallchkconfig //安装chkconfig,便于服务器的管理
接下来就参照上所讲继续安装了。
二、TryOutLinux
在进行移植工作之前,可以先下载现成的配置文件和内核映像文件,下载到板子上看看效果。
从nioswiki网站上下载DE2平台上已经编译好的DE2_NIOS_HOST_MOUSE_VGA.sof,DE2_NIOS_HOST_MOUSE_VGA.ptf以及zImage_DE2_NIOS_HOST_MOUSE_VGA_v1.6文件。
ConfiguretheFPGA
[NiosIIEDS]$ nios2-configure-sof DE2_NIOS_HOST_MOUSE_VGA.sof
Downloadandrunthekernelimage,
[NiosIIEDS]$ nios2-download-g zImage_DE2_NIOS_HOST_MOUSE_VGA_v1.6
Opennios2terminal
[NiosIIEDS]$nios2-terminal
三、InstallNios2Linux
安装或下载源码和编译工具。
在编译工具链之前,先安装以上这些工具。
如若不安装完全,在后面的编译工具链和编制内核的时候可能出现错, Ncurses是一个能提供基于文本终端窗口功能的动态库。
在Ubuntu安装的时候应注意,安装ncurses-dev库时可能会显示 “ncurses-devhasnoinstallationcandidate”,如下图所示:
此时,可以安装libncurses5-dev。
$ sudoapt-getinstalllibncurses5-dev
在完成了上述库的安装后,可按下一条命令检查是否安装完全。
检查默认的shell是否是bash
如若不是,需改成bash
$ sudorm/bin/sh
$ sudoln-sbash/bin/sh
注销重新登录,检查’cc’是否链接向了’gcc’
如若不是,则需修改:
$ cd/usr/bin
$ ln-sgcccc
20090703 需要gcc4.2或者更高版本*2。
从ftp上下载nios2-linux-20090730.tar
sha1sum校验
把nios2-linux-20090730.tar解压到指定的目录:
$sudotarnios2-linux-20090730.tar –C/media/sdb1/
切换到nios2-linux 目录,checkoutthesource
nios2-linux中各个目录的作用。
Nios2uClinux 的源文件和gnu工具链。
以下这些命令是编译nios2-gcc工具链的整个过程
Ubuntu中编译需要注意的是:
Ubuntu中并没有root用户,需用sudo的方式执行管理员操作,但是即使用sudomake仍会产生’permissiondenied’的错误。
可能是sudo的有效区域的问题。
可用以下方式解决:
出现的错误:
在安装好上文中所说的那些库后,在make的过程中仍有各种错误,便切换到nios2-linux目录update了一下。
再进行上述操作,会出现以下错误
cp:
cannotstat`doc/gcc.1':
Nosuchfileordirectory
在google上寻找解决方法如下,需修改gcc3目录下的Make-lang.in中的一句代码。
至此,在编译就没有错误了,toolschain的编译时间比较长,大概用了1个小时10分钟左右的时间。
toolchain终于编译成功了。
也可以用编译好的BinaryToolchain,
然后设一下PATH变量
$ vi~/.bashrc
本文中,把编译好的BinaryToolchain放到/opt/nios2/bin目录下,把自行编译的tools-chain设在/media/sdb1/nios2-linux/toolchain-build/build/nios2/bin目录下。
重新登录后,查看nios2-linux-uclibc-gcc 是否可用
$ nios2-linux-uclibc-gcc-v
现在把编译环境完全在nios2-linux-20090929上来做。
我在Ubuntu虚拟机上新加了一块8G的硬盘,在tarxf,./checkout,maketoolchain之后居然空间不够了,还得把nios2-linux-20090929.tar的包删掉才行。
由于nios2-linux项目使用git来管理的,所以在用的时候需要注意查看分支。
如若不是在test-nios2分支上,切换过来吧。
依次检查每一个目录。
其它与7月30的版本相同,而且不会出现编译工具链时的错误。
编一个测试程序:
helloworld
编译与检测
接下来,就可以配置和编译内核了。
切换到uClinux-dist目录下,执行
$ makemenuconfig
回车进入Vendor/ProductSelection,Vendor选择Altera,Product选择AlteraProducts(nios2)。
Exit。
选择Kernel/Library/DefaultsSelection,单击回车进入。
选择Defaultallsettings(losechanges),Exit,Exit。
显示 Doyouwishtosaveyournewkernelconfiguration?
选择 Yes
可先从nioswiki网站上下载一个已配置好的系统DE2_NIOS_HOST_MOUSE_VGA.ptf和
DE2_NIOS_HOST_MOUSE_VGA.sof先做一下实验。
运行vendor_hwselect
$ makevendor_hwselectSYSPTF=/home/lunix/uclinux/DE2_NIOS_HOST_MOUSE_VGA.ptf
选择要使用的cpu,设置程序运行的存储器。
编译内核和程序
$ make
把生成的zImage文件cp到vftpd配置的目录,在Windows环境中从虚拟机上下载。
启动nios2commandshell
$ nios2-configure-sofDE2_NIOS_HOST_MOUSE_VGA.sof
$ nios2-download–gzImage
-g 选项代表着是 下载后立即运行。
$ nios2-terminal
四、配置SOPC硬件系统平台
下面将配置一个SOPC系统,并自行裁剪linux内核
后记:
没有认真阅读
它的基本的硬件要求或建议是
∙NiosIIf型core,带Hardwaremultipler
∙sdram(最小8M)
∙一个fullfeature的定时器timer
∙一个jtag或者serial的UART
除了定时器timer不要把中断号0(irq0)分配给任何器件
硬件设计
建立一个工程,名字为DE2_uClinux。
器件设置如下。
加入一个VerilogHDL文件,文件名为DE2_uClinux.v,SetasTop-LevelEntity。
此时可先不管DE2_uClinux.v中的内容,先建立一个SOPC系统。
调用SopcBuilder
建立一个nios系统。
起名字为DE2_lab1
添加OnchipMemory,在MemorieandMemoryControllers->On-Chip->On-ChipMemory(RAMorROM)。
添加cpu,选择NiosII/e型,设置 复位和异常 向量。
更正:
此处应选NiosII/f型
加入定时器timer,选择full-featured,在Peripherals->MicrocontrollerPeripherals->IntervalTimer
加入JTAG_UART和UART,在InterfaceProtocols->Serial中
加入sdram控制器,在MemoriesandMemoryController->SDRAM->SDRAMController
加入sram,此处需注意
将DE2光盘中找到demo工程的SRAM_16Bits_512Kcopy到DE2-uClinux工程目录下,执行file->refreshsystem,可看到左侧systemcontent栏中多了一个TerasicTechnologiesInc组,组中的SRAM_16Bits_512K就是要加入的DE2上的sram控制器。
将DM9000A和SRAM_16Bit_512K加入
后记:
SOPCComponentforDM9000
把dm9000a_hw.tcl文件存放到工程目录,打开SOPCBuilder,可看到一个新的“dm9000a”组件。
添加一个新的Avalon-MMtristatebridge,添加”dm9000a”组件,重命名为”dm9000”,连接到Avalontristatebridgemaster,不需要Verilog或者VHDL文件,因为SOPCBuilder会自动生成。
不要把中断号0(irq0)分配给dm9000。
DM9000A模块加入后,应命名为dm9000,并通过tristate-bridge与连接到系统上,且中断号不能为0。
以下图的中未作修改,所有的dm9000a都应为dm9000。
加入flashcontroller,MemoriesandMemoryController->Flash->FlashMemeoryInterface(CFI)
CFIflash通过tristate-bridge与AvalonMM总线连接,它是个速度较慢的器件。
配些开关和灯。
开关和红灯18个,绿灯8个,按钮4个。
绿灯和按钮类似
先选这么多吧,最后结果
执行一些地址对齐,中断号分配的工作。
注意中断号0。
点击next,generate。
把新生成的系统加到DE2_uCLinux工程中。
配置引脚
Assignments->ImportAssignments, 选中DE2光盘中的DE2_pin_assignments.csv文件,导入。
Assignment->Device->DeviceandPinOptions->Unusedpin 设为 Asinputtri-stated。
Dual-purposepin->nCEO 设置为UseasregularI/O
修改顶层文件DE2_uClinux。
打开DE2光盘中的一个比较齐全的的Demo,此处用\DE2\DE2_demonstrations\DE2_NET。
把里面的DE2_NET.v文件的内容考出,把内容copy到DE2_uClinux.v中,把顶层module名改为DE2_uClinux。
把不需要的部分进行裁剪。
本文中裁剪如下。
//////////////////// Clock Input ////////////////////
CLOCK_27, // On Board 27 MHz
CLOCK_50, // On Board 50 MHz
//////////////////// Push Button ////////////////////
KEY, // Pushbutton[3:
0]
//////////////////// DPDT Switch ////////////////////
SW, // Toggle Switch[17:
0]
//////////////////////// LED ////////////////////////
LEDG, // LED Green[8:
0]
LEDR, // LED Red[17:
0]
//////////////////////// UART ////////////////////////
UART_TXD, // UART Transmitter
UART_RXD, // UART Receiver
///////////////////// SDRAM Interface ////////////////
DRAM_DQ, // SDRAM Data bus 16 Bits
DRAM_ADDR, // SDRAM Address bus 12 Bits
DRAM_LDQM, // SDRAM Low-byte Data Mask
DRAM_UDQM, // SDRAM High-byte Data Mask
DRAM_WE_N, // SDRAM Write Enable
DRAM_CAS_N, // SDRAM Column Address Strobe
DRAM_RAS_N, // SDRAM Row Address Strobe
DRAM_CS_N, // SDRAM Chip Select
DRAM_BA_0, // SDRAM Bank Address 0
DRAM_BA_1, // SDRAM Bank Address 1
DRAM_CLK, // SDRAM Clock
DRAM_CKE, // SDRAM Clock Enable
//////////////////// Flash Interface ////////////////
FL_DQ, // FLASH Data bus 8 Bits
FL_ADDR, // FLASH Address bus 20 Bits
FL_WE_N, // FLASH Write Enable
FL_RST_N, // FLASH Reset
FL_OE_N, // FLASH Output Enable
FL_CE_N, // FLASH Chip Enable
//////////////////// SRAM Interface ////////////////
SRAM_DQ, // SRAM Data bus 16 Bits
SRAM_ADDR, // SRAM Address bus 18 Bits
SRAM_UB_N, // SRAM High-byte Data Mask
SRAM_LB_N, // SRAM Low-byte Data Mask
SRAM_WE_N, // SRAM Write Enable
SRAM_CE_N, // SRAM Chip Enable
SRAM_OE_N, // SRAM Output Enable
//////////////////// USB JTAG link ////////////////////
TDI, // CPLD -> FPGA (Data in)
TCK, // CPLD -> FPGA (Clock)
TCS, // CPLD -> FPGA (CS)
TDO, // FPGA -> CPLD (Data out)
//////////// Ethernet Interface ////////////////////////
ENET_DATA, // DM9000A DATA bus 16Bits
ENET_CMD, // DM9000A Command/Data Select, 0 = Command, 1 = Data
ENET_CS_N, // DM9000A Chip Select
ENET_WR_N, // DM9000A Write
ENET_RD_N, // DM9000A Read
ENET_RST_N, // DM9000A Reset
ENET_INT, // DM9000A Interrupt
ENET_CLK//, // DM9000A Clock 25 MHz
文件中其它的部分与上些部分无关的代码去掉。
在生成的DE2_lab.v文件中把,把顶层模块DE2_lab复制到DE2_uClinux.v中修改如下
DE2_lab1 de2(
// 1) global signals:
.clk(CPU_CLK),
.reset_n(CPU_RESET),
// the_button_pio