前言
DTS即Device Tree Source设备树源码,Device Tree是一种描述硬件的数据结构,起源于 OpenFirmware在Linux 2.6中,ARM架构的板极硬件细节过多地被硬编码在arch/arm/plat-xxx和arch/arm/mach-xxx,比如板上的platform设备,resource,i2c_board_info,spi_board_info以及各种硬件的platform_data,这些板级细节代码对内核来讲只不过是垃圾代码.而采用Device Tree后,许多硬件的细节可以直接透过它传递给Linux,而不再需要在kernel中进行大量的冗余编码.比如我们之前说过的总线模型,驱动程序被分为两部分,一部分为device,另一部分为driver,对于device部分它里面有各种硬件资源,对于driver里面的probe函数会在匹配后调用,在probe函数里面再去分配设置file_operation结构体,结构体里面(open,read,write函数),操作比较麻烦冗余
使用设备树后我们不用再去写device端的.c文件,在DTS文件中构造节点,该节点含有deviced端的硬件资源,通过DTC(Device Tree Compiler)可以将适合人类阅读的Device Tree Source文件转化成适合机器处理的Device Tree binary file(DTB),在嵌入式系统启动时,bootloader可以将保存在flash中的DTB copy到内存,并把DTB的起始地址传递给内核,内核从DTB文件中得到device_node结构体,device_node结构体进一步转化为platform_device结构体,进而获得到device端的硬件资源(该资源来自我们的DTS文件),如下图所示
.dts文件如下所示
#define S3C2410_GPA(_nr) ((0<<16) + (_nr))
#define S3C2410_GPB(_nr) ((1<<16) + (_nr))
#define S3C2410_GPC(_nr) ((2<<16) + (_nr))
#define S3C2410_GPD(_nr) ((3<<16) + (_nr))
#define S3C2410_GPE(_nr) ((4<<16) + (_nr))
#define S3C2410_GPF(_nr) ((5<<16) + (_nr))
#define S3C2410_GPG(_nr) ((6<<16) + (_nr))
#define S3C2410_GPH(_nr) ((7<<16) + (_nr))
#define S3C2410_GPJ(_nr) ((8<<16) + (_nr))
#define S3C2410_GPK(_nr) ((9<<16) + (_nr))
#define S3C2410_GPL(_nr) ((10<<16) + (_nr))
#define S3C2410_GPM(_nr) ((11<<16) + (_nr))
/dts-v1/;
/ {
model = "SMDK24440";
compatible = "samsung,smdk2440"