Skip to content

Commit

Permalink
Package
Browse files Browse the repository at this point in the history
  • Loading branch information
JohnDMcMaster committed Feb 12, 2018
1 parent 213f709 commit 9f3a8d4
Show file tree
Hide file tree
Showing 2 changed files with 140 additions and 121 deletions.
2 changes: 1 addition & 1 deletion main.py → usbrply.py
Original file line number Diff line number Diff line change
Expand Up @@ -971,7 +971,7 @@ def processInterruptComplete(self, dat_cur):
add_bool_arg(parser, '--rel-pkt', default=False, help='Only count kept packets')
# http://sourceforge.net/p/libusb/mailman/message/25635949/
add_bool_arg(parser, '--remoteio', default=False, help='Warn on -EREMOTEIO resubmit (default: ignore)')
add_bool_arg(parser, '--setup', default=True, help='Emit initialization packets like CLEAR_FEATURE, SET_FEATURE')
add_bool_arg(parser, '--setup', default=False, help='Emit initialization packets like CLEAR_FEATURE, SET_FEATURE')

parser.add_argument('fin', help='File name in')
args = parser.parse_args()
Expand Down
259 changes: 139 additions & 120 deletions main_win.py → usbrplyw.py
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@ def usb_ctrlrequest(s):
)

if MODE == 'win':
print 'WARNING: experimental windows mode activated'
#print 'WARNING: experimental windows mode activated'
usb_urb_nt = usb_urb_win_nt
usb_urb_fmt = usb_urb_win_fmt
else:
Expand Down Expand Up @@ -523,6 +523,7 @@ def req2s(ctrl):
return reqs

# FX2 regs: http://www.keil.com/dd/docs/datashts/cypress/fx2_trm.pdf
# FX2LP regs: http://www.cypress.com/file/126446/download
def req_comment(ctrl, dat):
# Table 9-3. Standard Device Requests
reqs = req2s(ctrl)
Expand Down Expand Up @@ -664,128 +665,146 @@ def __init__(self):
self.errors = 0

def loop_cb(self, caplen, packet, ts):
self.g_cur_packet += 1
if self.g_cur_packet < g_min_packet or self.g_cur_packet > g_max_packet:
# print "# Skipping packet %d" % (self.g_cur_packet)
return
if args.verbose:
print
print
print
print 'PACKET %s' % (self.g_cur_packet,)

if caplen != len(packet):
print "packet %s: malformed, caplen %d != len %d", self.pktn_str(), caplen, len(packet)
return
if args.verbose:
print 'Len: %d' % len(packet)
hexdump(packet)
#print ts
print 'Pending: %d' % len(g_pending)

dbg("Length %u" % (len(packet),))
if len(packet) < usb_urb_sz:
msg = "Packet %s: size %d is not min size %d" % (self.pktn_str(), len(packet), usb_urb_sz)
self.errors += 1
if args.halt:
hexdump(packet)
raise ValueError(msg)
try:
self.g_cur_packet += 1
if self.g_cur_packet < g_min_packet or self.g_cur_packet > g_max_packet:
# print "# Skipping packet %d" % (self.g_cur_packet)
return
if args.verbose:
print msg
print
print
print
print 'PACKET %s' % (self.g_cur_packet,)

if caplen != len(packet):
print "packet %s: malformed, caplen %d != len %d", self.pktn_str(), caplen, len(packet)
return
if args.verbose:
print 'Len: %d' % len(packet)
hexdump(packet)
return

# caplen is actual length, len is reported
self.urb_raw = packet
self.urb = usb_urb(packet[0:usb_urb_sz])
dat_cur = packet[usb_urb_sz:]

printv('ID %s' % (urb_id_str(self.urb.id),))

# Main packet filtering
# Drop if not specified device
#print self.pktn_str(), self.urb.device, args.device
if args.device is not None and self.urb.device != args.device:
return

# FIXME: hack to only process control for now
if self.urb.transfer_type != URB_CONTROL:
return

# Drop status packets
if MODE == 'win' and self.urb.transfer_type == URB_CONTROL:
# Control transfer stage
# 1: data
# 2: status
# 'xfer_stage',
xfer_stage = ord(dat_cur[0])
#print 'xfer_stage: %d' % xfer_stage
if xfer_stage == XFER_STATUS:
printv('drop xfer_status')
#print ts
print 'Pending: %d' % len(g_pending)

