sleep-interval default value is reduced to 1.

i2c-bus is required argument
replace --bus with --i2c-bus for i2c_dump_rtl_regs.py for better consistency
format lint clean up
This commit is contained in:
HL Yi
2026-06-22 18:02:34 -05:00
parent 4b770a8abc
commit a56e2a419b
3 changed files with 146 additions and 110 deletions
+87 -65
View File
@@ -1,66 +1,84 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import os
import sys
regs = list(range(65536)) regs = list(range(65536))
glb_mux = 0x65E0 glb_mux = 0x65E0
led3_0_set1 = 0x6528 led3_0_set1 = 0x6528
led1_0_set0 = 0x6548 led1_0_set0 = 0x6548
led_port_sel = 0x654c led_port_sel = 0x654C
def get_word(i): def get_word(i):
val = (regs[i+3] <<24) + (regs[i+2]<<16) + (regs[i+1]<<8) + regs[i] val = (regs[i + 3] << 24) + (regs[i + 2] << 16) + (regs[i + 1] << 8) + regs[i]
# print(f"READING {i:04x} : {val:08x}") # print(f"READING {i:04x} : {val:08x}")
return val return val
with open ('reg_dump.txt', 'r') as file:
for line in file: with open("reg_dump.txt", "r") as file:
(addr, data) = line.split(":") for line in file:
data = [ int(x, 16) for x in data.strip().split(" ") ] addr, data = line.split(":")
addr = int(addr, 16) data = [int(x, 16) for x in data.strip().split(" ")]
for x in range(len(data)): addr = int(addr, 16)
regs[addr + x] = data[x] for x in range(len(data)):
regs[addr + x] = data[x]
ledstr = [] ledstr = []
ledfmt = [] ledfmt = []
print("LED pad Configuration:") print("LED pad Configuration:")
for i in range(28): for i in range(28):
j = i % 5 j = i % 5
if j == 0: if j == 0:
idx = glb_mux + (i//5)*4 idx = glb_mux + (i // 5) * 4
val = get_word(idx) val = get_word(idx)
ledval = (val>>(6*j)) &0x3f ledval = (val >> (6 * j)) & 0x3F
ledstr.append(f"{ledval:02x}") ledstr.append(f"{ledval:02x}")
ledfmt.append(f"{i:02x}") ledfmt.append(f"{i:02x}")
print(f"{' '.join(ledfmt)}") print(f"{' '.join(ledfmt)}")
print(f"{' '.join(ledstr)}") print(f"{' '.join(ledstr)}")
print(f".led_mux = {{ 0x{', 0x'.join(ledstr)} }},") print(f".led_mux = {{ 0x{', 0x'.join(ledstr)} }},")
LED_TYPES = [ LED_TYPES = [
" 10G", 16, " 10G",
" TWO_5G", 17, 16,
" 5G", 18, " TWO_5G",
" TWO_2G5", 19, 17,
" 2G5", 0, " 5G",
" TWO_1G", 1, 18,
" 1G", 2, " TWO_2G5",
" 500M", 3, 19,
" 100M", 4, " 2G5",
" 10M", 5, 0,
" LINK", 6, " TWO_1G",
" LINK_FLASH", 7, 1,
" ACT", 8, " 1G",
" RX", 9, 2,
" TX", 10, " 500M",
" COL", 11, 3,
" DUPLEX", 12, " 100M",
" TRAINING", 13, 4,
" MASTER", 14, " 10M",
"", 15, 5,
" LINK",
6,
" LINK_FLASH",
7,
" ACT",
8,
" RX",
9,
" TX",
10,
" COL",
11,
" DUPLEX",
12,
" TRAINING",
13,
" MASTER",
14,
"",
15,
] ]
led_set = [] led_set = []
@@ -68,26 +86,30 @@ led_set_str = []
print("\nLED-set Configuration:") print("\nLED-set Configuration:")
print("LED-ID 0 1 2 3") print("LED-ID 0 1 2 3")
for i in range(4): for i in range(4):
idval = [] idval = []
idvalstr = [] idvalstr = []
for id in range(4): for id in range(4):
val = 0xffff & ( get_word(led1_0_set0 - 8*i - ((id>>1)<<2)) >> (16*(id&1)) ) val = 0xFFFF & (
valhi = ( 0xf & ( get_word(led3_0_set1 - 4*(i>>1)) >> (16*(i&1) + 4*id)) ) << 16 get_word(led1_0_set0 - 8 * i - ((id >> 1) << 2)) >> (16 * (id & 1))
val += valhi )
idval.append(val) valhi = (
valstr = "(" 0xF & (get_word(led3_0_set1 - 4 * (i >> 1)) >> (16 * (i & 1) + 4 * id))
for bit in range(0,len(LED_TYPES),2): ) << 16
if val & (1<<(LED_TYPES[bit+1])): val += valhi
valstr += LED_TYPES[bit] idval.append(val)
valstr += ")" valstr = "("
idvalstr.append(valstr) for bit in range(0, len(LED_TYPES), 2):
led_set.append(idval) if val & (1 << (LED_TYPES[bit + 1])):
led_set_str.append(idvalstr) valstr += LED_TYPES[bit]
idstr = ' '.join([f"{d:05x}" for d in idval]) valstr += ")"
print(f"SET {i}: {idstr}") idvalstr.append(valstr)
# print(f"{idvalstr}") led_set.append(idval)
led_set_str.append(idvalstr)
idstr = " ".join([f"{d:05x}" for d in idval])
print(f"SET {i}: {idstr}")
# print(f"{idvalstr}")
portsel = get_word(led_port_sel) portsel = get_word(led_port_sel)
for i in range(3,9): for i in range(3, 9):
sel = (portsel>>(i<<1)) & 3 sel = (portsel >> (i << 1)) & 3
print(f"Port {i}: SET {sel}: {', '.join(led_set_str[sel])}") print(f"Port {i}: SET {sel}: {', '.join(led_set_str[sel])}")
+24 -23
View File
@@ -1,37 +1,38 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import time
import argparse import argparse
from smbus2 import SMBus, i2c_msg from smbus2 import SMBus, i2c_msg
# Configuration # Configuration
DEFAULT_I2C_BUS = 1
DEVICE_ADDR = 0x5C # Replace with your device address DEVICE_ADDR = 0x5C # Replace with your device address
NUM_BYTES = 16 # Bytes to read NUM_BYTES = 16 # Bytes to read
# Parse command line arguments # Parse command line arguments
parser = argparse.ArgumentParser(description='Dump RTL registers via I2C') parser = argparse.ArgumentParser(description="Dump RTL registers via I2C")
parser.add_argument('-b', '--bus', type=int, default=DEFAULT_I2C_BUS, parser.add_argument(
help='I2C bus number (default: {})'.format(DEFAULT_I2C_BUS)) "-b",
"--i2c-bus",
type=int,
required=True,
help="I2C bus number (use i2cdetect -l to find out the bus number of the dongle)",
)
args = parser.parse_args() args = parser.parse_args()
I2C_BUS = args.bus
# Open I2C bus # Open I2C bus
with SMBus(I2C_BUS) as bus: with SMBus(args.i2c_bus) as bus:
for addr in range (0, 65536, NUM_BYTES): for addr in range(0, 65536, NUM_BYTES):
# Create write message (send register address) # Create write message (send register address)
write = i2c_msg.write(DEVICE_ADDR, [addr>>8, addr & 0xff]) write = i2c_msg.write(DEVICE_ADDR, [addr >> 8, addr & 0xFF])
# Create read message (read 2 bytes)
read = i2c_msg.read(DEVICE_ADDR, NUM_BYTES)
# Perform combined transaction
bus.i2c_rdwr(write, read)
new_data = list(read)
# Convert read message to string # Create read message (read 2 bytes)
datastr = " ".join([ f"{x:02x}" for x in new_data]) read = i2c_msg.read(DEVICE_ADDR, NUM_BYTES)
print(f"{addr:04x}: {datastr}")
# Perform combined transaction
bus.i2c_rdwr(write, read)
new_data = list(read)
# Convert read message to string
datastr = " ".join([f"{x:02x}" for x in new_data])
print(f"{addr:04x}: {datastr}")
+35 -22
View File
@@ -1,14 +1,13 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import time import time
import sys
import argparse import argparse
from smbus2 import SMBus, i2c_msg from smbus2 import SMBus, i2c_msg
# Configuration # Configuration
I2C_BUS = 1 I2C_BUS = 1
DEVICE_ADDR = 0x5C # Replace with your device address DEVICE_ADDR = 0x5C # Replace with your device address
NUM_BYTES = 8 # Bytes to read NUM_BYTES = 8 # Bytes to read
SLEEP_INTERVAL = 1 SLEEP_INTERVAL = 1
# Handle command line arguments for ignored IOs # Handle command line arguments for ignored IOs
@@ -16,20 +15,34 @@ SLEEP_INTERVAL = 1
IGNORED_IOS = [28, 31, 32, 34, 35, 42, 43, 44, 45] IGNORED_IOS = [28, 31, 32, 34, 35, 42, 43, 44, 45]
# Setup argument parser # Setup argument parser
parser = argparse.ArgumentParser(description='Read I2C data from RTL GPIO expander') parser = argparse.ArgumentParser(description="Read I2C data from RTL GPIO expander")
parser.add_argument('--i2c-bus', '-b', type=int, default=1, parser.add_argument(
help='I2C bus number (default: 1)') "-b",
parser.add_argument('--sleep-interval', '-s', type=int, default=2, "--i2c-bus",
help='Sleep interval in seconds (default: 2)') type=int,
parser.add_argument('--ignored-ios', '-i', nargs='*', type=int, default=[28, 31, 32, 34, 35, 42, 43, 44, 45], required=True,
help='List of GPIO pins to ignore (default: [28, 31, 32, 34, 35, 42, 43, 44, 45])') help="I2C bus number (use i2cdetect -l to find out the bus number of the dongle)",
)
parser.add_argument(
"-s",
"--sleep-interval",
type=int,
default=SLEEP_INTERVAL,
help=f"Sleep interval in seconds (default: {SLEEP_INTERVAL})",
)
parser.add_argument(
"-i",
"--ignored-ios",
nargs="*",
type=int,
default=IGNORED_IOS,
help=f"List of GPIO pins to ignore (default: {IGNORED_IOS})",
)
args = parser.parse_args() args = parser.parse_args()
I2C_BUS = args.i2c_bus I2C_BUS = args.i2c_bus
SLEEP_INTERVAL = args.sleep_interval
IGNORED_IOS = args.ignored_ios
first_read = True first_read = True
last_data = [ 0 for x in range(NUM_BYTES) ] last_data = [0 for x in range(NUM_BYTES)]
# Open I2C bus # Open I2C bus
with SMBus(I2C_BUS) as bus: with SMBus(I2C_BUS) as bus:
@@ -37,14 +50,14 @@ with SMBus(I2C_BUS) as bus:
while True: while True:
# Create write message (send register address) # Create write message (send register address)
write = i2c_msg.write(DEVICE_ADDR, [addr>>8, addr & 0xff]) write = i2c_msg.write(DEVICE_ADDR, [addr >> 8, addr & 0xFF])
# Create read message (read NUM_BYTES bytes) # Create read message (read NUM_BYTES bytes)
read = i2c_msg.read(DEVICE_ADDR, NUM_BYTES) read = i2c_msg.read(DEVICE_ADDR, NUM_BYTES)
# Perform combined transaction # Perform combined transaction
bus.i2c_rdwr(write, read) bus.i2c_rdwr(write, read)
new_data = list(read) new_data = list(read)
if first_read: if first_read:
delta_data = last_data delta_data = last_data
@@ -52,19 +65,19 @@ with SMBus(I2C_BUS) as bus:
else: else:
delta_data = [new_data[x] ^ last_data[x] for x in range(NUM_BYTES)] delta_data = [new_data[x] ^ last_data[x] for x in range(NUM_BYTES)]
last_data = new_data last_data = new_data
# Convert read message to list # Convert read message to list
datastr = " ".join([ f"{x:02x}" for x in new_data]) datastr = " ".join([f"{x:02x}" for x in new_data])
deltastr = "" deltastr = ""
chg_list = [] chg_list = []
for x in range(NUM_BYTES): for x in range(NUM_BYTES):
if delta_data[x] == 0: if delta_data[x] == 0:
continue continue
for y in range(8): for y in range(8):
if delta_data[x] & ( 1<<y): if delta_data[x] & (1 << y):
idx = x*8 + y idx = x * 8 + y
if idx not in IGNORED_IOS: if idx not in args.ignored_ios:
deltastr += f"\n{' ':8s}GPIO{idx}" deltastr += f"\n{' ':8s}GPIO{idx}"
# deltastr = " ".join([ f"{x:02x}" for x in delta_data]) # deltastr = " ".join([ f"{x:02x}" for x in delta_data])
print(f"{addr:04x}: {datastr}{deltastr}") print(f"{addr:04x}: {datastr}{deltastr}")
time.sleep(SLEEP_INTERVAL) time.sleep(args.sleep_interval)