3ab9512549c354d7de4bd76fd99471d8b224dc97
[libftdi] / python / examples / cbus.py
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 CBUSX values to human-readable strings
25 def cbush_string(value):
26   if value == ftdi.CBUSX_AWAKE:
27     return 'AWAKE'
28   if value == ftdi.CBUSX_BAT_DETECT:
29     return 'BAT_DETECT'
30   if value == ftdi.CBUSX_BAT_DETECT_NEG:
31     return 'BAT_DETECT_NEG'
32   if value == ftdi.CBUSX_BB_RD:
33     return 'BB_RD'
34   if value == ftdi.CBUSX_BB_WR:
35     return 'BB_WR'
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:
43     return 'DRIVE_0'
44   if value == ftdi.CBUSX_DRIVE1:
45     return 'DRIVE_1'
46   if value == ftdi.CBUSX_I2C_RXF:
47     return 'I2C_RXF'
48   if value == ftdi.CBUSX_I2C_TXE:
49     return 'I2C_TXE'
50   if value == ftdi.CBUSX_IOMODE:
51     return 'IOMODE'
52   if value == ftdi.CBUSX_PWREN:
53     return 'PWREN'
54   if value == ftdi.CBUSX_RXLED:
55     return 'RXLED'
56   if value == ftdi.CBUSX_SLEEP:
57     return 'SLEEP'
58   if value == ftdi.CBUSX_TIME_STAMP:
59     return 'TIME_STAMP'
60   if value == ftdi.CBUSX_TRISTATE:
61     return 'TRISTATE'
62   if value == ftdi.CBUSX_TXDEN:
63     return 'TXDEN'
64   if value == ftdi.CBUSX_TXLED:
65     return 'TXLED'
66   if value == ftdi.CBUSX_TXRXLED:
67     return 'TXRXLED'
68   if value == ftdi.CBUSX_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.CBUSX_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)