dbg("Length %u" % (len(packet),))
if len(packet) < usb_urb_sz:
msg = "Packet %s: size %d is not min size %d" % (self.pktn_str(), len(packet), usb_urb_sz)
self.errors += 1
if args.halt:
hexdump(packet)
raise ValueError(msg)
if args.verbose:
print msg
hexdump(packet)
return

# Drop if generic device management traffic
if not args.setup and self.urb.transfer_type == URB_CONTROL:
if MODE == 'win':
# Skip xfer_stage
ctrl = usb_ctrlrequest(dat_cur[1:])
else:
ctrl = usb_ctrlrequest(self.urb.ctrlrequest[0:usb_ctrlrequest_sz])
reqst = req2s(ctrl)
if reqst in setup_reqs or reqst == "GET_STATUS" and self.urb.type == URB_SUBMIT:
g_pending[self.urb.id] = None
self.submit = None
self.urb = None

# caplen is actual length, len is reported
self.urb_raw = packet
self.urb = usb_urb(packet[0:usb_urb_sz])
dat_cur = packet[usb_urb_sz:]

printv('ID %s' % (urb_id_str(self.urb.id),))

# Main packet filtering
# Drop if not specified device
#print self.pktn_str(), self.urb.device, args.device
if args.device is not None and self.urb.device != args.device:
return
self.rel_pkt += 1

#if args.verbose:
# print "Header size: %lu" % (usb_urb_sz,)
# print_urb(urb)

if urb_error(self.urb):
self.erros + 1
if args.halt:
print "oh noes!"
sys.exit(1)

if is_urb_complete(self.urb):
if args.verbose:
print 'Pending (%d):' % (len(g_pending),)
for k in g_pending:
print ' %s' % (urb_id_str(k),)
# for some reason usbmon will occasionally give packets out of order
if not self.urb.id in g_pending:
#raise Exception("Packet %s missing submit. URB ID: 0x%016lX" % (self.pktn_str(), self.urb.id))
comment("WARNING: Packet %s missing submit. URB ID: 0x%016lX" % (self.pktn_str(), self.urb.id))
self.pending_complete[self.urb.id] = (self.urb, dat_cur)
else:
self.process_complete(dat_cur)

elif is_urb_submit(self.urb):
# Find the matching submit request
if self.urb.transfer_type == URB_CONTROL:
self.processControlSubmit(dat_cur)
elif self.urb.transfer_type == URB_BULK:
self.processBulkSubmit(dat_cur)
elif self.urb.transfer_type == URB_INTERRUPT:
pending = PendingRX()
pending.raw = self.urb_raw
pending.m_urb = self.urb
pending.packet_number = self.pktn_str()
g_pending[self.urb.id] = pending
printv('Added pending bulk URB %s' % self.urb.id)

# FIXME: hack to only process control for now
if self.urb.transfer_type != URB_CONTROL:
comment('WARNING: packet %s: drop packet type %s' % (self.pktn_str(), transfer2str[self.urb.transfer_type]))
return

# Drop status packets
if MODE == 'win' and self.urb.transfer_type == URB_CONTROL:
# Control transfer stage
# 1: data
# 2: status
# 'xfer_stage',
xfer_stage = ord(dat_cur[0])
#print 'xfer_stage: %d' % xfer_stage
if xfer_stage == XFER_STATUS:
printv('drop xfer_status')
return

# Drop if generic device management traffic
if not args.setup and self.urb.transfer_type == URB_CONTROL:
def skip():
if MODE == 'win':
# FIXME: broken
# Doesn't seem to be hurting downstream tools, don't worry about for now
return False

# Was the submit marked for ignore?
# For some reason these don't have status packets
if self.urb.id in g_pending and g_pending[self.urb.id] is None:
return True
# Submit then
# Skip xfer_stage
ctrl = usb_ctrlrequest(dat_cur[1:])
else:
ctrl = usb_ctrlrequest(self.urb.ctrlrequest[0:usb_ctrlrequest_sz])
reqst = req2s(ctrl)
return reqst in setup_reqs or reqst == "GET_STATUS" and self.urb.type == URB_SUBMIT

