Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Table of Contents

Table of Contents
minLevel1
maxLevel6
outlinefalse
stylenone
typelist
printabletrue

...

where to get

https://github.com/SolidRun/PyTLVWriter

Anchor
TLV_OVERVIEW_ANCH
TLV_OVERVIEW_ANCH
Overview

This script writes TLV (TagType-Length-Value) structured data into an I2C EEPROM. It supports a variety of system-specific keys that define metadata for the device.

...

  • 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.

...

Anchor
TLV_DEPENDENCIES_ANCH
TLV_DEPENDENCIES_ANCH
Dependencies

To ensure all required dependencies are installed, run:

Code Block
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.

...

Anchor
TLV_USAGE_ANCH
TLV_USAGE_ANCH
Usage

Code Block
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
-y
--force

Automatically confirms the operation (skips user confirmation).

-b

Writes the TLV data to a binary file (/tmp/eeprom_tlv.bin) without writing to the EEPROM. You can later write it manually using dd.

<key> <value>

One or more key-value pairs to write to EEPROM.

Anchor
TLV_EXAMPLE_USAGE_ANCH
TLV_EXAMPLE_USAGE_ANCH
Example Usage

For example if we want the following data to appear in DMI:

Code Block
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):

Code Block
python3 TLVwriter.py 3 0x50 TLV_CODE_SYS_NAME "MySystem" TLV_CODE_SYS_VERSION "1.0"
Panel
bgColor#FFFFFF

eeprom example for this :

Code Block
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 0030 0e 45 6d 62 TlvInfo.?e.0?Emb
10: 65 64 64 65 64 44 65 76 69 63 65 3107 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

Anchor
TLV_FIND_I2CBUS_ANCH
TLV_FIND_I2CBUS_ANCH

Info

Finding the I2C Bus Number

To determine the correct I2C bus number, run the following command:

Code Block
sudo i2cdetect -y 1

If no EEPROM device is found, repeat the command with different bus numbers (e.g.

...

, 3, 4, 5 etc.) until you detect an address 0x50 or 0x56. Once found, use the corresponding bus number in the script.

Example:

Code Block
sudo i2cdetect -y 
2
3

If the output shows:

Code Block
     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

...

3 and address 0x50 should be used in the script.

Arguments

Argument

Description

i2c_bus

The I2C bus number.

eeprom_address

The EEPROM address (hex or decimal).

--yes (optional)

Automatically confirms the operation (skips user confirmation).

<key> <value>

One or more key-value pairs to write to EEPROM.

Example Usage

Code Block
python3 TLV_write.py 2 0x50 TLV_CODE_SYS_NAME "MySystem" TLV_CODE_SYS_VERSION "1.0"

This writes:

...

System Name: "MySystem"

...

Note

Bus 2 or 5 usually has the memory SPD on addresses 0x50 & 0x51, do not write to them!

...

Anchor
TLV_KEYS_ANCH
TLV_KEYS_ANCH
Supported TLV Keys

Each TLV Key has a Hex Code, Max Length, and belongs to a DMIDecode Type.

System Information (

...

SMBIOS Type

...

1)

TLV Key

Hex Code

Max Length (bytes)

BIOS path

TLV_CODE_FAMILY

0x20

20

20

-

TLV_CODE_MANUF_DATE

0x23

10

10

-

TLV_CODE_PLATFORM_NAME

0x24

20

20

-

TLV_CODE_MANUF_NAME

0x25

20

20

-

TLV_CODE_VENDOR_NAME

0x27

20

2020

-

TLV_CODE_SYS_NAME

0x30

20

Main → Detailed Configuration Information → Model

TLV_CODE_SYS_SKU

0x31

20

20

Main screen

TLV_CODE_SYS_SERIAL_NUMBER

0x32

24

24

Main screen

TLV_CODE_SYS_VERSION

0x33

5

5

-

NIO Information (

...

SMBIOS Type

...

2)

TLV Key

Hex Code

Max Length (bytes)

TLV_CODE_NIO_NAME

0x40

20

TLV_CODE_NIO_SERIAL_NUMBER

0x41

24

TLV_CODE_NIO_VERSION

0x42

5

Chassis Information (

...

SMBIOS Type

...

3)

TLV Key

Hex Code

Max Length (bytes)

TLV_CODE_CHS_SERIAL_NUMBER

0x50

24

TLV_CODE_CHS_VERSION

0x51

5

5

TLV Key

Max Length (bytes)

BIOS path

TLV_CODE_CONFIG_CODE

...

EEPROM Writing Process

...

Validate inputs: Ensure keys exist and values meet length constraints.

...

Format as TLV: Convert the data into TLV format with type, length, and value.

...

Append CRC Checksum: Ensure data integrity.

...

Clear EEPROM: Overwrite existing data with zeros before writing new content.

...

200

Main → Detailed Configuration Information → Configuration String

...

Anchor
TLV_ERROR_HANDLING_ANCH
TLV_ERROR_HANDLING_ANCH
Error Handling

If invalid input is provided, the script will:

  • Print an error message.

  • Exit without modifying EEPROM contents.

...

Possible Errors

Error Message

Cause

Error: Unknown key

Provided TLV key is not in the supported list.

Error: Value for key 'X' is too long

Input exceeds the maximum allowed length.

Error: MAC address must have 6 parts

Incorrect MAC format.

Error: I2C write error

I2C communication issue during EEPROM write.

Error: Total TLV data length exceeds EEPROM capacity

Data is too large for EEPROM storage

.

Dependencies

This script requires:

  • Python 3

  • smbus (I2C communication)

  • struct and binascii (binary manipulation)

To install missing dependencies:

Code Block
sudo apt install python3-smbus

Notes

...

The script assumes EEPROM has a 256-byte capacity.

...

Page size is 16 bytes (writes are done in chunks).

...

.

...