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