827 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			827 lines
		
	
	
		
			29 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_PIB_H
 | |
| #define IOT_PIB_H
 | |
| 
 | |
| /* os shim includes */
 | |
| #include "os_types.h"
 | |
| #include "iot_utils.h"
 | |
| 
 | |
| /* common includes */
 | |
| #include "iot_module.h"
 | |
| 
 | |
| /* export includes */
 | |
| #include "iot_pib_api.h"
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| /*
 | |
| *  Chip reserved 56K for PIB module to use.
 | |
| *  Need spit it into two section, one is current working section. Another
 | |
| *  section used for upgrade.
 | |
| *  PIB section start at 0x40, since PIB partition need 64 bytes reserved for
 | |
| *  bsp use to manager sections.
 | |
| *  So, each section usable size is 28649 bytes.
 | |
| *  The CCO/STA Full flash include read only part and writable part.
 | |
| *  The read only part size is 1k bytes at CCO or STA.
 | |
| *  The writable part size is 2K(no psram) or 16K(with psram) at CCO and 1K at STA.
 | |
| *  The read only part and writable part have a similar structure.
 | |
| *  CCO Full flash layout shows like below
 | |
| *  ---  ---------------------
 | |
| *  /|\  |      pib head     |  8 bytes
 | |
| *   |   |-------------------|
 | |
| *   |   |    board config   |  128 bytes
 | |
| *   r   |-------------------|
 | |
| *   e   |     cli config    |  32 bytes
 | |
| *   a   |-------------------|
 | |
| *   d   |     mac config    |  32 bytes
 | |
| *   o   |-------------------|
 | |
| *   n   |    halphy config  |  32 bytes
 | |
| *   l   |-------------------|
 | |
| *   y   |     cvg config    |  32 bytes
 | |
| *   |   |-------------------|
 | |
| *   |   |    app config     |  32 bytes
 | |
| *   |   |-------------------|
 | |
| *  \|/  |     reserved      |  728 bytes
 | |
| *  ---  |-------------------|
 | |
| *  /|\  |       rw hdr      |  28 bytes
 | |
| *   |   |-------------------|
 | |
| *   |   |      pib head     |  8 bytes
 | |
| *   |   |-------------------|
 | |
| *   |   |    board config   |  128 bytes
 | |
| *   w   |-------------------|
 | |
| *   r   |     cli config    |  128 bytes
 | |
| *   i   |-------------------|
 | |
| *   t   |     mac config    |  128 bytes
 | |
| *   a   |-------------------|
 | |
| *   b   |   halphy config   |  256 bytes
 | |
| *   l   |-------------------|
 | |
| *   e   |     cvg config    |  64 bytes
 | |
| *   |   |-------------------|
 | |
| *  \|/  |    app config     |  7416 + 8192 + 4132(with psram), 1272(no psram) bytes
 | |
| *  ---  |-------------------|
 | |
| *
 | |
| *
 | |
| *-----------------------------------------------------------------------------
 | |
| *       STA Full flash layout shows like below
 | |
| *  ---  ---------------------
 | |
| *  /|\  |      pib head     |  8 bytes
 | |
| *   |   |-------------------|
 | |
| *   |   |    board config   |  128 bytes
 | |
| *   r   |-------------------|
 | |
| *   e   |    cli config     |  32 bytes
 | |
| *   a   |-------------------|
 | |
| *   d   |     mac config    |  32 bytes
 | |
| *   o   |-------------------|
 | |
| *   n   |   halphy config   |  32 bytes
 | |
| *   l   |-------------------|
 | |
| *   y   |     cvg config    |  32 bytes
 | |
| *   |   |-------------------|
 | |
| *   |   |    app config     |  32 bytes
 | |
| *   |   |-------------------|
 | |
| *  \|/  |     reserved      |  728 bytes
 | |
| *  ---  |-------------------|
 | |
| *  /|\  |       rw hdr      |  28 bytes
 | |
| *   |   |-------------------|
 | |
| *   |   |      pib head     |  8 bytes
 | |
| *   |   |-------------------|
 | |
| *   |   |    board config   |  128 bytes
 | |
| *   w   |-------------------|
 | |
| *   r   |     cli config    |  128 bytes
 | |
| *   i   |-------------------|
 | |
| *   t   |     mac config    |  128 bytes
 | |
| *   a   |-------------------|
 | |
| *   b   |    halphy config  |  256 bytes
 | |
| *   l   |-------------------|
 | |
| *   e   |    cvg config     |  64 bytes
 | |
| *   |   |-------------------|
 | |
| *  \|/  |    app config     |  312 + 512 bytes
 | |
| *  ---  |-------------------|
 | |
| *
 | |
| */
 | |
| 
 | |
| /* pack for the structures in the whole file */
 | |
| #pragma pack(push)  // save the pack status
 | |
| #pragma pack(1)     // 1 byte align
 | |
| 
 | |
| /* get section in read only memory */
 | |
| #define IOT_PIB_GET_READ_SECTION      (0)
 | |
| /* get section in writable memory */
 | |
| #define IOT_PIB_GET_WRITE_SECTION     (1)
 | |
| 
 | |
| #if (HW_PLATFORM == HW_PLATFORM_SIMU)
 | |
| #define IOT_PIB_R_SECTION_START_ADDR      (0)
 | |
| #else
 | |
| #define IOT_PIB_R_SECTION_START_ADDR      (64)
 | |
| #endif
 | |
| #define IOT_PIB_W_SECTION_START_ADDR      (4096)
 | |
| 
 | |
| #define IOT_PIB_HEAD_ID                   (0)
 | |
| #define IOT_PIB_BOARD_ID                  (1)
 | |
| #define IOT_PIB_APP_ID                    (2)
 | |
| #define IOT_PIB_CVG_ID                    (3)
 | |
