| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- #!/usr/bin/python3
- # SPDX-License-Identifier: GPL-2.0
- import argparse
- import binascii
- import os
- import errno
- from dbc import *
- ERRORS = {
- errno.EACCES: "Access is denied",
- errno.E2BIG: "Excess data provided",
- errno.EINVAL: "Bad parameters",
- errno.EAGAIN: "Bad state",
- errno.ENOENT: "Not implemented or message failure",
- errno.EBUSY: "Busy",
- errno.ENFILE: "Overflow",
- errno.EPERM: "Signature invalid",
- }
- messages = {
- "get-fmax-cap": PARAM_GET_FMAX_CAP,
- "set-fmax-cap": PARAM_SET_FMAX_CAP,
- "get-power-cap": PARAM_GET_PWR_CAP,
- "set-power-cap": PARAM_SET_PWR_CAP,
- "get-graphics-mode": PARAM_GET_GFX_MODE,
- "set-graphics-mode": PARAM_SET_GFX_MODE,
- "get-current-temp": PARAM_GET_CURR_TEMP,
- "get-fmax-max": PARAM_GET_FMAX_MAX,
- "get-fmax-min": PARAM_GET_FMAX_MIN,
- "get-soc-power-max": PARAM_GET_SOC_PWR_MAX,
- "get-soc-power-min": PARAM_GET_SOC_PWR_MIN,
- "get-soc-power-cur": PARAM_GET_SOC_PWR_CUR,
- }
- def _pretty_buffer(ba):
- return str(binascii.hexlify(ba, " "))
- def parse_args():
- parser = argparse.ArgumentParser(
- description="Dynamic Boost control command line interface"
- )
- parser.add_argument(
- "command",
- choices=["get-nonce", "get-param", "set-param", "set-uid"],
- help="Command to send",
- )
- parser.add_argument("--device", default="/dev/dbc", help="Device to operate")
- parser.add_argument("--signature", help="File containing signature for command")
- parser.add_argument("--message", choices=messages.keys(), help="Message index")
- parser.add_argument("--data", help="Argument to pass to message")
- parser.add_argument("--uid", help="File containing UID to pass")
- return parser.parse_args()
- def pretty_error(code):
- if code in ERRORS:
- print(ERRORS[code])
- else:
- print("failed with return code %d" % code)
- if __name__ == "__main__":
- args = parse_args()
- data = 0
- sig = None
- uid = None
- if not os.path.exists(args.device):
- raise IOError("Missing device {device}".format(device=args.device))
- if args.signature:
- if not os.path.exists(args.signature):
- raise ValueError("Invalid signature file %s" % args.signature)
- with open(args.signature, "rb") as f:
- sig = f.read()
- if len(sig) != DBC_SIG_SIZE:
- raise ValueError(
- "Invalid signature length %d (expected %d)" % (len(sig), DBC_SIG_SIZE)
- )
- if args.uid:
- if not os.path.exists(args.uid):
- raise ValueError("Invalid uid file %s" % args.uid)
- with open(args.uid, "rb") as f:
- uid = f.read()
- if len(uid) != DBC_UID_SIZE:
- raise ValueError(
- "Invalid UID length %d (expected %d)" % (len(uid), DBC_UID_SIZE)
- )
- if args.data:
- try:
- data = int(args.data, 10)
- except ValueError:
- data = int(args.data, 16)
- with open(args.device) as d:
- if args.command == "get-nonce":
- try:
- nonce = get_nonce(d, sig)
- print("Nonce: %s" % _pretty_buffer(bytes(nonce)))
- except OSError as e:
- pretty_error(e.errno)
- elif args.command == "set-uid":
- try:
- result = set_uid(d, uid, sig)
- if result:
- print("Set UID")
- except OSError as e:
- pretty_error(e.errno)
- elif args.command == "get-param":
- if not args.message or args.message.startswith("set"):
- raise ValueError("Invalid message %s" % args.message)
- try:
- param, signature = process_param(d, messages[args.message], sig)
- print(
- "Parameter: {par}, response signature {sig}".format(
- par=param,
- sig=_pretty_buffer(bytes(signature)),
- )
- )
- except OSError as e:
- pretty_error(e.errno)
- elif args.command == "set-param":
- if not args.message or args.message.startswith("get"):
- raise ValueError("Invalid message %s" % args.message)
- try:
- param, signature = process_param(d, messages[args.message], sig, data)
- print(
- "Parameter: {par}, response signature {sig}".format(
- par=param,
- sig=_pretty_buffer(bytes(signature)),
- )
- )
- except OSError as e:
- pretty_error(e.errno)
|