massive commit to get umass working, only significant known bug is that changes don...
[goodfet] / client / USBEndpoint.py
1 # USBEndpoint.py
2 #
3 # Contains class definition for USBEndpoint.
4
5 class USBEndpoint:
6     direction_out               = 0x00
7     direction_in                = 0x01
8
9     transfer_type_control       = 0x00
10     transfer_type_isochronous   = 0x01
11     transfer_type_bulk          = 0x02
12     transfer_type_interrupt     = 0x03
13
14     sync_type_none              = 0x00
15     sync_type_async             = 0x01
16     sync_type_adaptive          = 0x02
17     sync_type_synchronous       = 0x03
18
19     usage_type_data             = 0x00
20     usage_type_feedback         = 0x01
21     usage_type_implicit_feedback = 0x02
22
23     def __init__(self, number, direction, transfer_type, sync_type,
24             usage_type, max_packet_size, interval, handler):
25
26         self.number             = number
27         self.direction          = direction
28         self.transfer_type      = transfer_type
29         self.sync_type          = sync_type
30         self.usage_type         = usage_type
31         self.max_packet_size    = max_packet_size
32         self.interval           = interval
33         self.handler            = handler
34
35         self.interface          = None
36
37         self.request_handlers   = {
38                 1 : self.handle_clear_feature_request
39         }
40
41     def handle_clear_feature_request(self, req):
42         print("received CLEAR_FEATURE request for endpoint", self.number,
43                 "with value", req.value)
44         self.interface.configuration.device.maxusb_app.send_on_endpoint(0, b'')
45
46     def set_interface(self, interface):
47         self.interface = interface
48
49     # see Table 9-13 of USB 2.0 spec (pdf page 297)
50     def get_descriptor(self):
51         address = (self.number & 0x0f) | (self.direction << 7) 
52         attributes = (self.transfer_type & 0x03) \
53                    | ((self.sync_type & 0x03) << 2) \
54                    | ((self.usage_type & 0x03) << 4)
55
56         d = bytearray([
57                 7,          # length of descriptor in bytes
58                 5,          # descriptor type 5 == endpoint
59                 address,
60                 attributes,
61                 (self.max_packet_size >> 8) & 0xff,
62                 self.max_packet_size & 0xff,
63                 self.interval
64         ])
65
66         return d
67