| 1 | |
| 2 | |
| 3 |
|
| 4 | import ctypes
|
| 5 | import os
|
| 6 |
|
| 7 | DBC_UID_SIZE = 16
|
| 8 | DBC_NONCE_SIZE = 16
|
| 9 | DBC_SIG_SIZE = 32
|
| 10 |
|
| 11 | PARAM_GET_FMAX_CAP = (0x3,)
|
| 12 | PARAM_SET_FMAX_CAP = (0x4,)
|
| 13 | PARAM_GET_PWR_CAP = (0x5,)
|
| 14 | PARAM_SET_PWR_CAP = (0x6,)
|
| 15 | PARAM_GET_GFX_MODE = (0x7,)
|
| 16 | PARAM_SET_GFX_MODE = (0x8,)
|
| 17 | PARAM_GET_CURR_TEMP = (0x9,)
|
| 18 | PARAM_GET_FMAX_MAX = (0xA,)
|
| 19 | PARAM_GET_FMAX_MIN = (0xB,)
|
| 20 | PARAM_GET_SOC_PWR_MAX = (0xC,)
|
| 21 | PARAM_GET_SOC_PWR_MIN = (0xD,)
|
| 22 | PARAM_GET_SOC_PWR_CUR = (0xE,)
|
| 23 |
|
| 24 | DEVICE_NODE = "/dev/dbc"
|
| 25 |
|
| 26 | lib = ctypes.CDLL("./dbc_library.so", mode=ctypes.RTLD_GLOBAL)
|
| 27 |
|
| 28 |
|
| 29 | def handle_error(code):
|
| 30 | raise OSError(code, os.strerror(code))
|
| 31 |
|
| 32 |
|
| 33 | def get_nonce(device, signature):
|
| 34 | if not device:
|
| 35 | raise ValueError("Device required")
|
| 36 | buf = ctypes.create_string_buffer(DBC_NONCE_SIZE)
|
| 37 | ret = lib.get_nonce(device.fileno(), ctypes.byref(buf), signature)
|
| 38 | if ret:
|
| 39 | handle_error(ret)
|
| 40 | return buf.value
|
| 41 |
|
| 42 |
|
| 43 | def set_uid(device, new_uid, signature):
|
| 44 | if not signature:
|
| 45 | raise ValueError("Signature required")
|
| 46 | if not new_uid:
|
| 47 | raise ValueError("UID required")
|
| 48 | ret = lib.set_uid(device.fileno(), new_uid, signature)
|
| 49 | if ret:
|
| 50 | handle_error(ret)
|
| 51 | return True
|
| 52 |
|
| 53 |
|
| 54 | def process_param(device, message, signature, data=None):
|
| 55 | if not signature:
|
| 56 | raise ValueError("Signature required")
|
| 57 | if type(message) != tuple:
|
| 58 | raise ValueError("Expected message tuple")
|
| 59 | arg = ctypes.c_int(data if data else 0)
|
| 60 | sig = ctypes.create_string_buffer(signature, len(signature))
|
| 61 | ret = lib.process_param(device.fileno(), message[0], ctypes.pointer(sig), ctypes.pointer(arg))
|
| 62 | if ret:
|
| 63 | handle_error(ret)
|
| 64 | return arg.value, sig.value
|