android 驱动学些入门-------Device Tree 第一篇

dts的实例:
上面的dts,注意以下几点
1:这个是node的名字,可以随便定义,可以通过驱动程序打印当前使用的设备树节点
(“now dts node name is %s\n”,pdev->dev.->name);
2:选项是用来和驱动程序中指针所指向结构里的字段匹配的,只有dts里的字段的名字和驱动程序中里的字段的名字一样,驱动程序才能进入probe函数

android 驱动学些入门-------Device Tree 第一篇

文章插图
3:对于gpios这个字段,首先&指明了这个gpio是连接到的是,接着那个8是gpio 偏移量,它是以为基准的,紧接着那个0说明目前配置的gpio是设置成input,如果是1就是设置成输出,最后一个字段1是指定这个gpio默认为高电平,如果是0则是指定这个gpio默认是低电平
4:如果驱动里面只是利用字段进行匹配进入probe函数,那么gpios可以不需要,但是如果驱动程序里面是采用设备树相关的方法进行操作获取gpio ,那么gpios这个字段必须使用 。gpios这个字段是由函数默认指定的name.
获取gpio 的函数如下:
ags()
()
注册,指定IRQ等板级信息
static struct i2c_board_info __initdata afeb9260_i2c_devices[] = {{I2C_BOARD_INFO("tlv320aic23",0X1a),},{I2C_BOARD_INFO("fm3130",0X68);},{I2C_BOARD_INFO("24c64",0x50);}};之类的i2c_board_info代码,目前不在需要出现,现在只需要tlv320aic23,fm3130,24c64这些设备节点填充作为相应的I2C controller节点的子节点i2c@1,0 {compatible = "acme,a1234-i2c-bus";…rtc@58 {compatible = "maxim,ds1338";reg = <58>;interrupts = < 7 3 >;};};Device Tree 中的I2C client透过I2C host驱动的probe()函数中调用of_i2c_register_devices(&i2c_dev->adapter)
常见的DTS 函数
Linux 内核目前DTS相关的函数都是以of_前缀开头的,他们的实现位于内核源码的/of下面
void * (*node, int index)
通过设备节点直接进行设备内存区间的(),index是内存段的索引 。若设备节点的reg属性有多段,可通过index标识要的是哪一段,只有1段的情况,index为0 。采用 Tree后,大量的设备驱动通过()进行映射,而不再通过传统
DTC( tree )
将.dts编译为.dtb的工具 。DTC的源代码位于内核/dtc目录,在linux内核使能了 Tree的情况下,编译内核的时候主机工具DTC就被编译出来,对应/dts/中"-y := dtc" 这一编译 。在linux内核的arch/arm/boot/dts/中,描述了当某种SOC被选中后,哪些.dtb文件会编译出来,如与对应的.dtb包括:
dtb-$(CONFIG_ARCH_VEXPRESS) += vexpress-v2p-ca5s.dtb \vexpress-v2p-ca9.dtb \vexpress-v2p-ca15-tc1.dtb \vexpress-v2p-ca15_a7.dtb \xenvm-4.2.dtb
【android 驱动学些入门-------Device Tree 第一篇】我们可以单独编译 Tree文件 。当我们在Linux内核下运行make dtbs时,若选择了,上述.dtb都会由对应的.dts编译出 。因为arch/arm/中含有一个dtbs编译项目 。