如何从嵌入式应用程序实际使用设备树Blob?

我正在尝试学习如何device tree工作。我看过一些资料,并或多或少地了解什么是dtsdtsidtb文件。

我不太了解的是如何dtb从最终应用程序访问文件中的信息我一直在阅读zephyros文档和一些Linux内核来理解这一点,但是对我来说仍然不是很清楚。

我现在了解的是最终应用程序(可能是OS内核)dtb“手动”读取和解析文件。这意味着每个OS内核都将以dtb自己的方式解析文件,对吗?

但是,据我了解,该应用程序未与dtb文件链接,后者先在某些存储区中闪烁,然后在应用程序中闪烁。以某种方式访问​​它。然后,如果在构建时这些符号不可用,如何构建应用程序?

破碎

免责声明:我不是Linux Kernel专家。

我想您的问题在这里得到了回答是的,每个操作系统内核都将以自己的方式解析DTB文件。在Linux的情况下,例如,DTB将通过u-boot读取,而u-boot将启动Linux内核并传递其加载DTB BLOB的地址。

在以下示例中,u-boot将把内核和DTB从FAT文件系统加载到内存中,然后将控件转移到地址为0x80300000的内核,同时告知其DTB BLOB将在地址0x815f0000可用:

fatload mmc 0:1 0x80300000 zImage
fatload mmc 0:1 0x815f0000 beagle-xm.dtb
bootz 0x80300000 - 0x815f0000

该DTB的斑点确实含有这两种符号名称及其相关值。该应用程序将使用一些专门用于读取DTB格式的代码,例如libfdt,以从其符号名称中检索值。现在,它不需要在构建DTB内容时就知道。这确实允许相同的编译内核在未修改的硬件上运行,而DTB中描述了各种硬件功能。

为了使操作系统有效地访问DTB中包含的信息,将使用libfdt从DTB BLOB中提取一次该信息,然后将其放入高效的数据结构中。例如,从“扩展”格式转换为“扩展”格式。

我强烈建议阅读:

请注意,Zephyr方法不是标准的:当设计开放固件/设备树方案以允许应用程序和硬件描述的“后期绑定”时,他们选择了一种更静态的方法。

Zephyr实际上使用的是一个自定义工具,该工具会处理DTB文件并生成C头文件,其中包含遵循某些命名约定的宏形式的相同信息。这可能就是为什么您对DTB内容和使用它的应用程序绑定在一起的确切阶段感到困惑的原因。

不要尝试使用Zephyr加速“设备树”概念。此外,在处理完全有效的DTB文件时,他们的工具还远远不够完善。

将DTB绑定到驱动程序的Linux内核驱动程序代码的一部分:

static const struct platform_device_id mxs_auart_devtype[] = {
    { .name = "mxs-auart-imx23", .driver_data = IMX23_AUART },
    { .name = "mxs-auart-imx28", .driver_data = IMX28_AUART },
    { .name = "as-auart-asm9260", .driver_data = ASM9260_AUART },
    { /* sentinel */ }
};
MODULE_DEVICE_TABLE(platform, mxs_auart_devtype);

static const struct of_device_id mxs_auart_dt_ids[] = {
    {
        .compatible = "fsl,imx28-auart",
        .data = &mxs_auart_devtype[IMX28_AUART]
    }, {
        .compatible = "fsl,imx23-auart",
        .data = &mxs_auart_devtype[IMX23_AUART]
    }, {
        .compatible = "alphascale,asm9260-auart",
        .data = &mxs_auart_devtype[ASM9260_AUART]
    }, { /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, mxs_auart_dt_ids);

在Zephyr代码中找到的等效项(尽管是不同的驱动程序):

#if DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(flexcomm5), nxp_lpc_spi, okay)
    /* Attach 12 MHz clock to FLEXCOMM5 */
    CLOCK_AttachClk(kFRO_HF_to_FLEXCOMM5);
    
    /* reset FLEXCOMM for SPI */
    RESET_PeripheralReset(kFC5_RST_SHIFT_RSTn);
#endif

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何实际使用Swing应用程序框架?

如何测试嵌入式红宝石应用程序?

如何从嵌入式应用程序接收 returnurl 事件?

如何使用HTML中的嵌入式Java应用程序进行本地文件系统访问

如何在angular2应用程序中使用Braintree的嵌入式UI?

如何在springboot应用程序中使用嵌入式mongoDB进行junit测试?

如何使用Spring Boot应用程序在嵌入式Jetty中配置异步超时

如何使用嵌入式tomcat会话集群设置Spring Boot应用程序?

如何在iOS的嵌入式专用框架和应用程序中使用静态库

如何创建/查找应用程序jar以使用嵌入式tomcat部署Spring Boot Maven应用程序?

最小的系统nspawn容器,用于与嵌入式应用程序隔离进程树

如何从本机iOS应用程序控制嵌入式Unity应用程序

在嵌入式Linux设备(Beaglebone Black)上启动时启动QT应用程序

Java嵌入式应用程序-设备上需要什么

如何使上传到闪亮应用程序的数据可用,然后实际使用它?

使用应用程序工厂模式时,如何从嵌入式Dash应用程序中访问Flask应用程序的上下文?

如何使用主应用程序和引导加载程序中的一项功能?(嵌入式)

从应用程序扩展链接到嵌入式框架

Java Web应用程序中的嵌入式Derby

远程执行Qt嵌入式应用程序

C ++应用程序中的嵌入式pdfium

具有独立应用程序的嵌入式Linux

“拆分”嵌入式系统上的应用程序

在没有浏览器的嵌入式设备上使用Google API访问应用程序中的用户数据

如何在Spring Boot应用程序中排除嵌入式Tomcat

如何通过主屏幕书签(嵌入式)检测到正在访问该应用程序?

如何使嵌入式mongodb在应用程序关闭时保持数据?

如何从命令行调用嵌入式jre以便运行Java应用程序

如何告诉Angular2忽略嵌入式Angular1应用程序?