从本小节开始,讲着重介绍Zedboard上的嵌入式linux应用,包括使用SDK设计最简单的linux应用程序、linux交叉编译环境搭建、设备驱动编写等内容。 本小节使用的linux系统是Digilent官方提供的OOB设计,它是Digilent官网给出的一个完整的、Zedboard可运行的linux系统,包含了Zedboard上的几个重要的设备驱动如串口、USB、以太网、OLED、HDMI等。当linux在Zedboard上运行起来后,Zedboard就是一个小型的嵌入式系统,使用SDK及Xilinx ARM Linux工具链(arm-xilinx-linux-gnueabi)编译生成的可执行文件可以在这个系统执行。 本小节介绍的是使用SDK开发应用程序,并非在linux系统下使用arm-xilinx-linux-gnueabi。如果需要在linux系统下开发Zedboard上可执行程序,需要安装用arm-xilinx-linux-gnueabi编译环境。 更多更新请关注我的博客:@超群天晴 http://www.cnblogs.com/surpassal/
硬件平台:Digilent ZedBoard 开发环境:Windows XP 32 bit 软件: SDK 14.2
一、获取Zedboard可运行的linux Digilent官网给出Zedboard的可运行linux设计ZedBoard_OOB_Design包,可从http://www./Data/Documents/Other/ZedBoard_OOB_Design.zip获取,下载后解压,可以看到包的结构和内容: boot_image目录: doc目录: hw目录: linux目录: sd_image目录: sw目录: 其中sd_image目录中包含了ZedBoard上能够运行linux的所有文件。将SD卡格式化为Fat32,把sd_image目录文件拷贝到SD卡根目录下;然后将JP7~JP11设置为SD卡启动模式,将JP2短路,JP3断开,这样可以下一步我们可以把U盘作为USB 从设备挂载到Zedboard上。 Zedboard的连接和短路块设置 上电后,等待ARM PS的配置、FPGA的配置(蓝色LED DONE 亮起),之后开始引导Linux系统了。可以从超级终端上看到一系列的引导信息: 1 U-Boot 2012.04.01-00297-gc319bf9-dirty (Sep 13 2012 - 09:30:49) 2 3 DRAM: 512 MiB 4 WARNING: Caches not enabled 5 MMC: SDHCI: 0 6 Using default environment 7 8 In: serial 9 Out: serial 10 Err: serial 11 Net: zynq_gemHit any key to stop autoboot: 0 12 Copying Linux from SD to RAM... 13 Device: SDHCI 14 Manufacturer ID: 1b 15 OEM: 534d 16 Name: 00000 17 Tran Speed: 25000000 18 Rd Block Len: 512 19 SD version 1.0 20 High Capacity: Yes 21 Capacity: 3.7 GiB 22 Bus Width: 1-bit 23 reading zImage 24 25 2479640 bytes read 26 reading devicetree_ramdisk.dtb 27 28 5817 bytes read 29 reading ramdisk8M.image.gz 30 31 3694108 bytes read 32 ## Starting application at 0x00008000 ... 33 Uncompressing Linux... done, booting the kernel. 34 [ 0.000000] Booting Linux on physical CPU 0 35 [ 0.000000] Linux version 3.3.0-digilent-12.07-zed-beta (tinghui.wang@DIGILENT_LINUX) (gcc version 4.6.1 (Sourcery CodeBench Lite 2011.09-50) ) #2 SMP PREEMPT Thu Jul 12 21:01:42 PDT 2012 36 [ 0.000000] CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=18c5387d 37 [ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache 38 [ 0.000000] Machine: Xilinx Zynq Platform, model: Xilinx Zynq ZED 39 [ 0.000000] bootconsole [earlycon0] enabled 40 [ 0.000000] Memory policy: ECC disabled, Data cache writealloc 41 [ 0.000000] BUG: mapping for 0xf8f00000 at 0xfe00c000 out of vmalloc space 42 [ 0.000000] BUG: mapping for 0xe0000000 at 0xfe000000 out of vmalloc space 43 [ 0.000000] BUG: mapping for 0xffff1000 at 0xfe200000 out of vmalloc space 44 [ 0.000000] PERCPU: Embedded 7 pages/cpu @c1489000 s5696 r8192 d14784 u32768 45 [ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 125824 46 [ 0.000000] Kernel command line: console=ttyPS0,115200 root=/dev/ram rw initrd=0x800000,8M earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=0 47 [ 0.000000] PID hash table entries: 2048 (order: 1, 8192 bytes) 48 [ 0.000000] Dentry cache hash table entries: 65536 (order: 6, 262144 bytes) 49 [ 0.000000] Inode-cache hash table entries: 32768 (order: 5, 131072 bytes) 50 [ 0.000000] Memory: 240MB 256MB = 496MB total 51 [ 0.000000] Memory: 489856k/489856k available, 34432k reserved, 0K highmem 52 [ 0.000000] Virtual kernel memory layout: 53 [ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB) 54 [ 0.000000] fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB) 55 [ 0.000000] vmalloc : 0xe0800000 - 0xfd000000 ( 456 MB) 56 [ 0.000000] lowmem : 0xc0000000 - 0xe0000000 ( 512 MB) 57 [ 0.000000] pkmap : 0xbfe00000 - 0xc0000000 ( 2 MB) 58 [ 0.000000] modules : 0xbf000000 - 0xbfe00000 ( 14 MB) 59 [ 0.000000] .text : 0xc0008000 - 0xc042f040 (4253 kB) 60 [ 0.000000] .init : 0xc0430000 - 0xc0456640 ( 154 kB) 61 [ 0.000000] .data : 0xc0458000 - 0xc0485dc0 ( 184 kB) 62 [ 0.000000] .bss : 0xc0485de4 - 0xc049d734 ( 95 kB) 63 [ 0.000000] Preemptible hierarchical RCU implementation. 64 [ 0.000000] Verbose stalled-CPUs detection is disabled. 65 [ 0.000000] NR_IRQS:128 66 [ 0.000000] xlnx,ps7-ttc-1.00.a #0 at 0xe0800000, irq=43 67 [ 0.000000] Console: colour dummy device 80x30 68 [ 0.000000] Calibrating delay loop... 1594.16 BogoMIPS (lpj=7970816) 69 [ 0.090000] pid_max: default: 32768 minimum: 301 70 [ 0.090000] Mount-cache hash table entries: 512 71 [ 0.090000] CPU: Testing write buffer coherency: ok 72 [ 0.090000] CPU0: thread -1, cpu 0, socket 0, mpidr 80000000 73 [ 0.100000] smp_twd: clock not found: -2 74 [ 0.100000] Calibrating local timer... 399.36MHz. 75 [ 0.170000] hw perfevents: enabled with ARMv7 Cortex-A9 PMU driver, 7 counters available 76 [ 0.170000] Setting up static identity map for 0x2f8d48 - 0x2f8d7c 77 [ 0.270000] CPU1: Booted secondary processor 78 [ 0.310000] CPU1: thread -1, cpu 1, socket 0, mpidr 80000001 79 [ 0.310000] Brought up 2 CPUs 80 [ 0.310000] SMP: Total of 2 processors activated (3188.32 BogoMIPS). 81 [ 0.320000] devtmpfs: initialized 82 [ 0.320000] ------------[ cut here ]------------ 83 [ 0.320000] WARNING: at arch/arm/mm/dma-mapping.c:198 consistent_init+0x70/0x104() 84 [ 0.330000] Modules linked in: 85 [ 0.330000] [ 至此,linux已经在Zedboard上启动起来。从超级终端输出的信息我们打开可以知道,“这个”linux系统的一些基本情况,如8~10行 In: serial Out: serial Err: serial 输入输出调试信息使用的都是serial,即串口,这里是超级终端,因而超级终端就如同linux系统下的控制台,我们可以键入linux的命令对系统进行操作,例如输入ls命令,可以显示当前目录内容: 其他命令如cd、mkdir、cp、rm等基本命令均可以执行。 77~79行提示信息 [ 0.270000] CPU1: Booted secondary processor [ 0.310000] CPU1: thread -1, cpu 1, socket 0, mpidr 80000001 [ 0.310000] Brought up 2 CPUs 可以知道ARM PS的两个CPU均被启动 再如163~171行 [ 0.840000] Initializing USB Mass Storage driver... [ 0.840000] usbcore: registered new interface driver usb-storage [ 0.850000] USB Mass Storage support registered. [ 0.850000] Xilinx PS USB Device Controller driver (Apr 01, 2011) [ 0.860000] mousedev: PS/2 mouse device common for all mice [ 0.860000] Linux video capture interface: v2.00 [ 0.870000] gspca_main: v2.14.0 registered [ 0.870000] usbcore: registered new interface driver uvcvideo [ 0.870000] USB Video Class driver (1.1.1) 可以知道大容量USB设备驱动已经安装,包括PS USB设备等驱动均安装了,因此可以使用U盘、USB键盘、鼠标、摄像头等设备。 二、使用SDK设计linux应用程序 接下来我们就可以像其他的嵌入式linux开发一样来使用Zedboard了。SDK提供了标准可视化的linux-arm交叉编译链,不需要再进行交叉编译环境的搭建。 启动SDK,new->C project,选择工程类型为“Xilinx ARM Linux Executable”,工具链为“Xilinx ARM GNU/Linux Toolchain” 在工程配置选项中,去掉Debug(因为我们不需要进行调试),只保留Release
工程建立后好,新建main.c文件,修改内容如下: 1 /* 2 * hello.c 3 * 4 * Created on: 2012-11-8 5 * @超群天晴 http://www.cnblogs.com/surpassal/ 6 */ 7 8 #include 就是一个简单的从控制台输出helloworld信息。编译后生成了lab_6.elf可执行文件,将其拷贝到了U盘上。 三、运行linux可执行程序 将U盘连接到Zedboard,控制台会提示有USB device连接上,分配给这个设备的名称是sda1 1 zynq> [ 2263.970000] usb 1-1: new high-speed USB device number 2 using xusbps-ehci 2 [ 2264.120000] scsi0 : usb-storage 1-1:1.0 3 [ 2265.130000] scsi 0:0:0:0: Direct-Access Generic Flash Disk 8.07 PQ: 0 ANSI: 4 4 [ 2265.140000] sd 0:0:0:0: [sda] 3932160 512-byte logical blocks: (2.01 GB/1.87GiB) 5 [ 2265.140000] sd 0:0:0:0: Attached scsi generic sg0 type 0 6 [ 2265.150000] sd 0:0:0:0: [sda] Write Protect is off 7 [ 2265.150000] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA 8 [ 2265.170000] sda: sda1 9 [ 2265.180000] sd 0:0:0:0: [sda] Attached SCSI removable disk 10 11 zynq> 使用mount命令 mount /dev/sda1 /mnt/ 将设备挂载到mnt目录下, 输入命令 cd /mnt 切换到mnt目录 输入命令 ls 可以看到目录下有我们刚刚生成的lab_6.elf可执行文件 输入命令 ./lab_6.elf 运行,可以看到执行结果,控制台输出了我们需要的信息
=============================== Digilent官方OOB设计参考:http://www./Data/Documents/Other/ZedBoard_OOB_Design.zip 完整工程下载:lab_6.rar
评论#1楼 2012-11-15 22:30 徘徊的路人甲
你好 我是把可执行文件通过ftp传到板子上的,但是执行时显示permission denied,麻烦可以解释一下这是什么情况吗?谢谢
#2楼[楼主] 2012-11-15 22:33 超群天晴
@徘徊的路人甲
http://pic./face/u204306.jpg
chmod修改下属性 777 就行了
#3楼 2012-11-15 22:44 徘徊的路人甲
@超群天晴
谢谢了,新手刚刚接触linux命令还不太熟悉,用ls -al看了确实是权限的问题,我现在是想在这个上面弄一个简单的web服务器,原来参考别人的在8962上做过,在这个板子上没什么思路,可以略微指点一下可行的方向吗?谢谢
#4楼 2012-11-17 21:54 libing64
我使用SDK建立工程之后,Linux版的Hello World,但是立刻就报错
请问你装完SDK之后,又安装了别的东西吗? **** Build of configuration Debug for project linux_hello_world_2 **** make all Building file: ../src/helloworld.c Invoking: ARM Linux gcc compiler arm-xilinx-linux-gnueabi-gcc -Wall -O0 -g3 -c -fmessage-length=0 -MMD -MP -MF"src/helloworld.d" -MT"src/helloworld.d" -o"src/helloworld.o" "../src/helloworld.c" 'arm-xilinx-linux-gnueabi-gcc' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 make: *** [src/helloworld.o] 错误 1
#5楼[楼主] 2012-11-17 23:03 超群天晴
@libing64
http://pic./face/u204306.jpg
我没有安装其他的。你的错误是没有找到编译器gcc,你查看一下你的build设置,如果没有arm-xilinx-linux-gnueabi-gcc,可能需要重装一下SDK了
#6楼 2012-11-18 10:44 libing64
@超群天晴
我突然想起来了,最初装的的时候不知道EABI是啥,就勾掉了。。。
#7楼 2012-11-18 11:50 libing64
好使了,把EMBI那一项装上就好使了~
#8楼 2012-12-06 12:01 七联圩
我是在ubuntu下安装的ISE14.3的linux版本,安装后在安装目录下。。/EDK/gnu里没有arm这个文件夹,在windows下安装时也出现这个问题,后来sdk编译就报错找不到arm-xilinx-gcc,后来原因找到了,是因为安装源文件目录有中文或空格,重新装了就没问题了,现在ubuntu下光盘安装,确定安装目录无中文和空格,又出现这个问题了,sdk编译出现如下错误和警告,怎么解决啊,我装程序是没有让勾选EABI这一个步骤
Description Resource Path Location Type gmake[1]: *** [libs] 错误 127 standalone_bsp C/C++ Problem gmake[1]: *** [standalone_libs] 错误 127 standalone_bsp C/C++ Problem make: *** [ps7_cortexa9_0/lib/libxil.a] 错误 2 standalone_bsp C/C++ Problem make: *** [src/ddr_init.o] 错误 127 zynq_fsbl C/C++ Problem Error launching external scanner info generator (arm-xilinx-eabi-gcc -E -P -v -dD /home/owner/zynq_base_trd_14_2_up1/swa/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c) zynq_fsbl Unknown C/C++ Problem Error launching external scanner info generator (arm-xilinx-eabi-gcc -E -P -v -dD /home/owner/zynq_base_trd_14_2_up1/swa/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c) zynq_fsbl Unknown C/C++ Problem Error launching external scanner info generator (arm-xilinx-eabi-gcc -E -P -v -dD /home/owner/zynq_base_trd_14_2_up1/swa/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c) zynq_fsbl Unknown C/C++ Problem
#9楼[楼主] 2012-12-06 15:39 超群天晴
@七联圩
http://pic./face/u204306.jpg
linux下的ise我没安装过 没有EABI这一项吗?这种问题你试试重装ise试试吧 没什么太好的建议。欢迎把你的问题解决办法再反馈给我,这样其他人遇到了也能解决了
#10楼 2012-12-06 17:33 七联圩
恩,解决了,是arm-xilinx-eabi-gcc这个交叉编译器没装,不知道为什么不是自动安装,windows下是在哦的安装的。在安装源文件下的CodeSource/lin里有两个,一个是arm-xilinx-eabi-gcc,还有一个是arm-xilinx-linux-gnueabi-gcc的,自己重新安装了一下就解决了
#11楼 2012-12-13 17:54 夕阳红醉
你好 我想使用ARM来加载.bit 文件到PL逻辑
主要是希望使用网络来动态的的配置PL。其实现在用SD卡加载含有硬件逻辑的BIN ARM就是在FSBL程序里 使用PCAP接口来配置PL的,不过那段代码还没看的太懂。。。 不知道你对这方面了解不 不管是使用片上linux里官方提供的小工具也好 还是直接在standalong 程序里实现也行,只要让我能随时加载.bit文件就行了
#12楼 2012-12-21 21:47 woshivbn
晴天大大好!~ 我之前有和您交流过哈。之前的问题都一概解决了。现在我想调试网口,就是实现arm和pc机之间通过网口进行数据通信。要怎么做呢? 我想加入linux系统,直接在超级终端下输入命令可以吗?对于linux 我是个菜。所以见谅哈。
#13楼[楼主] 2012-12-21 22:01 超群天晴
@woshivbn
http://pic./face/u204306.jpg
可以的。两个linux的PC之间怎么同学 zed就可以和pc怎么通信
#14楼 2012-12-21 22:25 woshivbn
@超群天晴
额 您理解错了哈。 我的意思就是网口和PC机直接通信。 进行数据传输。能给点指导吗 跪谢!~~
#15楼 2012-12-21 22:29 woshivbn
@超群天晴
额 我详细说一下吧。 我最后想实现的功能是网口和PC机进行通信,然后是千兆网模式。 我想用的方法是在sd卡里面植入linux系统,然后开机自动运行,插上网线,网口自动配置。 然后我在超级终端里面键入linux的一些关于网口的操作命令进行数据的发送,这样的做法可行吗? 因为我对于linux命令完全不懂,所以不知道大大能不能给个小建议或者什么的。
#16楼[楼主] 2012-12-21 22:59 超群天晴
@woshivbn
http://pic./face/u204306.jpg
“超级终端里面键入linux的一些关于网口的操作命令进行数据的发送” 可行的
#17楼[楼主] 2012-12-21 23:08 超群天晴
@woshivbn
http://pic./face/u204306.jpg
ifconfig配置完IP后 就可以和PC通信 发送数据包了 。如果要写应用程序,就得编写C代码了。命令你可以上网找一些
#18楼 2012-12-22 09:53 woshivbn
@超群天晴
谢谢哈~我先linux 调试下,最后写应用程序。再次谢谢大大
#19楼 2012-12-26 16:56 迷途的羊
楼主我也想实现和pc通过网口进行数据传输,我可以用socket网络编程来实现么,我试了下。但编译的时候出现以下错误:
make all Building target: eth.elf Invoking: ARM Linux gcc linker arm-xilinx-linux-gnueabi-gcc -o"eth.elf" ./main.o d:/xilinx/14.1/ise_ds/edk/gnu/arm/nt/bin/../arm-xilinx-linux-gnueabi/libc/usr/lib/crt1.o: In function `_start': init.c:(.text+0x34): undefined reference to `main' collect2: ld returned 1 exit status make: *** [eth.elf] 错误 1 楼主能帮我分析是下什么原因吗?
#20楼 2013-03-12 22:12 puckpuck
@超群天晴
u盘读不出来 [ 223.070000] sd 1:0:0:0: [sda] Assuming drive cache: write through [ 223.080000] sd 1:0:0:0: [sda] No Caching mode page present [ 223.090000] sd 1:0:0:0: [sda] Assuming drive cache: write through [ 223.100000] sd 1:0:0:0: [sda] No Caching mode page present [ 223.100000] sd 1:0:0:0: [sda] Assuming drive cache: write through 这是什么原因啊
#21楼 2013-03-12 22:12 puckpuck
usb那个驱动启动正常
#22楼 2013-03-12 22:57 puckpuck
没挂上。。。晕
#23楼 2013-04-19 14:58 dragen1860
#24楼 2013-05-15 15:20 qiaomei1986
菜鸟弱弱问一下,裸奔的程序和linux下的驱动程序有什么关联吗?
#25楼[楼主]26812022013/5/15 16:00:52 2013-05-15 16:00 超群天晴
@qiaomei1986 使用外设模块就得编写驱动程序,跑算法不需要驱动,和裸机程序一样,只不过gcc不一样 |
|