设备树dts属性介绍

设备树dts属性介绍

DTS标准属性介绍

compatible

​ compatible属性是为了与驱动文件想匹配。假设某驱动的platform_driver中的compatible与设备树某节点的compatible一致,那么它们就会被关联起来。

compatible = "fsl,mpc8641", "ns16550";

​ 属性值是字符串列表,推荐命名是"厂家,型号",像上面有多个字符串,匹配时是从左到右,假设没有"fsl,mpc8641"与之匹配,就会寻找"ns16550";假设找到"fsl,mpc8641",就相互匹配,就不会再找"ns16550"。

model

model = "fsl,MPC8349EMITX";
设备的名字,字符串类型,推荐命名规则与compatible相同;

​ 假设有两块板子ss101和ss102,它们的compatible = “ss,10x”;那么model就可以有它的作用。

model ="ss101";
model ="ss102";

phandle

pic@10000000 {
	phandle = <1>;
};
another-device-node {
	interrupt-parent = <1>;//引用pic节点
};

​ phandle是一个标识符,u32类型,一般由编译器全局分配唯一标识,以便引用其它节点引用。

ss:ss@132{
	compatible="ss";
};
<&ss>={
	model="ss";
};

​ &ss会被转换为ss节点的phandle,以便引用ss节点。

status

   my_led{
        compatible="ss,led";
        pinctrl-names = "default";
        pinctrl-0 = <&my_pinctrl_leds>;
        led-gpios= < &gpio5 3 GPIO_ACTIVE_LOW>;
		status="disalbe"
    };

​ 上面例子用来指示不适用这个节点。

ValueDescription
“okay”表示设备正常运行(默认)
“disabled”指示设备目前不能运行,但将来可能会运行(例如,某些东西没有插入或关闭)。
“reserved”指示设备正在运行,但不应该使用。这通常用于由另一个软件组件(如平台固件)控制的设备。
“fail”设备未运行。在设备中检测到一个严重的错误,如果不进行修复,它不太可能开始运行。
“fail-sss”设备未运行。在设备中检测到一个严重的错误,如果不进行修复,它不太可能开始运行。该值的sss部分是特定于设备的,指示检测到的错误情况。

#address-cells and #size-cells

​ 两者分别指示某些属性用多少个32位数字表示地址和分配的空间大小,例如"reg"。如果节点没有这个属性,则继承父节点的,以此类推。

