struct udevice --> driver的一个实例
该结构保存关于设备的一些信息,这个设备是驱动绑定的某个端口或外设,在本质上它也还是个driver实例。
可通过调用bind函数创建一个device,使用U_BOOT_DEVICE()宏实现(在这种情况下,platdata为非空)或在设备树中创建一个节点(在这种情况下of_offset大于0)。在后一种情况下,是将设备树信息保存到platdata中去的,保存操作的函数为驱动的ofdata_to_platdata方法(当设备是一个设备树节点形式时,该方法会在probe方法调用之前被调用)。
platdata,priv和uclass_priv结构可通过driver来申请,或通过设置driver和uclass_driver结构体的成员变量auto_alloc_size来让驱动模型自动实现。
Uboot驱动模型中有三个概念:
1. uclass: 表示同一种类型的设备,提供相同接口,比如I2C,SPI,GPIO等
2.driver: 表示一个读取设备数据的接口给更高层
3.udevice: 表示driver的实例,是绑定到具体端口或外设的

比如SPI UCLASS_DRIVER:

UCLASS_DRIVER(spi) = {.id       = UCLASS_SPI,.name     = "spi",.flags       = DM_UC_FLAG_SEQ_ALIAS,
#if !CONFIG_IS_ENABLED(OF_PLATDATA).post_bind   = dm_scan_fdt_dev,
#endif.post_probe   = spi_post_probe,.child_pre_probe = spi_child_pre_probe,.per_device_auto_alloc_size = sizeof(struct dm_spi_bus),.per_child_auto_alloc_size = sizeof(struct spi_slave),.per_child_platdata_auto_alloc_size =sizeof(struct dm_spi_slave_platdata),
#if !CONFIG_IS_ENABLED(OF_PLATDATA).child_post_bind = spi_child_post_bind,
#endif
};

ll_entry_declare宏会声明一个结构体变量以进入到section,变量会被放入连接器生成的数组中。这是一个基本构建块,它是一种对连接器生成数组更为高级的使用方式。用户期望通过这个宏来构建自己的宏封装。
使用该宏的变量必须是编译时初始化的,非运行时。
使用该宏需要注意的点如下:
_type: 为入口类型,这里是struct uclass_driver,不能是static类型,否则虽然入口能生成且可被遍历,但是在map文件中list且不能通过name来获取到。 
_name: 为入口名,这里是传入的spi
_list: 为列表名,只能是字符形式。
为防止一个section及其subsection的声明都包含数组元素,需要这些数组元素是同一种类型。
__attribute__
由此可知,上例spi中,结构体变量为:
struct uclass_driver _u_boot_list_2_uclass_2_spi 同时 将它存放在段: .u_boot_list_2_uclass_2_spi

下面就是通过UCLASS_SPI这个ID号来找到上面声明的uclass结构体了。


ll_entry_start获取某个section的起始位置,这里就是根据.u_boot_list_2_uclass_1的段地址来获取到uclass_driver table的地址。
ll_entry_count获取uclass_driver table的长度。
因此lists_uclass_lookup就是找到id所指的结构体了。
U_Boot Driver与Uclass Driver类似:



同理也是得到一个结构体_uboot_list_2_driver_2_spi_generic_drv 存储在.u_boot_list_2_driver_2_spi_generic_drv。
这些段在uboot实际加载时,是如何进行的?
实际是在u-boot\common\board_f.c的init_sequence_f中调用initf_dm来加载的。
其中dm_init_and_scan:

dm_init: 创建driver, uclass,udevice空链表,根设备root deivce,。

dm_scan_platdata: 扫描U_BOOT_DEVICE定义的设备,与U_BOOT_DRIVER定义的driver进行查找匹配,并绑定相应driver

lists_bind_driver: 从段.u_boot_list_2_driver_info_1中查找, 在for循环中将driver_info列表中的name,依次与driver列表中的名字进行匹配查找,然后绑定device_bind_by_name。
device_bind_by_name,通过lists_driver_lookup_name从driver list查找info的名,在通过device_bind_common创建udevice来绑定。


dm_extended_scan_fdt:扫描由FDT设备树文件定义的设备,与U_BOOT_DRIVER定义的driver进行查找匹配,并绑定相应driver。这里会对compatible所定义的字符串进行匹配查找。

其中U_BOOT_DEVICE定义如下,需要与U_BOOT_DRIVER进行区分:

struct udevice {const struct driver *driver;const char *name;void *platdata;void *parent_platdata;void *uclass_platdata;ofnode node;ulong driver_data;struct udevice *parent;void *priv;struct uclass *uclass;void *uclass_priv;void *parent_priv;struct list_head uclass_node;struct list_head child_head;struct list_head sibling_node;uint32_t flags;int req_seq;int seq;
#ifdef CONFIG_DEVRESstruct list_head devres_head;
#endif
};

@driver: 设备使用的driver
@name: 设备名,一般是FDT node名
@platdata: 设备的配置信息
@parent_platdata:设备的父总线配置信息
@uclass_platdata:设备的uclass配置信息
@node:设备的设备树节点索引
@driver_data:通过该成员将设备和驱动进行匹配的入口参数
@parent: 设备的浮设备,若为顶级设备则为NULL
@priv:设备的私有数据
@uclass:设备的uclass指针
@uclass_priv: 设备的uclass私有数据
@parent_priv: 设备的父私有数据
@uclass_node: uclass通过该成员来连接到它的设备
@child_head: 设备的孩子链表
@sibling_node: 所有设备的列表中的下一个设备
@flags: 设备的flags,包括:DM_FLAG_...
@req_seq: 设备的请求序列号(-1 = any)
@req: 设备的申请的序列号(-1 = none)。当设备探测到时该成员被设置,且在设备的uclass内是独一无二的。
@devres_head: 和设备相关的内存申请列表。当CONFIG_DEVRES使能时,devm_kmalloc()申请的内存会添加到该列表中,以这种方式申请的内存,在设备removed或unbound时,会自动释放。

