【u-boot】u-boot中的设备模型

引入的目的

在2014年以前,uboot没有一种类似于linux kernel的设备驱动模型,随着uboot支持的设备越来越多,其一直受到如下问题困扰:

  1. 设备初始化流程都独立实现,而且为了集成到系统,需要修改核心公共代码(如init_sequence)
  2. 很多子系统只允许一个驱动,比如无法同时支持USB2.0和USB3.0
  3. 子系统间的交互实现各异,开发难度大
  4. 没有个统一的设备视图(如linux的/sys)

uboot driver model(U-Boot驱动模型)的提出就是为了解决这些问题,它的设计目标包括:

  1. 提供统一设备驱动框架,降低设备驱动的开发复杂度
  2. 提供设备树视图
  3. 支持设备组
  4. 支持设备lazy init
  5. 支持设备驱动沙盒测试
  6. 较小的系统开销(内存和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 *dev);
	int (*pre_probe)(struct udevice *dev);
	int (*post_probe)(struct udevice *dev);
	int (*pre_remove)(struct udevice *dev);
	int (*child_post_bind)(struct udevice *dev);
	int (*child_pre_probe)(struct udevice *dev);
	int (*child_post_probe)(struct udevice *dev);
	//uc申请成功后会调用该函数进行初始化操作
	int (*init)(struct uclass *class);
	int (*destroy)(struct uclass *class);
	//申请私有数据的大小,申请成功会幅值给uc->priv
	int priv_auto_alloc_size;
	int per_device_auto_alloc_size;
	int per_device_platdata_auto_alloc_size;
	int per_child_auto_alloc_size;
	int per_child_platdata_auto_alloc_size;
	const void *ops;
	uint32_t flags;
};

udevice

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_DEVRES
	struct list_head devres_head;
#endif
};

driver

struct driver {
	char *name;
	enum uclass_id id;
	const struct udevice_id *of_match;
	int (*bind)(struct udevice *dev);
	int (*probe)(struct udevice *dev);
	int (*remove)(struct udevice *dev);
	int (*unbind)(struct udevice *dev);
	int (*ofdata_to_platdata)(struct udevice *dev);
	int (*child_post_bind)(struct udevice *dev);
	int (*child_pre_probe)(struct udevice *dev);
	int (*child_post_remove)(struct udevice *dev);
	int priv_auto_alloc_size;
	int platdata_auto_alloc_size;
	int per_child_auto_alloc_size;
	int per_child_platdata_auto_alloc_size;
	const void *ops;	/* driver-specific operations */
	uint32_t flags;
};

组织形式

你可能感兴趣的:(uboot)