| #define IOT_PIB_MAC_ID                    (4)
 | |
| #define IOT_PIB_HALPHY_ID                 (5)
 | |
| #define IOT_PIB_CLI_ID                    (6)
 | |
| #define IOT_PIB_UPGRADE_ID                (7)
 | |
| #define IOT_PIB_MAX_ID                    (IOT_PIB_UPGRADE_ID + 1)
 | |
| 
 | |
| /*
 | |
|  * need set fix size, and cco and sta read only all is 1K bytes,
 | |
|  * writable section is sta: 1K bytes,  cco, 8K bytes
 | |
|  */
 | |
| #define IOT_PIB_R_HEAD_SIZE                         (8)
 | |
| #define IOT_PIB_R_BOARD_SIZE                        (128)
 | |
| #define IOT_PIB_R_APP_SIZE                          (32)
 | |
| #define IOT_PIB_R_CVG_SIZE                          (32)
 | |
| #define IOT_PIB_R_MAC_SIZE                          (32)
 | |
| #define IOT_PIB_R_HALPHY_SIZE                       (32)
 | |
| #define IOT_PIB_R_CLI_SIZE                          (32)
 | |
| 
 | |
| #define IOT_PIB_W_HEAD_SIZE                         (8)
 | |
| #define IOT_PIB_W_BOARD_SIZE                        (128)
 | |
| #define IOT_PIB_W_CVG_SIZE                          (64)
 | |
| #define IOT_PIB_W_MAC_SIZE                          (128)
 | |
| #define IOT_PIB_W_HALPHY_SIZE                       (256)
 | |
| #define IOT_PIB_W_CLI_SIZE                          (16)
 | |
| #define IOT_PIB_W_APP_STA_SIZE_V0                   (312)
 | |
| #define IOT_PIB_W_APP_STA_SIZE_V1                   (312 + 512)
 | |
| #define IOT_PIB_W_UPGRADE_SIZE                      (112)
 | |
| 
 | |
| #if RUN_IN_PSRAM
 | |
| #define IOT_PIB_W_APP_CCO_SIZE_V0                   (7416 + 8192)
 | |
| #define IOT_PIB_W_APP_CCO_SIZE_V1                   (7416 + 8192 + 4132)
 | |
| #define IOT_PIB_CCO_BLOCK_SIZE                      (4096 * 5)
 | |
| #define IOT_PIB_CCO_VALID_RW_NUM_MAX                (1)
 | |
| #else /* RUN_IN_PSRAM */
 | |
| #define IOT_PIB_W_APP_CCO_SIZE_V0                   (1272)
 | |
| #define IOT_PIB_W_APP_CCO_SIZE_V1                   IOT_PIB_W_APP_CCO_SIZE_V0
 | |
| #define IOT_PIB_CCO_BLOCK_SIZE                      (4096)
 | |
| #define IOT_PIB_CCO_VALID_RW_NUM_MAX                (5)
 | |
| #endif
 | |
| /* sta pib loop write part size */
 | |
| #define IOT_PIB_STA_BLOCK_SIZE                      (4096)
 | |
| #define IOT_PIB_STA_VALID_RW_NUM_MAX                (5)
 | |
| 
 | |
| /* When pib commit 10 times, execute a checkout block */
 | |
| #define IOT_PIB_CHECKOUT_BLOCK_COMMIT_CNT           (10)
 | |
| 
 | |
| #define IOT_PIB_CCO_TARGET_SIZE                     (9216)
 | |
| #define IOT_PIB_STA_TARGET_SIZE                     (2048)
 | |
| #define IOT_PIB_MAX_SIZE                            (28640)
 | |
| 
 | |
| #define IOT_PIB_PHY_MASK_CHIPID                     (0)
 | |
| #define IOT_PIB_PHY_MASK_TX_DC                      (1)
 | |
| #define IOT_PIB_PHY_MASK_RX_DC                      (2)
 | |
| #define IOT_PIB_PHY_MASK_BW_FILTER                  (3)
 | |
| 
 | |
| /* add rw hdr pib minor version */
 | |
| #define IOT_PIB_VERSION_MINOR_V1_START              (7)
 | |
| #define IOT_PIB_VERSION_MAJOR_V1_START              (11)
 | |
| 
 | |
| /* commit request received */
 | |
| #define IOT_PIB_STATUS_COMMIT_REC                   1
 | |
| /* commit request done */
 | |
| #define IOT_PIB_STATUS_COMMIT_DONE                  2
 | |
| /* define the magic number to identify if the wr head is valid. */
 | |
| #define IOT_PIB_RW_HEAD_MAGIC                      (0xF2D5B13A)
 | |
| 
 | |
| typedef enum {
 | |
|     COMMIT_TYPE_NONE         = 0,
 | |
|     /* wait all module reference count to zero, then write. more graceful way */
 | |
|     COMMIT_TYPE_WAIT_REFZERO = 1,
 | |
|     /* write flash now, regardless of pib commit reference count not zero */
 | |
|     //COMMIT_TYPE_NOW          = 2,
 | |
|     COMMIT_TYPE_MAX          = 1,
 | |
| } iot_pib_commit_type_t;
 | |
| 
 | |
| typedef struct _iot_pib_hdr {
 | |
|     /* read only fixed at 1K both CCO and STA
 | |
|      * writable fixed at 8K as CCO, and 1K as STA
 | |
|      */
 | |
|     uint16_t          piblen;
 | |
|     /* crc result, start from pibtype to end of pib(64 + 1K) */
 | |
|     uint8_t           pibcrc8;
 | |
|     iot_pib_type_t    pibtype;
 | |
|     uint16_t          pib_minor_version;
 | |
|     uint16_t          pib_major_version;
 | |
| } iot_pib_hdr_t;
 | |
