Skip to content

Instantly share code, notes, and snippets.

@mrnuke
Created May 28, 2022 01:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mrnuke/bd0f175bf83da2b44cd2bb4a41254443 to your computer and use it in GitHub Desktop.
Save mrnuke/bd0f175bf83da2b44cd2bb4a41254443 to your computer and use it in GitHub Desktop.
import sys
DUMP_FILE="poe-init.moser"
packet_def = {
0x00 : {
"name" : "set port enable",
"fields" : [
("port", 1),
("enable", 1),
]
},
0x02 : {
"name" : "set port map enable",
"fields" : [
("enable", 1),
]
},
0x06 : {
"name" : "set global port enable",
"fields" : [
("enable", 1),
]
},
0x09 : { "name" : "system reset", "fields" : [] },
0x0b : {
"name" : "set device power management",
"fields" : [
("pre-alloc", 1),
("powerup_mode", 1),
("disconnect_order", 1),
("gb_hysteresis", 1),
]
},
0x11 : {
"name" : "set classification enable",
"fields" : [
("port", 1),
("classification", 1),
]
},
0x13 : {
"name" : "set disconnect type",
"fields" : [
("port", 1),
("disconnect", 1),
]
},
0x15 : {
"name" : "set power limit type",
"fields" : [
("port", 1),
("limit_type", 1),
]
},
0x16 : {
"name" : "set power power budget",
"fields" : [
("port", 1),
("power_limit", 1),
]
},
0x17 : {
"name" : "set power management mode",
"fields" : [
("mode", 1),
]
},
0x18 : {
"name" : "set global power budget",
"fields" : [
("pse_ctrl", 1),
("total_power", 2),
("guard_band", 2),
]
},
0x1a : {
"name" : "set port priority",
"fields" : [
("port", 1),
("priority", 1),
]
},
0x1c : {
"name" : "set port power-up mode",
"fields" : [
("port", 1),
("mode", 1),
]
},
0x1d : {
"name" : "set port mapping",
"fields" : [
("port", 1),
("mode", 1),
]
},
0x20 : {
"name" : "set global power budget",
"fields" : [
("mode", 1),
("max_ports", 1),
("port_map", 1),
("id", 2),
("version", 1),
("mcu_type", 1),
("system_status", 1),
("version_ext", 1),
]
},
0x20 : {
"name" : "get system info",
"fields" : [
("mode", 1),
("max_ports", 1),
("port_map", 1),
("id", 2),
("version", 1),
("mcu_type", 1),
("system_status", 1),
("version_ext", 1),
]
},
0x23 : {
"name" : "get power statistics",
"fields" : [
("consumed", 2),
("budget", 2),
("b3", 1),
("high_power", 1),
("gb_hysteresis", 1),
]
},
0x2548 : {
"name" : "get all port status",
"fields" : [
("port", 1),
("status", 2),
]
}
}
def decode_packet(pkt):
pkt_type = pkt[0]
csum = sum(pkt[0:11]) & 0Xff
if csum != pkt[11]:
print(f'{pkt.hex(sep=" ")} Checksum error={hex(csum)} != {hex(pkt[11])}')
return
pdef = packet_def.get(pkt[0])
if not pdef:
print(f'**** Unexplained {pkt.hex(sep=" ")} ****')
return
offset = 2
descr = ""
for name, size in pdef["fields"]:
value = 0
for orf in range(offset, offset + size):
value = value << 8 | pkt[orf]
descr += f' {name}={hex(value)}'
offset += size
#print(f' explained {pkt.hex(sep=" ")}')
print (f'[{hex(pkt[0])}]{pdef["name"]}:{descr}')
def main():
if len(sys.argv) > 1:
DUMP_FILE = sys.argv[1]
with open(DUMP_FILE, 'rb') as f:
while (packet := f.read(12)):
decode_packet(packet)
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment