按以上的修改,会报如下的错误:lxf@lxf:~/work/new_code/2018.3_releasecode_v0/jyxz7_image$ mkimage -f fitImage.its image1.ub Error: fitImage.its:22.13-29 Properties must precede subnodes FATAL ERROR: Unable to parse input tree mkimage: Can't read image1.ub.tmp: Invalid argument mkimage Can't add hashes to FIT blob lxf@lxf:~/work/new_code/2018.3_releasecode_v0/jyxz7_image$
时间: 2025-07-10 07:48:18 浏览: 8
<think>嗯,用户遇到了在修改ITS文件后运行mkimage时出现的错误。错误信息是“Properties must precede subnodes”,这说明在ITS文件的结构中,某些属性的位置可能不正确。用户之前按照我的建议在kernel@1和fdt节点中添加了timestamp属性,但导致了编译错误。
首先,我需要回顾一下设备树源文件(DTS)的结构规则。在DTS中,每个节点的结构必须是先属性后子节点。也就是说,所有属性(如description、data、type等)必须在该节点的子节点(如hash、timestamp等)之前声明。如果属性在子节点之后出现,就会触发这个错误。
用户提供的原始ITS文件中,kernel@1节点的结构是:
```
kernel@1 {
description = "Linux kernel";
data = /incbin/("./zImage");
type = "kernel";
arch = "arm";
os = "linux";
compression = "none";
load = <0x10080000>;
entry = <0x10080000>;
reg = <0x0 0x10080000 0x00100000>;
hash {
algo = "sha1";
};
// 添加固定时间戳
timestamp = <0>;
};
```
这里,hash是一个子节点,而timestamp是一个属性。根据DTS的规则,属性必须出现在子节点之前。用户可能在hash子节点之后添加了timestamp属性,导致属性出现在子节点之后,从而引发错误。
解决方案应该是将timestamp属性移到hash子节点之前。同样地,在fdt节点和conf配置节点中,如果存在类似的子节点,也需要检查属性是否在子节点之前声明。
另外,用户可能在配置节点conf中也添加了timestamp属性,但同样需要注意属性的位置。例如:
```
conf {
description = "Linux kernel, FDT blob";
kernel = "kernel@1";
fdt = "fdt";
hash {
algo = "sha1";
};
timestamp = <0>;
};
```
这里,hash是一个子节点,timestamp作为属性应该放在hash之前。
接下来,我需要验证这个思路是否正确。可以通过调整属性顺序,确保所有属性都位于子节点之前,然后重新运行mkimage命令,看是否还会报错。如果错误消失,说明问题确实出在属性顺序上。
此外,还需要注意用户使用的mkimage版本。用户提到使用的是2018.3版本的代码,可能对应U-Boot 2018.03版本。不同版本的mkimage可能对DTS的语法要求略有不同,但属性在子节点之前的规则应该是普遍适用的。因此,调整属性顺序应该可以解决问题。
总结步骤:
1. 检查每个节点中的属性是否都位于子节点之前。
2. 将timestamp属性移动到hash子节点之前。
3. 确保所有节点的属性顺序正确。
4. 重新运行mkimage命令验证是否成功。
如果用户按照这些步骤修改后,应该能够避免之前的错误,并且生成具有固定时间戳的image.ub文件,从而保证MD5值的一致性。</think>根据错误提示`Properties must precede subnodes`,说明**属性必须定义在子节点之前**。观察您的ITS文件结构,在`kernel@1`节点中,`timestamp`属性的位置放错了。以下是详细修复步骤:
---
### 一、错误原因分析
FIT格式遵循设备树语法规则,**所有属性(property)必须定义在子节点(subnode)之前**。在您的ITS文件中:
- `kernel@1`节点中的`timestamp`属性被放在`hash`子节点之后
- `fdt`和`conf`节点也存在相同问题
---
### 二、修复后的ITS文件
调整属性顺序,**将`timestamp`属性移动到`hash`子节点之前**:
```dts
/dts-v1/;
/ {
description = "U-Boot fitImage for esiontech jyxz7";
#address-cells = <1>;
images {
#address-cells = <2>;
#size-cells = <1>;
kernel@1 {
description = "Linux kernel";
data = /incbin/("./zImage");
type = "kernel";
arch = "arm";
os = "linux";
compression = "none";
load = <0x10080000>;
entry = <0x10080000>;
reg = <0x0 0x10080000 0x00100000>;
timestamp = <0>; // 移动到 hash 子节点之前
hash {
algo = "sha1";
};
};
fdt {
description = "Flattened Device Tree blob";
data = /incbin/("./devicetree.dtb");
type = "flat_dt";
arch = "arm";
compression = "none";
timestamp = <0>; // 移动到 hash 子节点之前
hash {
algo = "sha1";
};
};
};
configurations {
default = "conf";
conf {
description = "Linux kernel, FDT blob";
kernel = "kernel@1";
fdt = "fdt";
timestamp = <0>; // 移动到 hash 子节点之前
hash {
algo = "sha1";
};
};
};
};
```
---
### 三、验证步骤
1. **重新生成镜像**
```bash
mkimage -f fitImage.its image.ub
```
此时应不再报错。
2. **检查MD5稳定性**
重复生成两次镜像并对比MD5:
```bash
md5sum image1.ub image2.ub
```
---
### 四、补充说明
1. **U-Boot版本兼容性**
您使用的`2018.3`版本已支持`timestamp`属性,但需注意:
- 确保`mkimage`版本与U-Boot源码匹配
- 若仍报错,尝试移除`#address-cells = <2>;`和`#size-cells = <1>;`(这两个属性在FIT镜像中通常非必需)
2. **极端情况处理**
若调整顺序后仍报错,可尝试:
```dts
timestamp = [00 00 00 00]; // 使用字节数组格式替代整数
```
---
通过上述调整,即可在保持`zImage`和`devicetree.dtb`不变的前提下,确保生成的`image.ub`具有稳定MD5值。
阅读全文
相关推荐
