| 
 | |
| /* board readonly cfg setting */
 | |
| typedef struct _pib_r_board_info {
 | |
|     uint8_t build_time[6];
 | |
| } pib_r_board_info_t;
 | |
| 
 | |
| #define PIB_R_BOARD_LOG_FLOW_FALSH      0
 | |
| #define PIB_R_BOARD_LOG_FLOW_CLI        1
 | |
| #define PIB_R_BOARD_LOG_FDUMP_NONEED    0
 | |
| #define PIB_R_BOARD_LOG_FDUMP_NEED      1
 | |
| typedef struct _pib_r_board_log {
 | |
|     uint8_t flow;
 | |
|     uint8_t is_fdump;
 | |
| } pib_r_board_log_t;
 | |
| 
 | |
| typedef struct _pib_board_fake_build_info {
 | |
|     /* software version */
 | |
|     uint16_t    sw_ver;
 | |
|     /* software build time */
 | |
|     uint8_t     year;
 | |
|     uint8_t     month;
 | |
|     uint8_t     day;
 | |
|     uint8_t     hour;
 | |
|     uint8_t     min;
 | |
|     uint8_t     sec;
 | |
| } pib_board_fake_build_info_t;
 | |
| 
 | |
| typedef struct _pib_board_vendor_info {
 | |
|     /* vendor id */
 | |
|     uint16_t    vendor_id;
 | |
|     /* flag to mark if passcode valid */
 | |
|     uint8_t     passcode_valid  : 1,
 | |
|     /* reserved for future */
 | |
|                 reserved        : 7;
 | |
|     /* simple pair passcode value */
 | |
|     uint16_t    passcode;
 | |
| } pib_board_vendor_info_t;
 | |
| 
 | |
| typedef struct _pib_board_tsfm_build_info {
 | |
|     /* tsfm cfg info, see IOT_PLC_HW_REC_MODE_ID_XXX */
 | |
|     uint8_t rec_mode: 2,
 | |
|     /* reserve for future */
 | |
|             reserve : 6;
 | |
| } pib_board_tsfm_build_info_t;
 | |
| 
 | |
| typedef struct _pib_board_user_cfg {
 | |
|     /* flag to mark if user type valid */
 | |
|     uint8_t     user_type_valid : 1,
 | |
|                 reserved        : 7;
 | |
|     /* user type, see USER_TYPE_XXX */
 | |
|     uint8_t     user_type;
 | |
|     uint16_t    reserved2;
 | |
| } pib_board_user_cfg_t;
 | |
| 
 | |
| typedef struct _iot_pib_r_board_cfg {
 | |
|     pib_r_board_info_t info_cfg;
 | |
|     pib_r_board_log_t log_cfg;
 | |
|     pib_board_fake_build_info_t build_cfg;
 | |
|     pib_board_tsfm_build_info_t tsfm_cfg;
 | |
|     pib_board_user_cfg_t user_cfg;
 | |
|     uint8_t rsv[IOT_PIB_R_BOARD_SIZE - \
 | |
|                 sizeof(pib_r_board_info_t) - \
 | |
|                 sizeof(pib_r_board_log_t) - \
 | |
|                 sizeof(pib_board_fake_build_info_t) - \
 | |
|                 sizeof(pib_board_tsfm_build_info_t) - \
 | |
|                 sizeof(pib_board_user_cfg_t)];
 | |
| } iot_pib_r_board_cfg_t;
 | |
| 
 | |
| /* board writable cfg setting */
 | |
| typedef struct _pib_w_board_log {
 | |
|     uint8_t rsv_part;           /* using reserved part or not */
 | |
|     uint32_t pos;                /* flash log written position */
 | |
| } pib_w_board_log_t;
 | |
| 
 | |
| typedef struct _pib_w_board_reset_cnt{
 | |
|     uint32_t pwr_reset;
 | |
|     uint32_t wdt_reset;
 | |
|     uint32_t sft_reset;
 | |
| } pib_w_board_reset_t;
 | |
| 
 | |
| typedef struct _iot_pib_w_board_cfg {
 | |
|     pib_w_board_log_t log_cfg;
 | |
|     pib_w_board_reset_t rst_cfg;
 | |
|     pib_board_fake_build_info_t build_cfg;
 | |
|     pib_board_vendor_info_t vendor_cfg;
 | |
|     uint8_t rsv[IOT_PIB_W_BOARD_SIZE - \
 | |
|                 sizeof(pib_w_board_log_t) - \
 | |
|                 sizeof(pib_w_board_reset_t) - \
 | |
|                 sizeof(pib_board_fake_build_info_t) - \
 | |
|                 sizeof(pib_board_vendor_info_t)];
 | |
| } iot_pib_w_board_cfg_t;
 | |
| 
 | |
| /* start ----------------------------- cvg read only config setting */
 | |
| typedef struct _iot_pib_r_cvg_sta_cfg {
 | |
|     /* see PLC_DEV_TYPE_XXX */
 | |
|     uint8_t dev_type;
 | |
|     /* network monitor enable flag */
 | |
|     uint8_t nw_monitor_enable:        1,
 | |
|     /* reserved for future */
 | |
|             rsvd:                     7;
 | |
|     /* reserved for future */
 | |
|     uint8_t reserved[6];
 | |
| } iot_pib_r_cvg_sta_cfg_t;
 | |
| 
 | |
