220 lines
7.8 KiB
C
220 lines
7.8 KiB
C
/*
|
|
* Copyright (c) XMEDIA. All rights reserved.
|
|
*/
|
|
|
|
#ifndef __XMEDIA_OTP_H__
|
|
#define __XMEDIA_OTP_H__
|
|
|
|
#include "xmedia_type.h"
|
|
#include "xmedia_errcode.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define SHA256_BYTE_LEN 32
|
|
#define AES256_KEY_BYTE_LEN 32
|
|
#define OTP_USER_DATA_LEN_MAX 32 // 单位:word,用户自定义区共1Kbit
|
|
|
|
typedef enum {
|
|
XMEDIA_OTP_AES256_KEY0 = 0x0,
|
|
XMEDIA_OTP_AES256_KEY1,
|
|
XMEDIA_OTP_AES256_KEY2,
|
|
XMEDIA_OTP_AES256_KEY3,
|
|
XMEDIA_OTP_AES256_KEY_MAX
|
|
} xmedia_otp_aes_key_index;
|
|
|
|
typedef enum {
|
|
XMEDIA_OTP_UART_BURN_CLOSE = 0x0,
|
|
XMEDIA_OTP_UART_BURN_REOPEN,
|
|
XMEDIA_OTP_UART_BURN_MODE_MAX
|
|
} xmedia_otp_uart_burn_mode;
|
|
|
|
typedef enum {
|
|
XMEDIA_OTP_FMC_FREQ_50MHZ = 0x0,
|
|
XMEDIA_OTP_FMC_FREQ_75MHZ,
|
|
XMEDIA_OTP_FMC_FREQ_12MHZ,
|
|
XMEDIA_OTP_FMC_FREQ_MAX
|
|
} xmedia_otp_fmc_freq;
|
|
|
|
/*
|
|
* 函数功能:OTP模块初始化
|
|
* 函数参数:
|
|
* 无
|
|
* 返回值:
|
|
* XMEDIA_SUCCESS - 函数执行成功
|
|
* XMEDIA_ERRCODE_OPEN_FAILED - 获取文件描述符失败
|
|
*/
|
|
xmedia_s32 xmedia_otp_init(xmedia_void);
|
|
|
|
/*
|
|
* 函数功能:OTP模块去初始化
|
|
* 函数参数:
|
|
* 无
|
|
* 返回值:
|
|
* XMEDIA_SUCCESS - 函数执行成功
|
|
* XMEDIA_ERRCODE_OPEN_FAILED - 获取文件描述符失败
|
|
* XMEDIA_ERRCODE_CLOSE_FAILED - 关闭文件描述符失败
|
|
*/
|
|
xmedia_s32 xmedia_otp_exit(xmedia_void);
|
|
|
|
/*
|
|
* 函数功能:使能otp烧写功能,使能后,其余接口会操作真实的otp区域;未使能时,其余接口操作的是模拟otp区域
|
|
* 函数参数:
|
|
* 无
|
|
* 返回值:
|
|
* XMEDIA_SUCCESS - 函数执行成功
|
|
* XMEDIA_ERRCODE_NOT_INIT - 未调用xmedia_otp_init接口进行初始化
|
|
*/
|
|
xmedia_s32 xmedia_otp_program_enable(xmedia_void);
|
|
|
|
/*
|
|
* 函数功能:使能安全启动
|
|
* 函数参数:
|
|
* 无
|
|
* 返回值:
|
|
* XMEDIA_SUCCESS - 函数执行成功
|
|
* XMEDIA_ERRCODE_NOT_INIT - 未调用xmedia_otp_init接口进行初始化
|
|
* XMEDIA_ERRCODE_NOT_PERMITTED - otp位已配置过并锁定,无法更改
|
|
*
|
|
* 注:
|
|
* 使能安全启动前,必须先调用xmedia_otp_root_key_sha256_set接口!
|
|
*/
|
|
xmedia_s32 xmedia_otp_secure_boot_enable(xmedia_void);
|
|
|
|
/*
|
|
* 函数功能:使能DDR加扰
|
|
* 函数参数:
|
|
* 无
|
|
* 返回值:
|
|
* XMEDIA_SUCCESS - 函数执行成功
|
|
* XMEDIA_ERRCODE_NOT_INIT - 未调用xmedia_otp_init接口进行初始化
|
|
* XMEDIA_ERRCODE_NOT_PERMITTED - otp位已配置过并锁定,无法更改
|
|
*/
|
|
xmedia_s32 xmedia_otp_ddr_ca_enable(xmedia_void);
|
|
|
|
/*
|
|
* 函数功能:关闭jtag接口
|
|
* 函数参数:
|
|
* 无
|
|
* 返回值:
|
|
* XMEDIA_SUCCESS - 函数执行成功
|
|
* XMEDIA_ERRCODE_NOT_INIT - 未调用xmedia_otp_init接口进行初始化
|
|
* XMEDIA_ERRCODE_NOT_PERMITTED - otp位已配置过并锁定,无法更改
|
|
*/
|
|
xmedia_s32 xmedia_otp_jtag_disable(xmedia_void);
|
|
|
|
/*
|
|
* 函数功能:设置spi nand flash启动模式为4线
|
|
* 函数参数:
|
|
* 无
|
|
* 返回值:
|
|
* XMEDIA_SUCCESS - 函数执行成功
|
|
* XMEDIA_ERRCODE_NOT_INIT - 未调用xmedia_otp_init接口进行初始化
|
|
* XMEDIA_ERRCODE_NOT_PERMITTED - otp位已配置过并锁定,无法更改
|
|
*
|
|
* 注:
|
|
* 默认为1线
|
|
*/
|
|
xmedia_s32 xmedia_otp_spi_nand_mode_set(xmedia_void);
|
|
|
|
/*
|
|
* 函数功能:关闭、打开UART镜像烧写
|
|
* 函数参数:
|
|
* burn_mode - 输入参数,关闭或打开UART镜像烧写
|
|
* 返回值:
|
|
* XMEDIA_SUCCESS - 函数执行成功
|
|
* XMEDIA_ERRCODE_NOT_INIT - 未调用xmedia_otp_init接口进行初始化
|
|
* XMEDIA_ERRCODE_NOT_PERMITTED - otp位已配置过并锁定,无法更改
|
|
*
|
|
* 注:
|
|
* 默认UART可以进行镜像的烧写,关闭UART烧写后可以再次打开UART烧写,再次打开UART烧写后不能再更改
|
|
*/
|
|
xmedia_s32 xmedia_otp_uart_burn_mode_sel(xmedia_otp_uart_burn_mode burn_mode);
|
|
|
|
/*
|
|
* 函数功能:设置bootrom阶段spi nor、spi nand的时钟频率
|
|
* 函数参数:
|
|
* frequency - 输入参数
|
|
* 返回值:
|
|
* XMEDIA_SUCCESS - 函数执行成功
|
|
* XMEDIA_ERRCODE_NOT_INIT - 未调用xmedia_otp_init接口进行初始化
|
|
* XMEDIA_ERRCODE_NOT_PERMITTED - otp位已配置过并锁定,无法更改
|
|
*
|
|
* 注:
|
|
* 默认时钟频率为12MHz,更改顺序只支持:默认频率->50MHz->75MHz->12MHz,更改顺序可以跳过某频率但是不可逆
|
|
*/
|
|
xmedia_s32 xmedia_otp_fmc_freq_sel(xmedia_otp_fmc_freq frequency);
|
|
|
|
/*
|
|
* 函数功能:关闭bootrom串口打印
|
|
* 函数参数:
|
|
* 无
|
|
* 返回值:
|
|
* XMEDIA_SUCCESS - 函数执行成功
|
|
* XMEDIA_ERRCODE_NOT_INIT - 未调用xmedia_otp_init接口进行初始化
|
|
* XMEDIA_ERRCODE_NOT_PERMITTED - otp位已配置过并锁定,无法更改
|
|
*/
|
|
xmedia_s32 xmedia_otp_bootrom_debug_disable(xmedia_void);
|
|
|
|
/*
|
|
* 函数功能:烧写安全启动使用的RSA4096 PSS验签算法公钥的SHA256值
|
|
* 函数参数:
|
|
* sha256_data - 输入参数,SHA256数据起始地址
|
|
* data_len - 输入参数,SHA256数据长度,单位Byte
|
|
* 返回值:
|
|
* XMEDIA_SUCCESS - 函数执行成功
|
|
* XMEDIA_ERRCODE_NOT_INIT - 未调用xmedia_otp_init接口进行初始化
|
|
* XMEDIA_ERRCODE_NULL_PTR - 空指针
|
|
* XMEDIA_ERRCODE_INVALID_PARAM - 传入参数不合法
|
|
* XMEDIA_ERRCODE_NOT_PERMITTED - otp位已配置过并锁定,无法更改
|
|
*/
|
|
xmedia_s32 xmedia_otp_root_key_sha256_set(xmedia_u8 *sha256_data, xmedia_u32 data_len);
|
|
|
|
/*
|
|
* 函数功能:烧写AES使用的硬件key
|
|
* 函数参数:
|
|
* key - 输入参数,key数据起始地址
|
|
* key_len - 输入参数,key数据长度,单位Byte
|
|
* key_index - 输入参数,key标志
|
|
* 返回值:
|
|
* XMEDIA_SUCCESS - 函数执行成功
|
|
* XMEDIA_ERRCODE_NOT_INIT - 未调用xmedia_otp_init接口进行初始化
|
|
* XMEDIA_ERRCODE_NULL_PTR - 空指针
|
|
* XMEDIA_ERRCODE_INVALID_PARAM - 传入参数不合法
|
|
* XMEDIA_ERRCODE_NOT_PERMITTED - otp位已配置过并锁定,无法更改
|
|
*/
|
|
xmedia_s32 xmedia_otp_aes256_key_set(xmedia_u8 *key, xmedia_u32 key_len, xmedia_otp_aes_key_index key_index);
|
|
|
|
/*
|
|
* 函数功能:烧写自定义区OTP指定偏移的区域
|
|
* 函数参数:
|
|
* data - 输入参数,要写入otp中的值
|
|
* offset - 输入参数,自定义otp区中的偏移,以32bit为单位
|
|
* 返回值:
|
|
* XMEDIA_SUCCESS - 函数执行成功
|
|
* XMEDIA_ERRCODE_NOT_INIT - 未调用xmedia_otp_init接口进行初始化
|
|
* XMEDIA_ERRCODE_INVALID_PARAM - 传入参数不合法
|
|
* XMEDIA_ERRCODE_NOT_PERMITTED - otp位已配置过并锁定,无法更改
|
|
*/
|
|
xmedia_s32 xmedia_otp_user_data_set(xmedia_u32 data, xmedia_u32 offset);
|
|
|
|
/*
|
|
* 函数功能:读取自定义区OTP指定偏移的区域的值
|
|
* 函数参数:
|
|
* data - 输出参数,otp指定偏移的值
|
|
* offset - 输入参数,自定义otp区中的偏移,以32bit为单位
|
|
* 返回值:
|
|
* XMEDIA_SUCCESS - 函数执行成功
|
|
* XMEDIA_ERRCODE_NOT_INIT - 未调用xmedia_otp_init接口进行初始化
|
|
* XMEDIA_ERRCODE_NULL_PTR - 空指针
|
|
* XMEDIA_ERRCODE_INVALID_PARAM - 传入参数不合法
|
|
*/
|
|
xmedia_s32 xmedia_otp_user_data_get(xmedia_u32 *data, xmedia_u32 offset);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|