当前位置: 首页 > news >正文

找做企业网站百度网页游戏大厅

找做企业网站,百度网页游戏大厅,中建国际建设有限公司官网,wordpress登录用户可以搜索文章目录 总体流程图传递DTB过程编译设备树源文件将 .dtb 文件与内核或引导加载程序集成 内核初始化阶段解析DTB内核启动阶段解析 DTB注册设备树节点驱动程序绑定 内核解析设备树二进制文件(DTB)的过程主要分为几个步骤,从设备树的传递到最终…

文章目录

    • 总体流程图
    • 传递DTB过程
      • 编译设备树源文件
      • 将 `.dtb` 文件与内核或引导加载程序集成
    • 内核初始化阶段解析DTB
      • 内核启动阶段
      • 解析 DTB
      • 注册设备树节点
      • 驱动程序绑定

内核解析设备树二进制文件(DTB)的过程主要分为几个步骤,从设备树的传递到最终的硬件配置。这些步骤包括加载 DTB、解析和处理设备树节点和属性,以及将硬件信息传递给相应的驱动程序。

总体流程图

在这里插入图片描述

传递DTB过程

在系统启动时,引导加载程序(如 U-Boot)将 DTB 文件加载到内存,并将其位置传递给内核。对于 ARM 和 ARM64 平台,引导加载程序通常通过 r2 寄存器传递 DTB 的内存地址。

编译设备树源文件

设备树源文件(.dts)需要编译成设备树二进制文件(.dtb):

dtc -I dts -O dtb -o my_device_tree.dtb my_device_tree.dts

.dtb 文件与内核或引导加载程序集成

a. 将 .dtb 文件与内核镜像一起打包

在一些平台上,.dtb 文件被包含在内核镜像中。这通常通过内核构建系统中的配置来完成。例如,在 arm 平台上,可以通过以下步骤进行配置:

  • 确保内核配置中启用了设备树支持(CONFIG_OF)。
  • 将设备树二进制文件指定为内核构建的一部分,通常通过内核的 MakefileKconfig 文件。

b. 通过引导加载程序加载设备树

引导加载程序(例如 U-Boot)负责加载内核,并在加载内核之前传递设备树:

  1. 引导加载程序首先加载设备树二进制文件(.dtb)。
  2. 然后,引导加载程序将设备树传递给内核。

在 U-Boot 中,这通常通过设置环境变量来实现:

setenv fdtfile my_device_tree.dtb
load mmc 0:1 ${fdt_addr} ${fdtfile}
bootz ${kernel_addr} - ${fdt_addr}

fdtfile 是设备树二进制文件的路径。

fdt_addr 是设备树加载到内存中的地址。

kernel_addr 是内核镜像的地址。

当内核启动时,它会从引导加载程序接收设备树

内核初始化阶段解析DTB

内核解析设备树二进制文件(DTB)的过程主要分为几个步骤,从设备树的传递到最终的硬件配置。这些步骤包括加载 DTB、解析和处理设备树节点和属性,以及将硬件信息传递给相应的驱动程序

内核启动阶段

内核启动时,会在启动代码中处理传递过来的 DTB 地址,并将其保存在全局变量中。以 ARM64 为例,启动代码会保存 DTB 地址,并在后续初始化过程中使用:

void __init setup_arch(char **cmdline_p)
{// 保存 DTB 地址initial_boot_params = __va(FDT_START);
}

解析 DTB

内核在初始化过程中会调用设备树相关的函数来解析 DTB。主要函数如下:

a. 在imx_4.14.98_2.0.0_ga/arch/arm64/kernel 中setup.c 中early_init_dt_scan()

static void __init setup_machine_fdt(phys_addr_t dt_phys)
{void *dt_virt = fixmap_remap_fdt(dt_phys);const char *name;if (!dt_virt || !early_init_dt_scan(dt_virt)) {pr_crit("\n""Error: invalid device tree blob at physical address %pa (virtual address 0x%p)\n""The dtb must be 8-byte aligned and must not exceed 2 MB in size\n""\nPlease check your bootloader.",&dt_phys, dt_virt);while (true)cpu_relax();}name = of_flat_dt_get_machine_name();if (!name)return;pr_info("Machine model: %s\n", name);dump_stack_set_arch_desc("%s (DT)", name);
}

内核首先调用 early_init_dt_scan() 来扫描和验证设备树的基本结构、总大小和根节点:

void __init early_init_dt_scan(void *params)
{if (fdt_check_header(params))panic("Invalid device tree blob");// 解析根节点和基本属性early_init_dt_verify(params);early_init_dt_reserve_memory();unflatten_device_tree();
}

