Skip to content

Commit

Permalink
scripts: add support for Sercomm PID
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
csharper2005 authored and hauke committed Jul 3, 2022
1 parent 87092b3 commit 0cb1dc0
Showing 1 changed file with 102 additions and 0 deletions.
102 changes: 102 additions & 0 deletions scripts/sercomm-pid.py
@@ -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()

0 comments on commit 0cb1dc0

Please sign in to comment.