VBF(Versatile Binary Format)格式简介

一、综述

VBF(Versatile Binary Format)是主机厂常用的一种固件发行文件格式,包括沃尔沃、福特、吉利等均采用此格式。

二、格式

2.1 格式简介

VBF文件包含三部分:VBF版本段、文件头段、数据段。

  1. VBF版本段:表明当前VBF文件使用的版本号。版本号使用ASCII码存储;
  2. 文件头段:文件头段包含通用信息,例如使用说明、安装信息等。文件头使用ASCII存储;
  3. 数据段:数据段为实际写入ECU的数据信息。使用二进制格式存储;

VBF文件格式概览如下:

Name Description Type Data
VBF版本段 VBF版本号 Text vbf_version=2.7;
文件头段 头信息 Text n bytes,ASCII
数据段 Block 1 Start address 4 bytes,binary
Length 4 bytes,binary
Data n bytes,binary
Checksum 2 bytes,binary
Block 2 Start address 4 bytes,binary
Length 4 bytes,binary
Data n bytes,binary
Checksum 2 bytes,binary
.. .. ..
Block n Start address 4 bytes,binary
Length 4 bytes,binary
Data n bytes,binary
Checksum 2 bytes,binary

2.2 文本格式说明

VBF文件的前两个部分VBF版本部分和文件头部分均为ASCII码格式存储,应遵循如下填写要求:
1.[]中括号表明内容是可选的;
2.{}大括号表明是一个组;
3.()圆括号中使用|进行分割,表明至少存在其中一项;
4.内容均以标识符开头,以分号;结尾;
5.标识符值中的每个元素要么是整数,要么是实数,要么是带引号的字符串,要么是保留值。每个标识符都有其标识符值允许的特定格式;
6.整数:整数以16进制格式表示,必须以0x开头,例如0xFF
7.仅文件头部分允许出现注释。注释使用"/**/"或"//";
8.合法的空白字符包括:空格、水平Tab、换行、回车、换页、垂直Tab

描述 字符 16进制
水平Tab HT 09
换行 LF 0A
垂直Tab VT 0B
换页 FF 0C
回车 CR 0D
空格 SPACE 20
9.不允许出现非打印字符;

2.3 VBF版本段

VBF文件的第一行就需明确该VBF文件的版本信息。一个VBF文件的第一个字节必然是0x76(ASCII:'v')
正确写法示例:

  • vbf_version=2.7;
  • vbf_version = 2.7 ;
    VBF版本部分后必须紧跟文件头部分。BVF版本部分和文件头部分可以包含空白字符(见2.2章节8)

2.4 文件头段

