# Copyright (c) 2014, 2020 The Linux Foundation. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 and # only version 2 as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. from datetime import datetime from print_out import print_out_str from ramparse import VERSION from time import strftime class PmicRegData(): def __init__(self, regoffs, val): self.regoffs = regoffs self.val = val class PmicRegDump(): def __init__(self, start, end): self.start_addr = start self.end_addr = end self.num_entries = 0 self.pmic_list = {} def parse_all_regs(self, ram_dump): if (self.start_addr + 4) > self.end_addr: return False # Read number of entries self.num_entries = ram_dump.read_u32(self.start_addr, False) self.start_addr += 4 print_out_str('Dumping {0} PMIC registers'.format(self.num_entries)) for i in range(0, self.num_entries): if (self.start_addr + 12) > self.end_addr: return False # Read slave ID slaveid = ram_dump.read_u32(self.start_addr, False) self.start_addr += 4; # Read register offset regoffs = 0xFFFF & (ram_dump.read_u32(self.start_addr, False)) self.start_addr += 4; # Read register value val = ram_dump.read_u32(self.start_addr, False) self.start_addr += 4; if slaveid > 0xf: print_out_str("Maximum value of slave id is 0xF but found {0:x}. Aborting PMIC dump!".format(slaveid)) return False; pmic_num = slaveid // 2; if pmic_num not in self.pmic_list: pmic_reg_list = [] self.pmic_list[pmic_num] = pmic_reg_list else: pmic_reg_list = self.pmic_list[pmic_num] # For odd slave id prepend 0x10000 to offset if slaveid % 2 != 0: regoffs |= 0x10000 regData = PmicRegData(regoffs, val) pmic_reg_list.append(regData) return True def dump_all_regs(self, ram_dump): outfile = ram_dump.open_file('pmicdump.xml') outfile.write('\n') outfile.write('\t{0}\n'.format(datetime.now().strftime('%d. %b %Y, %H:%M:%S'))) outfile.write('\tLinux Ram Dump Parser Version {0}\n'.format(VERSION)) outfile.write('\t\n'.format(ram_dump.hw_id)) for pmic in self.pmic_list.iterkeys(): dump_pmic_reg_list = self.pmic_list[pmic] if not dump_pmic_reg_list: continue outfile.write('\t\t\n') outfile.write('\t\t\t\n'.format(pmic, (pmic+1))) for reg_data in dump_pmic_reg_list: outfile.write('\t\t\t\n'.format(reg_data.regoffs, reg_data.val)) outfile.write('\t\t\n') outfile.write('\t\n') outfile.write('\n') outfile.close()