From a56e2a419b7278804f2b4400f772fa8c0903f1b7 Mon Sep 17 00:00:00 2001 From: HL Yi Date: Mon, 22 Jun 2026 18:02:34 -0500 Subject: [PATCH] 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 --- tools/led_gpio_utils/dec_leds_from_dump.py | 152 ++++++++++++--------- tools/led_gpio_utils/i2c_dump_rtl_regs.py | 47 +++---- tools/led_gpio_utils/i2c_read_rtl_gpio.py | 57 +++++--- 3 files changed, 146 insertions(+), 110 deletions(-) diff --git a/tools/led_gpio_utils/dec_leds_from_dump.py b/tools/led_gpio_utils/dec_leds_from_dump.py index 7cd7a38..5885068 100755 --- a/tools/led_gpio_utils/dec_leds_from_dump.py +++ b/tools/led_gpio_utils/dec_leds_from_dump.py @@ -1,66 +1,84 @@ #!/usr/bin/env python3 -import os -import sys - - regs = list(range(65536)) glb_mux = 0x65E0 -led3_0_set1 = 0x6528 -led1_0_set0 = 0x6548 -led_port_sel = 0x654c +led3_0_set1 = 0x6528 +led1_0_set0 = 0x6548 +led_port_sel = 0x654C + def get_word(i): - val = (regs[i+3] <<24) + (regs[i+2]<<16) + (regs[i+1]<<8) + regs[i] -# print(f"READING {i:04x} : {val:08x}") - return val + val = (regs[i + 3] << 24) + (regs[i + 2] << 16) + (regs[i + 1] << 8) + regs[i] + # print(f"READING {i:04x} : {val:08x}") + return val -with open ('reg_dump.txt', 'r') as file: - for line in file: - (addr, data) = line.split(":") - data = [ int(x, 16) for x in data.strip().split(" ") ] - addr = int(addr, 16) - for x in range(len(data)): - regs[addr + x] = data[x] + +with open("reg_dump.txt", "r") as file: + for line in file: + addr, data = line.split(":") + data = [int(x, 16) for x in data.strip().split(" ")] + addr = int(addr, 16) + for x in range(len(data)): + regs[addr + x] = data[x] ledstr = [] ledfmt = [] print("LED pad Configuration:") for i in range(28): - j = i % 5 - if j == 0: - idx = glb_mux + (i//5)*4 - val = get_word(idx) - ledval = (val>>(6*j)) &0x3f - ledstr.append(f"{ledval:02x}") - ledfmt.append(f"{i:02x}") + j = i % 5 + if j == 0: + idx = glb_mux + (i // 5) * 4 + val = get_word(idx) + ledval = (val >> (6 * j)) & 0x3F + ledstr.append(f"{ledval:02x}") + ledfmt.append(f"{i:02x}") print(f"{' '.join(ledfmt)}") print(f"{' '.join(ledstr)}") print(f".led_mux = {{ 0x{', 0x'.join(ledstr)} }},") LED_TYPES = [ - " 10G", 16, - " TWO_5G", 17, - " 5G", 18, - " TWO_2G5", 19, - " 2G5", 0, - " TWO_1G", 1, - " 1G", 2, - " 500M", 3, - " 100M", 4, - " 10M", 5, - " LINK", 6, - " LINK_FLASH", 7, - " ACT", 8, - " RX", 9, - " TX", 10, - " COL", 11, - " DUPLEX", 12, - " TRAINING", 13, - " MASTER", 14, - "", 15, + " 10G", + 16, + " TWO_5G", + 17, + " 5G", + 18, + " TWO_2G5", + 19, + " 2G5", + 0, + " TWO_1G", + 1, + " 1G", + 2, + " 500M", + 3, + " 100M", + 4, + " 10M", + 5, + " LINK", + 6, + " LINK_FLASH", + 7, + " ACT", + 8, + " RX", + 9, + " TX", + 10, + " COL", + 11, + " DUPLEX", + 12, + " TRAINING", + 13, + " MASTER", + 14, + "", + 15, ] led_set = [] @@ -68,26 +86,30 @@ led_set_str = [] print("\nLED-set Configuration:") print("LED-ID 0 1 2 3") for i in range(4): - idval = [] - idvalstr = [] - for id in range(4): - val = 0xffff & ( get_word(led1_0_set0 - 8*i - ((id>>1)<<2)) >> (16*(id&1)) ) - valhi = ( 0xf & ( get_word(led3_0_set1 - 4*(i>>1)) >> (16*(i&1) + 4*id)) ) << 16 - val += valhi - idval.append(val) - valstr = "(" - for bit in range(0,len(LED_TYPES),2): - if val & (1<<(LED_TYPES[bit+1])): - valstr += LED_TYPES[bit] - valstr += ")" - idvalstr.append(valstr) - 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}") + idval = [] + idvalstr = [] + for id in range(4): + val = 0xFFFF & ( + get_word(led1_0_set0 - 8 * i - ((id >> 1) << 2)) >> (16 * (id & 1)) + ) + valhi = ( + 0xF & (get_word(led3_0_set1 - 4 * (i >> 1)) >> (16 * (i & 1) + 4 * id)) + ) << 16 + val += valhi + idval.append(val) + valstr = "(" + for bit in range(0, len(LED_TYPES), 2): + if val & (1 << (LED_TYPES[bit + 1])): + valstr += LED_TYPES[bit] + valstr += ")" + idvalstr.append(valstr) + 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) -for i in range(3,9): - sel = (portsel>>(i<<1)) & 3 - print(f"Port {i}: SET {sel}: {', '.join(led_set_str[sel])}") +for i in range(3, 9): + sel = (portsel >> (i << 1)) & 3 + print(f"Port {i}: SET {sel}: {', '.join(led_set_str[sel])}") diff --git a/tools/led_gpio_utils/i2c_dump_rtl_regs.py b/tools/led_gpio_utils/i2c_dump_rtl_regs.py index de69a55..e90ac00 100755 --- a/tools/led_gpio_utils/i2c_dump_rtl_regs.py +++ b/tools/led_gpio_utils/i2c_dump_rtl_regs.py @@ -1,37 +1,38 @@ #!/usr/bin/env python3 -import time import argparse from smbus2 import SMBus, i2c_msg # Configuration -DEFAULT_I2C_BUS = 1 DEVICE_ADDR = 0x5C # Replace with your device address -NUM_BYTES = 16 # Bytes to read +NUM_BYTES = 16 # Bytes to read # Parse command line arguments -parser = argparse.ArgumentParser(description='Dump RTL registers via I2C') -parser.add_argument('-b', '--bus', type=int, default=DEFAULT_I2C_BUS, - help='I2C bus number (default: {})'.format(DEFAULT_I2C_BUS)) +parser = argparse.ArgumentParser(description="Dump RTL registers via I2C") +parser.add_argument( + "-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() -I2C_BUS = args.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): - # Create write message (send register address) - 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) + for addr in range(0, 65536, NUM_BYTES): + # Create write message (send register address) + write = i2c_msg.write(DEVICE_ADDR, [addr >> 8, addr & 0xFF]) - # Convert read message to string - datastr = " ".join([ f"{x:02x}" for x in new_data]) - print(f"{addr:04x}: {datastr}") \ No newline at end of file + # 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 + datastr = " ".join([f"{x:02x}" for x in new_data]) + print(f"{addr:04x}: {datastr}") diff --git a/tools/led_gpio_utils/i2c_read_rtl_gpio.py b/tools/led_gpio_utils/i2c_read_rtl_gpio.py index e6e0094..12612ed 100755 --- a/tools/led_gpio_utils/i2c_read_rtl_gpio.py +++ b/tools/led_gpio_utils/i2c_read_rtl_gpio.py @@ -1,14 +1,13 @@ #!/usr/bin/env python3 import time -import sys import argparse from smbus2 import SMBus, i2c_msg # Configuration I2C_BUS = 1 DEVICE_ADDR = 0x5C # Replace with your device address -NUM_BYTES = 8 # Bytes to read +NUM_BYTES = 8 # Bytes to read SLEEP_INTERVAL = 1 # 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] # Setup argument parser -parser = argparse.ArgumentParser(description='Read I2C data from RTL GPIO expander') -parser.add_argument('--i2c-bus', '-b', type=int, default=1, - help='I2C bus number (default: 1)') -parser.add_argument('--sleep-interval', '-s', type=int, default=2, - help='Sleep interval in seconds (default: 2)') -parser.add_argument('--ignored-ios', '-i', nargs='*', type=int, default=[28, 31, 32, 34, 35, 42, 43, 44, 45], - help='List of GPIO pins to ignore (default: [28, 31, 32, 34, 35, 42, 43, 44, 45])') +parser = argparse.ArgumentParser(description="Read I2C data from RTL GPIO expander") +parser.add_argument( + "-b", + "--i2c-bus", + type=int, + required=True, + 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() I2C_BUS = args.i2c_bus -SLEEP_INTERVAL = args.sleep_interval -IGNORED_IOS = args.ignored_ios first_read = True -last_data = [ 0 for x in range(NUM_BYTES) ] +last_data = [0 for x in range(NUM_BYTES)] # Open I2C bus with SMBus(I2C_BUS) as bus: @@ -37,14 +50,14 @@ with SMBus(I2C_BUS) as bus: while True: # 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) read = i2c_msg.read(DEVICE_ADDR, NUM_BYTES) - + # Perform combined transaction bus.i2c_rdwr(write, read) - + new_data = list(read) if first_read: delta_data = last_data @@ -52,19 +65,19 @@ with SMBus(I2C_BUS) as bus: else: delta_data = [new_data[x] ^ last_data[x] for x in range(NUM_BYTES)] last_data = new_data - + # 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 = "" chg_list = [] for x in range(NUM_BYTES): if delta_data[x] == 0: continue for y in range(8): - if delta_data[x] & ( 1<