| typedef struct _iot_pib_r_cvg_cco_cfg {
 | |
|     /* see PLC_DEV_TYPE_XXX */
 | |
|     uint8_t dev_type;
 | |
|     /* initial frequency band ID */
 | |
|     uint8_t freq_band_id;
 | |
|     /* allow to use beacon for channel evaluation */
 | |
|     uint8_t allow_chan_eval;
 | |
|     /* initial allowed to cco traffic success ratio, the unit is 1% */
 | |
|     uint8_t allowed_cco_tf_sr;
 | |
|     /* number of full route period sta need to spend on tr_sf calc. the unit
 | |
|      * is 1 route period.
 | |
|      */
 | |
|     uint8_t proxy_select_dur;
 | |
|     /* sta assoc retry interval after cco reject sta assoc request. the
 | |
|      * unit is 1 ms.
 | |
|      */
 | |
|     uint32_t assoc_retry_int;
 | |
|     /* delay for each frequency band switch request, uint is 1ms */
 | |
|     uint32_t fb_chg_delay;
 | |
|     /* minimal beacon period, the unit is 1s */
 | |
|     uint8_t min_bc_period;
 | |
|     /* allowed maximum nid value. 0 means no limitation */
 | |
|     uint16_t max_nid;
 | |
|     /* flag to mark if white list notification to STA enabled. 0 means
 | |
|      * disabled.
 | |
|      */
 | |
|     uint8_t wl_notify_enable;
 | |
|     /* flag to mark if disable freq band detection */
 | |
|     uint8_t fb_detect_disable   :1,
 | |
|     /* disable tx 3phase function */
 | |
|             tx_3phase_disable   :1,
 | |
|     /* reserved for future */
 | |
|             rsvd                :6;
 | |
|     /* delay for each rf channel switch request, unit is 1s */
 | |
|     uint16_t rf_chg_delay;
 | |
| } iot_pib_r_cvg_cco_cfg_t;
 | |
| 
 | |
| typedef struct _iot_pib_r_cvg_real_cfg {
 | |
|     /* sta role only configuration */
 | |
|     iot_pib_r_cvg_sta_cfg_t sta;
 | |
|     /* cco role only configuration */
 | |
|     iot_pib_r_cvg_cco_cfg_t cco;
 | |
| } iot_pib_r_cvg_real_cfg_t;
 | |
| 
 | |
| typedef struct _iot_pib_r_cvg_cfg {
 | |
|     /* configuration */
 | |
|     iot_pib_r_cvg_real_cfg_t cfg;
 | |
|     /* dummy data to make it a fixed size */
 | |
|     uint8_t dummy[IOT_PIB_R_CVG_SIZE - sizeof(iot_pib_r_cvg_real_cfg_t)];
 | |
| } iot_pib_r_cvg_cfg_t;
 | |
| /* end ----------------------------- cvg read only config setting */
 | |
| 
 | |
| /* start ----------------------------- cvg read/write config setting */
 | |
| typedef struct _iot_pib_w_cvg_sta_cfg {
 | |
|     /* association random number */
 | |
|     uint32_t assoc_rand_num;
 | |
|     /* preferred cco mac address. big endian */
 | |
|     uint8_t  prefer_cco_addr[6];
 | |
|     /* prefered sta mac address. big endian */
 | |
|     uint8_t  prefer_sta_addr[6];
 | |
|     /* flag to mark if lock network for tsfm, the locked network addr is
 | |
|      * saved in prefer_cco_addr, the locked sta addr is saved in prefer_sta_addr
 | |
|      */
 | |
|     uint8_t  tsfm_nw_lock     :1,
 | |
|     /* role of last joined network, 1 is PCO role, 0 is STA role */
 | |
|              last_role        :1,
 | |
|     /* preferred rf option, see RF_OPTION_XXX */
 | |
|              prefer_rf_option :2,
 | |
|     /* 3ps device gpio tx-rx switch phase, see PLC_PHASE_XXX */
 | |
|              gpio_trx_phase   :2,
 | |
|     /* reserved for future */
 | |
|              rsvd1            :2;
 | |
|     /* preferred network id */
 | |
|     uint32_t prefer_nid       :24,
 | |
|     /* preferred rf channel, see RF_CHANNEL_ID_XXX */
 | |
|              prefer_rf_channel:8;
 | |
|     /* reserved for future */
 | |
|     uint8_t  rsvd[11];
 | |
| } iot_pib_w_cvg_sta_cfg_t;
 | |
| 
 | |
| typedef struct _iot_pib_w_cvg_cco_cfg {
 | |
|     /* current network id */
 | |
|     uint32_t nid;
 | |
|     /* network serial number */
 | |
|     uint8_t network_sn;
 | |
|     /* current frequency band ID */
 | |
|     uint8_t freq_band_id;
 | |
|     /* network hplc tx power cap, unit is 1 dbuv */
 | |
|     uint8_t tx_power_cap;
 | |
|     /* last used mac address */
 | |
|     uint8_t addr[6];
 | |
|     /* rf channel, see RF_CHANNEL_ID_XXX */
 | |
|     uint8_t rf_channel;
 | |
|     /* rf option, see RF_OPTION_XXX */
 | |
|     uint8_t rf_option         :2,
 | |
|     /* flag to mark if enable rf channel coordination, default is enabled */
 | |
|             rf_cod_enable     :1,
 | |
|     /* flag to mark if rf tx power is valid */
 | |
|             rf_tx_power_valid :1,
 | |
|     /* flag to mark if enable the authorization process */
 | |
|             auth_enable       :1,
 | |
|     /* encryption mode, see ENCRYP_MODE_XXX */
 | |
|             encrypt_mode      :1,
 | |
|     /* encryption_algorithm, see ENCRYP_ALGO_XXX */
 | |
|             encrypt_algo      :1,
 | |
|     /* reserved for future */
 | |
|             rsvd              :1;
 | |
|     /* network rf tx power cap, unit is 1 dbm */
 | |
|     int8_t  rf_tx_power_cap;
 | |
| } iot_pib_w_cvg_cco_cfg_t;
 | |
| 
 | |
