7.7.1.设备树简介
什么是设备树?到处可以听得见的名词,先看了一下ZDYZ的43章,引用:
“cpu0 这个设备节点信息,这个节点信息描述了I.MX6ULL 这颗 SOC 所使用的 CPU 信息,比如架构是 cortex-A7,频率支持 996MHz、792MHz、528MHz、396MHz 和 198MHz 等等。” 先简单了解下就ok。
设备树下的GPIO操作:
“其实对于大多数的 32 位 SOC 而言,引脚的设置基本都是这两方面,因此 Linux 内核针对 PIN 的配置推出了 pinctrl 子系统,对于 GPIO的配置推出了 gpio 子系统。”
7.7.2.设备树语法
可以看下开发手册,这里不多说了。
体验:查看下6ull的设备树文件.dts,从compatible看出它可以兼容"fsl,imx6ull-14x14-evk", "fsl,imx6ull",从model中看出是"Freescale i.MX6 ULL 14x14 EVK Board",也就是抄的官网的EVK板子。
Make编译看下,make dtbs V=1,生成.dtb文件。
7.7.3.设备树的使用
基于设备树的platform_device和platform_driver是如何匹配的呢?看OF style match过程。当匹配之后,platform_driver如何获取到platform_device的资源呢?前面是在platform_driver中使用一个platform_get_resource()获取,这里应该是类似的吧。
如果设备树的节点中有reg、IRQ属性,内核会将reg属性转化成内存属性(IORESOURCE_MEM ),IRQ转化成中断属性(IORESOURCE_IRQ),然后就可以使用platform_get_resource()获取。对于不能转化成platform-device的设备怎么去获取呢?
分为3类函数:找到节点、找到属性和获取属性。
内核文档 Documentation/devicetree/bindings/做得好的厂家也会提供设备树的说明文档,找了一个pwm-backlight.txt看下,还能看懂的样子。
1 pwm-backlight bindings
2
3 Required properties:
4 - compatible: "pwm-backlight"
5 - pwms: OF device-tree PWM specification (see PWM binding[0])
6 - brightness-levels: Array of distinct brightness levels. Typically these
7 are in the range from 0 to 255, but any range starting at 0 will do.
8 The actual brightness level (PWM duty cycle) will be interpolated
9 from these values. 0 means a 0% duty cycle (darkest/off), while the
10 last value in the array represents a 100% duty cycle (brightest).
24 Example:
25
26 backlight {
27 compatible = "pwm-backlight";
28 pwms = <&pwm 0 5000000>; //5MHz?
29
30 brightness-levels = <0 4 8 16 32 64 128 255>; //CCR?
31 default-brightness-level = <6>;
32
33 power-supply = <&vdd_bl_reg>;
34 enable-gpios = <&gpio 58 0>;
35 };