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.interface.configuration.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[1] & 0x01
42 rts = (req.value[1] & 0x02) >> 1
43 dtren = req.value[0] & 0x01
44 rtsen = (req.value[0] & 0x02) >> 1
47 print("DTR is enabled, value", dtr)
49 print("RTS is enabled, value", rts)
51 self.interface.configuration.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 dtr = req.value[1] & 0x01
59 print("SET_FLOW_CTRL to no handshaking")
60 if req.value[1] & 0x01:
61 print("SET_FLOW_CTRL for RTS/CTS handshaking")
62 if req.value[1] & 0x02:
63 print("SET_FLOW_CTRL for DTR/DSR handshaking")
64 if req.value[1] & 0x04:
65 print("SET_FLOW_CTRL for XON/XOFF handshaking")
67 self.interface.configuration.device.maxusb_app.send_on_endpoint(0, b'')
69 def handle_set_baud_rate_request(self, req):
71 print(self.name, "received set_baud_rate request")
73 dtr = req.value[1] & 0x01
74 print("baud rate set to", req.value[1])
76 self.interface.configuration.device.maxusb_app.send_on_endpoint(0, b'')
78 def handle_set_data_request(self, req):
80 print(self.name, "received set_data request")
82 self.interface.configuration.device.maxusb_app.send_on_endpoint(0, b'')
84 def handle_get_status_request(self, req):
86 print(self.name, "received get_status request")
88 self.interface.configuration.device.maxusb_app.send_on_endpoint(0, b'')
90 def handle_set_event_char_request(self, req):
92 print(self.name, "received set_event_char request")
94 self.interface.configuration.device.maxusb_app.send_on_endpoint(0, b'')
96 def handle_set_error_char_request(self, req):
98 print(self.name, "received set_error_char request")
100 self.interface.configuration.device.maxusb_app.send_on_endpoint(0, b'')
102 def handle_set_latency_timer_request(self, req):
104 print(self.name, "received set_latency_timer request")
106 self.interface.configuration.device.maxusb_app.send_on_endpoint(0, b'')
108 def handle_get_latency_timer_request(self, req):
110 print(self.name, "received get_latency_timer request")
113 self.interface.configuration.device.maxusb_app.send_on_endpoint(0, b'\x01')
116 class USBFtdiInterface(USBInterface):
117 name = "USB FTDI interface"
119 def __init__(self, verbose=0):
125 USBEndpoint.direction_out,
126 USBEndpoint.transfer_type_bulk,
127 USBEndpoint.sync_type_none,
128 USBEndpoint.usage_type_data,
129 16384, # max packet size
130 0, # polling interval, see USB 2.0 spec Table 9-13
131 self.handle_data_available # handler function
135 USBEndpoint.direction_in,
136 USBEndpoint.transfer_type_bulk,
137 USBEndpoint.sync_type_none,
138 USBEndpoint.usage_type_data,
139 16384, # max packet size
140 0, # polling interval, see USB 2.0 spec Table 9-13
141 self.handle_buffer_available # handler function
145 # TODO: un-hardcode string index (last arg before "verbose")
146 USBInterface.__init__(
148 0, # interface number
149 0, # alternate setting
150 0xff, # interface class: vendor-specific
151 0xff, # subclass: vendor-specific
152 0xff, # protocol: vendor-specific
159 self.device_vendor = USBFtdiVendor()
160 self.device_vendor.set_interface(self)
162 def handle_buffer_available(self):
165 def handle_data_available(self, data):
169 class USBFtdiDevice(USBDevice):
170 name = "USB FTDI device"
172 def __init__(self, maxusb_app, verbose=0):
173 interface = USBFtdiInterface(verbose=verbose)
175 config = USBConfiguration(
177 "FTDI config", # string desc
178 [ interface ] # interfaces
186 0, # protocol release number
187 64, # max packet size for endpoint 0
188 0x0403, # vendor id: FTDI
189 0x8372, # product id: FT232 USB-Serial (UART) IC
190 0x0001, # device revision
191 "GoodFET", # manufacturer string
192 "FTDI Emulator", # product string
193 "S/N3420E", # serial number string