| typedef struct _iot_pib_w_cvg_real_cfg {
 | |
|     /* special mark to make sure config is valid, see CVG_CFG_RW_MARK */
 | |
|     uint32_t mark;
 | |
|     /* reboot count */
 | |
|     uint8_t reboot_cnt;
 | |
|     /* sta role only configuration */
 | |
|     iot_pib_w_cvg_sta_cfg_t sta;
 | |
|     /* cco role only configuration */
 | |
|     iot_pib_w_cvg_cco_cfg_t cco;
 | |
| } iot_pib_w_cvg_real_cfg_t;
 | |
| 
 | |
| typedef struct _iot_pib_w_cvg_cfg {
 | |
|     /* configuration */
 | |
|     iot_pib_w_cvg_real_cfg_t cfg;
 | |
|     /* dummy data to make it a fixed size */
 | |
|     uint8_t dummy[IOT_PIB_W_CVG_SIZE - sizeof(iot_pib_w_cvg_real_cfg_t)];
 | |
| } iot_pib_w_cvg_cfg_t;
 | |
| /* end ----------------------------- cvg read/write config setting */
 | |
| 
 | |
| /* mac config setting */
 | |
| typedef struct _iot_pib_r_mac_cfg {
 | |
|     /* power dBuV, see PHY_FULL_PWR_DBUV */
 | |
|     uint32_t pwr_dbuv                  : 8,
 | |
|     /* 0 - enable auto high power, 1 - disable auto high power */
 | |
|              dis_high_power_req_ena    : 1,
 | |
|     /* flag to mark if the "rf_pwr_dbm" field is valid */
 | |
|              rf_pwr_valid              : 1,
 | |
|     /* reserved for further use */
 | |
|              rsvd                      : 14,
 | |
|     /* rf power dbm, see RF_TX_FULL_PWR_DBM */
 | |
|              rf_pwr_dbm                : 8;
 | |
|     uint8_t dummy[IOT_PIB_R_MAC_SIZE - sizeof(uint32_t)];
 | |
| } iot_pib_r_mac_cfg_t;
 | |
| 
 | |
| /* mac config setting */
 | |
| typedef struct _iot_pib_w_mac_cfg {
 | |
|     uint8_t dummy[IOT_PIB_W_MAC_SIZE];
 | |
| } iot_pib_w_mac_cfg_t;
 | |
| 
 | |
| /* halphy readonly config setting */
 | |
| typedef struct _iot_pib_r_halphy_cfg_info {
 | |
|     /* tx power reduce */
 | |
|     uint8_t tx_pwr_reduce_db;
 | |
|     /* psd fix data */
 | |
|     uint8_t tx_pwr_psd_fix_db;
 | |
|     /* tx pwr ctl enable */
 | |
|     bool_t tx_pwr_ctl_ena;
 | |
|     /* start tone */
 | |
|     uint16_t start_tone;
 | |
|     /* end tone */
 | |
|     uint16_t end_tone;
 | |
|     /* inter time */
 | |
|     uint16_t inter_time;
 | |
| } iot_pib_r_halphy_cfg_info_t;
 | |
| 
 | |
| /* halphy config setting */
 | |
| typedef struct _iot_pib_r_halphy_cfg {
 | |
|     iot_pib_r_halphy_cfg_info_t cfg;
 | |
|     uint8_t dummy[IOT_PIB_R_HALPHY_SIZE - sizeof(iot_pib_r_halphy_cfg_info_t)];
 | |
| } iot_pib_r_halphy_cfg_t;
 | |
| 
 | |
| /* halphy config setting */
 | |
| #define IOI_PHY_GAIN_STEP_NUM       (85)
 | |
| typedef struct _iot_pib_w_halphy_real_cfg {
 | |
|     /* mask */
 | |
|     uint32_t mask;
 | |
|     /* chip id for check valid */
 | |
|     uint32_t chipid_hi;
 | |
|     uint32_t chipid_lo;
 | |
|     /* tx dc cali */
 | |
|     uint16_t tx_dc[4];
 | |
|     /* rx dc cali */
 | |
|     uint16_t rx_dc[IOI_PHY_GAIN_STEP_NUM];
 | |
|     /* bandwidth filter */
 | |
|     uint16_t cap_set[5];
 | |
| } iot_pib_w_halphy_real_cfg_t;
 | |
| 
 | |
| typedef struct _iot_pib_w_halphy_cfg {
 | |
|     /* configuration */
 | |
|     iot_pib_w_halphy_real_cfg_t cfg;
 | |
|     /* dummy data to make it a fixed size */
 | |
|     uint8_t dummy[IOT_PIB_W_HALPHY_SIZE - sizeof(iot_pib_w_halphy_real_cfg_t)];
 | |
| } iot_pib_w_halphy_cfg_t;
 | |
| 
 | |
| /* cli config setting */
 | |
| typedef struct _iot_pib_r_cli_cfg {
 | |
|     uint8_t dummy[IOT_PIB_R_CLI_SIZE];
 | |
| } iot_pib_r_cli_cfg_t;
 | |
| 
 | |
| /* cli config setting */
 | |
| typedef struct _iot_pib_w_cli_cfg {
 | |
|     uint8_t dummy[IOT_PIB_W_CLI_SIZE];
 | |
| } iot_pib_w_cli_cfg_t;
 | |
| 
 | |
| /* upgrage config setting */
 | |
| typedef struct _iot_pib_w_upgrade_cfg {
 | |
|     uint8_t dummy[IOT_PIB_W_UPGRADE_SIZE];
 | |
| } iot_pib_w_upgrade_cfg_t;
 | |
| 
 | |
| /* cco app config settings in read only part */
 | |
| typedef struct _iot_pib_r_cco_app_cfg {
 | |
|     uint8_t dummy[IOT_PIB_R_APP_SIZE];
 | |
| } iot_pib_r_cco_app_cfg_t;
 | |
