超群天晴

【原创】一步一步学ZedBoard & Zynq(六):在ZedBoard上运行linux并编写linux下的应用程序HelloWorld

0
阅读(11063)

从本小节开始,讲着重介绍Zedboard上的嵌入式linux应用,包括使用SDK设计最简单的linux应用程序、linux交叉编译环境搭建、设备驱动编写等内容。

本小节使用的linux系统是Digilent官方提供的OOB设计,它是Digilent官网给出的一个完整的、Zedboard可运行的linux系统,包含了Zedboard上的几个重要的设备驱动如串口、USB、以太网、OLED、HDMI等。当linux在Zedboard上运行起来后,Zedboard就是一个小型的嵌入式系统,使用SDK及Xilinx ARM Linux工具链编译生成的可执行文件可以在这个系统执行。

硬件平台:Digilent ZedBoard

开发环境:Windows XP 32 bit

软件:SDK 14.2

一、获取Zedboard可运行的linux

Digilent官网给出Zedboard的可运行linux设计ZedBoard_OOB_Design包,可从http://www.digilentinc.com/Data/Documents/Other/ZedBoard_OOB_Design.zip获取,下载后解压,可以看到包的结构和内容:

boot_image目录:
--system.bit– 配置FPGA的bit文件
--u-boot.elf– 引导linux需要的Second-Stage boot loader
--zynq_fsbl.elf– 配置ARM PS系统的First-Stage boot loader(FSBL)

doc目录:
--README.txt – 说明文件

hw目录:
-- EDK 14.1版本的XPS工程,用来生成硬件文件和bit文件

linux目录:
--devicetree_ramdisk.dts– 设备树源代码
--.config– Linux内核配置文件,用来生成zImage

sd_image目录:
--BOOT.BIN– 使用boot_images中的三个文件生成的Zynq配置文件
--devicetree_ramdisk.dtb– 编译后的设备树文件
--ramdisk8M.image.gz– 编译后的文件系统
--README– 介绍如何运行OOB设计的说明文档
--zImage– 编译后的内核

sw目录:
--硬件配置
--FSBL源代码

