Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Usb request enhancements #1

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 21 additions & 6 deletions decoders/usb_request/pd.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,10 @@ class Decoder(srd.Decoder):
license = 'gplv2+'
inputs = ['usb_packet']
outputs = ['usb_request']
options = (
{'id': 'in_request_start', 'desc': 'Start IN requests on',
'default': 'submit', 'values': ('submit', 'first-ack')},
)
tags = ['PC']
annotations = (
('request-setup-read', 'Setup: Device-to-host'),
Expand All @@ -129,7 +133,9 @@ class Decoder(srd.Decoder):
('errors', 'Unexpected packets'),
)
annotation_rows = (
('request', 'USB requests', tuple(range(4))),
('request-setup', 'USB SETUP', (0,1,)),
('request-in', 'USB BULK IN', (2,)),
('request-out', 'USB BULK OUT', (3,)),
('errors', 'Errors', (4,)),
)
binary = (
Expand Down Expand Up @@ -178,6 +184,7 @@ def metadata(self, key, value):
def start(self):
self.out_binary = self.register(srd.OUTPUT_BINARY)
self.out_ann = self.register(srd.OUTPUT_ANN)
self.in_request_start = self.options['in_request_start']

def handle_transfer(self):
request_started = 0
Expand All @@ -195,7 +202,7 @@ def handle_transfer(self):
if not (addr, ep) in self.request:
self.request[(addr, ep)] = {'setup_data': [], 'data': [],
'type': None, 'ss': self.ss_transaction, 'es': None,
'id': self.request_id, 'addr': addr, 'ep': ep}
'ss_data': None, 'id': self.request_id, 'addr': addr, 'ep': ep}
self.request_id += 1
request_started = 1
request = self.request[(addr,ep)]
Expand All @@ -207,11 +214,14 @@ def handle_transfer(self):
# BULK or INTERRUPT transfer
if request['type'] in (None, 'BULK IN') and self.transaction_type == 'IN':
request['type'] = 'BULK IN'
if len(request['data']) == 0 and len(self.transaction_data) > 0:
request['ss_data'] = self.ss_transaction
request['data'] += self.transaction_data
self.handle_request(request_started, request_end)
elif request['type'] in (None, 'BULK OUT') and self.transaction_type == 'OUT':
request['type'] = 'BULK OUT'
request['data'] += self.transaction_data
if self.handshake == 'ACK':
request['data'] += self.transaction_data
self.handle_request(request_started, request_end)

# CONTROL, SETUP stage
Expand All @@ -231,7 +241,8 @@ def handle_transfer(self):
request['data'] += self.transaction_data

elif request['type'] == 'SETUP OUT' and self.transaction_type == 'OUT':
request['data'] += self.transaction_data
if self.handshake == 'ACK':
request['data'] += self.transaction_data
if request['wLength'] == len(request['data']):
self.handle_request(1, 0)

Expand Down Expand Up @@ -275,7 +286,9 @@ def handle_request(self, request_start, request_end):
addr = self.transaction_addr
request = self.request[(addr, ep)]

ss, es = request['ss'], request['es']
ss, es, ss_data = request['ss'], request['es'], request['ss_data']
if self.in_request_start == 'submit':
ss_data = ss

if request_start == 1:
# Issue PCAP 'SUBMIT' packet.
Expand All @@ -292,7 +305,7 @@ def handle_request(self, request_start, request_end):
elif request['type'] == 'SETUP OUT':
self.putr(ss, es, [1, ['SETUP out: %s' % summary]])
elif request['type'] == 'BULK IN':
self.putr(ss, es, [2, ['BULK in: %s' % summary]])
self.putr(ss_data, es, [2, ['BULK in: %s' % summary]])
elif request['type'] == 'BULK OUT':
self.putr(ss, es, [3, ['BULK out: %s' % summary]])

Expand Down Expand Up @@ -339,6 +352,8 @@ def decode(self, ss, es, data):
self.es_transaction = es
self.transaction_state = 'TOKEN RECEIVED'
self.transaction_ep = ep
if ep > 0 and pname == 'IN':
self.transaction_ep = ep + 0x80
self.transaction_addr = addr
self.transaction_type = pname # IN OUT SETUP

Expand Down