uboot 2019 uclass、udevice
uboot 2019 uclass、udevice
uclass链表
drivers/core/uclass.c
uclass_get,根据uclass_id去get,如果没有find到,则调用uclass_add()将uclass添加到gd->uclass_root链表里,uclass是用UCLASS_DRIVER macro define的,他们被放置在section(".u_boot_list_2_"#uclass"_2_"#_name) section,放置在.u_boot_list_2_uclass_1和.u_boot_list_2_uclass_3之间(可以在u-boot.map里grep)
int uclass_get(enum uclass_id id, struct uclass **ucp) { struct uclass *uc; *ucp = NULL; uc = uclass_find(id); if (!uc) return uclass_add(id, ucp); *ucp = uc; return 0; }
static int uclass_add(enum uclass_id id, struct uclass **ucp) uc->uc_drv = uc_drv; INIT_LIST_HEAD(&uc->sibling_node); INIT_LIST_HEAD(&uc->dev_head); list_add(&uc->sibling_node, &DM_UCLASS_ROOT_NON_CONST);
#define DM_UCLASS_ROOT_NON_CONST (((gd_t *)gd)->uclass_root)
20603: .u_boot_list_2_uclass_1 20605: .u_boot_list_2_uclass_2_backlight 20607: 0x000000002758f628 _u_boot_list_2_uclass_2_backlight ... .u_boot_list_2_uclass_3
udevice加入uclass的dev_head链表
lists_bind_fdt()
(lists_bind_fdt是被initr_dm()调用的,initr_dm在initr_dtbo()执行之后执行)
将U_BOOT_DRIVER define的struct里的udevice_id里的compatible和device tree里的compatible相比较,如果相等,则将U_BOOT_DRIVER define的driver和对应的uclass相绑定,将udevice加入uclass的dev_head链表中:
int uclass_bind_device(struct udevice *dev) { struct uclass *uc; int ret; uc = dev->uclass; list_add_tail(&dev->uclass_node, &uc->dev_head);
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
2021-05-19 eMMC:Cache简介-0
2018-05-19 静态市盈率和动态市盈率