iphone6s还原出厂设置网络设置后手机开不了机 只能显示开机页面怎么办

linux设备树dts移植详解
转自:http://blog.csdn.net/cosmoslhf/article/details/9252509
和: &/demo_c407_i7849.html
1.&&& ARM Device Tree起源 Linus Torvalds在日的ARM Linux邮件列表宣称“this whole ARM thing is a f*cking pain in the ass”,引发ARM Linux社区的地震,随后ARM社区进行了一系列的 重大修正。在过去的ARM Linux中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量的垃圾代码,相当多数的代码只是在描述板级细节,而这些板级细节对于内核来讲, 不过是垃圾,如板上的platform设备、resource、i2c_board_info、spi_board_info以及各种硬件的platform_data。读者有兴趣可以统计下常见的s3c2410、s3c6410等板级目录,代码量在数万行。 社区必须改变这种局面,于是PowerPC等其他体系架构下已经使用的Flattened Device Tree(FDT)进入ARM社区的视野。Device Tree是一种描述硬件的数据结构,它起源 于 OpenFirmware (OF)。在Linux 2.6中,ARM架构的板极硬件细节过多地被硬编码在arch/arm/plat-xxx和arch/arm/mach-xxx,采用Device Tree后,许多硬件的细节可以直接透过它传递给Linux,而不再需要在kernel中进行大量的冗余编码。 Device Tree由一系列被命名的结点(node)和属性(property)组成,而结点本身可包含子结点。所谓属性,其实就是成对出现的name和value。在Device Tree中,可描述 的信息包括(原先这些信息大多被hard code到kernel中):
&&& CPU的数量和类别 &&& 内存基地址和大小 &&& 总线和桥 &&& 外设连接 &&& 中断控制器和中断使用情况 &&& GPIO控制器和GPIO使用情况 &&& Clock控制器和Clock使用情况
它基本上就是画一棵电路板上CPU、总线、设备组成的树,Bootloader会将这棵树传递给内核,然后内核可以识别这棵树,并根据它展开出Linux内核中的platform_device、i2c_client、spi_device等设备,而这些设备用到的内存、IRQ等资源,也被传递给了内核,内核会将这些资源绑定给展开的相应的设备。 2.&&& Device Tree组成和结构 整个Device Tree牵涉面比较广,即增加了新的用于描述设备硬件信息的文本格式,又增加了编译这一文本的工具,同时Bootloader也需要支持将编译后的Device Tree传递给Linux内核。 DTS (device tree source) .dts文件是一种ASCII 文本格式的Device Tree描述,此文本格式非常人性化,适合人类的阅读习惯。基本上,在ARM Linux在,一个.dts文件对应一个ARM的machine,一般放置在内核的arch/arm/boot/dts/目录。由于一个SoC可能对应多个machine(一个SoC可以对应多个产品和电路板),势必这些.dts文件需包含许多共同的部分,Linux内核为了简化,把SoC公用的部分或者多个machine共同的部分一般提炼为.dtsi,类似于C语言的头文件。其他的machine对应的.dts就include这个.dtsi。譬如,对于VEXPRESS而言,vexpress-v2m.dtsi就被vexpress-v2p-ca9.dts所引用, vexpress-v2p-ca9.dts有如下一行: /include/ "vexpress-v2m.dtsi" 当然,和C语言的头文件类似,.dtsi也可以include其他的.dtsi,譬如几乎所有的ARM SoC的.dtsi都引用了skeleton.dtsi。 .dts(或者其include的.dtsi)基本元素即为前文所述的结点和属性: [plain] view plaincopy
以下转自:http://blog.csdn.net/cosmoslhf/article/details/9252509
摘 要:设备树的引入减少了内核为支持新硬件而需要的改变,提高代码重用,加速了Linux 支持包的开发,使得单个内核镜像能支持多个系统。作为U-Boot 和Linux 内核之间的动态 接口,本文阐述了设备树的数据存储格式以及源码描述语法,进而分析了U-Boot 对扁平设 备树的支持设置,Linux 内核对设备树的解析流程。 关键词:扁平设备树; DTS; PowerPC; Linux IBM、Sun 等厂家的服务器最初都采用了Firmware(一种嵌入到硬件设备中的程序,用 于提供软件和硬件之间的接口),用于初始化系统配置,提供操作系统软件和硬件之间的接 口,启动和运行系统。后来为了标准化和兼容性,IBM、Sun 等联合推出了固件接口IEEE 1275 标准,让他们的服务器如IBM PowerPC pSeries,Apple PowerPC,Sun SPARC 等均采用Open Firmware,在运行时构建系统硬件的设备树信息传递给内核,进行系统的启动运行[1]。这样 做的好处有,减少内核对系统硬件的严重依赖,利于加速支持包的开发,降低硬件带来的变 化需求和成本,降低对内核设计和编译的要求。 随着 Linux/ppc64 内核的发展,内核代码从原来的arch/ppc32 和arch/ppc64 逐渐迁移到 统一的arch/powerpc 目录,并在内核代码引入Open Firmware API 以使用标准固件接口[2]。 Linux 内核在运行时,需要知道硬件的一些相关信息。对于使用ARCH=powerpc 参数编译的 内核镜像,这个信息需要基于Open Firmware 规范,以设备树的形式存在[3]。这样内核在启 动时读取扫描Open Firmware 提供的设备树,从而获得平台的硬件设备信息,搜索匹配的设 备驱动程序并将该驱动程序绑定到设备。 在嵌入式 PowerPC 中,一般使用U-Boot 之类的系统引导代码,而不采用Open Firmware。 早期的U-Boot 使用include/asm-ppc/u-boot.h 中的静态数据结构struct bd_t 将板子基本信息传 递给内核,其余的由内核处理。这样的接口不够灵活,硬件发生变化就需要重新定制编译烧 写引导代码和内核,而且也不再适应于现在的内核。为了适应内核的发展及嵌入式PowerPC 平台的千变万化,吸收标准Open Firmware 的优点,U-Boot 引入了扁平设备树FDT 这样的 动态接口,使用一个单独的FDT blob(二进制大对象,是一个可以存储二进制文件的容器) 存储传递给内核的参数[3]。一些确定信息,例如cache 大小、中断路由等直接由设备树提供, 而其他的信息,例如eTSEC 的MAC 地址、频率、PCI 总线数目等由U-Boot 在运行时修改。 U-Boot 使用扁平设备树取代了bd_t,而且也不再保证对bd_t 的后向兼容。 2 设备树概念 简单的说,设备树是一种描述硬件配置的树形数据结构,有且仅有一个根节点[4]。它包 <span style="color:rgb(51,51,51); font-fam1458人阅读
设备树(3)
1、使uboot支持设备树,配置CONFIG_OF_LIBFDT,编译。编译出错,问题:boot_relocate_fdt未定义
错误解决:配置CONFIG_SYS_BOOTMAPSZ,重新编译即可
--------------------------------------------------------------------------
2、启动uboot,把生成的dtb下载到开发板的内存中
smdk4412 # fatload mmc 0 0x image/exynos4412-smdk4412.dtb
smdk4412 # fdt addr 0x
smdk4412 # fdt header
magic: & & & & & & & & &0xd00dfeed
totalsize: & & & & & & &0x25d5 (9685)
off_dt_struct: & & & & &0x38
off_dt_strings: & & & & 0x2474
off_mem_rsvmap: & & & & 0x28
version: & & & & & & & &17
last_comp_version: & & &16
boot_cpuid_phys: & & & &0x0
size_dt_strings: & & & &0x161
size_dt_struct: & & & & 0x243c
number mem_rsv: & & & & 0x0
3、使用设备树启动内核
smdk4412 # fatload mmc 0 0x image/exynos4412-smdk4412.dtb
smdk4412 # fdt addr 0x
smdk4412 # movi r k 0
smdk4412 # bootm
&//bootm 内核地址 根文件系统地址 设备树地址
出现下面问题:
ERROR: Failed to allocate 0x55d5 bytes below 0x.
device tree - allocation error
解决:去掉CONFIG_SYS_BOOTMAPSZ配置,屏蔽fdt重定位代码
参考:http://lists.denx.de/pipermail/u-boot/2014-February/174027.html
--------------------------------------------------------------------------
## Booting kernel from Legacy Image at 40007fc0 ...
& &Image Name: & Linux-3.8.0
& &Image Type: & ARM Linux Kernel Image (uncompressed)
& &Data Size: & &2105832 Bytes = 2056 KiB
& &Load Address:
& &Entry Point: &
& &Verifying Checksum ... OK
## Flattened Device Tree blob at
& &Booting using the fdt blob at 0x
& &Loading Kernel Image ... OK
WARNING: could not set bootargs FDT_ERR_NOSPACE.
WARNING: could not set reg FDT_ERR_NOSPACE.
Starting kernel ...
Uncompressing Linux... done, booting the kernel.
Error: unrecognized/unsupported device tree compatible list:
[ 'samsung,smdk4412' 'samsung,exynos4412' ]
Available machine support:
ID (hex) & & & &NAME
0000133b & & & &SMDK4412
00000e36 & & & &SMDK4212
Please check your kernel config and/or bootloader.
解决:配置支持exynos4支持设备树即可
System Type &---&
SAMSUNG EXYNOS SoCs Support &---&&
[*] Samsung Exynos4 Machine using device tree&
--------------------------------------------------------------------------
@@再次启动,加载设备树启动成功
## Booting kernel from Legacy Image at 40007fc0 ...
& &Image Name: & Linux-3.8.0
& &Image Type: & ARM Linux Kernel Image (uncompressed)
& &Data Size: & &2128968 Bytes = 2079 KiB
& &Load Address:
& &Entry Point: &
& &Verifying Checksum ... OK
## Flattened Device Tree blob at
& &Booting using the fdt blob at 0x
& &Loading Kernel Image ... OK
WARNING: could not set bootargs FDT_ERR_NOSPACE.
WARNING: could not set reg FDT_ERR_NOSPACE.
Starting kernel ...
Uncompressing Linux... done, booting the kernel.
Booting Linux on physical CPU 0xa00
Linux version 3.8.0 (root@ubuntu) (gcc version 4.5.1 (ctng-1.8.1-FA) ) #4 SMP PREEMPT Mon Nov 30 16:55:52 CST 2015
CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=10c5387d
CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
Machine: Samsung Exynos4 (Flattened Device Tree), model: Samsung SMDK evaluation board based on Exynos4412
Memory policy: ECC disabled, Data cache writealloc
CPU EXYNOS4412 (id 0xe4412011)
S3C24XX Clocks, Copyright 2004 Simtec Electronics
s3c_register_clksrc: clock armclk has no registers set
EXYNOS4: PLL settings, A=, M=, E= V=
EXYNOS4: ARMCLK=, DMC=, ACLK200=
ACLK100=, ACLK160=, ACLK133=
sclk_pwm: source is ext_xtal (0), rate is
sclk_csis: source is xusbxti (1), rate is 1500000
sclk_csis: source is xusbxti (1), rate is 1500000
sclk_cam0: source is xusbxti (1), rate is 1500000
sclk_cam1: source is xusbxti (1), rate is 1500000
sclk_fimc: source is xusbxti (1), rate is 1500000
sclk_fimc: source is xusbxti (1), rate is 1500000
sclk_fimc: source is xusbxti (1), rate is 1500000
sclk_fimc: source is xusbxti (1), rate is 1500000
sclk_fimd: source is xusbxti (1), rate is 1500000
sclk_mfc: source is mout_mfc0 (0), rate is
PERCPU: Embedded 7 pages/cpu @c0c6 r u32768
Built 1 zonelists in Zone order, mobility grouping on. &Total pages: 260096
Kernel command line: noinitrd root=/dev/nfs nfsroot=192.168.1.108:/work/system/zxl4412_root ip=192.168.1.123:192.168.1.108:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0,115200
PID hash table entries: 4096 (order: 2, 16384 bytes)
Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)
Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
__ex_table already sorted, skipping sort
Memory: 1024MB = 1024MB total
Memory: 34916k available, 13660k reserved, 270336K highmem
Virtual kernel memory layout:
& & vector &: 0xffff0000 - 0xffff1000 & ( & 4 kB)
& & fixmap &: 0xfff00000 - 0xfffe0000 & ( 896 kB)
& & vmalloc : 0xf0000000 - 0xff000000 & ( 240 MB)
& & lowmem &: 0xc0000000 - 0xef800000 & ( 760 MB)
& & pkmap & : 0xbfe00000 - 0xc0000000 & ( & 2 MB)
& & modules : 0xbf000000 - 0xbfe00000 & ( &14 MB)
& & & .text : 0xc0008000 - 0xc039b6f8 & (3662 kB)
& & & .init : 0xc039c000 - 0xc03c6d40 & ( 172 kB)
& & & .data : 0xc03c8000 - 0xc04145c0 & ( 306 kB)
& & & &.bss : 0xc04145c0 - 0xc044c9d0 & ( 226 kB)
SLUB: Genslabs=11, HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
Preemptible hierarchical RCU implementation.
NR_IRQS:549
combiner_init: number of combiners not specified, setting default as 16.
sched_clock: 32 bits at 200 Hz, resolution 5000000ns, wraps every ms
Console: colour dummy device 80x30
Calibrating delay loop... 2795.11 BogoMIPS (lpj=6987776)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
CPU0: thread -1, cpu 0, socket 10, mpidr 80000a00
Setting up static identity map for 0x402ad238 - 0x402ad290
L310 cache controller enabled
l2x0: 16 ways, CACHE_ID 0x, AUX_CTRL 0x7e470001, Cache size: 1048576 B
CPU1: Booted secondary processor
CPU1: thread -1, cpu 1, socket 10, mpidr 80000a01
CPU2: Booted secondary processor
CPU2: thread -1, cpu 2, socket 10, mpidr 80000a02
CPU3: Booted secondary processor
CPU3: thread -1, cpu 3, socket 10, mpidr 80000a03
Brought up 4 CPUs
SMP: Total of 4 processors activated (11180.44 BogoMIPS).
pinctrl core: initialized pinctrl subsystem
NET: Registered protocol family 16
DMA: preallocated 256 KiB pool for atomic coherent allocations
S3C Power Management, Copyright 2004 Simtec Electronics
EXYNOS4x12 PMU Initialize
EXYNOS: Initializing architecture
bio: create slab &bio-0& at 0
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
Switching to clocksource mct-frc
NET: Registered protocol family 2
TCP established hash table entries: 8192 (order: 4, 65536 bytes)
TCP bind hash table entries: 8192 (order: 5, 163840 bytes)
TCP: Hash tables configured (established 8192 bind 8192)
TCP: reno registered
UDP hash table entries: 512 (order: 2, 24576 bytes)
UDP-Lite hash table entries: 512 (order: 2, 24576 bytes)
bounce pool size: 64 pages
ROMFS MTD (C) 2007 Red Hat, Inc.
io scheduler noop registered
io scheduler deadline registered
io scheduler cfq registered (default)
dma-pl330 dma-pl330.0: Loaded driver for PL330 DMAC-1315632
dma-pl330 dma-pl330.0: &DBUFF-32x4bytes Num_Chans-8 Num_Peri-32 Num_Events-32
dma-pl330 dma-pl330.1: Loaded driver for PL330 DMAC-1315632
dma-pl330 dma-pl330.1: &DBUFF-32x4bytes Num_Chans-8 Num_Peri-32 Num_Events-32
dma-pl330 dma-pl330.2: Loaded driver for PL330 DMAC-1315632
dma-pl330 dma-pl330.2: &DBUFF-64x8bytes Num_Chans-8 Num_Peri-1 Num_Events-32
driver, 4 ports, IRQ sharing disabled
exynos4210-uart.0: ttySAC0 at MMIO 0x (irq = 84) is a S3C6400/10
console [ttySAC0] enabled
exynos4210-uart.1: ttySAC1 at MMIO 0x (irq = 85) is a S3C6400/10
exynos4210-uart.2: ttySAC2 at MMIO 0x (irq = 86) is a S3C6400/10
exynos4210-uart.3: ttySAC3 at MMIO 0x (irq = 87) is a S3C6400/10
brd: module loaded
loop: module loaded
pegasus: v0.6.14 (), Pegasus/Pegasus II USB Ethernet driver
usbcore: registered new interface driver pegasus
usbcore: registered new interface driver asix
usbcore: registered new interface driver cdc_ether
usbcore: registered new interface driver net1080
usbcore: registered new interface driver cdc_subset
usbcore: registered new interface driver zaurus
usbcore: registered new interface driver cdc_ncm
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
Initializing USB Mass Storage driver...
usbcore: registered new interface driver usb-storage
USB Mass Storage support registered.
mousedev: PS/2 mouse device common for all mice
cpuidle: using governor ladder
cpuidle: using governor menu
sdhci: Secure Digital Host Controller Interface driver
sdhci: Copyright(c) Pierre Ossman
Synopsys Designware Multimedia Card Interface Driver
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
TCP: cubic registered
NET: Registered protocol family 15
VFP support v0.3: implementor 41 architecture 3 part 30 variant 9 rev 4
Registering SWP/SWPB emulation handler
VFS: Cannot open root device &nfs& or unknown-block(0,255): error -6
Please append a correct &root=& here are the available partitions:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,255)
[&c0014934&] (unwind_backtrace&#43;0x0/0xf0) from [&c02a9b88&] (panic&#43;0x8c/0x1ec)
[&c02a9b88&] (panic&#43;0x8c/0x1ec) from [&c039cd18&] (mount_block_root&#43;0x1e8/0x2a4)
[&c039cd18&] (mount_block_root&#43;0x1e8/0x2a4) from [&c039d084&] (prepare_namespace&#43;0x160/0x1b8)
[&c039d084&] (prepare_namespace&#43;0x160/0x1b8) from [&c02a5e6c&] (kernel_init&#43;0x8/0xe4)
[&c02a5e6c&] (kernel_init&#43;0x8/0xe4) from [&c000e498&] (ret_from_fork&#43;0x14/0x3c)
CPU2: stopping
[&c0014934&] (unwind_backtrace&#43;0x0/0xf0) from [&c00132bc&] (handle_IPI&#43;0x128/0x154)
[&c00132bc&] (handle_IPI&#43;0x128/0x154) from [&c0008584&] (gic_handle_irq&#43;0x60/0x68)
[&c0008584&] (gic_handle_irq&#43;0x60/0x68) from [&c000e000&] (__irq_svc&#43;0x40/0x70)
Exception stack(0xef06ff50 to 0xef06ff98)
ff40: & & & & & & & & & & & & & & & & & & ef06ff98 3b9aca00 00003
ff60: 058 ef06ff98 f1fc0 00000
ef06ff98 cec4f4
[&c000e000&] (__irq_svc&#43;0x40/0x70) from [&c01ec4f4&] (cpuidle_wrap_enter&#43;0x4c/0xa0)
[&c01ec4f4&] (cpuidle_wrap_enter&#43;0x4c/0xa0) from [&c01ec2a0&] (cpuidle_idle_call&#43;0xac/0x158)
[&c01ec2a0&] (cpuidle_idle_call&#43;0xac/0x158) from [&c000f6e8&] (cpu_idle&#43;0xa0/0xf0)
[&c000f6e8&] (cpu_idle&#43;0xa0/0xf0) from [&402a69c8&] (0x402a69c8)
CPU3: stopping
[&c0014934&] (unwind_backtrace&#43;0x0/0xf0) from [&c00132bc&] (handle_IPI&#43;0x128/0x154)
[&c00132bc&] (handle_IPI&#43;0x128/0x154) from [&c0008584&] (gic_handle_irq&#43;0x60/0x68)
[&c0008584&] (gic_handle_irq&#43;0x60/0x68) from [&c000e000&] (__irq_svc&#43;0x40/0x70)
Exception stack(0xef071f50 to 0xef071f98)
1f40: & & & & & & & & & & & & & & & & & & ef071f98 3b9aca00 00003
1f60: 2e9dcaf1 c7a258 ef071f98 f1fc0 00000
ef071f98 cec4f4
[&c000e000&] (__irq_svc&#43;0x40/0x70) from [&c01ec4f4&] (cpuidle_wrap_enter&#43;0x4c/0xa0)
[&c01ec4f4&] (cpuidle_wrap_enter&#43;0x4c/0xa0) from [&c01ec2a0&] (cpuidle_idle_call&#43;0xac/0x158)
[&c01ec2a0&] (cpuidle_idle_call&#43;0xac/0x158) from [&c000f6e8&] (cpu_idle&#43;0xa0/0xf0)
[&c000f6e8&] (cpu_idle&#43;0xa0/0xf0) from [&402a69c8&] (0x402a69c8)
CPU1: stopping
[&c0014934&] (unwind_backtrace&#43;0x0/0xf0) from [&c00132bc&] (handle_IPI&#43;0x128/0x154)
[&c00132bc&] (handle_IPI&#43;0x128/0x154) from [&c0008584&] (gic_handle_irq&#43;0x60/0x68)
[&c0008584&] (gic_handle_irq&#43;0x60/0x68) from [&c000e000&] (__irq_svc&#43;0x40/0x70)
Exception stack(0xef06df50 to 0xef06df98)
df40: & & & & & & & & & & & & & & & & & & ef06df98 3b9aca00 00003
c6a258 ef06df98 f1fc0 00000
ef06df98 cec4f4
[&c000e000&] (__irq_svc&#43;0x40/0x70) from [&c01ec4f4&] (cpuidle_wrap_enter&#43;0x4c/0xa0)
[&c01ec4f4&] (cpuidle_wrap_enter&#43;0x4c/0xa0) from [&c01ec2a0&] (cpuidle_idle_call&#43;0xac/0x158)
[&c01ec2a0&] (cpuidle_idle_call&#43;0xac/0x158) from [&c000f6e8&] (cpu_idle&#43;0xa0/0xf0)
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:22148次
排名:千里之外
原创:21篇
(8)(1)(4)(3)(6)linux驱动学习 kernel
摘 要:设备树的引入减少了内核为支持新硬件而需要的改变,提高代码重用,加速了Linux
支持包的开发,使得单个内核镜像能支持多个系统。作为U-Boot 和Linux 内核之间的动态
接口,本文阐述了设备树的数据存储&#26684;式以及源码描述语法,进而分析了U-Boot 对扁平设
备树的支持设置,Linux 内核对设备树的解析流程。
关键词:扁平设备树; DTS; PowerPC; Linux
IBM、Sun 等厂家的服务器最初都采用了Firmware(一种嵌入到硬件设备中的程序,用
于提供软件和硬件之间的接口),用于初始化系统配置,提供操作系统软件和硬件之间的接
口,启动和运行系统。后来为了标准化和兼容性,IBM、Sun 等联合推出了固件接口IEEE 1275
标准,让他们的服务器如IBM PowerPC pSeries,Apple PowerPC,Sun SPARC 等均采用Open
Firmware,在运行时构建系统硬件的设备树信息传递给内核,进行系统的启动运行[1]。这样
做的好处有,减少内核对系统硬件的严重依赖,利于加速支持包的开发,降低硬件带来的变
化需求和成本,降低对内核设计和编译的要求。
随着 Linux/ppc64 内核的发展,内核代码从原来的arch/ppc32 和arch/ppc64 逐渐迁移到
统一的arch/powerpc 目录,并在内核代码引入Open Firmware API 以使用标准固件接口[2]。
Linux 内核在运行时,需要知道硬件的一些相关信息。对于使用ARCH=powerpc 参数编译的
内核镜像,这个信息需要基于Open Firmware 规范,以设备树的形式存在[3]。这样内核在启
动时读取扫描Open Firmware 提供的设备树,从而获得平台的硬件设备信息,搜索匹配的设
备驱动程序并将该驱动程序绑定到设备。
在嵌入式 PowerPC 中,一般使用U-Boot 之类的系统引导代码,而不采用Open Firmware。
早期的U-Boot 使用include/asm-ppc/u-boot.h 中的静态数据结构struct bd_t 将板子基本信息传
递给内核,其余的由内核处理。这样的接口不够灵活,硬件发生变化就需要重新定制编译烧
写引导代码和内核,而且也不再适应于现在的内核。为了适应内核的发展及嵌入式PowerPC
平台的千变万化,吸收标准Open Firmware 的优点,U-Boot 引入了扁平设备树FDT 这样的
动态接口,使用一个单独的FDT blob(二进制大对象,是一个可以存储二进制文件的容器)
存储传递给内核的参数[3]。一些确定信息,例如cache 大小、中断路由等直接由设备树提供,
而其他的信息,例如eTSEC 的MAC 地址、频率、PCI 总线数目等由U-Boot 在运行时修改。
U-Boot 使用扁平设备树取代了bd_t,而且也不再保证对bd_t 的后向兼容。
2 设备树概念
简单的说,设备树是一种描述硬件配置的树形数据结构,有且仅有一个根节点[4]。它包
含了有关CPU、物理内存、总线、串口、PHY 以及其他外围设备信息等。该树继承了Open
Firmware IEEE 1275 设备树的定义。操作系统能够在启动时对此结构进行语法分析,以此配
置内核,加载相应的驱动。
3 设备树存储&#26684;式
U-Boot 需要将设备树在内存中的存储地址传给内核。该树主要由三大部分组成:头
(Header)、结构块(Structure block)、字符串块(Strings block)。设备树在内存中的存
储布局图1 如下:
图1 设备树存储&#26684;式图
Fig1 The layout of a DT block
3.1 头(header)
头主要描述设备树的基本信息,如设备树魔数标志、设备树块大小、结构块的偏移地址
等,其具体结构boot_param_header 如下。这个结构中的&#20540;都是以大端模式表示,并且偏移
地址是相对于设备树头的起始地址计算的。
3.2 结构块(structure block)
扁平设备树结构块是线性化的树形结构,和字符串块一起组成了设备树的主体,以节点
形式保存目标板的设备信息。在结构块中,节点起始标志为常&#20540;宏OF_DT_BEGIN_NODE,
节点结束标志为宏OF_DT_END_NODE;子节点定义在节点结束标志前。一个节点可以概
括为以OF_DT_BEGIN_NODE 开始,包括节点路径、属性列表、子节点列表,最后以
OF_DT_END_NODE 结束的序列,每一个子节点自身也是类&#20284;的结构。
3.3 字符串块(Strings block)
为了节省空间,将一些属性名,尤其是那些重复冗余出现的属性名,提取出来单独存放
到字符串块。这个块中包含了很多有结束标志的属性名字符串。在设备树的结构块中存储了
这些字符串的偏移地址,这样可以很容易地查找到属性名字符串。字符串块的引入节省了嵌
入式系统较为紧张的存储空间。
4 设备树源码DTS 表示
设备树源码文件(.dts)以可读可编辑的文本形式描述系统硬件配置设备树,支持C/C&#43;&#43;
方式的注释,该结构有一个唯一的根节点“/”,每个节点都有自己的名字并可以包含多个
子节点。设备树的数据&#26684;式遵循了Open Firmware IEEE standard 1275。本文只简述设备树的
数据布局及语法,Linux 板级支持包开发者应该详细参考IEEE 1275 标准[5]及其他文献[2] [4]。
为了说明,首先给出基于PowerPC MPC8349E 处理器的最小系统的设备树源码示例。
可以看到,这个设备树中有很多节点,每个节点都指定了节点单元名称。每一个属性后面都
给出相应的&#20540;。以双引号引出的内容为ASCII 字符串,以尖括号给出的是32 位的16 进制
&#20540;。这个树结构是启动Linux 内核所需节点和属性简化后的集合,包括了根节点的基本模式
信息、CPU 和物理内存布局,它还包括通过/chosen 节点传递给内核的命令行参数信息。
model = &MPC8349EMITX&;
compatible = &MPC8349EMITX&, &MPC834xMITX&, &MPC83xxMITX&;
#address-cells = &1&; /* 32bit address */
#size-cells = &1&; /* 4GB size */
#address-cells = &1&;
#size-cells = &0&;
PowerPC,8349@0 {
device_type = &cpu&;
reg = &0&;
d-cache-line-size = &20&; /* 32 Bytes */
i-cache-line-size = &20&;
d-cache-size = &8000&; /* L1 dcache, 32K */
i-cache-size = &8000&;
timebase-frequency = &0&; /* from bootloader */
bus-frequency = &0&;
clock-frequency = &0&;
device_type = &memory&;
reg = &00000&; /* 256MB */
name = &chosen&;
bootargs = &root=/dev/ram rw console=ttyS0,115200&;
linux,stdout-path = &&;
4.1 根节点
设备树的起始点称之为根节点&/&。属性model 指明了目标板平台或模块的名称,属性
compatible &#20540;指明和目标板为同一系列的兼容的开发板名称。对于大多数32 位平台,属性
#address-cells 和#size-cells 的&#20540;一般为1。
4.2 CPU 节点
/cpus 节点是根节点的子节点,对于系统中的每一个CPU,都有相应的节点。/cpus 节点
没有必须指明的属性,但指明#address-cells = &1&和 #size-cells = &0&是个好习惯,这同时指
明了每个CPU 节点的reg 属性&#26684;式,方便为物理CPU 编号。
此节点应包含板上每个CPU 的属性。CPU 名称一般写作PowerPC,&name&,例如
Freescale 会使用PowerPC,8349 来描述本文的MPC8349E 处理器。CPU 节点的单元名应该是
cpu@0 的&#26684;式,此节点一般要指定device_type(固定为&cpu&),一级数据/指令缓存的表项
大小,一级数据/指令缓存的大小,核心、总线时钟频率等。在上面的示例中通过系统引导
代码动态填写时钟频率相关项。
4.3 系统内存节点
此节点用于描述目标板上物理内存范围,一般称作/memory 节点,可以有一个或多个。
当有多个节点时,需要后跟单元地址予以区分;只有一个单元地址时,可以不写单元地址,
此节点包含板上物理内存的属性,一般要指定device_type(固定为&memory&)和reg
属性。其中reg 的属性&#20540;以&起始地址空间大小&的形式给出,如上示例中目标板内存起始
地址为0,大小为256M 字节。
4.4 /chosen 节点
这个节点有一点特殊。通常,这里由Open Firmware 存放可变的环境信息,例如参数,
默认输入输出设备。
这个节点中一般指定bootargs 及linux,stdout-path 属性&#20540;。bootargs 属性设置为传递给内
核命令行的参数字符串。linux,stdout-path 常常为标准终端设备的节点路径名,内核会以此作
为默认终端。
U-Boot 在1.3.0 版本后添加了对扁平设备树FDT 的支持,U-Boot 加载Linux 内核、
Ramdisk 文件系统(如果使用的话)和设备树二进制镜像到物理内存之后,在启动执行Linux
内核之前,它会修改设备树二进制文件。它会填充必要的信息到设备树中,例如MAC 地址、
PCI 总线数目等。U-Boot 也会填写设备树文件中的“/chosen”节点,包含了诸如串口、根
设备(Ramdisk、硬盘或NFS 启动)等相关信息。
4.5 片上系统SOC 节点
此节点用来描述片上系统SOC,如果处理器是SOC,则此节点必须存在。顶级SOC 节
点包含的信息对此SOC 上的所有设备可见。节点名应该包含此SOC 的单元地址,即此SOC
内存映射寄存器的基址。SOC 节点名以/soc&SOCname&的形式命名,例如MPC8349 的SOC
节点是&soc8349&。
在属性中应该指定device_type(固定为&soc&)、ranges、bus-frequency 等属性。ranges
属性&#20540;以&bus_addr parent_bus_addr size&的形式指定。SOC 节点还包含目标板使用的每个
SOC 设备子节点,应该在设备树中尽可能详细地描述此SOC 上的外围设备。如下给出带有
看门狗设备的SOC 节点DTS 示例。
#address-cells = &1&;
#size-cells = &1&;
device_type = &soc&;
compatible = &simple-bus&;
ranges = &0 e000&; /* size 1MB */
reg = &e00200&;
bus-frequency = &0&; /* from bootloader */
device_type = &watchdog&;
compatible = &mpc83xx_wdt&;
reg = &200 100&; /* offset: 0x200 */
4.6 其他设备节点
分级节点用来描述系统上的总线和设备,类&#20284;物理总线拓扑,能很方便的描述设备间的
关系。对于系统上的每个总线和设备,在设备树中都有其节点。对于这些设备属性的描述和
定义请详细参考IEEE 1275 标准及本文参考文献[2]。
设备树的中断系统稍显复杂,设备节点利用interrupt-parent 和interrupts 属性描述到中
断控制器的中断连接。其中interrupt-parent 属性&#20540;为中断控制器节点的指针,#interrupts 属
性&#20540;描述可触发的中断信号,其&#20540;&#26684;式与中断控制器的interrupt-cells 属性&#20540;有关。一般
#interrupt-cells 属性&#20540;为2,interrupts 属性就对应为一对描述硬件中断号和中断触发方式的
十六进制&#20540;。
5 扁平设备树编译
根据嵌入式板的设备信息写设备树源码文件(.dts)通常比较简单,但是手写二进制的
扁平设备树(.dtb)就显得比较复杂了。设备树编译器dtc 就是用来根据设备树源码的文本
文件生成设备树二进制镜像的。dtc 编译器会对输入文件进行语法和语义检查,并根据Linux
内核的要求检查各节点及属性,将设备树源码文件(.dts)编译二进制文件(.dtb),以保证
内核能正常启动。dtc 编译器的使用方法如下所示[6]:
dtc [ -I dts ] [ -O dtb ] [ -o opt_file ] [ -V opt_version ] ipt_file
2.6.25 版本之后的内核源码已经包含了dtc 编译器。在配置编译内核时选中
CONFIG_DTC,会自动生成设备树编译器dtc。将编写的目标板设备树文件mpc8349emitx.dts
放到内核源码的arch/powerpc/boot/dts/目录下,利用内核Makefile 生成blob 的简单规则,使
用以下命令亦可完成设备树的dtc 编译:
$ make mpc8349emitx.dtb
6 U-Boot 相关设置说明
为使 U-Boot 支持设备树,需要在板子配置头文件中设置一系列宏变量。如本文在
MPC8349E 处理器目标板中移植的U-Boot 配置如下:
/* pass open firmware flat tree */
#define CONFIG_OF_LIBFDT 1
#undef CONFIG_OF_FLAT_TREE
#define CONFIG_OF_BOARD_SETUP 1
#define CONFIG_OF_HAS_BD_T 1
#define CONFIG_OF_HAS_UBOOT_ENV 1
启动引导代码U-Boot 在完成自己的工作之后,会加载Linux 内核,并将扁平设备树的
地址传递给内核,其代码形式如下:
#if defined(CONFIG_OF_FLAT_TREE) || defined(CONFIG_OF_LIBFDT)
if (of_flat_tree) { /* boot new style */
* Linux Kernel Parameters (passing device tree):
* r3: pointer to the fdt, followed by the board info data
* r4: physical pointer to the kernel itself
* r5: NULL
* r6: NULL
* r7: NULL
(*kernel) ((bd_t *)of_flat_tree, (ulong)kernel, 0, 0, 0);
/* does not return */
arch/powerpc 内核的入口有且只有一个,入口点为内核镜像的起始。此入口支持两种调
用方式,一种是支持Open Firmware 启动,另一种对于没有OF 的引导代码,需要使用扁平
设备树块,如上示例代码。寄存器r3 保存指向设备树的物理地址指针,寄存器r4 保存为内
核在物理内存中的地址,r5 为NULL。其中的隐含意思为:假设开启了mmu,那么这个mmu
的映射关系是1:1 的映射,即虚拟地址和物理地址是相同的。
7 Linux 内核对设备树的解析
扁平设备树描述了目标板平台中的设备树信息。每个设备都有一个节点来描述其信息,
每个节点又可以有子节点及其相应的属性。内核源码中include/linux/of.h 及drivers/of/base.c
等文件中提供了一些Open Firmware API,通过这些API,内核及设备驱动可以查找到相应
的设备节点,读取其属性&#20540;,利用这些信息正确地初始化和驱动硬件。
图2 内核及驱动对扁平设备树的解析
Fig2 Interaction from kernel and drivers with the FDT blob
本文介绍了设备树的起源及其优点,进而阐述了设备树的数据存储&#26684;式以及源码描述语
法,给出了设备树的编译方法,最后引出了移植过程中的U-Boot 相关设置说明及内核的解
析过程分析。设备树为嵌入式系统向Linux 内核传递参数的动态接口,本文以MPC8349E
处理器目标板上的DTS 移植经历作总结,希望对嵌入式PowerPC Linux 开发者具有一定的
参考价&#20540;,可以加快嵌入式PowerPC Linux 开发中的设备树DTS 移植过程。
[3] DENX. Flattened Device Tree Blob [EB/OL]. http://www.denx.de/wiki/view/DULG/LinuxFDTBlob, 2009
[5] SN. The Openmware Home Page [EB/OL]. /1275/home.html
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:27930次
排名:千里之外
原创:31篇
转载:46篇
(1)(2)(3)(4)(10)(3)(3)(2)(2)(5)(3)(2)(1)(3)(2)(8)(3)(1)(9)(2)(6)(1)(1)(1)

我要回帖

更多关于 6s还原所有设置好不好 的文章

 

随机推荐