| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- #!/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
|