soc {
#address-cells = <1>;
#size-cells = <1>;

serial@4600 {
    compatible = "ns16550";
    reg = <0x4600 0x100>;
    clock-frequency = <0>;
    interrupts = <0xA 0x8>;
    interrupt-parent = <&ipic>;
};

​ 上面代码中0x4600表示地址,0x100表示大小。

reg

​ 类型:(地址,长度)组成的队的数组。

​ reg属性描述由其父总线定义的地址空间内设备资源的地址。这通常意味着内存映射的IO寄存器块的偏移量和长度,但在某些总线类型上可能有不同的含义。根节点定义的地址空间中的地址为CPU实地址。

​ 假设片上系统中的设备有两个寄存器块,一个32字节块位于SOC中的偏移量0x3000,一个256字节块位于偏移量0xFE00。reg属性将编码如下(假设#address-cells和#size-cells的值1):

reg = <0x3000 0x20 0xFE00 0x100>;

virtual-reg

​ virtual-reg属性指定一个有效地址,该地址映射到设备节点的reg属性中指定的第一个物理地址,就是reg属性的偏移地址的真实物理地址。此属性使引导程序能够向客户端程序提供已设置的虚拟到物理映射。

例子:

mpsc@8000 {
	     compatible = "marvell,mv64360-mpsc";
	     reg = <0x8000 0x38>;
	     virtual-reg = <0xf1008000>;
	     interrupt-parent = <&PIC>;
};

UART2: serial@ef600500 {
    device_type = "serial";
    compatible = "ns16550";
    reg = <0xef600500 0x00000008>;
    virtual-reg = <0xef600500>;
    clock-frequency = <0>;
    current-speed = <0>;
    interrupt-parent = <&UIC0>;
    interrupts = <0x3 0x4>;
    status = "disabled";
};

ranges

类型:或被编码为任意数目的(子总线地址, 父总线地址, 长度)三元组。

ranges是用来子总线与父总线的映射关系的。

子总线地址子节点的起始的物理地址( #address-cells)
父总线地址父总线物理地址起始( #address-cells)
长度空间大小( #address-cells)

例子:

soc {
    compatible = "simple-bus";
    #address-cells = <1>;
    #size-cells = <1>;
    ranges = <0x0 0xe0000000 0x00100000>;

    serial@4600 {
        device_type = "serial";
        compatible = "ns16550";
        reg = <0x4600 0x100>;
        clock-frequency = <0>;
        interrupts = <0xA 0x8>;
        interrupt-parent = <&ipic>;
    };
};

​ ranges = <0x0 0xe0000000 0x00100000>;此属性值指定对于1024 KB范围的地址空间,子节点在物理位置寻址。0x0映射到物理地址0xe0000000的父地址。

​ 使用此映射,串行设备节点可以通过地址0xe0004600的加载或存储来寻址,偏移量为0x4600(在reg中指定)加上在ranges中指定的0xe0000000映射。

中断属性

#interrupt-cells

​ 指定由多少个32位数字表示一个中断。

interrupt-controller

​ 属性值为空,表示这是一个中断控制器。

interrupt-parent

​ 指示该级中断的父节点中断是哪个,也可以理解为受哪个中断控制器管理。

interrupts

​ 指定用的是哪个中断,还有触发类型,用多少位数字表示受上级中断控制器的#interrupt-cells 管理。

例子:

sii902x: sii902x@39 {
     compatible = "SiI,sii902x";
     interrupt-parent = <&gpio1>;
     interrupts = <18 IRQ_TYPE_EDGE_FALLING>;  
};

gpio1: gpio@0209c000 {
    interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>,
             <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
    interrupt-controller;
    #interrupt-cells = <2>;
	interrupt-parent = <&gpc>;
};

gpc: gpc@020dc000 {
    compatible = "fsl,imx6ul-gpc", "fsl,imx6q-gpc";
    reg = <0x020dc000 0x4000>;
    interrupt-controller;
    #interrupt-cells = <3>;
    interrupts = <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;
    interrupt-parent = <&intc>;
    fsl,mf-mix-wakeup-irq = <0xfc00000 0x7d00 0x0 0x1400640>;
};

intc: interrupt-controller@00a01000 {
    compatible = "arm,cortex-a7-gic";
    #interrupt-cells = <3>;
    interrupt-controller;
    reg = <0x00a01000 0x1000>,
          <0x00a02000 0x100>;
};

​ sii902x的上级中断是gpio1,gpio1中#interrupt-cells = <2>,所以再sii902x中interrupts用2个32位数字表示,其中18表示用哪个中断,IRQ_TYPE_EDGE_FALLING表示触发方式。

​ gpio1的上级中断是gpc,gpc中#interrupt-cells = <3>,所以gpio1中interrupts用3个32位数字表示,其中GIC_SPI表示共享中断(在多核处理器上有些中断是某个cpu特有的),66表示用哪个中断,IRQ_TYPE_LEVEL_HIGH表示触发方式;interrupt-controller表示gpio1是个中断控制器。

​ 剩下的依次类推。

interrupts-extended

​ 它的功能相当于interrupt-parent和interrupts的结合;

interrupt-parent = <&gpio1>;
interrupts = <18 IRQ_TYPE_EDGE_FALLING>;
/***********************/
interrupts-extended=<&gpio1 18 IRQ_TYPE_EDGE_FALLING>

gpio常用属性

#gpio-cells

​ 类型:u32

​ 指定用多少个32位的数字描述引脚。

gpio-controller

​ 表明是gpio控制器,空类型;

< name >-gpios

​ < name >-gpios是用来指定用到了哪些引脚的,其中name是自己命名的,再驱动程序中可以通过name获取到gpio资源,也可以直接gpios=<&gpio1 1 GPIO_ACTIVE_LOW>,不定义名称。

例子:

my_led{
    compatible="ss,led";
    pinctrl-names = "default";
    pinctrl-0 = <&my_pinctrl_leds>;
    led-gpios= <&gpio1 1 GPIO_ACTIVE_LOW
                &gpio4 3 GPIO_ACTIVE_LOW
                &gpio5 3 GPIO_ACTIVE_LOW>;
};

gpio1: gpio@0209c000 {
    compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio";
    reg = <0x0209c000 0x4000>;
    interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>,
             <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
    gpio-controller;
    #gpio-cells = <2>;
    interrupt-controller;
    #interrupt-cells = <2>;
};

​ gpio1控制器中#gpio-cells = <2>,所以my_led中用2个数字表示一个引脚,&gpio1表示使用gpio1控制器,1表示gpio1_1引脚,GPIO_ACTIVE_LOW表示低电平为逻辑1。

ngpios

gpio-controller@00000000 {
	compatible = "foo";
	reg = <0x00000000 0x1000>;
	gpio-controller;
	#gpio-cells = <2>;
	ngpios = <18>;
}

​ 假设某个gpio组中只有gpio0~gpio17,就可以在设备树中使用ngpios = <18>通知驱动程序只有某gpio组前18个引脚是有效的。

gpio-line-names

​ 一个字符串数组,用于定义从接口输出的GPIO线的名称GPIO控制器,该名称应该是最有意义的生产者名称对于系统来说.

gpio@8000e100 {
			/* GPIOs 128 - 159 */
			gpio-line-names = "", "", "", "", "", "", "", "",
				     "", "", "",
				     "DIPRO_INT", /* GPIO139 */
				     "XSHUTDOWN_SECONDARY_SENSOR",
				     "XSHUTDOWN_PRIMARY_SENSOR",
				     "NFC_RST (NFC_CTRL_",
				     "TOUCH_RST",
				     "NFC_IRQ (NFC_CTRL_1)",
				     "HAL_SW",
				     "TOUCH_RST2",
				     "", "",
				     "VAUDIO_HF_EN", /* GPIO149 */
				     "", "", "", "", "", "", "", "", "", "";
};

gpio-hog

​ 锁定gpio引脚的作用,基本上 gpio-hog 属性告诉 Controller 在启动期间将引脚设置为高电平/低电平,并且没有其他驱动程序/用户空间会请求它。

​ 如果你打算在用户空间使用 gpio,你不应该使用 gpio-hog。

​ 可以选择input,output-low,output-high

例子:

qe_pio_a: gpio-controller@1400 {
	compatible = "fsl,qe-pario-bank-a", "fsl,qe-pario-bank";
	reg = <0x1400 0x18>;
	gpio-controller;
	#gpio-cells = <2>;

	line_b {
		gpio-hog;
		gpios = <6 0>;
		output-low;
		line-name = "foo-bar-gpio";
	};
};

gpio-ranges

​ 用于gpio与pinctrl设置之间的匹配。

qe_pio_e: gpio-controller@1460 {
	#gpio-cells = <2>;
	compatible = "fsl,qe-pario-bank-e", "fsl,qe-pario-bank";
	reg = <0x1460 0x18>;
	gpio-controller;
	gpio-ranges = <&pinctrl1 0 20 10>, <&pinctrl2 10 50 20>;
};

​ gpio0-gpio10路由至pinctrl1的20-29;

gpio-ranges-group-names

​ gpio-ranges后面两位为0,才可以使用gpio-ranges-group-names。

gpio-ranges = <&iomux 0 0 0>;
gpio-ranges-group-names = "gpiob";
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值