设备树一

简介: 设备树一

前言

设备树是采用树形结构来描述板子上的设备信息的文件,每个设备都是一个节点,叫做设备节点,每个节点都通过一些属性信息来描述节点信息,属性就是键—值对。节点是由一堆的属性组成,节点都是具体的设备,不同的设备需要的属性不同,用户可以自定义属性。除了用户自定义属性,有很多属性是标准属性, Linux 下的很多外设驱动都会使用这些标准属性。


一、compatible 属性

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

compatible = "manufacturer,model";

其中 manufacturer 表示厂商, model 一般是模块对应的驱动名字。一般驱动程序文件都会有一个 OF 匹配表,此 OF 匹配表保存着一些 compatible 值,如果设

备节点的 compatible 属性值和 OF 匹配表中的任何一个值相等,那么就表示设备可以使用这个

驱动。

设备树内容:

pinctrl_key: keygrp {
 fsl,pins = <
 MX6UL_PAD_UART1_CTS_B__GPIO1_IO18 0xF080 /* KEY0 */
 >;
 };
gpio_keys_imxu6ll {
compatible = "atkalpha-key";
gpios = <&gpio1 18 GPIO_ACTIVE_LOW>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_key>;
};

获取属性:

static const struct of_device_id gpio_key_tree[] = {
    { .compatible = "atkalpha-key" },
    { },
};
/*
 *数组 gpio_key_tree就是这个驱动文件的匹配表,此匹配表只
 * 有一个匹配值“atkalpha-key”。如果在设备树中有哪个节点
 * 的 compatible 属性值与此相等,那么这个节点就会使用此驱动文件。
 */
/* 1. 定义platform_driver */
static struct platform_driver gpio_key_driver = {
    .probe      = gpio_key_probe,
    .remove     = gpio_key_remove,
    .driver     = {
        .name   = "imx6ull_gpio_key",
        .of_match_table = gpio_key_tree,
    },
};

二、model 属性

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

model = "atkalpha-key";

三、status 属性

status 属性值也是字符串,字符串是设备的状态信息,不同值对应的属性:

“okay” 

表明设备是可操作的。

“disabled” 

表明设备当前是不可操作的,但是在未来可以变为可操作的,比如热插拔设备插入以后。至于 disabled 的具体含义还要看设备的绑定文档。

“fail”

表明设备不可操作,设备检测到了一系列的错误,而且设备也不大可能变得可

操作。

“fail-sss” 

含义和“fail”相同,后面的 sss 部分是检测到的错误内容。

四、reg,#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 这个数据所占用的字长,


五、ranges 属性

ranges属性值可以为空或者按照(child-bus-address,parent-bus-address,length)格式编写的数字矩阵,

ranges = <child-bus-address parent-bus-address length>

ranges 是一个地址映射/转换表, ranges 属性每个项目由子地址、父地址和地址空间长度这三部分组成:

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

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

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



目录
相关文章
|
运维 监控
浅析SPI与CAN通信
SPI是一种常用的MCU与外设的通信方式,英文全称Serial Peripheral Interface。与之前介绍过的UART不同,SPI是串行,全双工,同步通信方式。SPI通常有4根物理连接线,分别是CS片选,SCK时钟,MOSI主机输出从机输入和MISO主机输入从机输出。CS片选是从机选择信号线,低电平有效。当CS为低电平时认为主机目前选中的本从机。SCK是串行时钟线,同步通信需要主从机时钟同步,主机利用SCK线与从机实现时钟同步。时钟由主机产生,决定了通讯的速率。
556 0
|
存储 Shell Linux
【Shell 命令集合 系统设置 】Linux 生成并更新内核模块的依赖 depmod命令 使用指南
【Shell 命令集合 系统设置 】Linux 生成并更新内核模块的依赖 depmod命令 使用指南
326 0
|
前端开发 JavaScript API
Layui的CRUD(增删改查)
Layui的CRUD(增删改查)
228 0
|
12月前
|
Linux Shell
10-10|linux命令查询 关键字在文本中出现的行数
10-10|linux命令查询 关键字在文本中出现的行数
|
数据安全/隐私保护 网络安全 网络协议
2024年广东省网络系统管理样题第2套服务部署部分
2024年广东省网络系统管理样题第2套服务部署部分
2024年广东省网络系统管理样题第2套服务部署部分
|
设计模式 前端开发 PHP
【PHP开发专栏】ThinkPHP框架实战开发
【4月更文挑战第29天】ThinkPHP是中国流行的PHP框架,以其轻量级、模块化和高安全性受到开发者欢迎。本文介绍了ThinkPHP的基础,包括MVC设计模式,以及核心组件如路由、数据库操作、表单处理、模板引擎和错误处理。通过一个博客系统示例,展示了如何进行项目开发,包括控制器、模型和视图的创建。使用ThinkPHP能有效提升开发效率,帮助开发者快速构建复杂的Web应用。
274 0
|
JavaScript 前端开发
JavaScript中那些值会被转换为false
JavaScript中那些值会被转换为false
188 0
|
API PHP
用正则匹配ip
用正则匹配ip
285 2
|
Kubernetes jenkins 持续交付
云原生翘楚KubeSphere 和 知名开源项目 Pig 最佳实践
云原生翘楚KubeSphere 和 知名开源项目Pig 爱的火花。
735 0
ERROR: libass not found using pkg-config
ERROR: libass not found using pkg-config
364 0