如何将设备树Blob添加到Linux x86内核启动?

Tey*_*ey' 5 x86 linux-kernel embedded-linux bootloader device-tree

我的自定义开发板基于x86,并且不使用供应商内核驱动程序就无法轻松控制与其连接的电子组件之一(主要是通过SPI)(如果我不使用它,供应商将无济于事) 。该模块需要一些从设备树中获取的配置参数。我相信该模块主要用于设备树很常见的ARM平台上。

在x86上,通常不需要设备树,因此在Linux内核编译过程中默认情况下将其禁用。我更改了配置以启用它,但是我找不到将设备树BLOB放入启动映像的方法。内核源代码中只有一个用于x86体系结构的DTS文件,但是似乎根本没有使用它,因此没有帮助。

内核文档中,我知道我需要将其放在x86实模式内核标头setup_data字段中,但我不知道如何以及何时执行此操作(在内核构建时?在构建Bootloader时?)。我应该直接破解文件吗?arch/x86/boot/header.S

现在,我已经用硬编码值替换了模块配置,但是使用设备树会更好。

小智 2

在 x86 上,引导加载程序在调用内核入口点之前将设备树二进制数据 (DTB) 添加到 setup_data 结构的链接列表中。DTB 可以从存储设备加载或嵌入到引导加载程序映像中。

下面的代码展示了它是如何在U-Boot中实现的。

http://git.denx.de/?p=u-boot.git;a=blob;f=arch/x86/lib/zimage.c

static int setup_device_tree(struct setup_header *hdr, const void *fdt_blob)
{
        int bootproto = get_boot_protocol(hdr);
        struct setup_data *sd;
        int size;

        if (bootproto < 0x0209)
                return -ENOTSUPP;

        if (!fdt_blob)
                return 0;

        size = fdt_totalsize(fdt_blob);
        if (size < 0)
                return -EINVAL;

        size += sizeof(struct setup_data);
        sd = (struct setup_data *)malloc(size);
        if (!sd) {
                printf("Not enough memory for DTB setup data\n");
                return -ENOMEM;
        }

        sd->next = hdr->setup_data;
        sd->type = SETUP_DTB;
        sd->len = fdt_totalsize(fdt_blob);
        memcpy(sd->data, fdt_blob, sd->len);
        hdr->setup_data = (unsigned long)sd;

        return 0;
}
Run Code Online (Sandbox Code Playgroud)