环境介绍
Win7 64 + Vmware 11 + ubuntu14.04 32
u-boot 版本:u-boot-2015-04
Linux kernel版本:linux-3.16.y
busybox版本:1_24_stable
交叉编译工具链:arm-linux-gnueabi-
qemu版本:stable-2.4
目的
本博文的目的是使用设备树来启动内核,这里有两种设备树传参方案,第一种是用u-boot,第二种是直接用Qemu启动kernel,然后在Qemu的命令行参数中利用-dtb将设备树文件传递过去。
关于设备树可以参考一下:http://www.cnblogs.com/pengdonglin137/p/4495056.html
步骤
1、配置u-boot
vexpress-a9的u-boot默认已经支持设备树了。
2、配置内核
vexpress-a9的kernel默认也已经支持了。
3、编译设备树
在内核源码根目录下执行如下命令:
make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm O=./out_vexpress_3_16 dtbs
然后会在out_vexpress_3_16/arch/arm/boot/dts/下生产如下几个文件
vexpress-v2p-ca15_a7.dtb vexpress-v2p-ca15-tc1.dtb vexpress-v2p-ca5s.dtb vexpress-v2p-ca9.dtb
这里我们用vexpress-v2p-ca9.dtb,然后将其拷贝到/tftpboot下面
cp out_vexpress_3_16/arch/arm/boot/dts/vexpress-v2p-ca9.dtb /tftpboot/dtb
4、测试
执行如下命令
qemu-system-arm -M vexpress-a9 \ -kernel /root/tq2440_work/u-boot/u-boot/u-boot \ -nographic \ -m 512M \ -net nic,vlan=0 -net tap,vlan=0,ifname=tap0 \ -sd /root/tq2440_work/busybox_study/a9rootfs.ext3
然后进入u-boot命令行模式,执行如下命令
setenv bootargs 'root=/dev/mmcblk0 console=ttyAMA0' tftp 0x60003000 uImage tftp 0x60500000 dtb bootm 0x60003000 - 0x60500000
下面是启动信息:
U-Boot 2015.07-rc3-00092-gf3edfd3-dirty (Dec 05 2015 - 23:20:40 -0800) DRAM: 512 MiB WARNING: Caches not enabled Flash: 128 MiB MMC: MMC: 0
*** Warning - bad CRC, using default environment In: serial Out: serial Err: serial Net: smc911x-0 Warning: smc911x-0 using MAC address from net device Hit any key to stop autoboot: 0 VExpress# setenv bootargs 'root=/dev/mmcblk0 console=ttyAMA0' VExpress# tftp 0x60003000 uImage smc911x: MAC 52:54:00:12:34:56 smc911x: detected LAN9118 controller smc911x: phy initialized smc911x: MAC 52:54:00:12:34:56 Using smc911x-0 device TFTP from server 192.168.11.20; our IP address is 192.168.11.5 Filename 'uImage'. Load address: 0x60003000 Loading: ################################################################# ################################################################# ################################################################# ################################ 698.2 KiB/s done Bytes transferred = 3329328 (32cd30 hex) smc911x: MAC 52:54:00:12:34:56 VExpress# tftp 0x60500000 dtb smc911x: MAC 52:54:00:12:34:56 smc911x: detected LAN9118 controller smc911x: phy initialized smc911x: MAC 52:54:00:12:34:56 Using smc911x-0 device TFTP from server 192.168.11.20; our IP address is 192.168.11.5 Filename 'dtb'. Load address: 0x60500000 Loading: # 971.7 KiB/s done Bytes transferred = 12941 (328d hex) smc911x: MAC 52:54:00:12:34:56 VExpress# bootm 0x60003000 - 0x60500000 ## Booting kernel from Legacy Image at 60003000 ... Image Name: Linux-3.16.7 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 3329264 Bytes = 3.2 MiB Load Address: 60003000 Entry Point: 60003000 Verifying Checksum ... OK ## Flattened Device Tree blob at 60500000 Booting using the fdt blob at 0x60500000 Loading Kernel Image ... OK Loading Device Tree to 7fee2000, end 7fee828c ... OK Starting kernel ... Booting Linux on physical CPU 0x0 Initializing cgroup subsys cpuset Linux version 3.16.7 (root@ubuntu) (gcc version 4.7.3 (Ubuntu/Linaro 4.7.3-12ubuntu1) ) #6 SMP Sun Dec 6 00:12:00 PST 2015 CPU: ARMv7 Processor [410fc090] revision 0 (ARMv7), cr=10c53c7d CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache Machine model: V2P-CA9 Memory policy: Data cache writeback CPU: All CPU(s) started in SVC mode. PERCPU: Embedded 7 pages/cpu @9ffcf000 s7552 r8192 d12928 u32768 Built 1 zonelists in Zone order, mobility grouping on. Total pages: 130048 Kernel command line: root=/dev/mmcblk0 console=ttyAMA0 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: 513148K/524288K available (4567K kernel code, 191K rwdata, 1292K rodata, 239K init, 149K bss, 11140K reserved) Virtual kernel memory layout: vector : 0xffff0000 - 0xffff1000 ( 4 kB) fixmap : 0xffc00000 - 0xffe00000 (2048 kB) vmalloc : 0xa0800000 - 0xff000000 (1512 MB) lowmem : 0x80000000 - 0xa0000000 ( 512 MB) modules : 0x7f000000 - 0x80000000 ( 16 MB) .text : 0x80008000 - 0x805c1238 (5861 kB) .init : 0x805c2000 - 0x805fdd80 ( 240 kB) .data : 0x805fe000 - 0x8062dc20 ( 192 kB) .bss : 0x8062dc28 - 0x806533ec ( 150 kB) SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1 Hierarchical RCU implementation. RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=4. RCU: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=4 NR_IRQS:16 nr_irqs:16 16 GIC CPU mask not found - kernel will fail to boot. GIC CPU mask not found - kernel will fail to boot. sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 178956969942ns Console: colour dummy device 80x30 Calibrating delay loop... 398.13 BogoMIPS (lpj=1990656) 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 0x60455850 - 0x604558a8 CPU1: failed to boot: -38 CPU2: failed to boot: -38 CPU3: failed to boot: -38 Brought up 1 CPUs SMP: Total of 1 processors activated. CPU: All CPU(s) started in SVC mode. devtmpfs: initialized VFP support v0.3: implementor 41 architecture 3 part 30 variant 9 rev 0 regulator-dummy: no parameters NET: Registered protocol family 16 DMA: preallocated 256 KiB pool for atomic coherent allocations cpuidle: using governor ladder cpuidle: using governor menu of_amba_device_create(): amba_device_add() failed (-19) for /memory-controller@100e0000 of_amba_device_create(): amba_device_add() failed (-19) for /memory-controller@100e1000 of_amba_device_create(): amba_device_add() failed (-19) for /watchdog@100e5000 of_amba_device_create(): amba_device_add() failed (-19) for /smb/motherboard/iofpga@7,00000000/sysctl@01000 of_amba_device_create(): amba_device_add() failed (-19) for /smb/motherboard/iofpga@7,00000000/wdt@0f000 hw-breakpoint: debug architecture 0x4 unsupported. Serial: AMBA PL011 UART driver 10009000.uart: ttyAMA0 at MMIO 0x10009000 (irq = 37, base_baud = 0) is a PL011 rev1 console [ttyAMA0] enabled 1000a000.uart: ttyAMA1 at MMIO 0x1000a000 (irq = 38, base_baud = 0) is a PL011 rev1 1000b000.uart: ttyAMA2 at MMIO 0x1000b000 (irq = 39, base_baud = 0) is a PL011 rev1 1000c000.uart: ttyAMA3 at MMIO 0x1000c000 (irq = 40, base_baud = 0) is a PL011 rev1 3V3: 3300 mV SCSI subsystem initialized usbcore: registered new interface driver usbfs usbcore: registered new interface driver hub usbcore: registered new device driver usb Advanced Linux Sound Architecture Driver Initialized. Switched to clocksource arm,sp804 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) TCP: reno registered 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. hw perfevents: enabled with ARMv7 Cortex-A9 PMU driver, 1 counters available futex hash table entries: 1024 (order: 4, 65536 bytes) squashfs: version 4.0 (2009/01/31) Phillip Lougher jffs2: version 2.2. (NAND) © 2001-2006 Red Hat, Inc. 9p: Installing v9fs 9p2000 file system support msgmni has been set to 1002 io scheduler noop registered (default) clcd-pl11x: probe of 10020000.clcd failed with error -22 clcd-pl11x: probe of 1001f000.clcd failed with error -22 VD10: at 1000 mV VD10_S2: at 1000 mV VD10_S3: at 1000 mV VCC1V8: at 1800 mV DDR2VTT: at 900 mV VCC3V3: at 3300 mV VIO: at 3300 mV 40000000.flash: Found 2 x16 devices at 0x0 in 32-bit bank. Manufacturer ID 0x000000 Chip ID 0x000000 Intel/Sharp Extended Query Table at 0x0031 Using buffer write method 40000000.flash: Found 2 x16 devices at 0x0 in 32-bit bank. Manufacturer ID 0x000000 Chip ID 0x000000 Intel/Sharp Extended Query Table at 0x0031 Using buffer write method Concatenating MTD devices: (0): "40000000.flash" (1): "40000000.flash" into device "40000000.flash" libphy: smsc911x-mdio: probed smsc911x 4e000000.ethernet eth0: attached PHY driver [Generic PHY] (mii_bus:phy_addr=4e000000.etherne:01, irq=-1) smsc911x 4e000000.ethernet eth0: MAC Address: 52:54:00:12:34:56 nxp-isp1760 4f000000.usb: NXP ISP1760 USB Host Controller nxp-isp1760 4f000000.usb: new USB bus registered, assigned bus number 1 nxp-isp1760 4f000000.usb: Scratch test failed. nxp-isp1760 4f000000.usb: can't setup: -19
nxp-isp1760 4f000000.usb: USB bus 1 deregistered usbcore: registered new interface driver usb-storage mousedev: PS/2 mouse device common for all mice rtc-pl031 10017000.rtc: rtc core: registered pl031 as rtc0 mmci-pl18x 10005000.mmci: Got CD GPIO #244. mmci-pl18x 10005000.mmci: Got WP GPIO #245. mmci-pl18x 10005000.mmci: No vqmmc regulator found mmci-pl18x 10005000.mmci: mmc0: PL181 manf 41 rev0 at 0x10005000 irq 41,42 (pio) ledtrig-cpu: registered to indicate activity on CPUs usbcore: registered new interface driver usbhid usbhid: USB HID core driver input: AT Raw Set 2 keyboard as /devices/smb/smb:motherboard/smb:motherboard:iofpga@7,00000000/10006000.kmi/serio0/input/input0 mmc0: new SD card at address 4567 mmcblk0: mmc0:4567 QEMU! 32.0 MiB mmcblk0: unknown partition table aaci-pl041 10004000.aaci: ARM AC'97 Interface PL041 rev0 at 0x10004000, irq 43
aaci-pl041 10004000.aaci: FIFO 512 entries oprofile: using arm/armv7-ca9 TCP: cubic registered NET: Registered protocol family 17 9pnet: Installing 9P2000 support rtc-pl031 10017000.rtc: setting system clock to 2015-12-06 09:35:35 UTC (1449394535) ALSA device list: #0: ARM AC'97 Interface PL041 rev0 at 0x10004000, irq 43
input: ImExPS/2 Generic Explorer Mouse as /devices/smb/smb:motherboard/smb:motherboard:iofpga@7,00000000/10007000.kmi/serio1/input/input2 EXT3-fs (mmcblk0): recovery required on readonly filesystem EXT3-fs (mmcblk0): write access will be enabled during recovery kjournald starting. Commit interval 5 seconds EXT3-fs (mmcblk0): recovery complete EXT3-fs (mmcblk0): mounted filesystem with writeback data mode VFS: Mounted root (ext3 filesystem) readonly on device 179:0. Freeing unused kernel memory: 236K (805c2000 - 805fd000) random: nonblocking pool is initialized smsc911x 4e000000.ethernet eth0: SMSC911x/921x identified at 0xa0900000, IRQ: 47 Please press Enter to activate this console. [root@vexpress ]# [root@vexpress ]# [root@vexpress ]# ls /proc/device-tree/ #address-cells memory-controller@100e0000 #size-cells memory-controller@100e1000 aliases memory@60000000 arm,hbi model arm,vexpress,site name cache-controller@1e00a000 pmu chosen scu@1e000000 clcd@10020000 smb compatible timer@100e4000 cpus timer@1e000600 dcc watchdog@100e5000 interrupt-controller@1e001000 watchdog@1e000620
5、直接在Qemu的命令行中设置DT
执行如下命令
qemu-system-arm \ -M vexpress-a9 \ -m 512M \ -kernel /root/tq2440_work/kernel/linux-stable/out_vexpress_3_16/arch/arm/boot/zImage \ -nographic \ -append "root=/dev/mmcblk0 console=ttyAMA0" \ -sd /root/tq2440_work/busybox_study/a9rootfs.ext3 \ -dtb /tftpboot/dtb
启动信息:
Booting Linux on physical CPU 0x0 Initializing cgroup subsys cpuset Linux version 3.16.7 (root@ubuntu) (gcc version 4.7.3 (Ubuntu/Linaro 4.7.3-12ubuntu1) ) #6 SMP Sun Dec 6 00:12:00 PST 2015 CPU: ARMv7 Processor [410fc090] revision 0 (ARMv7), cr=10c53c7d CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache Machine model: V2P-CA9 Memory policy: Data cache writeback CPU: All CPU(s) started in SVC mode. PERCPU: Embedded 7 pages/cpu @9fbcf000 s7552 r8192 d12928 u32768 Built 1 zonelists in Zone order, mobility grouping on. Total pages: 130048 Kernel command line: root=/dev/mmcblk0 console=ttyAMA0 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: 513116K/524288K available (4567K kernel code, 191K rwdata, 1292K rodata, 239K init, 149K bss, 11172K reserved) Virtual kernel memory layout: vector : 0xffff0000 - 0xffff1000 ( 4 kB) fixmap : 0xffc00000 - 0xffe00000 (2048 kB) vmalloc : 0xa0800000 - 0xff000000 (1512 MB) lowmem : 0x80000000 - 0xa0000000 ( 512 MB) modules : 0x7f000000 - 0x80000000 ( 16 MB) .text : 0x80008000 - 0x805c1238 (5861 kB) .init : 0x805c2000 - 0x805fdd80 ( 240 kB) .data : 0x805fe000 - 0x8062dc20 ( 192 kB) .bss : 0x8062dc28 - 0x806533ec ( 150 kB) SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1 Hierarchical RCU implementation. RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=4. RCU: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=4 NR_IRQS:16 nr_irqs:16 16 GIC CPU mask not found - kernel will fail to boot. GIC CPU mask not found - kernel will fail to boot. sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 178956969942ns Console: colour dummy device 80x30 Calibrating delay loop... 286.10 BogoMIPS (lpj=1430528) 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 0x60455850 - 0x604558a8 CPU1: failed to boot: -38 CPU2: failed to boot: -38 CPU3: failed to boot: -38 Brought up 1 CPUs SMP: Total of 1 processors activated. CPU: All CPU(s) started in SVC mode. devtmpfs: initialized VFP support v0.3: implementor 41 architecture 3 part 30 variant 9 rev 0 regulator-dummy: no parameters NET: Registered protocol family 16 DMA: preallocated 256 KiB pool for atomic coherent allocations cpuidle: using governor ladder cpuidle: using governor menu of_amba_device_create(): amba_device_add() failed (-19) for /memory-controller@100e0000 of_amba_device_create(): amba_device_add() failed (-19) for /memory-controller@100e1000 of_amba_device_create(): amba_device_add() failed (-19) for /watchdog@100e5000 of_amba_device_create(): amba_device_add() failed (-19) for /smb/motherboard/iofpga@7,00000000/sysctl@01000 of_amba_device_create(): amba_device_add() failed (-19) for /smb/motherboard/iofpga@7,00000000/wdt@0f000 hw-breakpoint: debug architecture 0x4 unsupported. Serial: AMBA PL011 UART driver 10009000.uart: ttyAMA0 at MMIO 0x10009000 (irq = 37, base_baud = 0) is a PL011 rev1 console [ttyAMA0] enabled 1000a000.uart: ttyAMA1 at MMIO 0x1000a000 (irq = 38, base_baud = 0) is a PL011 rev1 1000b000.uart: ttyAMA2 at MMIO 0x1000b000 (irq = 39, base_baud = 0) is a PL011 rev1 1000c000.uart: ttyAMA3 at MMIO 0x1000c000 (irq = 40, base_baud = 0) is a PL011 rev1 3V3: 3300 mV SCSI subsystem initialized usbcore: registered new interface driver usbfs usbcore: registered new interface driver hub usbcore: registered new device driver usb Advanced Linux Sound Architecture Driver Initialized. Switched to clocksource arm,sp804 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) TCP: reno registered 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. hw perfevents: enabled with ARMv7 Cortex-A9 PMU driver, 1 counters available futex hash table entries: 1024 (order: 4, 65536 bytes) squashfs: version 4.0 (2009/01/31) Phillip Lougher jffs2: version 2.2. (NAND) © 2001-2006 Red Hat, Inc. 9p: Installing v9fs 9p2000 file system support msgmni has been set to 1002 io scheduler noop registered (default) clcd-pl11x: probe of 10020000.clcd failed with error -22 clcd-pl11x: probe of 1001f000.clcd failed with error -22 VD10: at 1000 mV VD10_S2: at 1000 mV VD10_S3: at 1000 mV VCC1V8: at 1800 mV DDR2VTT: at 900 mV VCC3V3: at 3300 mV VIO: at 3300 mV 40000000.flash: Found 2 x16 devices at 0x0 in 32-bit bank. Manufacturer ID 0x000000 Chip ID 0x000000 Intel/Sharp Extended Query Table at 0x0031 Using buffer write method 40000000.flash: Found 2 x16 devices at 0x0 in 32-bit bank. Manufacturer ID 0x000000 Chip ID 0x000000 Intel/Sharp Extended Query Table at 0x0031 Using buffer write method Concatenating MTD devices: (0): "40000000.flash" (1): "40000000.flash" into device "40000000.flash" libphy: smsc911x-mdio: probed smsc911x 4e000000.ethernet eth0: attached PHY driver [Generic PHY] (mii_bus:phy_addr=4e000000.etherne:01, irq=-1) smsc911x 4e000000.ethernet eth0: MAC Address: 52:54:00:12:34:56 nxp-isp1760 4f000000.usb: NXP ISP1760 USB Host Controller nxp-isp1760 4f000000.usb: new USB bus registered, assigned bus number 1 nxp-isp1760 4f000000.usb: Scratch test failed. nxp-isp1760 4f000000.usb: can't setup: -19
nxp-isp1760 4f000000.usb: USB bus 1 deregistered usbcore: registered new interface driver usb-storage mousedev: PS/2 mouse device common for all mice rtc-pl031 10017000.rtc: rtc core: registered pl031 as rtc0 mmci-pl18x 10005000.mmci: Got CD GPIO #244. mmci-pl18x 10005000.mmci: Got WP GPIO #245. mmci-pl18x 10005000.mmci: No vqmmc regulator found mmci-pl18x 10005000.mmci: mmc0: PL181 manf 41 rev0 at 0x10005000 irq 41,42 (pio) ledtrig-cpu: registered to indicate activity on CPUs usbcore: registered new interface driver usbhid usbhid: USB HID core driver input: AT Raw Set 2 keyboard as /devices/smb/smb:motherboard/smb:motherboard:iofpga@7,00000000/10006000.kmi/serio0/input/input0 mmc0: new SD card at address 4567 mmcblk0: mmc0:4567 QEMU! 32.0 MiB mmcblk0: unknown partition table aaci-pl041 10004000.aaci: ARM AC'97 Interface PL041 rev0 at 0x10004000, irq 43
aaci-pl041 10004000.aaci: FIFO 512 entries oprofile: using arm/armv7-ca9 TCP: cubic registered NET: Registered protocol family 17 9pnet: Installing 9P2000 support rtc-pl031 10017000.rtc: setting system clock to 2015-12-06 09:39:50 UTC (1449394790) ALSA device list: #0: ARM AC'97 Interface PL041 rev0 at 0x10004000, irq 43
input: ImExPS/2 Generic Explorer Mouse as /devices/smb/smb:motherboard/smb:motherboard:iofpga@7,00000000/10007000.kmi/serio1/input/input2 kjournald starting. Commit interval 5 seconds EXT3-fs (mmcblk0): mounted filesystem with writeback data mode VFS: Mounted root (ext3 filesystem) readonly on device 179:0. Freeing unused kernel memory: 236K (805c2000 - 805fd000) random: nonblocking pool is initialized smsc911x 4e000000.ethernet eth0: SMSC911x/921x identified at 0xa0900000, IRQ: 47 Please press Enter to activate this console. [root@vexpress ]#
未完待续。