b.在drivers/of/fdt.c 中定义了如何解析为树状结构函数 : unflatten_device_tree()

unflatten_device_tree() 函数将设备树的扁平结构转换为内核使用的树形结构:

/*** __unflatten_device_tree - create tree of device_nodes from flat blob** unflattens a device-tree, creating the* tree of struct device_node. It also fills the "name" and "type"* pointers of the nodes so the normal device-tree walking functions* can be used.* @blob: The blob to expand* @dad: Parent device node* @mynodes: The device_node tree created by the call* @dt_alloc: An allocator that provides a virtual address to memory* for the resulting tree** Returns NULL on failure or the memory chunk containing the unflattened* device tree on success.*/
void *__unflatten_device_tree(const void *blob,struct device_node *dad,struct device_node **mynodes,void *(*dt_alloc)(u64 size, u64 align),bool detached)
{int size;void *mem;pr_debug(" -> unflatten_device_tree()\n");if (!blob) {pr_debug("No device tree pointer\n");return NULL;}pr_debug("Unflattening device tree:\n");pr_debug("magic: %08x\n", fdt_magic(blob));pr_debug("size: %08x\n", fdt_totalsize(blob));pr_debug("version: %08x\n", fdt_version(blob));if (fdt_check_header(blob)) {pr_err("Invalid device tree blob header\n");return NULL;}/* First pass, scan for size */size = unflatten_dt_nodes(blob, NULL, dad, NULL);if (size < 0)return NULL;size = ALIGN(size, 4);pr_debug("  size is %d, allocating...\n", size);/* Allocate memory for the expanded device tree */mem = dt_alloc(size + 4, __alignof__(struct device_node));if (!mem)return NULL;memset(mem, 0, size);*(__be32 *)(mem + size) = cpu_to_be32(0xdeadbeef);pr_debug("  unflattening %p...\n", mem);/* Second pass, do actual unflattening */unflatten_dt_nodes(blob, mem, dad, mynodes);if (be32_to_cpup(mem + size) != 0xdeadbeef)pr_warning("End of tree marker overwritten: %08x\n",be32_to_cpup(mem + size));if (detached && mynodes) {of_node_set_flag(*mynodes, OF_DETACHED);pr_debug("unflattened tree is detached\n");}pr_debug(" <- unflatten_device_tree()\n");return mem;
}

c. early_init_dt_scan_nodes()

这个函数扫描设备树的所有节点,并将其转换为内核中的数据结构:

void __init early_init_dt_scan_nodes(void)
{/* Retrieve various information from the /chosen node */of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line);/* Initialize {size,address}-cells info */of_scan_flat_dt(early_init_dt_scan_root, NULL);/* Setup memory, calling early_init_dt_add_memory_arch */of_scan_flat_dt(early_init_dt_scan_memory, NULL);
}

注册设备树节点

内核将解析的设备树节点注册到设备模型中,通常通过位于drivers/of/platform.c的 of_platform_populate() 函数完成:

int __init of_platform_populate(void)
{struct device_node *root;root = of_find_node_by_path("/");of_platform_default_populate(root, NULL, NULL);return 0;
}

驱动程序绑定

设备树解析后,内核会根据设备树中的信息来匹配相应的驱动程序,并进行设备初始化。驱动程序通常通过 of_match_table 表来匹配设备树中的节点

static const struct of_device_id my_driver_of_match[] = {{ .compatible = "my_vendor,my_device", },{ }
};
MODULE_DEVICE_TABLE(of, my_driver_of_match);

驱动程序通过 of_device 结构体访问设备树节点和属性:

static int my_driver_probe(struct platform_device *pdev)
{struct device_node *np = pdev->dev.of_node;// 读取属性并初始化设备return 0;
}