if skip():
print 'Drop setup packet %s' % self.pktn_str()
g_pending[self.urb.id] = None
self.submit = None
self.urb = None
return
self.rel_pkt += 1

if MODE == 'lin' and self.urb.id in self.pending_complete:
# oh snap solved a temporal anomaly
urb_submit = self.urb
(urb_complete, dat_cur) = self.pending_complete[self.urb.id]
del self.pending_complete[self.urb.id]
self.urb = urb_complete
self.process_complete(dat_cur)
#if args.verbose:
# print "Header size: %lu" % (usb_urb_sz,)
# print_urb(urb)

if urb_error(self.urb):
self.erros + 1
if args.halt:
print "oh noes!"
sys.exit(1)

if is_urb_complete(self.urb):
if args.verbose:
print 'Pending (%d):' % (len(g_pending),)
for k in g_pending:
print ' %s' % (urb_id_str(k),)
# for some reason usbmon will occasionally give packets out of order
if not self.urb.id in g_pending:
#raise Exception("Packet %s missing submit. URB ID: 0x%016lX" % (self.pktn_str(), self.urb.id))
comment("WARNING: Packet %s missing submit. URB ID: 0x%016lX" % (self.pktn_str(), self.urb.id))
self.pending_complete[self.urb.id] = (self.urb, dat_cur)
else:
self.process_complete(dat_cur)

elif is_urb_submit(self.urb):
# Find the matching submit request
if self.urb.transfer_type == URB_CONTROL:
self.processControlSubmit(dat_cur)
elif self.urb.transfer_type == URB_BULK:
self.processBulkSubmit(dat_cur)
elif self.urb.transfer_type == URB_INTERRUPT:
pending = PendingRX()
pending.raw = self.urb_raw
pending.m_urb = self.urb
pending.packet_number = self.pktn_str()
g_pending[self.urb.id] = pending
printv('Added pending bulk URB %s' % self.urb.id)

self.submit = None
self.urb = None
if MODE == 'lin' and self.urb.id in self.pending_complete:
# oh snap solved a temporal anomaly
urb_submit = self.urb
(urb_complete, dat_cur) = self.pending_complete[self.urb.id]
del self.pending_complete[self.urb.id]
self.urb = urb_complete
self.process_complete(dat_cur)

self.submit = None
self.urb = None
except:
print 'ERROR: packet %s' % self.pktn_str()
raise

def pktn_str(self):
if args.rel_pkt:
Expand Down Expand Up @@ -891,7 +910,7 @@ def processControlCompleteIn(self, dat_cur):
if MODE == 'win':
# Skip xfer_stage
dat_cur = dat_cur[1:]
print 'shorten'
#print 'shorten'

# Is it legal to have a 0 length control in?
if self.submit.m_ctrl.wLength:
Expand Down Expand Up @@ -969,7 +988,7 @@ def processControlCompleteOut(self, dat_cur):
'req': self.submit.m_ctrl.bRequest,
'val': self.submit.m_ctrl.wValue,
'ind': self.submit.m_ctrl.wIndex,
'data': bytes2AnonArray(self.submit.m_data_out),
'data': bytes2AnonArray(data),
'packn': self.packnumt(),
})

Expand Down Expand Up @@ -1155,7 +1174,7 @@ def processInterruptComplete(self, dat_cur):
parser.add_argument('-k', dest='ofmt', default='libusbpy', action='store_const', const='linux', help='output linux kenrel')
parser.add_argument('-l', dest='ofmt', action='store_const', const='libusb', help='output libusb')
parser.add_argument('-p', dest='ofmt', action='store_const', const='libusbpy', help='output libusb python')
parser.add_argument('-j', dest='ofmt', action='store_const', const='json', help='output json')
parser.add_argument('-j', '--json', dest='ofmt', action='store_const', const='json', help='output json')
parser.add_argument('-s', help='allow short')
parser.add_argument('-f', help='custom call')
add_bool_arg(parser, '--packet-numbers', default=True, help='print packet numbers')
Expand Down

0 comments on commit 9f3a8d4

Please sign in to comment.