| 
 | |
| /* sta app config settings in read only part */
 | |
| typedef struct _iot_pib_r_sta_app_cfg {
 | |
|     uint8_t dummy[IOT_PIB_R_APP_SIZE];
 | |
| } iot_pib_r_sta_app_cfg_t;
 | |
| 
 | |
| /* cco app config settings */
 | |
| typedef struct _iot_pib_w_cco_app_cfg_v0 {
 | |
|     uint8_t dummy[IOT_PIB_W_APP_CCO_SIZE_V0];
 | |
| } iot_pib_w_cco_app_cfg_v0_t;
 | |
| 
 | |
| typedef struct _iot_pib_w_cco_app_cfg_v1 {
 | |
|     uint8_t dummy[IOT_PIB_W_APP_CCO_SIZE_V1];
 | |
| } iot_pib_w_cco_app_cfg_v1_t;
 | |
| 
 | |
| /* sta app config settings */
 | |
| typedef struct _iot_pib_w_sta_app_cfg_v0 {
 | |
|     uint8_t dummy[IOT_PIB_W_APP_STA_SIZE_V0];
 | |
| } iot_pib_w_sta_app_cfg_v0_t;
 | |
| 
 | |
| typedef struct _iot_pib_w_sta_app_cfg_v1 {
 | |
|     uint8_t dummy[IOT_PIB_W_APP_STA_SIZE_V1];
 | |
| } iot_pib_w_sta_app_cfg_v1_t;
 | |
| 
 | |
| typedef struct _iot_pib_rw_hdr {
 | |
|     uint32_t crc32;
 | |
|     uint32_t rw_magic;
 | |
|     uint32_t index;
 | |
|     uint32_t rw_len;
 | |
|     uint16_t rw_major;
 | |
|     uint16_t rw_minor;
 | |
|     uint8_t reserved[8];
 | |
| } iot_pib_w_block_hdr;
 | |
| 
 | |
| typedef struct _iot_pib_r_cco {
 | |
|     iot_pib_hdr_t              pibhdr;
 | |
|     iot_pib_r_board_cfg_t      board_cfg;
 | |
|     iot_pib_r_cli_cfg_t        cli_cfg;
 | |
|     iot_pib_r_mac_cfg_t        mac_cfg;
 | |
|     iot_pib_r_halphy_cfg_t     halphy_cfg;
 | |
|     iot_pib_r_cvg_cfg_t        cvg_cfg;
 | |
|     iot_pib_r_cco_app_cfg_t    app_cfg;
 | |
| } iot_pib_r_cco_t;
 | |
| 
 | |
| typedef struct _iot_pib_w_cco_v0 {
 | |
|     iot_pib_hdr_t              pibhdr;
 | |
|     iot_pib_w_board_cfg_t      board_cfg;
 | |
|     iot_pib_w_cli_cfg_t        cli_cfg;
 | |
|     iot_pib_w_upgrade_cfg_t    upgrade_cfg;
 | |
|     iot_pib_w_mac_cfg_t        mac_cfg;
 | |
|     iot_pib_w_halphy_cfg_t     halphy_cfg;
 | |
|     iot_pib_w_cvg_cfg_t        cvg_cfg;
 | |
|     iot_pib_w_cco_app_cfg_v0_t app_cfg;
 | |
| } iot_pib_w_cco_v0_t;
 | |
| 
 | |
| typedef struct _iot_pib_w_cco_v1 {
 | |
|     iot_pib_w_block_hdr        cco_rw_hdr;
 | |
|     iot_pib_hdr_t              pibhdr;
 | |
|     iot_pib_w_board_cfg_t      board_cfg;
 | |
|     iot_pib_w_cli_cfg_t        cli_cfg;
 | |
|     iot_pib_w_upgrade_cfg_t    upgrade_cfg;
 | |
|     iot_pib_w_mac_cfg_t        mac_cfg;
 | |
|     iot_pib_w_halphy_cfg_t     halphy_cfg;
 | |
|     iot_pib_w_cvg_cfg_t        cvg_cfg;
 | |
|     iot_pib_w_cco_app_cfg_v1_t app_cfg;
 | |
| } iot_pib_w_cco_v1_t;
 | |
| 
 | |
| typedef struct _iot_pib_r_sta {
 | |
|     iot_pib_hdr_t              pibhdr;
 | |
|     iot_pib_r_board_cfg_t      board_cfg;
 | |
|     iot_pib_r_cli_cfg_t        cli_cfg;
 | |
|     iot_pib_r_mac_cfg_t        mac_cfg;
 | |
|     iot_pib_r_halphy_cfg_t     halphy_cfg;
 | |
|     iot_pib_r_cvg_cfg_t        cvg_cfg;
 | |
|     iot_pib_r_sta_app_cfg_t    app_cfg;
 | |
| } iot_pib_r_sta_t;
 | |
| 
 | |
| typedef struct _iot_pib_w_sta_v0 {
 | |
|     iot_pib_hdr_t              pibhdr;
 | |
|     iot_pib_w_board_cfg_t      board_cfg;
 | |
|     iot_pib_w_cli_cfg_t        cli_cfg;
 | |
|     iot_pib_w_upgrade_cfg_t    upgrade_cfg;
 | |
|     iot_pib_w_mac_cfg_t        mac_cfg;
 | |
|     iot_pib_w_halphy_cfg_t     halphy_cfg;
 | |
|     iot_pib_w_cvg_cfg_t        cvg_cfg;
 | |
|     iot_pib_w_sta_app_cfg_v0_t app_cfg;
 | |
| } iot_pib_w_sta_v0_t;
 | |
| 
 | |