static int rockchip_gpio_probe(struct udevice *dev)
{struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev);struct rockchip_gpio_priv *priv = dev_get_priv(dev);char *end;int ret;priv->regs = dev_read_addr_ptr(dev);ret = uclass_first_device_err(UCLASS_PINCTRL, &priv->pinctrl);if (ret)return ret;uc_priv->gpio_count = ROCKCHIP_GPIOS_PER_BANK;end = strrchr(dev->name, '@');priv->bank = trailing_strtoln(dev->name, end);priv->name[0] = 'A' + priv->bank;uc_priv->bank_name = priv->name;return 0;
}

uboot驱动之udevice相关推荐

  1. 超详细【Uboot驱动开发】(一)uboot基础了解

    一.uboot基础了解 1. U-boot是什么 U-Boot,全称 Universal Boot Loader,是遵循GPL条款的从FADSROM.8xxROM.PPCBOOT逐步发展演化而来的 开 ...

  2. st7789 320*240 显示屏,uboot驱动移植笔记

               st7789 使用spi初始化,rgb数据总线传输. 1.首次编译错误 报错如下: libgcc.a(bpabi.o) uses VFP registerarguments, u ...

  3. 使用正点原子的U-boot驱动TN92

    目录 TN92不能正常显示的原因: 改进措施: TN92不能正常显示的原因: 使用正点原子的U-boot源码配合TN92 LCD显示屏进行实验,发现显示屏花屏,不能正常使用.在对比TN92显示屏的原理 ...

  4. uboot usb驱动模型

    关于uboot驱动模型,这篇文章讲得很好,不再描述: [uboot] (番外篇)uboot 驱动模型_ooonebook的博客-CSDN博客 U-Boot Driver Model领域模型设计 lin ...

  5. uboot中 使用i2c

    uboot中i2c读写有2种方式,一种使用uboot驱动模型,通过宏 CONFIG_DM_I2C定义,另一种是传统方式,通过宏CONFIG_SYS_I2C定义. 传统方式--SYS_I2C 1.设置总 ...

  6. Uboot DM_USB与DM_ETH模型

    技术背景 详细有学习过Linux驱动的小伙伴,都知道相应的总线驱动模型吧.学习驱动都是先从硬编码,到设备驱动模型的历程,这样能让代码尽可能少的改动,即可支持一系列的设备.在较新的Uboot中,已经有成 ...

  7. uboot环境变量实现分析

    u-boot的环境变量用来存储一些经常使用的参数变量,uboot希望将环境变量存储在静态存储器中(如nand nor eeprom mmc). 其中有一些也是大家经常使用,有一些是使用人员自己定义的, ...

  8. 内存版u-boot制作

    我这里的设备上,一般都是在NOR-Flash上跑U-boot,但有时候为了调试等的方便,要让u-boot在内存中跑. Flash版本的u-boot是不能直接在内存中跑的(至少我这里的情况是这样). 下 ...

  9. uboot的常用命令详解

    U-Boot还提供了更加详细的命令帮助,通过help命令还可以查看每个命令的参数说明.由于开发过程的需要,有必要先把U-Boot命令的用法弄清楚.接下来,根据每一条命令的帮助信息,解释一下这些命令的功 ...

最新文章

  1. Linux基础系列(四)系统用户和组管理
  2. android 中的PopupWindow
  3. 配置overlay(overlayfs)根目录挂载构建debian
  4. Py之argparse:Python库之argparse(命令行解析)简介、安装、使用方法之详细攻略
  5. 类变量与实例变量辨析
  6. react学习(49)--参数判定
  7. 从客户端登陆服务器的配置文件,BLE模式和配置文件
  8. 信息学奥赛一本通 1035:等差数列末项计算 | OpenJudge NOI 1.3 18
  9. 决策树——排序算法的理论下界
  10. Hive复杂数据类型 struct
  11. 二阶魔方万能还原公式_魔方小站二阶魔方速拧《2阶魔方公式 视频教程》
  12. js 日语索引 日文排序
  13. 常用的计算机网络设备有,常用网络设备有哪些,初学者必须要知道的五大网络设备...
  14. Audi A4L楼兰宝盒拆解图
  15. 苹果双系统怎么切换_苹果电脑双系统的好处
  16. 钉钉/微信开放平台加解密(钉钉/微信加密解密) 钉钉/微信AES 加密解密
  17. MobileNet网络学习笔记
  18. 嵌入式C语言实例(达内2013)
  19. MOOC浙大数据结构课后题记录——PTA数据结构题目集(全)
  20. 两个向量之间的夹角公式_Python 计算任意两向量之间的夹角方法

热门文章

  1. MPchart使用详解及详细属性(一)
  2. layui的html页面支持转jsp吗,layui jsp
  3. 最近更换系统盘踩了不少坑,主要是软件运行错误,造成原成原系统盘被损毁
  4. Codeforces Round #510 (Div. 2)
  5. C++学习第一天(初步认识-程序流的分支-循环-数据类型)
  6. 清晰明了,什么是贝叶斯定理?朴素贝叶斯又是什么?
  7. 你知道遥控器的通信原理吗?
  8. 中国第一块区块链牌照
  9. 我提了离职,公司给我涨薪了,还能待下去吗?
  10. 计算机网络技术专业就业前景