scripts: add support for Sercomm PID
authorMikhail Zhilkin <csharper2005@gmail.com>
Sat, 19 Mar 2022 19:35:51 +0000 (19:35 +0000)
committerHauke Mehrtens <hauke@hauke-m.de>
Sun, 3 Jul 2022 18:25:38 +0000 (20:25 +0200)
This scripts creates Sercomm PID file. PID is necessary for the factory
images creation of variuos Sercomm-based devices (Beeline, Netgear,
Etisalat).

Size: 0x70
+-------+------+---------------+------------------+
| Start | Size | Value* (ASCII)| Description      |
+=======+======+===============+==================+
| 0x0   | 0x8  | 10100         | Hardware version |
+-------+------+---------------+------------------+
| 0x8   | 0x8  | 444245 (DBE)  | Hardware ID      |
+-------+------+---------------+------------------+
| 0x64  | 0x4  | 1002          | Software version |
+-------+------+---------------+------------------+
*for Beeline Smartbox GIGA

Signed-off-by: Mikhail Zhilkin <csharper2005@gmail.com>
scripts/sercomm-pid.py [new file with mode: 0755]

diff --git a/scripts/sercomm-pid.py b/scripts/sercomm-pid.py
new file mode 100755 (executable)
index 0000000..b89977a
--- /dev/null
@@ -0,0 +1,102 @@
+#!/usr/bin/env python3
+"""
+# SPDX-License-Identifier: GPL-2.0-or-later
+#
+# sercomm-pid.py: Creates Sercomm device PID
+#
+# Copyright © 2022 Mikhail Zhilkin
+"""
+
+import argparse
+import binascii
+import struct
+
+PID_SIZE       = 0x70
+PADDING                = 0x30
+PADDING_TAIL   = 0x0
+
+def auto_int(x):
+       return int(x, 0)
+
+def create_pid_file(args):
+       pid_file = open(args.pid_file, "wb")
+       buf = get_pid(args)
+       pid_file.write(buf)
+       pid_file.close()
+
+def get_pid(args):
+       buf = bytearray([PADDING] * PID_SIZE)
+
+       enc = args.hw_version.rjust(8, '0').encode('ascii')
+       struct.pack_into('>8s', buf, 0x0, enc)
+
+       enc = binascii.hexlify(args.hw_id.encode())
+       struct.pack_into('>6s', buf, 0x8, enc)
+
+       enc = args.sw_version.rjust(4, '0').encode('ascii')
+       struct.pack_into('>4s', buf, 0x64, enc)
+
+       if (args.extra_padd_size):
+               tail = bytearray([PADDING_TAIL] * args.extra_padd_size)
+               if (args.extra_padd_byte):
+                       struct.pack_into ('<i', tail, 0x0,
+                                         args.extra_padd_byte)
+               buf += tail
+
+       return buf
+
+def main():
+       global args
+
+       parser = argparse.ArgumentParser(description='This script \
+               generates firmware PID for the Sercomm-based devices')
+
+       parser.add_argument('--hw-version',
+               dest='hw_version',
+               action='store',
+               type=str,
+               help='Sercomm hardware version')
+
+       parser.add_argument('--hw-id',
+               dest='hw_id',
+               action='store',
+               type=str,
+               help='Sercomm hardware ID')
+
+       parser.add_argument('--sw-version',
+               dest='sw_version',
+               action='store',
+               type=str,
+               help='Sercomm software version')
+
+       parser.add_argument('--pid-file',
+               dest='pid_file',
+               action='store',
+               type=str,
+               help='Output PID file')
+
+       parser.add_argument('--extra-padding-size',
+               dest='extra_padd_size',
+               action='store',
+               type=auto_int,
+               help='Size of extra NULL padding at the end of the file \
+                       (optional)')
+
+       parser.add_argument('--extra-padding-first-byte',
+               dest='extra_padd_byte',
+               action='store',
+               type=auto_int,
+               help='First byte of extra padding (optional)')
+
+       args = parser.parse_args()
+
+       if ((not args.hw_version) or
+           (not args.hw_id) or
+           (not args.sw_version) or 
+           (not args.pid_file)):
+               parser.print_help()
+               exit()
+
+       create_pid_file(args)
+
+main()