322 lines
9.7 KiB
C
Executable File
322 lines
9.7 KiB
C
Executable File
/****************************************************************************
|
|
|
|
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
|
|
|
|
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
|
|
be copied by any method or incorporated into another program without
|
|
the express written consent of Aerospace C.Power. This Information or any portion
|
|
thereof remains the property of Aerospace C.Power. The Information contained herein
|
|
is believed to be accurate and Aerospace C.Power assumes no responsibility or
|
|
liability for its use in any way and conveys no license or title under
|
|
any patent or copyright and makes no representation or warranty that this
|
|
Information is free from patent or copyright infringement.
|
|
|
|
****************************************************************************/
|
|
|
|
#ifndef IOT_OEM_H
|
|
#define IOT_OEM_H
|
|
|
|
/* os shim includes */
|
|
#include "os_types.h"
|
|
|
|
/* common includes */
|
|
#include "iot_oem_api.h"
|
|
|
|
/* oem special structure includes */
|
|
#include "iot_oem_struct_v0.h"
|
|
#include "iot_oem_struct_v1.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/*
|
|
* OEM section is the place to store per moudle configurations, like unique
|
|
* MAC address. OEM payload start at 0x40 in flash. since 64bytes used for
|
|
* section header description.
|
|
*/
|
|
|
|
/* pack for the structures in the whole file */
|
|
#pragma pack(push) // save the pack status
|
|
#pragma pack(1) // 1 byte align
|
|
|
|
#if (HW_PLATFORM == HW_PLATFORM_SIMU)
|
|
#define IOT_OEM_SECTION_START_ADDR (0)
|
|
#else
|
|
#define IOT_OEM_SECTION_START_ADDR (64)
|
|
#endif
|
|
|
|
#define IOT_OEM_SECTION_SEC_ADDR (3072)
|
|
|
|
#define IOT_OEM_EXT_MAGIC_STR "_oem_ext"
|
|
|
|
#define IOT_OEM_DUMMY_LEN 106
|
|
/* use simple pair passcode for security check */
|
|
#define IOT_OEM_SEC_TYPE_PASSCODE 1
|
|
|
|
/* define chip type */
|
|
#define IOT_CHIP_TYPE_DEF 0
|
|
#define IOT_CHIP_TYPE_HZ3011 1
|
|
#define IOT_CHIP_TYPE_HZ3001 2
|
|
#define IOT_CHIP_TYPE_WQ3011 3
|
|
#define IOT_CHIP_TYPE_WQ3001 4
|
|
#define IOT_CHIP_TYPE_HZ3021 5
|
|
#define IOT_CHIP_TYPE_MT8201 6
|
|
#define IOT_CHIP_TYPE_FLX6610 7
|
|
#define IOT_CHIP_TYPE_FLX6611 8
|
|
#define IOT_CHIP_TYPE_HZ3211 9
|
|
#define IOT_CHIP_TYPE_HZ3201 10
|
|
#define IOT_CHIP_TYPE_WQ3031 11
|
|
#define IOT_CHIP_TYPE_QJ5580 12
|
|
#define IOT_CHIP_TYPE_QJ5582 13
|
|
#define IOT_CHIP_TYPE_FLX6710 14
|
|
#define IOT_CHIP_TYPE_FLX6711 15
|
|
#define IOT_CHIP_TYPE_SPE7301 16
|
|
#define IOT_CHIP_TYPE_SPE7303 17
|
|
#define IOT_CHIP_TYPE_GX2001 18
|
|
#define IOT_CHIP_TYPE_GX2011 19
|
|
#define IOT_CHIP_TYPE_HZ5202 20
|
|
#define IOT_CHIP_TYPE_DT0530 21
|
|
#define IOT_CHIP_TYPE_DT0531 22
|
|
#define IOT_CHIP_TYPE_YP8801 23
|
|
#define IOT_CHIP_TYPE_YP8811 24
|
|
|
|
#define IOT_CHIP_SEC_ECC_CURVE_LEN 1
|
|
#define IOT_CHIP_SEC_ECC_KEY_PUB_LEN 64
|
|
#define IOT_CHIP_SEC_ECC_SIGN_LEN 64
|
|
#define IOT_CHIP_SEC_SM2_CURVE_LEN 1
|
|
#define IOT_CHIP_SEC_SM2_KEY_PUB_LEN 64
|
|
#define IOT_CHIP_SEC_SM2_SIGN_LEN 64
|
|
#define IOT_CHIP_SEC_ECC_KEY_PRI_LEN 32
|
|
#define IOT_CHIP_SEC_SM2_KEY_PRI_LEN 32
|
|
|
|
/* security sm2 user id table length */
|
|
#define IOT_SEC_SM2_USER_ID_LEN 16
|
|
|
|
/* root sm2 public key length */
|
|
#define IOT_SEC_ROOT_SM2_PUB_LEN 64
|
|
|
|
typedef enum _iot_oem_ver_e {
|
|
IOT_OEM_VER_V0 = 0,
|
|
IOT_OEM_VER_V1 = 1,
|
|
IOT_OEM_VER_MAX,
|
|
IOT_OEM_VER_INVALID = 0x3f, /* 6 bits */
|
|
} iot_oem_ver_e;
|
|
|
|
typedef struct _iot_misc_info_t {
|
|
uint16_t vendor_id;
|
|
uint8_t chip_mmid[IOT_CHIP_MMID_LEN];
|
|
uint16_t chip_code;
|
|
/* see IOT_OEM_SEC_TYPE_XXX */
|
|
uint8_t sec_type;
|
|
/* simple pair passcode value */
|
|
uint16_t passcode;
|
|
/* hardware version info */
|
|
iot_oem_hw_ver_info_t hw_ver_info;
|
|
/* cert baund set */
|
|
uint32_t cert_baund;
|
|
/* default 0 - see IOT_CHIP_TYPE_XXX */
|
|
uint8_t chip_type;
|
|
uint8_t misc_dummy[IOT_OEM_DUMMY_LEN];
|
|
}iot_oem_misc_cfg_t;
|
|
|
|
typedef struct _iot_oem_ip_info {
|
|
/* 0 for disable oem ip info, 1 for enable */
|
|
uint8_t ip_enable;
|
|
/* see IOT_OEM_IP_VERSION_XXX. */
|
|
uint8_t ip_ver;
|
|
/* 0 for CCO define ip, 1 for customer define IP. */
|
|
uint8_t ip4_method;
|
|
/* ipv4 addr. */
|
|
uint8_t ipv4[IOT_IP4_ADDR_LEN];
|
|
/* ipv4 netmask addr. */
|
|
uint8_t ipv4_mask[IOT_IP4_ADDR_LEN];
|
|
/* local port used. */
|
|
uint16_t ipv4_port;
|
|
} iot_oem_ip_info_t;
|
|
|
|
typedef struct _iot_oem_security_hdr {
|
|
/* security data crc */
|
|
uint32_t crc;
|
|
/* version id */
|
|
uint8_t ver;
|
|
/* security data length */
|
|
uint16_t len;
|
|
/* reserved */
|
|
uint8_t rsvd;
|
|
} iot_oem_security_hdr_t;
|
|
|
|
typedef struct _iot_oem_security_param_v1 {
|
|
/* ecc elliptic curve type. 1 - brainpoolP256r1, others - reserved */
|
|
uint8_t ecc_curve_type;
|
|
/* ecc public key */
|
|
uint8_t ecc_key_pub[IOT_CHIP_SEC_ECC_KEY_PUB_LEN];
|
|
/* ecc signature */
|
|
uint8_t ecc_sign[IOT_CHIP_SEC_ECC_SIGN_LEN];
|
|
/* sm2 curve type. always 0 */
|
|
uint8_t sm2_curve_type;
|
|
/* sm2 public key */
|
|
uint8_t sm2_key_pub[IOT_CHIP_SEC_SM2_KEY_PUB_LEN];
|
|
/* sm2 signature */
|
|
uint8_t sm2_sign[IOT_CHIP_SEC_SM2_SIGN_LEN];
|
|
/* ecc private key */
|
|
uint8_t ecc_key_pri[IOT_CHIP_SEC_ECC_KEY_PRI_LEN];
|
|
/* sm2 private key */
|
|
uint8_t sm2_key_pri[IOT_CHIP_SEC_SM2_KEY_PRI_LEN];
|
|
} iot_oem_security_param_v1_t;
|
|
|
|
typedef struct _iot_oem_security_cfg_v1 {
|
|
/* security data header */
|
|
iot_oem_security_hdr_t hdr;
|
|
/* security data */
|
|
iot_oem_security_param_v1_t data;
|
|
} iot_oem_security_cfg_v1_t;
|
|
|
|
typedef struct _iot_cus_cfg_t {
|
|
/* start charge threshold voltage, unit:mv. */
|
|
int16_t start_charge_thr_volt;
|
|
/* stop charge threshold voltage, unit:mv. */
|
|
int16_t stop_charge_thr_volt;
|
|
/* reserved for future use. */
|
|
uint8_t padding[60];
|
|
} iot_cus_cfg_t;
|
|
|
|
typedef struct _iot_oem_pad_cfg_t {
|
|
uint8_t padding[110];
|
|
}iot_oem_pad_cfg_t;
|
|
|
|
typedef struct _iot_oem_cfg {
|
|
iot_oem_base_cfg_t base_cfg;
|
|
iot_oem_misc_cfg_t misc_cfg;
|
|
/* V0 version board_id uses 32bit, and V1 version takes 32bit apart
|
|
* for compatibility, little-endian.
|
|
*/
|
|
uint32_t board_id : 10,
|
|
board_cfg_ver : 6,
|
|
board_cfg_resv : 16;
|
|
/* in order to reduce the changes of oem structure,
|
|
* 642 bytes(space occupied by iot_board_info_v0_t) are shared here.
|
|
*/
|
|
union {
|
|
iot_board_info_v0_t board_cfg[2];
|
|
iot_board_info_v1_t board_cfg_v1;
|
|
};
|
|
iot_oem_ip_info_t ip_info;
|
|
iot_cus_cfg_t cus_cfg;
|
|
iot_oem_pad_cfg_t pad_cfg;
|
|
} iot_oem_cfg_t;
|
|
|
|
/* security sm2 user id */
|
|
extern const uint8_t g_iot_sec_sm2_user_id[IOT_SEC_SM2_USER_ID_LEN];
|
|
|
|
/* security sm2 root public key */
|
|
extern const uint8_t g_iot_sec_root_sm2_pub_v1[IOT_SEC_ROOT_SM2_PUB_LEN];
|
|
|
|
/**
|
|
* @brief iot_oem_read_mtd() - read oem data from flash oem info section.
|
|
* @param buf: pointer to receive oem data.
|
|
* @param size: length to receive oem data.
|
|
* @param offset: offset of the oem info section.
|
|
* @retval 0 success; others fail.
|
|
*/
|
|
uint32_t iot_oem_read_mtd(uint8_t *buf, uint32_t size, uint32_t offset);
|
|
|
|
/**
|
|
* @brief iot_oem_read_mtd_ext() - read oem ext data from flash fw section.
|
|
* @param buf: pointer to receive oem data.
|
|
* @param size: length to receive oem data.
|
|
* @retval 0 success; others fail.
|
|
*/
|
|
uint32_t iot_oem_read_mtd_ext(uint8_t *buf, uint32_t size);
|
|
|
|
/**
|
|
* @brief iot_oem_init - init oem function.
|
|
* warning, iot_oem_init should be called after pib load
|
|
* @param role_cco : ture means cco. otherwise sta
|
|
*/
|
|
void iot_oem_init(bool_t role_cco);
|
|
|
|
/**
|
|
* @brief iot_oem_get_cfg() - read oem cfg from flash oem info section.
|
|
* @param oemcfg: pointer to receive oem cfg
|
|
* @retval 0 success; others fail
|
|
*/
|
|
uint32_t iot_oem_get_cfg(iot_oem_cfg_t** oemcfg);
|
|
|
|
/**
|
|
* @brief iot_oem_set_cfg() - write oem cfg to flash oem info section.
|
|
* @param oemcfg: pointer to receive oem cfg
|
|
* @retval 0 success; others fail
|
|
*/
|
|
uint32_t iot_oem_set_cfg(iot_oem_cfg_t* oemcfg);
|
|
|
|
/**
|
|
* @brief iot_oem_get_cus_cfg() - read cus cfg from flash oem cus cfg section.
|
|
* @param iot_cus_cfg_t: pointer to receive cus cfg
|
|
* @retval 0 success; others fail
|
|
*/
|
|
uint32_t iot_oem_get_cus_cfg(iot_cus_cfg_t** cus_cfg);
|
|
|
|
/**
|
|
* @brief iot_oem_set_module_type() - set module type.
|
|
* @param mt: module type
|
|
*/
|
|
void iot_oem_set_module_type(uint32_t mt);
|
|
|
|
/**
|
|
* @brief iot_oem_get_mtd_sts() - get mtd status from global oem.
|
|
* @param oemcfg: void
|
|
* @retval 0 success; others fail
|
|
*/
|
|
uint32_t iot_oem_get_mtd_sts(void);
|
|
|
|
/**
|
|
* @brief iot_oem_set_chip_code() - set chip code to flash.
|
|
* @param chip_code: chip code
|
|
* @retval 0 success; others fail
|
|
*/
|
|
uint32_t iot_oem_set_chip_code(uint16_t chip_code);
|
|
|
|
/**
|
|
* @brief iot_oem_set_vendor_id() - set vendor id to flash.
|
|
* @param vendor_id: vendor id
|
|
* @retval 0 success; others fail
|
|
*/
|
|
uint32_t iot_oem_set_vendor_id(uint16_t vendor_id);
|
|
|
|
/**
|
|
* @brief: get passcode info.
|
|
* @retval - return passcode value, 0 means not available.
|
|
*/
|
|
uint16_t iot_oem_get_passcode();
|
|
|
|
/**
|
|
* @brief iot_oem_get_chip_type() - get value of chip type .
|
|
* @param none.
|
|
* @retval enum value of chip_type, see IOT_CHIP_TYPE_XXX.
|
|
*/
|
|
uint8_t iot_oem_get_chip_type();
|
|
|
|
/**
|
|
* @brief iot_oem_get_security_cfg_v1() - get security config.
|
|
* @param none
|
|
* @retval security parameter pointer.
|
|
*/
|
|
iot_oem_security_param_v1_t *iot_oem_get_security_cfg_v1();
|
|
|
|
/**
|
|
* @brief iot_oem_set_security_cfg_v1() - set security config.
|
|
* @param param: security config
|
|
* @retval see ERR_XXX.
|
|
*/
|
|
uint32_t iot_oem_set_security_cfg_v1(iot_oem_security_param_v1_t *param);
|
|
|
|
#pragma pack(pop) // restore the pack status
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|