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 reset_pac(self, pins): """I2C communication for sending reset command to the current PAC""" add_write = (pins['pac'][1] << 1) + 0 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, 0x00) 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 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 write_eeprom_page_i2c(self, ep_num): infos = [] address = 0 for info in self.file_info: if info[0] == 'BOARD_ID': info[4] = int(info[4], 16) data1 = info[4] << 2 if info[4] <= 40 else ( info[4] << 2) & 0xFF data1 |= 0x01 data2 = 1 if info[4] <= 40 else (( (info[4] << 2) & 0xFF00) >> 8) + 1 infos.append(data1) infos.append(data2) else: data = int(info[4], 16) infos.append(data) add_write = (common.board_eeprom[ep_num]['at24cxx']['addr'] << 1) + 0 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) for ind in range(0, len(infos) - 1): common_func.ftdi_i2c_write(self.device, pins, infos[ind]) common_func.ftdi_i2c_stop(self.device, pins) common_func.time.sleep(0.3) self.write_eeprom_i2c(8, infos[-1], ep_num)
def get_temperature(self, pins): out = [] add_read = (pins['sensor'][0] << 1) + 1 common_func.ftdi_i2c_init(self.ftdic, pins) common_func.ftdi_i2c_start(self.ftdic, pins) common_func.ftdi_i2c_write(self.ftdic, pins, add_read) out = common_func.ftdi_i2c_read_buffer(self.ftdic, pins, 2) common_func.ftdi_i2c_stop(self.ftdic, pins) return out
def pca9548_set_channel(self, pins): """I2C communication for setting the channel of the PCA""" logging.debug('pca9548_set_channel') add_write = (pins['pca9548'][1]) << 1 change_channel_cmd = 1 << pins['pca9548'][0] 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, change_channel_cmd) common_func.ftdi_i2c_stop(self.ftdic, pins)
def write_eeprom_i2c(self, address, data, ep_num): add_write = (common.board_eeprom[ep_num]['at24cxx']['addr'] << 1) + 0 pins = common.board_eeprom[ep_num] 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_write(self.device, pins, data) common_func.ftdi_i2c_stop(self.device, pins)
def get_eeprom_board(self, pins, board_id): """checks if the eeprom is present on the current board""" self.ftdic = common_func.ftdi_open(board_id, 1) common_func.ftdic_setbitmode(self.ftdic, 0x0, 0x00) common_func.ftdic_setbitmode(self.ftdic, 0x0, 0x02) common_func.ftdi_i2c_init(self.ftdic, pins) add_write = (pins['at24cxx'][0] << 1) + 0 common_func.ftdi_i2c_start(self.ftdic, pins) if common_func.ftdi_i2c_write(self.ftdic, pins, add_write): common_func.ftdi_i2c_stop(self.ftdic, pins) self.ftdic.close() return 1 else: common_func.ftdi_i2c_stop(self.ftdic, pins) self.ftdic.close() return 0
def pac_set_bipolar(self): self.params['bipolar'] = not self.params['bipolar'] FTDI_LOCK.acquire() for index, rail in enumerate(self.board_mapping_power): if rail['pac'][2] != self.board_mapping_power[index - 1]['pac'][2]: self.pca9548_set_channel(rail) add_write = (rail['pac'][1] << 1) common_func.ftdi_i2c_start(self.ftdic, rail) common_func.ftdi_i2c_write(self.ftdic, rail, add_write) common_func.ftdi_i2c_write(self.ftdic, rail, 0x1D) if self.params['bipolar']: common_func.ftdi_i2c_write(self.ftdic, rail, 0xF0) else: common_func.ftdi_i2c_write(self.ftdic, rail, 0x00) common_func.ftdi_i2c_stop(self.ftdic, rail) FTDI_LOCK.release()
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]
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