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);

 

posted @   aspirs  阅读(322)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
历史上的今天:
2021-05-19 eMMC:Cache简介-0
2018-05-19 静态市盈率和动态市盈率
点击右上角即可分享
微信分享提示