0

u-boot版本:2021.07-RC3

【描述】
构建并运行u-boot:

make sandbox_defconfig
make
./u-boot -d u-boot.dtb

在命令行中键入以下内容:

=> demo hello 5

我收到以下错误:

Command 'demo' failed: Error -22

[分析]
索引 5 是定义在 'hexagon' 的设备arch/sandbox/dts/sandbox.dtsi

hexagon {
        compatible = "demo-simple";
        colour = "white";
        sides = <6>;
    };

device_probe将调用,of_to_plat最终调用demo_parse_dtdrivers/demo/demo-uclass.c

int demo_parse_dt(struct udevice *dev)
{
    struct dm_demo_pdata *pdata = dev_get_plat(dev);
    int dn = dev_of_offset(dev);

    pdata->sides = fdtdec_get_int(gd->fdt_blob, dn, "sides", 0);
    pdata->colour = fdt_getprop(gd->fdt_blob, dn, "colour", NULL);
    if (!pdata->sides || !pdata->colour) {
        debug("%s: Invalid device tree data\n", __func__);
        return -EINVAL;
    }

    return 0;
}

在这里,我得到 0pdata->sides和 NULL pdata->colour。似乎fdtdec_get_intfdt_getprop没有从设备树中获得正确的值。
我注意到dn这里是int类型,但是dev->node_.of_offsetlong类型。所以dn包含一个截断的偏移值。但是,我不确定我得到的错误是否与此有关。

4

1 回答 1

1

我也面临类似的问题。我按照您的线索进行编辑。它似乎工作。

int demo_parse_dt(struct udevice *dev)
{
    struct dm_demo_pdata *pdata = dev_get_plat(dev);
    int dn = dev_of_offset(dev);

    pdata->sides =  dev_read_s32_default(dev, "sides", 0);
    pdata->colour =  dev_read_prop(dev, "colour", NULL);

    if (!pdata->sides || !pdata->colour) {
        printf("%s: Invalid device tree data\n", __func__);
        return -EINVAL;
    }

    return 0;
}

我对 u-boot 很陌生。谁找到了更好的方法,请纠正我。

于 2021-08-13T02:38:31.787 回答