其中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-Boot2012.04.01-00297-gc319bf9-dirty (Sep132012-09:30:49)
2
3DRAM:512MiB
4WARNING:Caches not enabled
5MMC: SDHCI:0
6Using default environment
7
8In:serial
9Out:serial
10Err:serial
11Net: zynq_gemHit any key to stop autoboot:0
12Copying Linux from SD to RAM...
13Device:SDHCI
14Manufacturer ID:1b
15OEM:534d
16Name:00000
17Tran Speed:25000000
18Rd Block Len:512
19SD version1.0
20High Capacity:Yes
21Capacity:3.7GiB
22Bus Width:1-bit
23reading zImage
24
252479640bytesread
26reading devicetree_ramdisk.dtb
27
285817bytesread
29reading ramdisk8M.image.gz
30
313694108bytesread
32## Starting application at 0x00008000 ...
33Uncompressing Linux... done, booting the kernel.
34[0.000000] Booting Linux on physical CPU0
35[0.000000] Linux version3.3.0-digilent-12.07-zed-beta (tinghui.wang@DIGILENT_LINUX) (gcc version4.6.1(Sourcery CodeBench Lite2011.09-50) )#2 SMP PREEMPT Thu Jul 12 21:01:42 PDT 2012
36[0.000000] CPU: ARMv7 Processor [413fc090] revision0(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: mappingfor0xf8f00000at0xfe00c000out of vmalloc space
42[0.000000] BUG: mappingfor0xe0000000at0xfe000000out of vmalloc space
43[0.000000] BUG: mappingfor0xffff1000at0xfe200000out of vmalloc space
44[0.000000] PERCPU: Embedded7pages/cpu@c1489000s5696 r8192 d14784 u32768
45[0.000000] Built1zonelists in Zone order, mobility grouping on. Total pages:125824
46[0.000000] Kernel command line: console=ttyPS0,115200root=/dev/ram rw initrd=0x800000,8M earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=0
47[0.000000] PID hash table entries:2048(order:1,8192bytes)
48[0.000000] Dentry cache hash table entries:65536(order:6,262144bytes)
49[0.000000] Inode-cache hash table entries:32768(order:5,131072bytes)
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(4kB)
54[0.000000] fixmap :0xfff00000-0xfffe0000(896kB)
55[0.000000] vmalloc :0xe0800000-0xfd000000(456MB)
56[0.000000] lowmem :0xc0000000-0xe0000000(512MB)
57[0.000000] pkmap :0xbfe00000-0xc0000000(2MB)
58[0.000000] modules :0xbf000000-0xbfe00000(14MB)
59[0.000000] .text :0xc0008000-0xc042f040(4253kB)
60[0.000000] .init :0xc0430000-0xc0456640(154kB)
61[0.000000] .data :0xc0458000-0xc0485dc0(184kB)
62[0.000000] .bss :0xc0485de4-0xc049d734(95kB)
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.16BogoMIPS (lpj=7970816)
69[0.090000] pid_max: default:32768minimum:301
70[0.090000] Mount-cache hash table entries:512
71[0.090000] CPU: Testingwritebuffer coherency:ok
72[0.090000] CPU0: thread -1, cpu0,socket0, mpidr80000000
73[0.100000] smp_twd: clock not found: -2
74[0.100000] Calibratinglocaltimer...399.36MHz.
75[0.170000] hw perfevents: enabled with ARMv7 Cortex-A9 PMU driver,7counters available
76[0.170000] Setting up static identitymapfor0x2f8d48-0x2f8d7c
77[0.270000] CPU1:Booted secondary processor
78[0.310000] CPU1: thread -1, cpu1,socket0, mpidr80000001
79[0.310000] Brought up2CPUs
80[0.310000] SMP: Total of2processors activated (3188.32BogoMIPS).
81[0.320000] devtmpfs:initialized
82[0.320000] ------------[ cut here ]------------
83[0.320000] WARNING: at arch/arm/mm/dma-mapping.c:198consistent_init+0x70/0x104()
84[0.330000] Modules linked in:
85[0.330000] [] (unwind_backtrace+0x0/0xe0) from [] (warn_slowpath_common+0x4c/0x64)
86[0.340000] [] (warn_slowpath_common+0x4c/0x64) from [] (warn_slowpath_null+0x18/0x1c)
87[0.350000] [] (warn_slowpath_null+0x18/0x1c) from [] (consistent_init+0x70/0x104)
88[0.360000] [] (consistent_init+0x70/0x104) from [] (do_one_initcall+0x90/0x160)
89[0.360000] [] (do_one_initcall+0x90/0x160) from [] (kernel_init+0x84/0x128)
90[0.370000] [] (kernel_init+0x84/0x128) from [] (kernel_thread_exit+0x0/0x8)
91[0.380000] ---[ end trace 1b75b31a2719ed1c ]---
92[0.380000] ------------[ cut here ]------------
93[0.390000] WARNING: at arch/arm/mm/dma-mapping.c:198consistent_init+0x70/0x104()
94[0.390000] Modules linked in:
95[0.390000] [] (unwind_backtrace+0x0/0xe0) from [] (warn_slowpath_common+0x4c/0x64)
96[0.400000] [] (warn_slowpath_common+0x4c/0x64) from [] (warn_slowpath_null+0x18/0x1c)
97[0.410000] [] (warn_slowpath_null+0x18/0x1c) from [] (consistent_init+0x70/0x104)
98[0.420000] [] (consistent_init+0x70/0x104) from [] (do_one_initcall+0x90/0x160)
99[0.430000] [] (do_one_initcall+0x90/0x160) from [] (kernel_init+0x84/0x128)
100[0.430000] [] (kernel_init+0x84/0x128) from [] (kernel_thread_exit+0x0/0x8)
101[0.440000] ---[ end trace 1b75b31a2719ed1d ]---
102[0.440000] NET: Registered protocol family16
103[0.460000] L310 cache controller enabled
104[0.460000] l2x0:8ways, CACHE_ID0x410000c8, AUX_CTRL0x72060000, Cache size:524288B
105[0.460000] registering platform device'pl330'id0
106[0.470000] registering platform device'arm-pmu'id0
107[0.470000]
108[0.470000]###############################################
109[0.480000]##
110[0.480000]#Board ZED Init #
111[0.480000]##
112[0.490000]###############################################
113[0.490000]
114[0.500000] hw-breakpoint: found5(+1reserved) breakpoint and1watchpointregisters.
115[0.500000] hw-breakpoint: maximum watchpoint size is4bytes.
116[0.530000] xslcr xslcr.0: at0xF8000000mapped to0xE0808000
117[0.540000] bio: create slab 0> at0
118[0.540000] gpiochip_add: registered GPIOs0to245on device:xgpiops
119[0.540000] xgpiops e000a000.gpio: gpio at0xe000a000mapped to0xe080a000
120[0.550000] SCSI subsystem initialized
121[0.550000] usbcore:registered new interface driver usbfs
122[0.560000] usbcore:registered new interface driver hub
123[0.560000] usbcore:registered new device driver usb
124[0.570000] Advanced Linux Sound Architecture Driver Version1.0.24.
125[0.570000] Switching to clocksource xttcpss_timer1
126[0.590000] NET: Registered protocol family2
127[0.590000] IP route cache hash table entries:4096(order:2,16384bytes)
128[0.590000] TCP established hash table entries:16384(order:5,131072bytes)
129[0.600000] TCPbindhash table entries:16384(order:5,196608bytes)
130[0.600000] TCP: Hash tables configured (established16384bind16384)
131[0.610000] TCP reno registered
132[0.610000] UDP hash table entries:256(order:1,8192bytes)
133[0.620000] UDP-Lite hash table entries:256(order:1,8192bytes)
134[0.620000] NET: Registered protocol family1
135[0.630000] Trying tounpackrootfs image as initramfs...
136[0.630000] rootfs image is not initramfs (nocpio magic); looks like an initrd
137[0.670000] Freeing initrd memory:8192K
138[0.670000] xscugtimer xscugtimer.0: ioremap fe00c200 to e0810200 with size400
139[0.670000] pl330 dev0probe success
140[0.680000] msgmni has been set to972
141[0.680000] io scheduler noop registered
142[0.680000] io scheduler deadline registered
143[0.680000] io scheduler cfq registered (default)
144[0.690000] e000.690000] console [ttyPS0] enabled,bootconsole disabled
145[0.690000] console [ttyPS0] enabled,bootconsole disabled
146[0.700000] xdevcfg f8007000.devcfg: ioremap f8007000 to e0814000 with size1000
147[0.710000] [drm] Initialized drm1.1.020060810
148[0.720000] brd:module loaded
149[0.730000] loop:module loaded
150[0.730000] xqspips e000d000.qspi: at0xE000D000mapped to0xE0816000, irq=51
151[0.740000] GEM: BASEADDRESS hw: e000b000 virt:e0818000
152[0.740000] XEMACPS mii bus:probed
153[0.750000] eth0, pdev->id -1, baseaddr0xe000b000, irq54
154[0.750000] ehci_hcd: USB2.0'Enhanced'Host Controller (EHCI) Driver
155[0.760000] usb_hcd_xusbps_probe:NoOTG assigned!
156[0.760000] usb_hcd_xusbps_probe: OTG now assigned!
157[0.770000] xusbps-ehci xusbps-ehci.0:Xilinx PS USB EHCI Host Controller
158[0.770000] xusbps-ehci xusbps-ehci.0: new USB bus registered, assigned bus number1
159[0.810000] xusbps-ehci xusbps-ehci.0: irq53, io mem0x00000000
160[0.830000] xusbps-ehci xusbps-ehci.0: USB2.0started, EHCI1.00
161[0.830000] hub1-0:1.0:USB hub found
162[0.830000] hub1-0:1.0:1port detected
163[0.840000] Initializing USB Mass Storage driver...
164[0.840000] usbcore: registered new interface driver usb-storage
165[0.850000] USB Mass Storage support registered.
166[0.850000] Xilinx PS USB Device Controller driver (Apr01,2011)
167[0.860000] mousedev: PS/2mouse device commonforall mice
168[0.860000] Linux video capture interface: v2.00
169[0.870000] gspca_main: v2.14.0registered
170[0.870000] usbcore:registered new interface driver uvcvideo
171[0.870000] USB Video Class driver (1.1.1)
172[0.880000] WDT OF probe
173[0.880000] xwdtps f8005000.swdt: Xilinx Watchdog Timer at0xe081c000with timeout10seconds
174[0.890000] sdhci:Secure Digital Host Controller Interface driver
175[0.890000] sdhci:Copyright(c) Pierre Ossman
176[0.900000] sdhci-pltfm:SDHCI platform and OF driver helper
177[0.900000] mmc0: Invalid maximum block size, assuming512bytes
178[0.910000] mmc0: SDHCI controller on e0100000.sdhci [e0100000.sdhci] using ADMA
179[0.910000] usbcore:registered new interface driver usbhid
180[0.920000] usbhid:USB HID core driver
181[0.920000]Noconnectors reported connected with modes
182[0.930000] adv75110-0039: Failed to add route DAI IN->TMDS
183[0.940000] [drm] Cannot find any crtc or sizes -going 1024x768
184[0.940000] drivers/gpu/drm/analog/analog_drm_fbdev.c:analog_drm_fbdev_probe[241]
185[0.960000] asoc: adv7511 <-> 75c00000.axi-spdif-tx mapping ok
186[0.960000] axi-spdif 75c00000.axi-spdif-tx: Failed to set DAIformat: -22
187[0.980000] ALSA device list:
188[0.980000]#0: HDMI monitor
189[0.980000] TCP cubic registered
190[0.980000] NET: Registered protocol family17
191[0.980000] VFP support v0.3: implementor41architecture3part30variant9rev4
192[0.980000] Registering SWP/SWPB emulation handler
193[0.980000] registered taskstats version1
194[0.980000] drivers/rtc/hctosys.c: unable toopenrtc device (rtc0)
195[0.980000] Console:switching to colour frame buffer device 128x48
196[1.000000] mmc0: new high speed SDHC card at address0002
197[1.030000] fb0:frame buffer device
198[1.030000] mmcblk0: mmc0:0002000003.70GiB
199[1.040000] drm:registered panic notifier
200[1.040000] [drm] Initialized analog_drm1.0.020110530on minor0
201[1.050000] mmcblk0:p1
202[1.050000] RAMDISK: gzip image found at block0
203[1.310000] EXT4-fs (ram0): warning: mounting unchecked fs,running e2fsck is recommended
204[1.320000] EXT4-fs (ram0): mounted filesystem without journal. Opts:(null)
205[1.320000] VFS: Mounted root (ext4 filesystem) on device1:0.
206[1.330000] Freeing init memory:152K
207Starting rcS...
208++Mounting filesystem
209++Setting up mdev
210++ Configure static IP192.168.1.10
211[1.510000] GEM: lp->tx_bd ffdfb000 lp->tx_bd_dma 181a9000 lp->tx_skb d816b0c0
212[1.520000] GEM: lp->rx_bd ffdfc000 lp->rx_bd_dma 181a8000 lp->rx_skb d816b1c0
213[1.520000] GEM: MAC0x00350a00,0x00002201,00:0a:35:00:01:22
214[1.530000] GEM: phydev d8b81400, phydev->phy_id0x1410dd1, phydev->addr0x0
215[1.540000] eth0, phy_addr0x0, phy_id0x01410dd1
216[1.540000] eth0, attach [Marvell88E1510] phy driver
217++Starting telnet daemon
218++Starting http daemon
219++Starting ftp daemon
220++Starting dropbear (ssh) daemon
221++Starting OLED Display
222[1.580000] pmodoled-gpio-spi [zed_oled] SPI Probing
223[1.730000] usb1-1: new high-speed USB device number2using xusbps-ehci
224++ Exporting LEDs &SWs
225rcS Complete
226zynq>

