Versions Compared

Key

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

...

Table of Contents

...

Overview

...

Usage

...

Supported Keys

...

Error Handling

...

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

...

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

...

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.

...

We want to run the following command (Note that bus 3 address 0X50 is used in this example):

Code Block
python3 TLV_writeTLVwriter.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 "101.2.302" \
      TLV_CODE_FAMILY "Industrial" \
      TLV_CODE_MANUF_NAME "TechCorpSolid-Run" \
      TLV_CODE_MANUF_DATE "2024-03-11" \
      TLV_CODE_PLATFORM_NAME "ARM CortexBedrock-A72IPC"

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 2E 30 32 2e 33 20 0a 49 6e 64 75 73 74 93?101.2.302?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

...

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., 2, 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 23

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 2 3 and address 0x50 should be used in the script.

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

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 (

...

SMBIOS 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 (

...

SMBIOS Type

...

3)

TLV Key

Max Length (bytes)

TLV_CODE_CHS_SERIAL_NUMBER

24

TLV_CODE_CHS_VERSION

5

This entry will only be displayed in BIOS main menu.

TLV Key

Max Length (bytes)

BIOS path

TLV_CODE_CONFIG_CODE

200

...

Main → Detailed Configuration Information → Configuration String

...

Anchor
TLV_ERROR_HANDLING_ANCH
TLV_ERROR_HANDLING_ANCH
Error Handling

...

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.

...

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.

The script also requires the following Python modules, which are typically built-in:

  • sys

  • struct

  • binascii

  • time

To verify that all required Python modules are available, run:

Code Block
python3 -c "import struct, binascii, sys, time; print('All built-in modules are available')"

...

.

...