| typedef struct _iot_pib_w_sta_v1 {
 | |
|     iot_pib_w_block_hdr        sta_rw_hdr;
 | |
|     iot_pib_hdr_t              pibhdr;
 | |
|     iot_pib_w_board_cfg_t      board_cfg;
 | |
|     iot_pib_w_cli_cfg_t        cli_cfg;
 | |
|     iot_pib_w_upgrade_cfg_t    upgrade_cfg;
 | |
|     iot_pib_w_mac_cfg_t        mac_cfg;
 | |
|     iot_pib_w_halphy_cfg_t     halphy_cfg;
 | |
|     iot_pib_w_cvg_cfg_t        cvg_cfg;
 | |
|     iot_pib_w_sta_app_cfg_v1_t app_cfg;
 | |
| } iot_pib_w_sta_v1_t;
 | |
| 
 | |
| typedef iot_pib_w_sta_v1_t iot_pib_w_sta_t;
 | |
| typedef iot_pib_w_cco_v1_t iot_pib_w_cco_t;
 | |
| 
 | |
| typedef struct _iot_pib_cco_mem {
 | |
|     iot_pib_r_cco_t            r_ccopib;
 | |
|     iot_pib_w_cco_t            w_ccopib;
 | |
| }iot_pib_cco_mem_t;
 | |
| 
 | |
| typedef struct _iot_pib_sta_mem {
 | |
|     iot_pib_r_sta_t            r_stapib;
 | |
|     iot_pib_w_sta_t            w_stapib;
 | |
| }iot_pib_sta_mem_t;
 | |
| 
 | |
| /* pib section size check */
 | |
| typedef union {
 | |
|     uint8_t iot_pib_r_hdr_chk[IOT_PIB_R_HEAD_SIZE - \
 | |
|         sizeof(iot_pib_hdr_t) + 1];
 | |
|     uint8_t iot_pib_w_hdr_chk[IOT_PIB_W_HEAD_SIZE - \
 | |
|         sizeof(iot_pib_hdr_t) + 1];
 | |
|     uint8_t iot_pib_r_board_cfg_chk[IOT_PIB_R_BOARD_SIZE \
 | |
|         - sizeof(iot_pib_r_board_cfg_t) + 1];
 | |
|     uint8_t iot_pib_w_board_cfg_chk[IOT_PIB_W_BOARD_SIZE \
 | |
|         - sizeof(iot_pib_w_board_cfg_t) + 1];
 | |
|     uint8_t iot_pib_r_cvg_cfg_chk[IOT_PIB_R_CVG_SIZE - \
 | |
|         sizeof (iot_pib_r_cvg_cfg_t) + 1];
 | |
|     uint8_t iot_pib_w_cvg_cfg_chk[IOT_PIB_W_CVG_SIZE - \
 | |
|         sizeof(iot_pib_w_cvg_cfg_t) + 1];
 | |
|     uint8_t iot_pib_r_mac_cfg_chk[IOT_PIB_R_MAC_SIZE -\
 | |
|         sizeof(iot_pib_r_mac_cfg_t) + 1];
 | |
|     uint8_t iot_pib_w_mac_cfg_chk[IOT_PIB_W_MAC_SIZE - \
 | |
|         sizeof(iot_pib_w_mac_cfg_t) + 1];
 | |
|     uint8_t iot_pib_r_halphy_cfg_chk[IOT_PIB_R_HALPHY_SIZE -\
 | |
|         sizeof(iot_pib_r_halphy_cfg_t) + 1];
 | |
|     uint8_t iot_pib_w_halphy_cfg_chk[IOT_PIB_W_HALPHY_SIZE - \
 | |
|         sizeof(iot_pib_w_halphy_cfg_t) + 1];
 | |
|     uint8_t iot_pib_r_cli_cfg_chk[IOT_PIB_R_CLI_SIZE - \
 | |
|         sizeof(iot_pib_r_cli_cfg_t) + 1];
 | |
|     uint8_t iot_pib_w_cli_cfg_chk[IOT_PIB_W_CLI_SIZE - \
 | |
|         sizeof(iot_pib_w_cli_cfg_t) + 1];
 | |
|     uint8_t iot_cco_whtielist_chk[IOT_PIB_W_APP_CCO_SIZE_V1 - \
 | |
|         sizeof(iot_pib_w_cco_app_cfg_v1_t) + 1];
 | |
|     uint8_t iot_sta_meterlist_chk[IOT_PIB_W_APP_STA_SIZE_V1 -\
 | |
|         sizeof(iot_pib_w_sta_app_cfg_v1_t) + 1];
 | |
|     uint8_t iot_pib_w_upgrade_cfg_chk[IOT_PIB_W_UPGRADE_SIZE - \
 | |
|         sizeof(iot_pib_w_upgrade_cfg_t) + 1];
 | |
| } piblen_audit;
 | |
| 
 | |
| /**
 | |
|  * @brief      iot_pib_get_section() - function used to get specific module
 | |
|  *                        cfg data struct.
 | |
|  * @param      module_id: pib module layout index.
 | |
|  * @param      psection:  return pib section start address.
 | |
|  * @param      pibtype:   return pib type.
 | |
|  * @param      rw:        get read only memory or
 | |
|  *                        writable memory, see IOT_PIB_GET_XXX_SECTION.
 | |
|  * @return                0          -   success.
 | |
|  * @return                otherwise  -   error code.
 | |
|  */
 | |
| uint32_t iot_pib_get_section(uint8_t module_id, uint8_t **psection,
 | |
|     iot_pib_type_t *pibtype, uint8_t rw);
 | |
| 
 | |
| /**
 | |
|  * @brief     iot_pib_get_full_section() - function used to get full cfg data
 | |
|  *                       struct.
 | |
|  * @param     ptr_pib:   return pib start address include read only
 | |
|  *                       memory and writable memory.
 | |
|  * @param     pibtype:   return pib type.
 | |
|  * @return    NULL   -   error, not find pib.
 | |
|  * @return    otherwise   -   pib memory start address.
 | |
|  */
 | |
