Table of Contents
where to get
https://github.com/SolidRun/PyTLVWriter
Overview
This script writes TLV (Type-Length-Value) structured data into an I2C EEPROM. It supports a variety of system-specific keys that define metadata for the device.
The script:
Builds TLV-formatted payloads.
Writes the data into an EEPROM via I2C.
Supports custom-defined keys.
Calculates and appends a CRC checksum to ensure data integrity.
Dependencies
To ensure all required dependencies are installed, run:
sudo apt update sudo apt install python3 python3-smbus
this will:
Install Python 3 if it is not already installed.
Install smbus for I2C communication.
Usage
python3 TLV_write.py <i2c_bus> <eeprom_address> [--yes] [-b] <key> <value> <key> <value> ...
Arguments
Argument | Description |
---|---|
i2c_bus | The I2C bus number. |
eeprom_address | The EEPROM address (hex or decimal). |
--yes | Automatically confirms the operation (skips user confirmation). |
-b | Writes the TLV data to a binary file ( |
<key> <value> | One or more key-value pairs to write to EEPROM. |
Example Usage
For example if we want the following data to appear in DMI:
Handle 0xXXXX, DMI type 1, XX bytes System Information Manufacturer: XXXXX Product Name: MySystem Version: 1.0 Serial Number: XXXXXX UUID: XXXXXX-XXXXX-XXXXX-XXXXX-XXXXX Wake-up Type: XXXXXXXXXXXX SKU Number: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Family: XXXXXXXXXXXXXXXXXXXXXXX
We want to run the following command (Note that bus 3 address 0X50 is used in this example):
python3 TLVwriter.py 3 0x50 TLV_CODE_SYS_NAME "MySystem" TLV_CODE_SYS_VERSION "1.0"
eeprom example for this :
python3 TLVwriter.py 3 0x50 TLV_CODE_SYS_NAME "EmbeddedDevice" \ TLV_CODE_SYS_SKU "ED-2024" \ TLV_CODE_SYS_SERIAL_NUMBER "SN123456789" \ TLV_CODE_SYS_VERSION "01.02" \ TLV_CODE_FAMILY "Industrial" \ TLV_CODE_MANUF_NAME "Solid-Run" \ TLV_CODE_MANUF_DATE "2024-03-11" \ TLV_CODE_PLATFORM_NAME "Bedrock-IPC"
00: 54 6c 76 49 6e 66 6f 00 01 65 00 30 0e 45 6d 62 TlvInfo.?e.0?Emb
10: 65 64 64 65 64 44 65 76 69 63 65 31 07 45 44 2d eddedDevice1?ED-
20: 32 30 32 34 32 0b 53 4e 31 32 33 34 35 36 37 38 20242?SN12345678
30: 39 33 05 30 31 2E 30 32 20 0a 49 6e 64 75 73 74 93?01.02 ?Indust
40: 72 69 61 6c 25 09 73 6f 6c 69 64 2d 72 75 6e 23 rial%.solid-run#
50: 0a 32 30 32 34 2d 30 33 2d 31 31 24 0b 42 65 64 .2024-03-11$.Bed
60: 72 6f 63 6b 2d 49 50 43 fe 04 6e 7e c0 fd 00 00 rock-IPC??n~??
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
80: ……
header
version
Total Payload Length (little endian)
Type
Length
Value
crc checksum TLV
Finding the I2C Bus Number
To determine the correct I2C bus number, run the following command:
sudo i2cdetect -y 1
If no EEPROM device is found, repeat the command with different bus numbers (e.g., 2, 3, 4, etc.) until you detect an address 0x50 or 0x56. Once found, use the corresponding bus number in the script.
Example:
sudo i2cdetect -y 2
If the output shows:
0 1 2 3 4 5 6 7 8 9 A B C D E F 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
Then bus 2 and address 0x50 should be used in the script.
Supported TLV Keys
Each TLV Key has a Hex Code, Max Length, and belongs to a DMIDecode Type.
System Information (SMBUS Type 1)
TLV Key | Max Length (bytes) | BIOS path |
TLV_CODE_FAMILY | 20 | - |
TLV_CODE_MANUF_DATE | 10 | - |
TLV_CODE_PLATFORM_NAME | 20 | - |
TLV_CODE_MANUF_NAME | 20 | - |
TLV_CODE_VENDOR_NAME | 20 | - |
TLV_CODE_SYS_NAME | 20 | Main → Detailed Configuration Information → Model |
TLV_CODE_SYS_SKU | 20 | Main screen |
TLV_CODE_SYS_SERIAL_NUMBER | 24 | Main screen |
TLV_CODE_SYS_VERSION | 5 | - |
NIO Information (SMBUS Type 2)
TLV Key | Max Length (bytes) |
TLV_CODE_NIO_NAME | 20 |
TLV_CODE_NIO_SERIAL_NUMBER | 24 |
TLV_CODE_NIO_VERSION | 5 |
Chassis Information (SMBUS Type 3)
TLV Key | Max Length (bytes) |
TLV_CODE_CHS_SERIAL_NUMBER | 24 |
TLV_CODE_CHS_VERSION | 5 |
TLV Key | Max Length (bytes) | BIOS path |
TLV_CODE_CONFIG_CODE | 200 | Main → Detailed Configuration Information → Configuration String |
Error Handling
If invalid input is provided, the script will:
Print an error message.
Exit without modifying EEPROM contents.
Possible Errors
Error Message | Cause |
| Provided TLV key is not in the supported list. |
| Input exceeds the maximum allowed length. |
| Incorrect MAC format. |
| I2C communication issue during EEPROM write. |
| Data is too large for EEPROM storage. |