1f40d42f1SMario Limonciello#!/usr/bin/python3 2f40d42f1SMario Limonciello# SPDX-License-Identifier: GPL-2.0 3f40d42f1SMario Limonciello 4f40d42f1SMario Limoncielloimport ctypes 5f40d42f1SMario Limoncielloimport os 6f40d42f1SMario Limonciello 7f40d42f1SMario LimoncielloDBC_UID_SIZE = 16 8f40d42f1SMario LimoncielloDBC_NONCE_SIZE = 16 9f40d42f1SMario LimoncielloDBC_SIG_SIZE = 32 10f40d42f1SMario Limonciello 11f40d42f1SMario LimoncielloPARAM_GET_FMAX_CAP = (0x3,) 12f40d42f1SMario LimoncielloPARAM_SET_FMAX_CAP = (0x4,) 13f40d42f1SMario LimoncielloPARAM_GET_PWR_CAP = (0x5,) 14f40d42f1SMario LimoncielloPARAM_SET_PWR_CAP = (0x6,) 15f40d42f1SMario LimoncielloPARAM_GET_GFX_MODE = (0x7,) 16f40d42f1SMario LimoncielloPARAM_SET_GFX_MODE = (0x8,) 17f40d42f1SMario LimoncielloPARAM_GET_CURR_TEMP = (0x9,) 18f40d42f1SMario LimoncielloPARAM_GET_FMAX_MAX = (0xA,) 19f40d42f1SMario LimoncielloPARAM_GET_FMAX_MIN = (0xB,) 20f40d42f1SMario LimoncielloPARAM_GET_SOC_PWR_MAX = (0xC,) 21f40d42f1SMario LimoncielloPARAM_GET_SOC_PWR_MIN = (0xD,) 22f40d42f1SMario LimoncielloPARAM_GET_SOC_PWR_CUR = (0xE,) 23f40d42f1SMario Limonciello 24f40d42f1SMario LimoncielloDEVICE_NODE = "/dev/dbc" 25f40d42f1SMario Limonciello 26f40d42f1SMario Limonciellolib = ctypes.CDLL("./dbc_library.so", mode=ctypes.RTLD_GLOBAL) 27f40d42f1SMario Limonciello 28f40d42f1SMario Limonciello 29f40d42f1SMario Limonciellodef handle_error(code): 303b1ea906SMario Limonciello raise OSError(code, os.strerror(code)) 31f40d42f1SMario Limonciello 32f40d42f1SMario Limonciello 33f40d42f1SMario Limonciellodef get_nonce(device, signature): 34f40d42f1SMario Limonciello if not device: 35f40d42f1SMario Limonciello raise ValueError("Device required") 36f40d42f1SMario Limonciello buf = ctypes.create_string_buffer(DBC_NONCE_SIZE) 37f40d42f1SMario Limonciello ret = lib.get_nonce(device.fileno(), ctypes.byref(buf), signature) 38f40d42f1SMario Limonciello if ret: 39f40d42f1SMario Limonciello handle_error(ret) 40f40d42f1SMario Limonciello return buf.value 41f40d42f1SMario Limonciello 42f40d42f1SMario Limonciello 43f40d42f1SMario Limonciellodef set_uid(device, new_uid, signature): 44f40d42f1SMario Limonciello if not signature: 45f40d42f1SMario Limonciello raise ValueError("Signature required") 46f40d42f1SMario Limonciello if not new_uid: 47f40d42f1SMario Limonciello raise ValueError("UID required") 48f40d42f1SMario Limonciello ret = lib.set_uid(device.fileno(), new_uid, signature) 49f40d42f1SMario Limonciello if ret: 50f40d42f1SMario Limonciello handle_error(ret) 51f40d42f1SMario Limonciello return True 52f40d42f1SMario Limonciello 53f40d42f1SMario Limonciello 54f40d42f1SMario Limonciellodef process_param(device, message, signature, data=None): 55f40d42f1SMario Limonciello if not signature: 56f40d42f1SMario Limonciello raise ValueError("Signature required") 57f40d42f1SMario Limonciello if type(message) != tuple: 58f40d42f1SMario Limonciello raise ValueError("Expected message tuple") 59f40d42f1SMario Limonciello arg = ctypes.c_int(data if data else 0) 60*e2866646SMario Limonciello sig = ctypes.create_string_buffer(signature, len(signature)) 61*e2866646SMario Limonciello ret = lib.process_param(device.fileno(), message[0], ctypes.pointer(sig), ctypes.pointer(arg)) 62f40d42f1SMario Limonciello if ret: 63f40d42f1SMario Limonciello handle_error(ret) 64*e2866646SMario Limonciello return arg.value, sig.value 65