| uint32_t iot_pib_get_full_section(uint32_t *ptr_pib, iot_pib_type_t *pibtype);
 | |
| 
 | |
| /*
 | |
|  *  About PIB framework working model
 | |
|  *    PIB framework will load config from flash in RAM at system startup.
 | |
|  *    PIB framework owner has direct read/write right for their own space in
 | |
|  *  RAM. other module only have direct read access in RAM.
 | |
|  *
 | |
|  *   Each module has right to submit commit request. PIB module will handle the
 | |
|  *  request in silence way. Since other module may submit commit request while
 | |
|  *  module owner change self config in RAM.  In order to protect change config
 | |
|  *  process not break by other module commit, owner should hold commit ref when
 | |
|  *  change begin, and release commit ref as change finished.
 | |
|  *    PIB framework will think module change complete when ref cont is zero.
 | |
|  *    PIB framework will check every module's ref, and do real write flash only
 | |
|  *  when all cont zero.
 | |
|  *    Module space write will not be blocked by commit request. PIB framework
 | |
|  *  will handle it.
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * @brief    iot_pib_acquire_commit_ref() - function to hold pib commit execute
 | |
|  *                         until free commit reference.
 | |
|  * @param    module_id:    pib module layout index, indicate which module
 | |
|  *                         to ask for reference.
 | |
|  * @param    cur_refcount: per module currently reference counter.
 | |
|  * @return                 0      -   success.
 | |
|  * @retval                 otherwise   -   error.
 | |
|  */
 | |
| uint32_t iot_pib_acquire_commit_ref(uint8_t module_id, uint8_t *cur_refcount);
 | |
| 
 | |
| /**
 | |
|  * @brief    iot_pib_release_commit_ref() - function to release pib commit
 | |
|  *                          reference count.
 | |
|  * @param    module_id:     pib module layout index, indicate which module
 | |
|  *                          to release.
 | |
|  * @param    cur_refcount:  per module currently reference counter.
 | |
|  * @return                  0    -   success.
 | |
|  * @return                  otherwise   -   error.
 | |
|  */
 | |
| uint32_t iot_pib_release_commit_ref(uint8_t module_id, uint8_t *cur_refcount);
 | |
| 
 | |
| /**
 | |
|  * @brief     iot_pib_load() - function used to read pib out of flash.
 | |
|  * @param     upgraded:      if boot from upgrade
 | |
|  * @return                   0   -   success.
 | |
|  * @return                   otherwise   -   error case.
 | |
|  */
 | |
| uint32_t iot_pib_load(bool_t upgraded);
 | |
| 
 | |
| /**
 | |
|  * @brief     iot_pib_init() - function used to init pib resources.
 | |
|  * @return    0    -   success.
 | |
|  * @return    otherwise   -   error case.
 | |
|  */
 | |
| uint32_t iot_pib_init(void);
 | |
| 
 | |
| /**
 | |
|  * @brief    iot_pib_deinit() - function used to release pib resources.
 | |
|  * @return   0     -   success.
 | |
|  * @return   otherwise   -   error case.
 | |
|  */
 | |
| uint32_t iot_pib_deinit(void);
 | |
| 
 | |
| /**
 | |
|  * @brief   iot_pib_commit() - function used by module to trigger write pib
 | |
|  *                             to flash.
 | |
|  * @param   request_module_id: module index which trying to trigger write
 | |
|                                action.
 | |
|  * @param   commit_type:       module apply for write condition.
 | |
|  * @return                     0    -   error, not find pib.
 | |
|  * @return                     otherwise   -   pib memory start address.
 | |
|  */
 | |
| uint32_t iot_pib_commit(uint8_t req_module_id,
 | |
|     iot_pib_commit_type_t commit_type, uint16_t* commit_ticket);
 | |
| 
 | |
| /**
 | |
|  * @brief iot_pib_report_commit_status_func_t() - function callback to
 | |
|  *                          receive pib commit status.
 | |
|  * @param status:           pib commit status. see IOT_PIB_STATUS_COMMIT_XXX.
 | |
|  * @param commit_ticket:    commit ticket number which already done saving
 | |
|  */
 | |
| typedef void(*iot_pib_report_commit_status_func_t)(uint8_t status,
 | |
|     uint16_t commit_ticket);
 | |
| 
 | |
| /**
 | |
|  * @brief   iot_pib_register_commit_cb() - register pib commit callback
 | |
|  *                      function
 | |
|  * @param   module_id:  pib module id.
 | |
|  * @param   cb:         callback function.
 | |
|  * @return              0        - success.
 | |
|  * @return              otherwise - fail.
 | |
|  */
 | |
| uint32_t iot_pib_register_commit_cb(uint32_t module_id,
 | |
|     iot_pib_report_commit_status_func_t cb);
 | |
| 
 | |
| /**
 | |
|  * @brief   iot_pib_get_crc_status(uint8_t *r_crc, uint8_t* w_crc) - get
 | |
|  *                      read/write section crc status. caller module
 | |
|  *                      should not use cfg data if crc is wrong
 | |
|  * @param  r_crc:       0 -crc wrong. 1 - crc valid
 | |
|  * @param  w_crc:       0 -crc wrong. 1 - crc valid
 | |
|  * @return              0         - success.
 | |
|  * @return              otherwise - fail.
 | |
|  */
 | |
| void iot_pib_get_crc_status(uint8_t* r_crc, uint8_t* w_crc);
 | |
| 
 | |
| #pragma pack(pop)   // restore the pack status
 | |
| 
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif /* IOT_PIB_H */
 |