3 # Contains class definitions to implement a USB FTDI chip.
6 from USBDevice import *
7 from USBConfiguration import *
8 from USBInterface import *
9 from USBEndpoint import *
10 from USBVendor import *
14 class USBFtdiVendor(USBVendor):
15 name = "USB FTDI vendor"
17 def setup_request_handlers(self):
18 self.request_handlers = {
19 0 : self.handle_reset_request,
20 1 : self.handle_modem_ctrl_request,
21 2 : self.handle_set_flow_ctrl_request,
22 3 : self.handle_set_baud_rate_request,
23 4 : self.handle_set_data_request,
24 5 : self.handle_get_status_request,
25 6 : self.handle_set_event_char_request,
26 7 : self.handle_set_error_char_request,
27 9 : self.handle_set_latency_timer_request,
28 10 : self.handle_get_latency_timer_request
31 def handle_reset_request(self, req):
33 print(self.name, "received reset request")
35 self.device.maxusb_app.send_on_endpoint(0, b'')
37 def handle_modem_ctrl_request(self, req):
39 print(self.name, "received modem_ctrl request")
41 dtr = req.value & 0x0001
42 rts = (req.value & 0x0002) >> 1
43 dtren = (req.value & 0x0100) >> 8
44 rtsen = (req.value & 0x0200) >> 9
47 print("DTR is enabled, value", dtr)
49 print("RTS is enabled, value", rts)
51 self.device.maxusb_app.send_on_endpoint(0, b'')
53 def handle_set_flow_ctrl_request(self, req):
55 print(self.name, "received set_flow_ctrl request")
57 if req.value == 0x000:
58 print("SET_FLOW_CTRL to no handshaking")
59 if req.value & 0x0001:
60 print("SET_FLOW_CTRL for RTS/CTS handshaking")
61 if req.value & 0x0002:
62 print("SET_FLOW_CTRL for DTR/DSR handshaking")
63 if req.value & 0x0004:
64 print("SET_FLOW_CTRL for XON/XOFF handshaking")
66 self.device.maxusb_app.send_on_endpoint(0, b'')
68 def handle_set_baud_rate_request(self, req):
70 print(self.name, "received set_baud_rate request")
72 dtr = req.value & 0x0001
73 print("baud rate set to", dtr)
75 self.device.maxusb_app.send_on_endpoint(0, b'')
77 def handle_set_data_request(self, req):
79 print(self.name, "received set_data request")
81 self.device.maxusb_app.send_on_endpoint(0, b'')
83 def handle_get_status_request(self, req):
85 print(self.name, "received get_status request")
87 self.device.maxusb_app.send_on_endpoint(0, b'')
89 def handle_set_event_char_request(self, req):
91 print(self.name, "received set_event_char request")
93 self.device.maxusb_app.send_on_endpoint(0, b'')
95 def handle_set_error_char_request(self, req):
97 print(self.name, "received set_error_char request")
99 self.device.maxusb_app.send_on_endpoint(0, b'')
101 def handle_set_latency_timer_request(self, req):
103 print(self.name, "received set_latency_timer request")
105 self.device.maxusb_app.send_on_endpoint(0, b'')
107 def handle_get_latency_timer_request(self, req):
109 print(self.name, "received get_latency_timer request")
112 self.device.maxusb_app.send_on_endpoint(0, b'\x01')
115 class USBFtdiInterface(USBInterface):
116 name = "USB FTDI interface"
118 def __init__(self, verbose=0):
124 USBEndpoint.direction_out,
125 USBEndpoint.transfer_type_bulk,
126 USBEndpoint.sync_type_none,
127 USBEndpoint.usage_type_data,
128 16384, # max packet size
129 0, # polling interval, see USB 2.0 spec Table 9-13
130 self.handle_data_available # handler function
134 USBEndpoint.direction_in,
135 USBEndpoint.transfer_type_bulk,
136 USBEndpoint.sync_type_none,
137 USBEndpoint.usage_type_data,
138 16384, # max packet size
139 0, # polling interval, see USB 2.0 spec Table 9-13
140 self.handle_buffer_available # handler function
144 # TODO: un-hardcode string index (last arg before "verbose")
145 USBInterface.__init__(
147 0, # interface number
148 0, # alternate setting
149 0xff, # interface class: vendor-specific
150 0xff, # subclass: vendor-specific
151 0xff, # protocol: vendor-specific
158 def handle_buffer_available(self):
161 def handle_data_available(self, data):
162 print(bytes_as_hex(data))
165 class USBFtdiDevice(USBDevice):
166 name = "USB FTDI device"
168 def __init__(self, maxusb_app, verbose=0):
169 interface = USBFtdiInterface(verbose=verbose)
171 config = USBConfiguration(
173 "FTDI config", # string desc
174 [ interface ] # interfaces
182 0, # protocol release number
183 64, # max packet size for endpoint 0
184 0x0403, # vendor id: FTDI
185 0x6001, # product id: FT232 USB-Serial (UART) IC
186 0x0001, # device revision
187 "GoodFET", # manufacturer string
188 "FTDI Emulator", # product string
189 "S/N3420E", # serial number string
194 self.device_vendor = USBFtdiVendor()
195 self.device_vendor.set_device(self)