• 设备树的引入:由于platform_device驱动大都是.c文件,会造成代码的臃肿;设备树是一种配置文件,与内核相隔开。
  • 创建设备节点的格式:
[label:] node-name[@unit-address] {
   [properties definitions]
   [child nodes]  
};
  • 删除一个设备树节点:/delete-node/ &label; 或者在根节点之外将状态属性设置为 disabled :
&label{
  status = "disabled";
};
  • dts在PC机上被编译为dtb文件,u-boot把dtb文件传给内核,内核解析dtb文件,把每一个节点转换为device_node结构体,对于某些device_node结构体,会被转化为platform_device结构体。

是否转化可以看:根节点下的子节点的compatible属性;转化为platform_form结构体的节点,这个是在sys/bus/platform/device目录下可以查看到;

  • dtsi文件可以被dts文件包含,dtsi文件一般是描述芯片相关的,dts文件是产品相关的;
  • 在描述i2c时,总线和设备都有各自的驱动,i2c设备节点放在i2c总线下,创建子节点,描述自身相关的信息(设备地址reg、驱动);描述LCD时,LCD控制器和显示器有各自的驱动,节点仍是父子关系;
  • 设备树的信息可以查看绑定文档Documentaion/devicetree/bindings;
  • 引入pinctrl和GPIO子系统:简化寄存器操作;
  • 对于pinctrl来说:引入client device概念(相当于用户设备端,使用服务的一方),在节点中定义了pinctrl-names(表示有几个状态),用pinctrl-0、pinctrl-1表示这些状态, 这些会等于某些节点,这些节点会在pincontroller里面定义(提供服务的一方),包括fun、group等,用来把某些引脚复用为一些功能;这部分是在platform_device和platform_driver的枚举过程中,在really_probe函数中,调用probe函数之前会去设置对应的引脚。

android系统如何确定设备树文件 设备树compatible_引脚

  • 对于GPIO来说:用户设备中使用gpios = <&gpio n flag>进行配置,第一项为gpio控制器,第二项为哪个引脚;gpio控制器中有gpio-controller、gpio-cells = <n>等,其中 n为gpios中除去第一项以后还有几项就是n;

android系统如何确定设备树文件 设备树compatible_android系统如何确定设备树文件_02

  • (1)看原理图搜索pin_name;(2)确定pinctrl名字;(3)找到节点;(4)若找不到,还可以找到对应的外接芯片的名字,找到对应的节点。
  • 若设备使用i2c,则相应的引脚是由i2c来设置节点,并且将相应的设备子节点放到i2c父节点下。
  • 在led节点中, “ &gpio5 ”含义 :在编译成设备树文件后,将其反汇编为dts文件,可以看到其转换为gpio5节点下的 phandle值,(唯一表示此节点)