设备树 (JSON)
本文档详细介绍 XSTAR 的设备树系统,包括 JSON 语法、设备节点结构、设备树 API 使用等内容。
目录
引言
设备树的作用
驱动与设备的关系,可以类比为函数与变量的关系。函数负责具体的执行动作,变量负责描述自身属性,两者之间互相依存,缺一不可。
通常情况下,驱动与设备是一对一的关系,即一个驱动对应一个设备。但更多时候是 一对多的关系,即一个驱动对应多个设备。例如,一颗主控芯片集成了四个串口,不可能写四份驱动来分别注册设备,通常只写一份驱动,然后分别执行四次注册。
使用变量直接描述设备属性灵活性不够,每次添加设备都需要重新编译,代码可读性也较差。设备树应运而生,只需将所有设备用文本的方式描述好,然后解析文件,依据内容自动生成相应的设备。
JSON 格式的选择
设备树本质上是一个配置文件,描述了所有设备的属性。JSON 作为一种轻量级的数据交换格式,具有以下优点:
- 简洁的层次结构
- 易于编写和阅读
- 易于机器生成和解析
选择 JSON 作为设备树的存储格式再合适不过了。
JSON 语法
两种基本结构
JSON 有两种基本结构:
- "名称/值"对的集合:在不同语言中被理解为对象(object)、纪录(record)、结构(struct)、字典(dictionary)、哈希表(hash table)、有键列表(keyed list)或关联数组(associative array)
- 值的有序列表:在大部分语言中被理解为数组(array)
这些都 是常见的数据结构,大部分现代计算机语言都以某种形式支持它们,使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。
五种数据形式
1. 对象(Object)
对象是一个无序的"名称/值"对集合。一个对象以 {(左括号)开始,}(右括号)结束。每个"名称"后跟一个 :(冒号);"名称/值"对之间使用 ,(逗号)分隔。
{
"name": "value",
"age": 25,
"active": true
}
2. 数组(Array)
数组是值的有序集合。一个数组以 [(左中括号)开始,](右中括号)结束。值之间使用 ,(逗号)分隔。
[1, 2, 3, 4, 5]
3. 值(Value)
值可以是:
- 双引号括起来的字符串(string)
- 数值(number)
- 布尔值(true/false)
- 空值(null)
- 对象(object)
- 数组(array)
这些结构可以嵌套。
{
"string": "Hello, World!",
"number": 42,
"boolean": true,
"null": null,
"object": {
"key": "value"
},
"array": [1, 2, 3]
}
4. 字符串(String)
字符串是由双引号包围的任意数量 Unicode 字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。
字符串与 C 或者 Java 的字符串非常相似。
"Hello, World!"
"这是一个中文字符串"

5. 数值(Number)
数值与 C 或者 Java 的数值非常相似,但未曾使用八进制与十六进制格式。
42
3.14
-100
1e10
设备节点结构
dtnode 结构体定义
XSTAR 规定设备树中描述的每一个设备节点都是一个 JSON 对象,对象里面可以包含各种形式的键值对。每个设备节点包含如下关键信息:
- 设备节点名称
- 设备自动分配起始索引或设备物理地址
- 具体的 JSON 对象
struct dtnode_t {
const char * name;
int id;
uint64_t addr;
struct json_value_t * value;
};
字段说明
- name:设备节点名称,对应驱动名称
- id:设备自动分配的起始索引 ID
- addr:设备物理地址
- value:包含设备属性的 JSON 对象