def block_read(self, pins, index, rail_of_pac): """I2C communication for PAC block read and return list of voltage / current""" data = [] voltage = [] current = [] if self.params['hw_filter']: register = PAC1934_ADDR_REG_VBUS_AVG else: register = PAC1934_ADDR_REG_VBUS add_write = (pins['pac'][1] << 1) + 0 add_read = (pins['pac'][1] << 1) + 1 common_func.ftdi_i2c_start(self.ftdic, pins) common_func.ftdi_i2c_write(self.ftdic, pins, add_write) common_func.ftdi_i2c_write(self.ftdic, pins, register) common_func.ftdi_i2c_start(self.ftdic, pins) common_func.ftdi_i2c_write(self.ftdic, pins, add_read) for i in range(15): data.append(common_func.ftdi_i2c_read(self.ftdic, pins, 0)) data.append(common_func.ftdi_i2c_read(self.ftdic, pins, 1)) for i in range(rail_of_pac): channel = self.board_mapping_power[i + index]['pac'][0] volt = (((data[(2 * channel) - 2][0] << 8) + data[ (2 * channel) - 1][0]) * 32) / 65535 voltage.append(volt) curr = self.process_current( (((data[8 + (2 * channel) - 2][0] << 8) + data[8 + (2 * channel) - 1][0]) * 1)) current.append(curr) return voltage, current
def pca6416_set_direction(self, pins): """I2C communication for defining PCA pins as I/O""" logging.debug('pca6416_set_direction') add_write = (pins['pca6416'][0] << 1) + 0 add_read = (pins['pca6416'][0] << 1) + 1 conf_cmd = (pins['pca6416'][1]) conf_cmd = conf_cmd + 0x06 if (self.name != 'val_board_1' and self.name != 'val_board_2') else conf_cmd + 0x0C common_func.ftdi_i2c_start(self.ftdic, pins) status = common_func.ftdi_i2c_write(self.ftdic, pins, add_write) if status != 0: return status status = common_func.ftdi_i2c_write(self.ftdic, pins, conf_cmd) if status != 0: return status common_func.ftdi_i2c_start(self.ftdic, pins) status = common_func.ftdi_i2c_write(self.ftdic, pins, add_read) if status != 0: return status current_confg = common_func.ftdi_i2c_read(self.ftdic, pins, 1) logging.debug('Current PCA pins direction: ' + hex(current_confg[0])) common_func.ftdi_i2c_stop(self.ftdic, pins) intput_bitmask = (~(pins['pca6416'][2])) & current_confg[0] logging.debug('Input PCA bitmask pins direction: ' + hex(intput_bitmask)) common_func.ftdi_i2c_start(self.ftdic, pins) status = common_func.ftdi_i2c_write(self.ftdic, pins, add_write) if status != 0: return status status = common_func.ftdi_i2c_write(self.ftdic, pins, conf_cmd) if status != 0: return status status = common_func.ftdi_i2c_write(self.ftdic, pins, intput_bitmask) if status != 0: return status common_func.ftdi_i2c_stop(self.ftdic, pins)
def pca_write(self, pins, gpio_value): """I2C communication for writing new value to the PCA""" output_data = [] logging.debug('pca_write') add_write = (pins['pca6416'][0] << 1) + 0 add_read = (pins['pca6416'][0] << 1) + 1 conf_cmd = (pins['pca6416'][1]) conf_cmd = conf_cmd + 0x02 if (self.name != 'val_board_1' and self.name != 'val_board_2') else conf_cmd + 0x04 common_func.ftdi_i2c_start(self.ftdic, pins) status = common_func.ftdi_i2c_write(self.ftdic, pins, add_write) if status != 0: return status status = common_func.ftdi_i2c_write(self.ftdic, pins, conf_cmd) if status != 0: return status common_func.ftdi_i2c_start(self.ftdic, pins) status = common_func.ftdi_i2c_write(self.ftdic, pins, add_read) if status != 0: return status current_config = common_func.ftdi_i2c_read(self.ftdic, pins, 1) logging.debug('Current PCA GPIO configuration: ' + hex(current_config[0])) common_func.ftdi_i2c_stop(self.ftdic, pins) output_data = (current_config[0] & ~pins['pca6416'][2]) | (gpio_value & pins['pca6416'][2]) logging.debug('Modified PCA GPIO configuration: ' + hex(output_data)) common_func.ftdi_i2c_start(self.ftdic, pins) status = common_func.ftdi_i2c_write(self.ftdic, pins, add_write) if status != 0: return status status = common_func.ftdi_i2c_write(self.ftdic, pins, conf_cmd) if status != 0: return status status = common_func.ftdi_i2c_write(self.ftdic, pins, output_data) if status != 0: return status common_func.ftdi_i2c_stop(self.ftdic, pins)
def read_eeprom_seq(self, ep_num): ret_data = [] i = 0 address = 0 add_write = (common.board_eeprom[ep_num]['at24cxx']['addr'] << 1) + 0 add_read = (common.board_eeprom[ep_num]['at24cxx']['addr'] << 1) + 1 pins = common.board_eeprom[ep_num] common_func.ftdi_i2c_init(self.device, pins) common_func.ftdi_i2c_start(self.device, pins) common_func.ftdi_i2c_write(self.device, pins, add_write) if common.board_eeprom[ep_num]['at24cxx']['type']: common_func.ftdi_i2c_write(self.device, pins, address >> 8) common_func.ftdi_i2c_write(self.device, pins, address & 0xFF) else: common_func.ftdi_i2c_write(self.device, pins, address) common_func.ftdi_i2c_start(self.device, pins) common_func.ftdi_i2c_write(self.device, pins, add_read) while i < 10: ret_data.append(common_func.ftdi_i2c_read(self.device, pins, 0)) i += 1 common_func.ftdi_i2c_stop(self.device, pins) if ret_data[0][0] == 0: ret_data.pop(0) self.eeprom_info['CONFIG_FLAG'] = hex( 0x01) if hex(ret_data[0][0] & 0x0F) != hex(0xF) else hex(0x0) self.eeprom_info['BOARD_ID'] = hex(((ret_data[0][0] & 0xFC) >> 2) | ((ret_data[1][0] - 1) << 6)) self.eeprom_info['BOARD_REV'] = hex(ret_data[2][0]) self.eeprom_info['SOC_ID'] = hex(ret_data[3][0]) self.eeprom_info['SOC_REV'] = hex(ret_data[4][0]) self.eeprom_info['PMIC_ID'] = hex(ret_data[5][0]) self.eeprom_info['PMIC_REV'] = hex(ret_data[6][0]) self.eeprom_info['NBR_PWR_RAILS'] = hex(ret_data[7][0]) self.eeprom_info['BOARD_SN'] = hex(ret_data[8][0]) self.display_eeprom_info()
def read_eeprom_i2c(self, pins): out = [] add_write = (pins['at24cxx']['addr'] << 1) + 0 add_read = (pins['at24cxx']['addr'] << 1) + 1 common_func.ftdi_i2c_init(self.device, pins) common_func.ftdi_i2c_start(self.device, pins) common_func.ftdi_i2c_write(self.device, pins, add_write) if pins['at24cxx']['type']: common_func.ftdi_i2c_write(self.device, pins, 0 >> 8) common_func.ftdi_i2c_write(self.device, pins, 0 & 0xFF) else: common_func.ftdi_i2c_write(self.device, pins, 0) common_func.ftdi_i2c_start(self.device, pins) common_func.ftdi_i2c_write(self.device, pins, add_read) for i in range(2): out.append(common_func.ftdi_i2c_read(self.device, pins, 0)) out.append(common_func.ftdi_i2c_read(self.device, pins, 1)) common_func.ftdi_i2c_stop(self.device, pins) return out
def pca6416_get_output(self, pins): """returns the current pins configuration of the PCA""" logging.debug('pca_get_output') add_write = (pins['pca6416'][0] << 1) + 0 add_read = (pins['pca6416'][0] << 1) + 1 conf_cmd = (pins['pca6416'][1]) + 0x02 common_func.ftdi_i2c_start(self.ftdic, pins) status = common_func.ftdi_i2c_write(self.ftdic, pins, add_write) if status != 0: return status status = common_func.ftdi_i2c_write(self.ftdic, pins, conf_cmd) if status != 0: return status common_func.ftdi_i2c_start(self.ftdic, pins) status = common_func.ftdi_i2c_write(self.ftdic, pins, add_read) if status != 0: return status current_out = common_func.ftdi_i2c_read(self.ftdic, pins, 1) common_func.ftdi_i2c_stop(self.ftdic, pins) return current_out[0] & pins['pca6416'][2]