1# Copyright (C) 2020-2022 The opuntiaOS Project Authors.
2# + Contributed by Nikita Melekhin <nimelehin@gmail.com>
3#
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6
7from Generator.IRManager import IRManager
8from ABI.Structs import *
9from ABI.Translation import *
10
11
12class BinWriter():
13 def __init__(self, irmng, output_file):
14 self.irmng = irmng
15 self.output_file = output_file
16
17 self.res_binarr = bytearray()
18 self.header_binarr = bytearray()
19 self.devs_binarr = bytearray()
20 self.names_binarr = bytearray()
21
22 def build_header(self):
23 count_of_devs = len(self.irmng.device_list())
24
25 result = {
26 "signature": DEVTREE_HEADER_SIGNATURE,
27 "revision": 1,
28 "flags": 0,
29 "entries_count": count_of_devs,
30 "name_list_offset": DEVTREE_HEADER.sizeof() + len(self.devs_binarr),
31 }
32
33 self.header_binarr = DEVTREE_HEADER.build(result)
34
35 def build_dev(self, dev):
36 result = {
37 "type": 0,
38 "flags": 0,
39 "paddr": 0,
40 "rel_name_offset": len(self.names_binarr),
41 }
42
43 if "type" in dev:
44 result["type"] = Translator.entry_type(dev["type"])
45
46 if "flags" in dev:
47 result["flags"] = Translator.entry_flags(dev["flags"])
48
49 if "mem" in dev:
50 devmem = dev["mem"]
51 if "base" in devmem:
52 result["paddr"] = Translator.number(devmem["base"])
53
54 self.devs_binarr += DEVTREE_ENTRY.build(result)
55 self.names_binarr += bytearray((map(ord,
56 dev["name"]))) + bytearray([0])
57
58 def build_dev_list(self):
59 self.devs_binarr = bytearray()
60 self.names_binarr = bytearray()
61 for dev in self.irmng.device_list():
62 self.build_dev(dev)
63
64 def build_binarr(self):
65 self.res_binarr = bytearray()
66 self.header_binarr = bytearray()
67 self.devs_binarr = bytearray()
68 self.names_binarr = bytearray()
69
70 self.build_dev_list()
71 self.build_header()
72
73 self.res_binarr = self.header_binarr + self.devs_binarr + self.names_binarr
74 # print("Header", self.header_binarr)
75 # print("Devs", self.devs_binarr)
76 # print("Names", self.names_binarr)
77 # print("Res", self.res_binarr)
78
79 def write_to_file(self):
80 binfile = open(self.output_file, "wb")
81 binfile.write(bytes(self.res_binarr))
82 binfile.close()
83
84 def process(self):
85 if len(self.res_binarr) == 0:
86 self.build_binarr()
87
88 self.write_to_file()