From d160863c527c8a3fdf1e821a64c59192a2fc2150 Mon Sep 17 00:00:00 2001 From: Rodney Sinclair Date: Wed, 14 Jan 2015 17:19:42 +0100 Subject: [PATCH] Add cbus python example code --- python/examples/CMakeLists.txt | 2 +- python/examples/cbus.py | 173 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 174 insertions(+), 1 deletions(-) create mode 100644 python/examples/cbus.py diff --git a/python/examples/CMakeLists.txt b/python/examples/CMakeLists.txt index bca7daf..b4ed93d 100644 --- a/python/examples/CMakeLists.txt +++ b/python/examples/CMakeLists.txt @@ -1,4 +1,4 @@ -install ( FILES simple.py complete.py +install ( FILES simple.py complete.py cbus.py DESTINATION share/libftdi/examples PERMISSIONS OWNER_READ GROUP_READ WORLD_READ ) diff --git a/python/examples/cbus.py b/python/examples/cbus.py new file mode 100644 index 0000000..18d8ab5 --- /dev/null +++ b/python/examples/cbus.py @@ -0,0 +1,173 @@ +#!/usr/bin/python2 +""" +Copyright 2015, Sinclair R.F., Inc. + +This program is distributed under the GPL, version 2. + +Demonstrate how to configure the FT230X USB UART bridge as follows: + max_power 500 mA + CBUS3 Drive 1 (accomodate PCB error) +""" + +import sys + +# Need to install libftdi for the following to work (see README.txt) +import ftdi1 as ftdi + +# Define class for displaying errors. +class ErrorMsg(Exception): + def __init__(self,message): + self.message = message; + def __str__(self): + return self.message; + +# Function to convert CBUSH values to human-readable strings +def cbush_string(value): + if value == ftdi.CBUSH_AWAKE: + return 'AWAKE' + if value == ftdi.CBUSH_BAT_DETECT: + return 'BAT_DETECT' + if value == ftdi.CBUSH_BAT_DETECT_NEG: + return 'BAT_DETECT_NEG' + if value == ftdi.CBUSH_BB_RD: + return 'BB_RD' + if value == ftdi.CBUSH_BB_WR: + return 'BB_WR' + if value == ftdi.CBUSH_CLK15: + return 'CLK15' + if value == ftdi.CBUSH_CLK30: + return 'CLK30' + if value == ftdi.CBUSH_CLK7_5: + return 'CLK7_5' + if value == ftdi.CBUSH_DRIVE_0: + return 'DRIVE_0' + if value == ftdi.CBUSH_DRIVE1: + return 'DRIVE_1' + if value == ftdi.CBUSH_I2C_RXF: + return 'I2C_RXF' + if value == ftdi.CBUSH_I2C_TXE: + return 'I2C_TXE' + if value == ftdi.CBUSH_IOMODE: + return 'IOMODE' + if value == ftdi.CBUSH_PWREN: + return 'PWREN' + if value == ftdi.CBUSH_RXLED: + return 'RXLED' + if value == ftdi.CBUSH_SLEEP: + return 'SLEEP' + if value == ftdi.CBUSH_TIME_STAMP: + return 'TIME_STAMP' + if value == ftdi.CBUSH_TRISTATE: + return 'TRISTATE' + if value == ftdi.CBUSH_TXDEN: + return 'TXDEN' + if value == ftdi.CBUSH_TXLED: + return 'TXLED' + if value == ftdi.CBUSH_TXRXLED: + return 'TXRXLED' + if value == ftdi.CBUSH_VBUS_SENSE: + return 'VBUS_SENSE' + return 'UNKNOWN' + +# Surround the program with a try ... except clause. +try: + + # Allocate and inialize an ftdi context. + ftdic = ftdi.new() + if ftdic == 0: + raise ErrorMsg('ftdi.new() failed') + + # List all the FT230X devices. + nDevices, devlist = ftdi.usb_find_all(ftdic, 0x0403, 0x6015) + if nDevices < 0: + raise ErrorMsg('ftdi.usb_find_all error = %s' % ftdi.get_error_string(ftdic)); + elif nDevices == 0: + raise ErrorMsg('No FT230X devices found'); + elif nDevices != 1: + raise ErrorMsg('More than one FT230X device found'); + + # Display the identified single FT230X device. + ret, manufacturer, description, serial = ftdi.usb_get_strings(ftdic, devlist.dev) + if ret < 0: + raise ErrorMsg('ftdi.usb_get_strings error = %s' % ftdi.get_error_string(ftdic)) + print 'manufacturer="%s" description="%s" serial="%s"' % (manufacturer, description, serial) + + # Open the identified single FT230X device. + ret = ftdi.usb_open_desc(ftdic, 0x0403, 0x6015, description, serial); + if ret < 0: + raise ErrorMsg('ftdi.usb_open_desc error = %s' % ftdi.get_error_string(ftdic)) + + # Read the chip id. + ret, chipid = ftdi.read_chipid(ftdic) + if ret < 0: + raise ErrorMsg('ftdi.read_chipid error = %s' % ftdi.get_error_string(ftdic)) + print 'chip id=0x%08X' % (chipid % 2**32) + + # Read the EEPROM + ret = ftdi.read_eeprom(ftdic); + if ret < 0: + raise ErrorMsg('ftdi.read_eeprom error = %s' % ftdi.get_error_string(ftdic)) + + # Get a read-only copy of the EEPROM + if True: + eeprom_size = ftdic.eeprom.size + ret, eeprom_buf = ftdi.get_eeprom_buf(ftdic, eeprom_size) + if ret < 0: + raise ErrorMsg('ftdi.get_eeprom_buf error = %s' % ftdi.get_error_string(ftdic)) + for i in range(0,eeprom_size,16): + sys.stdout.write('%04x: ' % i) + for j in range(16): + sys.stdout.write('%02x ' % ord(eeprom_buf[i+j])) + if j in (7,15,): + sys.stdout.write(' ') + for j in range(16): + x = eeprom_buf[i+j] + if 32 <= ord(x) <= 0x7E: + sys.stdout.write(x) + else: + sys.stdout.write('.') + sys.stdout.write('\n'); + + # Read and display the EEPROM (in human readable format) + ret = ftdi.eeprom_decode(ftdic, 1); + if ret < 0: + raise ErrorMsg('ftdi.eeprom_decode error = %s' % ftdi.get_error_string(ftdic)) + + # Set the maximum power to 500mA. + print 'initial max_power = %dmA' % ftdic.eeprom.max_power + ftdic.eeprom.max_power = 500 + print 'new max_power = %dmA' % ftdic.eeprom.max_power + + # Set CBUS3 to DRIVE_1 (the board needs to be reworked to use PWREN# and BCD#) + ret, value = ftdi.get_eeprom_value(ftdic,ftdi.CBUS_FUNCTION_3) + if ret < 0: + raise ErrorMsg('ftdi.get_eeprom_value error = %s' % ftdi.get_error_string(ftdic)) + print 'initial CBUS3 = %d (%s)' % (value,cbush_string(value),) + ret = ftdi.set_eeprom_value(ftdic,ftdi.CBUS_FUNCTION_3,ftdi.CBUSH_DRIVE1) + if ret < 0: + raise ErrorMsg('ftdi.set_eeprom_value error = %s' % ftdi.get_error_string(ftdic)) + ret, value = ftdi.get_eeprom_value(ftdic,ftdi.CBUS_FUNCTION_3) + if ret < 0: + raise ErrorMsg('ftdi.get_eeprom_value error = %s' % ftdi.get_error_string(ftdic)) + print 'new CBUS3 = %d (%s)' % (value,cbush_string(value),) + + # Write the new EEPROM settings. + if False: + ret = ftdi.eeprom_build(ftdic) + if ret < 0: + raise ErrorMsg('ftdi.eeprom_build error = %s' % ftdi.get_error_string(ftdic)) + ret = ftdi.write_eeprom(ftdic) + if ret < 0: + raise ErrorMsg('ftdi.write_eeprom error = %s' % ftdi.get_error_string(ftdic)) + print 'EEPROM write succeeded' + else: + print 'EEPROM write not attempted' + + # Close the ftdi context. + ret = ftdi.usb_close(ftdic); + if ret < 0: + raise ErrorMsg('ftdi.usb_close error = %s' % ftdi.get_error_string(ftdic)); + +except ErrorMsg, msg: + print >> sys.stderr, 'FATAL ERROR: ' + str(msg); + exit(1); -- 1.7.1