深入搞懂uboot的驱动模型(一)之 dm的使用

本文从uboot驱动模型的基础出发,详细介绍了如何使用DM框架开发LED驱动。通过分析LED驱动的硬件配置、uboot命令操作、驱动注册和硬件控制,揭示了DM模型的使用流程。适合uboot开发者和 BSP 开发人员了解DM模型的实践应用。

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

目录

前言

背景

uboot驱动模型简介

DM框架

DM使用前的相关配置

分析uboot LED驱动

硬件与配置信息

uboot命令操作led

分析led注册的cmd

分析led如何使用dm模型

led分析总结

使用dm流程的总结

附录


前言

        uboot驱动模型,对于uboot开发者或者开发系统的人来说,算是基础知识,对于芯片原厂bsp开发的人来更加是基础,虽然对于第三方sdk使用者,不用过多了解,但如果使用在uboot增加模块支持的相关需求,uboot驱动模型知识是必备的知识,尽管可以绕过uboot驱动模型在uboot开发想要的模块来支持需求,但堆积多了也不利于管理,这也是设计uboot驱动模型的一个初衷。

       笔者觉得做开发认识新的东西,如果能先知道它是如何使用的,能够亲手感受其开发现象结果就更加有利自己后期的理解,更容易入手。所以深入搞懂uboot的驱动模型之前,先来介绍下,uboot驱动模型的使用流程,通过一个uboot下的led控制,来掌握uboot驱动模型的使用。

背景

        该系列课程解析,均以赛灵思Zynq UltraScale+ MPSoC平台为示例讲解(刚好手里有赛灵思板子),其他平台都是一样的,有个平台示意比较容易理解而已。

        赛灵思所有平台介绍开源代码与技术参考:

Xilinx Wiki - Confluenceicon-default.png?t=N7T8https://xilinx-wiki.atlassian.net/wiki/spaces/A/overview?homepageId=18844350可以找到赛灵思移植好的u-boot开源代码,笔者是以该代码为例子分析的。

uboot驱动模型简介

        uboot驱动模型,uboot driver model,一般写成dm,下同。做嵌入式的人,不管应用层或者底层甚至系统,多多少少知道该框架。开发过Linux的人都知道Linux驱动,Linux驱动对硬件软件管理提出一套统一的管理开发框架;uboot驱动模型也是一样,它为驱动的定义和访问,提供了统一的接口,提高了驱动之间的兼容性和访问标准性。

官方对DM的介绍使用:

Driver Model — Das U-Boot unknown version documentationicon-default.png?t=N7T8https://u-boot.readthedocs.io/en/latest/develop/driver-model/index.html

DM框架

        dm主要有uclass、uclass_driver、udevice和driver,彼此之间的关系如下:

由uclass提供统一接口供上层调用,最终通过driver调到具体的硬件。

uclass是框架自动生成的,只有在uclass_driver存在且被udevice匹配到的情况下才会自动生成。

udevice定义了具体的硬件信息,有以下方式可以生成udevice:

(1)在设备树定义硬件系统,框架自动生成一个udevice

(2)使用接口U_BOOT_DEVICE定义声明来生成

(3)传参

driver是用户自己开发实现的,通过U_BOOT_DRIVER定义实现。

以上只是大概的框架,有个印象概念即可,详细的会在后面系列章节深入分析介绍。

DM使用前的相关配置

使用DM之前,需要在uboot使能DM的支持

CONFIG_DM=y

或者make menuconfig配置,之后将对应的依赖dm实现的驱动加进来即可,本文以led为例,加进来了led的配置:

CONFIG_LED=y
CONFIG_LED_GPIO=y

分析uboot LED驱动

        接下来分析uboot里利用uboot驱动模型实现的led驱动,来熟悉uboot驱动模型的开发。

led驱动涉及的文件路径汇总如下:

cmd\led.c  : 命令入口相关代码

drivers\led\led_gpio.c  : driver相关代码

drivers\led\le

### 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、付费专栏及课程。

余额充值