646 lines
19 KiB
C
646 lines
19 KiB
C
/****************************************************************************
|
|
|
|
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 PLC_MPDU_HEADER_H
|
|
#define PLC_MPDU_HEADER_H
|
|
|
|
///This file define data struct share between CVG and MAC
|
|
|
|
/* os shim includes */
|
|
#include "os_types_api.h"
|
|
|
|
#include "plc_fr.h"
|
|
#include "iot_utils_api.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* This file contains the beacon structure definition
|
|
* and function to get/set the related field for packed
|
|
* structure
|
|
*/
|
|
|
|
/* pack for the structures in the whole file */
|
|
#pragma pack(push) // save the pack status
|
|
#pragma pack(1) // 1 byte align
|
|
|
|
#define DBG_PKT_VERSION (0xf)
|
|
|
|
enum FC_DELIM_TYPE {
|
|
FC_DELIM_BEACON = 0,
|
|
DT_AV_BEACON = 0,
|
|
FC_DELIM_SOF = 1,
|
|
DT_AV_SOF = 1,
|
|
FC_DELIM_SACK = 2,
|
|
DT_AV_SACK = 2,
|
|
FC_DELIM_NNCCO = 3,
|
|
DT_AV_RTS_CTS = 3,
|
|
FC_DELIM_SOUND = 4,
|
|
DT_AV_SOUND = 4, //self defined type for dtest
|
|
I1901_RTS_CTS = 4,
|
|
DT_AV_RSOF = 5,
|
|
/* custom delimiter type for RF test */
|
|
FC_DELIM_RF_TEST = 7,
|
|
};
|
|
|
|
/* define RF test type */
|
|
typedef enum {
|
|
/* tx calibration */
|
|
RF_TEST_TYPE_TX_CALI = 0,
|
|
} RF_TEST_TYPE_T;
|
|
|
|
/* define RF test tx calibration register type */
|
|
typedef enum {
|
|
RF_TEST_TX_CALI_REG_IQ_MAG = 0,
|
|
RF_TEST_TX_CALI_REG_IQ_PHASE = 1,
|
|
RF_TEST_TX_CALI_REG_IQ_DC = 2,
|
|
} RF_TEST_TX_CALI_REG_T;
|
|
|
|
#define PLC_MPDU_FC_LEN 16
|
|
#define PLC_MPDU_FCCS_LEN 3
|
|
#define SG_STANDARD_VERSION 0
|
|
|
|
/* MPDU Frame control */
|
|
typedef PREPACK struct _frame_control {
|
|
union{
|
|
struct{
|
|
uint32_t delimiter_type : 3, //Normal mode
|
|
network_type : 5,
|
|
nid : 24;
|
|
};
|
|
struct{
|
|
uint32_t delimiter_type_v3 : 3, //encryption mode
|
|
aes_key_sel : 5,
|
|
nid_v3 : 24;
|
|
};
|
|
};
|
|
union {
|
|
struct {
|
|
uint32_t time_stamp : 32; /* NTB */
|
|
uint16_t src_tei : 12,
|
|
tmi : 4;
|
|
uint16_t sym_num : 9,
|
|
phase_num : 2,
|
|
resv : 5;
|
|
uint32_t resv2 : 4,
|
|
version : 4,
|
|
fccs : 24;
|
|
} bcn;
|
|
struct {
|
|
uint32_t src_tei : 12,
|
|
dst_tei : 12,
|
|
lid : 8;
|
|
uint16_t frame_len : 12, /* unit 10us */
|
|
pb_num : 4;
|
|
uint16_t sym_num : 9,
|
|
bcast : 1,
|
|
retry : 1,
|
|
encry : 1,
|
|
tmi : 4;
|
|
union{
|
|
struct{
|
|
uint32_t tmi_ext : 4, //Normal mode
|
|
version : 4,
|
|
fccs : 24;
|
|
};
|
|
struct{
|
|
uint32_t tmi_ext_v3 : 4, //encryption mode
|
|
decrypt_mode : 2,
|
|
aes_key_table_sel : 2,
|
|
fccs_v3 : 24;
|
|
};
|
|
};
|
|
} sof;
|
|
struct {
|
|
/* TODO */
|
|
uint32_t rx_result : 4,
|
|
rx_status : 4,
|
|
stei : 12,
|
|
dtei : 12;
|
|
uint32_t rx_pb : 3,
|
|
resv0 : 5,
|
|
snr : 8,
|
|
load : 8,
|
|
resv1 : 8;
|
|
uint32_t ext_deli : 4,
|
|
version : 4,
|
|
fccs : 24;
|
|
} sack;
|
|
/* neighbor network CCo communication */
|
|
struct {
|
|
/* TODO */
|
|
uint32_t duration : 16,
|
|
sbandoffset : 16;
|
|
uint32_t receive_nid : 24,
|
|
self_rf_channel : 8;
|
|
uint32_t self_rf_option : 2,
|
|
resv1 : 2,
|
|
version : 4,
|
|
fccs:24;
|
|
} nn_cco;
|
|
/* neighbor network CCO communication between MAC and ISR. for
|
|
* neighbor network negotiation frame tx, we have to make
|
|
* make sure the sbandoffset and duration as accurate as possible.
|
|
* We use this format to transfer useful info from MAC SW to ISR so
|
|
* that ISR can fill in accurate info right before each TX. Right
|
|
* before each TX, MAC HW will trigger interrupt and ISR will fill in
|
|
* right info before BB send it out.
|
|
* Note that for simulator case, we use nn_cco_sw for communication
|
|
* among CCO to make it simple.
|
|
*/
|
|
struct {
|
|
/* lower 32bit start ntb of the protected region */
|
|
uint32_t start_ntb_l32;
|
|
/* watched neighbor network id */
|
|
uint64_t receive_nid : 24,
|
|
/* duration of the protected region */
|
|
duration : 16,
|
|
/* higher 24bit start ntb of the protected region, we ignore the
|
|
* highest 8bit as 60 years are long enough.
|
|
*/
|
|
start_ntb_h24 : 24;
|
|
} nn_cco_sw;
|
|
struct {
|
|
uint32_t time_stamp : 32; /* NTB */
|
|
uint16_t stei : 12,
|
|
rsv0 : 4;
|
|
uint16_t rsv1 : 8,
|
|
rsv2 : 8;
|
|
uint32_t ext_type : 4,
|
|
version : 4,
|
|
fccs : 24;
|
|
} sync;
|
|
struct {
|
|
uint8_t mac_addr[IOT_MAC_ADDR_LEN];
|
|
uint16_t stei : 12,
|
|
rsv4 : 4;
|
|
uint32_t ext_type : 4,
|
|
version : 4,
|
|
fccs : 24;
|
|
} search;
|
|
struct {
|
|
uint32_t time_stamp : 32; /* NTB */
|
|
uint16_t src_tei : 12,
|
|
mcs : 4;
|
|
uint16_t pb_sz_idx : 4, /* pb size index */
|
|
resv0 : 12;
|
|
uint32_t resv1 : 4,
|
|
version : 4,
|
|
fccs : 24;
|
|
} rf_bcn;
|
|
struct {
|
|
uint32_t src_tei : 12,
|
|
dst_tei : 12,
|
|
lid : 8;
|
|
uint16_t frame_len : 12, /* unit 100us */
|
|
pb_sz_idx : 4;
|
|
uint16_t resv0 : 9,
|
|
bcast : 1,
|
|
retry : 1,
|
|
encry : 1,
|
|
mcs : 4;
|
|
uint32_t resv1 : 4,
|
|
version : 4,
|
|
fccs : 24;
|
|
} rf_sof;
|
|
struct {
|
|
uint32_t rx_result : 4,
|
|
resv0 : 4,
|
|
stei : 12,
|
|
dtei : 12;
|
|
uint32_t resv1 : 8,
|
|
snr : 8,
|
|
load : 8,
|
|
resv2 : 8;
|
|
uint32_t ext_deli : 4,
|
|
version : 4,
|
|
fccs : 24;
|
|
} rf_sack;
|
|
/* Rf test tx calibration fc variable region */
|
|
struct {
|
|
/* dvice id magic number */
|
|
uint16_t dev_id_magic;
|
|
/* tx calibration register combination magic number */
|
|
uint32_t reg_magic;
|
|
/* rf tx calibration register type, see RF_TEST_TX_CALI_REG_XXX */
|
|
uint16_t reg_type :3,
|
|
/* rserved for future use */
|
|
rsvd :13;
|
|
/* test type, see RF_TEST_TYPE_XXX */
|
|
uint32_t test_type :4,
|
|
/* protocol Version */
|
|
version :4,
|
|
/* check code */
|
|
fccs :24;
|
|
} rf_test_tx_cali;
|
|
} vf;
|
|
} POSTPACK frame_control_t;
|
|
|
|
#define SPG_STANDARD_VERSION 1
|
|
|
|
typedef PREPACK struct _spg_frame_control {
|
|
uint8_t delimiter_type : 3,
|
|
access_ind : 1,
|
|
snid : 4;
|
|
union {
|
|
struct {
|
|
uint32_t time_stamp : 32;
|
|
uint32_t bcn_period_cnt : 32;
|
|
uint16_t src_tei : 12,
|
|
tmi : 4;
|
|
uint16_t sym_num : 9,
|
|
resv1 : 1,
|
|
phase_num : 2,
|
|
version : 4;
|
|
uint8_t fccs[3];
|
|
} bcn;
|
|
struct {
|
|
uint32_t src_tei : 12,
|
|
dst_tei : 12,
|
|
lid : 8;
|
|
union{
|
|
struct{
|
|
uint16_t resv1 : 16; //Normal mode
|
|
};
|
|
struct{
|
|
uint16_t aes_key_sel : 5, //encryption mode
|
|
aes_key_table_sel : 2,
|
|
resv1_v3 : 9;
|
|
};
|
|
};
|
|
uint8_t pb_num : 4,
|
|
tmi : 4;
|
|
uint32_t frm_len : 12,
|
|
resv2 : 9,
|
|
tei_filter_flag : 1,
|
|
retry : 1,
|
|
sym_num : 9;
|
|
union{
|
|
struct{
|
|
uint32_t tmi_ext : 4, //Normal mode
|
|
version : 4,
|
|
fccs : 24;
|
|
};
|
|
struct{
|
|
uint32_t tmi_ext_v3 : 4, //encryption mode
|
|
decrypt_mode : 4,
|
|
fccs_v3 : 24;
|
|
};
|
|
};
|
|
} sof;
|
|
struct {
|
|
uint8_t rx_result : 4,
|
|
rx_status : 4;
|
|
uint16_t dtei : 12,
|
|
rx_pb : 4;
|
|
uint32_t resv1 : 32;
|
|
uint32_t resv2 : 32;
|
|
uint32_t ext_deli : 4,
|
|
version : 4,
|
|
fccs : 24;
|
|
} sack;
|
|
struct {
|
|
uint16_t neighbor_network : 16;
|
|
uint32_t self_rf_channel : 8,
|
|
resv0 : 10,
|
|
conti_time : 14;
|
|
uint8_t resv1 : 1,
|
|
bwth_end_flag : 1,
|
|
self_rf_option : 2,
|
|
resv4 : 4;
|
|
uint16_t bwth_end_shift : 16;
|
|
uint16_t bwth_start_shift : 16;
|
|
uint32_t resv : 4,
|
|
version : 4,
|
|
fccs : 24;
|
|
} nn_cco;
|
|
/* neighbor network CCO communication between MAC and ISR. for
|
|
* neighbor network negotiation frame tx, we have to make
|
|
* make sure the sbandoffset and duration as accurate as possible.
|
|
* We use this format to transfer useful info from MAC SW to ISR so
|
|
* that ISR can fill in accurate info right before each TX. Right
|
|
* before each TX, MAC HW will trigger interrupt and ISR will fill in
|
|
* right info before BB send it out.
|
|
* Note that for simulator case, we use nn_cco_sw for cummunication
|
|
* among CCO to make it simple.
|
|
*/
|
|
struct {
|
|
/* lower 32bit start ntb of the protected region */
|
|
uint32_t start_ntb_l32;
|
|
/* watched neighbor network id */
|
|
uint32_t neighbor_network : 16,
|
|
/* duration of the protected region */
|
|
duration : 14,
|
|
resv4 : 2;
|
|
|
|
/* higher 24bit start ntb of the protected region, we ignore the
|
|
* highest 8bit as 60 years are long enough.
|
|
*/
|
|
uint32_t start_ntb_h24 : 24,
|
|
resv0: 8;
|
|
uint16_t last_offsetl;
|
|
uint8_t last_offseth; /* last_offset 24bit*/
|
|
} nn_cco_sw;
|
|
struct {
|
|
uint32_t time_stamp; /* NTB */
|
|
uint16_t stei : 12,
|
|
rsv0 : 4;
|
|
uint32_t rsv1;
|
|
uint8_t sn;
|
|
uint32_t ext_type : 4,
|
|
version : 4,
|
|
fccs : 24;
|
|
} sync;
|
|
struct {
|
|
uint8_t mac_addr[IOT_MAC_ADDR_LEN];
|
|
uint16_t stei : 12,
|
|
rsv0 : 4;
|
|
uint16_t rsv1;
|
|
uint8_t sn;
|
|
uint32_t ext_type : 4,
|
|
version : 4,
|
|
fccs : 24;
|
|
} search;
|
|
struct {
|
|
uint32_t time_stamp;
|
|
uint32_t bcn_period_cnt;
|
|
uint16_t src_tei : 12,
|
|
mcs : 4;
|
|
uint16_t pb_sz_idx : 4,
|
|
resv0 : 8,
|
|
version : 4;
|
|
uint8_t fccs[3];
|
|
} rf_bcn;
|
|
struct {
|
|
uint32_t src_tei : 12,
|
|
dst_tei : 12,
|
|
lid : 8;
|
|
uint16_t frame_len : 12, /* unit 100us */
|
|
pb_sz_idx : 4;
|
|
uint8_t mcs : 4,
|
|
tei_filter_flag : 1,
|
|
retry : 1,
|
|
resv0 : 2;
|
|
uint32_t resv1;
|
|
uint32_t resv2 : 4,
|
|
version : 4,
|
|
fccs : 24;
|
|
} rf_sof;
|
|
struct {
|
|
uint32_t rx_result : 4,
|
|
resv0 : 4,
|
|
dtei : 12,
|
|
resv1 : 12;
|
|
uint32_t resv2;
|
|
uint32_t resv3 : 24,
|
|
ext_deli : 4,
|
|
version : 4;
|
|
uint8_t fccs[3];
|
|
} rf_sack;
|
|
/* Rf test tx calibration fc variable region */
|
|
struct {
|
|
/* dvice id magic number */
|
|
uint16_t dev_id_magic;
|
|
/* tx calibration register combination magic number */
|
|
uint32_t reg_magic;
|
|
/* rf tx calibration register type, see RF_TEST_TX_CALI_REG_XXX */
|
|
uint16_t reg_type :3,
|
|
/* rserved for future use */
|
|
resv0 :13;
|
|
uint32_t resv1 :24,
|
|
/* test type, see RF_TEST_TYPE_XXX */
|
|
test_type :4,
|
|
/* protocol Version */
|
|
version :4;
|
|
/* check code */
|
|
uint8_t fccs[3];
|
|
} rf_test_tx_cali;
|
|
} vf;
|
|
} POSTPACK spg_frame_control_t;
|
|
|
|
|
|
typedef PREPACK struct _hp10_frame_control {
|
|
uint32_t cc : 1,
|
|
dt : 3,
|
|
vf : 13,
|
|
fccs : 8,
|
|
resv : 7;
|
|
} POSTPACK hp10_frame_control;
|
|
|
|
#define HPAV_MPDU_FC_LEN 16
|
|
#define HPAV_MPDU_FCCS_LEN 3
|
|
|
|
typedef PREPACK struct _hpav_frame_control {
|
|
uint8_t delimiter_type : 3,
|
|
access : 1,
|
|
snid : 4;
|
|
union {
|
|
struct {
|
|
uint32_t bts;
|
|
uint32_t bto0 : 16,
|
|
bto1 : 16;
|
|
uint32_t bto2 : 16,
|
|
bto3 : 16;
|
|
} bcn;
|
|
/* sof */
|
|
struct {
|
|
uint16_t src_tei : 8,
|
|
dst_tei : 8;
|
|
uint8_t lid;
|
|
uint32_t cfs : 1,
|
|
bdf : 1,
|
|
hp10df : 1,
|
|
hp11df : 1,
|
|
eks : 4,
|
|
pbb : 8,
|
|
ble : 8,
|
|
pbsz : 1,
|
|
numsym : 2,
|
|
tmi_av : 5;
|
|
uint32_t fl_av : 12,
|
|
mpdu_cnt : 2,
|
|
burst_cnt : 2,
|
|
bbf : 1,
|
|
mrtfl : 4,
|
|
dcppcf : 1,
|
|
mcf : 1,
|
|
mnbf : 1,
|
|
rsr : 1,
|
|
clst : 1,
|
|
mfs_cmd_mgmt : 3,
|
|
mfs_cmd_data : 3;
|
|
uint8_t mfs_rsp_mgmt : 2,
|
|
mfs_rsp_data : 2,
|
|
bm_sacki : 4;
|
|
} sof;
|
|
/* sack */
|
|
struct {
|
|
uint16_t dst_tei : 8,
|
|
cfs : 1,
|
|
bdf : 1,
|
|
svn : 1,
|
|
rrtf : 1,
|
|
mfs_rsp_data : 2,
|
|
mfs_rsp_mgmt : 2;
|
|
uint8_t sackt3 : 2,
|
|
sackt2: 2,
|
|
sackt1: 2,
|
|
sackt0: 2;
|
|
uint8_t sackd_bitpad_var[8];
|
|
uint8_t rx_winsz : 4,
|
|
rrtl : 4;
|
|
} sack;
|
|
/* rts cts */
|
|
struct {
|
|
uint16_t src_tei : 8,
|
|
dst_tei : 8;
|
|
uint8_t lid;
|
|
uint32_t cfs : 1,
|
|
bdf : 1,
|
|
hp10df : 1,
|
|
hp11df : 1,
|
|
rtsf : 1,
|
|
igf : 1,
|
|
mnbf : 1,
|
|
mcf : 1,
|
|
dur : 14,
|
|
rsvd0 : 10;
|
|
uint8_t rsvd1[5];
|
|
} rtscts;
|
|
/* sound */
|
|
struct {
|
|
uint32_t stei : 8,
|
|
dtei : 8,
|
|
lid : 8,
|
|
cfs : 1,
|
|
pbsz : 1,
|
|
bdf : 1,
|
|
saf : 1,
|
|
scf : 1,
|
|
req_tm : 3;
|
|
uint16_t fl_av : 12,
|
|
mpducnt : 2,
|
|
rsvd0 : 2;
|
|
uint8_t ppb;
|
|
uint8_t src;
|
|
uint32_t resvd;
|
|
} sound;
|
|
/* rsof */
|
|
struct {
|
|
uint16_t dst_tei : 8,
|
|
cfs : 1,
|
|
bdf : 1,
|
|
svn : 1,
|
|
rrtf : 1,
|
|
mfs_rsp_data : 2,
|
|
mfs_rsp_mgmt : 2;
|
|
uint8_t sackd_bitpad_var[6];
|
|
uint8_t rx_winsz : 4,
|
|
rrtl : 4;
|
|
uint16_t rsof_fl_av : 10,
|
|
tmi_av : 5,
|
|
pbsz : 1;
|
|
uint8_t num_sym : 2,
|
|
mfs_cmd_data : 3,
|
|
mfs_cmd_mgmt : 3;
|
|
}rsof;
|
|
} vf_av;
|
|
struct {
|
|
uint8_t fccs_av0;
|
|
uint8_t fccs_av1;
|
|
uint8_t fccs_av2;
|
|
} fccs_av;
|
|
} POSTPACK hpav_frame_control;
|
|
|
|
typedef PREPACK struct _i1901_frame_control {
|
|
uint32_t delimiter_type : 3,
|
|
network_type : 5,
|
|
nid : 24;
|
|
union {
|
|
struct {
|
|
uint32_t time_stamp; /* NTB */
|
|
uint16_t stei : 12,
|
|
tmi : 4;
|
|
uint16_t phase_num : 2,
|
|
pss : 4,
|
|
resv : 10;
|
|
uint32_t resv1 : 4,
|
|
version : 4,
|
|
fccs : 24;
|
|
} bcn;
|
|
struct {
|
|
uint32_t stei : 12,
|
|
dtei : 12,
|
|
lid : 8;
|
|
uint16_t frame_len : 12, /* unit 10us */
|
|
pb_num : 4;
|
|
uint16_t bcast : 1,
|
|
retry : 1,
|
|
encry : 2,
|
|
tmi : 4,
|
|
tmi_ext : 1,
|
|
pss :4,
|
|
resv : 3;
|
|
uint32_t resv1 : 4,
|
|
version : 4,
|
|
fccs : 24;
|
|
} sof;
|
|
struct {
|
|
uint32_t result : 4,
|
|
stei : 12,
|
|
dtei : 12,
|
|
rx_pb : 3,
|
|
resv : 1;
|
|
uint32_t snr : 8,
|
|
load : 8,
|
|
resv1 : 16;
|
|
uint32_t ext_deli : 4,
|
|
version : 4,
|
|
fccs : 24;
|
|
} sack;
|
|
struct {
|
|
uint32_t duration : 16,
|
|
sbandoffset : 16;
|
|
uint32_t receive_nid : 24,
|
|
resv : 8;
|
|
uint32_t resv1 : 4,
|
|
version : 4,
|
|
fccs : 24;
|
|
} nn_cco;
|
|
struct {
|
|
uint32_t stei : 12,
|
|
dtei : 12,
|
|
lid : 8;
|
|
uint32_t mnbf : 1,
|
|
rtsf : 1,
|
|
encry : 2,
|
|
dur : 12,
|
|
resv : 16;
|
|
uint32_t resv1 : 4,
|
|
version : 4,
|
|
fccs : 24;
|
|
} rts_cts;
|
|
} vf;
|
|
} POSTPACK i1901_frame_control_t;
|
|
|
|
#pragma pack(pop) // restore the pack status
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* PLC_MPDU_HEADER_H */
|