DTBO/DTO 介绍

本文介绍了AndroidP引入的DeviceTreeOverlay(DTO)功能,如何通过DTBO叠加在主设备树上,以及编译过程中的注意事项。重点讲述了DTO操作的原理、UBoot配置和常见错误原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先描述一下DTS/DTC/DTB/DTBO/DTO 之间的关系:
DTS 是用于描述 FDT(设备树) 的文件;
DTS 经过 DTC 编译后可生成 DTB/DTBO;
DTB 和 DTBO 通过 DTO 操作可合并成一个新的 DTB;
通常情况下很多用户习惯把“DTO“这个词的动作含义用“DTBO“来替代,下文中我们避开这个概念混用,明确:DTO 是一个动词概念,代表的是操作;DTBO 是一个名词概念,指的是用于叠加的次 dtb。

原理介绍:

DTO(Devcie Tree Overlay) 是 Android P 后引入且必须强制启用的功能,可让次设备树 Blob(DTBO) 叠加在已有的主设备树 Blob 上。DTO 可以维护系统芯片 SoC 设备树,并动态叠加针对特定设备的设备树,从而向树中添加节点并对现有树中的属性进行更改。
主设备树 Blob(*.dtb)一般由 Vendor 厂商提供,次设备树 Blob(*.dtbo)可由 ODM/OEM 等厂商提供,最后通过 bootloader 合并后再传递给 kernel。如下图:

需要注意:DTO 操作使用的 DTB 和 DTBO 的编译跟普通的 DTB 编译有区别,语法上有特殊区别:
使用 dtc 编译.dts 时,必须添加选项-@以在生成的.dtbo 中添加_symbols_节点。_symbols_节点包含带标签的所有节点的列表,DTO 库可使用这个列表作为参考。如下示例:

1. 编译主.dts 的示例命令:
dtc -@ -O dtb -o my_main_dt.dtb my_main_dt.dts
2. 编译叠加层 DT  .dts 的示例命令:
dtc -@ -O dtb -o my_overlay_dt.dtbo my_overlay_dt.dts

uboot 中 DTO 启用:

1. 配置使能:

CONFIG_CMD_DTIMG=y
CONFIG_OF_LIBFDT_OVERLAY=y

2. board_select_fdt_index()函数的实现。这是一个__weak 函数,用户可以根据实际情况重新实现它。函数作用是在多份 DTBO 中获取用于执行 DTO 操作的那份 DTBO(返回 index 索引,最小从 0 开始),默认的 weak 函数返回的 index 为 0。

/*
* Default return index 0.
*/
__weak int board_select_fdt_index(ulong dt_table_hdr)
{
/*
* User can use "dt_for_each_entry(entry, hdr, idx)" to iterate
* over all dt entry of DT image and pick up which they want.
*
* Example:
* struct dt_table_entry *entry;
* int index;
*
* dt_for_each_entry(entry, dt_table_hdr, index) {
*
* .... (use entry)
* }
*
* return index;
*/
return 0;
}

DTO 结果

1. DTO 执行完成后,在 U-Boot 的开机信息中可以看到结果:

// 成功时的打印
ANDROID: fdt overlay OK
// 失败时的打印
ANDROID: fdt overlay failed, ret=-19

通常引起失败的原因一般都是因为主/次设备书 blob 的内容存在不兼容引起,所以用户需要对它们的生成语法和兼容性要比较清楚。

2. DTO 执行成功后在给 kernel 的 cmdline 里追加如下信息,表明当前使用哪份 DTBO 进行 DTO 操作:

androidboot.dtbo_idx=1 // idx从0开始,这里表示选取idx=1的那份DTBO进行DTO操作

3. DTO 执行成功后可以在U-Boot命令行使用 fdt 命令查看DTB内容,确认改动是否生效

### 如何在 Swagger UI 中显示或配置实体类 DTO 的详细信息 为了在 Swagger UI 中展示详细的实体类 DTO 信息,可以通过以下方式实现: #### 1. 使用 `@ApiModelProperty` 注解修饰字段 通过为 DTO 或实体类中的字段添加 `@ApiModelProperty` 注解,可以定义这些字段的具体含义及其属性。这使得 Swagger UI 能够更清晰地呈现数据结构。 ```java import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @ApiModel(description = "用户对象模型") public class UserDto { @ApiModelProperty(value = "用户名", example = "JohnDoe", required = true) private String username; @ApiModelProperty(value = "密码", example = "password123", required = true) private String password; @ApiModelProperty(value = "年龄", example = "28", allowableValues = "range[0, 150]") private Integer age; // Getters and Setters } ``` 上述代码中,`@ApiModelProperty` 提供了多个选项来描述字段的用途、是否必填以及其他约束条件[^3]。 --- #### 2. 启用 XML 文档支持并加载注释文件 如果项目中有多个模块或者需要跨项目的文档支持,则需确保 Swagger 正确加载了对应的 XML 文件。XML 文件包含了编译期间生成的 JavaDoc 其他注释信息。 以下是启用 XML 支持的示例代码: ```csharp using System.IO; using Microsoft.OpenApi.Models; services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" }); // 设置 XML 文件路径 var basePath = AppContext.BaseDirectory; var xmlPath = Path.Combine(basePath, "YourProjectName.xml"); c.IncludeXmlComments(xmlPath); }); ``` 此方法适用于 .NET Core 项目,在 Spring Boot 项目中则无需显式指定 XML 文件路径,因为默认会扫描所有带注解的类[^2]。 --- #### 3. 配置全局设置以增强 DTO 显示效果 除了单个字段级别的注解外,还可以利用 `@ApiModel` 来提供整个 DTO 类的整体说明。例如: ```java @ApiModel(description = "表示用户的传输对象,包含基本信息") public class UserDto { ... } ``` 此外,可以在控制器层面上使用 `@ApiOperation` 描述接口的功能,并结合 `@ApiParam` 定义请求参数的意义。 ```java @RestController @RequestMapping("/users") public class UserController { @ApiOperation(value = "创建新用户", notes = "根据传入的用户信息创建一个新的账户") public ResponseEntity<UserDto> createUser( @ApiParam(value = "新增用户所需的数据", required = true) @RequestBody AddUserParam param) { // 处理逻辑... } } ``` 以上代码片段展示了如何让开发者清楚了解每个操作的目的以及输入/输出的内容[^3]。 --- #### 4. 自定义序列化器优化复杂类型的展现形式 对于一些复杂的嵌套类型(如列表或其他自定义对象),可能还需要调整 JSON 序列化的规则以便更好地适配前端需求。此时可考虑引入 Jackson 的扩展功能来自定义格式转换过程。 ```json // 假设有一个包含地址集合的用户对象 { "username": "Alice", "addresses": [ {"city": "New York"}, {"city": "Los Angeles"} ] } ``` 通过编写特定的 Serializer/Derserializer 实现此类场景下的精确控制[^1]。 --- ### 总结 综上所述,要使 Swagger UI 展现出详尽的实体类与 DTO 数据详情,主要依赖于合理运用各种注解工具(如 `@ApiModelProperty`, `@ApiModel` 等)、激活必要的辅助资源(比如 XML 文档)以及必要时定制化处理流程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一叶知秋yyds

分享是一种美德,感谢金主打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值