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 | |
db9c7eba | 9 | CBUS3 Drive 1 (accommodate PCB error) |
d160863c RS |
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): | |
9f2b912e | 20 | self.message = message |
d160863c | 21 | def __str__(self): |
9f2b912e | 22 | return self.message |
d160863c | 23 | |
2f2d0dee | 24 | # Function to convert CBUSX values to human-readable strings |
d160863c | 25 | def cbush_string(value): |
2f2d0dee | 26 | if value == ftdi.CBUSX_AWAKE: |
d160863c | 27 | return 'AWAKE' |
2f2d0dee | 28 | if value == ftdi.CBUSX_BAT_DETECT: |
d160863c | 29 | return 'BAT_DETECT' |
2f2d0dee | 30 | if value == ftdi.CBUSX_BAT_DETECT_NEG: |
d160863c | 31 | return 'BAT_DETECT_NEG' |
2f2d0dee | 32 | if value == ftdi.CBUSX_BB_RD: |
d160863c | 33 | return 'BB_RD' |
2f2d0dee | 34 | if value == ftdi.CBUSX_BB_WR: |
d160863c | 35 | return 'BB_WR' |
2f2d0dee YY |
36 | if value == ftdi.CBUSX_CLK24: |
37 | return 'CLK24' | |
38 | if value == ftdi.CBUSX_CLK12: | |
39 | return 'CLK12' | |
40 | if value == ftdi.CBUSX_CLK6: | |
41 | return 'CLK6' | |
42 | if value == ftdi.CBUSX_DRIVE_0: | |
d160863c | 43 | return 'DRIVE_0' |
2f2d0dee | 44 | if value == ftdi.CBUSX_DRIVE1: |
d160863c | 45 | return 'DRIVE_1' |
2f2d0dee | 46 | if value == ftdi.CBUSX_I2C_RXF: |
d160863c | 47 | return 'I2C_RXF' |
2f2d0dee | 48 | if value == ftdi.CBUSX_I2C_TXE: |
d160863c | 49 | return 'I2C_TXE' |
2f2d0dee | 50 | if value == ftdi.CBUSX_IOMODE: |
d160863c | 51 | return 'IOMODE' |
2f2d0dee | 52 | if value == ftdi.CBUSX_PWREN: |
d160863c | 53 | return 'PWREN' |
2f2d0dee | 54 | if value == ftdi.CBUSX_RXLED: |
d160863c | 55 | return 'RXLED' |
2f2d0dee | 56 | if value == ftdi.CBUSX_SLEEP: |
d160863c | 57 | return 'SLEEP' |
2f2d0dee | 58 | if value == ftdi.CBUSX_TIME_STAMP: |
d160863c | 59 | return 'TIME_STAMP' |
2f2d0dee | 60 | if value == ftdi.CBUSX_TRISTATE: |
d160863c | 61 | return 'TRISTATE' |
2f2d0dee | 62 | if value == ftdi.CBUSX_TXDEN: |
d160863c | 63 | return 'TXDEN' |
2f2d0dee | 64 | if value == ftdi.CBUSX_TXLED: |
d160863c | 65 | return 'TXLED' |
2f2d0dee | 66 | if value == ftdi.CBUSX_TXRXLED: |
d160863c | 67 | return 'TXRXLED' |
2f2d0dee | 68 | if value == ftdi.CBUSX_VBUS_SENSE: |
d160863c RS |
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: | |
9f2b912e | 83 | raise ErrorMsg('ftdi.usb_find_all error = %s' % ftdi.get_error_string(ftdic)) |
d160863c | 84 | elif nDevices == 0: |
9f2b912e | 85 | raise ErrorMsg('No FT230X devices found') |
d160863c | 86 | elif nDevices != 1: |
9f2b912e | 87 | raise ErrorMsg('More than one FT230X device found') |
d160863c RS |
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. | |
9f2b912e | 96 | ret = ftdi.usb_open_desc(ftdic, 0x0403, 0x6015, description, serial) |
d160863c RS |
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 | |
9f2b912e | 107 | ret = ftdi.read_eeprom(ftdic) |
d160863c RS |
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('.') | |
9f2b912e | 129 | sys.stdout.write('\n') |
d160863c RS |
130 | |
131 | # Read and display the EEPROM (in human readable format) | |
9f2b912e | 132 | ret = ftdi.eeprom_decode(ftdic, 1) |
d160863c RS |
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),) | |
2f2d0dee | 146 | ret = ftdi.set_eeprom_value(ftdic,ftdi.CBUS_FUNCTION_3,ftdi.CBUSX_DRIVE1) |
d160863c RS |
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. | |
9f2b912e | 167 | ret = ftdi.usb_close(ftdic) |
d160863c | 168 | if ret < 0: |
9f2b912e | 169 | raise ErrorMsg('ftdi.usb_close error = %s' % ftdi.get_error_string(ftdic)) |
d160863c RS |
170 | |
171 | except ErrorMsg, msg: | |
9f2b912e YY |
172 | print >> sys.stderr, 'FATAL ERROR: ' + str(msg) |
173 | exit(1) |