dtb转换为内核的device_node

函数调用过程:

start_kernel //init/main.c
  setup_arch(&command_line) //arch/arm/kernel/setup.c
    arm_memblock_init(mdesc) //arch/arm/kernel/setup.c
      early_init_fdt_reserve_self();
         //把dtb所占用区域保留下来,即调用:memblock_reserve
 early_init_dt_reserve_memory_arch(__pa(initial_boot_params),fdt_totalsize(initial_boot_params),0)
          early_init_fdt_scan_reserved_mem(); //根据dtb中的memreserve信息,调用memblock_reserve
            unflatten_device_tree(); //arch/arm/kernel/setup.c
              //第一通道,扫描大小
               size = unflatten_dt_nodes(blob,NULL,dad,NULL);
              //第二通道,将扁平组织展开
               unflatten_dt_nodes(blob,mem,dad,mynodes)
                 np = unflatten_dt_alloc(mem,sizeof(struct device_node)+allocl,__alignof__(struct device_node));
                    np->full_name = fn = ((char*)np) + sizeof(*np)
                    pp = unflatten_dt_alloc(mem,sizeof(struct property),__alignof__(struct property));
                    pp->name = (char *)pname;
                    pp->length = sz;
                    pp->value = (__be32 *)val;
  1. 在DTB文件中,每一个节点都以TAG(FDT_BEGIN_NODE,0x00000001)开始,节点内部可以嵌套其他节点,每一个属性都以TAG(FDT_PROP,0X00000003)开始
  2. 每一个节点都转换为一个device_node结构体
struct device_node{
    const char *name;//来自节点中的name属性,如果没有该属性,则设置为"null"
    const char *type;//来自节点中的device_type属性,如果没有该属性,则设为"null"
    phandle phandle;
    const char *full_name;//节点的名字,node-name[@uint-address]
    struct fwnode_handle fwnode;
    struct property *properties;//节点属性
    struct property *deadprops;//removedproperties
    struct device_node *patrent;//节点的父亲
    struct device_node *child;//节点的孩子
    struct device_node *sibling;//节点的兄弟
    #if defined(CONFIG_OF_KOBJ)
    struct kobject kobj;
    #endif
    unsigned long _flags;
    void *data
};

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雲烟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值