如何将vs做的网站备份出来6,谷歌建站,山东响应式网站建设,河北建设工程信息网招标公告唐县目录 1、概述
2、节点#xff08; node#xff09;和属性#xff08; property#xff09;
2.1、DTS 描述键值对的语法#xff1a;
2.2 节点语法规范说明
2.3节点名及节点路径
2.4 节点别名#xff08;节点引用#xff09;
2.5 合并节点内容
2.6 替换节点内容
2…目录 1、概述
2、节点 node和属性 property
2.1、DTS 描述键值对的语法
2.2 节点语法规范说明
2.3节点名及节点路径
2.4 节点别名节点引用
2.5 合并节点内容
2.6 替换节点内容
2.8 chosen 节点
2.9 查找节点
2.10 查找办法
3 节点描述 3.1 节点属性 1、概述 设备树 Device Tree是一种描述硬件的数据结构在操作系统 OS引导 阶段进行设备初始化的时候数据结构中的硬件信息被检测并传递给操作系统 最早诞生于 Open Firmware Flattened Device Tree (FDT)格式标准。 dts 文件 Device Tree Source dts是以 ASCII 文本形式描述设备树内容。 dtb 文件是二进制格式编译工具为 Device Tree Compiler DTC。 2011 年被引入 ARM Linux 内核。 ARM Linux 设备树描述了内核的软/硬件信息。 2、节点 node和属性 property 节点用以归类描述一个硬件信息或是软件信息好比文件系统的目录 节点内描述了一个或多个属性属性是键值对 key/value描述具体的 软/硬信息。 为什么 ARM Linux 社区会引入设备树呢 主要是想解决 ARM Linux 内核代码冗余的问题。
2.1、DTS 描述键值对的语法 1、字符串信息 2、 32bits 无符号整型数组信息 3、二进制数数组 4、混和形式 5、字符串哈希表
/dts-v1/;
#include exynos4412.dtsi //此设备树依赖于exynos4412.dtsi 文件
#include dt-bindings/gpio/gpio.h //gpio引脚配置文件
/ { //根节点 root nodemodel FriendlyARM TINY4412 board based on Exynos4412;compatible friendlyarm,tiny4412, samsung,exynos4412, samsung,exynos4;chosen {stdout-path serial_0;
};
2.2 节点语法规范说明
节点名:
语法 name[unit-address]
规范
名字是ASCII字符串
(字母、数字、 -、等等构成
最长可以是31个字符一般的应该以设备类型命名
unit-address一般的是设备地址
/*****示例*****/
/{serial101F0000{……};gpio101F3000{……};interrupt-controller10140000{……};spi10115000{…….};external-bus{……};
};
2.3节点名及节点路径
/{…dm9000{…};…
};
节点名:dm9000
节点路径:/dm9000
2.4 节点别名节点引用 为了解决节点路径名过长的问题引入了节点别名的概念可以引用到一个全路径的节点
/{aliases{demodemo0;};…demo:demo080000000{…};…
};
节点名:demo0
节点路径:/demo080000000
节点别名:demo(等价/demo080000000)/**********************************/
引用语法范例1:
demo{…
};
引用语法范例2:
/{reference-node{propertydemo;…};…
};
2.5 合并节点内容 一般的 一个硬件设备的部分信息不会变化但是部分信息是可能会变化的就出现了节点内容合并。即先编写好节点仅仅描述部分属性值使用者后加一部分属性值。在同级路径下节点名相同的“两个”节点实际是一个节点。 /{node{propertyvalue;};
};
/*移植者添加的节点*/
/{node{property2value;};
};
/***合并后的节点内容***/
/{node{property2value;};
};
2.6 替换节点内容 一个硬件设备的部分属性信息可能会变化但是设备树里面已经描述了所有的属性值使用者可以添加已有的属性值以替换原有的属性值就出现了节点内容替换。在同级路径下节点名相同的“两个”节点实际是一个节点。 2.7 引用节点内容 一个设备可能会使用到别的节点的内容可以通过节点的别名来引用到其内容。 引用的目的可能是合并两个节点的内容、 替换部分内容、或是使用部分内容.
/{node:node80000000{propertyvalue;};
};
/*移植者添加的node节点*/
node{propertyvalue;status “okay”;
}
/*移植者添加demo节点*/
/{demo{propertynode;};
};
说明:demo节点的属性property引用了节点的node的属性值一般的,引用的目的是使用node节点的部分属性内容
2.8 chosen 节点 chosen 节点不描述一个真实设备而是用于 firmware 传递一些数据给 OS譬如 bootloader 传递内核启动参数给内核.
chosen {bootargs “root/dev/nfs rw nfsroot192.168.1.1 consolettyS0,115200”;
};
2.9 查找节点 涉及设备、总线、驱动的概念即所谓设备信息和驱动代码分离的驱动框架如 platform、 i2c、 usb、spi、 pci、等等 或是分层驱动框架 MTD 设备驱动、framebuffer 设备驱动、 input 设备驱动、 ...则设备树中设备节点的会内核初始化时候被查找到驱动代码将不关心节点的查找。 如果仅仅是接口驱动框架字符设备驱动、块设备驱动、网络设备驱动 则需要使用内核节点查找函数查找设备树中的设备节点。
2.10 查找办法 通过节点的 compatible 属性值查找指定节点 通过节点名查找指定节点 通过节点路径查找指定节点
3 节点描述
头文件 include/of.h
struct device_node {const char *name; //节点名const char *type; //设备类型phandle phandle;const char *full_name; //全路径节点名struct fwnode_handle fwnode;struct property *properties;struct property *deadprops; /* removed properties */struct device_node *parent; 父节点指针struct device_node *child; //子节点指针struct device_node *sibling;struct kobject kobj;unsigned long _flags;void *data;#if defined(CONFIG_SPARC)const char *path_component_name;unsigned int unique_id;struct of_irq_controller *irq_trans;#endif
};
功能通过 compatible 属性查找指定节点
struct device_node *of_find_compatible_node(struct device_node *from,
const char *type, const char *compat);
参数
struct device_node *from - 指向开始路径的节点如果为NULL则从根节点开始
const char *type - device_type设备类型可以为NULL
const char *compat - 指向节点的compatible属性的值字符串的首地址
返回值
成功得到节点的首地址失败 NULL
设备 ID 表结构用于匹配设备节点和驱动
struct of_device_id {char name[32]; /*设备名*/char type[32]; /*设备类型*/char compatible[128]; /*用于与设备树compatible属性值匹配的字符串*/const void *data; /*驱动私有数据*/
};
//注册支持设备树的设备ID表
include/module.h
MODULE_DEVICE_TABLE(of, ID表首地址)
功能通过 compatible 属性查找指定节点
struct device_node *of_find_matching_node(struct device_node *from,
const struct of_device_id *matches);
参数
struct device_node *from - 指向开始路径的节点如果为NULL则从根节点开始
const struct of_device_id *matches - 指向设备ID表注意ID表必须以NULL结束
范例
const struct of_device_id mydemo_of_match[] {{ .compatible fs4412,mydemo, },{}
};
返回值
成功得到节点的首地址失败 NULL
功能通过路径查找指定节点
struct device_node *of_find_node_by_path(const char *path);
参数
const char *path - 带全路径的节点名也可以是节点的别名
返回值
成功得到节点的首地址失败 NULL
功能通过节点名查找指定节点
struct device_node *of_find_node_by_name(struct device_node *from,
const char *name);
参数
struct device_node *from - 开始查找节点如果为NULL则从根节点开始
const char *name- 节点名
返回值
成功
得到节点的首地址失败 NULL 3.1 节点属性 有默认意义的属性 1、设备树语法中已经定义好的具有通用规范意义的属性。 如果是设备信息和驱动分离框架的设备节点则能够在内核初始化找到节点时候自动解析生成相应的设备信息。 常见属性的有 compatible、地址 address、中断 interrupt ARM Linux 内核定义好的一类设备通用的有默认意义的属性 一般的不能被内核自动解析生成相应的设备信息但是内核已经编写了相应的解析提取函数。 常见属性的有 MAC 地址、 GPIO 口、 clock、 power、 regulator、等等
驱动自定义属性
针对具体设备有部分属性很难通用需要驱动自己定义好通过内核的属性提取解析函数进行值的获得。
ethernet18000000 {compatible “davicom,dm9000”;reg 0x18000000 0x2 0x18000004 0x2;interrupt 7 4;local-mac-address [00 00 de ad be ef];davicom,no-eeprom;reset-gpios gpf 12 GPIO_ACTIVE_LOW;vcc-supply eth0_power;
};
compatible 属性
用于匹配设备节点和设备驱动规则是驱动设备 ID 表中的 compatible 域的值字符串和设备树中设备节点中的 compatible 属性值完全一致则节点的内容是给驱动的。 设备树中的命名规范如下
/{
node{compatible“厂商名,名称” ;......vcc-supply eth0_power;
};设备树示例
/{…mydemo{compatible “fs4412,mydemo”;…}
}/*platform 框架的探测函数*/
static int demo_probe(struct platform_device *devices)
{
//设备树对应节点的信息已经被内核构造成struct platform_devic
…
}
static const struct of_device_id demo_of_matches[] {{.compatible “fs4412,mydemo”,},{}
}
MODULE_DEVICE_TABLE(of,demo_of_matches);static struct platform_driver demo_drv {.driver {.name DEMONAME,.owner THIS_MODULE,.of_match_table of_match_ptr(demo_of)}
}
属性-address
#address-cells描述子节点 reg 属性值的地址表中首地址 cell 数量 #size-cells描述子节点 reg 属性值的地址表中地址长度 cell 数量