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
 |