uboot DM模型

DM即driver module,也就是驱动模型。


uboot为什么引入驱动模型呢?驱动模型又是一个怎样的一个模型呢?第一个问题很简单,既然uboot要引入驱动模型,那肯定是因为驱动模型要比老旧的驱动方案要好,至于好在哪里,那就必须要先搞清楚第二个问题了。
首先我们先区分两个概念,设备和驱动,也就是device和driver。device持有物理设备的资源信息,而driver实现对设备的管理。
以RTC芯片为例,硬件拓扑如下:
这里写图片描述

I2C控制器出I2C总线,RTC连在I2C总线上。

RTC对应的device持有RTC的资源信息,包括I2C地址,位宽,这些信息要么是接口相关的,要么是跟硬件设计相关的;而RTC对应的driver则负责对RTC的管理,如将从RTC中读出来的时间值解析为用户可以识别的时间值,以及将时间编码后写入RTC芯片,driver和device结合起来才能实现RTC芯片的访问和管理。
其实RTC的资源信息不止I2C地址和寄存器位宽,还有寄存器定义,那么寄存器定义是否也需要放入device中呢?其实不必,当然放进去也可以。其实硬件设备的资源信息是否要放入device中有一个关键的原则&#

### U-Boot 设备模型 (dm) 驱动文档和实例 #### 理解 U-Boot 的设备模型框架 U-Boot 中引入了设备模型(Device Model, DM),旨在提供一种统一的方式来管理和配置硬件资源。DM 提供了一种抽象层,使得不同类型的设备可以被一致地处理[^1]。 #### 初始化过程中的角色 当 U-Boot 进入其主要执行阶段时,会经历一系列复杂的初始化操作,在此期间设备模型扮演着重要角色。特别是对于那些需要早期启动支持的组件来说,DM 能够确保这些外设得到恰当设置并准备就绪[^2]。 #### 编写自定义驱动程序指南 为了创建一个新的基于 DM 架构下的驱动模块,开发者应当遵循如下原则: - **注册新平台数据结构**:通过 `uclass_driver` 结构体来描述特定类别的通用行为; - **实现 probe 函数**:这是每个具体设备都必需提供的入口点之一;它负责完成实际硬件资源配置工作以及任何必要的软件状态初始化。 - **利用宏简化开发**:如 `DECLARE_GLOBAL_DATA_PTR` 可帮助访问全局变量而无需显式传递指针参数。 下面给出一段简单的 LED 控制器驱动代码片段作为例子: ```c // drivers/led/uclass.c static int led_bind(struct udevice *dev) { printf("Binding %s\n", dev->name); return 0; } static const struct udevice_id led_ids[] = { { .compatible = "example-led" }, { } }; U_BOOT_DRIVER(led_example) = { .name = "led_example", .id = UCLASS_LED, .of_match = led_ids, .bind = led_bind, }; ``` 上述代码展示了如何声明一个名为 `"led_example"` 的驱动,并将其绑定到兼容字符串为 `"example-led"` 的节点上。这里还实现了基本的日志输出功能用于调试目的。 #### 使用命令行接口测试驱动 一旦完成了驱动编写之后,则可以通过 U-Boot 命令提示符来进行交互式的验证。例如,假设已经加载了一个 SPI NOR Flash 存储芯片的支持库,则可通过输入相应指令查看当前连接情况或者读取指定地址处的数据内容。 ```shell => sf probe 0 # 探测第零号SPI flash设备 SF: Detected w25q80bv with page size 256 Bytes, erase size 4 KiB, total 1 MiB. ``` 以上命令将会尝试识别编号为 0 的 SPI NOR Flash 并打印出检测结果摘要信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值