资源描述
第7章嵌入式Mini VOS服务器第第7章嵌入式章嵌入式Mini VOS服务器服务器7.1 案例简介案例简介7.2 搭建搭建MicroBlaze硬件平台硬件平台7.3 在在EDK中配置项目软件环境中配置项目软件环境7.4 uClinux交叉编译环境的搭建交叉编译环境的搭建 7.5 EDK硬件配置文件的导入及硬件配置文件的导入及uClinux基本配置基本配置7.6 LED驱动及驱动及VOS应用系统的加载应用系统的加载7.7 源码源码 第7章嵌入式Mini VOS服务器在线教务辅导网:在线教务辅导网:http:/教材其余课件及动画素材请查阅在线教务辅导网教材其余课件及动画素材请查阅在线教务辅导网QQ:349134187 或者直接输入下面地址:或者直接输入下面地址:http:/第7章嵌入式Mini VOS服务器7.1 案案 例例 简简 介介本案例实现了远程主机通过Web网络对终端开发板进行操作和控制,以及类似于可控智能家庭网络的应用,例如可以通过终端玩音乐游戏、播放MP3等。第7章嵌入式Mini VOS服务器1.功能描述功能描述该设计模拟目前流行的VOS音乐游戏,称之为MINI VOS。其功能是当音符不断下落时,用户需在它们落地前将其打掉。该游戏分三个难度等级,音符的下落速度不断增加,对反应速度的要求也越来越高。此外,用户可以自己编曲,还可以选择播放自己喜欢的歌曲,共有3首歌曲供选择。本设计具有实时性、高效性、信息传递稳定精确、误操作少和系统功耗低等性能特点,并具有友好的用户界面。第7章嵌入式Mini VOS服务器2.开发环境开发环境(1)硬件环境与工具包含如下:FPGA开发板及其相关附件(XILINX Spartan-3E Starter Kit)。硬件连线:RS232串口线,RJ45网线。网络设备:以太网集线器(HUB)。第7章嵌入式Mini VOS服务器(2)软件环境与工具包含如下:EDK 8.2i(不可选用其他版本或其升级版本,如8.2.03i)。Fedora Core 4(或RedHat9 Linux)操作系统。虚拟机VMware 5.0.0 build-13124。第7章嵌入式Mini VOS服务器3.案例源码案例源码本案例所使用的源码请参考本书配套光盘/Chapter7/,目录结构如下:/Doc:本案例的操作指导文档。/Src:源代码与Web网页所需资源,以及LED驱动源文件。/Tools:本案例中使用的工具,包含uClinux配置文件uclinux_v1_00_d文件夹、交叉工具链microblaze-elf-tools-20060213.tar.gz、uClinux源码包uClinux-dist-20060803.tar.bz2。第7章嵌入式Mini VOS服务器7.2 搭建搭建MicroBlaze硬件平台硬件平台MicroBlaze硬件平台的搭建参照以下步骤进行:(1)启动XPS 8.2i,软件系统弹出如图7.2.1所示的对话框,其中共三个选项。由于我们此次是新建一个MicroBlaze硬件平台,因此选中“Base System Builder wizard(recommended)”,点击“OK”按钮,进入硬件平台搭建向导。第7章嵌入式Mini VOS服务器图7.2.1 配置向导第7章嵌入式Mini VOS服务器(2)在弹出的对话框中,点击“Browse”按钮,选择一个目标磁盘并建立一个自己的工程文件夹;双击进入自己的工程文件夹后,点击保存,系统会自动为此项目命名为system.xmp;点击“OK”按钮,进入BSB欢迎对话框。(3)在欢迎对话框内,选择“I would like to create a new design”,点击“Next”按钮。第7章嵌入式Mini VOS服务器(4)进入开发板选择对话框(见图7.2.2)后,进行如下的系统配置:Board vendor:XilinxBoard name:spartan-3E Starter BoardBoard revision:C设置完成后点击“Next”按钮。第7章嵌入式Mini VOS服务器(5)进入处理器选择对话框(见图7.2.3),因为Spartan-3E只支持软核MicroBlaze,所以保留默认设置即可。在对话框中还可以看到MicroBlaze系统的一些参数,比如封装类型、速度等。完成后点击“Next”按钮。第7章嵌入式Mini VOS服务器图7.2.2 开发板选择窗口第7章嵌入式Mini VOS服务器图7.2.3 处理器选择窗口第7章嵌入式Mini VOS服务器(6)进入MicroBlaze配置对话框(见图7.2.4),参考时钟频率选择默认值50MHz即可,MicroBlaze处理器的总线时钟频率选择为“66.67”MHz。其中参考时钟由开发板上的时钟源提供,用来产生总线和处理器的频率,并且根据开发板的不同而不同。“Debug I/F”选择“On-chip H/W debug module”,“Local memory”选择默认“8KB”即可。“Cache setup”选择“Enable cache link”。设置完成后点击“Next”按钮。第7章嵌入式Mini VOS服务器图7.2.4 处理器配置窗口第7章嵌入式Mini VOS服务器(7)进入I/O端口配置对话框(见图7.2.5)。I/O设备选择“RS232_DCE”,不选“RS232_DTE”。波特率选择“115200”,并且打开中断,其他选项默认即可。点击对话框右侧的“Data Sheet”按钮,可以看到关于每个外设的详细资料。选择完毕后点击“Next”按钮。第7章嵌入式Mini VOS服务器图7.2.5 I/O端口配置(一)第7章嵌入式Mini VOS服务器(8)继续配置I/O端口。由于在远程控制中需要通过LED来测试远程控制成功与否,所以选择“LEDs_8bit”,并且打开中断;其他外设除FLASH外,暂不需要,均不勾选,之后点击“Next”按钮,如图7.2.6所示。(9)进入外部存储器与网络接口对话框(见图7.2.7)。Spartan-3E开发板使用32MB的外部存储器,由此选择“DDR_SDRAM_16M16”。因为在远程控制中需要通过网络接口来发送数据包,所以“Ethernet_MAC”选项也是必不可少的,同时需要把中断打开,之后点击“Next”按钮。第7章嵌入式Mini VOS服务器图7.2.6 I/O端口配置(二)第7章嵌入式Mini VOS服务器图7.2.7 I/O端口配置(三)第7章嵌入式Mini VOS服务器(10)由于此次远程控制中使用了操作系统,因此需要添加定时器,在图7.2.8所示的对话框中点击“Add Peripherals”按钮,在弹出的对话框中选择“OPB TIMER”,然后点击“OK”按钮。第7章嵌入式Mini VOS服务器图7.2.8 添加OPB TIMER第7章嵌入式Mini VOS服务器(11)接下来图7.2.9所示的对话框显示了Timer的配置参数,这里,我们只需要一个Timer,并把中断打开,然后点击“Next”按钮。第7章嵌入式Mini VOS服务器图7.2.9 OPB TIMER配置第7章嵌入式Mini VOS服务器(12)进入Cache配置对话框(见图7.2.10)。因为在系统构建之初,我们已经选择了对外部存储器进行Cache缓存,所以在这里需要对其大小进行设置,数据Cache与指令Cache分别为默认“8KB”与“2KB”即可,并且勾选“ICache”与“DCache”,之后点击“Next”按钮。第7章嵌入式Mini VOS服务器图7.2.10 配置Cache第7章嵌入式Mini VOS服务器(13)在图7.2.11所示的软件配置对话框中,标准输入/输出选项选择默认的“RS232_DCE”即可。另外,在搭建MicroBalze硬件平台后,系统会自动生成两个测试程序,分别对外设与外部存储器进行测试,这里默认设置即可,完成后点击“Next”按钮。第7章嵌入式Mini VOS服务器图7.2.11 测试程序选择第7章嵌入式Mini VOS服务器(14)进入测试程序配置对话框(见图7.2.12),主要任务是对存储器测试程序存放的位置进行设置,我们选择使用默认的片内存储器就可以了。当我们下载Bitstream至开发板后,测试程序会自动运行。完成后点击“Next”按钮。第7章嵌入式Mini VOS服务器图7.2.12 Memory测试程序配置第7章嵌入式Mini VOS服务器(15)与上一步的原理相同,这里需要指定外设测试程序的位置,见图7.2.13,选择默认放在外部存储器即可,点击“Next”按钮。第7章嵌入式Mini VOS服务器图7.2.13 Peripheral测试程序配置第7章嵌入式Mini VOS服务器(16)至此,一个MicroBlaze硬件平台已经搭建完毕,点击“Generate”按钮,如图7.2.14所示。第7章嵌入式Mini VOS服务器图7.2.14 硬件系统基本信息表第7章嵌入式Mini VOS服务器(17)点击“Finish”,系统会弹出如图7.2.15所示的窗口,选择“Start using Platform Studio”。图7.2.15 系统配置结束第7章嵌入式Mini VOS服务器(18)此时系统会出现图7.2.16所示的界面,即“Xilinx Platform Studio”的操作界面。(19)在Hardware菜单中点击Generate Netlist,系统会自动综合MicroBlaze的网表文件,值得提醒的是这一步骤所花的时间比较长。第7章嵌入式Mini VOS服务器图7.2.16 XPS操作界面第7章嵌入式Mini VOS服务器(20)选择“Applications”选项,右击工程“TestApp_Memory”,确定“Mark to Initialize BRAMs”被选中,如图7.2.17所示。这样,在将Bitstream下载到开发板的过程中,会自动执行外部存储器的测试程序。第7章嵌入式Mini VOS服务器图7.2.17 配置Memory测试程序第7章嵌入式Mini VOS服务器(21)点击菜单Device ConfigurationUpdate Bitstream,生成Bit文件。(22)由于此次远程控制中我们选择串口进行调试,因此需要新建超级终端,如图7.2.18所示。第7章嵌入式Mini VOS服务器图7.2.18 启动超级终端第7章嵌入式Mini VOS服务器(23)输入超级终端的名字,然后点击确定。(24)打开“连接后使用”下拉菜单,选择开发板所使用的串口号。(25)对串口进行配置,如图7.2.19所示。配置完成之后,点击“确定”按钮。第7章嵌入式Mini VOS服务器图7.2.19 配置超级终端第7章嵌入式Mini VOS服务器(26)将操作环境切换到EDK,选择Device ConfigurationDownload Bitstream,将之前生成的Bitstream与可执行文件一起下载到开发板中。观察超级终端,查看外部存储器中的测试信息。(27)在下载Bitstream的过程中,系统会自动把外部存储器的测试程序下载到片内存储器中并执行。观察超级终端的测试结果,如果测试通过,超级终端会输出图7.2.20所示的信息。第7章嵌入式Mini VOS服务器图7.2.20 Memory测试成功第7章嵌入式Mini VOS服务器7.3 在在EDK中配置项目软件环境中配置项目软件环境在EDK中配置项目软件环境的步骤如下:(1)由于此次设计需要在MicroBlaze处理器上运行uClinux,因此首先应将uClinux的配置文件uclinux_v1_00_d文件夹拷贝到EDKswlib/bsp文件夹下,否则后续的配置工作将会遇到很多问题。第7章嵌入式Mini VOS服务器(2)启动EDK,打开刚才搭建的MicroBlaze硬件系统工作目录文件夹下的system.xmp文件。(3)在打开MicroBlaze系统文件后,可以在EDK开发环境中看到相关系统信息,如图7.3.1所示。切换到“Bus Interface”,可以看到MicroBlaze系统中各个模块与总线的连接情况。第7章嵌入式Mini VOS服务器图7.3.1 模块与总线连接情况第7章嵌入式Mini VOS服务器(4)这里,我们需要对此系统做出如下修改:将窗口切换到“Ports”,打开“debug_module”,点击“Interrupt”中的“Net”选项,选择“debug_module_Interrupt”,如图7.3.2所示。第7章嵌入式Mini VOS服务器图7.3.2 中断配置(一)第7章嵌入式Mini VOS服务器(5)打开“Ports”选项中的“opb_inct-_0”,然后双击“L to H”,如图7.3.3所示。图7.3.3 中断配置(二)第7章嵌入式Mini VOS服务器(6)此时,系统会弹出图7.3.4所示的对话框。图7.3.4 中断添加第7章嵌入式Mini VOS服务器(7)我们需要把“debug_module_Interrupt”加入到“Connected Interrupts”栏中,具体方法是选中“Potential Interrupt Connections”栏中的“debug_module_Interrupt”,点击加号,即可被加入到“Connected Interrupts”栏中,如图7.3.5所示。第7章嵌入式Mini VOS服务器图7.3.5 中断添加完成第7章嵌入式Mini VOS服务器(8)进行软件平台配置时,点击“Software”菜单,启动“Software Platform Setting”,如图7.3.6所示。图7.3.6 启动软件平台配置第7章嵌入式Mini VOS服务器(9)系统会弹出软件平台的配置窗口,如图7.3.7所示,可以看到共有四个可配置项:“Software Platform”、“OS and Libraries”、“Drivers”、“Interrupt Handle”。右方的窗口为可配置选项的参数。第7章嵌入式Mini VOS服务器图7.3.7 软件平台配置窗口第7章嵌入式Mini VOS服务器(10)这里我们需要逐项进行相关配置(见图7.3.8)。对“Software Platform”进行配置时,点击“Software Platform”,窗口右侧为可配置参数,包括两个子窗口。“Processor Parameters”子窗口中包括处理器主频信息、交叉编译器等选项。其中,“extra_compiler_flags”指定了在生成BSP与库的过程中,交叉编译器所使用的编译标志;“archiver”和“compiler”分别指定了生成BSP与库所使用的工具链。第7章嵌入式Mini VOS服务器我们只需修改处理器的主频信息即可,由于在进行系统搭建时选择使用了系统默认的50MHz,因此“CORE_CLOCK_FREQ_Hz”项的“Current Value”改为50MHz,其他选项保持默认。在“OS&Library Settings”子窗口中,打开“OS”的下拉菜单,因为我们选择使用的操作系统为uClinux,所以这里选择“uclinux”。特别值得注意的是,如果步骤(1)没有完成,那么在点开“OS”的下拉菜单后,将没有“uclinux”选项。第7章嵌入式Mini VOS服务器图7.3.8 操作系统选择 第7章嵌入式Mini VOS服务器(11)完成如上配置后,选中“OS and Library”可配置选项(见图7.3.9),以实现开发板对uClinux的BSP进行配置,包括FLASH与MEMORY以及输入/输出调试端口的配置,我们主要对以下参数进行修改:flash_memory_bank:0flash_memory:FLASH_16M8main_memory_bank:0main_memory:DDR_SDRAM-_16M16Stdin:RS232_DCEstdout:RS232_DCE第7章嵌入式Mini VOS服务器(12)Drivers及Interrupt Handle两项不需要进行配置,点击“OK”按钮,退出界面。至此,基于uClinux的MicroBlaze软件平台配置完成,下一步是根据软件平台的配置生成针对MicroBlaze处理器的BSP与库,使uClinux与开发板的信息交互成为可能。(13)进入EDK的Software菜单,点击Generate BSP and Libraries,系统会自动生成板级支持包与库,并且可以在MicroBlaze硬件系统工作目录文件夹下的/microblaze_0/libsrc/uclinux_v1_00_d文件夹内找到已生成的auto config.in文件。第7章嵌入式Mini VOS服务器图7.3.9 操作系统与库配置第7章嵌入式Mini VOS服务器7.4 uClinux交叉编译环境的搭建交叉编译环境的搭建首先在Linux下建立uClinux交叉编译环境,这需要将交叉编译器microblaze-elf-tools和内核源码包uClinux-dist解压缩到指定的目录下。说明:以下均假定Windows主机的D盘下有个文件夹share,该文件夹下包括所需的交叉工具链和uClinux的压缩包。第7章嵌入式Mini VOS服务器7.4.1 建立共享文件夹建立共享文件夹在本小节中,我们需要建立一个可以在Windows与Linux之间共享的文件夹,通过虚拟机VMware来建立。从VMware 5开始,VMware支持直接将Windows下的文件夹映射到Linux的/mnt/hgfs/目录下,从而完成Windows与Linux间的共享。运行虚拟机VMware软件,然后点击“VM”菜单中的“Settings”选项,见图7.4.1。第7章嵌入式Mini VOS服务器(2)在出现的设置页面(见图7.4.2)中选择“Shared Folders”,并确认以下内容:虚拟机中设置的Windows主机共享文件夹名称为“share”,指向包含交叉工具链和uClinux压缩包的文件夹“d:share”。系统启动后,虚拟机中会将此共享文件夹挂接到/mnt/hgfs中。在虚拟机的Linux系统中,用户可通过/mnt/hgfs/share/访问到Windows文件夹。第7章嵌入式Mini VOS服务器图7.4.1 运行虚拟机第7章嵌入式Mini VOS服务器图7.4.2 配置共享目录第7章嵌入式Mini VOS服务器如图7.4.3所示,可以看出已经在“hgfs”下出现了“share”文件夹。图7.4.3 查看共享目录第7章嵌入式Mini VOS服务器7.4.2 建立交叉编译环境建立交叉编译环境(1)在虚拟机中以用户名root登录,并在/home下建立embed文件夹,然后在embed文件夹下建立microblaze-elf-tools文件夹,即输入以下命令:cd /homemkdir embedcd embedmkdir microblaze-elf-tools第7章嵌入式Mini VOS服务器(2)从Windows主机中将交叉工具链(microblaze-elf-tools-20060213.tar.gz)复制到指定的目录(如d:share)下,即在虚拟机终端中输入以下命令:cp /mnt/hgfs/share/microblaze-elf-tools-20060213.tar.gz/home/embed/microblaze-elf-tools(3)解压交叉工具链的压缩包,即输入以下命令:tar-zxvf microblaze-elf-tools-20060213.tar.gz第7章嵌入式Mini VOS服务器(4)打开当前用户的.bash_profile文件,修改/root目录下的该文件,即输入以下命令:vi /.bash_profile将MicroBlaze交叉工具链所在的路径加到PATH中,即输入以下命令(见图7.4.4):PATH=/home/embed/microblaze-elf-tools/bin:$PATH:SHOME/bin第7章嵌入式Mini VOS服务器图7.4.4 修改“bash_profile”第7章嵌入式Mini VOS服务器(5)执行如下命令,使路径设置生效:source/.bash_profile执行如下命令,检查路径设置是否已经生效:echo$PATH(6)显示MicroBlaze交叉工具链的版本信息,即输入以下命令:mb-gcc v将出现图7.4.5所示的画面,则说明MicroBlaze交叉工具链安装成功。第7章嵌入式Mini VOS服务器图7.4.5 MicroBlaze交叉工具链信息第7章嵌入式Mini VOS服务器(7)安装uClinux源码包时,首先将uClinux源码包(uClinux-dist-20060803.tar.bz2)复制到指定的目录(如/home/embed)下,即输入以下命令:cp /mnt/hgfs/share/uClinux-dist-20060803.tar.bz2 /home/embed切换到用户目录/home/embed中,解压缩Clinux源码包,即使用以下命令:cd /home/embedtar jxvf uClinux-dist-20060803.tar.bz2第7章嵌入式Mini VOS服务器切换到uClinux目录下,即输入以下命令:cd uClinux-dist然后显示uClinux的目录结构,即输入以下命令:ls-l命令输入后,将出现图7.4.6所示的画面,则说明uClinux源码包已经安装好了。第7章嵌入式Mini VOS服务器图7.4.6 uClinux的目录结构第7章嵌入式Mini VOS服务器7.5 EDK硬件配置文件的导入及硬件配置文件的导入及uClinux基本配置基本配置本节主要介绍EDK硬件配置文件的导入及uClinux基本配置的方法,步骤如下:(1)将前面EDK生成的autoconfig.in文件(参见7.3节)拷贝到Linux虚拟机中的linux-2.4.x/arch/microblaze/platform/uclinux-auto目录下,即输入以下命令:cd uClinux-distcp /mnt/hgfs/share/autoconfig.inlinux-2.4.x/arch/microblaze/platform/uclinux-auto第7章嵌入式Mini VOS服务器(2)转换autoconfig.in的格式,即输入以下命令:vi linux-2.4.x/arch/microblaze/platform/uclinux-auto/autoconfig.in输入命令后,将出现vi的编辑界面,如图7.5.1在vi的命令行模式下输入命令::set ff=unix,然后按下Esc键,输入“wq”后保存退出,这样就完成了autoconfig.in的导入工作。第7章嵌入式Mini VOS服务器图7.5.1 修改文件格式第7章嵌入式Mini VOS服务器(3)清除以前的编译记录,即输入以下命令:make clean(4)启动uClinux图形配置界面,即输入命令:make menuconfig,将出现图7.5.2所示的界面。第7章嵌入式Mini VOS服务器图7.5.2 uClinux配置向导第7章嵌入式Mini VOS服务器(5)进入“Vendor/Product Selection”菜单,在“Vendor”中选择“Xilinx”,在“Xilinx Products”中选择“uclinux-auto”,如图7.5.3,然后选择“Exit”,退回Main Menu。第7章嵌入式Mini VOS服务器图7.5.3 目标板选择第7章嵌入式Mini VOS服务器(6)在Main Menu中选择“Kernel/Library/Defaults Selection”选项,进入子菜单。在“Kernel Version”中选择“linux-2.4.x”,在“Libc Version”中选择“uClibc”;另外,需要选中“Customize Kernel Settings”和“Customize Vendor/User Settings”两个选项,见图7.5.4。然后选择“Exit”,退回Main Menu。在Main Menu里选择退出,会出现图7.5.5所示的界面,选择“Yes”,保存新的Kernel配置。第7章嵌入式Mini VOS服务器图7.5.4 “Kernel/Library/Defaults Selection”子菜单第7章嵌入式Mini VOS服务器图7.5.5 保存退出第7章嵌入式Mini VOS服务器 (7)如图7.5.6所示,弹出Kernel个性化设置的界面。图7.5.6 配置主菜单第7章嵌入式Mini VOS服务器(8)在Main Menu里选择并进入“Processor type and features”子菜单后,选择“Console on UARTLITE”和“Ethernet driver”,见图7.5.7,然后退回Main Menu。第7章嵌入式Mini VOS服务器图7.5.7 处理器配置菜单第7章嵌入式Mini VOS服务器(9)进入“Memory Technology Devices(MTD)”子菜单,见图7.5.8,然后在“RAM/ROM/Flash chip drivers”子菜单中,确认“Support for Intel/Sharp flash chips”项被选中,取消“Support for AMD/Fujitsu flash chips”项的选择,如图7.5.9所示。然后退出到“Memory Technology Devices(MTD)”菜单,进入“Mapping drivers for chip access”菜单,如图7.5.10所示,确认“Generic uClinux RAM/ROM filesystem support”项被选中,见图7.5.11,然后选择“Exit”,退回Main Menu。第7章嵌入式Mini VOS服务器图7.5.8 MTD配置第7章嵌入式Mini VOS服务器图7.5.9 RAM/ROM/FLASH配置第7章嵌入式Mini VOS服务器图7.5.10 MTD配置第7章嵌入式Mini VOS服务器图7.5.11 uClinux文件系统选择第7章嵌入式Mini VOS服务器(10)在Main Menu中,进入“Block devices”菜单,确认“Initial RAM disk(initrd)support”选项没有被选中。然后选择“Exit”,退出Main Menu,见图7.5.12。第7章嵌入式Mini VOS服务器图7.5.12 “Block devices”配置第7章嵌入式Mini VOS服务器(11)进入“File systems”菜单,如图7.5.13所示,确认选择“/dev file system support(EXPERIMENTAL)”和它的子选项“Automatically mount at boot”和“Debug devfs”,然后退出此菜单。第7章嵌入式Mini VOS服务器图7.5.13 文件系统配置第7章嵌入式Mini VOS服务器(12)在Main Menu中选择退出,将出现图7.5.14所示的界面,选择“Yes”,保存设置。图7.5.14 保存退出第7章嵌入式Mini VOS服务器(13)如图7.5.15所示,出现Vendor/user定制的界面。图7.5.15 配置主菜单第7章嵌入式Mini VOS服务器(14)选择进入“Core Applications”菜单,选择其中的“enable console shell”项,如图7.5.16所示,并取消“agetty”项的选择(见图7.5.17),然后选择“Exit”,退回Main Menu。第7章嵌入式Mini VOS服务器图7.5.16 开启enable console shell功能第7章嵌入式Mini VOS服务器图7.5.17 取消agetty第7章嵌入式Mini VOS服务器(15)再进入“Filesystem Applications”菜单,取消“flatfsd”选项,见图7.5.18,然后选择“Exit”,退回Main Menu。第7章嵌入式Mini VOS服务器图7.5.18 Filesystem Applications菜单第7章嵌入式Mini VOS服务器(16)然后进入“Network Applications”菜单,取消“dhcpcd-new(2.0/2.4)”模块的选择,见图7.5.19,然后选择“Exit”,退回Main Menu。第7章嵌入式Mini VOS服务器图7.5.19 网络服务配置第7章嵌入式Mini VOS服务器(17)进入“BusyBox”菜单,选择“ping”选项,如图7.5.20所示,然后选择“Exit”,退回Main Menu。图7.5.20 “BusyBox”配置第7章嵌入式Mini VOS服务器(18)在Main Menu中选择退出,将出现图7.5.21所示的界面,选择“Yes”,保存vendor/user设置。图7.5.21 保存退出第7章嵌入式Mini VOS服务器(19)进行uClinux内核的编译工作时,首先建立依赖关系,即输入以下命令:make dep(20)对修改后的配置进行内核编译,即输入命令:make,若无错误出现,编译完成后,会在当前images目录下产生一个image.bin文件。(21)利用共享文件夹将image.bin复制到Windows主机中的EDK工程目录下。第7章嵌入式Mini VOS服务器(22)运行EDK并打开工程,选择Download Bitstream,将Bitstream下载到FPGA芯片上。(23)在EDK环境下,选择debug xmd,打开XMD窗口,输入命令:dow data image.bin 0 x22000000,见图7.5.22。其中0 x22000000是DDR内存的起始地址。第7章嵌入式Mini VOS服务器图7.5.22 下载uClinux操作系统第7章嵌入式Mini VOS服务器(24)输入命令:con 0 x22000000,CPU将开始启动uClinux操作系统(见图7.5.23)。此时在超级终端可看到启动过程,如图7.5.24所示。第7章嵌入式Mini VOS服务器图7.5.23 运行操作系统第7章嵌入式Mini VOS服务器图7.5.24 uClinux成功运行第7章嵌入式Mini VOS服务器7.6 LED驱动及驱动及VOS应用系统的加载应用系统的加载本节将介绍如何加载LED驱动及VOS应用系统。(1)设备驱动程序都置于/home/embed/uClinux-dist/linux-2.4.x/drivers子目录下,并按设备类型分类;LED驱动为字符型设备驱动,故需进入drivers下的char子目录,即输入以下命令:第7章嵌入式Mini VOS服务器cd /home/embed/uClinux-dist/linux-2.4.x/ddrivers/char(2)使用vim编译器,输入下列代码(代码内容不完全,可参考本章末的附代码或直接浏览本书配套光盘/Chapter7/Src/下的xup_spartan3e_led.c)。建立文件xup_spartan3e_led.c,即输入以下命令:第7章嵌入式Mini VOS服务器vim xup_spartan3e_led.c编译如下:#include#include#include#include static int led_major;static struct file_operations fop_devicename=第7章嵌入式Mini VOS服务器 /添加fops成员函数;static int_init led_init(void)led_major=register_chrdev(/填写参数列表,要求自动分配主设备号);if(led_major0)printk(KERN_ALERT LED initial failed!/n);return-1;第7章嵌入式Mini VOS服务器 printk(KERN_ALERT The LED major number is%dn,/要求返回主设备号);return 0;static void_exit led_exit(void)int led_unreg=unregister_chrdev(led_major,LED_TEST_1);if(led_unregls xup_spartan3e_led.*第7章嵌入式Mini VOS服务器(6)添加娱乐系统Web SERVER的相关应用程序。先将/chapter7/Src/src拷贝到d:share下,利用VMware的共享文件夹将/chapter7/Src/src下的相关程序拷贝到/home/embed/uClinux-dist/user/ping下,并输入以下命令:cp-r/mnt/hgfs/share/src /home/embed/uClinux-dist/user/ping(7)修改当前目录(/home/embed/uClinux-dist/linux-2.4.x/driver/char)的config.in文件,加入语句:tristateLEDCONFIG_DRIVER_LED,如图7.6.1所示,并保存退出。第7章嵌入式Mini VOS服务器图7.6.1 修改Config.in文件第7章嵌入式Mini VOS服务器(8)修改当前目录(/home/embed/uClinux-dist/linux-2.4.x/driver/char)的Makefile文件,如图7.6.2所示,加入以下语句:obj-$(CONFIG_DRIVER_LED)+=xup_spartan3e_led.o第7章嵌入式Mini VOS服务器图7.6.2 修改Makefile第7章嵌入式Mini VOS服务器(9)返回uClinux-dist目录。(10)清除上次的编译信息,重新启动编译菜单选项,即输入以下命令:make clean(11)进入图形配置界面,即输入以下命令:make menuconfig(12)图形配置界面的操作可参考7.5节中的uClinux配置,其中在完成7.5节步骤第7章嵌入式Mini VOS服务器 (8)(11)的基础上,不要忘记在进入Kernel Setting菜单时,因为我们现在需要添加驱动,所以要在该菜单下,按向下方向键在第二页中找到“Character devices”子菜单,进入字符设备的设定,见图7.6.3。第7章嵌入式Mini VOS服务器图7.6.3 “Character devices”子菜单第7章嵌入式Mini VOS服务器(13)根据自己设定的驱动名,将该项前标记设为“M”,表示将该驱动编译为模块。退出菜单保存设置,见图7.6.4。第7章嵌入式Mini VOS服务器图7.6.4 标记LED模块第7章嵌入式Mini VOS服务器(14)进入vendor/user界面,在完成7.5节步骤(14)(17)的基础上,再找到“Miscellaneous Applications”子菜单,在其中选中“mknod”选项,见图7.6.5;然后选中“zmodem utils”及它的两个子项“lrz(NEW)”和“lsz(NEW)”,见图7.6.6。然后点击“Exit”按钮,退回Main Menu。第7章嵌入式Mini VOS服务器图7.6.5 “Miscellaneous Applications”配置(一)第7章嵌入式Mini VOS服务器图7.6.6 “Miscellaneous Applications”配置(二)第7章嵌入式Mini VOS服务器(15)建立模块依赖关系并编译,即输入以下命令:make dep(16)对修改后的配置进行内核编译,即输入以下命令:make注:编译过程需要较长时间。第7章嵌入式Mini VOS服务器(17)检查编译结果是否有错误提示,没有则完成编译。根据Linux驱动设计任务中所提供的方法,将新生成的image.bin 和xup_spartan3e_led.o复制到EDK工程根目录下。因为7.5节最后复制过一个image.bin,所以此时复制会提示是否覆盖原文件,选择确定,然后继续下面的配置。(18)按照图7.6.7进行连接。第7章嵌入式Mini VOS服务器图7.6.7 系统连接图第7章嵌入式Mini VOS服务器(19)打开超级终端,使用EDK打开工程,并把Bitstream下载至开发板,使用XMD命令“dow data image.bin 0 x22000000”把image.bin下载到开发板的内存中,并在XMD上使用“con 0 x22000000”命令启动新内核。(20)在uClinux启动完成后,切换到/tmp目录,启动Zmodem接收文件。第7章嵌入式Mini VOS服务器在超级终端上输入以下命令:cd /tmplrz(21)在串口终端中选择传送发送文件,并选择已在前面生成的“xup_spartan3e_led.o”文件,“协议”选择为“Zmodem”,点击“发送”按钮,即可开始发送,见图7.6.8。等待传送完成后,在超级终端中可以输入检查命令:ls第7章嵌入式Mini VOS服务器图7.6.8 发送文件第7章嵌入式Mini VOS服务器(22)向内核注册xup_spartan3e_led模块,即输入命令:insmod./xup_spartan3e_led.o。通过输入命令:ls,查看是否有xup_spartan3e_led.o文件的存在,且可以观察Spartan-3E开发板上是否有LED灯闪亮,以确认是否已加载LED模块成功。第7章嵌入式Mini VOS服务器(23)配置FPGA的IP地址时,需要将主机的IP地址与FPGA的IP地址匹配在相同网段。例如,主机的IP地址为192.168.238.4,则可以将FPGA的IP地址分配为192.168.238.8(最后一位可以任意选择),即输入以下命令:ifconfig eth0 192.168.238.8(24)在PC Web浏览器中输入:http:/192.168.238.8/home/index.htm,就可以看到全部工程的最终结果。第7章嵌入式Mini VOS服务器7.7 源源 码码xup_spartan3e_led.c文件的完整代码如下:#include#include#include#include#include#include/struct semaphore第7章嵌入式Mini VOS服务器#include/timer_list/#include/wait_event_interruptible_timeout/#include/schedule_timeout#define XUP_SPARTAN3E_LED_MAJOR222#define XUP_SPARTAN3E_PLAY_MAJOR 223#define DATA_REG_ADDR0 x40000000#define DIRC_REG_ADDR0 x40000004第7章嵌入式Mini VOS服务器#define OutMem(OutAddr,Value)(*(volatile u32*)(OutAddr)=(Value)#define InMem(InputAddr)(*(volatile u32*)(InputAddr)#define DELAY(HZ3)#define INITIAL_COUNT 40#define XUP_SPARTAN3E_LED_IOC_MAGICx#define XUP_SPARTAN3E_LED_MAX_NUM4第7章嵌入式Mini VOS服务器#define XUP_SPARTAN3E_LED_SET_DIR_IOWR(XUP_SPARTAN3E_LED_IOC_MAGIC,0,u32)/ioctl#define XUP_SPARTAN3E_LED_SET_REV_IOWR(XUP_SPARTAN3E_LED_IOC_MAGIC,1,u32)/ioctlstatic int initial_count;static unsigned char led_state;static struct semaphore sem;/*mutual exclusion semaphore */static struct timer_list refresh_timer;第7章嵌入式Mini VOS服务器static void refresh(unsigned long ptr)if(refresh_timer.data=1)if(initial_count INITIAL_COUNT)if(led_state|0 x0)led_state=1;第7章嵌入式Mini VOS服务器elseled_state=1;initial_count=initial_count+1;else if(initial_count=INITIAL_COUNT)第7章嵌入式Mini VOS服务器if(led_state!=0 x01)led_state=1;elseled_state=0 x80;initial_count=initial_count+1;else第7章嵌入式Mini VOS服务器if(led_state=0 x0)led_state=0 xff;else if(led_state=0 xff)led_state=0 x0;elseled_state=0 x0;第7章嵌入式Mini VOS服务器OutMem(DATA_REG_ADDR,led_state);refresh_timer.expires=jiffies+DELAY;add_timer(&refresh_timer);else if(refresh_timer.data=2)OutMem(DATA_REG_ADDR,led_state);refresh_timer.expires=jiffies+DELAY2;add_timer(&refresh_timer);第7章嵌入式Mini VOS服务器else static int xled_open(struct inode*inode,struct file*file)MOD_INC_USE_COUNT;/printk(XUP_SPARTAN3E_LED open:Usage=%dn,MOD_IN_USE);return 0;static int xled_release(struct inode*inode,struct file*file)第7章嵌入式Mini VOS服务器MOD_DEC_USE_COUNT;/printk(XUP_SPARTAN3E_LED release:Usage=%dn,MOD_IN_USE);return 0;static ssize_t xled_read(struct file*file,char*buffer,size_t count,loff_t*ppos)down(&sem);第7章嵌入式Mini VOS服务器/led_state=inb(INPORT);/OutMem(DIRC_REG_ADDR,0 xFFFFFFFF);/set direction/barrier();/led_state=InMem(DATA_REG_ADDR);/printk(data=%x hexn,led_state);/for debugging onlyif(copy_to_user(buffer,&led_state,1)第7章嵌入式Mini VOS服务器printk(Read Data to user errorn);up(&sem);return-EFAULT;up(&sem);return 1;static ssize_t xled_write(struct file*file,const char*buf,size_t count,loff_t*ppos)第7章嵌入式Mini VOS服务器down(&sem);refresh_timer.data=0;if(copy_from_user(&led_state,_user(u8*)buf,1)/int ret=get_user(led_state,buf);/if(ret!=0)第7章嵌入式Mini VOS服务器printk(Write Data from user errorn);up(&sem);return-EFAULT;printk(Write Data from user%xn,led_state);up(&sem);/outb(data,OUTPORT);if(led_state=0 xAA)第7章嵌入式Mini VOS服务器refresh_timer.data=1;refresh(0);elserefresh_timer.data=2;refresh(0);return 1;第7章嵌入式Mini VOS服务器static int xled_ioctl(struct inode*inode,struct file*file,unsigned int cmd,unsigned long arg)if(MINOR(inode-i_rdev)=XUP_SPARTAN3E_LED_MAX_NUM)return-ENODEV;if(_IOC_TYPE(cmd)!=XUP_SPARTAN3E_LED_IOC_MAGIC)return-ENOTTY;switch(cmd)第7章嵌入式Mini VOS服务器case XUP_SPARTAN3E_LED_SET_DIR:OutMem(DIRC_REG_ADDR,arg);printk(Set XUP_SPARTAN3E_LEDdirect%ldn,arg);break;case XUP_SPARTAN3E_LED_SET_REV:;break;第7章嵌入式Mini VOS服务器default:return-ENOTTY;return 0;static ssize_t play_read(struct file*file,char*buffer,size_t count,loff_t*ppos)第7章嵌入式Mini VOS服务器down(&sem);/led_state=inb(INPORT);/OutMem(DIRC_REG_ADDR,0 xFFFFFFFF);/set direction/barrier();/led_state=InMem(DATA_REG_ADDR);/printk(data=%x hexn,led_state);/for debugging onlyif(copy_to_user(buffer,&led_state,1)第7章嵌入式Mini VOS服务器printk(Read Data to user errorn);up(&sem);return-EFAULT;up(&sem);return 1;第7章嵌入式Mini VOS服务器static ssize_t play_write(struct file*file,const char*buf,size_t count,loff_t*ppos)down(&sem);refresh_timer.data=0;if(copy_from_user(&led_state,_user(u8*)buf,1)/int ret=get_user(led_state,buf);/if(ret!=0)/if(copy_from_user(&led_state,
展开阅读全文