至此,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, cpu1,socket0, mpidr80000001
[
0.310000] Brought up2CPUs

可以知道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 (Apr01,2011)
[
0.860000] mousedev: PS/2mouse device commonforall mice
[
0.860000] Linux video capture interface: v2.00
[
0.870000] gspca_main: v2.14.0registered
[
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
9
10intmain()
11{
12printf("HelloWorld!\n");
13printf("This is from Zedboard Linux!\n");
14printf("2012年11月8日16:43:22 by 超群天晴\n");
15return0;
16}

就是一个简单的从控制台输出helloworld信息。编译后生成了lab_6.elf可执行文件,将其拷贝到了U盘上。

三、运行linux可执行程序

将U盘连接到Zedboard,控制台会提示有USB device连接上,分配给这个设备的名称是sda1

1 zynq> [2263.970000] usb1-1: new high-speed USB device number2using xusbps-ehci
2[2264.120000] scsi0 : usb-storage1-1:1.0
3[2265.130000] scsi0:0:0:0: Direct-Access Generic Flash Disk8.07PQ:0ANSI:4
4[2265.140000] sd0:0:0:0: [sda]3932160512-byte logical blocks: (2.01GB/1.87GiB)
5[2265.140000] sd0:0:0:0: Attached scsi generic sg0 type0
6[2265.150000] sd0:0:0:0: [sda]WriteProtect is off
7[2265.150000] sd0:0:0:0: [sda]Writecache: disabled,readcache: 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
11zynq>

使用mount命令

mount /dev/sda1 /mnt/

将设备挂载到mnt目录下,

输入命令

cd /mnt

切换到mnt目录

输入命令

ls

可以看到目录下有我们刚刚生成的lab_6.elf可执行文件

输入命令

./lab_6.elf

运行,可以看到执行结果,控制台输出了我们需要的信息

===============================

Digilent官方OOB设计参考:http://www.digilentinc.com/Data/Documents/Other/ZedBoard_OOB_Design.zip

完整工程下载:lab_6.rar

Baidu
map