Commit | Line | Data |
---|---|---|
d160863c RS |
1 | #!/usr/bin/python2 |
2 | """ | |
3 | Copyright 2015, Sinclair R.F., Inc. | |
4 | ||
5 | This program is distributed under the GPL, version 2. | |
6 | ||
7 | Demonstrate how to configure the FT230X USB UART bridge as follows: | |
8 | max_power 500 mA | |
9 | CBUS3 Drive 1 (accomodate PCB error) | |
10 | """ | |
11 | ||
12 | import sys | |
13 | ||
14 | # Need to install libftdi for the following to work (see README.txt) | |
15 | import ftdi1 as ftdi | |
16 | ||
17 | # Define class for displaying errors. | |
18 | class ErrorMsg(Exception): | |
19 | def __init__(self,message): | |
20 | self.message = message; | |
21 | def __str__(self): | |
22 | return self.message; | |
23 | ||
24 | # Function to convert CBUSH values to human-readable strings | |
25 | def cbush_string(value): | |
26 | if value == ftdi.CBUSH_AWAKE: | |
27 | return 'AWAKE' | |
28 | if value == ftdi.CBUSH_BAT_DETECT: | |
29 | return 'BAT_DETECT' | |
30 | if value == ftdi.CBUSH_BAT_DETECT_NEG: | |
31 | return 'BAT_DETECT_NEG' | |
32 | if value == ftdi.CBUSH_BB_RD: | |
33 | return 'BB_RD' | |
34 | if value == ftdi.CBUSH_BB_WR: | |
35 | return 'BB_WR' | |
36 | if value == ftdi.CBUSH_CLK15: | |
37 | return 'CLK15' | |
38 | if value == ftdi.CBUSH_CLK30: | |
39 | return 'CLK30' | |
40 | if value == ftdi.CBUSH_CLK7_5: | |
41 | return 'CLK7_5' | |
42 | if value == ftdi.CBUSH_DRIVE_0: | |
43 | return 'DRIVE_0' | |
44 | if value == ftdi.CBUSH_DRIVE1: | |
45 | return 'DRIVE_1' | |
46 | if value == ftdi.CBUSH_I2C_RXF: | |
47 | return 'I2C_RXF' | |
48 | if value == ftdi.CBUSH_I2C_TXE: | |
49 | return 'I2C_TXE' | |
50 | if value == ftdi.CBUSH_IOMODE: | |
51 | return 'IOMODE' | |
52 | if value == ftdi.CBUSH_PWREN: | |
53 | return 'PWREN' | |
54 | if value == ftdi.CBUSH_RXLED: | |
55 | return 'RXLED' | |
56 | if value == ftdi.CBUSH_SLEEP: | |
57 | return 'SLEEP' | |
58 | if value == ftdi.CBUSH_TIME_STAMP: | |
59 | return 'TIME_STAMP' | |
60 | if value == ftdi.CBUSH_TRISTATE: | |
61 | return 'TRISTATE' | |
62 | if value == ftdi.CBUSH_TXDEN: | |
63 | return 'TXDEN' | |
64 | if value == ftdi.CBUSH_TXLED: | |
65 | return 'TXLED' | |
66 | if value == ftdi.CBUSH_TXRXLED: | |
67 | return 'TXRXLED' | |
68 | if value == ftdi.CBUSH_VBUS_SENSE: | |
69 | return 'VBUS_SENSE' | |
70 | return 'UNKNOWN' | |
71 | ||
72 | # Surround the program with a try ... except clause. | |
73 | try: | |
74 | ||
75 | # Allocate and inialize an ftdi context. | |
76 | ftdic = ftdi.new() | |
77 | if ftdic == 0: | |
78 | raise ErrorMsg('ftdi.new() failed') | |
79 | ||
80 | # List all the FT230X devices. | |
81 | nDevices, devlist = ftdi.usb_find_all(ftdic, 0x0403, 0x6015) | |
82 | if nDevices < 0: | |
83 | raise ErrorMsg('ftdi.usb_find_all error = %s' % ftdi.get_error_string(ftdic)); | |
84 | elif nDevices == 0: | |
85 | raise ErrorMsg('No FT230X devices found'); | |
86 | elif nDevices != 1: | |
87 | raise ErrorMsg('More than one FT230X device found'); | |
88 | ||
89 | # Display the identified single FT230X device. | |
90 | ret, manufacturer, description, serial = ftdi.usb_get_strings(ftdic, devlist.dev) | |
91 | if ret < 0: | |
92 | raise ErrorMsg('ftdi.usb_get_strings error = %s' % ftdi.get_error_string(ftdic)) | |
93 | print 'manufacturer="%s" description="%s" serial="%s"' % (manufacturer, description, serial) | |
94 | ||
95 | # Open the identified single FT230X device. | |
96 | ret = ftdi.usb_open_desc(ftdic, 0x0403, 0x6015, description, serial); | |
97 | if ret < 0: | |
98 | raise ErrorMsg('ftdi.usb_open_desc error = %s' % ftdi.get_error_string(ftdic)) | |
99 | ||
100 | # Read the chip id. | |
101 | ret, chipid = ftdi.read_chipid(ftdic) | |
102 | if ret < 0: | |
103 | raise ErrorMsg('ftdi.read_chipid error = %s' % ftdi.get_error_string(ftdic)) | |
104 | print 'chip id=0x%08X' % (chipid % 2**32) | |
105 | ||
106 | # Read the EEPROM | |
107 | ret = ftdi.read_eeprom(ftdic); | |
108 | if ret < 0: | |
109 | raise ErrorMsg('ftdi.read_eeprom error = %s' % ftdi.get_error_string(ftdic)) | |
110 | ||
111 | # Get a read-only copy of the EEPROM | |
112 | if True: | |
113 | eeprom_size = ftdic.eeprom.size | |
114 | ret, eeprom_buf = ftdi.get_eeprom_buf(ftdic, eeprom_size) | |
115 | if ret < 0: | |
116 | raise ErrorMsg('ftdi.get_eeprom_buf error = %s' % ftdi.get_error_string(ftdic)) | |
117 | for i in range(0,eeprom_size,16): | |
118 | sys.stdout.write('%04x: ' % i) | |
119 | for j in range(16): | |
120 | sys.stdout.write('%02x ' % ord(eeprom_buf[i+j])) | |
121 | if j in (7,15,): | |
122 | sys.stdout.write(' ') | |
123 | for j in range(16): | |
124 | x = eeprom_buf[i+j] | |
125 | if 32 <= ord(x) <= 0x7E: | |
126 | sys.stdout.write(x) | |
127 | else: | |
128 | sys.stdout.write('.') | |
129 | sys.stdout.write('\n'); | |
130 | ||
131 | # Read and display the EEPROM (in human readable format) | |
132 | ret = ftdi.eeprom_decode(ftdic, 1); | |
133 | if ret < 0: | |
134 | raise ErrorMsg('ftdi.eeprom_decode error = %s' % ftdi.get_error_string(ftdic)) | |
135 | ||
136 | # Set the maximum power to 500mA. | |
137 | print 'initial max_power = %dmA' % ftdic.eeprom.max_power | |
138 | ftdic.eeprom.max_power = 500 | |
139 | print 'new max_power = %dmA' % ftdic.eeprom.max_power | |
140 | ||
141 | # Set CBUS3 to DRIVE_1 (the board needs to be reworked to use PWREN# and BCD#) | |
142 | ret, value = ftdi.get_eeprom_value(ftdic,ftdi.CBUS_FUNCTION_3) | |
143 | if ret < 0: | |
144 | raise ErrorMsg('ftdi.get_eeprom_value error = %s' % ftdi.get_error_string(ftdic)) | |
145 | print 'initial CBUS3 = %d (%s)' % (value,cbush_string(value),) | |
146 | ret = ftdi.set_eeprom_value(ftdic,ftdi.CBUS_FUNCTION_3,ftdi.CBUSH_DRIVE1) | |
147 | if ret < 0: | |
148 | raise ErrorMsg('ftdi.set_eeprom_value error = %s' % ftdi.get_error_string(ftdic)) | |
149 | ret, value = ftdi.get_eeprom_value(ftdic,ftdi.CBUS_FUNCTION_3) | |
150 | if ret < 0: | |
151 | raise ErrorMsg('ftdi.get_eeprom_value error = %s' % ftdi.get_error_string(ftdic)) | |
152 | print 'new CBUS3 = %d (%s)' % (value,cbush_string(value),) | |
153 | ||
154 | # Write the new EEPROM settings. | |
155 | if False: | |
156 | ret = ftdi.eeprom_build(ftdic) | |
157 | if ret < 0: | |
158 | raise ErrorMsg('ftdi.eeprom_build error = %s' % ftdi.get_error_string(ftdic)) | |
159 | ret = ftdi.write_eeprom(ftdic) | |
160 | if ret < 0: | |
161 | raise ErrorMsg('ftdi.write_eeprom error = %s' % ftdi.get_error_string(ftdic)) | |
162 | print 'EEPROM write succeeded' | |
163 | else: | |
164 | print 'EEPROM write not attempted' | |
165 | ||
166 | # Close the ftdi context. | |
167 | ret = ftdi.usb_close(ftdic); | |
168 | if ret < 0: | |
169 | raise ErrorMsg('ftdi.usb_close error = %s' % ftdi.get_error_string(ftdic)); | |
170 | ||
171 | except ErrorMsg, msg: | |
172 | print >> sys.stderr, 'FATAL ERROR: ' + str(msg); | |
173 | exit(1); |