Files
kunlun/inc/pib/iot_pib.h

827 lines
29 KiB
C
Raw Normal View History

2024-09-28 14:24:04 +08:00
/****************************************************************************
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 */