cbus.py: remove unnecessary semicolons
[libftdi] / python / examples / cbus.py
CommitLineData
d160863c
RS
1#!/usr/bin/python2
2"""
3Copyright 2015, Sinclair R.F., Inc.
4
5This program is distributed under the GPL, version 2.
6
7Demonstrate how to configure the FT230X USB UART bridge as follows:
8 max_power 500 mA
9 CBUS3 Drive 1 (accomodate PCB error)
10"""
11
12import sys
13
14# Need to install libftdi for the following to work (see README.txt)
15import ftdi1 as ftdi
16
17# Define class for displaying errors.
18class 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 25def 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.
73try:
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
171except ErrorMsg, msg:
9f2b912e
YY
172 print >> sys.stderr, 'FATAL ERROR: ' + str(msg)
173 exit(1)