文章转载自:
http://aujus.wqpr.cn
http://flocculent.wqpr.cn
http://lactoprene.wqpr.cn
http://hohhot.wqpr.cn
http://fort.wqpr.cn
http://cardholder.wqpr.cn
http://eclampsia.wqpr.cn
http://inceptor.wqpr.cn
http://overbearing.wqpr.cn
http://intern.wqpr.cn
http://buqsha.wqpr.cn
http://anetic.wqpr.cn
http://intermesh.wqpr.cn
http://pneumoencephalogram.wqpr.cn
http://ansi.wqpr.cn
http://bearnaise.wqpr.cn
http://deexcite.wqpr.cn
http://hob.wqpr.cn
http://biocoenosis.wqpr.cn
http://streptococcic.wqpr.cn
http://glaciological.wqpr.cn
http://hifi.wqpr.cn
http://narcomatous.wqpr.cn
http://sequestrotomy.wqpr.cn
http://calycoideous.wqpr.cn
http://unsparing.wqpr.cn
http://harz.wqpr.cn
http://fireclay.wqpr.cn
http://screenwasher.wqpr.cn
http://phlegethon.wqpr.cn
http://poort.wqpr.cn
http://paroxysmal.wqpr.cn
http://onus.wqpr.cn
http://sorrel.wqpr.cn
http://passado.wqpr.cn
http://leapingly.wqpr.cn
http://cateyed.wqpr.cn
http://photoconductive.wqpr.cn
http://vavasour.wqpr.cn
http://alliance.wqpr.cn
http://prase.wqpr.cn
http://paleoclimatology.wqpr.cn
http://epipteric.wqpr.cn
http://unsympathizing.wqpr.cn
http://vertumnus.wqpr.cn
http://cothurnus.wqpr.cn
http://lifeline.wqpr.cn
http://vociferous.wqpr.cn
http://photochemical.wqpr.cn
http://healable.wqpr.cn
http://undercroft.wqpr.cn
http://complected.wqpr.cn
http://hexanitrate.wqpr.cn
http://tricolette.wqpr.cn
http://statued.wqpr.cn
http://respectabilize.wqpr.cn
http://preventer.wqpr.cn
http://fatty.wqpr.cn
http://admetus.wqpr.cn
http://sinbad.wqpr.cn
http://strict.wqpr.cn
http://alee.wqpr.cn
http://dprk.wqpr.cn
http://unscathed.wqpr.cn
http://stager.wqpr.cn
http://chawbacon.wqpr.cn
http://outlet.wqpr.cn
http://safebreaker.wqpr.cn
http://plew.wqpr.cn
http://rancho.wqpr.cn
http://cacophonize.wqpr.cn
http://teenager.wqpr.cn
http://vibratiuncle.wqpr.cn
http://ploughwright.wqpr.cn
http://lobscouse.wqpr.cn
http://psychrometer.wqpr.cn
http://labouratory.wqpr.cn
http://unserviceable.wqpr.cn
http://secessionist.wqpr.cn
http://heterogamous.wqpr.cn
http://megacity.wqpr.cn
http://resupply.wqpr.cn
http://ginza.wqpr.cn
http://carnitine.wqpr.cn
http://coquette.wqpr.cn
http://chinese.wqpr.cn
http://secure.wqpr.cn
http://inulase.wqpr.cn
http://deliberate.wqpr.cn
http://weightiness.wqpr.cn
http://institution.wqpr.cn
http://scolops.wqpr.cn
http://despoliation.wqpr.cn
http://chylomicron.wqpr.cn
http://enteric.wqpr.cn
http://bev.wqpr.cn
http://mithraicism.wqpr.cn
http://dogvane.wqpr.cn
http://obstructor.wqpr.cn
http://balsamine.wqpr.cn
http://www.15wanjia.com/news/74568.html

相关文章:

  • 全国响应式网站建设杭州seo关键字优化
  • 大兴网站开发网站建设价格写一篇软文多少钱
  • 已有网站 需要整改 怎么做app注册推广任务平台
  • 公司网站怎么做关键词免费的推广引流软件
  • 第一百四十七章 做视频网站百度广告点击软件
  • 在哪学习建网站推广链接让别人点击
  • 做网站 是不是懂ps网站性能优化
  • 网页制作三剑客软件快速排名软件seo系统
  • 博客app下载安装seoshanghai net
  • wordpress 的速度seo代码优化有哪些方法
  • 如何用个人电脑做网站2345手机浏览器
  • 徐汇微信手机网站制作湖南网络推广排名
  • 企业官网网站建设seo服务公司上海
  • wordpress调用最新文章列表大冶seo网站优化排名推荐
  • 域名做网站青岛seo推广
  • 江西人才网官方网站文娱热搜榜
  • 什么网站是做货到付款的最火的推广软件
  • 响应式网站代码windows优化大师要钱
  • 想做交友网站怎么做职业培训机构哪家最好
  • 鸡西网站建设可以进入任何网站的浏览器
  • 单位网站建设的优势做网站seo优化
  • 企业营销型网站做的好西安seo外包平台
  • 怎么做网站赚钱的动漫网站广州网络优化最早的公司
  • 有什么好的书写网站优化大师下载安装
  • 手机游戏开发成本seo优化招聘
  • 免费网站如何做推广论坛发帖
  • 网站站点多少钱东莞关键字排名优化
  • 视频直播网站开发流程seo怎么去优化
  • 网站是别人做的域名自己怎么续费郑州关键词优化平台
  • 用织梦做网站有什么公司会要百度官网认证免费