你好!这里是风筝的博客,
欢迎和我一起多多交流。
ARM社区一贯充斥的大量垃圾代码导致Linus盛怒,因此社区在2011年到2012年进行了大量的工作。ARM Linux开始围绕Device Tree展开,Device Tree有自己的独立的语法,它的源文件为.dts,编译后得到.dtb,Bootloader在引导Linux内核的时候会将.dtb地址告知内核。之后内核会展开Device Tree并创建和注册相关的设备。因此arch/arm/mach-xxx和arch/arm/plat-xxx中大量的用于注册platform、I2C、SPI板级信息的代码被删除,而驱动也以新的方式和.dts中定义的设备结点进行匹配。
Device Tree是一种描述硬件的数据结构,它起源于 OpenFirmware (OF)。所以看到带有OF 字样的API函数就要小心了。
这里 ,我们先看kernel部分:
在arch/arm/boot/dts里面,发现并没有关于2440的设备树文件,但是发现2416采用了设备树。其中,有dts文件和dtsi文件,先说下这两者关系:
.dts文件是一种ASCII文本格式的DeviceTree描述。基本上,在ARMLinux内,一个.dts文件对应一个ARM的machine,一般放置在内核的arch/arm/boot/dts/目录。由于一个SoC可能对应多个machine(一个SoC可以对应多个产品和电路板),势必这些.dts文件需包含许多共同的部分。Linux内核为了简化,把SoC公用的部分或者多个machine共同的部分一般提炼为.dtsi,类似于C语言的头文件。其他的machine对应的.dts就include这个.dtsi。
所以,我们编写2440的dts文件时可以参考s3c2416-smdk2416.dts这个文件:
cp s3c2416-smdk2416.dts s3c2440.dts
vi Makefile
找到如下:
dtb-$(CONFIG_ARCH_S3C24XX) +=
s3c2416-smdk2416.dtb
修改为:
dtb-$(CONFIG_ARCH_S3C24XX) +=
s3c2440.dtb
接着在内核顶层目录里:
make menuconfig
选上 Boot options —> Flattened Device Tree support
最后 make dtbs即可编译设备树(因为arch/arm/configs/s3c2410_defconfig文件里CONFIG_ARCH_S3C24XX=y,所以会编译出s3c2440.dtb文件)。
接着,是uboot部分:
在uboot里,如果使用设备树进行传递参数,为了使能Device Tree,则需要在相应的头文件中宏定义,
即u-boot-2016.11/include/configs/smdk2440.h文件添加:
#define CONFIG_OF_LIBFDT
为什么定义这个呢?
因为在fdt_support.h里,有一句:
#ifdef CONFIG_OF_LIBFDT
/*各种外部函数声明*/
#endif
说的是只有定义了CONFIG_OF_LIBFDT,才能使用关于设备树这些的函数。
现在遇到了点问题:http://www.100ask.org/bbs/forum.php?mod=viewthread&tid=18925&extra=
先码住,还没成功,,,,,,
待续
反编译设备树:
./scripts/dtc/dtc -I dtb -O dts ./arch/arm64/boot/dts/xxxx/xxx.dtb > ~/ff.dts