1- """
2- SPDX-License-Identifier: BSD-3-Clause
3- Copyright (c) 2021 Deutsches Elektronen-Synchrotron DESY.
4- See LICENSE.txt for license details.
5- """
1+ ###########################################################################
2+ # ____ _____________ __ __ __ _ _____ ___ _ #
3+ # / __ \/ ____/ ___/\ \/ / | \/ (_)__ _ _ __|_ _/ __| /_\ (R) #
4+ # / / / / __/ \__ \ \ / | |\/| | / _| '_/ _ \| || (__ / _ \ #
5+ # / /_/ / /___ ___/ / / / |_| |_|_\__|_| \___/|_| \___/_/ \_\ #
6+ # /_____/_____//____/ /_/ T E C H N O L O G Y L A B #
7+ # #
8+ # Copyright 2021 Deutsches Elektronen-Synchrotron DESY. #
9+ # SPDX-License-Identifier: BSD-3-Clause #
10+ # #
11+ ###########################################################################
612
713from datetime import datetime
814import sys
915from enum import Enum
10- import hashlib
11-
16+ import hashlib
17+
18+
1219class UpgradeActionType (Enum ):
1320 Backup = 0
1421 Prepare = 1
1522 Upload = 2
1623
1724# name - default value - size
1825
26+
1927UPG_IMG_HEADER = (
20- ( 'signature' , 'PICMGFWU' , 8 ),
21- ( 'format_version' , 0 , 1 ),
22- ( 'device_id' , 0 , 1 ),
23- ( 'manufacturer_id' , 0 , 3 ),
24- ( 'product_id' , 0 , 2 ),
25- ( 'time' , int (datetime .now ().timestamp ()), 4 ),
26- ( 'img_caps' , 0 , 1 ),
27- ( 'components' , 0 , 1 ),
28- ( 'selftest_to' , 0 , 1 ),
29- ( 'rollback_to' , 0 , 1 ),
30- ( 'inaccess_to' , 2 , 1 ),
31- ( 'earliest_compat_rev' , 0 , 2 ),
32- ( 'version_major' , 0 , 1 ),
33- ( 'version_minor' , 0 , 1 ),
34- ( 'version_aux' , 0 , 4 ),
35- ( 'oem_data_len' , 0 , 2 ),
28+ ('signature' , 'PICMGFWU' , 8 ),
29+ ('format_version' , 0 , 1 ),
30+ ('device_id' , 0 , 1 ),
31+ ('manufacturer_id' , 0 , 3 ),
32+ ('product_id' , 0 , 2 ),
33+ ('time' , int (datetime .now ().timestamp ()), 4 ),
34+ ('img_caps' , 0 , 1 ),
35+ ('components' , 0 , 1 ),
36+ ('selftest_to' , 0 , 1 ),
37+ ('rollback_to' , 0 , 1 ),
38+ ('inaccess_to' , 2 , 1 ),
39+ ('earliest_compat_rev' , 0 , 2 ),
40+ ('version_major' , 0 , 1 ),
41+ ('version_minor' , 0 , 1 ),
42+ ('version_aux' , 0 , 4 ),
43+ ('oem_data_len' , 0 , 2 ),
3644)
3745
3846UPG_ACTION_HEADER = (
39- ( 'action_type' , 0 , 1 ),
40- ( 'components' , 0 , 1 ),
47+ ('action_type' , 0 , 1 ),
48+ ('components' , 0 , 1 ),
4149)
4250
4351UPG_ACTION_IMG_INFO = (
44- ( 'version_major' , 0 , 1 ),
45- ( 'version_minor' , 0 , 1 ),
46- ( 'version_aux' , 0 , 4 ),
47- ( 'desc_str' , '' , 21 ),
48- ( 'img_length' , 0 , 4 ),
52+ ('version_major' , 0 , 1 ),
53+ ('version_minor' , 0 , 1 ),
54+ ('version_aux' , 0 , 4 ),
55+ ('desc_str' , '' , 21 ),
56+ ('img_length' , 0 , 4 ),
4957)
5058
59+
5160def fixed_str (s , n ):
5261 s = s [:n ]
5362 s += '\x00 ' * (n - len (s ))
5463 return s .encode ('utf-8' )
5564
65+
5666def zero_cksum (input ):
5767 return int .to_bytes ((0x100 - sum (input )) & 0xff , length = 1 , byteorder = 'little' )
5868
69+
5970def to_bcd (value ):
6071 return int (str (value ), 16 )
6172
73+
6274def encode_generic (table , values ):
6375 result = b''
6476 for name , default , size in table :
@@ -74,25 +86,29 @@ def encode_generic(table, values):
7486 elif isinstance (val , Enum ):
7587 val = val .value
7688 result += int .to_bytes (val , length = size , byteorder = 'little' )
77-
89+
7890 except OverflowError :
79- print (f'{ name } value of { val } doesn\' t fit in { size } bytes' , file = sys .stderr )
91+ print (f'{ name } value of { val } doesn\' t fit in { size } bytes' ,
92+ file = sys .stderr )
8093 sys .exit (- 1 )
8194 except TypeError :
8295 print (f'Couldn\' t encode { name } value of { val } ' , file = sys .stderr )
8396 sys .exit (- 1 )
8497 return result
8598
99+
86100def upg_image_hdr (** kwargs ):
87101 result = encode_generic (UPG_IMG_HEADER , kwargs )
88102 result += zero_cksum (result )
89103 return result
90104
105+
91106def upg_action_hdr (** kwargs ):
92107 result = encode_generic (UPG_ACTION_HEADER , kwargs )
93108 result += zero_cksum (result )
94109 return result
95110
111+
96112def upg_action_img (img_data , ** kwargs ):
97113 result = upg_action_hdr (** {
98114 'action_type' : UpgradeActionType .Upload ,
@@ -105,5 +121,6 @@ def upg_action_img(img_data, **kwargs):
105121 result += img_data
106122 return result
107123
124+
108125def upg_img_hash (hpm_img ):
109126 return hashlib .md5 (hpm_img ).digest ()
0 commit comments