精华内容
下载资源
问答
  • 设备树之gpio和自定义属性获取

    千次阅读 2015-12-09 15:47:15
    如下图:
    如下图:
    
    展开全文
  • name:name@xxxxxxx { value = <1>; } 上面是设备树的一个节点,xxxx代表物理地址。value是自定义的一个值。 static int module_probe(struct platform_device *pdev){ ... //读取设备树中
    name:name@xxxxxxx {
    	value = <1>;
    }
    

    上面是设备树的一个节点,xxxx代表物理地址。value是自定义的一个值。

    static int module_probe(struct platform_device *pdev){
    	struct device_node *np;
    	uint32_t read_value;
    	struct device *dev = &pdev->dev;
    	np = dev->of_node;
    	//读取设备树中value的值,存储到read_value中
    	of_property_read_u32(np, "value", &read_value);
    }
    
    展开全文
  • imx7自定义设备树

    2020-02-27 17:44:07
    背景:根据自己需求更改官方提供设备树设备树目录:内核源码文件内arch/arm/boot/dts/。 复制一份源dts。cp arch/arm/boot/dts/imx7d-colibri-eval-v3.dts arch/arm/boot/dts/imx7d-colibri-eval-my-carrier....

    背景:根据自己需求更改官方提供设备树。

    设备树目录:内核源码文件内arch/arm/boot/dts/

    1. 复制一份源dts。cp arch/arm/boot/dts/imx7d-colibri-eval-v3.dts arch/arm/boot/dts/imx7d-colibri-eval-my-carrier.dts
    2. 扩展Makefile,加入对新dts的编译支持。vi arch/arm/boot/dts/Makefile。
    3. dts修改完成后,使用make dtbs生成新的imx7d-colibri-eval-my-carrier.dtb文件,以供内核加载。
    dtb-$(CONFIG_SOC_IMX7D) += \
           imx7d-cl-som-imx7.dtb \
           imx7d-colibri-aster.dtb \
           imx7d-colibri-emmc-aster.dtb \
           imx7d-colibri-emmc-eval-v3.dtb \
           imx7d-colibri-eval-v3.dtb \
           imx7d-nitrogen7.dtb \
           imx7d-sbc-imx7.dtb \
           imx7s-colibri-aster.dtb \
           imx7s-colibri-eval-v3.dtb \
           imx7s-warp.dtb \
           imx7d-colibri-eval-my-carrier.dtb
    

    覆盖属性

    要覆盖属性,需要使用&字符和标签来引用该节点。较晚的设备树条目将覆盖较早的条目(条目的顺序顺序很重要,因此包含顺序很重要)。通常,较高的层(例如,载板设备树)会覆盖较低的层(例如,SoC设备树),因为较高的层一开始就包括较低的层。

    例如,对于能够用作设备或主机(双角色)的USB控制器,可以使用dr_mode属性显式覆盖默认模式:

    &usbdev0{
        dr_mode = "host";
    };

    激活/停用设备

    设备的重要属性是状态属性。它允许激活/停用设备。SoC级设备树中指定了许多设备,但是默认情况下它们被禁用。通过引用基本节点(使用&字符和标签),可以通过覆盖status属性的任何层来启用设备。

    &uart4{
        status = "okay";
    };

    覆盖节点

    整个节点可以通过简单地重新定义它们来覆盖。与覆盖属性一样,后面的定义会覆盖前面的定义。

    例如,通过简单地在设备树中重新定义Vybrids UART2(UART_B)的引脚配置来覆盖uart2grp节点(此pinctrl规范已在imx7d-colibri.dtsi中定义,但具有CTS / RTS引脚)

    &iomuxc {
    
            pinctrl_uart2: uart2grp {
                fsl,pins = <
                    MX7D_PAD_GPIO1_IO09__GPIO1_IO9 0x74
                    MX7D_PAD_GPIO1_IO09__GPIO1_IO9 0x14
                >;
            };
    ...
    };

    删除属性或节点

    也可以使用/ delete-property // delete-node /删除属性,甚至删除节点。以下示例删除载板级设备树imx6qdl-colibri.dtsi中定义的fsl,uart-has-rtscts属性:

    &uart1 {
        /delete-property/fsl,uart-has-rtscts;
    };

    删除节点,则使用名称。

    /delete-node/backlight;

    别名

    设备树允许使用别名重新排列某些设备类型。例如,这对于RTC很有用,因为第一个RTC设备被用作系统的主要时间源。应将主要时间源分配给rtc0别名(在本示例中,我们将snvsrtc分配为主要RTC,即Vybrids内部RTC):

        aliases {
            rtc0 = &snvsrtc;
            rtc1 = &rtc;
        };

    引用节点

    如果需要其他设备的资源,则使用引用来连接两个设备。通常,它用于为设备分配资源,例如中断,时钟,GPIO或PWM通道。根据所引用的设备,需要一定数量的参数(单元格)。该数量在父设备的-cells属性中定义。

    通用输入输出

    GPIO规范需要引用GPIO节点和一个或多个单元(参数)。单元格的数量取决于驱动程序。它可以从设备树绑定文档中获得,也可以通过查看GPIO控制器节点获得(输出GPIO的设备标有该gpio-controller属性)。该#gpio-cells属性定义了预期的单元数量。例如,GPIO控制器在imx7d.dtsi中定义如下:

    gpio1: gpio@4004a000 {                                                                                              
        compatible = "fsl,imx7d-gpio";                                                                              
        reg = <0x4004a000 0x1000 0x400ff040 0x40>; 
        gpio-controller;
        #gpio-cells = <2>;
    ...

     

    展开全文
  • Linux设备树中一些标准属性介绍标准属性1、compatible 属性2、 model 属性3、 status 属性4、 #address-cells 和#size-cells 属性5、 reg 属性6、 ranges 属性7、 name 属性8、 device_type 属性 标准属性 节点是由...

    标准属性

    节点是由一堆的属性组成,节点都是具体的设备,不同的设备需要的属性不同,用户可以自定义属性。除了用户自定义属性,有很多属性是标准属性, Linux 下的很多外设驱动都会使用这些标准属性。

    1、compatible 属性

    compatible 属性也叫做“兼容性”属性,这是非常重要的一个属性! compatible 属性的值是一个字符串列表, compatible 属性用于将设备和驱动绑定起来。字符串列表用于选择设备所要使用的驱动程序, compatible 属性的值格式如下所示:

    "manufacturer,model"
    

    其中 manufacturer 表示厂商, model 一般是模块对应的驱动名字。比如 imx6ull-alientekemmc.dts 中 sound 节点是 I.MX6U-ALPHA 开发的音频设备节点, I.MX6U-ALPHA 开发板上的音频芯片采用的欧胜(WOLFSON)出品的 WM8960, sound 节点的 compatible 属性值如下:

    compatible = "fsl,imx6ul-evk-wm8960","fsl,imx-audio-wm8960";
    

    属性值有两个,分别为“fsl,imx6ul-evk-wm8960”和“fsl,imx-audio-wm8960”,其中“fsl”表示厂商是飞思卡尔,“imx6ul-evk-wm8960”和“imx-audio-wm8960”表示驱动模块名字。 sound这个设备首先使用第一个兼容值在 Linux 内核里面查找,看看能不能找到与之匹配的驱动文件,如果没有找到的话就使用第二个兼容值查。

    一般驱动程序文件都会有一个 OF 匹配表,此 OF 匹配表保存着一些 compatible 值,如果设备节点的 compatible 属性值和 OF 匹配表中的任何一个值相等,那么就表示设备可以使用这个驱动。比如在文件 imx-wm8960.c 中有如下内容:
    在这里插入图片描述
    第 632~635 行的数组 imx_wm8960_dt_ids 就是 imx-wm8960.c 这个驱动文件的匹配表,此匹配表只有一个匹配值“fsl,imx-audio-wm8960”。如果在设备树中有哪个节点的 compatible 属性值与此相等,那么这个节点就会使用此驱动文件。

    第 642 行, wm8960 采用了 platform_driver 驱动模式。此行设置.of_match_table 为 imx_wm8960_dt_ids,也就是设置这个 platform_driver 所使用的OF 匹配表。

    2、 model 属性

    model 属性值也是一个字符串,一般 model 属性描述设备模块信息,比如名字什么的,比如:

    model = "wm8960-audio";
    

    3、 status 属性

    status 属性看名字就知道是和设备状态有关的, status 属性值也是字符串,字符串是设备的状态信息,可选的状态如表下所示:

    描述
    “okay”表明设备是可操作的。
    “disabled”表明设备当前是不可操作的,但是在未来可以变为可操作的,比如热插拔设备插入以后。至于 disabled 的具体含义还要看设备的绑定文档。
    “fail”表明设备不可操作,设备检测到了一系列的错误,而且设备也不大可能变得可操作。
    “fail-sss”含义和“fail”相同,后面的 sss 部分是检测到的错误内容。

    4、 #address-cells 和#size-cells 属性

    这两个属性的值都是无符号 32 位整形, #address-cells 和#size-cells 这两个属性可以用在任何拥有子节点的设备中,用于描述子节点的地址信息。 #address-cells 属性值决定了子节点 reg 属性中地址信息所占用的字长(32 位), #size-cells 属性值决定了子节点 reg 属性中长度信息所占的。字长(32 位)。 #address-cells 和#size-cells 表明了子节点应该如何编写 reg 属性值,一般 reg 属性都是和地址有关的内容,和地址相关的信息有两种:起始地址和地址长度, reg 属性的格式一为:

    reg = <address1 length1 address2 length2 address3 length3……>
    

    每个“address length”组合表示一个地址范围,其中 address 是起始地址, length 是地址长度, #address-cells 表明 address 这个数据所占用的字长, #size-cells 表明 length 这个数据所占用的字长,比如:

    spi4 {
     	compatible = "spi-gpio";
    	 #address-cells = <1>;
    	 #size-cells = <0>;
    
    gpio_spi: gpio_spi@0 {
    	 compatible = "fairchild,74hc595";
    	 reg = <0>;
     	};
     };
    
     aips3: aips-bus@02200000 {
    	 compatible = "fsl,aips-bus", "simple-bus";
    	 #address-cells = <1>;
    	 #size-cells = <1>;
    
     dcp: dcp@02280000 {
    	 compatible = "fsl,imx6sl-dcp";
    	 reg = <0x02280000 0x4000>;
    	 };
     };
    

    第 3, 4 行,节点 spi4 的#address-cells = <1>, #size-cells = <0>,说明 spi4 的子节点 reg 属性中起始地址所占用的字长为 1,地址长度所占用的字长为 0。

    第 8 行,子节点 gpio_spi: gpio_spi@0 的 reg 属性值为 <0>,因为父节点设置了#addresscells = <1>, #size-cells = <0>,因此 addres=0没有 length 的值,相当于设置了起始地址,而没有设置地址长度。

    第 14, 15 行,设置 aips3: aips-bus@02200000 节点#address-cells = <1>, #size-cells = <1>,说明 aips3: aips-bus@02200000 节点起始地址长度所占用的字长为 1,地址长度所占用的字长也为 1。

    第 19 行,子节点 dcp: dcp@02280000 的 reg 属性值为<0x02280000 0x4000>,因为父节点设置了#address-cells = <1>, #size-cells = <1>, address= 0x02280000, length= 0x4000,相当于设置了起始地址为 0x02280000,地址长度为 0x40000。

    5、 reg 属性

    reg 属性前面已经提到过了, reg 属性的值一般是(address, length)对。 reg 属性一般用于描述设备地址空间资源信息,一般都是某个外设的寄存器地址范围信息,比如在 imx6ull.dtsi 中有如下内容:

    uart1: serial@02020000 {
    	 compatible = "fsl,imx6ul-uart",
    	 "fsl,imx6q-uart", "fsl,imx21-uart";
    	 reg = <0x02020000 0x4000>;
    	 interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
    	 clocks = <&clks IMX6UL_CLK_UART1_IPG>,
    	 <&clks IMX6UL_CLK_UART1_SERIAL>;
    	 clock-names = "ipg", "per";
    	 status = "disabled";
     };
    

    上述代码是节点 uart1, uart1 节点描述了 I.MX6ULL 的 UART1 相关信息,重点是第4行的 reg 属性。其中 uart1 的父节点 aips1: aips-bus@02000000 设置了#address-cells = <1>、 #sizecells = <1>,因此 reg 属性中 address=0x02020000, length=0x4000。查阅《I.MX6ULL 参考手册》可知, I.MX6ULL 的 UART1 寄存器首地址为 0x02020000,但是 UART1 的地址长度(范围)并没有 0x4000 这么多,这里我们重点是获取 UART1 寄存器首地址。

    6、 ranges 属性

    ranges属性值可以为空或者按照(child-bus-address,parent-bus-address,length)格式编写的数字矩阵, ranges 是一个地址映射/转换表, ranges 属性每个项目由子地址、父地址和地址空间长度这三部分组成:

    child-bus-address:子总线地址空间的物理地址,由父节点的#address-cells 确定此物理地址所占用的字长。

    parent-bus-address: 父总线地址空间的物理地址,同样由父节点的#address-cells 确定此物理地址所占用的字长。

    length: 子地址空间的长度,由父节点的#size-cells 确定此地址长度所占用的字长。

    如果 ranges 属性值为空值,说明子地址空间和父地址空间完全相同,不需要进行地址转换,对于我们所使用的 I.MX6ULL 来说,子地址空间和父地址空间完全相同,因此会在 imx6ull.dtsi中找到大量的值为空的 ranges 属性,如下所示:

    soc {
    	#address-cells = <1>;
    	#size-cells = <1>;
    	compatible = "simple-bus";
    	interrupt-parent = <&gpc>;
    	ranges;
     }
    

    第 6 行定义了 ranges 属性,但是 ranges 属性值为空。

    soc {
    	compatible = "simple-bus";
    	#address-cells = <1>;
    	#size-cells = <1>;
    	ranges = <0x0 0xe0000000 0x00100000>;
    
    serial {
    	device_type = "serial";
    	compatible = "ns16550";
    	reg = <0x4600 0x100>;
    	clock-frequency = <0>;
    	interrupts = <0xA 0x8>;
    	interrupt-parent = <&ipic>;
    	};
    };
    

    第 5 行,节点 soc 定义的 ranges 属性,值为<0x0 0xe0000000 0x00100000>,此属性值指定了一个 1024KB(0x00100000)的地址范围,子地址空间的物理起始地址为 0x0,父地址空间的物理起始地址为 0xe0000000。

    第 10 行, serial 是串口设备节点, reg 属性定义了 serial 设备寄存器的起始地址为 0x4600,寄存器长度为 0x100。经过地址转换, serial 设备可以从 0xe0004600 开始进行读写操作,0xe0004600=0x4600+0xe0000000。

    7、 name 属性

    name 属性值为字符串, name 属性用于记录节点名字, name 属性已经被弃用,不推荐使用name 属性,一些老的设备树文件可能会使用此属性。

    8、 device_type 属性

    device_type 属性值为字符串, IEEE 1275 会用到此属性,用于描述设备的 FCode,但是设备树没有 FCode,所以此属性也被抛弃了。此属性只能用于 cpu 节点或者 memory 节点。imx6ull.dtsi 的 cpu0 节点用到了此属性,内容如下所示:

    cpu0: cpu@0 {
     	compatible = "arm,cortex-a7";
     	device_type = "cpu";
    	 reg = <0>;
    ......
     };
    

    关于标准属性就讲解这么多,其他的比如中断、 IIC、 SPI 等使用的标准属性等到具体的例程再具体分析。

    展开全文
  • 第 2、6 和 17 行,aliases、cpus和 intc是三个子节点,在设备树中节点命名格式如下: node-name@unit-address 其中“node-name”是节点名字,为 ASCII 字符串,节点名字应该能够清晰的描述出节点的功能,比如...
  • 设备树基本语法及属性分析

    千次阅读 2019-04-29 08:49:42
    在操作系统引导启动阶段进行设备初始化的时候,设备树中描述硬件的信息被检测到并传递给操作系统。 二:设备树起源与意义 设备树在2011年被引入到ARM Linux内核中,也就是在Linux内核3.x以后引入的,在内核3.x之前...
  • linux设备树笔记__自定义改造

    千次阅读 2015-11-26 16:56:24
    设备树(DTS)我们基本都是通过of_get_xxx这样的内核API来被动获取设备结点的属性值,很少会去修改它,如果要修改某个属性值,必须在各个设备驱动之前修改,一般在board级别代码修改。那为什么要去修改呢,什么需求...
  • 之前讲过platform下driver.c获取device.c中的设备信息是通过platform_get_resource函数获取的,那么要获取设备树中的节点信息,Linux内核也提供了专门的函数。 1 of操作函数 Linux内核也提供了专门的函数,位于...
  • 在驱动开发中如果可以使用设备树进行参数配置而不用频繁修改源码时间很方便的事情。 这里以I2C设备举例,记录一下。...设备树中定义: &i2c1 { modle1@15 { compatible = "company name,modle...
  • Q:当加载完json数据生成设备树后,对设备树进行遍历,遍历到的内容? A:所有的json数据都会被加载,所有的相关内容都会被遍历到。 遍历: var roots=$('#deviceList').tree('getRoots'),children,i,j; for(var ...
  • 节点是由一堆属性组成的,节点都是具体的设备,不同的设备需要的属性不同,用户可以自定义属性。除了用户自定义属性,有很多属性都是标准属性 1. compatible属性 compatible属性也叫做“兼容性”属性,是一个...
  • 【Linux驱动开发】Linux设备树详解

    千次阅读 2019-12-05 10:49:25
    设备树(Device Tree),将这个词分开就是“设备”和“树”,描述设备树的文件叫做 DTS(Device Tree Source),这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如 CPU 数量、 内存基地址、IIC ...
  • 在简单了解概念之后,我们可以开始尝试写一个简单的设备树,从而加深对设备树整体架构以及部分语法的理解,因为整体知识面比价庞杂,无法面面俱到,本文旨在笔者学习之初对于设备树常用部分的总结与归纳。...
  • Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离。相当于从驱动代码分离出来的配置文件,比如串口的波特率通过设备树配置,当需要改变波特率时,就不用修改驱动,直接修改配置文件则可。 ...
  • 设备树简介   在内核源码,存在大量对板级细节信息描述的代码。这些代码充斥在/arch/arm/plat-xxx和/arch/arm/mach-xxx目录,对内核而言这些platform设备、resource、i2c_board_info、spi_board_info以及各种...
  • dts文件的spi节点
  • Linux 设备树详解

    千次阅读 2018-11-07 15:37:44
    本文基于天嵌E9V3开发板,详解设备树的语法结构和用法。 一、设备树 二、E9V3设备树总览 E9V3设备树总览: 三、设备树编写规则
  • 树中最高顶级的元素。因此,在 :root 选择器是声明的CSS自定义属性,其作用域的范围是 全局范围 ,也就是全局作用域。 明白了? 示例 假设你想创建一个CSS自定义属性,该自定义属性存储Web网站皮肤的主色(Primary ...
  • Linux设备树是什么?

    千次阅读 多人点赞 2021-01-28 11:13:35
    随着Linux的不断发展,基本上现在所有的驱动程序都是基于设备树的,而设备树到底是什么?...文本介绍了设备树、以及分享了一些设备树的基本语法、一些基本属性等,最后简单分析了设备匹配的基本流程
  • 在WPF中自定义控件

    万次阅读 2018-11-07 20:39:41
    在WPF中自定义控件
  • Zynq SOC学习笔记之设备树

    千次阅读 2020-05-10 18:58:34
    DTS即DeviceTree Source 设备树源码,是一种描述硬件的数据结构 以树状节点的方式描述一个设备的各种硬件信息细节:CPU、GPIO、时钟、中断、内存等,形成类似文本文件dts,直接透过它传递给Linux,使得驱动程序与...
  • js面试题

    千次阅读 多人点赞 2019-04-09 19:42:32
    回流:当渲染树中的元素的布局(如:尺寸、位置、隐藏/状态状态)发生改变时,产生重绘回流 注意:JS 获取 Layout 属性值(如:offsetLeft、scrollTop、getComputedStyle 等)也会引起回流。因为浏览器需要通过...
  • 在Linux3.x版本后,arch/arm/plat-xxx和arch/arm/mach-xxx,描述板级细节的代码(比如platform_device、i2c_board_info等)被大量取消,取而代之的是设备树,其目录位于arch/arm/boot/dt
  • Linux 设备树 DTS 语法

    千次阅读 2020-02-15 18:37:00
    设备树(Device Tree) DTS(Device Tree Source) : 描述设备树的文件 DTS文件采用 树形结构描述板级设备 如:CPU数目,内存基地址,IIC接口的设备,SPI接口的设备 树干:系统总线 树支:IIC控制器,GPIO...
  • 前端面试锦集

    千次阅读 多人点赞 2019-07-20 13:41:45
    立即执行函数的两种常见形式:( function(){…} )()和( function (){…} () ),一个是一个匿名函数包裹在一个括号运算符,后面再跟一个小括号,另一个是一个匿名函数后面跟一个小括号,然后整个包裹在一个括号...
  • 前端面试题

    万次阅读 多人点赞 2019-08-08 11:49:01
    CSS可以通过哪些属性定义,使得一个DOM元素不显示在浏览器可视范围内? 29 超链接访问过后hover样式就不出现的问题是什么?如何解决? 29 什么是Css Hack?ie6,7,8的hack分别是什么? 30 行内元素和块级元素...
  • 使用设备树时,给驱动程序调用的过程 我们把设备树.dts 变成plantform_device的资源 过程一步步了解清楚 吃
  • 本系列导航:高通平台8953 Linux DTS(Device Tree Source)设备树详解之一(背景基础知识篇)高通平台8953 Linux DTS(Device Tree Source)设备树详解之二(DTS设备树匹配过程)高通平台8953 Linux DTS(Device Tree ...
  • 从零开始写设备树DTS

    万次阅读 2016-10-27 19:12:00
    设备树就是有一些属性和节点组成的一种数据结构,属性一般会赋予一些属性值,而节点则可能是是由属性跟其下的子节点构成。下面是一个简单的例子: /dts-v1/;   / {  node1 {  a-string-property = "A ...
  • C#基础教程-c#实例教程,适合初学者

    万次阅读 多人点赞 2016-08-22 11:13:24
    ReadLine表示从输入设备输入数据,WriteLine则用于在输出设备上输出数据。 如果在电脑上安装了Visual Studio.Net,则可以在集成开发环境直接选择快捷键或菜单命令编译并执行源文件。如果您不具备这个条件,那么...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,821
精华内容 11,528
关键字:

自定义属性设备树中