blob: 1435cf0ffa3c70f098b20e04abce4403df015f7d [file] [log] [blame]
#!/usr/bin/env python3
# pylint: disable=invalid-name,missing-docstring
#
# Copyright 2022 Richard Hughes <richard@hughsie.com>
#
# SPDX-License-Identifier: LGPL-2.1-or-later
#
# pylint: disable=consider-using-f-string
import sys
import argparse
import configparser
import base64
from typing import List
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument(
"-b",
"--bufsz",
type=int,
help="Buffer size in bytes",
)
parser.add_argument("-i", "--instance-id", type=str, help="Device instance ID")
parser.add_argument("filename", action="store", type=str, help="Quirk filename")
args = parser.parse_args()
config = configparser.ConfigParser()
config.optionxform = str
try:
config.read(args.filename)
except configparser.MissingSectionHeaderError:
print("Not a quirk file")
sys.exit(1)
# fall back to the default if there is only one device in the quirk file
if not args.instance_id:
sections = config.sections()
if len(sections) != 1:
print("Multiple devices found, use --instance-id to choose between:")
for section in sections:
print(f" • {section}")
sys.exit(1)
args.instance_id = sections[0]
# create the smallest kv store possible
lines: List[str] = []
try:
for key in config[args.instance_id]:
if key in ["Inhibit", "Issue"]:
print(f"WARNING: skipping key {key}")
continue
value = config[args.instance_id][key]
lines.append(f"{key}={value}")
except KeyError:
print(f"No {args.instance_id} section")
sys.exit(1)
# pad to the buffer size
buf: bytes = "\n".join(lines).encode()
if args.bufsz:
if len(buf) > args.bufsz:
print("Quirk data is larger than bufsz")
sys.exit(1)
buf = buf.ljust(args.bufsz, b"\0")
# success
print(f"DS20 descriptor control transfer data ({len(buf)} Bytes):")
print(", ".join([f"0x{val:02x}" for val in list(buf)]))
print(base64.b64encode(buf).decode())