This is an old revision of the document!
Firmware Versioning evolution
FX3 Version Info
The version id is also encoded into the firmware image file name as:
<VendorID>_<HardwareID>_<ProductID>_<ReleaseType>_<BuildNumber>
FX3 version info C/C++-struct
The FX3 version structure is as follows (little-endian memory layout):
- firmware-version.h
struct FwVersion{ unsigned vendorId : 3; unsigned hwCfgId : 5; unsigned productId : 8; #ifdef OLD_VER_FMT unsigned releaseType : 5; unsigned buildNo : 11; #else unsigned releaseType : 3; unsigned buildNo : 13; #endif }; static_assert(sizeof(FwVersion) == 4);
Prior to FPGA v. 89 there was no standard-compliant way of representing the version info in a C struct though (which is exactly what prompted the rework in the first place).
Bit layout
The bits are laid out in 4 sequential bytes as follows (depending on the version):
version | 3 | 2 | 1 | 0 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
fx3<102 fpga<77 | buildNo[7:0] | releaseType | buildNo[10:8] | productId | vendorId | hwCfgId | ||||||||||||||||||||||||||
fx3<103 | buildNo[10:3] | buildNo[2:0] | releaseType | productId | hwCfgId | vendorId | ||||||||||||||||||||||||||
fx3>=103 fpga>=77 | buildNo[12:5] | buildNo[4:0] | releaseType | productId | hwCfgId | vendorId |
Because of the change in bit layout different byte sequences shown below are needed to produce the same result (exact same component values for the sake of simplicity and only as an illustration):
version | byte sequence (API return buffer) | .vendorId = 1 .hwCfgId = 1 .productId = 5 .releaseType = 3 .buildNo = 0x67 |
---|---|---|
fx3>=102 fpga<77 | 0x21 0x05 0x18 0x67 |
|
fx3<103 | 0x09 0x05 0xE3 0x0C |
|
fx3>=103 fpga>=77 | 0x09 0x05 0x3B 0x03 |