3 # Contains class definition for USBInterface.
8 name = "generic USB interface"
10 def __init__(self, interface_number, interface_alternate, interface_class,
11 interface_subclass, interface_protocol, interface_string_index,
12 verbose=0, endpoints=[], descriptors={}):
14 self.number = interface_number
15 self.alternate = interface_alternate
16 self.iclass = interface_class
17 self.subclass = interface_subclass
18 self.protocol = interface_protocol
19 self.string_index = interface_string_index
21 self.endpoints = endpoints
22 self.descriptors = descriptors
24 self.verbose = verbose
26 self.descriptors[USB.desc_type_interface] = self.get_descriptor
28 self.request_handlers = {
29 6 : self.handle_get_descriptor_request
32 # USB 2.0 specification, section 9.4.3 (p 281 of pdf)
33 # HACK: blatant copypasta from USBDevice pains me deeply
34 def handle_get_descriptor_request(self, req):
35 dtype = (req.value >> 8) & 0xff
36 dindex = req.value & 0xff
43 print(self.name, ("received GET_DESCRIPTOR req %d, index %d, " \
44 + "language 0x%04x, length %d") \
45 % (dtype, dindex, lang, n))
47 # TODO: handle KeyError
48 response = self.descriptors[dtype]
49 if callable(response):
50 response = response(dindex)
53 n = min(n, len(response))
54 self.device.maxusb_app.send_on_endpoint(0, response[:n])
57 print(self.name, "sent", n, "bytes in response")
59 # Table 9-12 of USB 2.0 spec (pdf page 296)
60 def get_descriptor(self):
63 9, # length of descriptor in bytes
64 4, # descriptor type 4 == interface
75 iclass_desc_num = USB.interface_class_to_descriptor_type(self.iclass)
76 d += self.descriptors[iclass_desc_num]
78 for e in self.endpoints:
79 d += e.get_descriptor()