board-descriptor: port changes from fct

This commit is contained in:
Stefan Eichenberger 2017-07-31 18:22:11 +02:00
parent 348dc29dc8
commit dda6e40605
3 changed files with 25 additions and 21 deletions

View File

@ -63,7 +63,7 @@ def read_descriptors(config):
desc = descriptor.Descriptor(eeprom["path"], desc = descriptor.Descriptor(eeprom["path"],
valid_bd["start"], valid_bd["start"],
valid_bd["size"], valid_bd["size"],
config_table) json.loads(config_table))
desc.read() desc.read()
descs.append(desc) descs.append(desc)
return descs return descs

View File

@ -2,7 +2,8 @@
"tag_list": "/etc/bd/bd.json", "tag_list": "/etc/bd/bd.json",
"eeprom": [ "eeprom": [
{ "path": "/sys/bus/i2c/devices/0-0050/eeprom", "valid_bds": [ { "path": "/sys/bus/i2c/devices/0-0050/eeprom", "valid_bds": [
{"name": "info", "start": 0, "size": 1024}, {"name": "board", "start": 0, "size": 1024},
{"name": "platform", "start": 512, "size": 512},
{"name": "settings", "start": 1536, "size": 512} {"name": "settings", "start": 1536, "size": 512}
] ]
} }

View File

@ -1,5 +1,3 @@
import json
def _array_to_int(data): def _array_to_int(data):
# This one works for python2.7 and python3 # This one works for python2.7 and python3
@ -31,8 +29,6 @@ def _array_to_partition(data):
return part return part
return _array_to_parition_gen(data, 4)
def _array_to_partition64(data): def _array_to_partition64(data):
import codecs import codecs
@ -112,6 +108,7 @@ def _dict_to_partition64(data):
def _not_supported_yet(data): def _not_supported_yet(data):
del data
raise NotImplementedError("Setting this type is not supported yet") raise NotImplementedError("Setting this type is not supported yet")
_type_to_value = { _type_to_value = {
@ -185,12 +182,12 @@ class _BdRaw:
class _BdParsed: class _BdParsed:
def __init__(self, strtype, value): def __init__(self, str_type, value):
self.value = self._value_type(strtype, value) self.value = self._value_type(str_type, value)
def _value_type(self, strtype, value): def _value_type(self, str_type, value):
for key, fun in _string_to_type.items(): for key, fun in _string_to_type.items():
if key == strtype: if key == str_type:
return fun(value) return fun(value)
@ -199,7 +196,10 @@ class Descriptor:
self.file = file self.file = file
self.offset = offset self.offset = offset
self.max_size = max_size self.max_size = max_size
self.config_table = json.loads(config_table) self.config_table = config_table
self.bd_raw = None
self.bd_parsed = None
self.tlv_by_name = None
def _read_raw_bd(self): def _read_raw_bd(self):
fd = open(self.file, "rb") fd = open(self.file, "rb")
@ -218,6 +218,7 @@ class Descriptor:
if tlv.tag == value["id"]: if tlv.tag == value["id"]:
parsed = _BdParsed(value["type"], tlv.value) parsed = _BdParsed(value["type"], tlv.value)
return key, parsed.value return key, parsed.value
return "unknown_" + str(tlv.tag), tlv.value
def _parse_data(self, bdraw): def _parse_data(self, bdraw):
bdparsed = {} bdparsed = {}
@ -228,26 +229,26 @@ class Descriptor:
i = 1 i = 1
while key in bdparsed: while key in bdparsed:
key = name + "_" + str(i) key = name + "_" + str(i)
i = i + 1 i += 1
bdparsed[key] = value bdparsed[key] = value
tlv_by_name[key] = tlv tlv_by_name[key] = tlv
return bdparsed, tlv_by_name return bdparsed, tlv_by_name
def read(self): def read(self):
self.bdraw = self._read_raw_bd() self.bd_raw = self._read_raw_bd()
self.bdparsed, self.tlv_by_name = self._parse_data(self.bdraw) self.bd_parsed, self.tlv_by_name = self._parse_data(self.bd_raw)
def get_list(self): def get_list(self):
return self.bdparsed return self.bd_parsed
def get(self, name): def get(self, name):
name = name.split(".") name = name.split(".")
element = self.bdparsed element = self.bd_parsed
# Search the final element to print # Search the final element to print
# This allows names in the form parition64.flags # This allows names in the form partition64.flags
for key in name: for key in name:
if not key in element: if key not in element:
return None return None
element = element[key] element = element[key]
return element return element
@ -269,6 +270,8 @@ class Descriptor:
return dictionary return dictionary
def _do_set(self, name, value, tlv): def _do_set(self, name, value, tlv):
tlv_type = None
for key, config_item in self.config_table.items(): for key, config_item in self.config_table.items():
if tlv.tag == config_item["id"]: if tlv.tag == config_item["id"]:
tlv_type = config_item["type"] tlv_type = config_item["type"]
@ -282,11 +285,11 @@ class Descriptor:
if not type(name) is list: if not type(name) is list:
self._write_bd(tlv.pos, fun(value), tlv.length) self._write_bd(tlv.pos, fun(value), tlv.length)
else: else:
element = self.bdparsed[name[0]] element = self.bd_parsed[name[0]]
# if we have changed the element it will be our value again # if we have changed the element it will be our value again
value = self._update_dict(element, name[1:], value) value = self._update_dict(element, name[1:], value)
self._write_bd(tlv.pos, fun(value), tlv.length) self._write_bd(tlv.pos, fun(value), tlv.length)
self.bdparsed[name[0]] = value self.bd_parsed[name[0]] = value
def set(self, name, value): def set(self, name, value):
if self.tlv_by_name is None: if self.tlv_by_name is None:
@ -298,7 +301,7 @@ class Descriptor:
if tlv is None: if tlv is None:
return False return False
if not self.bdraw.is_writable: if not self.bd_raw.is_writable:
raise IOError("This operation is not permitted on " raise IOError("This operation is not permitted on "
"this descriptor (ro)") "this descriptor (ro)")