1*ec564b47SSimon Glass#!/usr/bin/python 2*ec564b47SSimon Glass# 3*ec564b47SSimon Glass# Copyright (C) 2016 Google, Inc 4*ec564b47SSimon Glass# Written by Simon Glass <sjg@chromium.org> 5*ec564b47SSimon Glass# 6*ec564b47SSimon Glass# SPDX-License-Identifier: GPL-2.0+ 7*ec564b47SSimon Glass# 8*ec564b47SSimon Glass 9*ec564b47SSimon Glassimport struct 10*ec564b47SSimon Glass 11*ec564b47SSimon Glass# A list of types we support 12*ec564b47SSimon Glass(TYPE_BYTE, TYPE_INT, TYPE_STRING, TYPE_BOOL) = range(4) 13*ec564b47SSimon Glass 14*ec564b47SSimon Glassdef BytesToValue(bytes): 15*ec564b47SSimon Glass """Converts a string of bytes into a type and value 16*ec564b47SSimon Glass 17*ec564b47SSimon Glass Args: 18*ec564b47SSimon Glass A string containing bytes 19*ec564b47SSimon Glass 20*ec564b47SSimon Glass Return: 21*ec564b47SSimon Glass A tuple: 22*ec564b47SSimon Glass Type of data 23*ec564b47SSimon Glass Data, either a single element or a list of elements. Each element 24*ec564b47SSimon Glass is one of: 25*ec564b47SSimon Glass TYPE_STRING: string value from the property 26*ec564b47SSimon Glass TYPE_INT: a byte-swapped integer stored as a 4-byte string 27*ec564b47SSimon Glass TYPE_BYTE: a byte stored as a single-byte string 28*ec564b47SSimon Glass """ 29*ec564b47SSimon Glass size = len(bytes) 30*ec564b47SSimon Glass strings = bytes.split('\0') 31*ec564b47SSimon Glass is_string = True 32*ec564b47SSimon Glass count = len(strings) - 1 33*ec564b47SSimon Glass if count > 0 and not strings[-1]: 34*ec564b47SSimon Glass for string in strings[:-1]: 35*ec564b47SSimon Glass if not string: 36*ec564b47SSimon Glass is_string = False 37*ec564b47SSimon Glass break 38*ec564b47SSimon Glass for ch in string: 39*ec564b47SSimon Glass if ch < ' ' or ch > '~': 40*ec564b47SSimon Glass is_string = False 41*ec564b47SSimon Glass break 42*ec564b47SSimon Glass else: 43*ec564b47SSimon Glass is_string = False 44*ec564b47SSimon Glass if is_string: 45*ec564b47SSimon Glass if count == 1: 46*ec564b47SSimon Glass return TYPE_STRING, strings[0] 47*ec564b47SSimon Glass else: 48*ec564b47SSimon Glass return TYPE_STRING, strings[:-1] 49*ec564b47SSimon Glass if size % 4: 50*ec564b47SSimon Glass if size == 1: 51*ec564b47SSimon Glass return TYPE_BYTE, bytes[0] 52*ec564b47SSimon Glass else: 53*ec564b47SSimon Glass return TYPE_BYTE, list(bytes) 54*ec564b47SSimon Glass val = [] 55*ec564b47SSimon Glass for i in range(0, size, 4): 56*ec564b47SSimon Glass val.append(bytes[i:i + 4]) 57*ec564b47SSimon Glass if size == 4: 58*ec564b47SSimon Glass return TYPE_INT, val[0] 59*ec564b47SSimon Glass else: 60*ec564b47SSimon Glass return TYPE_INT, val 61*ec564b47SSimon Glass 62*ec564b47SSimon Glassdef GetEmpty(type): 63*ec564b47SSimon Glass """Get an empty / zero value of the given type 64*ec564b47SSimon Glass 65*ec564b47SSimon Glass Returns: 66*ec564b47SSimon Glass A single value of the given type 67*ec564b47SSimon Glass """ 68*ec564b47SSimon Glass if type == TYPE_BYTE: 69*ec564b47SSimon Glass return chr(0) 70*ec564b47SSimon Glass elif type == TYPE_INT: 71*ec564b47SSimon Glass return struct.pack('<I', 0); 72*ec564b47SSimon Glass elif type == TYPE_STRING: 73*ec564b47SSimon Glass return '' 74*ec564b47SSimon Glass else: 75*ec564b47SSimon Glass return True 76*ec564b47SSimon Glass 77*ec564b47SSimon Glassdef fdt32_to_cpu(val): 78*ec564b47SSimon Glass """Convert a device tree cell to an integer 79*ec564b47SSimon Glass 80*ec564b47SSimon Glass Args: 81*ec564b47SSimon Glass Value to convert (4-character string representing the cell value) 82*ec564b47SSimon Glass 83*ec564b47SSimon Glass Return: 84*ec564b47SSimon Glass A native-endian integer value 85*ec564b47SSimon Glass """ 86*ec564b47SSimon Glass return struct.unpack(">I", val)[0] 87