ZynqLinux最小系统系列—— 4、Petalinux工程创建与编译以及烧写到FLASH(二)提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
- 写在前面
- 接上一篇
- 烧写FLASH
写在前面
ZynqLinux最小系统系列是我一个现学现写的系列帖子,写这个系列帖子并不代表我精通这个方面,相反在Linux驱动方面,我应该还是个菜鸟。如果各位看官你是高手了,可以给我提提建议,或者直接就不看了,如果你也是菜鸟,那么不妨看看学习的过程中有没有遇到相同的问题,可以借鉴的。总之,FPGA专业之外多进行扩展学习总是不会错的,也许哪天就有意想不到的效果。
虽然之前工作中搞过一点儿ZynqLinux,但时间越久越容易淡忘,分别有Petalinux和原生的Linux两种系统的搭建,后面将分别进行描述和记录
前面一篇说到出现了这个错误。我搜索帖子看看什么原因
并且以此做为一个引子,将接下来的工作完成,并更加深入的了解其配置过程。
首先,通过一段时间的学习,我了解到,配置FLASH启动,首先需要进行各个分区的镜像相关配置
输入指令:
petalinux-config --get-hw-description=.
选择下面红色方框的选项
然后弹出下面的界面:
(1) boot image
boot image 就包括了zynq_fsbl.elf、system.bit、u-boot.elf这几个文件的内容了,放到FLASH之前会转化成二进制bin文件,且名字叫BOOT.BIN
这个分区的名字叫做boot。
这里要将其设置为保存在flash中,如上图红色框框。
再这里我们大致估计一下这三个文件转化为二进制文件后的大小,因为后面还需要为分区进行空间分配
- System.bit 本身就是二进制文件了,5,980,160 字节(5840KB)
- u-boot.elf为3845KB,但同时还有一个u_boot.bin,想必应该就是u-boot.elf的二进制文件了,只有458,752 字节(448KB)
- 还有一个zynq_fsbl.elf为421KB,没有生成对应的bin文件,但通过u-boot.elf的二进制文件来推断,zynq_fsbl.elf变成二进制文件后大约也就50KB以内,约50,972字节。
- 5,980,160 + 458,752 + 50,972 = 6,489,884字节 = 63071C。这个数字和这个错误提示的字节数非常接近了
(2) bootenv
似乎没有用到,但看其他人的帖子说是不能删掉的,总之就是这么设置着了
(3) kernel
kernel image就是image.ub了,将放到命名为kernel的分区里面。
(4) jffs2 rootfs
这个就是文件系统了,文件系统的image名字和分区名字如下
kernel image就是image.ub了,将放到命名为kernel的分区里面。
添加文件系统后面专门会写,而且在写这篇文章的时候,我在文件系统如何烧写到FLASH中已经卡壳一段时间了,到现在还没有成功
(5) dtb image 暂时按照默认设置,没有专门为设备树设置个分区,但随着后面学习我觉得后面可能要独立出来,放到一个分区里面,方便以后更新设备树的操作(暂时认为是这样)】
【https://zhuanlan.zhihu.com/p/476561682】设备树扫盲
2、 接下来具体进行FLASH分区的配置
下一步:
这个是FLASH分区的默认情况:
基本和刚才Bootable images storage setting分区的设置能够对应的上。在默认情况下:
首先第0分区的名字是boot,大小是0x500000(字节)
第1分区的名字是bootenv,大小为0x20000(字节)
第2分区的名字是kernel,大小为0xA80000(字节)
这里默认只有三个分区。根据自己的实际情况进行分区的添加和大小的修改。
第0分区大小0x500000(字节) = 5,242,880字节。而之前那个报错信息表明BOOT.bin有0x63c640字节。因此,我们需要把0x500000改成0x700000,(保留点余量,应该还可以更小)。
第1分区大小保持不变
第2分区大小0xA80000(字节) = 11,010,048字节,而我们的image.ub也已经有9,973,760 字节了,浪费不多,也就不改了。
最终设置如下图:
Petalinux-build 之后,检查一下设备树
然后按照上一篇的方法生成BOOT.bin
就这里需要变一下
好了 ,这次总算是没有报错,正常生成了BOOT.bin
烧写FLASH的时候,需要制定fsbl文件。通过查阅一下文章,最方便的方法是在SDK上再建立一个FSBL的工程,并且把BootModeRegister 强制改成JTAG_MODE。这样的好处在于,启动模式的跳线帽可以固定在QSPI FLASH启动的方式,不用插拔到JTAG启动。因为这里直接屏蔽掉了对启动模式管脚的检测。
//BootModeRegister = Xil_In32(BOOT_MODE_REG); //BootModeRegister &= BOOT_MODES_MASK; BootModeRegister = JTAG_MODE;
这次烧写成功了
断电重启后,终端终于打印出了期望的内容
U-Boot 2020.01 (May 27 2022 - 16:41:23 +0000)
CPU: Zynq 7z030
Silicon: v3.1
DRAM: ECC disabled 512 MiB
Flash: 0 Bytes
NAND: 0 MiB
MMC: mmc@e0100000: 0
Loading Environment from SPI Flash... SF: Detected n25q256a with page size 256 Bytes, erase size 4 KiB, total 32 MiB
*** Warning - bad CRC, using default environment
In: serial@e0001000
Out: serial@e0001000
Err: serial@e0001000
Net:
ZYNQ GEM: e000b000, mdio bus e000b000, phyaddr -1, interface rgmii-id
Warning: ethernet@e000b000 using MAC address from DT
eth0: ethernet@e000b000
Hit any key to stop autoboot: 0
SF: Detected n25q256a with page size 256 Bytes, erase size 4 KiB, total 32 MiB
device 0 offset 0xfc0000, size 0x40000
SF: 262144 bytes @ 0xfc0000 Read: OK
QSPI: Trying to boot script at 0x3000000
## Executing script at 03000000
Wrong image format for "source" command
QSPI: SCRIPT FAILED: continuing...
JTAG: Trying to boot script at 0x3000000
## Executing script at 03000000
Wrong image format for "source" command
JTAG: SCRIPT FAILED: continuing...
Card did not respond to voltage select!
MMC Device 1 not found
no mmc device at slot 1
SF: Detected n25q256a with page size 256 Bytes, erase size 4 KiB, total 32 MiB
device 0 offset 0xfc0000, size 0x40000
SF: 262144 bytes @ 0xfc0000 Read: OK
QSPI: Trying to boot script at 0x3000000
## Executing script at 03000000
Wrong image format for "source" command
QSPI: SCRIPT FAILED: continuing...
no devices available
NAND: SCRIPT FAILED: continuing...
NOR: Trying to boot script at 0x3000000
## Executing script at 03000000
Wrong image format for "source" command
NOR: SCRIPT FAILED: continuing...
starting USB...
No working controllers found
USB is stopped. Please issue 'usb start' first.
starting USB...
No working controllers found
USB is stopped. Please issue 'usb start' first.
starting USB...
No working controllers found
ethernet@e000b000 Waiting for PHY auto negotiation to complete.........................................................................................................................ÿ
U-Boot 2018.01 (May 21 2022 - 19:53:10 -0700) Xilinx Zynq ZC702
Board: Xilinx Zynq
Silicon: v3.1
DRAM: ECC disabled 512 MiB
MMC: Card did not respond to voltage select!
mmc_init: -95, time 23
sdhci@e0100000 - probe failed: -95
Card did not respond to voltage select!
mmc_init: -95, time 24
SF: Detected n25q256 with page size 256 Bytes, erase size 4 KiB, total 32 MiB
*** Warning - bad CRC, using default environment
In: serial@e0001000
Out: serial@e0001000
Err: serial@e0001000
Board: Xilinx Zynq
Silicon: v3.1
Net: ZYNQ GEM: e000b000, phyaddr ffffffff, interface rgmii-id
eth0: ethernet@e000b000
U-BOOT for petalinux_boot_from_flash
ethernet@e000b000 Waiting for PHY auto negotiation to complete......... TIMEOUT !
Hit any key to stop autoboot: 0
Card did not respond to voltage select!
mmc_init: -95, time 23
** Bad device mmc 0 **
no mmc device at slot 0
Zynq> ÿÿ¥
U-Boot 2018.01 (May 28 2022 - 01:41:44 -0700) Xilinx Zynq ZC702
Board: Xilinx Zynq
Silicon: v3.1
DRAM: ECC disabled 512 MiB
MMC: Card did not respond to voltage select!
mmc_init: -95, time 22
sdhci@e0100000 - probe failed: -95
Card did not respond to voltage select!
mmc_init: -95, time 24
SF: Detected n25q256 with page size 256 Bytes, erase size 4 KiB, total 32 MiB
*** Warning - bad CRC, using default environment
In: serial@e0001000
Out: serial@e0001000
Err: serial@e0001000
Board: Xilinx Zynq
Silicon: v3.1
Net: ZYNQ GEM: e000b000, phyaddr ffffffff, interface rgmii-id
eth0: ethernet@e000b000
U-BOOT for petalinux_boot_from_flash3
ethernet@e000b000 Waiting for PHY auto negotiation to complete......... TIMEOUT !
Hit any key to stop autoboot: 0
SF: Detected n25q256 with page size 256 Bytes, erase size 4 KiB, total 32 MiB
device 0 offset 0x720000, size 0xa80000
SF: 11010048 bytes @ 0x720000 Read: OK
## Loading kernel from FIT Image at 10000000 ...
Using 'conf@system-top.dtb' configuration
Verifying Hash Integrity ... OK
Trying 'kernel@1' kernel subimage
Description: Linux kernel
Type: Kernel Image
Compression: gzip compressed
Data Start: 0x10000104
Data Size: 3937945 Bytes = 3.8 MiB
Architecture: ARM
OS: Linux
Load Address: 0x00008000
Entry Point: 0x00008000
Hash algo: sha1
Hash value: fcefa6cc321632d6962cbc3ce957e36185bb1906
Verifying Hash Integrity ... sha1+ OK
## Loading ramdisk from FIT Image at 10000000 ...
Using 'conf@system-top.dtb' configuration
Trying 'ramdisk@1' ramdisk subimage
Description: petalinux-user-image
Type: RAMDisk Image
Compression: gzip compressed
Data Start: 0x103c5258
Data Size: 6016354 Bytes = 5.7 MiB
Architecture: ARM
OS: Linux
Load Address: unavailable
Entry Point: unavailable
Hash algo: sha1
Hash value: 1212ec277a230917f6b1b5e98174f045bb3261e0
Verifying Hash Integrity ... sha1+ OK
## Loading fdt from FIT Image at 10000000 ...
Using 'conf@system-top.dtb' configuration
Trying 'fdt@system-top.dtb' fdt subimage
Description: Flattened Device Tree blob
Type: Flat Device Tree
Compression: uncompressed
Data Start: 0x103c18a0
Data Size: 14581 Bytes = 14.2 KiB
Architecture: ARM
Hash algo: sha1
Hash value: b2818abc6461aff7a10b9a2d42288575f40259fe
Verifying Hash Integrity ... sha1+ OK
Booting using the fdt blob at 0x103c18a0
Uncompressing Kernel Image ... OK
Loading Ramdisk to 07a43000, end 07fffd62 ... OK
Loading Device Tree to 07a3c000, end 07a428f4 ... OK
Starting kernel ...
Booting Linux on physical CPU 0x0
Linux version 4.14.0-xilinx-v2018.2 (oe-user@oe-host) (gcc version 7.2.0 (GCC)) #1 SMP PREEMPT Sat May 28 01:37:00 PDT 2022
CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=18c5387d
CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
OF: fdt: Machine model: xlnx,zynq-7000
bootconsole [earlycon0] enabled
Memory policy: Data cache writealloc
cma: Reserved 16 MiB at 0x1f000000
percpu: Embedded 16 pages/cpu @debc6000 s34764 r8192 d22580 u65536
Built 1 zonelists, mobility grouping on. Total pages: 130048
Kernel command line: console=ttyPS0,115200 earlyprintk
PID hash table entries: 2048 (order: 1, 8192 bytes)
Dentry cache hash table entries: 65536 (order: 6, 262144 bytes)
Inode-cache hash table entries: 32768 (order: 5, 131072 bytes)
Memory: 487180K/524288K available (6144K kernel code, 238K rwdata, 1560K rodata, 1024K init, 153K bss, 20724K reserved, 16384K cma-reserved, 0K highmem)
Virtual kernel memory layout:
vector : 0xffff0000 - 0xffff1000 ( 4 kB)
fixmap : 0xffc00000 - 0xfff00000 (3072 kB)
vmalloc : 0xe0800000 - 0xff800000 ( 496 MB)
lowmem : 0xc0000000 - 0xe0000000 ( 512 MB)
pkmap : 0xbfe00000 - 0xc0000000 ( 2 MB)
modules : 0xbf000000 - 0xbfe00000 ( 14 MB)
.text : 0xc0008000 - 0xc0700000 (7136 kB)
.init : 0xc0900000 - 0xc0a00000 (1024 kB)
.data : 0xc0a00000 - 0xc0a3b900 ( 239 kB)
.bss : 0xc0a3b900 - 0xc0a61e44 ( 154 kB)
Preemptible hierarchical RCU implementation.
RCU restricting CPUs from NR_CPUS=4 to nr_cpu_ids=2.
Tasks RCU enabled.
RCU: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=2
NR_IRQS: 16, nr_irqs: 16, preallocated irqs: 16
efuse mapped to e0800000
slcr mapped to e0802000
L2C: platform modifies aux control register: 0x72360000 -> 0x72760000
L2C: DT/platform modifies aux control register: 0x72360000 -> 0x72760000
L2C-310 erratum 769419 enabled
L2C-310 enabling early BRESP for Cortex-A9
L2C-310 full line of zeros enabled for Cortex-A9
L2C-310 ID prefetch enabled, offset 1 lines
L2C-310 dynamic clock gating enabled, standby mode enabled
L2C-310 cache controller enabled, 8 ways, 512 kB
L2C-310: CACHE_ID 0x410000c8, AUX_CTRL 0x76760001
zynq_clock_init: clkc starts at e0802100
Zynq clock init
sched_clock: 64 bits at 333MHz, resolution 3ns, wraps every 4398046511103ns
clocksource: arm_global_timer: mask: 0xffffffffffffffff max_cycles: 0x4ce07af025, max_idle_ns: 440795209040 ns
Switching to timer-based delay loop, resolution 3ns
clocksource: ttc_clocksource: mask: 0xffff max_cycles: 0xffff, max_idle_ns: 537538477 ns
timer #0 at e080a000, irq=17
Console: colour dummy device 80x30
Calibrating delay loop (skipped), value calculated using timer frequency.. 666.66 BogoMIPS (lpj=3333333)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
CPU: Testing write buffer coherency: ok
CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
Setting up static identity map for 0x100000 - 0x100060
Hierarchical SRCU implementation.
smp: Bringing up secondary CPUs ...
CPU1: thread -1, cpu 1, socket 0, mpidr 80000001
smp: Brought up 1 node, 2 CPUs
SMP: Total of 2 processors activated (1333.33 BogoMIPS).
CPU: All CPU(s) started in SVC mode.
devtmpfs: initialized
random: get_random_u32 called from bucket_table_alloc+0x1c4/0x204 with crng_init=0
VFP support v0.3: implementor 41 architecture 3 part 30 variant 9 rev 4
clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
futex hash table entries: 512 (order: 3, 32768 bytes)
pinctrl core: initialized pinctrl subsystem
random: fast init done
NET: Registered protocol family 16
DMA: preallocated 256 KiB pool for atomic coherent allocations
cpuidle: using governor menu
hw-breakpoint: found 5 (+1 reserved) breakpoint and 1 watchpoint registers.
hw-breakpoint: maximum watchpoint size is 4 bytes.
zynq-ocm f800c000.ocmc: ZYNQ OCM pool: 256 KiB @ 0xe0840000
zynq-pinctrl 700.pinctrl: zynq pinctrl initialized
e0000000.serial: ttyPS1 at MMIO 0xe0000000 (irq = 25, base_baud = 6249999) is a xuartps
e0001000.serial: ttyPS0 at MMIO 0xe0001000 (irq = 26, base_baud = 6249999) is a xuartps
`¬ʫ½±[ttyPS0] enabled
console [ttyPS0] enabled
bootconsole [earlycon0] disabled
bootconsole [earlycon0] disabled
ERROR: could not get clock /amba_pl/gpio@41200000:s_axi_aclk(0)
xilinx-gpio 41200000.gpio: Input clock not found
xilinx-gpio: probe of 41200000.gpio failed with error -2
vgaarb: loaded
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
media: Linux media interface: v0.10
Linux video capture interface: v2.00
pps_core: LinuxPPS API ver. 1 registered
pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti
PTP clock support registered
EDAC MC: Ver: 3.0.0
FPGA manager framework
fpga-region fpga-full: FPGA Region probed
Advanced Linux Sound Architecture Driver Initialized.
clocksource: Switched to clocksource arm_global_timer
NET: Registered protocol family 2
TCP established hash table entries: 4096 (order: 2, 16384 bytes)
TCP bind hash table entries: 4096 (order: 3, 32768 bytes)
TCP: Hash tables configured (established 4096 bind 4096)
UDP hash table entries: 256 (order: 1, 8192 bytes)
UDP-Lite hash table entries: 256 (order: 1, 8192 bytes)
NET: Registered protocol family 1
RPC: Registered named UNIX socket transport module.
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
Trying to unpack rootfs image as initramfs...
Freeing initrd memory: 5876K
hw perfevents: no interrupt-affinity property for /pmu@f8891000, guessing.
hw perfevents: enabled with armv7_cortex_a9 PMU driver, 7 counters available
workingset: timestamp_bits=30 max_order=17 bucket_order=0
jffs2: version 2.2. (NAND) (SUMMARY) © 2001-2006 Red Hat, Inc.
io scheduler noop registered
io scheduler deadline registered
io scheduler cfq registered (default)
io scheduler mq-deadline registered
io scheduler kyber registered
dma-pl330 f8003000.dmac: Loaded driver for PL330 DMAC-241330
dma-pl330 f8003000.dmac: DBUFF-128x8bytes Num_Chans-8 Num_Peri-4 Num_Events-16
brd: module loaded
loop: module loaded
m25p80 spi0.0: found n25q256a13, expected n25q512a
m25p80 spi0.0: n25q256a13 (32768 Kbytes)
4 ofpart partitions found on MTD device spi0.0
Creating 4 MTD partitions on "spi0.0":
0x000000000000-0x000000700000 : "boot"
0x000000700000-0x000000720000 : "bootenv"
0x000000720000-0x0000011a0000 : "kernel"
0x0000011a0000-0x000002000000 : "spare"
libphy: Fixed MDIO Bus: probed
CAN device driver interface
libphy: MACB_mii_bus: probed
macb e000b000.ethernet eth0: Cadence GEM rev 0x00020118 at 0xe000b000 irq 28 (00:0a:35:00:1e:53)
Marvell 88E1510 e000b000.ethernet-ffffffff:00: attached PHY driver [Marvell 88E1510] (mii_bus:phy_addr=e000b000.ethernet-ffffffff:00, irq=POLL)
e1000e: Intel(R) PRO/1000 Network Driver - 3.2.6-k
e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
ehci-pci: EHCI PCI platform driver
usbcore: registered new interface driver usb-storage
i2c /dev entries driver
IR NEC protocol handler initialized
IR RC5(x/sz) protocol handler initialized
IR RC6 protocol handler initialized
IR JVC protocol handler initialized
IR Sony protocol handler initialized
IR SANYO protocol handler initialized
IR Sharp protocol handler initialized
IR MCE Keyboard/mouse protocol handler initialized
IR XMP protocol handler initialized
cdns-wdt f8005000.watchdog: Xilinx Watchdog Timer at e0942000 with timeout 10s
EDAC MC: ECC not enabled
Xilinx Zynq CpuIdle Driver started
sdhci: Secure Digital Host Controller Interface driver
sdhci: Copyright(c) Pierre Ossman
sdhci-pltfm: SDHCI platform and OF driver helper
mmc0: SDHCI controller on e0100000.sdhci [e0100000.sdhci] using ADMA
ledtrig-cpu: registered to indicate activity on CPUs
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
fpga_manager fpga0: Xilinx Zynq FPGA Manager registered
NET: Registered protocol family 10
Segment Routing with IPv6
sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver
NET: Registered protocol family 17
can: controller area network core (rev 20170425 abi 9)
NET: Registered protocol family 29
can: raw protocol (rev 20170425)
can: broadcast manager protocol (rev 20170425 t)
can: netlink gateway (rev 20170425) max_hops=1
Registering SWP/SWPB emulation handler
hctosys: unable to open rtc device (rtc0)
of_cfs_init
of_cfs_init: OK
ALSA device list:
Freeing unused kernel memory: 1024K
INIT: version 2.88 booting
Starting udev
udevd[725]: starting version 3.2.2
udevd[726]: starting eudev-3.2.2
hwclock: can't open '/dev/misc/rtc': No such file or directory
Sat May 28 08:41:22 UTC 2022
hwclock: can't open '/dev/misc/rtc': No such file or directory
Starting internet superserver: inetd.
Configuring packages on first boot....
(This may take several minutes. Please do not power off the machine.)
Running postinst /etc/rpm-postinsts/100-sysvinit-inittab...
update-rc.d: /etc/init.d/run-postinsts exists during rc.d purge (continuing)
Removing any system startup links for run-postinsts ...
/etc/rcS.d/S99run-postinsts
INIT: Entering runlevel: 5
Configuring network interfaces... IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
udhcpc (v1.24.1) started
Sending discover...
Sending discover...
Sending discover...
No lease, forking to background
done.
Starting Dropbear SSH server: Generating key, this may take a while...
Public key portion is:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDpzaCxW43dWhRNBIw9aup9IYE46Xff94w8C3NB/MkIaWUf1ZK6GCGUpX9O/pXLWEI0zJP4rQbtUl5HSOojeekstycBQPHRbi1Q9rIG1GeWMXCpvb5/lF5vFRWvuHid9TCCc+HwGW4laLATg9wWyaZzicIrIHaFPz4Yydgzt7MlDttm7jTITasCAAEu/oenUMeM+Cx8vBZFYNcNiMH8Za/3CNC6zq64GdM/3IccCDYoGvbvV/XYfIKTmMR/2Yv4KgkJLZsyvgcXvhclSsJQZRc7vWbdmahZAiB3D4QYAed/uoc7pRg9TseU+6BM7bJsmV73Q+C9678wL4GCPIsRGciD root@petalinux_boot_from_flash3
Fingerprint: md5 60:a2:0c:dd:7f:14:09:9d:36:18:f9:67:8b:15:16:64
dropbear.
hwclock: can't open '/dev/misc/rtc': No such file or directory
Starting syslogd/klogd: done
Starting tcf-agent: OK
PetaLinux 2018.2 petalinux_boot_from_flash3 /dev/ttyPS0
petalinux_boot_from_flash3 login: root
Password:
root@petalinux_boot_from_flash3:~#
到达这一步,其实我已经折腾了好一段时间了,中间总是Kernel加载不起来,在不断的摸索下发现QSPI FLASH的内存分区,以及分区的设置是关键步骤。
但 这并不是最小系统就完成了,目前还没有一个保存在FLASH的文件系统,也就是说任何操作只要掉电后就不会保存在开发板中了,这肯定是不行的。下一篇准备写下我尝试把文件系统烧写到FLASH中,并遇到瓶颈的过程