文件头以"header"作为标识符,整个文件头需使用大括号进行包裹。
正确写法示例:
1.vbf_verison=2.7;header{
2.vbf_version=2.7;
header{
3.vbf_version=2.7;
header
{

文件头部分可用的标识符信息如下:
header{
[description={"text 1","text 2",
"text 3",
};]
sw_part_number="";
sw_version="";
sw_part_type=;
[sw_current_part_number = "";]
[sw_current_version = "";]
[data_format_identifier =;]
ecu_address = ECU target address;
[erase={{start address 1,length 1},
{start address 2,length 2},
};]
[call = ;]
[verification_block_root_hash = ;]
[verification_block_start = ;]
[verification_block_length = ;]
[sw_signature_dev = ;]
[sw_signature = ;]
[parameter_settings = { {"parameter 1", "value"}, {"parameter n",
"value"} }; ]
file_checksum = checksum;
}
各标识符详细解释见下方章节

2.4.1 description

description标识符是可选的,用来简短的介绍文件。
description值需满足如下要求:

  1. 最多16行
  2. 每行最多80字节
  3. 每行都包含在引号(")中,并以逗号(,)结束,如果该行是最后一行,则以右括号(})后跟分号(;)结束
  4. 引号内的空白不会被忽略
  5. 无论是单行还是多行,所有描述行都应包含在大括号内
  6. 行内不允许使用引号(")

正确示例:

  1. description = {"Created:2022-03-14"};
  2. description = {"created by xxx",
    "sop xxxx"
    };

2.4.2 sw_part_number

sw_part_number标识符为必选,用来识别汽车制造商的软件组件(VBF文件)的零部件号。
sw_part_number值需满足如下条件:
1.必须用引号包含
2.最多20个字节
3.不允许空白符和注释

正确示例:

  1. sw_part_number = "384745";

2.4.3 sw_version

sw_version标识符为必选,用来识别汽车制造商的软件组件(VBF文件)的版本号。
sw_version值需满足如下条件:
1.必须用引号包含
2.最多4个字节
3.不允许空白符和注释
4.应只包含大写字符A-Z(不能出现数字)

正确示例:

  1. sw_part_number = "384745";

2.4.4 sw_part_type

sw_part_type标识符为必选,用来指明ECU软件类型。
sw_part_type无需使用双引号包围,且仅允许使用下表中的值。

合法值 描述
CARCFG Car configuration
CUSTOM Customer parameters
DATA Data or parameters(i.e.,calibrations)
EXE Executable
SBL Secondary Bootloader
SIGCFG Signal configuration
PBL Primary Bootloader
SSBL Special SBL which has the possibility to replace the PBL
TEST Test program,(i.e.production test,diagnostics)
FBL Flashable Bootloader
CERT Certificate
PWD Password for certificate
APP Application file
MAP Map file used for navigation
ESS ECU Software Structure
SIGNED Digital Signature file
VARIANT_INFO Settings file(for offboard tool settings)

当sw_part_type值为SBL或SSBL时,不允许使用标识符erase
正确示例:

  1. sw_part_type = EXE;
  2. sw_part_type = APP;

2.4.5 sw_current_part_number

sw_current_part_number标识符为可选,用来识别汽车制造商的软件组件(VBF文件)的零部件号。该标识符值仅用于进行差分软件升级(delta software update)时,已安装的软件零部件号应匹配此值。此字段仅适用于软件升级且压缩类型为"delta"的软件升级时使用。
sw_current_part_number值需满足如下条件:
1.必须用引号包含
2.最多20个字节
3.不允许空白符和注释

正确示例:

  1. sw_current_part_number = "384745";

2.4.6 sw_current_version

sw_current_version标识符为可选。当使用差分软件升级(delta software update)时,用来标识期望在当前ECU中已安装的汽车制造商的软件组件(VBF文件)的版本号。该字段仅在软件升级且压缩类型为delta时使用。
sw_current_version值需满足如下条件:
1.必须用引号包含
2.最多4个字节
3.不允许空白符和注释
4.应只包含大写字符A-Z(不能出现数字)

正确示例:

  1. sw_current_version = "ABC";

2.4.7 data_format_identifier

data_format_identifier标识符为可选,以非零值出现在头信息中。该字段表明数据的压缩和加密方式,字段的合法值范围为0x00到0xFF,其中高半个字节代表数据压缩方式,低半个自交代表数据加密方式。当该标识符未出现在头信息中,表明即不做压缩,也不做加密。

正确示例:

  1. data_format_identifier = 0x10; //压缩方式为#1,不加密
  2. data_format_identifier = 0x21; //压缩方式为#2,加密方式为#1

2.4.7 ecu_address

ecu_address标识符为必选,用来指明ECU的物理目标地址。该字段值被划分为3个不分:Domain ID,Network ID、ECU ID。ecu_address取决于ECU在网络拓扑中的位置。
ecu_address共2个字节,16个bit。bit 0-3为ECU ID,bit 4-7为Network ID,bit 8-11为Domain ID。

正确示例:

  1. ecu_address = 0x 1234; //Domain ID:0x2,Network ID:0x3,ECU ID:0x4

2.4.8 erase

erase标识符为可选,指示在软件下载操作发生之前需要擦除的内存范围。擦除起始地址和长度不需要与flash扇区起始地址和长度匹配。擦除长度可以跨越多个Flash扇区,也可以在单个Flash扇区内。erase标识符值需使用大括号包含2个值,第一个值为起始地址,第二个值为长度。起始地址和长度的范围均为0x00000000到0xFFFFFFFF。

正确示例:

  1. erase = {{0x00001000,0x00003FFF}};
  2. erase = {{0x00001000,0x00003FFF},
    {0x000060FF,0x00000500}
    };

2.4.9 call

call标识符在sw_part_type为SBL或SSBL时是必选,在sw_part_type为TEST时是可选的。在sw_part_type为其他值是,不允许使用call标识符。
call标识符指示ECU内存里预定义的可执行函数的起始地址,其实地址为4个字节,范围在0x00000000到0xFFFFFFFF。

正确示例:

  1. sw_part_type = SBL;
    call=0x00001000;
  2. sw_part_type = SSBL;
    call=0x00001000;

2.4.10 verification_block_start

verification_block_start标识符为可选的,指示需要进行签名的原始数据(未压缩前)的起始地址。该标识符值为4个字节。
正确示例:
1.verification_block_start = 0x00001000;

2.4.11 verification_block_length

verification_block_length标识符为可选的,指示需要进行签名的的原始数据(未压缩和加密前)的长度。该标识符值为4个字节。
正确示例:
1.verification_block_length = 0x00001000;

2.4.12 verification_block_root_hash

verification_block_length标识符为可选的,指示需要进行签名的的原始数据(未压缩和加密前)的哈希值。该标识符值长度依据HASH算法确定。
正确示例:
1.verification_block_length = 0x1234567890ABCDEF1234567890ABCDEF;

2.4.13 sw_signature

sw_signature标识符为可选的,代表签名值。该标识符值的长度需根据签名算法确定。

2.4.14 sw_signature_dev

sw_signature_dev标识符为可选的,代表测试和开发阶段的签名值。该标识符值的长度需根据签名算法确定。使用开发阶段密钥对后续会发布的软件进行签名,形成签名值并存储在该标识符中。

2.4.15 file_checksum

file_checksum标识符为必选,长度为4个字节。checksum目的是在尝试下载前,进行文件完整性的校验。checksum使用CRC32算法,计算数据部分的所有数据,包括所有data block的start address、length、 checksum。
checksum满足如下规范:

  • 32 bit CRC,多项式为0x04C11DB7(x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x^1 + 1)
  • 初始值为0xFFFFFFFF
  • 位反转

若没有data blocks,则file_checksum为0xFFFFFFFF。

正确示例:
1.file_checksum = 0x12345678;

2.4.16 parameter_settings

parameter_settings标识符为可选的,用于定义和携带off-board工具所需的配置。

2.5 数据段

文件头段之后紧跟数据段,文件头以“}”结束(ASCII 0x7D)。二进制的数据段从紧接这个ASCII}字符的下一个字节开始,数据段可以省略,例如特殊情况下,不包含数据段。
数据段格式如下:

数据段 Block 1 Start address 4 bytes,binary
Length 4 bytes,binary
Data n bytes,binary
Checksum 2 bytes,binary
Block 2 Start address 4 bytes,binary
Length 4 bytes,binary
Data n bytes,binary
Checksum 2 bytes,binary
.. .. ..
Block n Start address 4 bytes,binary
Length 4 bytes,binary
Data n bytes,binary
Checksum 2 bytes,binary

数据段由多个block组成,每个block具有4个部分:
1.start address:4字节,ECU内存中的物理地址,取值范围为0x00000000到0xFFFFFFFF。
2.length:4字节,当前block中Data部分的字节长度,取值范围为0x00000001到0xFFFFFFFF。若data被压缩,则该长度为压缩后的长度。
3.data:数据内容。
4.checksum:2个字节,针对data的校验值(不包含start address和length),取值范围从0x0000到0xFFFF。checksum算法使用CRC16-CITT,多项式为0x1021(x16+x12+x^5+1),初始值为x0FFFF

posted @ 2023-12-07 09:44  辛勤搬砖的门卫  阅读(1079)  评论(0编辑  收藏  举报