diff --git a/components/mac154/CMakeLists.txt b/components/mac154/CMakeLists.txt new file mode 100644 index 00000000..1d5fd239 --- /dev/null +++ b/components/mac154/CMakeLists.txt @@ -0,0 +1,42 @@ +################# Add global include ################# +list(APPEND ADD_INCLUDE "${CMAKE_CURRENT_SOURCE_DIR}/bl702_rf/include") +list(APPEND ADD_INCLUDE "${CMAKE_CURRENT_SOURCE_DIR}/lmac154/include") +####################################################### + +################# Add private include ################# +# list(APPEND ADD_PRIVATE_INCLUDE +# ) +####################################################### + +############## Add current dir source files ########### +add_library(lmac154 STATIC IMPORTED) +set_target_properties(lmac154 PROPERTIES +IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/components/mac154/lmac154/lib/liblmac154.a" +INTERFACE_LINK_LIBRARIES "${CMAKE_SOURCE_DIR}/components/mac154/bl702_rf/lib/libbl702_rf.a") +####################################################### + +########### Add required/dependent components ######### +list(APPEND ADD_REQUIREMENTS lmac154) +####################################################### + +############ Add static libs ########################## +# list(APPEND ADD_STATIC_LIB "${CMAKE_CURRENT_SOURCE_DIR}/bl702_rf/lib/libbl702_rf.a") +# list(APPEND ADD_STATIC_LIB "${CMAKE_CURRENT_SOURCE_DIR}/lmac154/lib/liblmac154.a") +####################################################### + +############ Add dynamic libs ######################### +# list(APPEND ADD_DYNAMIC_LIB "libxxx.so" +# ) +####################################################### + +############ Add global compile option ################ +#add components denpend on this component +# list(APPEND ADD_DEFINITIONS -Dxxx) +####################################################### + +############ Add private compile option ################ +#add compile option for this component that won't affect other modules +# list(APPEND ADD_PRIVATE_DEFINITIONS -Dxxx) +####################################################### + +generate_library() diff --git a/components/mac154/bl702_rf/include/bl702_rf_public.h b/components/mac154/bl702_rf/include/bl702_rf_public.h new file mode 100644 index 00000000..3f0d7963 --- /dev/null +++ b/components/mac154/bl702_rf/include/bl702_rf_public.h @@ -0,0 +1,15 @@ +#ifndef _BL702_RF_PUBLIC_H_ +#define _BL702_RF_PUBLIC_H_ + + +#include + + +uint32_t rf702_set_init_tsen_value(int16_t tsen_value); +uint32_t rf702_inc_cal_tsen_based(int16_t tsen_value); + +// callback function, should be implemented by user +void rf_reset_done_callback(void); + + +#endif diff --git a/components/mac154/bl702_rf/lib/libbl702_rf.a b/components/mac154/bl702_rf/lib/libbl702_rf.a new file mode 100644 index 00000000..ad83aacf Binary files /dev/null and b/components/mac154/bl702_rf/lib/libbl702_rf.a differ diff --git a/components/mac154/lmac154/include/lmac154.h b/components/mac154/lmac154/include/lmac154.h new file mode 100644 index 00000000..39f724af --- /dev/null +++ b/components/mac154/lmac154/include/lmac154.h @@ -0,0 +1,1029 @@ +#ifndef __LMAC154_H__ +#define __LMAC154_H__ + + +#include +#include +#include + + +typedef void (*lmac154_isr_t)(void); + + +typedef enum { + LMAC154_CHANNEL_11 = 0, + LMAC154_CHANNEL_12, + LMAC154_CHANNEL_13, + LMAC154_CHANNEL_14, + LMAC154_CHANNEL_15, + LMAC154_CHANNEL_16, + LMAC154_CHANNEL_17, + LMAC154_CHANNEL_18, + LMAC154_CHANNEL_19, + LMAC154_CHANNEL_20, + LMAC154_CHANNEL_21, + LMAC154_CHANNEL_22, + LMAC154_CHANNEL_23, + LMAC154_CHANNEL_24, + LMAC154_CHANNEL_25, + LMAC154_CHANNEL_26, +}lmac154_channel_t; + +typedef enum { + LMAC154_TX_POWER_0dBm = 0, + LMAC154_TX_POWER_1dBm = 1, + LMAC154_TX_POWER_2dBm = 2, + LMAC154_TX_POWER_3dBm = 3, + LMAC154_TX_POWER_4dBm = 4, + LMAC154_TX_POWER_5dBm = 5, + LMAC154_TX_POWER_6dBm = 6, + LMAC154_TX_POWER_7dBm = 7, + LMAC154_TX_POWER_8dBm = 8, + LMAC154_TX_POWER_9dBm = 9, + LMAC154_TX_POWER_10dBm = 10, + LMAC154_TX_POWER_11dBm = 11, + LMAC154_TX_POWER_12dBm = 12, + LMAC154_TX_POWER_13dBm = 13, + LMAC154_TX_POWER_14dBm = 14, +}lmac154_tx_power_t; + +typedef enum { + LMAC154_DATA_RATE_250K = 0, + LMAC154_DATA_RATE_500K = 1, + LMAC154_DATA_RATE_1M = 2, + LMAC154_DATA_RATE_2M = 3, +}lmac154_data_rate_t; + +typedef enum { + LMAC154_CCA_MODE_ED = 0, + LMAC154_CCA_MODE_CS = 1, + LMAC154_CCA_MODE_ED_AND_CS = 2, + LMAC154_CCA_MODE_ED_OR_CS = 3, +}lmac154_cca_mode_t; + +typedef enum { + LMAC154_FRAME_TYPE_BEACON = 0x01, + LMAC154_FRAME_TYPE_DATA = 0x02, + LMAC154_FRAME_TYPE_ACK = 0x04, + LMAC154_FRAME_TYPE_CMD = 0x08, +}lmac154_frame_type_t; + +typedef enum { + LMAC154_RF_STATE_RX = 1, + LMAC154_RF_STATE_RX_DOING = 2, + LMAC154_RF_STATE_TX = 3, + LMAC154_RF_STATE_IDLE = 4, +}lmac154_rf_state_t; + +typedef enum { + LMAC154_AES_MODE_ENCRYPT = 0, + LMAC154_AES_MODE_DECRYPT = 1, +}lmac154_aes_mode_t; + +typedef enum { + LMAC154_AES_MIC_LEN_4 = 0, + LMAC154_AES_MIC_LEN_8 = 1, + LMAC154_AES_MIC_LEN_16 = 2, + LMAC154_AES_MIC_LEN_12 = 3, +}lmac154_aes_mic_len_t; + +typedef enum { + LMAC154_AES_STATUS_SUCCESS = 0, + LMAC154_AES_STATUS_INVALID_MODE = -1, + LMAC154_AES_STATUS_INVALID_MIC_LEN = -2, + LMAC154_AES_STATUS_REENTER = -3, + LMAC154_AES_STATUS_TIMEOUT = -4, +}lmac154_aes_status_t; + +typedef enum { + LMAC154_FPT_STATUS_SUCCESS = 0, + LMAC154_FPT_STATUS_NO_RESOURCE = -1, + LMAC154_FPT_STATUS_ADDR_NOT_FOUND = -2, +}lmac154_fpt_status_t; + +typedef enum { + LMAC154_TX_STATUS_TX_FINISHED = 0, + LMAC154_TX_STATUS_CSMA_FAILED = 1, + LMAC154_TX_STATUS_TX_ABORTED = 2, + LMAC154_TX_STATUS_HW_ERROR = 3, +}lmac154_tx_status_t; + + +/****************************************************************************//** + * @brief Initialize the hardware module + * Call this function first + * + * @param None + * + * @return None + * +*******************************************************************************/ +void lmac154_init(void); + + +/****************************************************************************//** + * @brief Get whether lmac154 is disabled + * + * @param None + * + * @return 1 for disabled, 0 for enabled + * +*******************************************************************************/ +uint32_t lmac154_isDisabled(void); + + +/****************************************************************************//** + * @brief Get the lmac154 interrupt handler for interrupt registration of M154_IRQn + * + * @param None + * + * @return The lmac154 interrupt handler + * +*******************************************************************************/ +lmac154_isr_t lmac154_getInterruptHandler(void); + + +/****************************************************************************//** + * @brief Get the version of liblmac154.a in string format + * + * @param None + * + * @return The version of liblmac154.a + * +*******************************************************************************/ +char * lmac154_getLibVersion(void); + + +/****************************************************************************//** + * @brief Enable standard or enhanced rx promiscuous mode (default disabled) + * The MAC sublayer accepts all frames received from the PHY layer + * Able to receive frames without any IFS but rx sensitivity may be degraded if enhanced_mode = 1 + * The MPDU is unavailable in lmac154_rxDoneEvent if ignore_mpdu = 1 + * + * @param enhanced_mode: 0: standard mode, 1: enhanced mode + * @param ignore_mpdu: 0: read mpdu from registers, 1: do not read mpdu from registers + * + * @return None + * +*******************************************************************************/ +void lmac154_enableRxPromiscuousMode(uint8_t enhanced_mode, uint8_t ignore_mpdu); + + +/****************************************************************************//** + * @brief Disable standard or enhanced rx promiscuous mode (default disabled) + * The MAC sublayer only accepts frames that pass the address filtering + * + * @param None + * + * @return None + * +*******************************************************************************/ +void lmac154_disableRxPromiscuousMode(void); + + +/****************************************************************************//** + * @brief Enable RX (default disabled) + * + * @param None + * + * @return None + * +*******************************************************************************/ +void lmac154_enableRx(void); + + +/****************************************************************************//** + * @brief Disable RX (default disabled) + * + * @param None + * + * @return None + * +*******************************************************************************/ +void lmac154_disableRx(void); + + +/****************************************************************************//** + * @brief Set the number of maximum retransmission times (default 0) + * Will perform retransmission in case ack is not received if num > 0 + * Will raise lmac154_ackEvent(ack_received = 0) after maximum retransmission times + * + * @param num: number of maximum retransmission times + * + * @return None + * +*******************************************************************************/ +void lmac154_setTxRetry(uint32_t num); + + +/****************************************************************************//** + * @brief Trigger TX + * + * @param DataPtr: pointer to data buffer + * @param length: data length in bytes + * @param csma: 0: without CSMA, 1: with CSMA + * + * @return None + * +*******************************************************************************/ +void lmac154_triggerTx(uint8_t *DataPtr, uint8_t length, uint8_t csma); + + +/****************************************************************************//** + * @brief Run tx continuous modulation (PRBS15 pattern) + * Call lmac154_resetTx to stop + * + * @param None + * + * @return None + * +*******************************************************************************/ +void lmac154_runTxCM(void); + + +/****************************************************************************//** + * @brief Run tx continuous wave (single tone) + * Call lmac154_resetTx to stop + * + * @param None + * + * @return None + * +*******************************************************************************/ +void lmac154_runTxCW(void); + + +/****************************************************************************//** + * @brief Reset tx state machine + * + * @param None + * + * @return None + * +*******************************************************************************/ +void lmac154_resetTx(void); + + +/****************************************************************************//** + * @brief Set the channel (default LMAC154_CHANNEL_11) + * + * @param ch_ind: channel index ranging from LMAC154_CHANNEL_11 to LMAC154_CHANNEL_26 + * + * @return None + * +*******************************************************************************/ +void lmac154_setChannel(lmac154_channel_t ch_ind); + + +/****************************************************************************//** + * @brief Get the channel + * + * @param None + * + * @return The channel index ranging from LMAC154_CHANNEL_11 to LMAC154_CHANNEL_26 + * +*******************************************************************************/ +lmac154_channel_t lmac154_getChannel(void); + + +/****************************************************************************//** + * @brief Get RSSI in dBm + * + * @param None + * + * @return RSSI in dBm + * +*******************************************************************************/ +int lmac154_getRSSI(void); + + +/****************************************************************************//** + * @brief Get LQI + * + * @param None + * + * @return LQI + * +*******************************************************************************/ +int lmac154_getLQI(void); + +/****************************************************************************//** + * @brief Get SFD correlation + * + * @param None + * + * @return SFD correlation + * +*******************************************************************************/ +uint8_t lmac154_getSFDCorrelation(void); + +/****************************************************************************//** + * @brief Get the frequency offset in Hz + * + * @param None + * + * @return The frequency offset in Hz + * +*******************************************************************************/ +int lmac154_getFrequencyOffset(void); + +/****************************************************************************//** + * @brief Set tx power (no default value) + * + * @param power_dbm: tx power ranging from LMAC154_TX_POWER_0dBm to LMAC154_TX_POWER_14dBm + * + * @return None + * +*******************************************************************************/ +void lmac154_setTxPower(lmac154_tx_power_t power_dbm); + + +/****************************************************************************//** + * @brief Get tx power + * + * @param None + * + * @return tx power ranging from LMAC154_TX_POWER_0dBm to LMAC154_TX_POWER_14dBm + * +*******************************************************************************/ +lmac154_tx_power_t lmac154_getTxPower(void); + + +/****************************************************************************//** + * @brief Set tx data rate (default LMAC154_DATA_RATE_250K) + * The maximum tx mpdu length is 127 bytes for 250kbps tx data rate, and 255 bytes for others + * + * @param rate: LMAC154_DATA_RATE_250K, LMAC154_DATA_RATE_500K, LMAC154_DATA_RATE_1M, or LMAC154_DATA_RATE_2M + * + * @return None + * +*******************************************************************************/ +void lmac154_setTxDataRate(lmac154_data_rate_t rate); + + +/****************************************************************************//** + * @brief Enable auto rx data rate (default disabled) + * The maximum rx mpdu length is 127 bytes for 250kbps rx data rate, and 255 bytes for others + * + * @param None + * + * @return None + * +*******************************************************************************/ +void lmac154_enableAutoRxDataRate(void); + + +/****************************************************************************//** + * @brief Disable auto rx data rate (default disabled) + * The rx data rate is 250kbps, and the maximum rx mpdu length is 127 bytes + * + * @param None + * + * @return None + * +*******************************************************************************/ +void lmac154_disableAutoRxDataRate(void); + + +/****************************************************************************//** + * @brief Get rx data rate + * + * @param None + * + * @return LMAC154_DATA_RATE_250K, LMAC154_DATA_RATE_500K, LMAC154_DATA_RATE_1M, or LMAC154_DATA_RATE_2M + * +*******************************************************************************/ +lmac154_data_rate_t lmac154_getRxDataRate(void); + + +/****************************************************************************//** + * @brief Set CCA mode (default LMAC154_CCA_MODE_ED_AND_CS) + * + * @param mode: LMAC154_CCA_MODE_ED, LMAC154_CCA_MODE_CS, LMAC154_CCA_MODE_ED_AND_CS, or LMAC154_CCA_MODE_ED_OR_CS + * + * @return None + * +*******************************************************************************/ +void lmac154_setCCAMode(lmac154_cca_mode_t mode); + + +/****************************************************************************//** + * @brief Set CCA ED threshold (default -71dBm) + * + * @param threshold: ED threshold ranging from -122 to 5 in dBm + * + * @return None + * +*******************************************************************************/ +void lmac154_setEDThreshold(int threshold); + +/****************************************************************************//** + * @brief Get CCA ED threshold + * + * @param None + * + * @return ED threshold + * +*******************************************************************************/ +int lmac154_getEDThreshold(void); + +/****************************************************************************//** + * @brief Run CCA + * + * @param rssi: rssi output ranging from -122 to 5 in dBm + * + * @return CCA result: 0: channel idle, 1: channel busy + * +*******************************************************************************/ +uint8_t lmac154_runCCA(int *rssi); + + +/****************************************************************************//** + * @brief Set PAN ID (default 0x4321) + * + * @param pid: PAN ID + * + * @return None + * +*******************************************************************************/ +void lmac154_setPanId(uint16_t pid); + +/****************************************************************************//** + * @brief Get PAN ID + * + * @param None + * + * @return PAN ID + * +*******************************************************************************/ +uint16_t lmac154_getPanId(void); + +/****************************************************************************//** + * @brief Set 16-bit short address (default 0x0000) + * + * @param sadr: 16-bit short address + * + * @return None + * +*******************************************************************************/ +void lmac154_setShortAddr(uint16_t sadr); + +/****************************************************************************//** + * @brief Get 16-bit short address + * + * @param None + * + * @return 16-bit short address + * +*******************************************************************************/ +uint16_t lmac154_getShortAddr(void); + +/****************************************************************************//** + * @brief Set 64-bit long address (default 0xACDE4800_00000002) + * + * @param ladr: pointer to 64-bit long address + * + * @return None + * +*******************************************************************************/ +void lmac154_setLongAddr(uint8_t *ladr); + +/****************************************************************************//** + * @brief Get 64-bit long address + * + * @param ladr: pointer to 64-bit long address + * + * @return None + * +*******************************************************************************/ +void lmac154_getLongAddr(uint8_t *ladr); + +/****************************************************************************//** + * @brief Enable frame type filtering (default disabled) + * Will only receive specified frame types + * + * @param frame_types: any combination of LMAC154_FRAME_TYPE_XXX (BEACON, DATA, ACK, or CMD), via bitwise OR ('|') operation + * + * @return None + * +*******************************************************************************/ +void lmac154_enableFrameTypeFiltering(uint8_t frame_types); + + +/****************************************************************************//** + * @brief Disable frame type filtering (default disabled) + * Will receive all valid frame types (BEACON, DATA, ACK, or CMD) + * + * @param None + * + * @return None + * +*******************************************************************************/ +void lmac154_disableFrameTypeFiltering(void); + + +/****************************************************************************//** + * @brief Enable crc filtering (default enabled) + * Will only receive frames that pass crc check + * + * @param None + * + * @return None + * +*******************************************************************************/ +void lmac154_enableCrcFiltering(void); + + +/****************************************************************************//** + * @brief Disable crc filtering (default enabled) + * Will receive all frames ignoring crc check + * + * @param None + * + * @return None + * +*******************************************************************************/ +void lmac154_disableCrcFiltering(void); + + +/****************************************************************************//** + * @brief Set external PA + * Restriction: txpin % 5 != rxpin % 5 + * + * @param txpin: tx pin ranging from 0 to 31 + * @param rxpin: rx pin ranging from 0 to 31 + * + * @return None + * +*******************************************************************************/ +void lmac154_setExtPA(uint8_t txpin, uint8_t rxpin); + + +/****************************************************************************//** + * @brief Get RF state + * + * @param None + * + * @return LMAC154_RF_STATE_RX, LMAC154_RF_STATE_RX_DOING, LMAC154_RF_STATE_TX, or LMAC154_RF_STATE_IDLE + * +*******************************************************************************/ +lmac154_rf_state_t lmac154_getRFState(void); + + +/****************************************************************************//** + * @brief Enable the coexistence of zigbee and other wireless modules (default disabled) + * + * @param None + * + * @return None + * +*******************************************************************************/ +void lmac154_enableCoex(void); + + +/****************************************************************************//** + * @brief Disable the coexistence of zigbee and other wireless modules (default disabled) + * + * @param None + * + * @return None + * +*******************************************************************************/ +void lmac154_disableCoex(void); + + +/****************************************************************************//** + * @brief Enable auto transmission of ack frame by hardware (default enabled) + * + * @param None + * + * @return None + * +*******************************************************************************/ +void lmac154_enableHwAutoTxAck(void); + + +/****************************************************************************//** + * @brief Disable auto transmission of ack frame by hardware (default enabled) + * + * @param None + * + * @return None + * +*******************************************************************************/ +void lmac154_disableHwAutoTxAck(void); + + +/****************************************************************************//** + * @brief Enable lmac154_ackEvent (default enabled) + * + * @param None + * + * @return None + * +*******************************************************************************/ +void lmac154_enableAckEvent(void); + + +/****************************************************************************//** + * @brief Disable lmac154_ackEvent (default enabled) + * Will raise lmac154_rxDoneEvent instead when ack is received + * + * @param None + * + * @return None + * +*******************************************************************************/ +void lmac154_disableAckEvent(void); + + +/****************************************************************************//** + * @brief Enable lmac154_rxStartEvent (default disabled) + * + * @param None + * + * @return None + * +*******************************************************************************/ +void lmac154_enableRxStartEvent(void); + + +/****************************************************************************//** + * @brief Disable lmac154_rxStartEvent (default disabled) + * + * @param None + * + * @return None + * +*******************************************************************************/ +void lmac154_disableRxStartEvent(void); + +/****************************************************************************//** + * @brief Get whether rx promiscuous mode is enabled + * + * @param None + * + * @return 1 for enabled; 0 for disabled + * +*******************************************************************************/ +uint32_t lmac154_isRxPromiscuousModeEnabled(void); + +/****************************************************************************//** + * @brief Get the receiving or received mpdu length in bytes (crc included) + * + * @param None + * + * @return The receiving or received mpdu length + * +*******************************************************************************/ +uint8_t lmac154_getRxLength(void); + + +/****************************************************************************//** + * @brief Read rx data (crc not included) + * + * @param buf: pointer to data buffer + * @param offset: data offset ranging from 0 to 252 in bytes + * @param len: data length ranging from 1 to 253-offset in bytes + * + * @return None + * +*******************************************************************************/ +void lmac154_readRxData(uint8_t *buf, uint8_t offset, uint8_t len); + + +/****************************************************************************//** + * @brief Read rx crc + * + * @param crc: byte array to carry rx crc + * + * @return None + * +*******************************************************************************/ +void lmac154_readRxCrc(uint8_t crc[2]); + + +/****************************************************************************//** + * @brief Set the maximum wait time for ack frame (default 864us) + * + * @param time_us: maximum wait time ranging from 1 to 1023 in us + * + * @return None + * +*******************************************************************************/ +void lmac154_setAckWaitTime(uint16_t time_us); + + +/****************************************************************************//** + * @brief Set the maximum and minimum CSMA-CA backoff exponent + * + * @param max_be: maximum BE ranging from 3 to 8, default 5 + * @param min_be: minimum BE ranging from 0 to max_be, default 3 + * + * @return None + * +*******************************************************************************/ +void lmac154_setBE(uint8_t max_be, uint8_t min_be); + + +/****************************************************************************//** + * @brief Run AES CCM + * + * @param mode: LMAC154_AES_MODE_ENCRYPT or LMAC154_AES_MODE_DECRYPT + * @param a_data: pointer to additional authentication data buffer + * @param a_len: length of additional authentication data in bytes + * @param nonce: pointer to 13-byte nonce buffer + * @param key: pointer to 4-word key buffer + * @param mic_len: LMAC154_MIC_LEN_4, LMAC154_MIC_LEN_8, LMAC154_MIC_LEN_12, or LMAC154_MIC_LEN_16 + * @param mic: pointer to mic buffer + * @param input_data: pointer to input data buffer + * @param output_data: pointer to output data buffer + * @param len: length of input data in bytes + * + * @return The error code + * +*******************************************************************************/ +lmac154_aes_status_t lmac154_runAESCCM(lmac154_aes_mode_t mode, + const uint8_t *a_data, + uint8_t a_len, + const uint8_t *nonce, + const uint32_t *key, + lmac154_aes_mic_len_t mic_len, + uint32_t *mic, + const uint32_t *input_data, + uint32_t *output_data, + uint8_t len); + + + + +// hardware frame pending table (256 bytes) +// shared by short addresses and long addresses (supports up to 128 short addresses or 32 long addresses or mixed) +// used by hardware to set the frame pending bit of hw auto tx ack +// if the address is not found in the table (e.g. not set or removed), the frame pending bit of hw auto tx ack is 1 + + +/****************************************************************************//** + * @brief Add (or update) the key-value pair {sadr: pending} to (in) the frame pending table + * + * @param sadr: 16-bit short address + * @param pending: value of the corresponding frame pending bit + * + * @return LMAC154_FPT_STATUS_SUCCESS or LMAC154_FPT_STATUS_NO_RESOURCE + * +*******************************************************************************/ +lmac154_fpt_status_t lmac154_fptSetShortAddrPending(uint16_t sadr, uint8_t pending); + + +/****************************************************************************//** + * @brief Add (or update) the key-value pair {ladr: pending} to (in) the frame pending table + * + * @param ladr: pointer to 64-bit long address + * @param pending: value of the corresponding frame pending bit + * + * @return LMAC154_FPT_STATUS_SUCCESS or LMAC154_FPT_STATUS_NO_RESOURCE + * +*******************************************************************************/ +lmac154_fpt_status_t lmac154_fptSetLongAddrPending(uint8_t *ladr, uint8_t pending); + + +/****************************************************************************//** + * @brief Get the corresponding frame pending bit of the short address in the frame pending table + * + * @param sadr: 16-bit short address + * @param pending: value of the corresponding frame pending bit + * + * @return LMAC154_FPT_STATUS_SUCCESS or LMAC154_FPT_STATUS_ADDR_NOT_FOUND + * +*******************************************************************************/ +lmac154_fpt_status_t lmac154_fptGetShortAddrPending(uint16_t sadr, uint8_t *pending); + + +/****************************************************************************//** + * @brief Get the corresponding frame pending bit of the long address in the frame pending table + * + * @param ladr: pointer to 64-bit long address + * @param pending: value of the corresponding frame pending bit + * + * @return LMAC154_FPT_STATUS_SUCCESS or LMAC154_FPT_STATUS_ADDR_NOT_FOUND + * +*******************************************************************************/ +lmac154_fpt_status_t lmac154_fptGetLongAddrPending(uint8_t *ladr, uint8_t *pending); + + +/****************************************************************************//** + * @brief Remove the key-value pair {sadr: pending} from the frame pending table + * + * @param sadr: 16-bit short address + * + * @return LMAC154_FPT_STATUS_SUCCESS or LMAC154_FPT_STATUS_ADDR_NOT_FOUND + * +*******************************************************************************/ +lmac154_fpt_status_t lmac154_fptRemoveShortAddr(uint16_t sadr); + + +/****************************************************************************//** + * @brief Remove the key-value pair {ladr: pending} from the frame pending table + * + * @param ladr: pointer to 64-bit long address + * + * @return LMAC154_FPT_STATUS_SUCCESS or LMAC154_FPT_STATUS_ADDR_NOT_FOUND + * +*******************************************************************************/ +lmac154_fpt_status_t lmac154_fptRemoveLongAddr(uint8_t *ladr); + + +/****************************************************************************//** + * @brief Get short address list in the frame pending table + * + * @param list: pointer to list buffer + * @param entry_num: number of entries + * + * @return None + * +*******************************************************************************/ +void lmac154_fpt_GetShortAddrList(void *list, uint8_t *entry_num); + + +/****************************************************************************//** + * @brief Get long address list in the frame pending table + * + * @param list: pointer to list buffer + * @param entry_num: number of entries + * + * @return None + * +*******************************************************************************/ +void lmac154_fptGetLongAddrList(void *list, uint8_t *entry_num); + + +/****************************************************************************//** + * @brief Set frame pending bit according to frame pending table, or force to set to 1 + * + * @param force: 0: set according to frame pending table (default), 1: force to set to 1 + * + * @return None + * +*******************************************************************************/ +void lmac154_fptForcePending(uint8_t force); + + +/****************************************************************************//** + * @brief Clear the frame pending table + * + * @param None + * + * @return None + * +*******************************************************************************/ +void lmac154_fptClear(void); + + +/****************************************************************************//** + * @brief Print the frame pending table using specified print function + * + * @param print_func: user specified print function + * + * @return None + * +*******************************************************************************/ +void lmac154_fptDump(int print_func(const char *fmt, ...)); + + + + +// functions below are callback functions running in the interrupt context +// should be implemented by user if needed + + +/****************************************************************************//** + * @brief Tx Done Event + * Will be raised after calling lmac154_triggerTx + * + * @param tx_status: LMAC154_TX_STATUS_XXX (TX_FINISHED, CSMA_FAILED, TX_ABORTED, or HW_ERROR) + * + * @return None + * +*******************************************************************************/ +void lmac154_txDoneEvent(lmac154_tx_status_t tx_status); + + +/****************************************************************************//** + * @brief Ack Event + * Will be raised after calling lmac154_triggerTx(AR bit = 1) + * + * @param ack_received: 0: no ack, 1: ack received + * @param frame_pending: frame pending bit in ack frame + * @param seq_num: sequence number in ack frame + * + * @return None + * +*******************************************************************************/ +void lmac154_ackEvent(uint8_t ack_received, uint8_t frame_pending, uint8_t seq_num); + +/****************************************************************************//** + * @brief Ack Event with ack frame + * Will be raised after calling lmac154_triggerTx(AR bit = 1) + * + * @param ack_received: 0: no ack, 1: ack received + * @param rx_buf: pointer to the ack frame buffer + * @param len: ACK frame length + * + * @return None + * +*******************************************************************************/ +void lmac154_ackFrameEvent(uint8_t ack_received, uint8_t *rx_buf, uint8_t len); + +/****************************************************************************//** + * @brief Rx Done Event + * Will be raised when a frame is received + * + * @param rx_buf: pointer to rx buffer + * @param rx_len: received mpdu length in bytes (crc included) + * @param crc_fail: 0: crc pass, 1: crc fail + * + * @return None + * +*******************************************************************************/ +void lmac154_rxDoneEvent(uint8_t *rx_buf, uint8_t rx_len, uint8_t crc_fail); + + +/****************************************************************************//** + * @brief Rx Start Event + * Will be raised when rx on MAC sublayer starts + * lmac154_getRxLength is available because it is obtained from PHY layer + * + * @param None + * + * @return None + * +*******************************************************************************/ +void lmac154_rxStartEvent(void); + +/****************************************************************************//** + * @brief Hardware auto tx ack done event + * + * + * @param None + * + * @return None + * +*******************************************************************************/ +void lmac154_hwAutoTxAckDoneEvent(void); + +/****************************************************************************//** + * @brief Enable second stack for dual stack + * + * @return None + * +*******************************************************************************/ +void lmac154_enable2ndStack(void); + +/****************************************************************************//** + * @brief Disable second stack for dual stack, which is disable by default + * + * @return None + * +*******************************************************************************/ +void lmac154_disable2ndStack(void); + +/****************************************************************************//** + * @brief Check whether the second stack is enabled + * + * @return None + * +*******************************************************************************/ +uint32_t lmac154_is2ndStackEnabled(void); + +/****************************************************************************//** + * @brief Set second PAN ID (default 0x4321) for dual stack + * + * @param pid: PAN ID + * + * @return None + * +*******************************************************************************/ +void lmac154_set2ndPanId(uint16_t pid); + +/****************************************************************************//** + * @brief Set second 16-bit short address (default 0x0000) for dual stack + * + * @param sadr: 16-bit short address + * + * @return None + * +*******************************************************************************/ +void lmac154_set2ndShortAddr(uint16_t sadr); + +/****************************************************************************//** + * @brief Set second 64-bit long address (default 0xACDE4800_00000002) + * for dual stack + * + * @param ladr: pointer to 64-bit long address + * + * @return None + * +*******************************************************************************/ +void lmac154_set2ndLongAddr(uint8_t *ladr); + +#endif diff --git a/components/mac154/lmac154/lib/liblmac154.a b/components/mac154/lmac154/lib/liblmac154.a new file mode 100644 index 00000000..06606666 Binary files /dev/null and b/components/mac154/lmac154/lib/liblmac154.a differ