【再话ZedBoard】基于ZedBoard Linux应用设计
0赞在之前几节分别介绍了基于zynq的Linux启动所需文件的生成方法,本节则总结一下,在ZedBoard上实测一下Linux应用。
《基于zynq的交叉编译平台》:准备工作,建立交叉编译环境
《u-boot image生成》:生成u-boot文件(BOOT.BIN)
《Linux内核编译》:生成Linux内核镜像文件(zImage)
《设备树生成》:生成设备树文件(devicetree.dtb)
《基于zynq的Linux根文件系统生成》:生成根文件系统文件(ramdisk8M.image.gz)
Linux启动所需文件生成后信息如图1所示:
图1
将以上文件拷贝到SD卡中,ZedBoard上电,在串口终端中打印出的信息如下:
U-Boot 2012.04.01 (Jan 07 2013 - 13:42:00) DRAM: 512 MiB WARNING: Caches not enabled MMC: SDHCI: 0 Using default environment In: serial Out: serial Err: serial Net: zynq_gem Hit any key to stop autoboot: 0 Copying Linux from SD to RAM... Device: SDHCI Manufacturer ID: 12 OEM: 3456 Name: SMI Tran Speed: 25000000 Rd Block Len: 512 SD version 2.0 High Capacity: Yes Capacity: 3.7 GiB Bus Width: 4-bit reading zImage 2479640 bytes read reading devicetree.dtb 9648 bytes read reading ramdisk8M.image.gz 3694108 bytes read ## Starting application at 0x00008000 ... Uncompressing Linux... done, booting the kernel. [ 0.000000] Booting Linux on physical CPU 0 [ 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 [ 0.000000] CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=18c5387d [ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache [ 0.000000] Machine: Xilinx Zynq Platform, model: Xilinx Zynq ZED [ 0.000000] bootconsole [earlycon0] enabled [ 0.000000] Memory policy: ECC disabled, Data cache writealloc [ 0.000000] BUG: mapping for 0xf8f00000 at 0xfe00c000 out of vmalloc space [ 0.000000] BUG: mapping for 0xe0000000 at 0xfe000000 out of vmalloc space [ 0.000000] BUG: mapping for 0xffff1000 at 0xfe200000 out of vmalloc space [ 0.000000] PERCPU: Embedded 7 pages/cpu @c148b000 s5696 r8192 d14784 u32768 [ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 125824 [ 0.000000] Kernel command line: console=ttyPS0,115200 root=/dev/ram rw initrd=0x800000,8M earlyprintk rootwait devtmpfs.mount=1 [ 0.000000] PID hash table entries: 2048 (order: 1, 8192 bytes) [ 0.000000] Dentry cache hash table entries: 65536 (order: 6, 262144 bytes) [ 0.000000] Inode-cache hash table entries: 32768 (order: 5, 131072 bytes) [ 0.000000] Memory: 240MB 256MB = 496MB total [ 0.000000] Memory: 489848k/489848k available, 34440k reserved, 0K highmem [ 0.000000] Virtual kernel memory layout: [ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB) [ 0.000000] fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB) [ 0.000000] vmalloc : 0xe0800000 - 0xfd000000 ( 456 MB) [ 0.000000] lowmem : 0xc0000000 - 0xe0000000 ( 512 MB) [ 0.000000] pkmap : 0xbfe00000 - 0xc0000000 ( 2 MB) [ 0.000000] modules : 0xbf000000 - 0xbfe00000 ( 14 MB) [ 0.000000] .text : 0xc0008000 - 0xc042f040 (4253 kB) [ 0.000000] .init : 0xc0430000 - 0xc0456640 ( 154 kB) [ 0.000000] .data : 0xc0458000 - 0xc0485dc0 ( 184 kB) [ 0.000000] .bss : 0xc0485de4 - 0xc049d734 ( 95 kB) [ 0.000000] Preemptible hierarchical RCU implementation. [ 0.000000] Verbose stalled-CPUs detection is disabled. [ 0.000000] NR_IRQS:128 [ 0.000000] xlnx,ps7-ttc-1.00.a #0 at 0xe0800000, irq=43 [ 0.000000] Console: colour dummy device 80x30 [ 0.000000] Calibrating delay loop... 1332.01 BogoMIPS (lpj=6660096) [ 0.090000] pid_max: default: 32768 minimum: 301 [ 0.090000] Mount-cache hash table entries: 512 [ 0.090000] CPU: Testing write buffer coherency: ok [ 0.100000] CPU0: thread -1, cpu 0, socket 0, mpidr 80000000 [ 0.100000] smp_twd: clock not found: -2 [ 0.110000] Calibrating local timer... 333.57MHz. [ 0.170000] hw perfevents: enabled with ARMv7 Cortex-A9 PMU driver, 7 counters available [ 0.170000] Setting up static identity map for 0x2f8d48 - 0x2f8d7c [ 0.270000] CPU1: Booted secondary processor [ 0.360000] CPU1: thread -1, cpu 1, socket 0, mpidr 80000001 [ 0.360000] Brought up 2 CPUs [ 0.360000] SMP: Total of 2 processors activated (2664.03 BogoMIPS). [ 0.370000] devtmpfs: initialized [ 0.370000] ------------[ cut here ]------------ [ 0.380000] WARNING: at arch/arm/mm/dma-mapping.c:198 consistent_init+0x70/0x104() [ 0.380000] Modules linked in: [ 0.390000] [] (unwind_backtrace+0x0/0xe0) from [ ] (warn_slowpath_common+0x4c/0x64) [ 0.400000] [ ] (warn_slowpath_common+0x4c/0x64) from [ ] (warn_slowpath_null+0x18/0x1c) [ 0.410000] [ ] (warn_slowpath_null+0x18/0x1c) from [ ] (consistent_init+0x70/0x104) [ 0.420000] [ ] (consistent_init+0x70/0x104) from [ ] (do_one_initcall+0x90/0x160) [ 0.420000] [ ] (do_one_initcall+0x90/0x160) from [ ] (kernel_init+0x84/0x128) [ 0.430000] [ ] (kernel_init+0x84/0x128) from [ ] (kernel_thread_exit+0x0/0x8) [ 0.440000] ---[ end trace 1b75b31a2719ed1c ]--- [ 0.450000] ------------[ cut here ]------------ [ 0.450000] WARNING: at arch/arm/mm/dma-mapping.c:198 consistent_init+0x70/0x104() [ 0.460000] Modules linked in: [ 0.460000] [ ] (unwind_backtrace+0x0/0xe0) from [ ] (warn_slowpath_common+0x4c/0x64) [ 0.470000] [ ] (warn_slowpath_common+0x4c/0x64) from [ ] (warn_slowpath_null+0x18/0x1c) [ 0.480000] [ ] (warn_slowpath_null+0x18/0x1c) from [ ] (consistent_init+0x70/0x104) [ 0.490000] [ ] (consistent_init+0x70/0x104) from [ ] (do_one_initcall+0x90/0x160) [ 0.500000] [ ] (do_one_initcall+0x90/0x160) from [ ] (kernel_init+0x84/0x128) [ 0.510000] [ ] (kernel_init+0x84/0x128) from [ ] (kernel_thread_exit+0x0/0x8) [ 0.520000] ---[ end trace 1b75b31a2719ed1d ]--- [ 0.520000] NET: Registered protocol family 16 [ 0.540000] L310 cache controller enabled [ 0.540000] l2x0: 8 ways, CACHE_ID 0x410000c8, AUX_CTRL 0x72360000, Cache size: 524288 B [ 0.550000] registering platform device 'pl330' id 0 [ 0.550000] registering platform device 'arm-pmu' id 0 [ 0.560000] [ 0.560000] ############################################### [ 0.560000] # # [ 0.570000] # Board ZED Init # [ 0.570000] # # [ 0.580000] ############################################### [ 0.580000] [ 0.590000] hw-breakpoint: found 5 (+1 reserved) breakpoint and 1 watchpoint registers. [ 0.590000] hw-breakpoint: maximum watchpoint size is 4 bytes. [ 0.620000] xslcr xslcr.0: at 0xF8000000 mapped to 0xE0808000 [ 0.640000] bio: create slab at 0 [ 0.640000] gpiochip_add: registered GPIOs 0 to 245 on device: xgpiops [ 0.650000] xgpiops e000a000.ps7-gpio: gpio at 0xe000a000 mapped to 0xe080a000 [ 0.650000] SCSI subsystem initialized [ 0.660000] usbcore: registered new interface driver usbfs [ 0.660000] usbcore: registered new interface driver hub [ 0.670000] usbcore: registered new device driver usb [ 0.670000] Advanced Linux Sound Architecture Driver Version 1.0.24. [ 0.680000] Switching to clocksource xttcpss_timer1 [ 0.690000] NET: Registered protocol family 2 [ 0.690000] IP route cache hash table entries: 4096 (order: 2, 16384 bytes) [ 0.700000] TCP established hash table entries: 16384 (order: 5, 131072 bytes) [ 0.700000] TCP bind hash table entries: 16384 (order: 5, 196608 bytes) [ 0.710000] TCP: Hash tables configured (established 16384 bind 16384) [ 0.720000] TCP reno registered [ 0.720000] UDP hash table entries: 256 (order: 1, 8192 bytes) [ 0.730000] UDP-Lite hash table entries: 256 (order: 1, 8192 bytes) [ 0.730000] NET: Registered protocol family 1 [ 0.740000] Trying to unpack rootfs image as initramfs... [ 0.740000] rootfs image is not initramfs (no cpio magic); looks like an initrd [ 0.780000] Freeing initrd memory: 8192K [ 0.780000] xscugtimer xscugtimer.0: ioremap fe00c200 to e080c200 with size 400 [ 0.790000] pl330 dev 0 probe success [ 0.800000] msgmni has been set to 972 [ 0.800000] io scheduler noop registered [ 0.800000] io scheduler deadline registered [ 0.800000] io scheduler cfq registered (default) [ 0.810000] e0001?俽聮倐倐console [ttyPS0] enabled, bootconsole disabled [ 0.820000] console [ttyPS0] enabled, bootconsole disabled [ 0.820000] xdevcfg f8007000.ps7-dev-cfg: ioremap f8007000 to e0810000 with size 1000 [ 0.840000] [drm] Initialized drm 1.1.0 20060810 [ 0.850000] brd: module loaded [ 0.860000] loop: module loaded [ 0.860000] xqspips e000d000.ps7-qspi: at 0xE000D000 mapped to 0xE0812000, irq=51 [ 0.870000] GEM: BASEADDRESS hw: e000b000 virt: e0814000 [ 0.880000] XEMACPS mii bus: probed [ 0.880000] eth0, pdev->id -1, baseaddr 0xe000b000, irq 54 [ 0.890000] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver [ 0.890000] usb_hcd_xusbps_probe: No OTG assigned! [ 0.900000] usb_hcd_xusbps_probe: OTG now assigned! [ 0.900000] xusbps-ehci xusbps-ehci.0: Xilinx PS USB EHCI Host Controller [ 0.910000] xusbps-ehci xusbps-ehci.0: new USB bus registered, assigned bus number 1 [ 0.950000] xusbps-ehci xusbps-ehci.0: irq 53, io mem 0x00000000 [ 0.970000] xusbps-ehci xusbps-ehci.0: USB 2.0 started, EHCI 1.00 [ 0.970000] hub 1-0:1.0: USB hub found [ 0.980000] hub 1-0:1.0: 1 port detected [ 0.980000] Initializing USB Mass Storage driver... [ 0.980000] usbcore: registered new interface driver usb-storage [ 0.990000] USB Mass Storage support registered. [ 1.000000] Xilinx PS USB Device Controller driver (Apr 01, 2011) [ 1.000000] mousedev: PS/2 mouse device common for all mice [ 1.010000] Linux video capture interface: v2.00 [ 1.010000] gspca_main: v2.14.0 registered [ 1.020000] usbcore: registered new interface driver uvcvideo [ 1.020000] USB Video Class driver (1.1.1) [ 1.030000] sdhci: Secure Digital Host Controller Interface driver [ 1.030000] No connectors reported connected with modes [ 1.030000] [drm] Cannot find any crtc or sizes - going 1024x768 [ 1.040000] drivers/gpu/drm/analog/analog_drm_fbdev.c:analog_drm_fbdev_probe[241] [ 1.050000] sdhci: Copyright(c) Pierre Ossman [ 1.050000] sdhci-pltfm: SDHCI platform and OF driver helper [ 1.070000] usbcore: registered new interface driver usbhid [ 1.070000] usbhid: USB HID core driver [ 1.070000] adv7511 0-0039: Failed to add route DAI IN->TMDS [ 1.090000] Console: switching to colour frame buffer device 128x48 [ 1.090000] asoc: adv7511 <-> 75c00000.axi-spdif-tx mapping ok [ 1.090000] axi-spdif 75c00000.axi-spdif-tx: Failed to set DAI format: -22 [ 1.100000] ALSA device list: [ 1.100000] #0: HDMI monitor [ 1.100000] TCP cubic registered [ 1.100000] NET: Registered protocol family 17 [ 1.100000] VFP support v0.3: implementor 41 architecture 3 part 30 variant 9 rev 4 [ 1.100000] Registering SWP/SWPB emulation handler [ 1.160000] fb0: frame buffer device [ 1.160000] drm: registered panic notifier [ 1.160000] registered taskstats version 1 [ 1.160000] drivers/rtc/hctosys.c: unable to open rtc device (rtc0) [ 1.180000] RAMDISK: gzip image found at block 00110530 on minor 0 [ 1.490000] EXT4-fs (ram0): couldn't mount as ext3 due to feature incompatibilities [ 1.560000] EXT4-fs (ram0): mounting ext2 file system using the ext4 subsystem [ 1.560000] EXT4-fs (ram0): warning: mounting unchecked fs, running e2fsck is recommended [ 1.570000] EXT4-fs (ram0): mounted filesystem without journal. Opts: (null) [ 1.580000] VFS: Mounted root (ext2 filesystem) on device 1:0. [ 1.580000] devtmpfs: mounted [ 1.590000] Freeing init memory: 152K Starting rcS... ++ Mounting filesystem ++ Setting up mdev ++ Configure static IP 192.168.1.10 [ 1.800000] GEM: lp->tx_bd ffdfb000 lp->tx_bd_dma 18fd8000 lp->tx_skb d82011c0 [ 1.800000] GEM: lp->rx_bd ffdfc000 lp->rx_bd_dma 18fd9000 lp->rx_skb d82012c0 [ 1.810000] GEM: MAC 0x00350a00, 0x00002201, 00:0a:35:00:01:22 [ 1.820000] GEM: phydev d8b83800, phydev->phy_id 0x1410dd1, phydev->addr 0x0 [ 1.830000] eth0, phy_addr 0x0, phy_id 0x01410dd1 [ 1.830000] eth0, attach [Marvell 88E1510] phy driver ++ Starting telnet daemon ++ Starting http daemon ++ Starting ftp daemon ++ Starting dropbear (ssh) daemon ++ Starting OLED Display [ 1.880000] pmodoled-gpio-spi [zed_oled] SPI Probing ++ Exporting LEDs & SWs rcS Complete zynq>
以下介绍一下生成Linux应用,并且在ZedBooard执行:
在EDK中打开配置完的系统,然后点击Export Design打开SDK,如图2所示,选择Include bitstream and BMM file
图2
在SDK中新建xilinx c project,如图3所示。
图3
Target Software中选择Linux,则可以生成基于Linux的应用工程,选择Linux Hello World模板工程。
图4
修改Helloworld.c中代码,如下:
#includeBuild Project,在./Debug目录下生成.elf可执行文件,如图5所示int main() { printf("ZedBoard Test! - Hoki 2013.02.26\n"); return 0; }
图5
然后通过网口终端连接ZedBoard,首先需要将PC本地网卡IP修改为与ZedBoard同一段,通过ifconfig查看ZedBoard的IP为192.168.1.10,将PC的IP设置为192.168.1.11,如图6,连上网口,成功连接。
图6
通过FTP上传生成的.eif文件,并且执行,成功打印出信息,如图7所示,在第一次执行程序是被告知/bin/sh: ./linux_hello_world_0.elf: Permission denied,在网上搜索了些解决方法,是文件权限不够,先用chmod命令改变文件权限,然后.eif文件可正确执行了。
图7