// SPDX-License-Identifier: BSD-2-Clause /* * Copyright (c) 2021 Rockchip Electronics Co. Ltd. */ #include #include #include "rktest_handle.h" #include "../rk_public_api/rk_oem_otp_api.h" TEE_Result handle_otp_read(void) { TEE_Result res = TEE_SUCCESS; /* * RK356x platform require the address and length of OTP must be * an integral multiple of 2 integer(half word). */ uint32_t read_len = 2; uint32_t read_offset = 0; uint8_t *read_data; //The memory used to invoke internal TA MUST BE secure memory, instead of CA memory. read_data = TEE_Malloc(read_len, 0); if (!read_data) { EMSG("Malloc context memory FAILED!"); return TEE_ERROR_OUT_OF_MEMORY; } res = rk_otp_read(read_offset, read_data, read_len); if (res != TEE_SUCCESS) EMSG("rk_otp_read failed with code 0x%x", res); else IMSG("rk_otp_read succes with data: 0x%x, 0x%x", *read_data, *(read_data + 1)); TEE_Free(read_data); return res; } TEE_Result handle_otp_write(void) { TEE_Result res = TEE_SUCCESS; /* * RK356x platform require the address and length of OTP must be * an integral multiple of 2 integer(half word). */ uint32_t write_len = 2; uint8_t write_data[2] = {0xaa, 0xaa}; uint32_t write_offset = 0; res = rk_otp_write(write_offset, write_data, write_len); if (res != TEE_SUCCESS) { EMSG("rk_otp_write failed with code 0x%x", res); return res; } IMSG("rk_otp_write succes with data: 0x%x, 0x%x", write_data[0], write_data[1]); return res; } TEE_Result handle_otp_size(void) { TEE_Result res = TEE_SUCCESS; uint32_t otp_size = 0; res = rk_otp_size(&otp_size); if (res != TEE_SUCCESS) { EMSG("rk_otp_size failed with code 0x%x", res); return res; } IMSG("The oem otp size is %d byte.", otp_size); return res; }