引入的目的
在2014年以前,uboot没有一种类似于linux kernel的设备驱动模型,随着uboot支持的设备越来越多,其一直受到如下问题困扰:
- 设备初始化流程都独立实现,而且为了集成到系统,需要修改核心公共代码(如init_sequence)
- 很多子系统只允许一个驱动,比如无法同时支持USB2.0和USB3.0
- 子系统间的交互实现各异,开发难度大
- 没有个统一的设备视图(如linux的/sys)
uboot driver model(U-Boot驱动模型)的提出就是为了解决这些问题,它的设计目标包括:
- 提供统一设备驱动框架,降低设备驱动的开发复杂度
- 提供设备树视图
- 支持设备组
- 支持设备lazy init
- 支持设备驱动沙盒测试
- 较小的系统开销(内存和CPU)
参考文章:U-Boot Driver Model领域模型设计
相关概念术语
class
设备
驱动
主要的数据结构体
uclass结构体
uc是动态生成的,会根据id找到对应的uclass_driver结构体(静态,正常情况都会存在),成功找到会就会申请该结构体。
struct uclass {
void *priv;
//找到的uclass_driver赋值给这一成员
struct uclass_driver *uc_drv;
struct list_head dev_head;
struct list_head sibling_node;
};
uclass_driver
struct uclass_driver {
const char *name;
enum uclass_id id;
int (*post_bind)(struct udevice *dev);
int (*pre_unbind)(struct udevice