mirror of
https://github.com/u-boot/u-boot.git
synced 2024-11-25 21:24:21 +08:00
binman: Allow device-tree entries to be compressed
At present the logic skips the blob class' handling of compression, so this is not supported with device tree entries. Fix this. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
c52c9e7da8
commit
6c223fda1e
@ -41,17 +41,26 @@ class Entry_blob(Entry):
|
||||
self.ReadBlobContents()
|
||||
return True
|
||||
|
||||
def ReadBlobContents(self):
|
||||
# We assume the data is small enough to fit into memory. If this
|
||||
# is used for large filesystem image that might not be true.
|
||||
# In that case, Image.BuildImage() could be adjusted to use a
|
||||
# new Entry method which can read in chunks. Then we could copy
|
||||
# the data in chunks and avoid reading it all at once. For now
|
||||
# this seems like an unnecessary complication.
|
||||
indata = tools.ReadFile(self._pathname)
|
||||
def CompressData(self, indata):
|
||||
if self.compress != 'none':
|
||||
self.uncomp_size = len(indata)
|
||||
data = tools.Compress(indata, self.compress)
|
||||
return data
|
||||
|
||||
def ReadBlobContents(self):
|
||||
"""Read blob contents into memory
|
||||
|
||||
This function compresses the data before storing if needed.
|
||||
|
||||
We assume the data is small enough to fit into memory. If this
|
||||
is used for large filesystem image that might not be true.
|
||||
In that case, Image.BuildImage() could be adjusted to use a
|
||||
new Entry method which can read in chunks. Then we could copy
|
||||
the data in chunks and avoid reading it all at once. For now
|
||||
this seems like an unnecessary complication.
|
||||
"""
|
||||
indata = tools.ReadFile(self._pathname)
|
||||
data = self.CompressData(indata)
|
||||
self.SetContents(data)
|
||||
return True
|
||||
|
||||
|
@ -23,11 +23,11 @@ class Entry_blob_dtb(Entry_blob):
|
||||
def ObtainContents(self):
|
||||
"""Get the device-tree from the list held by the 'state' module"""
|
||||
self._filename = self.GetDefaultFilename()
|
||||
self._pathname, data = state.GetFdtContents(self._filename)
|
||||
self.SetContents(data)
|
||||
return True
|
||||
self._pathname, _ = state.GetFdtContents(self._filename)
|
||||
return Entry_blob.ReadBlobContents(self)
|
||||
|
||||
def ProcessContents(self):
|
||||
"""Re-read the DTB contents so that we get any calculated properties"""
|
||||
_, data = state.GetFdtContents(self._filename)
|
||||
_, indata = state.GetFdtContents(self._filename)
|
||||
data = self.CompressData(indata)
|
||||
return self.ProcessContentsUpdate(data)
|
||||
|
@ -2142,6 +2142,24 @@ class TestFunctional(unittest.TestCase):
|
||||
self.assertEqual(U_BOOT_DATA, data[2:2 + len(U_BOOT_DATA)])
|
||||
self.assertEqual(b'aa', data[-2:])
|
||||
|
||||
def testCompressDtb(self):
|
||||
"""Test that compress of device-tree files is supported"""
|
||||
self._CheckLz4()
|
||||
data = self.data = self._DoReadFileRealDtb('124_compress_dtb.dts')
|
||||
self.assertEqual(U_BOOT_DATA, data[:len(U_BOOT_DATA)])
|
||||
comp_data = data[len(U_BOOT_DATA):]
|
||||
orig = self._decompress(comp_data)
|
||||
dtb = fdt.Fdt.FromData(orig)
|
||||
dtb.Scan()
|
||||
props = self._GetPropTree(dtb, ['size', 'uncomp-size'])
|
||||
expected = {
|
||||
'u-boot:size': len(U_BOOT_DATA),
|
||||
'u-boot-dtb:uncomp-size': len(orig),
|
||||
'u-boot-dtb:size': len(comp_data),
|
||||
'size': len(data),
|
||||
}
|
||||
self.assertEqual(expected, props)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
14
tools/binman/test/124_compress_dtb.dts
Normal file
14
tools/binman/test/124_compress_dtb.dts
Normal file
@ -0,0 +1,14 @@
|
||||
/dts-v1/;
|
||||
|
||||
/ {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
binman {
|
||||
u-boot {
|
||||
};
|
||||
u-boot-dtb {
|
||||
compress = "lz4";
|
||||
};
|
||||
};
|
||||
};
|
Loading…
Reference in New Issue
Block a user