mirror of
https://github.com/Lekensteyn/ltunify.git
synced 2025-12-08 17:53:23 +00:00
Initial commit of RE/debug programs/notes
This commit is contained in:
132
usbmon.awk
Executable file
132
usbmon.awk
Executable file
@@ -0,0 +1,132 @@
|
||||
#!/usr/bin/gawk -f
|
||||
# Formats the output of usbmon, assuming Logitech Unifying Receiver protocol
|
||||
# Usage: sudo cat /sys/kernel/debug/usb/usbmon/5u | usbmon.awk
|
||||
# (on older gawk versions, use gawk --re-interval -f usbmon.awk)
|
||||
#
|
||||
# Author: Peter Wu <lekensteyn@gmail.com>
|
||||
# Date: 2013-04-04
|
||||
|
||||
BEGIN {
|
||||
OFS=" ";
|
||||
# Taken from Linux source, drivers/hid/hid-logitech-dj.h
|
||||
# Catgegories are taken from patent description of US8386651
|
||||
# 0x00 - 0x3F HID reports
|
||||
types["01"] = "KEYBOARD";
|
||||
types["02"] = "MOUSE";
|
||||
types["03"] = "CONSUMER_CONTROL";
|
||||
types["04"] = "SYSTEM_CONTROL";
|
||||
|
||||
types["08"] = "MEDIA_CENTER";
|
||||
|
||||
types["0E"] = "LEDS";
|
||||
|
||||
# 0x40 - 0x7F enumerator notifications
|
||||
types["40"] = "NOTIF_DEVICE_UNPAIRED";
|
||||
types["41"] = "NOTIF_DEVICE_PAIRED";
|
||||
types["42"] = "NOTIF_CONNECTION_STATUS";
|
||||
types["4A"] = "NOTIF_RECV_LOCK_CHANGED"; # 0100 0000 = ready for connections, 0010 0000 = new connections disabled
|
||||
types["4B"] = "?NOTIF_PAIR_ACCEPTED"; # 0100 0000
|
||||
|
||||
types["7F"] = "NOTIF_ERROR";
|
||||
|
||||
# 0x80 - 0xFF enumerator commands; Register Access
|
||||
types["80"] = "SET_REG"; # CMD_SWITCH
|
||||
types["81"] = "GET_REG"; # CMD_GET_PAIRED_DEVICES
|
||||
types["82"] = "SET_LONG_REG";
|
||||
types["83"] = "GET_LONG_REG";
|
||||
types["8F"] = "_ERROR_MSG";
|
||||
# Align type name
|
||||
maxlen=0;
|
||||
for (i in types) {
|
||||
if (maxlen < length(types[i])) {
|
||||
maxlen = length(types[i]);
|
||||
}
|
||||
}
|
||||
|
||||
# error messages for type=8F (ERROR_MSG)
|
||||
errmsgs["01"] = "SUCCESS";
|
||||
errmsgs["02"] = "INVALID_SUBID";
|
||||
errmsgs["03"] = "INVALID_ADDRESS";
|
||||
errmsgs["04"] = "INVALID_VALUE";
|
||||
errmsgs["05"] = "CONNECT_FAIL";
|
||||
errmsgs["06"] = "TOO_MANY_DEVICES";
|
||||
errmsgs["07"] = "ALREADY_EXISTS";
|
||||
errmsgs["08"] = "BUSY";
|
||||
errmsgs["09"] = "UNKNOWN_DEVICE";
|
||||
errmsgs["0a"] = "RESOURCE_ERROR";
|
||||
errmsgs["0b"] = "REQUEST_UNAVAILABLE";
|
||||
errmsgs["0c"] = "INVALID_PARAM_VALUE";
|
||||
errmsgs["0d"] = "WRONG_PIN_CODE";
|
||||
|
||||
regs["00"] = "ENABLED_NOTIFS";
|
||||
regs["02"] = "CONNECTION_STATE";
|
||||
regs["b2"] = "DEVICE_PAIRING";
|
||||
regs["b3"] = "DEVICE_ACTIVITY";
|
||||
regs["b5"] = "PAIRING_INFO";
|
||||
} # end of BEGIN
|
||||
function colorize(col, s) {
|
||||
return "\033[" col "m" s "\033[m";
|
||||
}
|
||||
# global color
|
||||
function c(s) {
|
||||
return colorize(color, s);
|
||||
}
|
||||
function endPoint(ep) {
|
||||
if (ep == "0") return "output";
|
||||
if (ep == "1") return " input";
|
||||
if (ep == "2") return colorize("1;33", "enumIf");
|
||||
# if (ep == "3") return " ???"; # seen in the output of usbmon
|
||||
return sprintf("%6s", "ep" ep);
|
||||
}
|
||||
function dev(hex) {
|
||||
if (hex == "ff") {
|
||||
return "RECV";
|
||||
}
|
||||
if (int(hex) >= 1 && int(hex) <= 6) {
|
||||
return "DEV" int(hex)
|
||||
}
|
||||
return " ";
|
||||
}
|
||||
function typeStr(hex) {
|
||||
return sprintf("%-" maxlen "s", types[toupper(hex)]);
|
||||
}
|
||||
function payload(type, p) {
|
||||
v1 = substr(p, 1, 2);
|
||||
if (type == "8f") { # error
|
||||
er=substr(p, 5, 2);
|
||||
reg=substr(p, 3, 2);
|
||||
parms = "SubID=" v1
|
||||
parms = parms ", Reg=" c(reg) " " regs[reg];
|
||||
parms = parms ", er=" c(er);
|
||||
parms = parms " " errmsgs[er];
|
||||
} else if (type == "80" || type == "81" || type == "82" || type == "83") {
|
||||
parms = "reg=" c(v1) " " regs[v1];
|
||||
parms = parms " parms=" c(substr(p, 3));
|
||||
} else {
|
||||
parms = "parms=" c(p);
|
||||
}
|
||||
return parms;
|
||||
}
|
||||
|
||||
{
|
||||
if (match($0, /.*?:[0-9]+:[0-9]{3,}:([0-9]+) .*? = (..)(..)(..)(..) (.*)/, a)) {
|
||||
# length 85 is ok for most, but not when starting logitech program
|
||||
if (length($0) > 100) {
|
||||
print $0;
|
||||
$0 = "";
|
||||
}
|
||||
printf("%-100s", $0);
|
||||
color = "1;32";
|
||||
# sending data instead of receiving data
|
||||
if ($0 ~ " s ") color = "1;31";
|
||||
|
||||
print " " endPoint(a[1]),
|
||||
"report_id=" c(a[2]),
|
||||
"dev_idx=" c(a[3]) " " dev(a[3]),
|
||||
"type=" c(a[4]) " " typeStr(a[4]),
|
||||
payload(a[4], a[5] a[6]);
|
||||
} else {
|
||||
print colorize("1;30", $0);
|
||||
}
|
||||
fflush();
|
||||
}
|
||||
Reference in New Issue
Block a user