目录
前言
uboot驱动模型,对于uboot开发者或者开发系统的人来说,算是基础知识,对于芯片原厂bsp开发的人来更加是基础,虽然对于第三方sdk使用者,不用过多了解,但如果使用在uboot增加模块支持的相关需求,uboot驱动模型知识是必备的知识,尽管可以绕过uboot驱动模型在uboot开发想要的模块来支持需求,但堆积多了也不利于管理,这也是设计uboot驱动模型的一个初衷。
笔者觉得做开发认识新的东西,如果能先知道它是如何使用的,能够亲手感受其开发现象结果就更加有利自己后期的理解,更容易入手。所以深入搞懂uboot的驱动模型之前,先来介绍下,uboot驱动模型的使用流程,通过一个uboot下的led控制,来掌握uboot驱动模型的使用。
背景
该系列课程解析,均以赛灵思Zynq UltraScale+ MPSoC平台为示例讲解(刚好手里有赛灵思板子),其他平台都是一样的,有个平台示意比较容易理解而已。
赛灵思所有平台介绍开源代码与技术参考:
Xilinx Wiki - Confluencehttps://xilinx-wiki.atlassian.net/wiki/spaces/A/overview?homepageId=18844350可以找到赛灵思移植好的u-boot开源代码,笔者是以该代码为例子分析的。
uboot驱动模型简介
uboot驱动模型,uboot driver model,一般写成dm,下同。做嵌入式的人,不管应用层或者底层甚至系统,多多少少知道该框架。开发过Linux的人都知道Linux驱动,Linux驱动对硬件软件管理提出一套统一的管理开发框架;uboot驱动模型也是一样,它为驱动的定义和访问,提供了统一的接口,提高了驱动之间的兼容性和访问标准性。
官方对DM的介绍使用:
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