#!/usr/bin/python3 # SPDX-License-Identifier: GPL-2.0 import ctypes import os DBC_UID_SIZE = 16 DBC_NONCE_SIZE = 16 DBC_SIG_SIZE = 32 PARAM_GET_FMAX_CAP = (0x3,) PARAM_SET_FMAX_CAP = (0x4,) PARAM_GET_PWR_CAP = (0x5,) PARAM_SET_PWR_CAP = (0x6,) PARAM_GET_GFX_MODE = (0x7,) PARAM_SET_GFX_MODE = (0x8,) PARAM_GET_CURR_TEMP = (0x9,) PARAM_GET_FMAX_MAX = (0xA,) PARAM_GET_FMAX_MIN = (0xB,) PARAM_GET_SOC_PWR_MAX = (0xC,) PARAM_GET_SOC_PWR_MIN = (0xD,) PARAM_GET_SOC_PWR_CUR = (0xE,) DEVICE_NODE = "/dev/dbc" lib = ctypes.CDLL("./dbc_library.so", mode=ctypes.RTLD_GLOBAL) def handle_error(code): raise OSError(code, os.strerror(code)) def get_nonce(device, signature): if not device: raise ValueError("Device required") buf = ctypes.create_string_buffer(DBC_NONCE_SIZE) ret = lib.get_nonce(device.fileno(), ctypes.byref(buf), signature) if ret: handle_error(ret) return buf.value def set_uid(device, new_uid, signature): if not signature: raise ValueError("Signature required") if not new_uid: raise ValueError("UID required") ret = lib.set_uid(device.fileno(), new_uid, signature) if ret: handle_error(ret) return True def process_param(device, message, signature, data=None): if not signature: raise ValueError("Signature required") if type(message) != tuple: raise ValueError("Expected message tuple") arg = ctypes.c_int(data if data else 0) sig = ctypes.create_string_buffer(signature, len(signature)) ret = lib.process_param(device.fileno(), message[0], ctypes.pointer(sig), ctypes.pointer(arg)) if ret: handle_error(ret) return arg.value, sig.value