初始版本
This commit is contained in:
parent
10f1ddf1c1
commit
6df0f7d96e
83
.gitignore
vendored
83
.gitignore
vendored
@ -1,54 +1,33 @@
|
|||||||
# ---> C
|
# This is comment, and ignored by git.
|
||||||
# Prerequisites
|
|
||||||
*.d
|
|
||||||
|
|
||||||
# Object files
|
*.orig
|
||||||
*.o
|
|
||||||
*.ko
|
|
||||||
*.obj
|
|
||||||
*.elf
|
|
||||||
|
|
||||||
# Linker output
|
|
||||||
*.ilk
|
|
||||||
*.map
|
|
||||||
*.exp
|
|
||||||
|
|
||||||
# Precompiled Headers
|
|
||||||
*.gch
|
|
||||||
*.pch
|
|
||||||
|
|
||||||
# Libraries
|
|
||||||
*.lib
|
|
||||||
*.a
|
|
||||||
*.la
|
|
||||||
*.lo
|
|
||||||
|
|
||||||
# Shared objects (inc. Windows DLLs)
|
|
||||||
*.dll
|
|
||||||
*.so
|
|
||||||
*.so.*
|
|
||||||
*.dylib
|
|
||||||
|
|
||||||
# Executables
|
|
||||||
*.exe
|
*.exe
|
||||||
*.out
|
*.o
|
||||||
*.app
|
*.bak
|
||||||
*.i*86
|
*.ddk
|
||||||
*.x86_64
|
*.edk
|
||||||
*.hex
|
*.lst
|
||||||
|
*.lnp
|
||||||
# Debug files
|
*.mpf
|
||||||
*.dSYM/
|
*.mpj
|
||||||
*.su
|
*.obj
|
||||||
*.idb
|
*.omf
|
||||||
*.pdb
|
*.opt
|
||||||
|
*.plg
|
||||||
# Kernel Module Compile Results
|
*.rpt
|
||||||
*.mod*
|
*.tmp
|
||||||
*.cmd
|
*.__i
|
||||||
.tmp_versions/
|
*.crf
|
||||||
modules.order
|
*.o
|
||||||
Module.symvers
|
*.d
|
||||||
Mkfile.old
|
*.axf
|
||||||
dkms.conf
|
*.tra
|
||||||
|
*.dep
|
||||||
|
*.iex
|
||||||
|
*.htm
|
||||||
|
*.sct
|
||||||
|
*.map
|
||||||
|
JLinkLog.txt
|
||||||
|
*.bkp
|
||||||
|
*.dtmp
|
||||||
|
~*
|
||||||
|
|||||||
12
.vscode/settings.json
vendored
Normal file
12
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"files.associations": {
|
||||||
|
"nrf_drv_ppi.h": "c",
|
||||||
|
"drv_saadc.h": "c",
|
||||||
|
"bsp_btn_ble.h": "c",
|
||||||
|
"nrf_delay.h": "c",
|
||||||
|
"timer.h": "c",
|
||||||
|
"drv_uart.h": "c",
|
||||||
|
"nrf_drv_saadc.h": "c"
|
||||||
|
},
|
||||||
|
"cmake.sourceDirectory": "F:/work/HL-PDJ-1_PelvicFloor/external/mbedtls"
|
||||||
|
}
|
||||||
144
DSP_LIB/IIR.c
Normal file
144
DSP_LIB/IIR.c
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
#include "IIR.h"
|
||||||
|
#include "arm_math.h"
|
||||||
|
#include "arm_const_structs.h"
|
||||||
|
|
||||||
|
//Log需要引用的头文件
|
||||||
|
#include "nrf_log.h"
|
||||||
|
#include "nrf_log_ctrl.h"
|
||||||
|
#include "nrf_log_default_backends.h"
|
||||||
|
|
||||||
|
#define bp_numStages 1 /* 2阶IIR滤波的个数 */
|
||||||
|
#define bs_numStages 2 /* 2阶IIR滤波的个数 */
|
||||||
|
|
||||||
|
#define BLOCK_SIZE 1 /* 调用一次arm_biquad_cascade_df1_f32处理的采样点个数 */
|
||||||
|
|
||||||
|
uint32_t blockSize = BLOCK_SIZE;
|
||||||
|
static float32_t IIRStateF32_bp[4*bp_numStages]; /* 带通滤波器状态缓存 */
|
||||||
|
static float32_t IIRStateF32_bs[4*bs_numStages]; /* 带阻滤波器状态缓存 */
|
||||||
|
|
||||||
|
arm_biquad_casd_df1_inst_f32 S_BS;
|
||||||
|
arm_biquad_casd_df1_inst_f32 S_BP;
|
||||||
|
float32_t bpScaleValue;
|
||||||
|
float32_t bsScaleValue;
|
||||||
|
|
||||||
|
/* Elliptic带通滤波器系数20Hz 500Hz*/
|
||||||
|
const float32_t IIRCoeffs32BP[5*bp_numStages] = {
|
||||||
|
1.0f, 0, -1.0f, 0.638776097661321373699649939226219430566f, 0.339488565819422882796629892254713922739f
|
||||||
|
};
|
||||||
|
/* 巴特沃斯带阻滤波器系数48Hz 52Hz*/
|
||||||
|
const float32_t IIRCoeffs32BS[5*bs_numStages] = {
|
||||||
|
1.0f, -1.975854434025588135526163569011259824038f, 1.0f, 1.937393708057424390744927222840487957001f, -0.966392678521233783328625577269122004509f,
|
||||||
|
1.0f, -1.975854434025588135526163569011259824038f, 1.0f, 1.952884644070242314839447317353915423155f, -0.972373462682551759073135144717525690794f
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
void arm_iir_f32_bs(void)
|
||||||
|
{
|
||||||
|
/* 初始化 */
|
||||||
|
arm_biquad_cascade_df1_init_f32(&S_BS, bs_numStages, (float32_t *)&IIRCoeffs32BS[0], (float32_t *)&IIRStateF32_bs[0]);
|
||||||
|
/*放缩系数 */
|
||||||
|
bsScaleValue = 0.984570131944842996674083224206697195768f*0.984570131944842996674083224206697195768f;
|
||||||
|
}
|
||||||
|
|
||||||
|
void bs_bp(float32_t *bpinputF32_IN,float32_t *bsoutputF32_IN)
|
||||||
|
{
|
||||||
|
float32_t bpoutputF32_IN __attribute__((aligned(4)));
|
||||||
|
|
||||||
|
arm_biquad_cascade_df1_f32(&S_BP, bpinputF32_IN, &bpoutputF32_IN, blockSize);
|
||||||
|
bpoutputF32_IN = (bpoutputF32_IN)*bpScaleValue;
|
||||||
|
|
||||||
|
arm_biquad_cascade_df1_f32(&S_BS, &bpoutputF32_IN, bsoutputF32_IN, blockSize);
|
||||||
|
*bsoutputF32_IN = (*bsoutputF32_IN)*bsScaleValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
*********************************************************************************************************
|
||||||
|
* 函 数 名: arm_iir_f32_bp
|
||||||
|
* 功能说明: 调用函数arm_iir_f32_hp实现带通滤波器
|
||||||
|
* 形 参:无
|
||||||
|
* 返 回 值: 无
|
||||||
|
*********************************************************************************************************
|
||||||
|
*/
|
||||||
|
void arm_iir_f32_bp(void)
|
||||||
|
{
|
||||||
|
/* 初始化 */
|
||||||
|
arm_biquad_cascade_df1_init_f32(&S_BP, bp_numStages, (float32_t *)&IIRCoeffs32BP[0], (float32_t *)&IIRStateF32_bp[0]);
|
||||||
|
|
||||||
|
/*放缩系数 */
|
||||||
|
bpScaleValue = 0.66974428290971144139831494612735696137f;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define TEST_LENGTH_SAMPLES 400 /* 采样点数 */
|
||||||
|
//static float32_t testInput_f32_50Hz_200Hz[TEST_LENGTH_SAMPLES]; /* 采样点 */
|
||||||
|
|
||||||
|
//static float32_t testOutput_f32_50Hz_200Hz[TEST_LENGTH_SAMPLES];
|
||||||
|
|
||||||
|
float math_caculate_signal(uint16_t sampleHz)
|
||||||
|
{
|
||||||
|
static uint16_t i = 0;
|
||||||
|
float singalOutput;
|
||||||
|
|
||||||
|
/* 50Hz正弦波 + 200Hz正弦波 */
|
||||||
|
singalOutput = arm_sin_f32(2 * 3.1415926f * 50 * i / sampleHz) +
|
||||||
|
arm_sin_f32(2 * 3.1415926f * 200 * i / sampleHz);
|
||||||
|
|
||||||
|
/* 归零逻辑:当i达到一个完整周期的采样点数时 */
|
||||||
|
if (++i >= (sampleHz / 50)) {
|
||||||
|
i = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return singalOutput;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FilterInit()
|
||||||
|
{
|
||||||
|
arm_iir_f32_bs(); // 带阻滤波器
|
||||||
|
arm_iir_f32_bp(); // 带通滤波器
|
||||||
|
|
||||||
|
////test code
|
||||||
|
|
||||||
|
// CreateData();
|
||||||
|
//
|
||||||
|
// for (int i = 0; i < TEST_LENGTH_SAMPLES; i++)
|
||||||
|
// {
|
||||||
|
// arm_biquad_cascade_df1_f32(&S_BS, &testInput_f32_50Hz_200Hz[i], &testOutput_f32_50Hz_200Hz[i], 1);
|
||||||
|
// }
|
||||||
|
/*
|
||||||
|
NRF_LOG_INFO("raw\r\n");
|
||||||
|
char stf[10];
|
||||||
|
for (int i = 0; i < TEST_LENGTH_SAMPLES; i++)
|
||||||
|
{
|
||||||
|
sprintf(stf,"%0.3f", testInput_f32_50Hz_200Hz[i]);
|
||||||
|
|
||||||
|
NRF_LOG_INFO("%s",stf);
|
||||||
|
if (NRF_LOG_PROCESS() == false) //处理挂起的log
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NRF_LOG_INFO("proccess\r\n");
|
||||||
|
NRF_LOG_PROCESS();
|
||||||
|
arm_biquad_cascade_df1_f32(&S_BS, testInput_f32_50Hz_200Hz, testOutput_f32_50Hz_200Hz, TEST_LENGTH_SAMPLES);
|
||||||
|
for (int i = 0; i < TEST_LENGTH_SAMPLES; i++)
|
||||||
|
{
|
||||||
|
sprintf(stf,"%0.3f", testOutput_f32_50Hz_200Hz[i]);
|
||||||
|
|
||||||
|
NRF_LOG_INFO("%s",stf);
|
||||||
|
if (NRF_LOG_PROCESS() == false) //处理挂起的log
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
NRF_LOG_PROCESS();
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
//处理挂起的log
|
||||||
|
|
||||||
|
//////end
|
||||||
|
}
|
||||||
20
DSP_LIB/IIR.h
Normal file
20
DSP_LIB/IIR.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#ifndef _IIR_H_
|
||||||
|
#define _IIR_H_
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "nrf.h"
|
||||||
|
#include "string.h"
|
||||||
|
#include "arm_math.h"
|
||||||
|
|
||||||
|
void FilterInit(void);
|
||||||
|
void arm_iir_f32_bs(void);
|
||||||
|
void arm_iir_f32_bp(void);
|
||||||
|
|
||||||
|
void bs_bp(float32_t *bpinputF32_IN,float32_t *bsoutputF32_IN);
|
||||||
|
|
||||||
|
float math_caculate_signal(uint16_t sampleHz);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
136
DSP_LIB/Include/arm_common_tables.h
Normal file
136
DSP_LIB/Include/arm_common_tables.h
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
* Copyright (C) 2010-2014 ARM Limited. All rights reserved.
|
||||||
|
*
|
||||||
|
* $Date: 19. March 2015
|
||||||
|
* $Revision: V.1.4.5
|
||||||
|
*
|
||||||
|
* Project: CMSIS DSP Library
|
||||||
|
* Title: arm_common_tables.h
|
||||||
|
*
|
||||||
|
* Description: This file has extern declaration for common tables like Bitreverse, reciprocal etc which are used across different functions
|
||||||
|
*
|
||||||
|
* Target Processor: Cortex-M4/Cortex-M3
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* - Neither the name of ARM LIMITED nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||||
|
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
* -------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifndef _ARM_COMMON_TABLES_H
|
||||||
|
#define _ARM_COMMON_TABLES_H
|
||||||
|
|
||||||
|
#include "arm_math.h"
|
||||||
|
|
||||||
|
extern const uint16_t armBitRevTable[1024];
|
||||||
|
extern const q15_t armRecipTableQ15[64];
|
||||||
|
extern const q31_t armRecipTableQ31[64];
|
||||||
|
//extern const q31_t realCoefAQ31[1024];
|
||||||
|
//extern const q31_t realCoefBQ31[1024];
|
||||||
|
extern const float32_t twiddleCoef_16[32];
|
||||||
|
extern const float32_t twiddleCoef_32[64];
|
||||||
|
extern const float32_t twiddleCoef_64[128];
|
||||||
|
extern const float32_t twiddleCoef_128[256];
|
||||||
|
extern const float32_t twiddleCoef_256[512];
|
||||||
|
extern const float32_t twiddleCoef_512[1024];
|
||||||
|
extern const float32_t twiddleCoef_1024[2048];
|
||||||
|
extern const float32_t twiddleCoef_2048[4096];
|
||||||
|
extern const float32_t twiddleCoef_4096[8192];
|
||||||
|
#define twiddleCoef twiddleCoef_4096
|
||||||
|
extern const q31_t twiddleCoef_16_q31[24];
|
||||||
|
extern const q31_t twiddleCoef_32_q31[48];
|
||||||
|
extern const q31_t twiddleCoef_64_q31[96];
|
||||||
|
extern const q31_t twiddleCoef_128_q31[192];
|
||||||
|
extern const q31_t twiddleCoef_256_q31[384];
|
||||||
|
extern const q31_t twiddleCoef_512_q31[768];
|
||||||
|
extern const q31_t twiddleCoef_1024_q31[1536];
|
||||||
|
extern const q31_t twiddleCoef_2048_q31[3072];
|
||||||
|
extern const q31_t twiddleCoef_4096_q31[6144];
|
||||||
|
extern const q15_t twiddleCoef_16_q15[24];
|
||||||
|
extern const q15_t twiddleCoef_32_q15[48];
|
||||||
|
extern const q15_t twiddleCoef_64_q15[96];
|
||||||
|
extern const q15_t twiddleCoef_128_q15[192];
|
||||||
|
extern const q15_t twiddleCoef_256_q15[384];
|
||||||
|
extern const q15_t twiddleCoef_512_q15[768];
|
||||||
|
extern const q15_t twiddleCoef_1024_q15[1536];
|
||||||
|
extern const q15_t twiddleCoef_2048_q15[3072];
|
||||||
|
extern const q15_t twiddleCoef_4096_q15[6144];
|
||||||
|
extern const float32_t twiddleCoef_rfft_32[32];
|
||||||
|
extern const float32_t twiddleCoef_rfft_64[64];
|
||||||
|
extern const float32_t twiddleCoef_rfft_128[128];
|
||||||
|
extern const float32_t twiddleCoef_rfft_256[256];
|
||||||
|
extern const float32_t twiddleCoef_rfft_512[512];
|
||||||
|
extern const float32_t twiddleCoef_rfft_1024[1024];
|
||||||
|
extern const float32_t twiddleCoef_rfft_2048[2048];
|
||||||
|
extern const float32_t twiddleCoef_rfft_4096[4096];
|
||||||
|
|
||||||
|
|
||||||
|
/* floating-point bit reversal tables */
|
||||||
|
#define ARMBITREVINDEXTABLE__16_TABLE_LENGTH ((uint16_t)20 )
|
||||||
|
#define ARMBITREVINDEXTABLE__32_TABLE_LENGTH ((uint16_t)48 )
|
||||||
|
#define ARMBITREVINDEXTABLE__64_TABLE_LENGTH ((uint16_t)56 )
|
||||||
|
#define ARMBITREVINDEXTABLE_128_TABLE_LENGTH ((uint16_t)208 )
|
||||||
|
#define ARMBITREVINDEXTABLE_256_TABLE_LENGTH ((uint16_t)440 )
|
||||||
|
#define ARMBITREVINDEXTABLE_512_TABLE_LENGTH ((uint16_t)448 )
|
||||||
|
#define ARMBITREVINDEXTABLE1024_TABLE_LENGTH ((uint16_t)1800)
|
||||||
|
#define ARMBITREVINDEXTABLE2048_TABLE_LENGTH ((uint16_t)3808)
|
||||||
|
#define ARMBITREVINDEXTABLE4096_TABLE_LENGTH ((uint16_t)4032)
|
||||||
|
|
||||||
|
extern const uint16_t armBitRevIndexTable16[ARMBITREVINDEXTABLE__16_TABLE_LENGTH];
|
||||||
|
extern const uint16_t armBitRevIndexTable32[ARMBITREVINDEXTABLE__32_TABLE_LENGTH];
|
||||||
|
extern const uint16_t armBitRevIndexTable64[ARMBITREVINDEXTABLE__64_TABLE_LENGTH];
|
||||||
|
extern const uint16_t armBitRevIndexTable128[ARMBITREVINDEXTABLE_128_TABLE_LENGTH];
|
||||||
|
extern const uint16_t armBitRevIndexTable256[ARMBITREVINDEXTABLE_256_TABLE_LENGTH];
|
||||||
|
extern const uint16_t armBitRevIndexTable512[ARMBITREVINDEXTABLE_512_TABLE_LENGTH];
|
||||||
|
extern const uint16_t armBitRevIndexTable1024[ARMBITREVINDEXTABLE1024_TABLE_LENGTH];
|
||||||
|
extern const uint16_t armBitRevIndexTable2048[ARMBITREVINDEXTABLE2048_TABLE_LENGTH];
|
||||||
|
extern const uint16_t armBitRevIndexTable4096[ARMBITREVINDEXTABLE4096_TABLE_LENGTH];
|
||||||
|
|
||||||
|
/* fixed-point bit reversal tables */
|
||||||
|
#define ARMBITREVINDEXTABLE_FIXED___16_TABLE_LENGTH ((uint16_t)12 )
|
||||||
|
#define ARMBITREVINDEXTABLE_FIXED___32_TABLE_LENGTH ((uint16_t)24 )
|
||||||
|
#define ARMBITREVINDEXTABLE_FIXED___64_TABLE_LENGTH ((uint16_t)56 )
|
||||||
|
#define ARMBITREVINDEXTABLE_FIXED__128_TABLE_LENGTH ((uint16_t)112 )
|
||||||
|
#define ARMBITREVINDEXTABLE_FIXED__256_TABLE_LENGTH ((uint16_t)240 )
|
||||||
|
#define ARMBITREVINDEXTABLE_FIXED__512_TABLE_LENGTH ((uint16_t)480 )
|
||||||
|
#define ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH ((uint16_t)992 )
|
||||||
|
#define ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH ((uint16_t)1984)
|
||||||
|
#define ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH ((uint16_t)4032)
|
||||||
|
|
||||||
|
extern const uint16_t armBitRevIndexTable_fixed_16[ARMBITREVINDEXTABLE_FIXED___16_TABLE_LENGTH];
|
||||||
|
extern const uint16_t armBitRevIndexTable_fixed_32[ARMBITREVINDEXTABLE_FIXED___32_TABLE_LENGTH];
|
||||||
|
extern const uint16_t armBitRevIndexTable_fixed_64[ARMBITREVINDEXTABLE_FIXED___64_TABLE_LENGTH];
|
||||||
|
extern const uint16_t armBitRevIndexTable_fixed_128[ARMBITREVINDEXTABLE_FIXED__128_TABLE_LENGTH];
|
||||||
|
extern const uint16_t armBitRevIndexTable_fixed_256[ARMBITREVINDEXTABLE_FIXED__256_TABLE_LENGTH];
|
||||||
|
extern const uint16_t armBitRevIndexTable_fixed_512[ARMBITREVINDEXTABLE_FIXED__512_TABLE_LENGTH];
|
||||||
|
extern const uint16_t armBitRevIndexTable_fixed_1024[ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH];
|
||||||
|
extern const uint16_t armBitRevIndexTable_fixed_2048[ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH];
|
||||||
|
extern const uint16_t armBitRevIndexTable_fixed_4096[ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH];
|
||||||
|
|
||||||
|
/* Tables for Fast Math Sine and Cosine */
|
||||||
|
extern const float32_t sinTable_f32[FAST_MATH_TABLE_SIZE + 1];
|
||||||
|
extern const q31_t sinTable_q31[FAST_MATH_TABLE_SIZE + 1];
|
||||||
|
extern const q15_t sinTable_q15[FAST_MATH_TABLE_SIZE + 1];
|
||||||
|
|
||||||
|
#endif /* ARM_COMMON_TABLES_H */
|
||||||
79
DSP_LIB/Include/arm_const_structs.h
Normal file
79
DSP_LIB/Include/arm_const_structs.h
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
* Copyright (C) 2010-2014 ARM Limited. All rights reserved.
|
||||||
|
*
|
||||||
|
* $Date: 19. March 2015
|
||||||
|
* $Revision: V.1.4.5
|
||||||
|
*
|
||||||
|
* Project: CMSIS DSP Library
|
||||||
|
* Title: arm_const_structs.h
|
||||||
|
*
|
||||||
|
* Description: This file has constant structs that are initialized for
|
||||||
|
* user convenience. For example, some can be given as
|
||||||
|
* arguments to the arm_cfft_f32() function.
|
||||||
|
*
|
||||||
|
* Target Processor: Cortex-M4/Cortex-M3
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* - Neither the name of ARM LIMITED nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||||
|
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
* -------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifndef _ARM_CONST_STRUCTS_H
|
||||||
|
#define _ARM_CONST_STRUCTS_H
|
||||||
|
|
||||||
|
#include "arm_math.h"
|
||||||
|
#include "arm_common_tables.h"
|
||||||
|
|
||||||
|
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len16;
|
||||||
|
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len32;
|
||||||
|
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len64;
|
||||||
|
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len128;
|
||||||
|
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len256;
|
||||||
|
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len512;
|
||||||
|
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len1024;
|
||||||
|
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len2048;
|
||||||
|
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len4096;
|
||||||
|
|
||||||
|
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len16;
|
||||||
|
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len32;
|
||||||
|
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len64;
|
||||||
|
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len128;
|
||||||
|
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len256;
|
||||||
|
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len512;
|
||||||
|
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len1024;
|
||||||
|
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len2048;
|
||||||
|
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len4096;
|
||||||
|
|
||||||
|
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len16;
|
||||||
|
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len32;
|
||||||
|
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len64;
|
||||||
|
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len128;
|
||||||
|
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len256;
|
||||||
|
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len512;
|
||||||
|
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len1024;
|
||||||
|
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len2048;
|
||||||
|
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len4096;
|
||||||
|
|
||||||
|
#endif
|
||||||
7556
DSP_LIB/Include/arm_math.h
Normal file
7556
DSP_LIB/Include/arm_math.h
Normal file
File diff suppressed because it is too large
Load Diff
740
DSP_LIB/Include/core_cm0.h
Normal file
740
DSP_LIB/Include/core_cm0.h
Normal file
@ -0,0 +1,740 @@
|
|||||||
|
/**************************************************************************//**
|
||||||
|
* @file core_cm0.h
|
||||||
|
* @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File
|
||||||
|
* @version V4.10
|
||||||
|
* @date 18. March 2015
|
||||||
|
*
|
||||||
|
* @note
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
/* Copyright (c) 2009 - 2015 ARM LIMITED
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
- Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
- Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
- Neither the name of ARM nor the names of its contributors may be used
|
||||||
|
to endorse or promote products derived from this software without
|
||||||
|
specific prior written permission.
|
||||||
|
*
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
#if defined ( __ICCARM__ )
|
||||||
|
#pragma system_include /* treat file as system include file for MISRA check */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __CORE_CM0_H_GENERIC
|
||||||
|
#define __CORE_CM0_H_GENERIC
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions
|
||||||
|
CMSIS violates the following MISRA-C:2004 rules:
|
||||||
|
|
||||||
|
\li Required Rule 8.5, object/function definition in header file.<br>
|
||||||
|
Function definitions in header files are used to allow 'inlining'.
|
||||||
|
|
||||||
|
\li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br>
|
||||||
|
Unions are used for effective representation of core registers.
|
||||||
|
|
||||||
|
\li Advisory Rule 19.7, Function-like macro defined.<br>
|
||||||
|
Function-like macros are used to allow more efficient code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* CMSIS definitions
|
||||||
|
******************************************************************************/
|
||||||
|
/** \ingroup Cortex_M0
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* CMSIS CM0 definitions */
|
||||||
|
#define __CM0_CMSIS_VERSION_MAIN (0x04) /*!< [31:16] CMSIS HAL main version */
|
||||||
|
#define __CM0_CMSIS_VERSION_SUB (0x00) /*!< [15:0] CMSIS HAL sub version */
|
||||||
|
#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16) | \
|
||||||
|
__CM0_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */
|
||||||
|
|
||||||
|
#define __CORTEX_M (0x00) /*!< Cortex-M Core */
|
||||||
|
|
||||||
|
|
||||||
|
#if defined ( __CC_ARM )
|
||||||
|
#define __ASM __asm /*!< asm keyword for ARM Compiler */
|
||||||
|
#define __INLINE __inline /*!< inline keyword for ARM Compiler */
|
||||||
|
#define __STATIC_INLINE static __inline
|
||||||
|
|
||||||
|
#elif defined ( __GNUC__ )
|
||||||
|
#define __ASM __asm /*!< asm keyword for GNU Compiler */
|
||||||
|
#define __INLINE inline /*!< inline keyword for GNU Compiler */
|
||||||
|
#define __STATIC_INLINE static inline
|
||||||
|
|
||||||
|
#elif defined ( __ICCARM__ )
|
||||||
|
#define __ASM __asm /*!< asm keyword for IAR Compiler */
|
||||||
|
#define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */
|
||||||
|
#define __STATIC_INLINE static inline
|
||||||
|
|
||||||
|
#elif defined ( __TMS470__ )
|
||||||
|
#define __ASM __asm /*!< asm keyword for TI CCS Compiler */
|
||||||
|
#define __STATIC_INLINE static inline
|
||||||
|
|
||||||
|
#elif defined ( __TASKING__ )
|
||||||
|
#define __ASM __asm /*!< asm keyword for TASKING Compiler */
|
||||||
|
#define __INLINE inline /*!< inline keyword for TASKING Compiler */
|
||||||
|
#define __STATIC_INLINE static inline
|
||||||
|
|
||||||
|
#elif defined ( __CSMC__ )
|
||||||
|
#define __packed
|
||||||
|
#define __ASM _asm /*!< asm keyword for COSMIC Compiler */
|
||||||
|
#define __INLINE inline /*use -pc99 on compile line !< inline keyword for COSMIC Compiler */
|
||||||
|
#define __STATIC_INLINE static inline
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** __FPU_USED indicates whether an FPU is used or not.
|
||||||
|
This core does not support an FPU at all
|
||||||
|
*/
|
||||||
|
#define __FPU_USED 0
|
||||||
|
|
||||||
|
#if defined ( __CC_ARM )
|
||||||
|
#if defined __TARGET_FPU_VFP
|
||||||
|
#warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __GNUC__ )
|
||||||
|
#if defined (__VFP_FP__) && !defined(__SOFTFP__)
|
||||||
|
#warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __ICCARM__ )
|
||||||
|
#if defined __ARMVFP__
|
||||||
|
#warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __TMS470__ )
|
||||||
|
#if defined __TI__VFP_SUPPORT____
|
||||||
|
#warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __TASKING__ )
|
||||||
|
#if defined __FPU_VFP__
|
||||||
|
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __CSMC__ ) /* Cosmic */
|
||||||
|
#if ( __CSMC__ & 0x400) // FPU present for parser
|
||||||
|
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdint.h> /* standard types definitions */
|
||||||
|
#include <core_cmInstr.h> /* Core Instruction Access */
|
||||||
|
#include <core_cmFunc.h> /* Core Function Access */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __CORE_CM0_H_GENERIC */
|
||||||
|
|
||||||
|
#ifndef __CMSIS_GENERIC
|
||||||
|
|
||||||
|
#ifndef __CORE_CM0_H_DEPENDANT
|
||||||
|
#define __CORE_CM0_H_DEPENDANT
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* check device defines and use defaults */
|
||||||
|
#if defined __CHECK_DEVICE_DEFINES
|
||||||
|
#ifndef __CM0_REV
|
||||||
|
#define __CM0_REV 0x0000
|
||||||
|
#warning "__CM0_REV not defined in device header file; using default!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __NVIC_PRIO_BITS
|
||||||
|
#define __NVIC_PRIO_BITS 2
|
||||||
|
#warning "__NVIC_PRIO_BITS not defined in device header file; using default!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __Vendor_SysTickConfig
|
||||||
|
#define __Vendor_SysTickConfig 0
|
||||||
|
#warning "__Vendor_SysTickConfig not defined in device header file; using default!"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* IO definitions (access restrictions to peripheral registers) */
|
||||||
|
/**
|
||||||
|
\defgroup CMSIS_glob_defs CMSIS Global Defines
|
||||||
|
|
||||||
|
<strong>IO Type Qualifiers</strong> are used
|
||||||
|
\li to specify the access to peripheral variables.
|
||||||
|
\li for automatic generation of peripheral register debug information.
|
||||||
|
*/
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#define __I volatile /*!< Defines 'read only' permissions */
|
||||||
|
#else
|
||||||
|
#define __I volatile const /*!< Defines 'read only' permissions */
|
||||||
|
#endif
|
||||||
|
#define __O volatile /*!< Defines 'write only' permissions */
|
||||||
|
#define __IO volatile /*!< Defines 'read / write' permissions */
|
||||||
|
|
||||||
|
/*@} end of group Cortex_M0 */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Register Abstraction
|
||||||
|
Core Register contain:
|
||||||
|
- Core Register
|
||||||
|
- Core NVIC Register
|
||||||
|
- Core SCB Register
|
||||||
|
- Core SysTick Register
|
||||||
|
******************************************************************************/
|
||||||
|
/** \defgroup CMSIS_core_register Defines and Type Definitions
|
||||||
|
\brief Type definitions and defines for Cortex-M processor based devices.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_CORE Status and Control Registers
|
||||||
|
\brief Core Register type definitions.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \brief Union type to access the Application Program Status Register (APSR).
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */
|
||||||
|
uint32_t V:1; /*!< bit: 28 Overflow condition code flag */
|
||||||
|
uint32_t C:1; /*!< bit: 29 Carry condition code flag */
|
||||||
|
uint32_t Z:1; /*!< bit: 30 Zero condition code flag */
|
||||||
|
uint32_t N:1; /*!< bit: 31 Negative condition code flag */
|
||||||
|
} b; /*!< Structure used for bit access */
|
||||||
|
uint32_t w; /*!< Type used for word access */
|
||||||
|
} APSR_Type;
|
||||||
|
|
||||||
|
/* APSR Register Definitions */
|
||||||
|
#define APSR_N_Pos 31 /*!< APSR: N Position */
|
||||||
|
#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */
|
||||||
|
|
||||||
|
#define APSR_Z_Pos 30 /*!< APSR: Z Position */
|
||||||
|
#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */
|
||||||
|
|
||||||
|
#define APSR_C_Pos 29 /*!< APSR: C Position */
|
||||||
|
#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */
|
||||||
|
|
||||||
|
#define APSR_V_Pos 28 /*!< APSR: V Position */
|
||||||
|
#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Union type to access the Interrupt Program Status Register (IPSR).
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */
|
||||||
|
uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */
|
||||||
|
} b; /*!< Structure used for bit access */
|
||||||
|
uint32_t w; /*!< Type used for word access */
|
||||||
|
} IPSR_Type;
|
||||||
|
|
||||||
|
/* IPSR Register Definitions */
|
||||||
|
#define IPSR_ISR_Pos 0 /*!< IPSR: ISR Position */
|
||||||
|
#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR).
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */
|
||||||
|
uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */
|
||||||
|
uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */
|
||||||
|
uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */
|
||||||
|
uint32_t V:1; /*!< bit: 28 Overflow condition code flag */
|
||||||
|
uint32_t C:1; /*!< bit: 29 Carry condition code flag */
|
||||||
|
uint32_t Z:1; /*!< bit: 30 Zero condition code flag */
|
||||||
|
uint32_t N:1; /*!< bit: 31 Negative condition code flag */
|
||||||
|
} b; /*!< Structure used for bit access */
|
||||||
|
uint32_t w; /*!< Type used for word access */
|
||||||
|
} xPSR_Type;
|
||||||
|
|
||||||
|
/* xPSR Register Definitions */
|
||||||
|
#define xPSR_N_Pos 31 /*!< xPSR: N Position */
|
||||||
|
#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */
|
||||||
|
|
||||||
|
#define xPSR_Z_Pos 30 /*!< xPSR: Z Position */
|
||||||
|
#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */
|
||||||
|
|
||||||
|
#define xPSR_C_Pos 29 /*!< xPSR: C Position */
|
||||||
|
#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */
|
||||||
|
|
||||||
|
#define xPSR_V_Pos 28 /*!< xPSR: V Position */
|
||||||
|
#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */
|
||||||
|
|
||||||
|
#define xPSR_T_Pos 24 /*!< xPSR: T Position */
|
||||||
|
#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */
|
||||||
|
|
||||||
|
#define xPSR_ISR_Pos 0 /*!< xPSR: ISR Position */
|
||||||
|
#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Union type to access the Control Registers (CONTROL).
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t _reserved0:1; /*!< bit: 0 Reserved */
|
||||||
|
uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */
|
||||||
|
uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */
|
||||||
|
} b; /*!< Structure used for bit access */
|
||||||
|
uint32_t w; /*!< Type used for word access */
|
||||||
|
} CONTROL_Type;
|
||||||
|
|
||||||
|
/* CONTROL Register Definitions */
|
||||||
|
#define CONTROL_SPSEL_Pos 1 /*!< CONTROL: SPSEL Position */
|
||||||
|
#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_CORE */
|
||||||
|
|
||||||
|
|
||||||
|
/** \ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC)
|
||||||
|
\brief Type definitions for the NVIC Registers
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC).
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__IO uint32_t ISER[1]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */
|
||||||
|
uint32_t RESERVED0[31];
|
||||||
|
__IO uint32_t ICER[1]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */
|
||||||
|
uint32_t RSERVED1[31];
|
||||||
|
__IO uint32_t ISPR[1]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */
|
||||||
|
uint32_t RESERVED2[31];
|
||||||
|
__IO uint32_t ICPR[1]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */
|
||||||
|
uint32_t RESERVED3[31];
|
||||||
|
uint32_t RESERVED4[64];
|
||||||
|
__IO uint32_t IP[8]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */
|
||||||
|
} NVIC_Type;
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_NVIC */
|
||||||
|
|
||||||
|
|
||||||
|
/** \ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_SCB System Control Block (SCB)
|
||||||
|
\brief Type definitions for the System Control Block Registers
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \brief Structure type to access the System Control Block (SCB).
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */
|
||||||
|
__IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */
|
||||||
|
uint32_t RESERVED0;
|
||||||
|
__IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */
|
||||||
|
__IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */
|
||||||
|
__IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */
|
||||||
|
uint32_t RESERVED1;
|
||||||
|
__IO uint32_t SHP[2]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */
|
||||||
|
__IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */
|
||||||
|
} SCB_Type;
|
||||||
|
|
||||||
|
/* SCB CPUID Register Definitions */
|
||||||
|
#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */
|
||||||
|
#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */
|
||||||
|
|
||||||
|
#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */
|
||||||
|
#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */
|
||||||
|
|
||||||
|
#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */
|
||||||
|
#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */
|
||||||
|
|
||||||
|
#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */
|
||||||
|
#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */
|
||||||
|
|
||||||
|
#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */
|
||||||
|
#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */
|
||||||
|
|
||||||
|
/* SCB Interrupt Control State Register Definitions */
|
||||||
|
#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */
|
||||||
|
#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */
|
||||||
|
#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */
|
||||||
|
#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */
|
||||||
|
#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */
|
||||||
|
#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */
|
||||||
|
#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */
|
||||||
|
#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */
|
||||||
|
#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */
|
||||||
|
#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */
|
||||||
|
|
||||||
|
/* SCB Application Interrupt and Reset Control Register Definitions */
|
||||||
|
#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */
|
||||||
|
#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */
|
||||||
|
|
||||||
|
#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */
|
||||||
|
#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */
|
||||||
|
|
||||||
|
#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */
|
||||||
|
#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */
|
||||||
|
|
||||||
|
#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */
|
||||||
|
#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */
|
||||||
|
|
||||||
|
#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */
|
||||||
|
#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */
|
||||||
|
|
||||||
|
/* SCB System Control Register Definitions */
|
||||||
|
#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */
|
||||||
|
#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */
|
||||||
|
|
||||||
|
#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */
|
||||||
|
#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */
|
||||||
|
|
||||||
|
#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */
|
||||||
|
#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */
|
||||||
|
|
||||||
|
/* SCB Configuration Control Register Definitions */
|
||||||
|
#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */
|
||||||
|
#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */
|
||||||
|
|
||||||
|
#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */
|
||||||
|
#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */
|
||||||
|
|
||||||
|
/* SCB System Handler Control and State Register Definitions */
|
||||||
|
#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */
|
||||||
|
#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_SCB */
|
||||||
|
|
||||||
|
|
||||||
|
/** \ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_SysTick System Tick Timer (SysTick)
|
||||||
|
\brief Type definitions for the System Timer Registers.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \brief Structure type to access the System Timer (SysTick).
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */
|
||||||
|
__IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */
|
||||||
|
__IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */
|
||||||
|
__I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */
|
||||||
|
} SysTick_Type;
|
||||||
|
|
||||||
|
/* SysTick Control / Status Register Definitions */
|
||||||
|
#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */
|
||||||
|
#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */
|
||||||
|
|
||||||
|
#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */
|
||||||
|
#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */
|
||||||
|
|
||||||
|
#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */
|
||||||
|
#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */
|
||||||
|
|
||||||
|
#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */
|
||||||
|
#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */
|
||||||
|
|
||||||
|
/* SysTick Reload Register Definitions */
|
||||||
|
#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */
|
||||||
|
#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */
|
||||||
|
|
||||||
|
/* SysTick Current Register Definitions */
|
||||||
|
#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */
|
||||||
|
#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */
|
||||||
|
|
||||||
|
/* SysTick Calibration Register Definitions */
|
||||||
|
#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */
|
||||||
|
#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */
|
||||||
|
|
||||||
|
#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */
|
||||||
|
#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */
|
||||||
|
|
||||||
|
#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */
|
||||||
|
#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_SysTick */
|
||||||
|
|
||||||
|
|
||||||
|
/** \ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug)
|
||||||
|
\brief Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR)
|
||||||
|
are only accessible over DAP and not via processor. Therefore
|
||||||
|
they are not covered by the Cortex-M0 header file.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
/*@} end of group CMSIS_CoreDebug */
|
||||||
|
|
||||||
|
|
||||||
|
/** \ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_core_base Core Definitions
|
||||||
|
\brief Definitions for base addresses, unions, and structures.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Memory mapping of Cortex-M0 Hardware */
|
||||||
|
#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */
|
||||||
|
#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */
|
||||||
|
#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */
|
||||||
|
#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */
|
||||||
|
|
||||||
|
#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */
|
||||||
|
#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */
|
||||||
|
#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */
|
||||||
|
|
||||||
|
|
||||||
|
/*@} */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Hardware Abstraction Layer
|
||||||
|
Core Function Interface contains:
|
||||||
|
- Core NVIC Functions
|
||||||
|
- Core SysTick Functions
|
||||||
|
- Core Register Access Functions
|
||||||
|
******************************************************************************/
|
||||||
|
/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ########################## NVIC functions #################################### */
|
||||||
|
/** \ingroup CMSIS_Core_FunctionInterface
|
||||||
|
\defgroup CMSIS_Core_NVICFunctions NVIC Functions
|
||||||
|
\brief Functions that manage interrupts and exceptions via the NVIC.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Interrupt Priorities are WORD accessible only under ARMv6M */
|
||||||
|
/* The following MACROS handle generation of the register offset and byte masks */
|
||||||
|
#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL)
|
||||||
|
#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) )
|
||||||
|
#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) )
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Enable External Interrupt
|
||||||
|
|
||||||
|
The function enables a device-specific interrupt in the NVIC interrupt controller.
|
||||||
|
|
||||||
|
\param [in] IRQn External interrupt number. Value cannot be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
NVIC->ISER[0] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Disable External Interrupt
|
||||||
|
|
||||||
|
The function disables a device-specific interrupt in the NVIC interrupt controller.
|
||||||
|
|
||||||
|
\param [in] IRQn External interrupt number. Value cannot be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
NVIC->ICER[0] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Get Pending Interrupt
|
||||||
|
|
||||||
|
The function reads the pending register in the NVIC and returns the pending bit
|
||||||
|
for the specified interrupt.
|
||||||
|
|
||||||
|
\param [in] IRQn Interrupt number.
|
||||||
|
|
||||||
|
\return 0 Interrupt status is not pending.
|
||||||
|
\return 1 Interrupt status is pending.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
return((uint32_t)(((NVIC->ISPR[0] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Set Pending Interrupt
|
||||||
|
|
||||||
|
The function sets the pending bit of an external interrupt.
|
||||||
|
|
||||||
|
\param [in] IRQn Interrupt number. Value cannot be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
NVIC->ISPR[0] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Clear Pending Interrupt
|
||||||
|
|
||||||
|
The function clears the pending bit of an external interrupt.
|
||||||
|
|
||||||
|
\param [in] IRQn External interrupt number. Value cannot be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
NVIC->ICPR[0] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Set Interrupt Priority
|
||||||
|
|
||||||
|
The function sets the priority of an interrupt.
|
||||||
|
|
||||||
|
\note The priority cannot be set for every core interrupt.
|
||||||
|
|
||||||
|
\param [in] IRQn Interrupt number.
|
||||||
|
\param [in] priority Priority to set.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
|
||||||
|
{
|
||||||
|
if((int32_t)(IRQn) < 0) {
|
||||||
|
SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
|
||||||
|
(((priority << (8 - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
|
||||||
|
(((priority << (8 - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Get Interrupt Priority
|
||||||
|
|
||||||
|
The function reads the priority of an interrupt. The interrupt
|
||||||
|
number can be positive to specify an external (device specific)
|
||||||
|
interrupt, or negative to specify an internal (core) interrupt.
|
||||||
|
|
||||||
|
|
||||||
|
\param [in] IRQn Interrupt number.
|
||||||
|
\return Interrupt Priority. Value is aligned automatically to the implemented
|
||||||
|
priority bits of the microcontroller.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
|
||||||
|
if((int32_t)(IRQn) < 0) {
|
||||||
|
return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8 - __NVIC_PRIO_BITS)));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8 - __NVIC_PRIO_BITS)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief System Reset
|
||||||
|
|
||||||
|
The function initiates a system reset request to reset the MCU.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void NVIC_SystemReset(void)
|
||||||
|
{
|
||||||
|
__DSB(); /* Ensure all outstanding memory accesses included
|
||||||
|
buffered write are completed before reset */
|
||||||
|
SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
|
||||||
|
SCB_AIRCR_SYSRESETREQ_Msk);
|
||||||
|
__DSB(); /* Ensure completion of memory access */
|
||||||
|
while(1) { __NOP(); } /* wait until reset */
|
||||||
|
}
|
||||||
|
|
||||||
|
/*@} end of CMSIS_Core_NVICFunctions */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ################################## SysTick function ############################################ */
|
||||||
|
/** \ingroup CMSIS_Core_FunctionInterface
|
||||||
|
\defgroup CMSIS_Core_SysTickFunctions SysTick Functions
|
||||||
|
\brief Functions that configure the System.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if (__Vendor_SysTickConfig == 0)
|
||||||
|
|
||||||
|
/** \brief System Tick Configuration
|
||||||
|
|
||||||
|
The function initializes the System Timer and its interrupt, and starts the System Tick Timer.
|
||||||
|
Counter is in free running mode to generate periodic interrupts.
|
||||||
|
|
||||||
|
\param [in] ticks Number of ticks between two interrupts.
|
||||||
|
|
||||||
|
\return 0 Function succeeded.
|
||||||
|
\return 1 Function failed.
|
||||||
|
|
||||||
|
\note When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the
|
||||||
|
function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>
|
||||||
|
must contain a vendor-specific implementation of this function.
|
||||||
|
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
|
||||||
|
{
|
||||||
|
if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) { return (1UL); } /* Reload value impossible */
|
||||||
|
|
||||||
|
SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */
|
||||||
|
NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
|
||||||
|
SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
|
||||||
|
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
|
||||||
|
SysTick_CTRL_TICKINT_Msk |
|
||||||
|
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
|
||||||
|
return (0UL); /* Function successful */
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*@} end of CMSIS_Core_SysTickFunctions */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __CORE_CM0_H_DEPENDANT */
|
||||||
|
|
||||||
|
#endif /* __CMSIS_GENERIC */
|
||||||
854
DSP_LIB/Include/core_cm0plus.h
Normal file
854
DSP_LIB/Include/core_cm0plus.h
Normal file
@ -0,0 +1,854 @@
|
|||||||
|
/**************************************************************************//**
|
||||||
|
* @file core_cm0plus.h
|
||||||
|
* @brief CMSIS Cortex-M0+ Core Peripheral Access Layer Header File
|
||||||
|
* @version V4.10
|
||||||
|
* @date 18. March 2015
|
||||||
|
*
|
||||||
|
* @note
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
/* Copyright (c) 2009 - 2015 ARM LIMITED
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
- Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
- Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
- Neither the name of ARM nor the names of its contributors may be used
|
||||||
|
to endorse or promote products derived from this software without
|
||||||
|
specific prior written permission.
|
||||||
|
*
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
#if defined ( __ICCARM__ )
|
||||||
|
#pragma system_include /* treat file as system include file for MISRA check */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __CORE_CM0PLUS_H_GENERIC
|
||||||
|
#define __CORE_CM0PLUS_H_GENERIC
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions
|
||||||
|
CMSIS violates the following MISRA-C:2004 rules:
|
||||||
|
|
||||||
|
\li Required Rule 8.5, object/function definition in header file.<br>
|
||||||
|
Function definitions in header files are used to allow 'inlining'.
|
||||||
|
|
||||||
|
\li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br>
|
||||||
|
Unions are used for effective representation of core registers.
|
||||||
|
|
||||||
|
\li Advisory Rule 19.7, Function-like macro defined.<br>
|
||||||
|
Function-like macros are used to allow more efficient code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* CMSIS definitions
|
||||||
|
******************************************************************************/
|
||||||
|
/** \ingroup Cortex-M0+
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* CMSIS CM0P definitions */
|
||||||
|
#define __CM0PLUS_CMSIS_VERSION_MAIN (0x04) /*!< [31:16] CMSIS HAL main version */
|
||||||
|
#define __CM0PLUS_CMSIS_VERSION_SUB (0x00) /*!< [15:0] CMSIS HAL sub version */
|
||||||
|
#define __CM0PLUS_CMSIS_VERSION ((__CM0PLUS_CMSIS_VERSION_MAIN << 16) | \
|
||||||
|
__CM0PLUS_CMSIS_VERSION_SUB) /*!< CMSIS HAL version number */
|
||||||
|
|
||||||
|
#define __CORTEX_M (0x00) /*!< Cortex-M Core */
|
||||||
|
|
||||||
|
|
||||||
|
#if defined ( __CC_ARM )
|
||||||
|
#define __ASM __asm /*!< asm keyword for ARM Compiler */
|
||||||
|
#define __INLINE __inline /*!< inline keyword for ARM Compiler */
|
||||||
|
#define __STATIC_INLINE static __inline
|
||||||
|
|
||||||
|
#elif defined ( __GNUC__ )
|
||||||
|
#define __ASM __asm /*!< asm keyword for GNU Compiler */
|
||||||
|
#define __INLINE inline /*!< inline keyword for GNU Compiler */
|
||||||
|
#define __STATIC_INLINE static inline
|
||||||
|
|
||||||
|
#elif defined ( __ICCARM__ )
|
||||||
|
#define __ASM __asm /*!< asm keyword for IAR Compiler */
|
||||||
|
#define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */
|
||||||
|
#define __STATIC_INLINE static inline
|
||||||
|
|
||||||
|
#elif defined ( __TMS470__ )
|
||||||
|
#define __ASM __asm /*!< asm keyword for TI CCS Compiler */
|
||||||
|
#define __STATIC_INLINE static inline
|
||||||
|
|
||||||
|
#elif defined ( __TASKING__ )
|
||||||
|
#define __ASM __asm /*!< asm keyword for TASKING Compiler */
|
||||||
|
#define __INLINE inline /*!< inline keyword for TASKING Compiler */
|
||||||
|
#define __STATIC_INLINE static inline
|
||||||
|
|
||||||
|
#elif defined ( __CSMC__ )
|
||||||
|
#define __packed
|
||||||
|
#define __ASM _asm /*!< asm keyword for COSMIC Compiler */
|
||||||
|
#define __INLINE inline /*use -pc99 on compile line !< inline keyword for COSMIC Compiler */
|
||||||
|
#define __STATIC_INLINE static inline
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** __FPU_USED indicates whether an FPU is used or not.
|
||||||
|
This core does not support an FPU at all
|
||||||
|
*/
|
||||||
|
#define __FPU_USED 0
|
||||||
|
|
||||||
|
#if defined ( __CC_ARM )
|
||||||
|
#if defined __TARGET_FPU_VFP
|
||||||
|
#warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __GNUC__ )
|
||||||
|
#if defined (__VFP_FP__) && !defined(__SOFTFP__)
|
||||||
|
#warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __ICCARM__ )
|
||||||
|
#if defined __ARMVFP__
|
||||||
|
#warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __TMS470__ )
|
||||||
|
#if defined __TI__VFP_SUPPORT____
|
||||||
|
#warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __TASKING__ )
|
||||||
|
#if defined __FPU_VFP__
|
||||||
|
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __CSMC__ ) /* Cosmic */
|
||||||
|
#if ( __CSMC__ & 0x400) // FPU present for parser
|
||||||
|
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdint.h> /* standard types definitions */
|
||||||
|
#include <core_cmInstr.h> /* Core Instruction Access */
|
||||||
|
#include <core_cmFunc.h> /* Core Function Access */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __CORE_CM0PLUS_H_GENERIC */
|
||||||
|
|
||||||
|
#ifndef __CMSIS_GENERIC
|
||||||
|
|
||||||
|
#ifndef __CORE_CM0PLUS_H_DEPENDANT
|
||||||
|
#define __CORE_CM0PLUS_H_DEPENDANT
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* check device defines and use defaults */
|
||||||
|
#if defined __CHECK_DEVICE_DEFINES
|
||||||
|
#ifndef __CM0PLUS_REV
|
||||||
|
#define __CM0PLUS_REV 0x0000
|
||||||
|
#warning "__CM0PLUS_REV not defined in device header file; using default!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __MPU_PRESENT
|
||||||
|
#define __MPU_PRESENT 0
|
||||||
|
#warning "__MPU_PRESENT not defined in device header file; using default!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __VTOR_PRESENT
|
||||||
|
#define __VTOR_PRESENT 0
|
||||||
|
#warning "__VTOR_PRESENT not defined in device header file; using default!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __NVIC_PRIO_BITS
|
||||||
|
#define __NVIC_PRIO_BITS 2
|
||||||
|
#warning "__NVIC_PRIO_BITS not defined in device header file; using default!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __Vendor_SysTickConfig
|
||||||
|
#define __Vendor_SysTickConfig 0
|
||||||
|
#warning "__Vendor_SysTickConfig not defined in device header file; using default!"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* IO definitions (access restrictions to peripheral registers) */
|
||||||
|
/**
|
||||||
|
\defgroup CMSIS_glob_defs CMSIS Global Defines
|
||||||
|
|
||||||
|
<strong>IO Type Qualifiers</strong> are used
|
||||||
|
\li to specify the access to peripheral variables.
|
||||||
|
\li for automatic generation of peripheral register debug information.
|
||||||
|
*/
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#define __I volatile /*!< Defines 'read only' permissions */
|
||||||
|
#else
|
||||||
|
#define __I volatile const /*!< Defines 'read only' permissions */
|
||||||
|
#endif
|
||||||
|
#define __O volatile /*!< Defines 'write only' permissions */
|
||||||
|
#define __IO volatile /*!< Defines 'read / write' permissions */
|
||||||
|
|
||||||
|
/*@} end of group Cortex-M0+ */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Register Abstraction
|
||||||
|
Core Register contain:
|
||||||
|
- Core Register
|
||||||
|
- Core NVIC Register
|
||||||
|
- Core SCB Register
|
||||||
|
- Core SysTick Register
|
||||||
|
- Core MPU Register
|
||||||
|
******************************************************************************/
|
||||||
|
/** \defgroup CMSIS_core_register Defines and Type Definitions
|
||||||
|
\brief Type definitions and defines for Cortex-M processor based devices.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_CORE Status and Control Registers
|
||||||
|
\brief Core Register type definitions.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \brief Union type to access the Application Program Status Register (APSR).
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */
|
||||||
|
uint32_t V:1; /*!< bit: 28 Overflow condition code flag */
|
||||||
|
uint32_t C:1; /*!< bit: 29 Carry condition code flag */
|
||||||
|
uint32_t Z:1; /*!< bit: 30 Zero condition code flag */
|
||||||
|
uint32_t N:1; /*!< bit: 31 Negative condition code flag */
|
||||||
|
} b; /*!< Structure used for bit access */
|
||||||
|
uint32_t w; /*!< Type used for word access */
|
||||||
|
} APSR_Type;
|
||||||
|
|
||||||
|
/* APSR Register Definitions */
|
||||||
|
#define APSR_N_Pos 31 /*!< APSR: N Position */
|
||||||
|
#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */
|
||||||
|
|
||||||
|
#define APSR_Z_Pos 30 /*!< APSR: Z Position */
|
||||||
|
#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */
|
||||||
|
|
||||||
|
#define APSR_C_Pos 29 /*!< APSR: C Position */
|
||||||
|
#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */
|
||||||
|
|
||||||
|
#define APSR_V_Pos 28 /*!< APSR: V Position */
|
||||||
|
#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Union type to access the Interrupt Program Status Register (IPSR).
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */
|
||||||
|
uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */
|
||||||
|
} b; /*!< Structure used for bit access */
|
||||||
|
uint32_t w; /*!< Type used for word access */
|
||||||
|
} IPSR_Type;
|
||||||
|
|
||||||
|
/* IPSR Register Definitions */
|
||||||
|
#define IPSR_ISR_Pos 0 /*!< IPSR: ISR Position */
|
||||||
|
#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR).
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */
|
||||||
|
uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */
|
||||||
|
uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */
|
||||||
|
uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */
|
||||||
|
uint32_t V:1; /*!< bit: 28 Overflow condition code flag */
|
||||||
|
uint32_t C:1; /*!< bit: 29 Carry condition code flag */
|
||||||
|
uint32_t Z:1; /*!< bit: 30 Zero condition code flag */
|
||||||
|
uint32_t N:1; /*!< bit: 31 Negative condition code flag */
|
||||||
|
} b; /*!< Structure used for bit access */
|
||||||
|
uint32_t w; /*!< Type used for word access */
|
||||||
|
} xPSR_Type;
|
||||||
|
|
||||||
|
/* xPSR Register Definitions */
|
||||||
|
#define xPSR_N_Pos 31 /*!< xPSR: N Position */
|
||||||
|
#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */
|
||||||
|
|
||||||
|
#define xPSR_Z_Pos 30 /*!< xPSR: Z Position */
|
||||||
|
#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */
|
||||||
|
|
||||||
|
#define xPSR_C_Pos 29 /*!< xPSR: C Position */
|
||||||
|
#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */
|
||||||
|
|
||||||
|
#define xPSR_V_Pos 28 /*!< xPSR: V Position */
|
||||||
|
#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */
|
||||||
|
|
||||||
|
#define xPSR_T_Pos 24 /*!< xPSR: T Position */
|
||||||
|
#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */
|
||||||
|
|
||||||
|
#define xPSR_ISR_Pos 0 /*!< xPSR: ISR Position */
|
||||||
|
#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Union type to access the Control Registers (CONTROL).
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */
|
||||||
|
uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */
|
||||||
|
uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */
|
||||||
|
} b; /*!< Structure used for bit access */
|
||||||
|
uint32_t w; /*!< Type used for word access */
|
||||||
|
} CONTROL_Type;
|
||||||
|
|
||||||
|
/* CONTROL Register Definitions */
|
||||||
|
#define CONTROL_SPSEL_Pos 1 /*!< CONTROL: SPSEL Position */
|
||||||
|
#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */
|
||||||
|
|
||||||
|
#define CONTROL_nPRIV_Pos 0 /*!< CONTROL: nPRIV Position */
|
||||||
|
#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_CORE */
|
||||||
|
|
||||||
|
|
||||||
|
/** \ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC)
|
||||||
|
\brief Type definitions for the NVIC Registers
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC).
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__IO uint32_t ISER[1]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */
|
||||||
|
uint32_t RESERVED0[31];
|
||||||
|
__IO uint32_t ICER[1]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */
|
||||||
|
uint32_t RSERVED1[31];
|
||||||
|
__IO uint32_t ISPR[1]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */
|
||||||
|
uint32_t RESERVED2[31];
|
||||||
|
__IO uint32_t ICPR[1]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */
|
||||||
|
uint32_t RESERVED3[31];
|
||||||
|
uint32_t RESERVED4[64];
|
||||||
|
__IO uint32_t IP[8]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */
|
||||||
|
} NVIC_Type;
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_NVIC */
|
||||||
|
|
||||||
|
|
||||||
|
/** \ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_SCB System Control Block (SCB)
|
||||||
|
\brief Type definitions for the System Control Block Registers
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \brief Structure type to access the System Control Block (SCB).
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */
|
||||||
|
__IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */
|
||||||
|
#if (__VTOR_PRESENT == 1)
|
||||||
|
__IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */
|
||||||
|
#else
|
||||||
|
uint32_t RESERVED0;
|
||||||
|
#endif
|
||||||
|
__IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */
|
||||||
|
__IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */
|
||||||
|
__IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */
|
||||||
|
uint32_t RESERVED1;
|
||||||
|
__IO uint32_t SHP[2]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */
|
||||||
|
__IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */
|
||||||
|
} SCB_Type;
|
||||||
|
|
||||||
|
/* SCB CPUID Register Definitions */
|
||||||
|
#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */
|
||||||
|
#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */
|
||||||
|
|
||||||
|
#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */
|
||||||
|
#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */
|
||||||
|
|
||||||
|
#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */
|
||||||
|
#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */
|
||||||
|
|
||||||
|
#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */
|
||||||
|
#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */
|
||||||
|
|
||||||
|
#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */
|
||||||
|
#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */
|
||||||
|
|
||||||
|
/* SCB Interrupt Control State Register Definitions */
|
||||||
|
#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */
|
||||||
|
#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */
|
||||||
|
#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */
|
||||||
|
#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */
|
||||||
|
#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */
|
||||||
|
#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */
|
||||||
|
#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */
|
||||||
|
#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */
|
||||||
|
#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */
|
||||||
|
#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */
|
||||||
|
|
||||||
|
#if (__VTOR_PRESENT == 1)
|
||||||
|
/* SCB Interrupt Control State Register Definitions */
|
||||||
|
#define SCB_VTOR_TBLOFF_Pos 8 /*!< SCB VTOR: TBLOFF Position */
|
||||||
|
#define SCB_VTOR_TBLOFF_Msk (0xFFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* SCB Application Interrupt and Reset Control Register Definitions */
|
||||||
|
#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */
|
||||||
|
#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */
|
||||||
|
|
||||||
|
#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */
|
||||||
|
#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */
|
||||||
|
|
||||||
|
#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */
|
||||||
|
#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */
|
||||||
|
|
||||||
|
#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */
|
||||||
|
#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */
|
||||||
|
|
||||||
|
#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */
|
||||||
|
#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */
|
||||||
|
|
||||||
|
/* SCB System Control Register Definitions */
|
||||||
|
#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */
|
||||||
|
#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */
|
||||||
|
|
||||||
|
#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */
|
||||||
|
#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */
|
||||||
|
|
||||||
|
#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */
|
||||||
|
#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */
|
||||||
|
|
||||||
|
/* SCB Configuration Control Register Definitions */
|
||||||
|
#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */
|
||||||
|
#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */
|
||||||
|
|
||||||
|
#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */
|
||||||
|
#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */
|
||||||
|
|
||||||
|
/* SCB System Handler Control and State Register Definitions */
|
||||||
|
#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */
|
||||||
|
#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_SCB */
|
||||||
|
|
||||||
|
|
||||||
|
/** \ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_SysTick System Tick Timer (SysTick)
|
||||||
|
\brief Type definitions for the System Timer Registers.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \brief Structure type to access the System Timer (SysTick).
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */
|
||||||
|
__IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */
|
||||||
|
__IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */
|
||||||
|
__I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */
|
||||||
|
} SysTick_Type;
|
||||||
|
|
||||||
|
/* SysTick Control / Status Register Definitions */
|
||||||
|
#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */
|
||||||
|
#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */
|
||||||
|
|
||||||
|
#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */
|
||||||
|
#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */
|
||||||
|
|
||||||
|
#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */
|
||||||
|
#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */
|
||||||
|
|
||||||
|
#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */
|
||||||
|
#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */
|
||||||
|
|
||||||
|
/* SysTick Reload Register Definitions */
|
||||||
|
#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */
|
||||||
|
#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */
|
||||||
|
|
||||||
|
/* SysTick Current Register Definitions */
|
||||||
|
#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */
|
||||||
|
#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */
|
||||||
|
|
||||||
|
/* SysTick Calibration Register Definitions */
|
||||||
|
#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */
|
||||||
|
#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */
|
||||||
|
|
||||||
|
#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */
|
||||||
|
#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */
|
||||||
|
|
||||||
|
#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */
|
||||||
|
#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_SysTick */
|
||||||
|
|
||||||
|
#if (__MPU_PRESENT == 1)
|
||||||
|
/** \ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_MPU Memory Protection Unit (MPU)
|
||||||
|
\brief Type definitions for the Memory Protection Unit (MPU)
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \brief Structure type to access the Memory Protection Unit (MPU).
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__I uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */
|
||||||
|
__IO uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */
|
||||||
|
__IO uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */
|
||||||
|
__IO uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */
|
||||||
|
__IO uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */
|
||||||
|
} MPU_Type;
|
||||||
|
|
||||||
|
/* MPU Type Register */
|
||||||
|
#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */
|
||||||
|
#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */
|
||||||
|
|
||||||
|
#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */
|
||||||
|
#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */
|
||||||
|
|
||||||
|
#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */
|
||||||
|
#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */
|
||||||
|
|
||||||
|
/* MPU Control Register */
|
||||||
|
#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */
|
||||||
|
#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */
|
||||||
|
|
||||||
|
#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */
|
||||||
|
#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */
|
||||||
|
|
||||||
|
#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */
|
||||||
|
#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */
|
||||||
|
|
||||||
|
/* MPU Region Number Register */
|
||||||
|
#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */
|
||||||
|
#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */
|
||||||
|
|
||||||
|
/* MPU Region Base Address Register */
|
||||||
|
#define MPU_RBAR_ADDR_Pos 8 /*!< MPU RBAR: ADDR Position */
|
||||||
|
#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */
|
||||||
|
|
||||||
|
#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */
|
||||||
|
#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */
|
||||||
|
|
||||||
|
#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */
|
||||||
|
#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */
|
||||||
|
|
||||||
|
/* MPU Region Attribute and Size Register */
|
||||||
|
#define MPU_RASR_ATTRS_Pos 16 /*!< MPU RASR: MPU Region Attribute field Position */
|
||||||
|
#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */
|
||||||
|
|
||||||
|
#define MPU_RASR_XN_Pos 28 /*!< MPU RASR: ATTRS.XN Position */
|
||||||
|
#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */
|
||||||
|
|
||||||
|
#define MPU_RASR_AP_Pos 24 /*!< MPU RASR: ATTRS.AP Position */
|
||||||
|
#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */
|
||||||
|
|
||||||
|
#define MPU_RASR_TEX_Pos 19 /*!< MPU RASR: ATTRS.TEX Position */
|
||||||
|
#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */
|
||||||
|
|
||||||
|
#define MPU_RASR_S_Pos 18 /*!< MPU RASR: ATTRS.S Position */
|
||||||
|
#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */
|
||||||
|
|
||||||
|
#define MPU_RASR_C_Pos 17 /*!< MPU RASR: ATTRS.C Position */
|
||||||
|
#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */
|
||||||
|
|
||||||
|
#define MPU_RASR_B_Pos 16 /*!< MPU RASR: ATTRS.B Position */
|
||||||
|
#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */
|
||||||
|
|
||||||
|
#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */
|
||||||
|
#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */
|
||||||
|
|
||||||
|
#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */
|
||||||
|
#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */
|
||||||
|
|
||||||
|
#define MPU_RASR_ENABLE_Pos 0 /*!< MPU RASR: Region enable bit Position */
|
||||||
|
#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_MPU */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/** \ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug)
|
||||||
|
\brief Cortex-M0+ Core Debug Registers (DCB registers, SHCSR, and DFSR)
|
||||||
|
are only accessible over DAP and not via processor. Therefore
|
||||||
|
they are not covered by the Cortex-M0 header file.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
/*@} end of group CMSIS_CoreDebug */
|
||||||
|
|
||||||
|
|
||||||
|
/** \ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_core_base Core Definitions
|
||||||
|
\brief Definitions for base addresses, unions, and structures.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Memory mapping of Cortex-M0+ Hardware */
|
||||||
|
#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */
|
||||||
|
#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */
|
||||||
|
#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */
|
||||||
|
#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */
|
||||||
|
|
||||||
|
#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */
|
||||||
|
#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */
|
||||||
|
#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */
|
||||||
|
|
||||||
|
#if (__MPU_PRESENT == 1)
|
||||||
|
#define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */
|
||||||
|
#define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*@} */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Hardware Abstraction Layer
|
||||||
|
Core Function Interface contains:
|
||||||
|
- Core NVIC Functions
|
||||||
|
- Core SysTick Functions
|
||||||
|
- Core Register Access Functions
|
||||||
|
******************************************************************************/
|
||||||
|
/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ########################## NVIC functions #################################### */
|
||||||
|
/** \ingroup CMSIS_Core_FunctionInterface
|
||||||
|
\defgroup CMSIS_Core_NVICFunctions NVIC Functions
|
||||||
|
\brief Functions that manage interrupts and exceptions via the NVIC.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Interrupt Priorities are WORD accessible only under ARMv6M */
|
||||||
|
/* The following MACROS handle generation of the register offset and byte masks */
|
||||||
|
#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL)
|
||||||
|
#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) )
|
||||||
|
#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) )
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Enable External Interrupt
|
||||||
|
|
||||||
|
The function enables a device-specific interrupt in the NVIC interrupt controller.
|
||||||
|
|
||||||
|
\param [in] IRQn External interrupt number. Value cannot be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
NVIC->ISER[0] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Disable External Interrupt
|
||||||
|
|
||||||
|
The function disables a device-specific interrupt in the NVIC interrupt controller.
|
||||||
|
|
||||||
|
\param [in] IRQn External interrupt number. Value cannot be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
NVIC->ICER[0] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Get Pending Interrupt
|
||||||
|
|
||||||
|
The function reads the pending register in the NVIC and returns the pending bit
|
||||||
|
for the specified interrupt.
|
||||||
|
|
||||||
|
\param [in] IRQn Interrupt number.
|
||||||
|
|
||||||
|
\return 0 Interrupt status is not pending.
|
||||||
|
\return 1 Interrupt status is pending.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
return((uint32_t)(((NVIC->ISPR[0] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Set Pending Interrupt
|
||||||
|
|
||||||
|
The function sets the pending bit of an external interrupt.
|
||||||
|
|
||||||
|
\param [in] IRQn Interrupt number. Value cannot be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
NVIC->ISPR[0] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Clear Pending Interrupt
|
||||||
|
|
||||||
|
The function clears the pending bit of an external interrupt.
|
||||||
|
|
||||||
|
\param [in] IRQn External interrupt number. Value cannot be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
NVIC->ICPR[0] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Set Interrupt Priority
|
||||||
|
|
||||||
|
The function sets the priority of an interrupt.
|
||||||
|
|
||||||
|
\note The priority cannot be set for every core interrupt.
|
||||||
|
|
||||||
|
\param [in] IRQn Interrupt number.
|
||||||
|
\param [in] priority Priority to set.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
|
||||||
|
{
|
||||||
|
if((int32_t)(IRQn) < 0) {
|
||||||
|
SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
|
||||||
|
(((priority << (8 - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
|
||||||
|
(((priority << (8 - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Get Interrupt Priority
|
||||||
|
|
||||||
|
The function reads the priority of an interrupt. The interrupt
|
||||||
|
number can be positive to specify an external (device specific)
|
||||||
|
interrupt, or negative to specify an internal (core) interrupt.
|
||||||
|
|
||||||
|
|
||||||
|
\param [in] IRQn Interrupt number.
|
||||||
|
\return Interrupt Priority. Value is aligned automatically to the implemented
|
||||||
|
priority bits of the microcontroller.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
|
||||||
|
if((int32_t)(IRQn) < 0) {
|
||||||
|
return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8 - __NVIC_PRIO_BITS)));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8 - __NVIC_PRIO_BITS)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief System Reset
|
||||||
|
|
||||||
|
The function initiates a system reset request to reset the MCU.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void NVIC_SystemReset(void)
|
||||||
|
{
|
||||||
|
__DSB(); /* Ensure all outstanding memory accesses included
|
||||||
|
buffered write are completed before reset */
|
||||||
|
SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
|
||||||
|
SCB_AIRCR_SYSRESETREQ_Msk);
|
||||||
|
__DSB(); /* Ensure completion of memory access */
|
||||||
|
while(1) { __NOP(); } /* wait until reset */
|
||||||
|
}
|
||||||
|
|
||||||
|
/*@} end of CMSIS_Core_NVICFunctions */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ################################## SysTick function ############################################ */
|
||||||
|
/** \ingroup CMSIS_Core_FunctionInterface
|
||||||
|
\defgroup CMSIS_Core_SysTickFunctions SysTick Functions
|
||||||
|
\brief Functions that configure the System.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if (__Vendor_SysTickConfig == 0)
|
||||||
|
|
||||||
|
/** \brief System Tick Configuration
|
||||||
|
|
||||||
|
The function initializes the System Timer and its interrupt, and starts the System Tick Timer.
|
||||||
|
Counter is in free running mode to generate periodic interrupts.
|
||||||
|
|
||||||
|
\param [in] ticks Number of ticks between two interrupts.
|
||||||
|
|
||||||
|
\return 0 Function succeeded.
|
||||||
|
\return 1 Function failed.
|
||||||
|
|
||||||
|
\note When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the
|
||||||
|
function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>
|
||||||
|
must contain a vendor-specific implementation of this function.
|
||||||
|
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
|
||||||
|
{
|
||||||
|
if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) {return (1UL);} /* Reload value impossible */
|
||||||
|
|
||||||
|
SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */
|
||||||
|
NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
|
||||||
|
SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
|
||||||
|
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
|
||||||
|
SysTick_CTRL_TICKINT_Msk |
|
||||||
|
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
|
||||||
|
return (0UL); /* Function successful */
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*@} end of CMSIS_Core_SysTickFunctions */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __CORE_CM0PLUS_H_DEPENDANT */
|
||||||
|
|
||||||
|
#endif /* __CMSIS_GENERIC */
|
||||||
1693
DSP_LIB/Include/core_cm3.h
Normal file
1693
DSP_LIB/Include/core_cm3.h
Normal file
File diff suppressed because it is too large
Load Diff
1858
DSP_LIB/Include/core_cm4.h
Normal file
1858
DSP_LIB/Include/core_cm4.h
Normal file
File diff suppressed because it is too large
Load Diff
2397
DSP_LIB/Include/core_cm7.h
Normal file
2397
DSP_LIB/Include/core_cm7.h
Normal file
File diff suppressed because it is too large
Load Diff
664
DSP_LIB/Include/core_cmFunc.h
Normal file
664
DSP_LIB/Include/core_cmFunc.h
Normal file
@ -0,0 +1,664 @@
|
|||||||
|
/**************************************************************************//**
|
||||||
|
* @file core_cmFunc.h
|
||||||
|
* @brief CMSIS Cortex-M Core Function Access Header File
|
||||||
|
* @version V4.10
|
||||||
|
* @date 18. March 2015
|
||||||
|
*
|
||||||
|
* @note
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
/* Copyright (c) 2009 - 2015 ARM LIMITED
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
- Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
- Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
- Neither the name of ARM nor the names of its contributors may be used
|
||||||
|
to endorse or promote products derived from this software without
|
||||||
|
specific prior written permission.
|
||||||
|
*
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __CORE_CMFUNC_H
|
||||||
|
#define __CORE_CMFUNC_H
|
||||||
|
|
||||||
|
|
||||||
|
/* ########################### Core Function Access ########################### */
|
||||||
|
/** \ingroup CMSIS_Core_FunctionInterface
|
||||||
|
\defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
|
||||||
|
/* ARM armcc specific functions */
|
||||||
|
|
||||||
|
#if (__ARMCC_VERSION < 400677)
|
||||||
|
#error "Please use ARM Compiler Toolchain V4.0.677 or later!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* intrinsic void __enable_irq(); */
|
||||||
|
/* intrinsic void __disable_irq(); */
|
||||||
|
|
||||||
|
/** \brief Get Control Register
|
||||||
|
|
||||||
|
This function returns the content of the Control Register.
|
||||||
|
|
||||||
|
\return Control Register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_CONTROL(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regControl __ASM("control");
|
||||||
|
return(__regControl);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Set Control Register
|
||||||
|
|
||||||
|
This function writes the given value to the Control Register.
|
||||||
|
|
||||||
|
\param [in] control Control Register value to set
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __set_CONTROL(uint32_t control)
|
||||||
|
{
|
||||||
|
register uint32_t __regControl __ASM("control");
|
||||||
|
__regControl = control;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Get IPSR Register
|
||||||
|
|
||||||
|
This function returns the content of the IPSR Register.
|
||||||
|
|
||||||
|
\return IPSR Register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_IPSR(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regIPSR __ASM("ipsr");
|
||||||
|
return(__regIPSR);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Get APSR Register
|
||||||
|
|
||||||
|
This function returns the content of the APSR Register.
|
||||||
|
|
||||||
|
\return APSR Register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_APSR(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regAPSR __ASM("apsr");
|
||||||
|
return(__regAPSR);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Get xPSR Register
|
||||||
|
|
||||||
|
This function returns the content of the xPSR Register.
|
||||||
|
|
||||||
|
\return xPSR Register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_xPSR(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regXPSR __ASM("xpsr");
|
||||||
|
return(__regXPSR);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Get Process Stack Pointer
|
||||||
|
|
||||||
|
This function returns the current value of the Process Stack Pointer (PSP).
|
||||||
|
|
||||||
|
\return PSP Register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_PSP(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regProcessStackPointer __ASM("psp");
|
||||||
|
return(__regProcessStackPointer);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Set Process Stack Pointer
|
||||||
|
|
||||||
|
This function assigns the given value to the Process Stack Pointer (PSP).
|
||||||
|
|
||||||
|
\param [in] topOfProcStack Process Stack Pointer value to set
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)
|
||||||
|
{
|
||||||
|
register uint32_t __regProcessStackPointer __ASM("psp");
|
||||||
|
__regProcessStackPointer = topOfProcStack;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Get Main Stack Pointer
|
||||||
|
|
||||||
|
This function returns the current value of the Main Stack Pointer (MSP).
|
||||||
|
|
||||||
|
\return MSP Register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_MSP(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regMainStackPointer __ASM("msp");
|
||||||
|
return(__regMainStackPointer);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Set Main Stack Pointer
|
||||||
|
|
||||||
|
This function assigns the given value to the Main Stack Pointer (MSP).
|
||||||
|
|
||||||
|
\param [in] topOfMainStack Main Stack Pointer value to set
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
|
||||||
|
{
|
||||||
|
register uint32_t __regMainStackPointer __ASM("msp");
|
||||||
|
__regMainStackPointer = topOfMainStack;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Get Priority Mask
|
||||||
|
|
||||||
|
This function returns the current state of the priority mask bit from the Priority Mask Register.
|
||||||
|
|
||||||
|
\return Priority Mask value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_PRIMASK(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regPriMask __ASM("primask");
|
||||||
|
return(__regPriMask);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Set Priority Mask
|
||||||
|
|
||||||
|
This function assigns the given value to the Priority Mask Register.
|
||||||
|
|
||||||
|
\param [in] priMask Priority Mask
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
|
||||||
|
{
|
||||||
|
register uint32_t __regPriMask __ASM("primask");
|
||||||
|
__regPriMask = (priMask);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300)
|
||||||
|
|
||||||
|
/** \brief Enable FIQ
|
||||||
|
|
||||||
|
This function enables FIQ interrupts by clearing the F-bit in the CPSR.
|
||||||
|
Can only be executed in Privileged modes.
|
||||||
|
*/
|
||||||
|
#define __enable_fault_irq __enable_fiq
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Disable FIQ
|
||||||
|
|
||||||
|
This function disables FIQ interrupts by setting the F-bit in the CPSR.
|
||||||
|
Can only be executed in Privileged modes.
|
||||||
|
*/
|
||||||
|
#define __disable_fault_irq __disable_fiq
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Get Base Priority
|
||||||
|
|
||||||
|
This function returns the current value of the Base Priority register.
|
||||||
|
|
||||||
|
\return Base Priority register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_BASEPRI(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regBasePri __ASM("basepri");
|
||||||
|
return(__regBasePri);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Set Base Priority
|
||||||
|
|
||||||
|
This function assigns the given value to the Base Priority register.
|
||||||
|
|
||||||
|
\param [in] basePri Base Priority value to set
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __set_BASEPRI(uint32_t basePri)
|
||||||
|
{
|
||||||
|
register uint32_t __regBasePri __ASM("basepri");
|
||||||
|
__regBasePri = (basePri & 0xff);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Set Base Priority with condition
|
||||||
|
|
||||||
|
This function assigns the given value to the Base Priority register only if BASEPRI masking is disabled,
|
||||||
|
or the new value increases the BASEPRI priority level.
|
||||||
|
|
||||||
|
\param [in] basePri Base Priority value to set
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri)
|
||||||
|
{
|
||||||
|
register uint32_t __regBasePriMax __ASM("basepri_max");
|
||||||
|
__regBasePriMax = (basePri & 0xff);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Get Fault Mask
|
||||||
|
|
||||||
|
This function returns the current value of the Fault Mask register.
|
||||||
|
|
||||||
|
\return Fault Mask register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_FAULTMASK(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regFaultMask __ASM("faultmask");
|
||||||
|
return(__regFaultMask);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Set Fault Mask
|
||||||
|
|
||||||
|
This function assigns the given value to the Fault Mask register.
|
||||||
|
|
||||||
|
\param [in] faultMask Fault Mask value to set
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
|
||||||
|
{
|
||||||
|
register uint32_t __regFaultMask __ASM("faultmask");
|
||||||
|
__regFaultMask = (faultMask & (uint32_t)1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300) */
|
||||||
|
|
||||||
|
|
||||||
|
#if (__CORTEX_M == 0x04) || (__CORTEX_M == 0x07)
|
||||||
|
|
||||||
|
/** \brief Get FPSCR
|
||||||
|
|
||||||
|
This function returns the current value of the Floating Point Status/Control register.
|
||||||
|
|
||||||
|
\return Floating Point Status/Control register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_FPSCR(void)
|
||||||
|
{
|
||||||
|
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
|
||||||
|
register uint32_t __regfpscr __ASM("fpscr");
|
||||||
|
return(__regfpscr);
|
||||||
|
#else
|
||||||
|
return(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Set FPSCR
|
||||||
|
|
||||||
|
This function assigns the given value to the Floating Point Status/Control register.
|
||||||
|
|
||||||
|
\param [in] fpscr Floating Point Status/Control value to set
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
|
||||||
|
{
|
||||||
|
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
|
||||||
|
register uint32_t __regfpscr __ASM("fpscr");
|
||||||
|
__regfpscr = (fpscr);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* (__CORTEX_M == 0x04) || (__CORTEX_M == 0x07) */
|
||||||
|
|
||||||
|
|
||||||
|
#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
|
||||||
|
/* GNU gcc specific functions */
|
||||||
|
|
||||||
|
/** \brief Enable IRQ Interrupts
|
||||||
|
|
||||||
|
This function enables IRQ interrupts by clearing the I-bit in the CPSR.
|
||||||
|
Can only be executed in Privileged modes.
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void)
|
||||||
|
{
|
||||||
|
__ASM volatile ("cpsie i" : : : "memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Disable IRQ Interrupts
|
||||||
|
|
||||||
|
This function disables IRQ interrupts by setting the I-bit in the CPSR.
|
||||||
|
Can only be executed in Privileged modes.
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void)
|
||||||
|
{
|
||||||
|
__ASM volatile ("cpsid i" : : : "memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Get Control Register
|
||||||
|
|
||||||
|
This function returns the content of the Control Register.
|
||||||
|
|
||||||
|
\return Control Register value
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_CONTROL(void)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("MRS %0, control" : "=r" (result) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Set Control Register
|
||||||
|
|
||||||
|
This function writes the given value to the Control Register.
|
||||||
|
|
||||||
|
\param [in] control Control Register value to set
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_CONTROL(uint32_t control)
|
||||||
|
{
|
||||||
|
__ASM volatile ("MSR control, %0" : : "r" (control) : "memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Get IPSR Register
|
||||||
|
|
||||||
|
This function returns the content of the IPSR Register.
|
||||||
|
|
||||||
|
\return IPSR Register value
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_IPSR(void)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("MRS %0, ipsr" : "=r" (result) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Get APSR Register
|
||||||
|
|
||||||
|
This function returns the content of the APSR Register.
|
||||||
|
|
||||||
|
\return APSR Register value
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_APSR(void)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("MRS %0, apsr" : "=r" (result) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Get xPSR Register
|
||||||
|
|
||||||
|
This function returns the content of the xPSR Register.
|
||||||
|
|
||||||
|
\return xPSR Register value
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_xPSR(void)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("MRS %0, xpsr" : "=r" (result) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Get Process Stack Pointer
|
||||||
|
|
||||||
|
This function returns the current value of the Process Stack Pointer (PSP).
|
||||||
|
|
||||||
|
\return PSP Register value
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PSP(void)
|
||||||
|
{
|
||||||
|
register uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("MRS %0, psp\n" : "=r" (result) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Set Process Stack Pointer
|
||||||
|
|
||||||
|
This function assigns the given value to the Process Stack Pointer (PSP).
|
||||||
|
|
||||||
|
\param [in] topOfProcStack Process Stack Pointer value to set
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)
|
||||||
|
{
|
||||||
|
__ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) : "sp");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Get Main Stack Pointer
|
||||||
|
|
||||||
|
This function returns the current value of the Main Stack Pointer (MSP).
|
||||||
|
|
||||||
|
\return MSP Register value
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_MSP(void)
|
||||||
|
{
|
||||||
|
register uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("MRS %0, msp\n" : "=r" (result) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Set Main Stack Pointer
|
||||||
|
|
||||||
|
This function assigns the given value to the Main Stack Pointer (MSP).
|
||||||
|
|
||||||
|
\param [in] topOfMainStack Main Stack Pointer value to set
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
|
||||||
|
{
|
||||||
|
__ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) : "sp");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Get Priority Mask
|
||||||
|
|
||||||
|
This function returns the current state of the priority mask bit from the Priority Mask Register.
|
||||||
|
|
||||||
|
\return Priority Mask value
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PRIMASK(void)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("MRS %0, primask" : "=r" (result) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Set Priority Mask
|
||||||
|
|
||||||
|
This function assigns the given value to the Priority Mask Register.
|
||||||
|
|
||||||
|
\param [in] priMask Priority Mask
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
|
||||||
|
{
|
||||||
|
__ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if (__CORTEX_M >= 0x03)
|
||||||
|
|
||||||
|
/** \brief Enable FIQ
|
||||||
|
|
||||||
|
This function enables FIQ interrupts by clearing the F-bit in the CPSR.
|
||||||
|
Can only be executed in Privileged modes.
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_fault_irq(void)
|
||||||
|
{
|
||||||
|
__ASM volatile ("cpsie f" : : : "memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Disable FIQ
|
||||||
|
|
||||||
|
This function disables FIQ interrupts by setting the F-bit in the CPSR.
|
||||||
|
Can only be executed in Privileged modes.
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_fault_irq(void)
|
||||||
|
{
|
||||||
|
__ASM volatile ("cpsid f" : : : "memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Get Base Priority
|
||||||
|
|
||||||
|
This function returns the current value of the Base Priority register.
|
||||||
|
|
||||||
|
\return Base Priority register value
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_BASEPRI(void)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("MRS %0, basepri" : "=r" (result) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Set Base Priority
|
||||||
|
|
||||||
|
This function assigns the given value to the Base Priority register.
|
||||||
|
|
||||||
|
\param [in] basePri Base Priority value to set
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_BASEPRI(uint32_t value)
|
||||||
|
{
|
||||||
|
__ASM volatile ("MSR basepri, %0" : : "r" (value) : "memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Set Base Priority with condition
|
||||||
|
|
||||||
|
This function assigns the given value to the Base Priority register only if BASEPRI masking is disabled,
|
||||||
|
or the new value increases the BASEPRI priority level.
|
||||||
|
|
||||||
|
\param [in] basePri Base Priority value to set
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_BASEPRI_MAX(uint32_t value)
|
||||||
|
{
|
||||||
|
__ASM volatile ("MSR basepri_max, %0" : : "r" (value) : "memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Get Fault Mask
|
||||||
|
|
||||||
|
This function returns the current value of the Fault Mask register.
|
||||||
|
|
||||||
|
\return Fault Mask register value
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FAULTMASK(void)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("MRS %0, faultmask" : "=r" (result) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Set Fault Mask
|
||||||
|
|
||||||
|
This function assigns the given value to the Fault Mask register.
|
||||||
|
|
||||||
|
\param [in] faultMask Fault Mask value to set
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
|
||||||
|
{
|
||||||
|
__ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* (__CORTEX_M >= 0x03) */
|
||||||
|
|
||||||
|
|
||||||
|
#if (__CORTEX_M == 0x04) || (__CORTEX_M == 0x07)
|
||||||
|
|
||||||
|
/** \brief Get FPSCR
|
||||||
|
|
||||||
|
This function returns the current value of the Floating Point Status/Control register.
|
||||||
|
|
||||||
|
\return Floating Point Status/Control register value
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FPSCR(void)
|
||||||
|
{
|
||||||
|
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
/* Empty asm statement works as a scheduling barrier */
|
||||||
|
__ASM volatile ("");
|
||||||
|
__ASM volatile ("VMRS %0, fpscr" : "=r" (result) );
|
||||||
|
__ASM volatile ("");
|
||||||
|
return(result);
|
||||||
|
#else
|
||||||
|
return(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Set FPSCR
|
||||||
|
|
||||||
|
This function assigns the given value to the Floating Point Status/Control register.
|
||||||
|
|
||||||
|
\param [in] fpscr Floating Point Status/Control value to set
|
||||||
|
*/
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
|
||||||
|
{
|
||||||
|
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
|
||||||
|
/* Empty asm statement works as a scheduling barrier */
|
||||||
|
__ASM volatile ("");
|
||||||
|
__ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc");
|
||||||
|
__ASM volatile ("");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* (__CORTEX_M == 0x04) || (__CORTEX_M == 0x07) */
|
||||||
|
|
||||||
|
|
||||||
|
#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
|
||||||
|
/* IAR iccarm specific functions */
|
||||||
|
#include <cmsis_iar.h>
|
||||||
|
|
||||||
|
|
||||||
|
#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/
|
||||||
|
/* TI CCS specific functions */
|
||||||
|
#include <cmsis_ccs.h>
|
||||||
|
|
||||||
|
|
||||||
|
#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
|
||||||
|
/* TASKING carm specific functions */
|
||||||
|
/*
|
||||||
|
* The CMSIS functions have been implemented as intrinsics in the compiler.
|
||||||
|
* Please use "carm -?i" to get an up to date list of all intrinsics,
|
||||||
|
* Including the CMSIS ones.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#elif defined ( __CSMC__ ) /*------------------ COSMIC Compiler -------------------*/
|
||||||
|
/* Cosmic specific functions */
|
||||||
|
#include <cmsis_csm.h>
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*@} end of CMSIS_Core_RegAccFunctions */
|
||||||
|
|
||||||
|
#endif /* __CORE_CMFUNC_H */
|
||||||
916
DSP_LIB/Include/core_cmInstr.h
Normal file
916
DSP_LIB/Include/core_cmInstr.h
Normal file
@ -0,0 +1,916 @@
|
|||||||
|
/**************************************************************************//**
|
||||||
|
* @file core_cmInstr.h
|
||||||
|
* @brief CMSIS Cortex-M Core Instruction Access Header File
|
||||||
|
* @version V4.10
|
||||||
|
* @date 18. March 2015
|
||||||
|
*
|
||||||
|
* @note
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
/* Copyright (c) 2009 - 2014 ARM LIMITED
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
- Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
- Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
- Neither the name of ARM nor the names of its contributors may be used
|
||||||
|
to endorse or promote products derived from this software without
|
||||||
|
specific prior written permission.
|
||||||
|
*
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __CORE_CMINSTR_H
|
||||||
|
#define __CORE_CMINSTR_H
|
||||||
|
|
||||||
|
|
||||||
|
/* ########################## Core Instruction Access ######################### */
|
||||||
|
/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface
|
||||||
|
Access to dedicated instructions
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
|
||||||
|
/* ARM armcc specific functions */
|
||||||
|
|
||||||
|
#if (__ARMCC_VERSION < 400677)
|
||||||
|
#error "Please use ARM Compiler Toolchain V4.0.677 or later!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief No Operation
|
||||||
|
|
||||||
|
No Operation does nothing. This instruction can be used for code alignment purposes.
|
||||||
|
*/
|
||||||
|
#define __NOP __nop
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Wait For Interrupt
|
||||||
|
|
||||||
|
Wait For Interrupt is a hint instruction that suspends execution
|
||||||
|
until one of a number of events occurs.
|
||||||
|
*/
|
||||||
|
#define __WFI __wfi
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Wait For Event
|
||||||
|
|
||||||
|
Wait For Event is a hint instruction that permits the processor to enter
|
||||||
|
a low-power state until one of a number of events occurs.
|
||||||
|
*/
|
||||||
|
#define __WFE __wfe
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Send Event
|
||||||
|
|
||||||
|
Send Event is a hint instruction. It causes an event to be signaled to the CPU.
|
||||||
|
*/
|
||||||
|
#define __SEV __sev
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Instruction Synchronization Barrier
|
||||||
|
|
||||||
|
Instruction Synchronization Barrier flushes the pipeline in the processor,
|
||||||
|
so that all instructions following the ISB are fetched from cache or
|
||||||
|
memory, after the instruction has been completed.
|
||||||
|
*/
|
||||||
|
#define __ISB() do {\
|
||||||
|
__schedule_barrier();\
|
||||||
|
__isb(0xF);\
|
||||||
|
__schedule_barrier();\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/** \brief Data Synchronization Barrier
|
||||||
|
|
||||||
|
This function acts as a special kind of Data Memory Barrier.
|
||||||
|
It completes when all explicit memory accesses before this instruction complete.
|
||||||
|
*/
|
||||||
|
#define __DSB() do {\
|
||||||
|
__schedule_barrier();\
|
||||||
|
__dsb(0xF);\
|
||||||
|
__schedule_barrier();\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/** \brief Data Memory Barrier
|
||||||
|
|
||||||
|
This function ensures the apparent order of the explicit memory operations before
|
||||||
|
and after the instruction, without ensuring their completion.
|
||||||
|
*/
|
||||||
|
#define __DMB() do {\
|
||||||
|
__schedule_barrier();\
|
||||||
|
__dmb(0xF);\
|
||||||
|
__schedule_barrier();\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/** \brief Reverse byte order (32 bit)
|
||||||
|
|
||||||
|
This function reverses the byte order in integer value.
|
||||||
|
|
||||||
|
\param [in] value Value to reverse
|
||||||
|
\return Reversed value
|
||||||
|
*/
|
||||||
|
#define __REV __rev
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Reverse byte order (16 bit)
|
||||||
|
|
||||||
|
This function reverses the byte order in two unsigned short values.
|
||||||
|
|
||||||
|
\param [in] value Value to reverse
|
||||||
|
\return Reversed value
|
||||||
|
*/
|
||||||
|
#ifndef __NO_EMBEDDED_ASM
|
||||||
|
__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value)
|
||||||
|
{
|
||||||
|
rev16 r0, r0
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** \brief Reverse byte order in signed short value
|
||||||
|
|
||||||
|
This function reverses the byte order in a signed short value with sign extension to integer.
|
||||||
|
|
||||||
|
\param [in] value Value to reverse
|
||||||
|
\return Reversed value
|
||||||
|
*/
|
||||||
|
#ifndef __NO_EMBEDDED_ASM
|
||||||
|
__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(int32_t value)
|
||||||
|
{
|
||||||
|
revsh r0, r0
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Rotate Right in unsigned value (32 bit)
|
||||||
|
|
||||||
|
This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
|
||||||
|
|
||||||
|
\param [in] value Value to rotate
|
||||||
|
\param [in] value Number of Bits to rotate
|
||||||
|
\return Rotated value
|
||||||
|
*/
|
||||||
|
#define __ROR __ror
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Breakpoint
|
||||||
|
|
||||||
|
This function causes the processor to enter Debug state.
|
||||||
|
Debug tools can use this to investigate system state when the instruction at a particular address is reached.
|
||||||
|
|
||||||
|
\param [in] value is ignored by the processor.
|
||||||
|
If required, a debugger can use it to store additional information about the breakpoint.
|
||||||
|
*/
|
||||||
|
#define __BKPT(value) __breakpoint(value)
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Reverse bit order of value
|
||||||
|
|
||||||
|
This function reverses the bit order of the given value.
|
||||||
|
|
||||||
|
\param [in] value Value to reverse
|
||||||
|
\return Reversed value
|
||||||
|
*/
|
||||||
|
#if (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300)
|
||||||
|
#define __RBIT __rbit
|
||||||
|
#else
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
int32_t s = 4 /*sizeof(v)*/ * 8 - 1; // extra shift needed at end
|
||||||
|
|
||||||
|
result = value; // r will be reversed bits of v; first get LSB of v
|
||||||
|
for (value >>= 1; value; value >>= 1)
|
||||||
|
{
|
||||||
|
result <<= 1;
|
||||||
|
result |= value & 1;
|
||||||
|
s--;
|
||||||
|
}
|
||||||
|
result <<= s; // shift when v's highest bits are zero
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Count leading zeros
|
||||||
|
|
||||||
|
This function counts the number of leading zeros of a data value.
|
||||||
|
|
||||||
|
\param [in] value Value to count the leading zeros
|
||||||
|
\return number of leading zeros in value
|
||||||
|
*/
|
||||||
|
#define __CLZ __clz
|
||||||
|
|
||||||
|
|
||||||
|
#if (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300)
|
||||||
|
|
||||||
|
/** \brief LDR Exclusive (8 bit)
|
||||||
|
|
||||||
|
This function executes a exclusive LDR instruction for 8 bit value.
|
||||||
|
|
||||||
|
\param [in] ptr Pointer to data
|
||||||
|
\return value of type uint8_t at (*ptr)
|
||||||
|
*/
|
||||||
|
#define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr))
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief LDR Exclusive (16 bit)
|
||||||
|
|
||||||
|
This function executes a exclusive LDR instruction for 16 bit values.
|
||||||
|
|
||||||
|
\param [in] ptr Pointer to data
|
||||||
|
\return value of type uint16_t at (*ptr)
|
||||||
|
*/
|
||||||
|
#define __LDREXH(ptr) ((uint16_t) __ldrex(ptr))
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief LDR Exclusive (32 bit)
|
||||||
|
|
||||||
|
This function executes a exclusive LDR instruction for 32 bit values.
|
||||||
|
|
||||||
|
\param [in] ptr Pointer to data
|
||||||
|
\return value of type uint32_t at (*ptr)
|
||||||
|
*/
|
||||||
|
#define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr))
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief STR Exclusive (8 bit)
|
||||||
|
|
||||||
|
This function executes a exclusive STR instruction for 8 bit values.
|
||||||
|
|
||||||
|
\param [in] value Value to store
|
||||||
|
\param [in] ptr Pointer to location
|
||||||
|
\return 0 Function succeeded
|
||||||
|
\return 1 Function failed
|
||||||
|
*/
|
||||||
|
#define __STREXB(value, ptr) __strex(value, ptr)
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief STR Exclusive (16 bit)
|
||||||
|
|
||||||
|
This function executes a exclusive STR instruction for 16 bit values.
|
||||||
|
|
||||||
|
\param [in] value Value to store
|
||||||
|
\param [in] ptr Pointer to location
|
||||||
|
\return 0 Function succeeded
|
||||||
|
\return 1 Function failed
|
||||||
|
*/
|
||||||
|
#define __STREXH(value, ptr) __strex(value, ptr)
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief STR Exclusive (32 bit)
|
||||||
|
|
||||||
|
This function executes a exclusive STR instruction for 32 bit values.
|
||||||
|
|
||||||
|
\param [in] value Value to store
|
||||||
|
\param [in] ptr Pointer to location
|
||||||
|
\return 0 Function succeeded
|
||||||
|
\return 1 Function failed
|
||||||
|
*/
|
||||||
|
#define __STREXW(value, ptr) __strex(value, ptr)
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Remove the exclusive lock
|
||||||
|
|
||||||
|
This function removes the exclusive lock which is created by LDREX.
|
||||||
|
|
||||||
|
*/
|
||||||
|
#define __CLREX __clrex
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Signed Saturate
|
||||||
|
|
||||||
|
This function saturates a signed value.
|
||||||
|
|
||||||
|
\param [in] value Value to be saturated
|
||||||
|
\param [in] sat Bit position to saturate to (1..32)
|
||||||
|
\return Saturated value
|
||||||
|
*/
|
||||||
|
#define __SSAT __ssat
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Unsigned Saturate
|
||||||
|
|
||||||
|
This function saturates an unsigned value.
|
||||||
|
|
||||||
|
\param [in] value Value to be saturated
|
||||||
|
\param [in] sat Bit position to saturate to (0..31)
|
||||||
|
\return Saturated value
|
||||||
|
*/
|
||||||
|
#define __USAT __usat
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Rotate Right with Extend (32 bit)
|
||||||
|
|
||||||
|
This function moves each bit of a bitstring right by one bit.
|
||||||
|
The carry input is shifted in at the left end of the bitstring.
|
||||||
|
|
||||||
|
\param [in] value Value to rotate
|
||||||
|
\return Rotated value
|
||||||
|
*/
|
||||||
|
#ifndef __NO_EMBEDDED_ASM
|
||||||
|
__attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value)
|
||||||
|
{
|
||||||
|
rrx r0, r0
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief LDRT Unprivileged (8 bit)
|
||||||
|
|
||||||
|
This function executes a Unprivileged LDRT instruction for 8 bit value.
|
||||||
|
|
||||||
|
\param [in] ptr Pointer to data
|
||||||
|
\return value of type uint8_t at (*ptr)
|
||||||
|
*/
|
||||||
|
#define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr))
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief LDRT Unprivileged (16 bit)
|
||||||
|
|
||||||
|
This function executes a Unprivileged LDRT instruction for 16 bit values.
|
||||||
|
|
||||||
|
\param [in] ptr Pointer to data
|
||||||
|
\return value of type uint16_t at (*ptr)
|
||||||
|
*/
|
||||||
|
#define __LDRHT(ptr) ((uint16_t) __ldrt(ptr))
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief LDRT Unprivileged (32 bit)
|
||||||
|
|
||||||
|
This function executes a Unprivileged LDRT instruction for 32 bit values.
|
||||||
|
|
||||||
|
\param [in] ptr Pointer to data
|
||||||
|
\return value of type uint32_t at (*ptr)
|
||||||
|
*/
|
||||||
|
#define __LDRT(ptr) ((uint32_t ) __ldrt(ptr))
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief STRT Unprivileged (8 bit)
|
||||||
|
|
||||||
|
This function executes a Unprivileged STRT instruction for 8 bit values.
|
||||||
|
|
||||||
|
\param [in] value Value to store
|
||||||
|
\param [in] ptr Pointer to location
|
||||||
|
*/
|
||||||
|
#define __STRBT(value, ptr) __strt(value, ptr)
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief STRT Unprivileged (16 bit)
|
||||||
|
|
||||||
|
This function executes a Unprivileged STRT instruction for 16 bit values.
|
||||||
|
|
||||||
|
\param [in] value Value to store
|
||||||
|
\param [in] ptr Pointer to location
|
||||||
|
*/
|
||||||
|
#define __STRHT(value, ptr) __strt(value, ptr)
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief STRT Unprivileged (32 bit)
|
||||||
|
|
||||||
|
This function executes a Unprivileged STRT instruction for 32 bit values.
|
||||||
|
|
||||||
|
\param [in] value Value to store
|
||||||
|
\param [in] ptr Pointer to location
|
||||||
|
*/
|
||||||
|
#define __STRT(value, ptr) __strt(value, ptr)
|
||||||
|
|
||||||
|
#endif /* (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300) */
|
||||||
|
|
||||||
|
|
||||||
|
#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
|
||||||
|
/* GNU gcc specific functions */
|
||||||
|
|
||||||
|
/* Define macros for porting to both thumb1 and thumb2.
|
||||||
|
* For thumb1, use low register (r0-r7), specified by constrant "l"
|
||||||
|
* Otherwise, use general registers, specified by constrant "r" */
|
||||||
|
#if defined (__thumb__) && !defined (__thumb2__)
|
||||||
|
#define __CMSIS_GCC_OUT_REG(r) "=l" (r)
|
||||||
|
#define __CMSIS_GCC_USE_REG(r) "l" (r)
|
||||||
|
#else
|
||||||
|
#define __CMSIS_GCC_OUT_REG(r) "=r" (r)
|
||||||
|
#define __CMSIS_GCC_USE_REG(r) "r" (r)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** \brief No Operation
|
||||||
|
|
||||||
|
No Operation does nothing. This instruction can be used for code alignment purposes.
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE void __NOP(void)
|
||||||
|
{
|
||||||
|
__ASM volatile ("nop");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Wait For Interrupt
|
||||||
|
|
||||||
|
Wait For Interrupt is a hint instruction that suspends execution
|
||||||
|
until one of a number of events occurs.
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE void __WFI(void)
|
||||||
|
{
|
||||||
|
__ASM volatile ("wfi");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Wait For Event
|
||||||
|
|
||||||
|
Wait For Event is a hint instruction that permits the processor to enter
|
||||||
|
a low-power state until one of a number of events occurs.
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE void __WFE(void)
|
||||||
|
{
|
||||||
|
__ASM volatile ("wfe");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Send Event
|
||||||
|
|
||||||
|
Send Event is a hint instruction. It causes an event to be signaled to the CPU.
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE void __SEV(void)
|
||||||
|
{
|
||||||
|
__ASM volatile ("sev");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Instruction Synchronization Barrier
|
||||||
|
|
||||||
|
Instruction Synchronization Barrier flushes the pipeline in the processor,
|
||||||
|
so that all instructions following the ISB are fetched from cache or
|
||||||
|
memory, after the instruction has been completed.
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE void __ISB(void)
|
||||||
|
{
|
||||||
|
__ASM volatile ("isb 0xF":::"memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Data Synchronization Barrier
|
||||||
|
|
||||||
|
This function acts as a special kind of Data Memory Barrier.
|
||||||
|
It completes when all explicit memory accesses before this instruction complete.
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE void __DSB(void)
|
||||||
|
{
|
||||||
|
__ASM volatile ("dsb 0xF":::"memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Data Memory Barrier
|
||||||
|
|
||||||
|
This function ensures the apparent order of the explicit memory operations before
|
||||||
|
and after the instruction, without ensuring their completion.
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE void __DMB(void)
|
||||||
|
{
|
||||||
|
__ASM volatile ("dmb 0xF":::"memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Reverse byte order (32 bit)
|
||||||
|
|
||||||
|
This function reverses the byte order in integer value.
|
||||||
|
|
||||||
|
\param [in] value Value to reverse
|
||||||
|
\return Reversed value
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE uint32_t __REV(uint32_t value)
|
||||||
|
{
|
||||||
|
#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
|
||||||
|
return __builtin_bswap32(value);
|
||||||
|
#else
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
|
||||||
|
return(result);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Reverse byte order (16 bit)
|
||||||
|
|
||||||
|
This function reverses the byte order in two unsigned short values.
|
||||||
|
|
||||||
|
\param [in] value Value to reverse
|
||||||
|
\return Reversed value
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE uint32_t __REV16(uint32_t value)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Reverse byte order in signed short value
|
||||||
|
|
||||||
|
This function reverses the byte order in a signed short value with sign extension to integer.
|
||||||
|
|
||||||
|
\param [in] value Value to reverse
|
||||||
|
\return Reversed value
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE int32_t __REVSH(int32_t value)
|
||||||
|
{
|
||||||
|
#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
|
||||||
|
return (short)__builtin_bswap16(value);
|
||||||
|
#else
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
|
||||||
|
return(result);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Rotate Right in unsigned value (32 bit)
|
||||||
|
|
||||||
|
This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
|
||||||
|
|
||||||
|
\param [in] value Value to rotate
|
||||||
|
\param [in] value Number of Bits to rotate
|
||||||
|
\return Rotated value
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
return (op1 >> op2) | (op1 << (32 - op2));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Breakpoint
|
||||||
|
|
||||||
|
This function causes the processor to enter Debug state.
|
||||||
|
Debug tools can use this to investigate system state when the instruction at a particular address is reached.
|
||||||
|
|
||||||
|
\param [in] value is ignored by the processor.
|
||||||
|
If required, a debugger can use it to store additional information about the breakpoint.
|
||||||
|
*/
|
||||||
|
#define __BKPT(value) __ASM volatile ("bkpt "#value)
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Reverse bit order of value
|
||||||
|
|
||||||
|
This function reverses the bit order of the given value.
|
||||||
|
|
||||||
|
\param [in] value Value to reverse
|
||||||
|
\return Reversed value
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
#if (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300)
|
||||||
|
__ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) );
|
||||||
|
#else
|
||||||
|
int32_t s = 4 /*sizeof(v)*/ * 8 - 1; // extra shift needed at end
|
||||||
|
|
||||||
|
result = value; // r will be reversed bits of v; first get LSB of v
|
||||||
|
for (value >>= 1; value; value >>= 1)
|
||||||
|
{
|
||||||
|
result <<= 1;
|
||||||
|
result |= value & 1;
|
||||||
|
s--;
|
||||||
|
}
|
||||||
|
result <<= s; // shift when v's highest bits are zero
|
||||||
|
#endif
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Count leading zeros
|
||||||
|
|
||||||
|
This function counts the number of leading zeros of a data value.
|
||||||
|
|
||||||
|
\param [in] value Value to count the leading zeros
|
||||||
|
\return number of leading zeros in value
|
||||||
|
*/
|
||||||
|
#define __CLZ __builtin_clz
|
||||||
|
|
||||||
|
|
||||||
|
#if (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300)
|
||||||
|
|
||||||
|
/** \brief LDR Exclusive (8 bit)
|
||||||
|
|
||||||
|
This function executes a exclusive LDR instruction for 8 bit value.
|
||||||
|
|
||||||
|
\param [in] ptr Pointer to data
|
||||||
|
\return value of type uint8_t at (*ptr)
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDREXB(volatile uint8_t *addr)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
|
||||||
|
__ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) );
|
||||||
|
#else
|
||||||
|
/* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
|
||||||
|
accepted by assembler. So has to use following less efficient pattern.
|
||||||
|
*/
|
||||||
|
__ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
|
||||||
|
#endif
|
||||||
|
return ((uint8_t) result); /* Add explicit type cast here */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief LDR Exclusive (16 bit)
|
||||||
|
|
||||||
|
This function executes a exclusive LDR instruction for 16 bit values.
|
||||||
|
|
||||||
|
\param [in] ptr Pointer to data
|
||||||
|
\return value of type uint16_t at (*ptr)
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDREXH(volatile uint16_t *addr)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
|
||||||
|
__ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) );
|
||||||
|
#else
|
||||||
|
/* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
|
||||||
|
accepted by assembler. So has to use following less efficient pattern.
|
||||||
|
*/
|
||||||
|
__ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
|
||||||
|
#endif
|
||||||
|
return ((uint16_t) result); /* Add explicit type cast here */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief LDR Exclusive (32 bit)
|
||||||
|
|
||||||
|
This function executes a exclusive LDR instruction for 32 bit values.
|
||||||
|
|
||||||
|
\param [in] ptr Pointer to data
|
||||||
|
\return value of type uint32_t at (*ptr)
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDREXW(volatile uint32_t *addr)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief STR Exclusive (8 bit)
|
||||||
|
|
||||||
|
This function executes a exclusive STR instruction for 8 bit values.
|
||||||
|
|
||||||
|
\param [in] value Value to store
|
||||||
|
\param [in] ptr Pointer to location
|
||||||
|
\return 0 Function succeeded
|
||||||
|
\return 1 Function failed
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief STR Exclusive (16 bit)
|
||||||
|
|
||||||
|
This function executes a exclusive STR instruction for 16 bit values.
|
||||||
|
|
||||||
|
\param [in] value Value to store
|
||||||
|
\param [in] ptr Pointer to location
|
||||||
|
\return 0 Function succeeded
|
||||||
|
\return 1 Function failed
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief STR Exclusive (32 bit)
|
||||||
|
|
||||||
|
This function executes a exclusive STR instruction for 32 bit values.
|
||||||
|
|
||||||
|
\param [in] value Value to store
|
||||||
|
\param [in] ptr Pointer to location
|
||||||
|
\return 0 Function succeeded
|
||||||
|
\return 1 Function failed
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Remove the exclusive lock
|
||||||
|
|
||||||
|
This function removes the exclusive lock which is created by LDREX.
|
||||||
|
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE void __CLREX(void)
|
||||||
|
{
|
||||||
|
__ASM volatile ("clrex" ::: "memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Signed Saturate
|
||||||
|
|
||||||
|
This function saturates a signed value.
|
||||||
|
|
||||||
|
\param [in] value Value to be saturated
|
||||||
|
\param [in] sat Bit position to saturate to (1..32)
|
||||||
|
\return Saturated value
|
||||||
|
*/
|
||||||
|
#define __SSAT(ARG1,ARG2) \
|
||||||
|
({ \
|
||||||
|
uint32_t __RES, __ARG1 = (ARG1); \
|
||||||
|
__ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
|
||||||
|
__RES; \
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Unsigned Saturate
|
||||||
|
|
||||||
|
This function saturates an unsigned value.
|
||||||
|
|
||||||
|
\param [in] value Value to be saturated
|
||||||
|
\param [in] sat Bit position to saturate to (0..31)
|
||||||
|
\return Saturated value
|
||||||
|
*/
|
||||||
|
#define __USAT(ARG1,ARG2) \
|
||||||
|
({ \
|
||||||
|
uint32_t __RES, __ARG1 = (ARG1); \
|
||||||
|
__ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
|
||||||
|
__RES; \
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Rotate Right with Extend (32 bit)
|
||||||
|
|
||||||
|
This function moves each bit of a bitstring right by one bit.
|
||||||
|
The carry input is shifted in at the left end of the bitstring.
|
||||||
|
|
||||||
|
\param [in] value Value to rotate
|
||||||
|
\return Rotated value
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE uint32_t __RRX(uint32_t value)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief LDRT Unprivileged (8 bit)
|
||||||
|
|
||||||
|
This function executes a Unprivileged LDRT instruction for 8 bit value.
|
||||||
|
|
||||||
|
\param [in] ptr Pointer to data
|
||||||
|
\return value of type uint8_t at (*ptr)
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDRBT(volatile uint8_t *addr)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
|
||||||
|
__ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*addr) );
|
||||||
|
#else
|
||||||
|
/* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
|
||||||
|
accepted by assembler. So has to use following less efficient pattern.
|
||||||
|
*/
|
||||||
|
__ASM volatile ("ldrbt %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
|
||||||
|
#endif
|
||||||
|
return ((uint8_t) result); /* Add explicit type cast here */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief LDRT Unprivileged (16 bit)
|
||||||
|
|
||||||
|
This function executes a Unprivileged LDRT instruction for 16 bit values.
|
||||||
|
|
||||||
|
\param [in] ptr Pointer to data
|
||||||
|
\return value of type uint16_t at (*ptr)
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDRHT(volatile uint16_t *addr)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
|
||||||
|
__ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*addr) );
|
||||||
|
#else
|
||||||
|
/* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
|
||||||
|
accepted by assembler. So has to use following less efficient pattern.
|
||||||
|
*/
|
||||||
|
__ASM volatile ("ldrht %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
|
||||||
|
#endif
|
||||||
|
return ((uint16_t) result); /* Add explicit type cast here */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief LDRT Unprivileged (32 bit)
|
||||||
|
|
||||||
|
This function executes a Unprivileged LDRT instruction for 32 bit values.
|
||||||
|
|
||||||
|
\param [in] ptr Pointer to data
|
||||||
|
\return value of type uint32_t at (*ptr)
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDRT(volatile uint32_t *addr)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*addr) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief STRT Unprivileged (8 bit)
|
||||||
|
|
||||||
|
This function executes a Unprivileged STRT instruction for 8 bit values.
|
||||||
|
|
||||||
|
\param [in] value Value to store
|
||||||
|
\param [in] ptr Pointer to location
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE void __STRBT(uint8_t value, volatile uint8_t *addr)
|
||||||
|
{
|
||||||
|
__ASM volatile ("strbt %1, %0" : "=Q" (*addr) : "r" ((uint32_t)value) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief STRT Unprivileged (16 bit)
|
||||||
|
|
||||||
|
This function executes a Unprivileged STRT instruction for 16 bit values.
|
||||||
|
|
||||||
|
\param [in] value Value to store
|
||||||
|
\param [in] ptr Pointer to location
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE void __STRHT(uint16_t value, volatile uint16_t *addr)
|
||||||
|
{
|
||||||
|
__ASM volatile ("strht %1, %0" : "=Q" (*addr) : "r" ((uint32_t)value) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief STRT Unprivileged (32 bit)
|
||||||
|
|
||||||
|
This function executes a Unprivileged STRT instruction for 32 bit values.
|
||||||
|
|
||||||
|
\param [in] value Value to store
|
||||||
|
\param [in] ptr Pointer to location
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE void __STRT(uint32_t value, volatile uint32_t *addr)
|
||||||
|
{
|
||||||
|
__ASM volatile ("strt %1, %0" : "=Q" (*addr) : "r" (value) );
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300) */
|
||||||
|
|
||||||
|
|
||||||
|
#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
|
||||||
|
/* IAR iccarm specific functions */
|
||||||
|
#include <cmsis_iar.h>
|
||||||
|
|
||||||
|
|
||||||
|
#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/
|
||||||
|
/* TI CCS specific functions */
|
||||||
|
#include <cmsis_ccs.h>
|
||||||
|
|
||||||
|
|
||||||
|
#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
|
||||||
|
/* TASKING carm specific functions */
|
||||||
|
/*
|
||||||
|
* The CMSIS functions have been implemented as intrinsics in the compiler.
|
||||||
|
* Please use "carm -?i" to get an up to date list of all intrinsics,
|
||||||
|
* Including the CMSIS ones.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#elif defined ( __CSMC__ ) /*------------------ COSMIC Compiler -------------------*/
|
||||||
|
/* Cosmic specific functions */
|
||||||
|
#include <cmsis_csm.h>
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*@}*/ /* end of group CMSIS_Core_InstructionInterface */
|
||||||
|
|
||||||
|
#endif /* __CORE_CMINSTR_H */
|
||||||
697
DSP_LIB/Include/core_cmSimd.h
Normal file
697
DSP_LIB/Include/core_cmSimd.h
Normal file
@ -0,0 +1,697 @@
|
|||||||
|
/**************************************************************************//**
|
||||||
|
* @file core_cmSimd.h
|
||||||
|
* @brief CMSIS Cortex-M SIMD Header File
|
||||||
|
* @version V4.10
|
||||||
|
* @date 18. March 2015
|
||||||
|
*
|
||||||
|
* @note
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
/* Copyright (c) 2009 - 2014 ARM LIMITED
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
- Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
- Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
- Neither the name of ARM nor the names of its contributors may be used
|
||||||
|
to endorse or promote products derived from this software without
|
||||||
|
specific prior written permission.
|
||||||
|
*
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
#if defined ( __ICCARM__ )
|
||||||
|
#pragma system_include /* treat file as system include file for MISRA check */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __CORE_CMSIMD_H
|
||||||
|
#define __CORE_CMSIMD_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Hardware Abstraction Layer
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
/* ################### Compiler specific Intrinsics ########################### */
|
||||||
|
/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics
|
||||||
|
Access to dedicated SIMD instructions
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
|
||||||
|
/* ARM armcc specific functions */
|
||||||
|
#define __SADD8 __sadd8
|
||||||
|
#define __QADD8 __qadd8
|
||||||
|
#define __SHADD8 __shadd8
|
||||||
|
#define __UADD8 __uadd8
|
||||||
|
#define __UQADD8 __uqadd8
|
||||||
|
#define __UHADD8 __uhadd8
|
||||||
|
#define __SSUB8 __ssub8
|
||||||
|
#define __QSUB8 __qsub8
|
||||||
|
#define __SHSUB8 __shsub8
|
||||||
|
#define __USUB8 __usub8
|
||||||
|
#define __UQSUB8 __uqsub8
|
||||||
|
#define __UHSUB8 __uhsub8
|
||||||
|
#define __SADD16 __sadd16
|
||||||
|
#define __QADD16 __qadd16
|
||||||
|
#define __SHADD16 __shadd16
|
||||||
|
#define __UADD16 __uadd16
|
||||||
|
#define __UQADD16 __uqadd16
|
||||||
|
#define __UHADD16 __uhadd16
|
||||||
|
#define __SSUB16 __ssub16
|
||||||
|
#define __QSUB16 __qsub16
|
||||||
|
#define __SHSUB16 __shsub16
|
||||||
|
#define __USUB16 __usub16
|
||||||
|
#define __UQSUB16 __uqsub16
|
||||||
|
#define __UHSUB16 __uhsub16
|
||||||
|
#define __SASX __sasx
|
||||||
|
#define __QASX __qasx
|
||||||
|
#define __SHASX __shasx
|
||||||
|
#define __UASX __uasx
|
||||||
|
#define __UQASX __uqasx
|
||||||
|
#define __UHASX __uhasx
|
||||||
|
#define __SSAX __ssax
|
||||||
|
#define __QSAX __qsax
|
||||||
|
#define __SHSAX __shsax
|
||||||
|
#define __USAX __usax
|
||||||
|
#define __UQSAX __uqsax
|
||||||
|
#define __UHSAX __uhsax
|
||||||
|
#define __USAD8 __usad8
|
||||||
|
#define __USADA8 __usada8
|
||||||
|
#define __SSAT16 __ssat16
|
||||||
|
#define __USAT16 __usat16
|
||||||
|
#define __UXTB16 __uxtb16
|
||||||
|
#define __UXTAB16 __uxtab16
|
||||||
|
#define __SXTB16 __sxtb16
|
||||||
|
#define __SXTAB16 __sxtab16
|
||||||
|
#define __SMUAD __smuad
|
||||||
|
#define __SMUADX __smuadx
|
||||||
|
#define __SMLAD __smlad
|
||||||
|
#define __SMLADX __smladx
|
||||||
|
#define __SMLALD __smlald
|
||||||
|
#define __SMLALDX __smlaldx
|
||||||
|
#define __SMUSD __smusd
|
||||||
|
#define __SMUSDX __smusdx
|
||||||
|
#define __SMLSD __smlsd
|
||||||
|
#define __SMLSDX __smlsdx
|
||||||
|
#define __SMLSLD __smlsld
|
||||||
|
#define __SMLSLDX __smlsldx
|
||||||
|
#define __SEL __sel
|
||||||
|
#define __QADD __qadd
|
||||||
|
#define __QSUB __qsub
|
||||||
|
|
||||||
|
#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \
|
||||||
|
((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) )
|
||||||
|
|
||||||
|
#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \
|
||||||
|
((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) )
|
||||||
|
|
||||||
|
#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \
|
||||||
|
((int64_t)(ARG3) << 32) ) >> 32))
|
||||||
|
|
||||||
|
|
||||||
|
#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
|
||||||
|
/* GNU gcc specific functions */
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SADD8(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD8(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UADD8(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USUB8(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SADD16(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD16(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UADD16(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USUB16(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SASX(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QASX(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHASX(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UASX(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQASX(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHASX(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSAX(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSAX(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USAX(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USAD8(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define __SSAT16(ARG1,ARG2) \
|
||||||
|
({ \
|
||||||
|
uint32_t __RES, __ARG1 = (ARG1); \
|
||||||
|
__ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
|
||||||
|
__RES; \
|
||||||
|
})
|
||||||
|
|
||||||
|
#define __USAT16(ARG1,ARG2) \
|
||||||
|
({ \
|
||||||
|
uint32_t __RES, __ARG1 = (ARG1); \
|
||||||
|
__ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
|
||||||
|
__RES; \
|
||||||
|
})
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UXTB16(uint32_t op1)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1));
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SXTB16(uint32_t op1)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1));
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc)
|
||||||
|
{
|
||||||
|
union llreg_u{
|
||||||
|
uint32_t w32[2];
|
||||||
|
uint64_t w64;
|
||||||
|
} llr;
|
||||||
|
llr.w64 = acc;
|
||||||
|
|
||||||
|
#ifndef __ARMEB__ // Little endian
|
||||||
|
__ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) );
|
||||||
|
#else // Big endian
|
||||||
|
__ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return(llr.w64);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc)
|
||||||
|
{
|
||||||
|
union llreg_u{
|
||||||
|
uint32_t w32[2];
|
||||||
|
uint64_t w64;
|
||||||
|
} llr;
|
||||||
|
llr.w64 = acc;
|
||||||
|
|
||||||
|
#ifndef __ARMEB__ // Little endian
|
||||||
|
__ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) );
|
||||||
|
#else // Big endian
|
||||||
|
__ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return(llr.w64);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc)
|
||||||
|
{
|
||||||
|
union llreg_u{
|
||||||
|
uint32_t w32[2];
|
||||||
|
uint64_t w64;
|
||||||
|
} llr;
|
||||||
|
llr.w64 = acc;
|
||||||
|
|
||||||
|
#ifndef __ARMEB__ // Little endian
|
||||||
|
__ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) );
|
||||||
|
#else // Big endian
|
||||||
|
__ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return(llr.w64);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc)
|
||||||
|
{
|
||||||
|
union llreg_u{
|
||||||
|
uint32_t w32[2];
|
||||||
|
uint64_t w64;
|
||||||
|
} llr;
|
||||||
|
llr.w64 = acc;
|
||||||
|
|
||||||
|
#ifndef __ARMEB__ // Little endian
|
||||||
|
__ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) );
|
||||||
|
#else // Big endian
|
||||||
|
__ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return(llr.w64);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SEL (uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define __PKHBT(ARG1,ARG2,ARG3) \
|
||||||
|
({ \
|
||||||
|
uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \
|
||||||
|
__ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \
|
||||||
|
__RES; \
|
||||||
|
})
|
||||||
|
|
||||||
|
#define __PKHTB(ARG1,ARG2,ARG3) \
|
||||||
|
({ \
|
||||||
|
uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \
|
||||||
|
if (ARG3 == 0) \
|
||||||
|
__ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \
|
||||||
|
else \
|
||||||
|
__ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \
|
||||||
|
__RES; \
|
||||||
|
})
|
||||||
|
|
||||||
|
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3)
|
||||||
|
{
|
||||||
|
int32_t result;
|
||||||
|
|
||||||
|
__ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) );
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
|
||||||
|
/* IAR iccarm specific functions */
|
||||||
|
#include <cmsis_iar.h>
|
||||||
|
|
||||||
|
|
||||||
|
#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/
|
||||||
|
/* TI CCS specific functions */
|
||||||
|
#include <cmsis_ccs.h>
|
||||||
|
|
||||||
|
|
||||||
|
#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
|
||||||
|
/* TASKING carm specific functions */
|
||||||
|
/* not yet supported */
|
||||||
|
|
||||||
|
|
||||||
|
#elif defined ( __CSMC__ ) /*------------------ COSMIC Compiler -------------------*/
|
||||||
|
/* Cosmic specific functions */
|
||||||
|
#include <cmsis_csm.h>
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_SIMD_intrinsics */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __CORE_CMSIMD_H */
|
||||||
864
DSP_LIB/Include/core_sc000.h
Normal file
864
DSP_LIB/Include/core_sc000.h
Normal file
@ -0,0 +1,864 @@
|
|||||||
|
/**************************************************************************//**
|
||||||
|
* @file core_sc000.h
|
||||||
|
* @brief CMSIS SC000 Core Peripheral Access Layer Header File
|
||||||
|
* @version V4.10
|
||||||
|
* @date 18. March 2015
|
||||||
|
*
|
||||||
|
* @note
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
/* Copyright (c) 2009 - 2015 ARM LIMITED
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
- Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
- Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
- Neither the name of ARM nor the names of its contributors may be used
|
||||||
|
to endorse or promote products derived from this software without
|
||||||
|
specific prior written permission.
|
||||||
|
*
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
#if defined ( __ICCARM__ )
|
||||||
|
#pragma system_include /* treat file as system include file for MISRA check */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __CORE_SC000_H_GENERIC
|
||||||
|
#define __CORE_SC000_H_GENERIC
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions
|
||||||
|
CMSIS violates the following MISRA-C:2004 rules:
|
||||||
|
|
||||||
|
\li Required Rule 8.5, object/function definition in header file.<br>
|
||||||
|
Function definitions in header files are used to allow 'inlining'.
|
||||||
|
|
||||||
|
\li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br>
|
||||||
|
Unions are used for effective representation of core registers.
|
||||||
|
|
||||||
|
\li Advisory Rule 19.7, Function-like macro defined.<br>
|
||||||
|
Function-like macros are used to allow more efficient code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* CMSIS definitions
|
||||||
|
******************************************************************************/
|
||||||
|
/** \ingroup SC000
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* CMSIS SC000 definitions */
|
||||||
|
#define __SC000_CMSIS_VERSION_MAIN (0x04) /*!< [31:16] CMSIS HAL main version */
|
||||||
|
#define __SC000_CMSIS_VERSION_SUB (0x00) /*!< [15:0] CMSIS HAL sub version */
|
||||||
|
#define __SC000_CMSIS_VERSION ((__SC000_CMSIS_VERSION_MAIN << 16) | \
|
||||||
|
__SC000_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */
|
||||||
|
|
||||||
|
#define __CORTEX_SC (000) /*!< Cortex secure core */
|
||||||
|
|
||||||
|
|
||||||
|
#if defined ( __CC_ARM )
|
||||||
|
#define __ASM __asm /*!< asm keyword for ARM Compiler */
|
||||||
|
#define __INLINE __inline /*!< inline keyword for ARM Compiler */
|
||||||
|
#define __STATIC_INLINE static __inline
|
||||||
|
|
||||||
|
#elif defined ( __GNUC__ )
|
||||||
|
#define __ASM __asm /*!< asm keyword for GNU Compiler */
|
||||||
|
#define __INLINE inline /*!< inline keyword for GNU Compiler */
|
||||||
|
#define __STATIC_INLINE static inline
|
||||||
|
|
||||||
|
#elif defined ( __ICCARM__ )
|
||||||
|
#define __ASM __asm /*!< asm keyword for IAR Compiler */
|
||||||
|
#define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */
|
||||||
|
#define __STATIC_INLINE static inline
|
||||||
|
|
||||||
|
#elif defined ( __TMS470__ )
|
||||||
|
#define __ASM __asm /*!< asm keyword for TI CCS Compiler */
|
||||||
|
#define __STATIC_INLINE static inline
|
||||||
|
|
||||||
|
#elif defined ( __TASKING__ )
|
||||||
|
#define __ASM __asm /*!< asm keyword for TASKING Compiler */
|
||||||
|
#define __INLINE inline /*!< inline keyword for TASKING Compiler */
|
||||||
|
#define __STATIC_INLINE static inline
|
||||||
|
|
||||||
|
#elif defined ( __CSMC__ )
|
||||||
|
#define __packed
|
||||||
|
#define __ASM _asm /*!< asm keyword for COSMIC Compiler */
|
||||||
|
#define __INLINE inline /*use -pc99 on compile line !< inline keyword for COSMIC Compiler */
|
||||||
|
#define __STATIC_INLINE static inline
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** __FPU_USED indicates whether an FPU is used or not.
|
||||||
|
This core does not support an FPU at all
|
||||||
|
*/
|
||||||
|
#define __FPU_USED 0
|
||||||
|
|
||||||
|
#if defined ( __CC_ARM )
|
||||||
|
#if defined __TARGET_FPU_VFP
|
||||||
|
#warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __GNUC__ )
|
||||||
|
#if defined (__VFP_FP__) && !defined(__SOFTFP__)
|
||||||
|
#warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __ICCARM__ )
|
||||||
|
#if defined __ARMVFP__
|
||||||
|
#warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __TMS470__ )
|
||||||
|
#if defined __TI__VFP_SUPPORT____
|
||||||
|
#warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __TASKING__ )
|
||||||
|
#if defined __FPU_VFP__
|
||||||
|
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __CSMC__ ) /* Cosmic */
|
||||||
|
#if ( __CSMC__ & 0x400) // FPU present for parser
|
||||||
|
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdint.h> /* standard types definitions */
|
||||||
|
#include <core_cmInstr.h> /* Core Instruction Access */
|
||||||
|
#include <core_cmFunc.h> /* Core Function Access */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __CORE_SC000_H_GENERIC */
|
||||||
|
|
||||||
|
#ifndef __CMSIS_GENERIC
|
||||||
|
|
||||||
|
#ifndef __CORE_SC000_H_DEPENDANT
|
||||||
|
#define __CORE_SC000_H_DEPENDANT
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* check device defines and use defaults */
|
||||||
|
#if defined __CHECK_DEVICE_DEFINES
|
||||||
|
#ifndef __SC000_REV
|
||||||
|
#define __SC000_REV 0x0000
|
||||||
|
#warning "__SC000_REV not defined in device header file; using default!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __MPU_PRESENT
|
||||||
|
#define __MPU_PRESENT 0
|
||||||
|
#warning "__MPU_PRESENT not defined in device header file; using default!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __NVIC_PRIO_BITS
|
||||||
|
#define __NVIC_PRIO_BITS 2
|
||||||
|
#warning "__NVIC_PRIO_BITS not defined in device header file; using default!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __Vendor_SysTickConfig
|
||||||
|
#define __Vendor_SysTickConfig 0
|
||||||
|
#warning "__Vendor_SysTickConfig not defined in device header file; using default!"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* IO definitions (access restrictions to peripheral registers) */
|
||||||
|
/**
|
||||||
|
\defgroup CMSIS_glob_defs CMSIS Global Defines
|
||||||
|
|
||||||
|
<strong>IO Type Qualifiers</strong> are used
|
||||||
|
\li to specify the access to peripheral variables.
|
||||||
|
\li for automatic generation of peripheral register debug information.
|
||||||
|
*/
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#define __I volatile /*!< Defines 'read only' permissions */
|
||||||
|
#else
|
||||||
|
#define __I volatile const /*!< Defines 'read only' permissions */
|
||||||
|
#endif
|
||||||
|
#define __O volatile /*!< Defines 'write only' permissions */
|
||||||
|
#define __IO volatile /*!< Defines 'read / write' permissions */
|
||||||
|
|
||||||
|
/*@} end of group SC000 */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Register Abstraction
|
||||||
|
Core Register contain:
|
||||||
|
- Core Register
|
||||||
|
- Core NVIC Register
|
||||||
|
- Core SCB Register
|
||||||
|
- Core SysTick Register
|
||||||
|
- Core MPU Register
|
||||||
|
******************************************************************************/
|
||||||
|
/** \defgroup CMSIS_core_register Defines and Type Definitions
|
||||||
|
\brief Type definitions and defines for Cortex-M processor based devices.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_CORE Status and Control Registers
|
||||||
|
\brief Core Register type definitions.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \brief Union type to access the Application Program Status Register (APSR).
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */
|
||||||
|
uint32_t V:1; /*!< bit: 28 Overflow condition code flag */
|
||||||
|
uint32_t C:1; /*!< bit: 29 Carry condition code flag */
|
||||||
|
uint32_t Z:1; /*!< bit: 30 Zero condition code flag */
|
||||||
|
uint32_t N:1; /*!< bit: 31 Negative condition code flag */
|
||||||
|
} b; /*!< Structure used for bit access */
|
||||||
|
uint32_t w; /*!< Type used for word access */
|
||||||
|
} APSR_Type;
|
||||||
|
|
||||||
|
/* APSR Register Definitions */
|
||||||
|
#define APSR_N_Pos 31 /*!< APSR: N Position */
|
||||||
|
#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */
|
||||||
|
|
||||||
|
#define APSR_Z_Pos 30 /*!< APSR: Z Position */
|
||||||
|
#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */
|
||||||
|
|
||||||
|
#define APSR_C_Pos 29 /*!< APSR: C Position */
|
||||||
|
#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */
|
||||||
|
|
||||||
|
#define APSR_V_Pos 28 /*!< APSR: V Position */
|
||||||
|
#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Union type to access the Interrupt Program Status Register (IPSR).
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */
|
||||||
|
uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */
|
||||||
|
} b; /*!< Structure used for bit access */
|
||||||
|
uint32_t w; /*!< Type used for word access */
|
||||||
|
} IPSR_Type;
|
||||||
|
|
||||||
|
/* IPSR Register Definitions */
|
||||||
|
#define IPSR_ISR_Pos 0 /*!< IPSR: ISR Position */
|
||||||
|
#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR).
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */
|
||||||
|
uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */
|
||||||
|
uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */
|
||||||
|
uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */
|
||||||
|
uint32_t V:1; /*!< bit: 28 Overflow condition code flag */
|
||||||
|
uint32_t C:1; /*!< bit: 29 Carry condition code flag */
|
||||||
|
uint32_t Z:1; /*!< bit: 30 Zero condition code flag */
|
||||||
|
uint32_t N:1; /*!< bit: 31 Negative condition code flag */
|
||||||
|
} b; /*!< Structure used for bit access */
|
||||||
|
uint32_t w; /*!< Type used for word access */
|
||||||
|
} xPSR_Type;
|
||||||
|
|
||||||
|
/* xPSR Register Definitions */
|
||||||
|
#define xPSR_N_Pos 31 /*!< xPSR: N Position */
|
||||||
|
#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */
|
||||||
|
|
||||||
|
#define xPSR_Z_Pos 30 /*!< xPSR: Z Position */
|
||||||
|
#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */
|
||||||
|
|
||||||
|
#define xPSR_C_Pos 29 /*!< xPSR: C Position */
|
||||||
|
#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */
|
||||||
|
|
||||||
|
#define xPSR_V_Pos 28 /*!< xPSR: V Position */
|
||||||
|
#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */
|
||||||
|
|
||||||
|
#define xPSR_T_Pos 24 /*!< xPSR: T Position */
|
||||||
|
#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */
|
||||||
|
|
||||||
|
#define xPSR_ISR_Pos 0 /*!< xPSR: ISR Position */
|
||||||
|
#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Union type to access the Control Registers (CONTROL).
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t _reserved0:1; /*!< bit: 0 Reserved */
|
||||||
|
uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */
|
||||||
|
uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */
|
||||||
|
} b; /*!< Structure used for bit access */
|
||||||
|
uint32_t w; /*!< Type used for word access */
|
||||||
|
} CONTROL_Type;
|
||||||
|
|
||||||
|
/* CONTROL Register Definitions */
|
||||||
|
#define CONTROL_SPSEL_Pos 1 /*!< CONTROL: SPSEL Position */
|
||||||
|
#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_CORE */
|
||||||
|
|
||||||
|
|
||||||
|
/** \ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC)
|
||||||
|
\brief Type definitions for the NVIC Registers
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC).
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__IO uint32_t ISER[1]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */
|
||||||
|
uint32_t RESERVED0[31];
|
||||||
|
__IO uint32_t ICER[1]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */
|
||||||
|
uint32_t RSERVED1[31];
|
||||||
|
__IO uint32_t ISPR[1]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */
|
||||||
|
uint32_t RESERVED2[31];
|
||||||
|
__IO uint32_t ICPR[1]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */
|
||||||
|
uint32_t RESERVED3[31];
|
||||||
|
uint32_t RESERVED4[64];
|
||||||
|
__IO uint32_t IP[8]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */
|
||||||
|
} NVIC_Type;
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_NVIC */
|
||||||
|
|
||||||
|
|
||||||
|
/** \ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_SCB System Control Block (SCB)
|
||||||
|
\brief Type definitions for the System Control Block Registers
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \brief Structure type to access the System Control Block (SCB).
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */
|
||||||
|
__IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */
|
||||||
|
__IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */
|
||||||
|
__IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */
|
||||||
|
__IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */
|
||||||
|
__IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */
|
||||||
|
uint32_t RESERVED0[1];
|
||||||
|
__IO uint32_t SHP[2]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */
|
||||||
|
__IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */
|
||||||
|
uint32_t RESERVED1[154];
|
||||||
|
__IO uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features Control Register */
|
||||||
|
} SCB_Type;
|
||||||
|
|
||||||
|
/* SCB CPUID Register Definitions */
|
||||||
|
#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */
|
||||||
|
#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */
|
||||||
|
|
||||||
|
#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */
|
||||||
|
#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */
|
||||||
|
|
||||||
|
#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */
|
||||||
|
#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */
|
||||||
|
|
||||||
|
#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */
|
||||||
|
#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */
|
||||||
|
|
||||||
|
#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */
|
||||||
|
#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */
|
||||||
|
|
||||||
|
/* SCB Interrupt Control State Register Definitions */
|
||||||
|
#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */
|
||||||
|
#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */
|
||||||
|
#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */
|
||||||
|
#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */
|
||||||
|
#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */
|
||||||
|
#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */
|
||||||
|
#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */
|
||||||
|
#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */
|
||||||
|
#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */
|
||||||
|
#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */
|
||||||
|
|
||||||
|
/* SCB Interrupt Control State Register Definitions */
|
||||||
|
#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */
|
||||||
|
#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */
|
||||||
|
|
||||||
|
/* SCB Application Interrupt and Reset Control Register Definitions */
|
||||||
|
#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */
|
||||||
|
#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */
|
||||||
|
|
||||||
|
#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */
|
||||||
|
#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */
|
||||||
|
|
||||||
|
#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */
|
||||||
|
#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */
|
||||||
|
|
||||||
|
#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */
|
||||||
|
#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */
|
||||||
|
|
||||||
|
#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */
|
||||||
|
#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */
|
||||||
|
|
||||||
|
/* SCB System Control Register Definitions */
|
||||||
|
#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */
|
||||||
|
#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */
|
||||||
|
|
||||||
|
#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */
|
||||||
|
#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */
|
||||||
|
|
||||||
|
#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */
|
||||||
|
#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */
|
||||||
|
|
||||||
|
/* SCB Configuration Control Register Definitions */
|
||||||
|
#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */
|
||||||
|
#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */
|
||||||
|
|
||||||
|
#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */
|
||||||
|
#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */
|
||||||
|
|
||||||
|
/* SCB System Handler Control and State Register Definitions */
|
||||||
|
#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */
|
||||||
|
#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_SCB */
|
||||||
|
|
||||||
|
|
||||||
|
/** \ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB)
|
||||||
|
\brief Type definitions for the System Control and ID Register not in the SCB
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \brief Structure type to access the System Control and ID Register not in the SCB.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t RESERVED0[2];
|
||||||
|
__IO uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */
|
||||||
|
} SCnSCB_Type;
|
||||||
|
|
||||||
|
/* Auxiliary Control Register Definitions */
|
||||||
|
#define SCnSCB_ACTLR_DISMCYCINT_Pos 0 /*!< ACTLR: DISMCYCINT Position */
|
||||||
|
#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_SCnotSCB */
|
||||||
|
|
||||||
|
|
||||||
|
/** \ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_SysTick System Tick Timer (SysTick)
|
||||||
|
\brief Type definitions for the System Timer Registers.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \brief Structure type to access the System Timer (SysTick).
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */
|
||||||
|
__IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */
|
||||||
|
__IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */
|
||||||
|
__I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */
|
||||||
|
} SysTick_Type;
|
||||||
|
|
||||||
|
/* SysTick Control / Status Register Definitions */
|
||||||
|
#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */
|
||||||
|
#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */
|
||||||
|
|
||||||
|
#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */
|
||||||
|
#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */
|
||||||
|
|
||||||
|
#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */
|
||||||
|
#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */
|
||||||
|
|
||||||
|
#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */
|
||||||
|
#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */
|
||||||
|
|
||||||
|
/* SysTick Reload Register Definitions */
|
||||||
|
#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */
|
||||||
|
#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */
|
||||||
|
|
||||||
|
/* SysTick Current Register Definitions */
|
||||||
|
#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */
|
||||||
|
#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */
|
||||||
|
|
||||||
|
/* SysTick Calibration Register Definitions */
|
||||||
|
#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */
|
||||||
|
#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */
|
||||||
|
|
||||||
|
#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */
|
||||||
|
#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */
|
||||||
|
|
||||||
|
#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */
|
||||||
|
#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_SysTick */
|
||||||
|
|
||||||
|
#if (__MPU_PRESENT == 1)
|
||||||
|
/** \ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_MPU Memory Protection Unit (MPU)
|
||||||
|
\brief Type definitions for the Memory Protection Unit (MPU)
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \brief Structure type to access the Memory Protection Unit (MPU).
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__I uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */
|
||||||
|
__IO uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */
|
||||||
|
__IO uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */
|
||||||
|
__IO uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */
|
||||||
|
__IO uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */
|
||||||
|
} MPU_Type;
|
||||||
|
|
||||||
|
/* MPU Type Register */
|
||||||
|
#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */
|
||||||
|
#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */
|
||||||
|
|
||||||
|
#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */
|
||||||
|
#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */
|
||||||
|
|
||||||
|
#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */
|
||||||
|
#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */
|
||||||
|
|
||||||
|
/* MPU Control Register */
|
||||||
|
#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */
|
||||||
|
#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */
|
||||||
|
|
||||||
|
#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */
|
||||||
|
#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */
|
||||||
|
|
||||||
|
#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */
|
||||||
|
#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */
|
||||||
|
|
||||||
|
/* MPU Region Number Register */
|
||||||
|
#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */
|
||||||
|
#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */
|
||||||
|
|
||||||
|
/* MPU Region Base Address Register */
|
||||||
|
#define MPU_RBAR_ADDR_Pos 8 /*!< MPU RBAR: ADDR Position */
|
||||||
|
#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */
|
||||||
|
|
||||||
|
#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */
|
||||||
|
#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */
|
||||||
|
|
||||||
|
#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */
|
||||||
|
#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */
|
||||||
|
|
||||||
|
/* MPU Region Attribute and Size Register */
|
||||||
|
#define MPU_RASR_ATTRS_Pos 16 /*!< MPU RASR: MPU Region Attribute field Position */
|
||||||
|
#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */
|
||||||
|
|
||||||
|
#define MPU_RASR_XN_Pos 28 /*!< MPU RASR: ATTRS.XN Position */
|
||||||
|
#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */
|
||||||
|
|
||||||
|
#define MPU_RASR_AP_Pos 24 /*!< MPU RASR: ATTRS.AP Position */
|
||||||
|
#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */
|
||||||
|
|
||||||
|
#define MPU_RASR_TEX_Pos 19 /*!< MPU RASR: ATTRS.TEX Position */
|
||||||
|
#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */
|
||||||
|
|
||||||
|
#define MPU_RASR_S_Pos 18 /*!< MPU RASR: ATTRS.S Position */
|
||||||
|
#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */
|
||||||
|
|
||||||
|
#define MPU_RASR_C_Pos 17 /*!< MPU RASR: ATTRS.C Position */
|
||||||
|
#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */
|
||||||
|
|
||||||
|
#define MPU_RASR_B_Pos 16 /*!< MPU RASR: ATTRS.B Position */
|
||||||
|
#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */
|
||||||
|
|
||||||
|
#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */
|
||||||
|
#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */
|
||||||
|
|
||||||
|
#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */
|
||||||
|
#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */
|
||||||
|
|
||||||
|
#define MPU_RASR_ENABLE_Pos 0 /*!< MPU RASR: Region enable bit Position */
|
||||||
|
#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_MPU */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/** \ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug)
|
||||||
|
\brief SC000 Core Debug Registers (DCB registers, SHCSR, and DFSR)
|
||||||
|
are only accessible over DAP and not via processor. Therefore
|
||||||
|
they are not covered by the Cortex-M0 header file.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
/*@} end of group CMSIS_CoreDebug */
|
||||||
|
|
||||||
|
|
||||||
|
/** \ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_core_base Core Definitions
|
||||||
|
\brief Definitions for base addresses, unions, and structures.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Memory mapping of SC000 Hardware */
|
||||||
|
#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */
|
||||||
|
#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */
|
||||||
|
#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */
|
||||||
|
#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */
|
||||||
|
|
||||||
|
#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */
|
||||||
|
#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */
|
||||||
|
#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */
|
||||||
|
#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */
|
||||||
|
|
||||||
|
#if (__MPU_PRESENT == 1)
|
||||||
|
#define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */
|
||||||
|
#define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*@} */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Hardware Abstraction Layer
|
||||||
|
Core Function Interface contains:
|
||||||
|
- Core NVIC Functions
|
||||||
|
- Core SysTick Functions
|
||||||
|
- Core Register Access Functions
|
||||||
|
******************************************************************************/
|
||||||
|
/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ########################## NVIC functions #################################### */
|
||||||
|
/** \ingroup CMSIS_Core_FunctionInterface
|
||||||
|
\defgroup CMSIS_Core_NVICFunctions NVIC Functions
|
||||||
|
\brief Functions that manage interrupts and exceptions via the NVIC.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Interrupt Priorities are WORD accessible only under ARMv6M */
|
||||||
|
/* The following MACROS handle generation of the register offset and byte masks */
|
||||||
|
#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL)
|
||||||
|
#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) )
|
||||||
|
#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) )
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Enable External Interrupt
|
||||||
|
|
||||||
|
The function enables a device-specific interrupt in the NVIC interrupt controller.
|
||||||
|
|
||||||
|
\param [in] IRQn External interrupt number. Value cannot be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
NVIC->ISER[0] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Disable External Interrupt
|
||||||
|
|
||||||
|
The function disables a device-specific interrupt in the NVIC interrupt controller.
|
||||||
|
|
||||||
|
\param [in] IRQn External interrupt number. Value cannot be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
NVIC->ICER[0] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Get Pending Interrupt
|
||||||
|
|
||||||
|
The function reads the pending register in the NVIC and returns the pending bit
|
||||||
|
for the specified interrupt.
|
||||||
|
|
||||||
|
\param [in] IRQn Interrupt number.
|
||||||
|
|
||||||
|
\return 0 Interrupt status is not pending.
|
||||||
|
\return 1 Interrupt status is pending.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
return((uint32_t)(((NVIC->ISPR[0] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Set Pending Interrupt
|
||||||
|
|
||||||
|
The function sets the pending bit of an external interrupt.
|
||||||
|
|
||||||
|
\param [in] IRQn Interrupt number. Value cannot be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
NVIC->ISPR[0] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Clear Pending Interrupt
|
||||||
|
|
||||||
|
The function clears the pending bit of an external interrupt.
|
||||||
|
|
||||||
|
\param [in] IRQn External interrupt number. Value cannot be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
NVIC->ICPR[0] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Set Interrupt Priority
|
||||||
|
|
||||||
|
The function sets the priority of an interrupt.
|
||||||
|
|
||||||
|
\note The priority cannot be set for every core interrupt.
|
||||||
|
|
||||||
|
\param [in] IRQn Interrupt number.
|
||||||
|
\param [in] priority Priority to set.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
|
||||||
|
{
|
||||||
|
if((int32_t)(IRQn) < 0) {
|
||||||
|
SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
|
||||||
|
(((priority << (8 - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
|
||||||
|
(((priority << (8 - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Get Interrupt Priority
|
||||||
|
|
||||||
|
The function reads the priority of an interrupt. The interrupt
|
||||||
|
number can be positive to specify an external (device specific)
|
||||||
|
interrupt, or negative to specify an internal (core) interrupt.
|
||||||
|
|
||||||
|
|
||||||
|
\param [in] IRQn Interrupt number.
|
||||||
|
\return Interrupt Priority. Value is aligned automatically to the implemented
|
||||||
|
priority bits of the microcontroller.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
|
||||||
|
if((int32_t)(IRQn) < 0) {
|
||||||
|
return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8 - __NVIC_PRIO_BITS)));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8 - __NVIC_PRIO_BITS)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief System Reset
|
||||||
|
|
||||||
|
The function initiates a system reset request to reset the MCU.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void NVIC_SystemReset(void)
|
||||||
|
{
|
||||||
|
__DSB(); /* Ensure all outstanding memory accesses included
|
||||||
|
buffered write are completed before reset */
|
||||||
|
SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
|
||||||
|
SCB_AIRCR_SYSRESETREQ_Msk);
|
||||||
|
__DSB(); /* Ensure completion of memory access */
|
||||||
|
while(1) { __NOP(); } /* wait until reset */
|
||||||
|
}
|
||||||
|
|
||||||
|
/*@} end of CMSIS_Core_NVICFunctions */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ################################## SysTick function ############################################ */
|
||||||
|
/** \ingroup CMSIS_Core_FunctionInterface
|
||||||
|
\defgroup CMSIS_Core_SysTickFunctions SysTick Functions
|
||||||
|
\brief Functions that configure the System.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if (__Vendor_SysTickConfig == 0)
|
||||||
|
|
||||||
|
/** \brief System Tick Configuration
|
||||||
|
|
||||||
|
The function initializes the System Timer and its interrupt, and starts the System Tick Timer.
|
||||||
|
Counter is in free running mode to generate periodic interrupts.
|
||||||
|
|
||||||
|
\param [in] ticks Number of ticks between two interrupts.
|
||||||
|
|
||||||
|
\return 0 Function succeeded.
|
||||||
|
\return 1 Function failed.
|
||||||
|
|
||||||
|
\note When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the
|
||||||
|
function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>
|
||||||
|
must contain a vendor-specific implementation of this function.
|
||||||
|
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
|
||||||
|
{
|
||||||
|
if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) {return (1UL);} /* Reload value impossible */
|
||||||
|
|
||||||
|
SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */
|
||||||
|
NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
|
||||||
|
SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
|
||||||
|
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
|
||||||
|
SysTick_CTRL_TICKINT_Msk |
|
||||||
|
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
|
||||||
|
return (0UL); /* Function successful */
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*@} end of CMSIS_Core_SysTickFunctions */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __CORE_SC000_H_DEPENDANT */
|
||||||
|
|
||||||
|
#endif /* __CMSIS_GENERIC */
|
||||||
1675
DSP_LIB/Include/core_sc300.h
Normal file
1675
DSP_LIB/Include/core_sc300.h
Normal file
File diff suppressed because it is too large
Load Diff
BIN
DSP_LIB/arm_cortexM4lf_math.lib
Normal file
BIN
DSP_LIB/arm_cortexM4lf_math.lib
Normal file
Binary file not shown.
12
Readme.txt
Normal file
12
Readme.txt
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
V0.0.0.0
|
||||||
|
建立工程,修改刺激方案,输出双向波
|
||||||
|
V0.0.0.1
|
||||||
|
删除触发电刺激、采集相关内容,增加电流按键检测功能
|
||||||
|
V0.0.0.2
|
||||||
|
将SAADC的采样位数由14位改为12位,精度降低,这样可以一次性初始化所有采集通道,如果使用14位则一次只能使用一个通道
|
||||||
|
电极脱落检测电压门限为90mv,电流小于7毫安不检测
|
||||||
|
V0.0.0.3
|
||||||
|
修改刺激波形,使用TIM1定时器,通过定时器控制PE3PE4的输出,PWM1为高电平
|
||||||
|
V1.0.0.1
|
||||||
|
增加电刺激返回的时候定时器清0和GPIOTE初始化,解决初始输出电平时高时低问题
|
||||||
|
|
||||||
108
app/Inc/IoControl.h
Normal file
108
app/Inc/IoControl.h
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
/********************************************************************
|
||||||
|
Copyright (c) 2021 Xiangyu Medical Co.,Ltd. All rights reserved.
|
||||||
|
FileName : IoControl.h
|
||||||
|
Author : zhangdawei
|
||||||
|
Version : V1.0
|
||||||
|
Date :
|
||||||
|
Note :
|
||||||
|
History :
|
||||||
|
********************************************************************/
|
||||||
|
#ifndef _IOCONTROL_H__
|
||||||
|
#define _IOCONTROL_H__
|
||||||
|
/* Includes ------------------------------------------------------*/
|
||||||
|
#include "nrf52.h"
|
||||||
|
#include "nrf_gpio.h"
|
||||||
|
#include "timer.h"
|
||||||
|
#include "drv_saadc.h"
|
||||||
|
#include "drv_uart.h"
|
||||||
|
#include "nrf_drv_gpiote.h"
|
||||||
|
//Log需要引用的头文件
|
||||||
|
#include "nrf_log.h"
|
||||||
|
#include "nrf_log_ctrl.h"
|
||||||
|
#include "nrf_log_default_backends.h"
|
||||||
|
#include "nrf_delay.h"
|
||||||
|
/* Public define -------------------------------------------------*/
|
||||||
|
#define MERGE(Msb,Lsb) ((Msb<<8)|Lsb)
|
||||||
|
/* 按键检测 */
|
||||||
|
#define KEY_PWR_SWITICH ( 16 )
|
||||||
|
|
||||||
|
/* 电源锁定 */
|
||||||
|
#define KEY_POWER ( 13 )
|
||||||
|
/* 指示灯 */
|
||||||
|
#define LED_YELLOW ( 11 )
|
||||||
|
#define LED_WHITE ( 12 )
|
||||||
|
/* DAC 引脚*/
|
||||||
|
#define PWM_DAC_GPIO ( 26 )
|
||||||
|
|
||||||
|
|
||||||
|
/* 充电芯片引脚定义,低电平是充电中,高电平是充电完成或未充电 */
|
||||||
|
#define CHG_MANAGER_EN ( 15 ) //充电管理芯片的EN引脚,内部200K下拉电阻。 高电平:禁用充电器 ,低电平(Low)或悬空(Floating):启用充电器
|
||||||
|
#define CHG_MANAGER_PPR ( 23 ) //充电管理芯片的PPR引脚 ,开漏输出,外部上拉3.0V,低电平:输入充电电压正常,高电平:输入充电电压异常
|
||||||
|
#define CHG_MANAGER_CHG ( 14 ) //充电指示引脚,低电平是充电中,充电结束为高电平
|
||||||
|
|
||||||
|
#define STIM_RMS_RELAY_PIN ( 27 ) // 肌电采集继电器控制引脚
|
||||||
|
#define STIM_RELAY_PIN ( 28 ) //刺激继电器控制引脚
|
||||||
|
|
||||||
|
#define SAMPLE_POWER_PIN ( 20 ) //采样电源控制引脚
|
||||||
|
|
||||||
|
#define BOOST_DISCHARGE_PIN ( 18 ) //boost升压放电引脚
|
||||||
|
|
||||||
|
#define BASE_WAVE_06_PIN ( 6 ) //刺激基础波形控制引脚6
|
||||||
|
#define BASE_WAVE_07_PIN ( 7 ) //刺激基础波形控制引脚7
|
||||||
|
#define BASE_WAVE_08_PIN ( 8 ) //刺激基础波形控制引脚8
|
||||||
|
|
||||||
|
#define BOOST_VOLTAGE_CONTROL_PIN ( 25 ) //boost电压控制引脚
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Public typedef ------------------------------------------------*/
|
||||||
|
//设备开关机状态
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
POWER_OPEN = 0,
|
||||||
|
POWER_CLOSE
|
||||||
|
}DeviceStateInfo_e;
|
||||||
|
// 充电状态
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
Uncharged = 0,
|
||||||
|
Charging,
|
||||||
|
ChargeComplete
|
||||||
|
}ChargingStateInfo_e;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
Bit_RESET = 0,
|
||||||
|
Bit_SET
|
||||||
|
}BitAction;
|
||||||
|
|
||||||
|
typedef struct{
|
||||||
|
nrf_drv_gpiote_pin_t KeyPinNumber;
|
||||||
|
bool shineng;
|
||||||
|
}KeyStateInfo_t;
|
||||||
|
/* Public constants ----------------------------------------------*/
|
||||||
|
/* Public variables ----------------------------------------------*/
|
||||||
|
extern DeviceStateInfo_e DeviceState;
|
||||||
|
extern ChargingStateInfo_e ChargeState;
|
||||||
|
extern ChargingStateInfo_e ChargeLastState;
|
||||||
|
/* Public function prototypes ------------------------------------*/
|
||||||
|
void StartAdv(void);
|
||||||
|
void StopAdv(void);
|
||||||
|
void GpioInit(void);
|
||||||
|
void EXIT_KEY_Init(void);
|
||||||
|
void open_acquisition_relay(void);
|
||||||
|
void close_acquisition_relay(void);
|
||||||
|
void LedControl(void);
|
||||||
|
void StimStateInfoStructInit(SchemeData_t SchemeDataIn);
|
||||||
|
void VariableInit(void);
|
||||||
|
void StimOutCtlOpen(void);
|
||||||
|
void StimOutCtlClose(void);
|
||||||
|
void StimReleaseOpen(void);
|
||||||
|
void StimReleaseClose(void);
|
||||||
|
void PreStorageSchemeDataInit(void);
|
||||||
|
void KeyPinHandler(void);
|
||||||
|
void close_stimulate_relay(void);
|
||||||
|
void open_stimulate_relay(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*************************** END OF FILE ***************************/
|
||||||
45
app/Inc/drv_saadc.h
Normal file
45
app/Inc/drv_saadc.h
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
/********************************************************************
|
||||||
|
Copyright (c) 2021 Xiangyu Medical Co.,Ltd. All rights reserved.
|
||||||
|
FileName : drv_saadc.h
|
||||||
|
Author : zhangdawei
|
||||||
|
Version : V1.0
|
||||||
|
Date :
|
||||||
|
Note :
|
||||||
|
History :
|
||||||
|
********************************************************************/
|
||||||
|
/* Includes ------------------------------------------------------*/
|
||||||
|
#ifndef DRV_SAADC_H__
|
||||||
|
#define DRV_SAADC_H__
|
||||||
|
#include "nrf_drv_timer.h"
|
||||||
|
#include "nrf_drv_saadc.h"
|
||||||
|
#include "IoControl.h"
|
||||||
|
/* Public define -------------------------------------------------*/
|
||||||
|
#define SAADC_BATTERY_CHANNEL 1 // 电池电压检测通道
|
||||||
|
#define SAADC_ELECTRODE_CHANNEL 2 // 电极片脱落电压
|
||||||
|
#define SAADC_RMS_SAMPLE_CHANNEL 0 // 肌电采样通道
|
||||||
|
|
||||||
|
#define AD_RAW_MAX 50
|
||||||
|
|
||||||
|
/* Public typedef ------------------------------------------------*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
//float AdRaw[AD_RAW_MAX+50];//原始值数组
|
||||||
|
float EmgValue;//计算值
|
||||||
|
unsigned char emgCnt;
|
||||||
|
}emg_data_t;
|
||||||
|
|
||||||
|
/* Public constants ----------------------------------------------*/
|
||||||
|
/* Public variables ----------------------------------------------*/
|
||||||
|
extern uint8_t Battery_Percentage;
|
||||||
|
/* Public function prototypes ------------------------------------*/
|
||||||
|
void battery_adc_init(void);
|
||||||
|
void timer1_output_ctrl_init(void);
|
||||||
|
void rms_saadc_init(void);
|
||||||
|
void PPIEegAdcInit(void);
|
||||||
|
void timer3_rms_init(void);
|
||||||
|
void timer3_rms_stop(void);
|
||||||
|
void timer3_rms_start(void);
|
||||||
|
void CalculateBatteryPower(void);
|
||||||
|
#endif
|
||||||
|
/*************************** END OF FILE ***************************/
|
||||||
|
|
||||||
241
app/Inc/drv_uart.h
Normal file
241
app/Inc/drv_uart.h
Normal file
@ -0,0 +1,241 @@
|
|||||||
|
/********************************************************************
|
||||||
|
Copyright (c) 2021 Xiangyu Medical Co.,Ltd. All rights reserved.
|
||||||
|
FileName : drv_uart.h
|
||||||
|
Author : zhangdawei
|
||||||
|
Version : V1.0
|
||||||
|
Date :
|
||||||
|
Note :
|
||||||
|
History :
|
||||||
|
********************************************************************/
|
||||||
|
/* Includes ------------------------------------------------------*/
|
||||||
|
#ifndef DRV_UART_H__
|
||||||
|
#define DRV_UART_H__
|
||||||
|
#include "sdk_config.h"
|
||||||
|
#include "ble_nus.h"
|
||||||
|
#include "ble_link_ctx_manager.h"
|
||||||
|
/* Public define -------------------------------------------------*/
|
||||||
|
#define ONE_SECOND ( 1000000 ) /* 1s = 1000000us */
|
||||||
|
/* 功能码定义 */
|
||||||
|
#define RUN_ROLL ( 0x81 ) //运行轮询
|
||||||
|
#define VERSION_INQUIRY ( 0x82 ) //版本查询
|
||||||
|
#define STIM_PARA_CONTROL ( 0x83 ) //模式、脉宽、频率、斜坡时间设置
|
||||||
|
#define START_STOP_CONTROL ( 0x84 ) //控制
|
||||||
|
#define PRE_ADJUST ( 0x85 ) //预调节
|
||||||
|
#define CURRENT_CONTROL ( 0x86 ) //电流设置
|
||||||
|
#define EEG_DATA ( 0x87 ) //肌电数据上报
|
||||||
|
#define TRIG_COLLECT_START_CONTROL ( 0x88 ) //触发采集开始
|
||||||
|
#define TRIG_STIM_START_CONTROL ( 0x89 ) //触发刺激开始
|
||||||
|
#define STATUS_INQUIRY ( 0x8A ) //轮询
|
||||||
|
#define MAC_QUERY ( 0x8B ) //MAC地址查询
|
||||||
|
#define STATE_UPLOAD ( 0x92 ) //状态上传(电极片状态和适配器状态)
|
||||||
|
#define SCHEME_QUERY ( 0x91 ) //方案查询
|
||||||
|
/* 刺激启停控制数据偏移定义 */
|
||||||
|
#define StartStopOffset ( 4 )
|
||||||
|
/* 刺激启停控制数据描述 */
|
||||||
|
#define CH_STOP ( 0x00 )
|
||||||
|
#define CH_START ( 0x01 )
|
||||||
|
#define CH_PAUSE ( 0x02 )
|
||||||
|
#define CH_CONTINUE ( 0x03 )
|
||||||
|
/* 刺激参数数据偏移定义 */
|
||||||
|
#define HeadOffset ( 0 )
|
||||||
|
#define DataLengthOffset ( 1 )
|
||||||
|
#define FunctionCodeOffset ( 2 )
|
||||||
|
#define ChannelNumOffset ( 3 )
|
||||||
|
#define SchemeCategoryOffset ( 4 )
|
||||||
|
#define SchemeIDMSBOffset ( 5 )
|
||||||
|
#define SchemeIDLSBOffset ( 6 )
|
||||||
|
#define FreqMSBOffset ( 7 )
|
||||||
|
#define FreqLSBOffset ( 8 )
|
||||||
|
#define WidthMSBOffset ( 9 )
|
||||||
|
#define WidthLSBOffset ( 10 )
|
||||||
|
#define RampUpTimeLSBOffset ( 12 )
|
||||||
|
#define RampUpTimeMSBOffset ( 11 )
|
||||||
|
#define RampSmoothTimeLSBOffset ( 14 )
|
||||||
|
#define RampSmoothTimeMSBOffset ( 13 )
|
||||||
|
#define RampDownTimeLSBOffset ( 16 )
|
||||||
|
#define RampDownTimeMSBOffset ( 15 )
|
||||||
|
#define RampBreakTimeLSBOffset ( 18 )
|
||||||
|
#define RampBreakTimeMSBOffset ( 17 )
|
||||||
|
/* 状态轮询数据偏移定义 */
|
||||||
|
#define ElectrodeStatusOffset ( 4 )
|
||||||
|
#define StimStatusOffset ( 5 )
|
||||||
|
#define StimCurrentOffset ( 6 )
|
||||||
|
#define ResetOffset ( 7 )
|
||||||
|
#define DataCrcOffset ( 8 )
|
||||||
|
#define TailOffset ( 9 )
|
||||||
|
/* 运行轮询数据偏移定义 */
|
||||||
|
#define AdapterStatusOffset ( 5 )
|
||||||
|
#define BatteryLevelOffset ( 4 )
|
||||||
|
/* 刺激电流数据偏移定义 */
|
||||||
|
#define PRE_ADJUST_OFFSET ( 4 )
|
||||||
|
/* 预调节数据定义 */
|
||||||
|
#define START_PRE_ADJUST ( 0x01 )
|
||||||
|
#define STOP_PRE_ADJUST ( 0x00 )
|
||||||
|
/* 方案存储属性定义 */
|
||||||
|
#define TEMP_STORAGE ( 1 ) // 临时存储
|
||||||
|
#define PERMANENT_STORAGE ( 2 ) // 永久存储
|
||||||
|
#define FDS_DATA_LENGTH ( 20 ) // 存储空间长度
|
||||||
|
|
||||||
|
//头尾帧
|
||||||
|
#define FRAME_HEADER (0xAA)
|
||||||
|
#define FRAME_TAIL (0x55)
|
||||||
|
|
||||||
|
//功能码
|
||||||
|
// Function Codes (Converted to UPPER_SNAKE_CASE)
|
||||||
|
#define D_PARAMETER_SET (0x71) // Original: D_ParameterSet
|
||||||
|
#define D_CHANNEL_CTRL (0x72) // Original: D_ChannelCtrl
|
||||||
|
#define D_CURRENT_SET (0x73) // Original: D_CurrentSet
|
||||||
|
#define D_EMG_DATA_REPORT (0x74) // Original: D_EmgDataReport
|
||||||
|
#define D_DATA_MODE_SWITCH (0x75) // Original: D_DataModeSwitch
|
||||||
|
#define D_PREINSTALL_CTRL (0x76) // Original: D_PreinstallCtrl
|
||||||
|
#define D_TRIGGER_MODE_CTRL (0x77) // Original: D_TriggerModeCtrl
|
||||||
|
#define D_POLL_CMD (0x78) // Original: D_PollCmd
|
||||||
|
#define D_SLICE_FALL_DETECT_SWITCH (0x79) // Original: D_SliceFallDetectSwitch
|
||||||
|
#define D_TURN_OFF_CMD (0x7A) // Original: D_TurnOffCmd
|
||||||
|
#define D_BLE_SCAN_SWITCH (0x7B) // Original: D_BleScanSwitch
|
||||||
|
#define D_MAC_ADDR_REPORT (0x7C) // Original: D_MacAddrReport
|
||||||
|
#define D_BLE_CONNECT_CMD (0x7D) // Original: D_BleConnectCmd
|
||||||
|
|
||||||
|
/* Public typedef ------------------------------------------------*/
|
||||||
|
/* 方案信息结构体 */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint8_t StorageMode; //存储模式
|
||||||
|
uint8_t SchemeIDMSB; //方案ID
|
||||||
|
uint8_t SchemeIDLSB;
|
||||||
|
uint8_t FreqMSB; //频率
|
||||||
|
uint8_t FreqLSB;
|
||||||
|
uint8_t WidthMSB; //脉宽
|
||||||
|
uint8_t WidthLSB;
|
||||||
|
uint8_t RampUpTimeMSB; //波升
|
||||||
|
uint8_t RampUpTimeLSB;
|
||||||
|
uint8_t RampSmoothTimeMSB;//保持
|
||||||
|
uint8_t RampSmoothTimeLSB;
|
||||||
|
uint8_t RampDownTimeMSB; //波降
|
||||||
|
uint8_t RampDownTimeLSB;
|
||||||
|
uint8_t RampBreakTimeMSB; //休息
|
||||||
|
uint8_t RampBreakTimeLSB;
|
||||||
|
}SchemeData_t;
|
||||||
|
|
||||||
|
#define RMS_USER_DATA_LENGTH 4//110///4 //用户数据长度
|
||||||
|
#pragma pack(1)
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint8_t frameHeader; //帧头
|
||||||
|
uint8_t frameLength; //帧长度
|
||||||
|
uint8_t functionCode; //功能码
|
||||||
|
uint8_t myNumber; //编号
|
||||||
|
uint8_t channel; //通道号
|
||||||
|
uint16_t rmsDataBuffer[RMS_USER_DATA_LENGTH]; //数据内容
|
||||||
|
uint8_t checkSum; //校验和
|
||||||
|
uint8_t frameTail; //帧尾
|
||||||
|
} rms_data_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint8_t frameHeader; //帧头
|
||||||
|
uint8_t frameLength; //帧长度
|
||||||
|
uint8_t functionCode; //功能码
|
||||||
|
uint8_t channel; //通道号
|
||||||
|
uint8_t ChargeState; //充电状态
|
||||||
|
uint8_t BatteryLevelA; //A 电池电量
|
||||||
|
uint8_t BatteryLevelB; //B 电池电量
|
||||||
|
uint8_t BatteryLevelC; //C 电池电量
|
||||||
|
|
||||||
|
uint8_t reserve[5]; //保留字段
|
||||||
|
|
||||||
|
uint8_t checkSum; //校验和
|
||||||
|
uint8_t frameTail; //帧尾
|
||||||
|
} reply_run_status_t;
|
||||||
|
|
||||||
|
#define MAX_VERSION_LEN 15
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint8_t frameHeader; //帧头
|
||||||
|
uint8_t frameLength; //帧长度
|
||||||
|
uint8_t functionCode; //功能码
|
||||||
|
uint8_t channel; //通道号
|
||||||
|
uint8_t VersionDes[MAX_VERSION_LEN]; //版本描述
|
||||||
|
|
||||||
|
uint8_t checkSum; //校验和
|
||||||
|
uint8_t frameTail; //帧尾
|
||||||
|
} check_version_t;
|
||||||
|
|
||||||
|
|
||||||
|
#pragma pack()
|
||||||
|
|
||||||
|
|
||||||
|
//设备连接状态
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
DisconnectState = 0,
|
||||||
|
ConnectState
|
||||||
|
}ConnectStateInfo_e;
|
||||||
|
// 电极片状态
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
ElectrodeFalloff,
|
||||||
|
ElectrodeConnectted
|
||||||
|
}ElectrodeStatusInfo_e;
|
||||||
|
// 适配器连接状态
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
AdapterNotConnected = 0,
|
||||||
|
AdapterConnected
|
||||||
|
}AdapterStateInfo_e;
|
||||||
|
//FDS异步操作标志结构体
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
bool scheme_update; //scheme_record记录更新标志
|
||||||
|
bool read; //读记录标志
|
||||||
|
bool gc; //碎片收集标志
|
||||||
|
bool busy; //FDS忙标志
|
||||||
|
}my_fds_info_t;
|
||||||
|
|
||||||
|
//记录scheme的id和内容
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint8_t text[FDS_DATA_LENGTH];
|
||||||
|
}__attribute__((aligned(4)))SchemePara_t;
|
||||||
|
/* Public constants ----------------------------------------------*/
|
||||||
|
/* Public variables ----------------------------------------------*/
|
||||||
|
extern uint16_t m_conn_handle;
|
||||||
|
extern uint16_t m_ble_nus_max_data_len;
|
||||||
|
extern uint8_t CurrentFlag;
|
||||||
|
extern ConnectStateInfo_e DeviceConnectState;
|
||||||
|
extern ElectrodeStatusInfo_e ElectrodeStatusInfo;
|
||||||
|
extern my_fds_info_t my_fds_info;
|
||||||
|
extern SchemePara_t SchemePara;
|
||||||
|
extern SchemeData_t SchemeData;
|
||||||
|
extern uint8_t BLE_MAC[BLE_GAP_ADDR_LEN];
|
||||||
|
extern AdapterStateInfo_e AdapterState;
|
||||||
|
extern AdapterStateInfo_e LastAdapterState;
|
||||||
|
extern SchemeData_t PreStorageSchemeData;
|
||||||
|
extern ElectrodeStatusInfo_e LastElectrodeStatusInfo;
|
||||||
|
extern uint16_t ccrvaluebuf[70];
|
||||||
|
extern uint8_t eegflag;
|
||||||
|
/* Public function prototypes ------------------------------------*/
|
||||||
|
void service_nus_init(void);
|
||||||
|
void StartManage(void);
|
||||||
|
void PauseManage(void);
|
||||||
|
void RecoverManage(void);
|
||||||
|
void StopManage(void);
|
||||||
|
void CloseOutput(void);
|
||||||
|
void SetStandardCurrent(uint8_t* AnalysisDataBfferIn_t);
|
||||||
|
void RunRoll(void);
|
||||||
|
void CheckVersion(void);
|
||||||
|
void UpdateCurrent(uint8_t CurrentSend);
|
||||||
|
void JudgeLedMode(void);
|
||||||
|
void DisconnectControl(void);
|
||||||
|
void SchemeQuery(uint8_t idMSB,uint8_t idLSB);
|
||||||
|
void UpdateControlStatus(uint8_t ControlStatus);
|
||||||
|
void StateUpLoad(AdapterStateInfo_e AdapterStateTemp , ElectrodeStatusInfo_e ElectrodeStatusTemp);
|
||||||
|
void EegDataSend(void);
|
||||||
|
void user_ble_or_uart_send(char * txBufferP, uint16_t Length);
|
||||||
|
|
||||||
|
void ble_send_rms_data(uint16_t rms_data);
|
||||||
|
#endif
|
||||||
|
/*************************** END OF FILE ***************************/
|
||||||
|
|
||||||
|
|
||||||
117
app/Inc/timer.h
Normal file
117
app/Inc/timer.h
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
/********************************************************************
|
||||||
|
Copyright (c) 2021 Xiangyu Medical Co.,Ltd. All rights reserved.
|
||||||
|
FileName : timer.h
|
||||||
|
Author : zhangdawei
|
||||||
|
Version : V1.0
|
||||||
|
Date :
|
||||||
|
Note :
|
||||||
|
History :
|
||||||
|
********************************************************************/
|
||||||
|
#ifndef TIMER_H__
|
||||||
|
#define TIMER_H__
|
||||||
|
/* Includes ------------------------------------------------------*/
|
||||||
|
#include "app_timer.h"
|
||||||
|
/* Public define -------------------------------------------------*/
|
||||||
|
#define RAMP_TIM_TIME ( 1000 )
|
||||||
|
/* 呼吸灯的步长 */
|
||||||
|
#define M_STEP ( 100 )
|
||||||
|
/* 频率对应的周期值 */
|
||||||
|
#define CYCLE_CALUE ( 1000 )
|
||||||
|
#define SIQU ( 200 )
|
||||||
|
/* Public typedef ------------------------------------------------*/
|
||||||
|
/*通道状态*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
IdleState = 0, // 空闲态
|
||||||
|
StimState, // 刺激态
|
||||||
|
StimAdjState // 刺激调节态
|
||||||
|
}ChannelState_e;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
E_RMS_STOP = 0x00,
|
||||||
|
E_RMS_START = 0x01,
|
||||||
|
E_RMS_PAUSE = 0x02,
|
||||||
|
E_RMS_CONTINUE = 0x03,
|
||||||
|
|
||||||
|
E_STIM_STOP = 0x04,
|
||||||
|
E_STIM_START = 0x05,
|
||||||
|
E_STIM_PAUSE = 0x06,
|
||||||
|
E_STIM_CONTINUE = 0x07
|
||||||
|
|
||||||
|
}E_WORK_STATE;
|
||||||
|
|
||||||
|
/* LED状态 */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
Disconnect_Highbattery = 0, //未连接有电
|
||||||
|
Disconnect_Lowbattery, // 未连接低电
|
||||||
|
Connect_Lowbattery, // 连接低电
|
||||||
|
Connect_Highbattery, // 连接有电
|
||||||
|
Null
|
||||||
|
}LedModeInfo_e;
|
||||||
|
/* 斜坡状态 */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
RampIdle = 0,
|
||||||
|
RampUp,
|
||||||
|
RampDown,
|
||||||
|
RampSmooth,
|
||||||
|
RampBreak
|
||||||
|
}RampState_e;
|
||||||
|
/* 通道工作状态 */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
Close,
|
||||||
|
Open,
|
||||||
|
Pause,
|
||||||
|
Continue,
|
||||||
|
Ready
|
||||||
|
}ChannelWorkState_e;
|
||||||
|
/* 刺激参数信息结构体 */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t usRampUpTime; // 上坡时间 单位为ms
|
||||||
|
uint16_t usRampDownTime; // 下坡时间
|
||||||
|
uint16_t usSmoothTime; // 平坡时间
|
||||||
|
uint16_t usBreakTime; // 休息时间
|
||||||
|
uint16_t usFreqBuf; // 频率
|
||||||
|
ChannelWorkState_e ChannelWorkState; // 通道当前工作状态
|
||||||
|
uint32_t usWidth; // 脉冲宽度
|
||||||
|
uint32_t usCycle; // 脉冲周期
|
||||||
|
RampState_e Ramp_e; // 斜坡状态
|
||||||
|
uint8_t ucCurrent; // 标称电流值
|
||||||
|
uint16_t usCcrValue; // 标称的CCR值
|
||||||
|
}StimStateInfo_t;
|
||||||
|
/* Public constants ----------------------------------------------*/
|
||||||
|
/* Public variables ----------------------------------------------*/
|
||||||
|
extern StimStateInfo_t ChannelStimStateInfo_t;
|
||||||
|
|
||||||
|
extern uint8_t PwmLedInit_Flag;
|
||||||
|
extern bool LongPressEvent;
|
||||||
|
extern bool BeepBeepOpenFlag;
|
||||||
|
/* Public function prototypes ------------------------------------*/
|
||||||
|
void AppTimersInit(void);
|
||||||
|
void ApplicationTimersStart(void);
|
||||||
|
void PwmDACInit(void);
|
||||||
|
|
||||||
|
void PwmDACStop(void);
|
||||||
|
void PwmLedUnInit(void);
|
||||||
|
|
||||||
|
void PwmSubtractStop(void);
|
||||||
|
void GpioteInit(void);
|
||||||
|
void PPIPwmInit(void);
|
||||||
|
void SetCurrent(uint16_t CcrIn);
|
||||||
|
void OutputCurrentCtrl(void);
|
||||||
|
void BlinkTwice(void);
|
||||||
|
void pwm0_common_init(void);
|
||||||
|
void SetPWMValues(uint16_t tempvalue);
|
||||||
|
void pwm2common_init(void);
|
||||||
|
void PwmDACPlay(void);
|
||||||
|
void pwm2_play(void);
|
||||||
|
void pwm0_play(void);
|
||||||
|
#endif
|
||||||
|
/*************************** END OF FILE ***************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
31
app/Inc/user_config.h
Normal file
31
app/Inc/user_config.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/********************************************************************
|
||||||
|
Copyright (c) 2021 Xiangyu Medical Co.,Ltd. All rights reserved.
|
||||||
|
FileName :
|
||||||
|
Author : xiaozhengsheng
|
||||||
|
Version : V1.0
|
||||||
|
Date :
|
||||||
|
Note :
|
||||||
|
History :
|
||||||
|
********************************************************************/
|
||||||
|
#ifndef _USER_CONFIG_H_
|
||||||
|
#define _USER_CONFIG_H_
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define SOFT_VERSION_MAX_LENGTH 50
|
||||||
|
typedef struct {
|
||||||
|
uint8_t major; // 主版本号 (V1)
|
||||||
|
uint8_t minor; // 次版本号 (.0)
|
||||||
|
uint8_t patch; // 修订号 (.0)
|
||||||
|
uint8_t build; // 构建号 (.0)
|
||||||
|
uint8_t testVersion[30];
|
||||||
|
} version_t;
|
||||||
|
extern char softWareVersion[SOFT_VERSION_MAX_LENGTH];
|
||||||
|
|
||||||
|
void read_config_user_config(void);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*************************** END OF FILE ***************************/
|
||||||
|
|
||||||
201
app/Src/IoControl.c
Normal file
201
app/Src/IoControl.c
Normal file
@ -0,0 +1,201 @@
|
|||||||
|
/********************************************************************
|
||||||
|
Copyright (c) 2021 Xiangyu Medical Co.,Ltd. All rights reserved.
|
||||||
|
FileName : IoControl.c
|
||||||
|
Author : zhangdawei
|
||||||
|
Version : V1.0
|
||||||
|
Date :
|
||||||
|
Note :
|
||||||
|
History :
|
||||||
|
********************************************************************/
|
||||||
|
/* Includes ------------------------------------------------------*/
|
||||||
|
#include "IoControl.h"
|
||||||
|
#include "drv_uart.h"
|
||||||
|
#include "nrf_drv_gpiote.h"
|
||||||
|
/* Private define ------------------------------------------------*/
|
||||||
|
/* Private typedef -----------------------------------------------*/
|
||||||
|
/* Private constants ---------------------------------------------*/
|
||||||
|
/* Private variables ---------------------------------------------*/
|
||||||
|
uint8_t LastState = Null; //保存上一次的状态
|
||||||
|
/* Private function prototypes -----------------------------------*/
|
||||||
|
/* Public constants ----------------------------------------------*/
|
||||||
|
/* Public variables ----------------------------------------------*/
|
||||||
|
DeviceStateInfo_e DeviceState = POWER_CLOSE; //设备开关机状态
|
||||||
|
ChargingStateInfo_e ChargeState = Uncharged;
|
||||||
|
ChargingStateInfo_e ChargeLastState = Uncharged;
|
||||||
|
KeyStateInfo_t KeyStateInfo;
|
||||||
|
/********************************************************************
|
||||||
|
* name : void GpioInit(void)
|
||||||
|
* description : GPIO引脚初始化
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void GpioInit(void)
|
||||||
|
{
|
||||||
|
NRF_UICR->NFCPINS = 0;
|
||||||
|
|
||||||
|
nrf_gpio_cfg_output(KEY_POWER);
|
||||||
|
nrf_gpio_cfg_output(LED_YELLOW);
|
||||||
|
// nrf_gpio_cfg_output(CHARGE_LED);
|
||||||
|
|
||||||
|
nrf_gpio_cfg_output(STIM_RMS_RELAY_PIN);
|
||||||
|
nrf_gpio_cfg_output(STIM_RELAY_PIN);
|
||||||
|
nrf_gpio_cfg_output(SAMPLE_POWER_PIN);
|
||||||
|
|
||||||
|
|
||||||
|
// nrf_gpio_pin_clear(KEY_POWER);
|
||||||
|
nrf_gpio_pin_clear(LED_YELLOW);
|
||||||
|
|
||||||
|
// nrf_gpio_pin_clear(CHARGE_LED);
|
||||||
|
|
||||||
|
nrf_gpio_pin_clear(STIM_RMS_RELAY_PIN);
|
||||||
|
nrf_gpio_pin_clear(STIM_RELAY_PIN);
|
||||||
|
nrf_gpio_pin_clear(SAMPLE_POWER_PIN);
|
||||||
|
|
||||||
|
/////////
|
||||||
|
nrf_gpio_cfg_input(CHG_MANAGER_CHG, NRF_GPIO_PIN_NOPULL);//检测充电状态
|
||||||
|
|
||||||
|
}
|
||||||
|
/* 电刺激输出使能脚 */
|
||||||
|
void StimOutCtlOpen(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
void StimOutCtlClose(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
/* 能量释放控制 */
|
||||||
|
void StimReleaseOpen(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void StimReleaseClose(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// OK按键处理函数
|
||||||
|
void KEY_PWR_SWITICH_Handler(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//GPIOTE事件处理函回调函数,事件回调函数里面可以获取pin编号和引脚状态变化
|
||||||
|
void in_pin_handler(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
|
||||||
|
{
|
||||||
|
if(pin == KEY_PWR_SWITICH)
|
||||||
|
{
|
||||||
|
|
||||||
|
KeyStateInfo.shineng = true;
|
||||||
|
KeyStateInfo.KeyPinNumber = KEY_PWR_SWITICH;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void EXIT_KEY_Init(void)
|
||||||
|
{
|
||||||
|
ret_code_t err_code;
|
||||||
|
|
||||||
|
nrf_gpio_cfg_input(KEY_PWR_SWITICH, NRF_GPIO_PIN_PULLUP);//检测开关机信号
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : void open_acquisition_relay(void)
|
||||||
|
* description : 打开采样继电器
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void open_acquisition_relay(void)
|
||||||
|
{
|
||||||
|
nrf_gpio_pin_set(STIM_RMS_RELAY_PIN); //闭合继电器
|
||||||
|
nrf_gpio_pin_clear(STIM_RELAY_PIN); //打开刺激继电器
|
||||||
|
}
|
||||||
|
/********************************************************************
|
||||||
|
* name : void close_acquisition_relay(void)
|
||||||
|
* description : 关闭采样继电器
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void close_acquisition_relay(void)
|
||||||
|
{
|
||||||
|
nrf_gpio_pin_clear(STIM_RMS_RELAY_PIN);
|
||||||
|
nrf_gpio_pin_clear(STIM_RELAY_PIN);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : void open_stimulate_relay(void)
|
||||||
|
* description : 打开刺激继电器
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void open_stimulate_relay(void)
|
||||||
|
{
|
||||||
|
nrf_gpio_pin_clear(STIM_RMS_RELAY_PIN);
|
||||||
|
nrf_gpio_pin_set(STIM_RELAY_PIN);
|
||||||
|
}
|
||||||
|
/********************************************************************
|
||||||
|
* name : void close_stimulate_relay(void)
|
||||||
|
* description : 关闭刺激继电器
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void close_stimulate_relay(void)
|
||||||
|
{
|
||||||
|
nrf_gpio_pin_clear(STIM_RMS_RELAY_PIN);
|
||||||
|
nrf_gpio_pin_clear(STIM_RELAY_PIN);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : void StimStateInfoStructInit(SchemeData_t SchemeDataIn)
|
||||||
|
* description : 初始化通道信息描述结构体
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void StimStateInfoStructInit(SchemeData_t SchemeDataIn)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
// 设备预存信息初始化ID :101 腹直肌分离
|
||||||
|
void PreStorageSchemeDataInit(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void KeyPinHandler(void)
|
||||||
|
{
|
||||||
|
if(KeyStateInfo.shineng == true)
|
||||||
|
{
|
||||||
|
switch(KeyStateInfo.KeyPinNumber)
|
||||||
|
{
|
||||||
|
case KEY_PWR_SWITICH:
|
||||||
|
{
|
||||||
|
KEY_PWR_SWITICH_Handler();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
KeyStateInfo.shineng = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : void VariableInit(void)
|
||||||
|
* description : 初始化变量
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void VariableInit(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
/*************************** END OF FILE ***************************/
|
||||||
|
|
||||||
364
app/Src/drv_saadc.c
Normal file
364
app/Src/drv_saadc.c
Normal file
@ -0,0 +1,364 @@
|
|||||||
|
/********************************************************************
|
||||||
|
Copyright (c) 2021 Xiangyu Medical Co.,Ltd. All rights reserved.
|
||||||
|
FileName : drv_saadc.c
|
||||||
|
Author : zhangdawei
|
||||||
|
Version : V1.0
|
||||||
|
Date :
|
||||||
|
Note :
|
||||||
|
History :
|
||||||
|
********************************************************************/
|
||||||
|
/* Includes ------------------------------------------------------*/
|
||||||
|
#include "nrf_drv_ppi.h"
|
||||||
|
#include "app_timer.h"
|
||||||
|
#include "bsp_btn_ble.h"
|
||||||
|
#include "drv_saadc.h"
|
||||||
|
#include "timer.h"
|
||||||
|
#include "string.h"
|
||||||
|
#include "drv_uart.h"
|
||||||
|
#include "nrf_drv_ppi.h"
|
||||||
|
#include "IIR.h"
|
||||||
|
/* Private define ------------------------------------------------*/
|
||||||
|
/* Private typedef -----------------------------------------------*/
|
||||||
|
#define SAMPLES_BUFFER_LEN 10
|
||||||
|
/* Private constants ---------------------------------------------*/
|
||||||
|
//定义Timer1的驱动程序实例。驱动程序实例的ID对应Timer的ID,如NRF_DRV_TIMER_INSTANCE(1)对应Timer1
|
||||||
|
const nrfx_timer_t TIMER_ADC = NRF_DRV_TIMER_INSTANCE(4);
|
||||||
|
static nrf_ppi_channel_t m_ppi_channel5;
|
||||||
|
const nrfx_timer_t TIMER3_RMS = NRFX_TIMER_INSTANCE(3); //读取rms值的定时器3
|
||||||
|
static nrf_saadc_value_t m_buffer_pool[2][SAMPLES_BUFFER_LEN];
|
||||||
|
/* Private variables ---------------------------------------------*/
|
||||||
|
/* Private function prototypes -----------------------------------*/
|
||||||
|
/* Public constants ----------------------------------------------*/
|
||||||
|
/* Public variables ----------------------------------------------*/
|
||||||
|
//电池电压回调函数,堵塞模式,不需要事件,定义空的事件回调函数
|
||||||
|
void saadc_battery_callback(nrfx_saadc_evt_t const * p_event){}
|
||||||
|
//刺激反馈电压,堵塞模式,不需要事件,定义空的事件回调函数
|
||||||
|
void saadc_stimulate_callback(nrfx_saadc_evt_t const * p_event){}
|
||||||
|
/********************************************************************
|
||||||
|
* name : void battery_adc_init(void)
|
||||||
|
* description : ADC初始化,刺激电压检测、电池电压检测、电极脱落电压检测
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void battery_adc_init(void)
|
||||||
|
{
|
||||||
|
ret_code_t err_code;
|
||||||
|
|
||||||
|
//初始化SAADC,注册事件回调函数。空函数即可
|
||||||
|
err_code = nrf_drv_saadc_init(NULL, saadc_battery_callback);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
|
||||||
|
//配置通道1,输入引脚为AIN7,电池电压
|
||||||
|
nrf_saadc_channel_config_t channeltwo_config =
|
||||||
|
NRFX_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN7);
|
||||||
|
|
||||||
|
err_code = nrfx_saadc_channel_init(SAADC_BATTERY_CHANNEL, &channeltwo_config);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
|
||||||
|
// //配置通道2,输入引脚为AIN4,电极片脱落电压检测
|
||||||
|
// nrf_saadc_channel_config_t channelthree_config =
|
||||||
|
// NRFX_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN4);
|
||||||
|
|
||||||
|
// //初始化SAADC通道3
|
||||||
|
// err_code = nrfx_saadc_channel_init(SAADC_ELECTRODE_CHANNEL, &channelthree_config);
|
||||||
|
// APP_ERROR_CHECK(err_code);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 如需更高精度非线性计算(示例)
|
||||||
|
float nonlinear_percentage(float voltage) {
|
||||||
|
// 三元锂电池的典型放电曲线拟合多项式
|
||||||
|
float p = (voltage - 3.4f) / 0.8f; // 归一化到[0,1]
|
||||||
|
return 100 * (1.0f - 0.2f*p - 0.8f*p*p);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 锂电池电量计算函数
|
||||||
|
// 输入:当前电压(单位:伏特)
|
||||||
|
// 输出:电量百分比(0~100)
|
||||||
|
int calculate_battery_percentage(float voltage)
|
||||||
|
{
|
||||||
|
// 定义电压范围
|
||||||
|
const float VOLTAGE_MIN = 3.4f; // 0%电量对应电压
|
||||||
|
const float VOLTAGE_MAX = 4.195f; // 100%电量对应电压
|
||||||
|
|
||||||
|
// 边界检查
|
||||||
|
if (voltage <= VOLTAGE_MIN) {
|
||||||
|
return 0;
|
||||||
|
} else if (voltage >= VOLTAGE_MAX) {
|
||||||
|
return 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 线性插值计算百分比(可根据实际放电曲线修改算法)
|
||||||
|
float percentage = (voltage - VOLTAGE_MIN) / (VOLTAGE_MAX - VOLTAGE_MIN) * 100.0f;
|
||||||
|
|
||||||
|
// 四舍五入取整
|
||||||
|
return (int)(percentage + 0.5f);
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : void CalculateBatteryPower(void)
|
||||||
|
* description : 计算电池电量(0-100)
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return : void
|
||||||
|
********************************************************************/
|
||||||
|
|
||||||
|
void CalculateBatteryPower(void)
|
||||||
|
{
|
||||||
|
uint16_t Adctemp;
|
||||||
|
nrf_saadc_value_t Battery_Saadc_Value;
|
||||||
|
//启动一次ADC采样,存在Battery_Saadc_Value中
|
||||||
|
nrfx_saadc_sample_convert(SAADC_BATTERY_CHANNEL, &Battery_Saadc_Value);
|
||||||
|
|
||||||
|
Adctemp = ((Battery_Saadc_Value * 3600) / 16384);
|
||||||
|
|
||||||
|
static float lastBatteryPercentage = 100;
|
||||||
|
int temp = calculate_battery_percentage(Adctemp * 5.12557);
|
||||||
|
|
||||||
|
if(Uncharged == ChargeState) //如果没有处于充电状态,不允许电量上升,只能下降
|
||||||
|
{
|
||||||
|
if(temp < lastBatteryPercentage)
|
||||||
|
Battery_Percentage = temp;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Battery_Percentage = temp;
|
||||||
|
}
|
||||||
|
lastBatteryPercentage = Battery_Percentage;
|
||||||
|
}
|
||||||
|
|
||||||
|
short short_to_big_endian(short value)
|
||||||
|
{
|
||||||
|
uint8_t buf[2];
|
||||||
|
short resultShort;
|
||||||
|
buf[0] = (value >> 8) & 0xFF; // 高字节(Big-Endian 第一个字节)
|
||||||
|
buf[1] = value & 0xFF; // 低字节(Big-Endian 第二个字节)
|
||||||
|
memcpy(&resultShort,buf,2);
|
||||||
|
return resultShort;
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : void rms_saadc_callback(nrfx_saadc_evt_t const * p_event)
|
||||||
|
* description : 肌电采集SAADC事件回调函数,只有一个缓存填满后才会进入事件回调函数
|
||||||
|
* Input : nrfx_saadc_evt_t const * p_event:saadc事件
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
|
||||||
|
void rms_saadc_callback(nrfx_saadc_evt_t const * p_event)
|
||||||
|
{
|
||||||
|
static float32_t AdcFilter_g[AD_RAW_MAX] __attribute__((aligned(4)));
|
||||||
|
float32_t outFilter __attribute__((aligned(4)));
|
||||||
|
float32_t vol __attribute__((aligned(4)));
|
||||||
|
static emg_data_t emgData=
|
||||||
|
{
|
||||||
|
.emgCnt = 0
|
||||||
|
};
|
||||||
|
|
||||||
|
if(p_event->type == NRF_DRV_SAADC_EVT_DONE)
|
||||||
|
{
|
||||||
|
ret_code_t err_code;
|
||||||
|
err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_BUFFER_LEN);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i = 0; i < SAMPLES_BUFFER_LEN; i++)
|
||||||
|
{
|
||||||
|
if(p_event->data.done.p_buffer[i] < 0)
|
||||||
|
vol = 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vol = (p_event->data.done.p_buffer[i]*3600/16384) - 1545; //
|
||||||
|
}
|
||||||
|
bs_bp(&vol, &outFilter); //5.6us
|
||||||
|
if(emgData.emgCnt < AD_RAW_MAX) //防止溢出
|
||||||
|
AdcFilter_g[emgData.emgCnt] = outFilter;
|
||||||
|
|
||||||
|
emgData.emgCnt++;
|
||||||
|
if(emgData.emgCnt >= AD_RAW_MAX)
|
||||||
|
{
|
||||||
|
emgData.emgCnt=0;
|
||||||
|
float32_t temp __attribute__((aligned(4)));
|
||||||
|
arm_rms_f32(AdcFilter_g, AD_RAW_MAX, &temp);//6us
|
||||||
|
|
||||||
|
emgData.EmgValue = temp*0.8806 - 3.028;
|
||||||
|
if(emgData.EmgValue < 0)
|
||||||
|
emgData.EmgValue = 0;
|
||||||
|
// if(temp < 0)
|
||||||
|
// emgData.EmgValue = 0;
|
||||||
|
// else
|
||||||
|
// emgData.EmgValue = 0.6722 * temp + 3.7097;
|
||||||
|
|
||||||
|
uint16_t outfRms;
|
||||||
|
outfRms = (short)emgData.EmgValue;
|
||||||
|
outfRms = short_to_big_endian(outfRms);
|
||||||
|
ble_send_rms_data(outfRms);
|
||||||
|
}
|
||||||
|
|
||||||
|
//ble_send_rms_data(save_value[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void timer3_rms_handler(nrf_timer_event_t event_type, void* p_context)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : void timer3_rms_init(void)
|
||||||
|
* description : 定时器1初始化
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void timer3_rms_init(void)
|
||||||
|
{
|
||||||
|
uint32_t err_code = NRF_SUCCESS;
|
||||||
|
uint32_t time_us = 500; //采样频率2kHz
|
||||||
|
uint32_t time_ticks;
|
||||||
|
nrfx_timer_config_t timer3_cfg = NRFX_TIMER_DEFAULT_CONFIG;
|
||||||
|
err_code = nrfx_timer_init(&TIMER3_RMS, &timer3_cfg, timer3_rms_handler);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
time_ticks = nrfx_timer_us_to_ticks(&TIMER3_RMS, time_us);
|
||||||
|
nrfx_timer_extended_compare(
|
||||||
|
&TIMER3_RMS, NRF_TIMER_CC_CHANNEL0, time_ticks, NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK, true);
|
||||||
|
}
|
||||||
|
/********************************************************************
|
||||||
|
* name : void timer3_rms_start(void)
|
||||||
|
* description : 开启定时器1
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void timer3_rms_start(void)
|
||||||
|
{
|
||||||
|
nrfx_timer_enable(&TIMER3_RMS);
|
||||||
|
}
|
||||||
|
/********************************************************************
|
||||||
|
* name : void timer3_rms_stop(void)
|
||||||
|
* description : 停止定时器1
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void timer3_rms_stop(void)
|
||||||
|
{
|
||||||
|
nrfx_timer_disable(&TIMER3_RMS);
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : void PPIEegAdcInit(void)
|
||||||
|
* description : ADCPPI通道初始化
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void PPIEegAdcInit(void)
|
||||||
|
{
|
||||||
|
uint32_t err_code = NRF_SUCCESS;
|
||||||
|
|
||||||
|
err_code = nrf_drv_ppi_init();
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
|
||||||
|
//分配PPI通道,PPI通道的分配是由驱动函数完成的,分配的通道号保存到my_ppi_channel1中
|
||||||
|
err_code = nrf_drv_ppi_channel_alloc(&m_ppi_channel5);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
//分配PPI通道的EEP和TEP
|
||||||
|
err_code = nrf_drv_ppi_channel_assign(m_ppi_channel5,
|
||||||
|
nrf_drv_timer_event_address_get(&TIMER3_RMS, NRF_TIMER_EVENT_COMPARE0),
|
||||||
|
nrf_drv_saadc_sample_task_get());
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
//使能PPI通道
|
||||||
|
err_code = nrf_drv_ppi_channel_enable(m_ppi_channel5);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : void rms_saadc_init(void)
|
||||||
|
* description : 肌电采集saadc初始化
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void rms_saadc_init(void)
|
||||||
|
{
|
||||||
|
ret_code_t err_code;
|
||||||
|
nrf_drv_saadc_uninit(); //先反初始化
|
||||||
|
//配置通道0,输入引脚为AIN3,采集信号
|
||||||
|
nrf_saadc_channel_config_t channel_config =
|
||||||
|
NRFX_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN2);
|
||||||
|
//初始化SAADC,注册事件回调函数。
|
||||||
|
err_code = nrf_drv_saadc_init(NULL, rms_saadc_callback);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
//初始化SAADC通道0
|
||||||
|
err_code = nrfx_saadc_channel_init(SAADC_RMS_SAMPLE_CHANNEL, &channel_config);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
//配置缓存1,将缓存1地址赋值给SAADC驱动程序中的控制块m_cb的一级缓存指针
|
||||||
|
err_code = nrfx_saadc_buffer_convert(m_buffer_pool[0], SAMPLES_BUFFER_LEN);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
//配置缓存2,将缓存1地址赋值给SAADC驱动程序中的控制块m_cb的二级缓存指针
|
||||||
|
err_code = nrfx_saadc_buffer_convert(m_buffer_pool[1], SAMPLES_BUFFER_LEN);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 电极脱落检测
|
||||||
|
void ElectFallOff(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
/********************************************************************
|
||||||
|
* name : void timer4_output_ctrl_handler(nrf_timer_event_t event_type, void* p_context)
|
||||||
|
* description : 变压器电压读取、变压器开关控制、脱落检测、刺激自调节
|
||||||
|
* Input : nrf_timer_event_t event_type:定时器事件类型
|
||||||
|
void* p_context
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void timer1_output_ctrl_handler(nrf_timer_event_t event_type, void* p_context)
|
||||||
|
{
|
||||||
|
switch(event_type)
|
||||||
|
{
|
||||||
|
case NRF_TIMER_EVENT_COMPARE0:
|
||||||
|
//ElectFallOff();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/********************************************************************
|
||||||
|
* name : void timer1_output_ctrl_init(void)
|
||||||
|
* description : 输出控制定时器初始化
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void timer1_output_ctrl_init(void)
|
||||||
|
{
|
||||||
|
ret_code_t err_code = NRF_SUCCESS;
|
||||||
|
uint32_t time_us = 50;
|
||||||
|
uint32_t time_ticks;
|
||||||
|
|
||||||
|
nrfx_timer_config_t timer_cfg = NRFX_TIMER_DEFAULT_CONFIG;
|
||||||
|
|
||||||
|
err_code = nrfx_timer_init(&TIMER_ADC, &timer_cfg, timer1_output_ctrl_handler);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
|
||||||
|
//定时时间(单位us)转换为ticks
|
||||||
|
time_ticks = nrfx_timer_us_to_ticks(&TIMER_ADC, time_us);
|
||||||
|
//设置定时器捕获/比较通道及该通道的比较值,使能通道的比较中断
|
||||||
|
nrfx_timer_extended_compare(
|
||||||
|
&TIMER_ADC, NRF_TIMER_CC_CHANNEL0, time_ticks, NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK, true);
|
||||||
|
nrfx_timer_enable(&TIMER_ADC);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*************************** END OF FILE ***************************/
|
||||||
817
app/Src/drv_uart.c
Normal file
817
app/Src/drv_uart.c
Normal file
@ -0,0 +1,817 @@
|
|||||||
|
/********************************************************************
|
||||||
|
Copyright (c) 2021 Xiangyu Medical Co.,Ltd. All rights reserved.
|
||||||
|
FileName : drv_uart.c
|
||||||
|
Author : zhangdawei
|
||||||
|
Version : V1.0
|
||||||
|
Date :
|
||||||
|
Note :
|
||||||
|
History :
|
||||||
|
********************************************************************/
|
||||||
|
/* Includes ------------------------------------------------------*/
|
||||||
|
#include "drv_uart.h"
|
||||||
|
#include "pca10040.h"
|
||||||
|
#include "ble_nus.h"
|
||||||
|
#include "time.h"
|
||||||
|
#include "IoControl.h"
|
||||||
|
#include "nrf_drv_timer.h"
|
||||||
|
#include "fds.h"
|
||||||
|
/* Private define ------------------------------------------------*/
|
||||||
|
BLE_NUS_DEF(m_nus); //定义名称为m_nus的串口透传服务实例
|
||||||
|
/* Private typedef -----------------------------------------------*/
|
||||||
|
/* Private constants ---------------------------------------------*/
|
||||||
|
/* 接收到的方案信息 */
|
||||||
|
SchemeData_t SchemeData;
|
||||||
|
SchemeData_t PreStorageSchemeData;// 设备预存信息
|
||||||
|
uint16_t m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - 3; /**< Maximum length of data (in bytes) that can be transmitted to the peer by the Nordic UART service module. */
|
||||||
|
/* Private variables ---------------------------------------------*/
|
||||||
|
//该变量用于保存连接句柄,初始值设置为无连接
|
||||||
|
uint16_t m_conn_handle = BLE_CONN_HANDLE_INVALID;
|
||||||
|
/* 电池电量的原始值 */
|
||||||
|
nrf_saadc_value_t Battery_Saadc_Value = 10000;
|
||||||
|
/* 电池电压百分比 */
|
||||||
|
uint8_t Battery_Percentage = 100;
|
||||||
|
/* 肌电采集定时器初始化标志 */
|
||||||
|
uint8_t TimerEegAdcInit_Flag = 0;
|
||||||
|
/* 控制电流标志 */
|
||||||
|
uint8_t CurrentFlag = 0;
|
||||||
|
/* 设备的连接状态 */
|
||||||
|
ConnectStateInfo_e DeviceConnectState = DisconnectState;
|
||||||
|
ElectrodeStatusInfo_e ElectrodeStatusInfo = ElectrodeConnectted;
|
||||||
|
ElectrodeStatusInfo_e LastElectrodeStatusInfo = ElectrodeConnectted;
|
||||||
|
/* 适配器连接状态 */
|
||||||
|
AdapterStateInfo_e AdapterState = AdapterNotConnected;
|
||||||
|
AdapterStateInfo_e LastAdapterState = AdapterNotConnected;
|
||||||
|
|
||||||
|
/* MAC地址数组 */
|
||||||
|
uint8_t BLE_MAC[BLE_GAP_ADDR_LEN];
|
||||||
|
//定义FDS异步操作标志结构体
|
||||||
|
my_fds_info_t my_fds_info;
|
||||||
|
// 初始化参数信息
|
||||||
|
SchemePara_t SchemePara = {
|
||||||
|
.text = 0
|
||||||
|
};
|
||||||
|
uint16_t ccrvaluebuf[70] = {
|
||||||
|
23,25,27,29,31,33,35,37,39,41, //1-10
|
||||||
|
43,45,47,50,52,54,56,58,60,63, //11-20
|
||||||
|
65,67,69,71,74,76,78,80,82,85, //21-30
|
||||||
|
87,89,91,93,95,97,99,101,103,105, //31-40
|
||||||
|
108,111,114,117,120,123,126,129,132,134, //41-50
|
||||||
|
136,138,140,142,144,146,148,150,152,154, //51-60
|
||||||
|
155,156,158,160,162,164,167,170,172,174 //61-70
|
||||||
|
};
|
||||||
|
#define EEG_DATA_LENGTH ( 50 )
|
||||||
|
uint8_t aEEGData[EEG_DATA_LENGTH] = {
|
||||||
|
23,25,27,29,31,33,35,37,39,41,
|
||||||
|
43,45,47,50,52,54,56,58,60,63,
|
||||||
|
65,67,69,71,74,76,78,80,82,85,
|
||||||
|
87,89,91,93,95,97,99,101,103,105,
|
||||||
|
108,111,114,117,120,123,126,129,132,134
|
||||||
|
};
|
||||||
|
uint8_t eegmode = 0;
|
||||||
|
uint8_t eegflag = 0;
|
||||||
|
|
||||||
|
StimStateInfo_t ChannelStimStateInfo_t;
|
||||||
|
|
||||||
|
rms_data_t rmsData = {.frameHeader = FRAME_HEADER,
|
||||||
|
.frameLength = sizeof(rmsData) - 4, //减去帧头、帧长度、校验和、帧尾
|
||||||
|
.functionCode = D_EMG_DATA_REPORT,
|
||||||
|
.myNumber = 0x01,
|
||||||
|
.channel = 0x01,
|
||||||
|
//.rmsDataBuffer = {0},
|
||||||
|
.checkSum = 0,
|
||||||
|
.frameTail = FRAME_TAIL
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Private function prototypes -----------------------------------*/
|
||||||
|
void StatusInquiry(ElectrodeStatusInfo_e Electrodestatus);
|
||||||
|
void StartStopCtrl(uint8_t StartStopValue);
|
||||||
|
void MACQuery(void);
|
||||||
|
/* Public constants ----------------------------------------------*/
|
||||||
|
/* Public variables ----------------------------------------------*/
|
||||||
|
/********************************************************************
|
||||||
|
* name : void SetFreqWidth(uint8_t* AnalysisDataBffer_t)
|
||||||
|
* description : 设置脉冲频率
|
||||||
|
* Input : AnalysisDataBffer_t:接收到的数据缓冲区
|
||||||
|
* Output : void
|
||||||
|
* Return : void
|
||||||
|
********************************************************************/
|
||||||
|
void SetFreqWidth(uint8_t* AnalysisDataBffer_t)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
/********************************************************************
|
||||||
|
* name : void SetRampTime(uint8_t* AnalysisDataBfferIn_t)
|
||||||
|
* description : 设置斜坡时间
|
||||||
|
* Input : AnalysisDataBffer_t:接收到的数据缓冲区
|
||||||
|
* Output : void
|
||||||
|
* Return : void
|
||||||
|
********************************************************************/
|
||||||
|
void SetRampTime(uint8_t* AnalysisDataBffer_t)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
/********************************************************************
|
||||||
|
* name : void SetStimPara(uint8_t* AnalysisDataBfferIn_t)
|
||||||
|
* description : 设置刺激参数
|
||||||
|
* Input : AnalysisDataBffer_t:接收到的数据缓冲区
|
||||||
|
* Output : void
|
||||||
|
* Return : void
|
||||||
|
********************************************************************/
|
||||||
|
void SetStimPara(uint8_t* AnalysisDataBffer_t)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
//开启采集模式
|
||||||
|
if(1 == AnalysisDataBffer_t[4])
|
||||||
|
{
|
||||||
|
eegmode = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
/********************************************************************
|
||||||
|
* name : static void nus_data_handler(ble_nus_evt_t * p_evt)
|
||||||
|
* description : BLE串口透传事件回调函数
|
||||||
|
* Input : ble_nus_evt_t * p_evt:发生的事件
|
||||||
|
* Output : void
|
||||||
|
* Return : void
|
||||||
|
********************************************************************/
|
||||||
|
static void nus_data_handler(ble_nus_evt_t * p_evt)
|
||||||
|
{
|
||||||
|
uint8_t FrameLength = 0;//帧长度
|
||||||
|
uint8_t FunctionCode = 0;//功能码
|
||||||
|
uint8_t CheckSum = 0;//校验和
|
||||||
|
uint8_t Sum = 0;//数据和
|
||||||
|
uint8_t SumCCR = 0;//CCR值
|
||||||
|
#define RX_BLE_DATA_LEN 100
|
||||||
|
uint8_t RecieveData[RX_BLE_DATA_LEN] = {0}; //接收数据帧的数组
|
||||||
|
|
||||||
|
if(p_evt->type == BLE_NUS_EVT_RX_DATA)
|
||||||
|
{
|
||||||
|
uint16_t Length = 0;
|
||||||
|
|
||||||
|
Length = p_evt->params.rx_data.length;
|
||||||
|
if(Length > RX_BLE_DATA_LEN)
|
||||||
|
{
|
||||||
|
NRF_LOG_ERROR("RecieveData length error");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memcpy(RecieveData, p_evt->params.rx_data.p_data, Length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 解析蓝牙收到的数据 */
|
||||||
|
if(0xAA == RecieveData[0])
|
||||||
|
{
|
||||||
|
FrameLength = RecieveData[1]; //帧长度
|
||||||
|
if(FrameLength > (RX_BLE_DATA_LEN - 4))
|
||||||
|
{
|
||||||
|
NRF_LOG_ERROR("RecieveData length error %d", FrameLength);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if(0x55 != RecieveData[FrameLength + 3]) //查找帧尾
|
||||||
|
{
|
||||||
|
NRF_LOG_ERROR("RecieveData end flag error");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
CheckSum = RecieveData[FrameLength + 2]; //校验和
|
||||||
|
//if(0x55 == RecieveData[FrameLength + 3]) //查找帧尾
|
||||||
|
{
|
||||||
|
/*校验数据包*/
|
||||||
|
for(uint8_t i = 0; i < FrameLength; i++)
|
||||||
|
{
|
||||||
|
Sum += RecieveData[i+2];
|
||||||
|
}
|
||||||
|
SumCCR = Sum & 0xff;
|
||||||
|
|
||||||
|
if(CheckSum == SumCCR)
|
||||||
|
{
|
||||||
|
FunctionCode = RecieveData[2];
|
||||||
|
|
||||||
|
/*模式、脉宽、频率、斜坡时间设置*/
|
||||||
|
if(STIM_PARA_CONTROL == FunctionCode)
|
||||||
|
{
|
||||||
|
SetStimPara(RecieveData); //设置参数
|
||||||
|
ble_nus_data_send(&m_nus, RecieveData, &Length, m_conn_handle);//将收到的数据回复回去
|
||||||
|
}
|
||||||
|
/*电流控制 (控制刺激强度)*/
|
||||||
|
else if(CURRENT_CONTROL == FunctionCode)
|
||||||
|
{
|
||||||
|
NRF_LOG_INFO("CURRENT_CONTROL");
|
||||||
|
|
||||||
|
// SetStandardCurrent(RecieveData); //设置电流
|
||||||
|
// CurrentFlag = 1; //设置电流的标志,此标志为1时表示可以输出电流
|
||||||
|
ble_nus_data_send(&m_nus, RecieveData, &Length, m_conn_handle);//将收到的数据回复回去
|
||||||
|
}
|
||||||
|
/*刺激启停控制*/
|
||||||
|
else if(START_STOP_CONTROL == FunctionCode)
|
||||||
|
{
|
||||||
|
NRF_LOG_INFO("START_STOP_CONTROL");
|
||||||
|
// CurrentFlag = 0; //此标志清0,此时开启电流的标志由通道模式和通道状态控制
|
||||||
|
uint8_t StartStopValue = CH_STOP; //初始状态为停止
|
||||||
|
StartStopValue = RecieveData[StartStopOffset]; //设置启停状态
|
||||||
|
StartStopCtrl(StartStopValue); //启停控制
|
||||||
|
ble_nus_data_send(&m_nus, RecieveData, &Length, m_conn_handle);//将收到的数据回复回去
|
||||||
|
}
|
||||||
|
/*触发采集开始*/
|
||||||
|
else if(TRIG_COLLECT_START_CONTROL == FunctionCode)
|
||||||
|
{
|
||||||
|
NRF_LOG_INFO("TRIG_COLLECT_START_CONTROL");
|
||||||
|
ble_nus_data_send(&m_nus, RecieveData, &Length, m_conn_handle);//将收到的数据回复回去
|
||||||
|
}
|
||||||
|
/*触发刺激开始*/
|
||||||
|
else if(TRIG_STIM_START_CONTROL == FunctionCode)
|
||||||
|
{
|
||||||
|
NRF_LOG_INFO("TRIG_STIM_START_CONTROL");
|
||||||
|
ble_nus_data_send(&m_nus, RecieveData, &Length, m_conn_handle);//将收到的数据回复回去
|
||||||
|
}
|
||||||
|
/*轮询0x8A*/
|
||||||
|
else if(STATUS_INQUIRY == FunctionCode)
|
||||||
|
{
|
||||||
|
StatusInquiry(ElectrodeStatusInfo);
|
||||||
|
NRF_LOG_INFO("STATUS_INQUIRY");
|
||||||
|
}
|
||||||
|
/* 运行轮询 */
|
||||||
|
else if(RUN_ROLL == FunctionCode)
|
||||||
|
{
|
||||||
|
RunRoll();
|
||||||
|
NRF_LOG_INFO("RUN_ROLL");
|
||||||
|
}
|
||||||
|
/* 版本查询 */
|
||||||
|
else if(VERSION_INQUIRY == FunctionCode)
|
||||||
|
{
|
||||||
|
CheckVersion();
|
||||||
|
NRF_LOG_INFO("VERSION_INQUIRY");
|
||||||
|
}
|
||||||
|
else if(SCHEME_QUERY == FunctionCode)
|
||||||
|
{
|
||||||
|
//SchemeQuery();
|
||||||
|
my_fds_info.read = true;
|
||||||
|
NRF_LOG_INFO("SCHEME_QUERY");
|
||||||
|
}
|
||||||
|
else if(MAC_QUERY == FunctionCode)
|
||||||
|
{
|
||||||
|
MACQuery();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/***********end***********/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/********************************************************************
|
||||||
|
* name : void service_nus_init(void)
|
||||||
|
* description : 串口透传服务初始化
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return : void
|
||||||
|
********************************************************************/
|
||||||
|
void service_nus_init(void)
|
||||||
|
{
|
||||||
|
ret_code_t err_code;
|
||||||
|
ble_nus_init_t nus_init; //定义串口透传初始化结构体
|
||||||
|
/*------------------以下代码初始化串口透传服务-------------*/
|
||||||
|
memset(&nus_init, 0, sizeof(nus_init)); //清零串口透传服务初始化结构体
|
||||||
|
nus_init.data_handler = nus_data_handler; //设置串口透传事件回调函数
|
||||||
|
err_code = ble_nus_init(&m_nus, &nus_init); //初始化串口透传服务
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
/*------------------初始化串口透传服务-END-----------------*/
|
||||||
|
}
|
||||||
|
/********************************************************************
|
||||||
|
* name : void StartStopCtrl(uint8_t ucStartStopValueIn)
|
||||||
|
* description : 启、停控制处理函数
|
||||||
|
* Input : ucStartStopValueIn:启、停控制值
|
||||||
|
ucChannelIn:通道号
|
||||||
|
* Output : void
|
||||||
|
* Return : void
|
||||||
|
********************************************************************/
|
||||||
|
void StartStopCtrl(uint8_t StartStopValue)
|
||||||
|
{
|
||||||
|
switch(StartStopValue)
|
||||||
|
{
|
||||||
|
case CH_START: StartManage();
|
||||||
|
break;
|
||||||
|
case CH_PAUSE: PauseManage();
|
||||||
|
break;
|
||||||
|
case CH_CONTINUE: RecoverManage();
|
||||||
|
break;
|
||||||
|
case CH_STOP: StopManage();
|
||||||
|
break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/********************************************************************
|
||||||
|
* name : void StartManage(void)
|
||||||
|
* description : 开始处理函数
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return : void
|
||||||
|
********************************************************************/
|
||||||
|
void StartManage(void)
|
||||||
|
{
|
||||||
|
if(eegmode == 1)
|
||||||
|
{
|
||||||
|
eegflag = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
/********************************************************************
|
||||||
|
* name : void PauseManage(void)
|
||||||
|
* description : 暂停处理函数
|
||||||
|
* Input : Channel:通道号
|
||||||
|
* Output : void
|
||||||
|
* Return : void
|
||||||
|
********************************************************************/
|
||||||
|
void PauseManage(void)
|
||||||
|
{
|
||||||
|
if(eegmode == 1)
|
||||||
|
{
|
||||||
|
eegflag = 0;
|
||||||
|
}
|
||||||
|
// CHAChannelState_e = IdleState; //设置状态为空闲态,空闲状态下pwm_flag置0
|
||||||
|
// ChannelStimStateInfo_t.ChannelWorkState = Pause;
|
||||||
|
// PwmDACStop();
|
||||||
|
// CloseOutput(); //关闭输出
|
||||||
|
// NRF_LOG_INFO("Pause_Stim");
|
||||||
|
}
|
||||||
|
/********************************************************************
|
||||||
|
* name : void CloseOutput(void)
|
||||||
|
* description : 将输出电流置0,斜坡时间置0,关闭输出PWM
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return : void
|
||||||
|
********************************************************************/
|
||||||
|
void CloseOutput(void)
|
||||||
|
{
|
||||||
|
if(eegmode == 1)
|
||||||
|
{
|
||||||
|
eegmode = 0;
|
||||||
|
eegflag = 0;
|
||||||
|
}
|
||||||
|
//ChannelStimStateInfo_t.ucCurrent = 0;
|
||||||
|
// ChannelStimStateInfo_t.Ramp_e = RampIdle;//斜坡状态为空闲态
|
||||||
|
// RampTime = 0; //斜坡时间清0
|
||||||
|
// SetCurrent(0); //设置输出电流为0
|
||||||
|
// PwmSubtractStop(); //关闭输出PWM
|
||||||
|
// PwmDACStop(); //停止充能PWM
|
||||||
|
//// GpioteInit();
|
||||||
|
}
|
||||||
|
/********************************************************************
|
||||||
|
* name : void RecoverManage(void)
|
||||||
|
* description : 继续处理函数
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return : void
|
||||||
|
********************************************************************/
|
||||||
|
void RecoverManage(void)
|
||||||
|
{
|
||||||
|
if(eegmode == 1)
|
||||||
|
{
|
||||||
|
eegflag = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
/********************************************************************
|
||||||
|
* name : void StopManage(void)
|
||||||
|
* description : 停止处理函数
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return : void
|
||||||
|
********************************************************************/
|
||||||
|
void StopManage(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : void SetStandardCurrent(uint8_t* AnalysisDataBfferIn_t)
|
||||||
|
* description : 设置标称电流值
|
||||||
|
* Input : AnalysisDataBfferIn_t:接收到的数据缓冲区
|
||||||
|
* Output : void
|
||||||
|
* Return : void
|
||||||
|
********************************************************************/
|
||||||
|
void SetStandardCurrent(uint8_t* AnalysisDataBffer_t)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
/********************************************************************
|
||||||
|
* name : void StatusInquiry(void)
|
||||||
|
* description : 状态轮询
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return : void
|
||||||
|
********************************************************************/
|
||||||
|
void StatusInquiry(ElectrodeStatusInfo_e Electrodestatus)
|
||||||
|
{
|
||||||
|
uint8_t j = 2;
|
||||||
|
static uint8_t aTxBuffer[10] = {0};
|
||||||
|
uint32_t ulCrc = 0;
|
||||||
|
uint16_t Length = 10;
|
||||||
|
|
||||||
|
/* 帧头、帧尾*/
|
||||||
|
aTxBuffer[HeadOffset] = 0xAA;
|
||||||
|
aTxBuffer[DataLengthOffset] = 0x06;
|
||||||
|
aTxBuffer[FunctionCodeOffset] = STATUS_INQUIRY;
|
||||||
|
aTxBuffer[ChannelNumOffset] = 0x00;
|
||||||
|
aTxBuffer[ElectrodeStatusOffset] = 0x01;
|
||||||
|
aTxBuffer[StimStatusOffset] = ChannelStimStateInfo_t.Ramp_e;
|
||||||
|
aTxBuffer[StimCurrentOffset] = ChannelStimStateInfo_t.ucCurrent;
|
||||||
|
aTxBuffer[ResetOffset] = 0x00;
|
||||||
|
aTxBuffer[TailOffset] = 0x55;
|
||||||
|
|
||||||
|
/* 校验和 */
|
||||||
|
for(uint8_t i = 0; i < 6; i++)
|
||||||
|
{
|
||||||
|
ulCrc += aTxBuffer[j];
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
aTxBuffer[DataCrcOffset] = (uint8_t)ulCrc;
|
||||||
|
|
||||||
|
ble_nus_data_send(&m_nus, aTxBuffer, &Length, m_conn_handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : uint8_t caculate_sum_check(void)
|
||||||
|
* description : 运行校验和计算
|
||||||
|
* Input : typeStructHeader:数据结构头部
|
||||||
|
typeStructLength:数据结构长度
|
||||||
|
* Output : void
|
||||||
|
* Return : 计算结果
|
||||||
|
********************************************************************/
|
||||||
|
|
||||||
|
uint8_t caculate_sum_check(uint8_t *typeStructHeader, uint8_t typeStructLength)
|
||||||
|
{
|
||||||
|
uint8_t sum = 0;
|
||||||
|
uint8_t * typeStructCMD = &typeStructHeader[2];
|
||||||
|
for (uint8_t i = 0; i < typeStructLength; i++)
|
||||||
|
{
|
||||||
|
sum += typeStructCMD[i];
|
||||||
|
}
|
||||||
|
return sum&0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief 运行状态回复
|
||||||
|
reply_run_status_t replyRunStatus = {
|
||||||
|
.frameHeader = FRAME_HEADER,
|
||||||
|
.frameLength = sizeof(replyRunStatus) - 4, //减去帧头、帧长度、校验和、帧尾
|
||||||
|
.functionCode = RUN_ROLL,
|
||||||
|
.myNumber = 0x01,
|
||||||
|
.channel = 0x01,
|
||||||
|
.checkSum = 0,
|
||||||
|
.frameTail = FRAME_TAIL
|
||||||
|
};
|
||||||
|
/********************************************************************
|
||||||
|
* name : void RunRoll(void)
|
||||||
|
* description : 运行轮询
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return : void
|
||||||
|
********************************************************************/
|
||||||
|
void RunRoll(void)
|
||||||
|
{
|
||||||
|
uint32_t ulCrc = 0;
|
||||||
|
uint16_t Length = sizeof(replyRunStatus);
|
||||||
|
|
||||||
|
replyRunStatus.ChargeState = ChargeState;
|
||||||
|
replyRunStatus.BatteryLevelA = Battery_Percentage;
|
||||||
|
|
||||||
|
replyRunStatus.checkSum = (uint8_t)caculate_sum_check((uint8_t *)&replyRunStatus, replyRunStatus.frameLength);
|
||||||
|
|
||||||
|
ble_nus_data_send(&m_nus, &replyRunStatus.frameHeader, &Length, m_conn_handle);
|
||||||
|
}
|
||||||
|
/********************************************************************
|
||||||
|
* name : void CheckVersion(void)
|
||||||
|
* description : 版本查询
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return : void
|
||||||
|
********************************************************************/
|
||||||
|
check_version_t checkVersion = {
|
||||||
|
.frameHeader = FRAME_HEADER,
|
||||||
|
.frameLength = sizeof(checkVersion) - 4, //减去帧头、帧长度、校验和、帧尾
|
||||||
|
.functionCode = VERSION_INQUIRY,
|
||||||
|
.myNumber = 0x01,
|
||||||
|
.channel = 0x01,
|
||||||
|
.checkSum = 0,
|
||||||
|
.frameTail = FRAME_TAIL
|
||||||
|
}
|
||||||
|
void CheckVersion(void)
|
||||||
|
{
|
||||||
|
uint8_t j = 2;
|
||||||
|
static uint8_t aTxBuffer[21] = {0};
|
||||||
|
uint32_t ulCrc = 0;
|
||||||
|
uint16_t Length = 21;
|
||||||
|
|
||||||
|
/* 帧头、帧尾*/
|
||||||
|
aTxBuffer[HeadOffset] = 0xAA;
|
||||||
|
aTxBuffer[DataLengthOffset] = 0x11;
|
||||||
|
aTxBuffer[FunctionCodeOffset] = VERSION_INQUIRY;
|
||||||
|
aTxBuffer[ChannelNumOffset] = 0x00;
|
||||||
|
aTxBuffer[20] = 0x55;
|
||||||
|
|
||||||
|
/* 协议中规定先发送高字节,后发送低字节 */
|
||||||
|
aTxBuffer[4] = VersionDes[0];
|
||||||
|
aTxBuffer[5] = VersionDes[1];
|
||||||
|
aTxBuffer[6] = VersionDes[2];
|
||||||
|
aTxBuffer[7] = VersionDes[3];
|
||||||
|
aTxBuffer[8] = VersionDes[4];
|
||||||
|
aTxBuffer[9] = VersionDes[5];
|
||||||
|
aTxBuffer[10] = VersionDes[6];
|
||||||
|
aTxBuffer[11] = VersionDes[7];
|
||||||
|
aTxBuffer[12] = 0x00;
|
||||||
|
aTxBuffer[13] = 0x00;
|
||||||
|
aTxBuffer[14] = 0x00;
|
||||||
|
aTxBuffer[15] = 0x00;
|
||||||
|
aTxBuffer[16] = 0x00;
|
||||||
|
aTxBuffer[17] = 0x00;
|
||||||
|
aTxBuffer[18] = 0x00;
|
||||||
|
/* 校验和 */
|
||||||
|
for(uint8_t i = 0; i < 17; i++)
|
||||||
|
{
|
||||||
|
ulCrc += aTxBuffer[j];
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
aTxBuffer[19] = (uint8_t)ulCrc;
|
||||||
|
ble_nus_data_send(&m_nus, aTxBuffer, &Length, m_conn_handle);
|
||||||
|
}
|
||||||
|
/********************************************************************
|
||||||
|
* name : void EegDataSend(void)
|
||||||
|
* description : 发送肌电数据
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return : void
|
||||||
|
********************************************************************/
|
||||||
|
void EegDataSend(void)
|
||||||
|
{
|
||||||
|
uint8_t j = 2;
|
||||||
|
|
||||||
|
static uint8_t aTxBuffer[EEG_DATA_LENGTH+6] = {0};
|
||||||
|
uint32_t ulCrc = 0;
|
||||||
|
uint16_t Length = EEG_DATA_LENGTH+6;
|
||||||
|
ret_code_t err_code;
|
||||||
|
|
||||||
|
/* 帧头、帧尾*/
|
||||||
|
aTxBuffer[HeadOffset] = 0xAA;
|
||||||
|
aTxBuffer[DataLengthOffset] = 0x34;
|
||||||
|
aTxBuffer[FunctionCodeOffset] = EEG_DATA;
|
||||||
|
aTxBuffer[ChannelNumOffset] = 0x00;
|
||||||
|
aTxBuffer[EEG_DATA_LENGTH+5] = 0x55;
|
||||||
|
|
||||||
|
/* 协议中规定先发送高字节,后发送低字节 */
|
||||||
|
memcpy(&aTxBuffer[4],aEEGData,EEG_DATA_LENGTH);
|
||||||
|
|
||||||
|
/* 校验和 */
|
||||||
|
for(uint8_t i = 0; i < EEG_DATA_LENGTH+2; i++)
|
||||||
|
{
|
||||||
|
ulCrc += aTxBuffer[j];
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
aTxBuffer[EEG_DATA_LENGTH+4] = (uint8_t)ulCrc;
|
||||||
|
ble_nus_data_send(&m_nus, aTxBuffer, &Length, m_conn_handle);
|
||||||
|
}
|
||||||
|
/********************************************************************
|
||||||
|
* name : void UpdateCurrent(uint8_t CurrentSend)
|
||||||
|
* description : 同步电流
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return : void
|
||||||
|
********************************************************************/
|
||||||
|
void UpdateCurrent(uint8_t CurrentSend)
|
||||||
|
{
|
||||||
|
uint8_t j = 2;
|
||||||
|
uint8_t aTxBuffer[8] = {0};
|
||||||
|
uint32_t ulCrc = 0;
|
||||||
|
uint16_t Length = 8;
|
||||||
|
|
||||||
|
/* 帧头、帧尾*/
|
||||||
|
aTxBuffer[HeadOffset] = 0xAA;
|
||||||
|
aTxBuffer[DataLengthOffset] = 0x04;
|
||||||
|
aTxBuffer[FunctionCodeOffset] = CURRENT_CONTROL;
|
||||||
|
aTxBuffer[ChannelNumOffset] = 0x00;
|
||||||
|
aTxBuffer[7] = 0x55;
|
||||||
|
|
||||||
|
/* 协议中规定先发送高字节,后发送低字节 */
|
||||||
|
aTxBuffer[4] = CurrentSend;
|
||||||
|
aTxBuffer[5] = 0x01; // 01代表蓝牙设备发送
|
||||||
|
|
||||||
|
/* 校验和 */
|
||||||
|
for(uint8_t i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
ulCrc += aTxBuffer[j];
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
aTxBuffer[6] = (uint8_t)ulCrc;
|
||||||
|
ble_nus_data_send(&m_nus, aTxBuffer, &Length, m_conn_handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void user_ble_or_uart_send(char * txBufferP, uint16_t Length)
|
||||||
|
{
|
||||||
|
ble_nus_data_send(&m_nus, txBufferP, &Length, m_conn_handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : void ble_send_rms_data(uint16_t rms_data)
|
||||||
|
* description : 发送肌电数据到主机
|
||||||
|
* Input : uint16_t rms_data:肌电数据
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void ble_send_rms_data(uint16_t rms_data)
|
||||||
|
{
|
||||||
|
uint32_t TempSum = 0;
|
||||||
|
|
||||||
|
static uint8_t sendCnt = 0;
|
||||||
|
|
||||||
|
if(sendCnt < RMS_USER_DATA_LENGTH)
|
||||||
|
{
|
||||||
|
rmsData.rmsDataBuffer[sendCnt] = rms_data; //将rms_data存入rmsData的rmsDataBuffer数组中
|
||||||
|
sendCnt++;
|
||||||
|
if(sendCnt < RMS_USER_DATA_LENGTH)
|
||||||
|
return ; //如果发送次数小于RMS_USER_DATA_LENGTH,则不发送
|
||||||
|
}
|
||||||
|
sendCnt = 0; //发送次数达到RMS_USER_DATA_LENGTH后,重置发送次数
|
||||||
|
rmsData.myNumber = 1;
|
||||||
|
//rmsData.myNumber++;
|
||||||
|
uint8_t * sumCheckStartP = (uint8_t *)&rmsData.functionCode;
|
||||||
|
for(uint8_t i = 0; i < rmsData.frameLength; i++)
|
||||||
|
{
|
||||||
|
TempSum += sumCheckStartP[i];
|
||||||
|
}
|
||||||
|
rmsData.checkSum = TempSum & 0xff;
|
||||||
|
user_ble_or_uart_send((uint8_t *)&rmsData, sizeof(rmsData)); //145us
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : void StateUpLoad(AdapterStateInfo_e AdapterStateTemp , ElectrodeStatusInfo_e ElectrodeStatusTemp)
|
||||||
|
* description : 电极片和适配器状态上传
|
||||||
|
* Input : AdapterStateInfo_e AdapterStateTemp , ElectrodeStatusInfo_e ElectrodeStatusTemp
|
||||||
|
* Output : void
|
||||||
|
* Return : void
|
||||||
|
********************************************************************/
|
||||||
|
void StateUpLoad(AdapterStateInfo_e AdapterStateTemp , ElectrodeStatusInfo_e ElectrodeStatusTemp)
|
||||||
|
{
|
||||||
|
uint8_t j = 2;
|
||||||
|
uint8_t aTxBuffer[8] = {0};
|
||||||
|
uint32_t ulCrc = 0;
|
||||||
|
uint16_t Length = 8;
|
||||||
|
|
||||||
|
AdapterStateInfo_e AdapterStateIn;
|
||||||
|
ElectrodeStatusInfo_e ElectrodeStatusIn;
|
||||||
|
|
||||||
|
AdapterStateIn = AdapterStateTemp;
|
||||||
|
ElectrodeStatusIn = ElectrodeStatusTemp;
|
||||||
|
|
||||||
|
/* 帧头、帧尾*/
|
||||||
|
aTxBuffer[HeadOffset] = 0xAA;
|
||||||
|
aTxBuffer[DataLengthOffset] = 0x04;
|
||||||
|
aTxBuffer[FunctionCodeOffset] = STATE_UPLOAD;
|
||||||
|
aTxBuffer[ChannelNumOffset] = 0x00;
|
||||||
|
aTxBuffer[7] = 0x55;
|
||||||
|
|
||||||
|
aTxBuffer[4] = AdapterStateIn; // 适配器连接状态
|
||||||
|
aTxBuffer[5] = ElectrodeStatusIn; // 电极片状态
|
||||||
|
|
||||||
|
if(ElectrodeStatusIn == ElectrodeFalloff)
|
||||||
|
{
|
||||||
|
|
||||||
|
ElectrodeStatusInfo = ElectrodeConnectted;
|
||||||
|
}
|
||||||
|
|
||||||
|
NRF_LOG_INFO("Electrodestatus = %d",ElectrodeStatusIn);
|
||||||
|
/* 校验和 */
|
||||||
|
for(uint8_t i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
ulCrc += aTxBuffer[j];
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
aTxBuffer[6] = (uint8_t)ulCrc;
|
||||||
|
ble_nus_data_send(&m_nus, aTxBuffer, &Length, m_conn_handle);
|
||||||
|
}
|
||||||
|
/********************************************************************
|
||||||
|
* name : void UpdateControlStatus(uint8_t ControlStatus)
|
||||||
|
* description : 同步电流
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return : void
|
||||||
|
********************************************************************/
|
||||||
|
void UpdateControlStatus(uint8_t ControlStatus)
|
||||||
|
{
|
||||||
|
uint8_t j = 2;
|
||||||
|
uint8_t aTxBuffer[8] = {0};
|
||||||
|
uint32_t ulCrc = 0;
|
||||||
|
uint16_t Length = 8;
|
||||||
|
|
||||||
|
/* 帧头、帧尾*/
|
||||||
|
aTxBuffer[HeadOffset] = 0xAA;
|
||||||
|
aTxBuffer[DataLengthOffset] = 0x04;
|
||||||
|
aTxBuffer[FunctionCodeOffset] = START_STOP_CONTROL;
|
||||||
|
aTxBuffer[ChannelNumOffset] = 0x00;
|
||||||
|
aTxBuffer[7] = 0x55;
|
||||||
|
|
||||||
|
/* 协议中规定先发送高字节,后发送低字节 */
|
||||||
|
aTxBuffer[4] = ControlStatus;
|
||||||
|
aTxBuffer[5] = 0x01; // 01代表蓝牙设备发送
|
||||||
|
|
||||||
|
/* 校验和 */
|
||||||
|
for(uint8_t i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
ulCrc += aTxBuffer[j];
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
aTxBuffer[6] = (uint8_t)ulCrc;
|
||||||
|
ble_nus_data_send(&m_nus, aTxBuffer, &Length, m_conn_handle);
|
||||||
|
}
|
||||||
|
/********************************************************************
|
||||||
|
* name : void SchemeQuery(uint8_t idMSB,uint8_t idLSB)
|
||||||
|
* description : 方案查询
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return : void
|
||||||
|
********************************************************************/
|
||||||
|
void SchemeQuery(uint8_t idMSB,uint8_t idLSB)
|
||||||
|
{
|
||||||
|
uint8_t j = 2;
|
||||||
|
static uint8_t aTxBuffer[8] = {0};
|
||||||
|
uint32_t ulCrc = 0;
|
||||||
|
uint16_t Length = 8;
|
||||||
|
|
||||||
|
/* 帧头、帧尾*/
|
||||||
|
aTxBuffer[HeadOffset] = 0xAA;
|
||||||
|
aTxBuffer[DataLengthOffset] = 0x04;
|
||||||
|
aTxBuffer[FunctionCodeOffset] = SCHEME_QUERY;
|
||||||
|
aTxBuffer[ChannelNumOffset] = 0x00;
|
||||||
|
aTxBuffer[7] = 0x55;
|
||||||
|
|
||||||
|
/* 协议中规定先发送高字节,后发送低字节 */
|
||||||
|
aTxBuffer[4] = idMSB;
|
||||||
|
aTxBuffer[5] = idLSB;
|
||||||
|
|
||||||
|
/* 校验和 */
|
||||||
|
for(uint8_t i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
ulCrc += aTxBuffer[j];
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
aTxBuffer[6] = (uint8_t)ulCrc;
|
||||||
|
ble_nus_data_send(&m_nus, aTxBuffer, &Length, m_conn_handle);
|
||||||
|
}
|
||||||
|
/********************************************************************
|
||||||
|
* name : void MACQuery(void)
|
||||||
|
* description : MAC地址查询
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return : void
|
||||||
|
********************************************************************/
|
||||||
|
void MACQuery(void)
|
||||||
|
{
|
||||||
|
uint8_t j = 2;
|
||||||
|
static uint8_t aTxBuffer[12] = {0};
|
||||||
|
uint32_t ulCrc = 0;
|
||||||
|
uint16_t Length = 12;
|
||||||
|
|
||||||
|
/* 帧头、帧尾*/
|
||||||
|
aTxBuffer[HeadOffset] = 0xAA;
|
||||||
|
aTxBuffer[DataLengthOffset] = 0x08;
|
||||||
|
aTxBuffer[FunctionCodeOffset] = MAC_QUERY;
|
||||||
|
aTxBuffer[ChannelNumOffset] = 0x00;
|
||||||
|
aTxBuffer[11] = 0x55;
|
||||||
|
|
||||||
|
aTxBuffer[4] = BLE_MAC[5];
|
||||||
|
aTxBuffer[5] = BLE_MAC[4];
|
||||||
|
aTxBuffer[6] = BLE_MAC[3];
|
||||||
|
aTxBuffer[7] = BLE_MAC[2];
|
||||||
|
aTxBuffer[8] = BLE_MAC[1];
|
||||||
|
aTxBuffer[9] = BLE_MAC[0];
|
||||||
|
/* 校验和 */
|
||||||
|
for(uint8_t i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
ulCrc += aTxBuffer[j];
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
aTxBuffer[10] = (uint8_t)ulCrc;
|
||||||
|
ble_nus_data_send(&m_nus, aTxBuffer, &Length, m_conn_handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : void JudgeLedMode(void)
|
||||||
|
* description :
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return : void
|
||||||
|
********************************************************************/
|
||||||
|
void JudgeLedMode(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void DisconnectControl(void)
|
||||||
|
{
|
||||||
|
StopManage();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*************************** END OF FILE ***************************/
|
||||||
|
|
||||||
|
|
||||||
482
app/Src/timer.c
Normal file
482
app/Src/timer.c
Normal file
@ -0,0 +1,482 @@
|
|||||||
|
/********************************************************************
|
||||||
|
Copyright (c) 2021 Xiangyu Medical Co.,Ltd. All rights reserved.
|
||||||
|
FileName : timer.c
|
||||||
|
Author : zhangdawei
|
||||||
|
Version : V1.0
|
||||||
|
Date :
|
||||||
|
Note :
|
||||||
|
History :
|
||||||
|
********************************************************************/
|
||||||
|
/* Includes ------------------------------------------------------*/
|
||||||
|
#include "nrf_drv_pwm.h"
|
||||||
|
#include "drv_uart.h"
|
||||||
|
#include "IoControl.h"
|
||||||
|
#include "timer.h"
|
||||||
|
#include "nrf_delay.h"
|
||||||
|
#include "nrf_drv_ppi.h"
|
||||||
|
#include "nrf_drv_gpiote.h"
|
||||||
|
/* Private define ------------------------------------------------*/
|
||||||
|
/* 定义APP定时器 */
|
||||||
|
APP_TIMER_DEF(detect_button_100ms);
|
||||||
|
#define DETECT_BUTTON APP_TIMER_TICKS(100)
|
||||||
|
|
||||||
|
|
||||||
|
/* Private typedef -----------------------------------------------*/
|
||||||
|
//定义名称为m_pwm_add的驱动程序实例
|
||||||
|
static nrfx_pwm_t m_pwm_dac = NRFX_PWM_INSTANCE(1);
|
||||||
|
static nrfx_pwm_t m_pwm0 = NRFX_PWM_INSTANCE(0);
|
||||||
|
static nrfx_pwm_t m_pwm2 = NRFX_PWM_INSTANCE(2);
|
||||||
|
/* Private constants ---------------------------------------------*/
|
||||||
|
|
||||||
|
/* Private variables ---------------------------------------------*/
|
||||||
|
|
||||||
|
/* 呼吸灯占空比 */
|
||||||
|
uint16_t m_step = 150;
|
||||||
|
/* 存放RunLED占空比的数组 */
|
||||||
|
static nrf_pwm_values_common_t seq3_values[M_STEP*2];
|
||||||
|
//定义PWM序列,该序列必须位于RAM中,因此要定义为static类型
|
||||||
|
static nrf_pwm_values_common_t dac_values[] = {CYCLE_CALUE}; //14
|
||||||
|
|
||||||
|
static nrf_pwm_values_wave_form_t seq0_current_values[] =
|
||||||
|
{
|
||||||
|
10000 - 600,
|
||||||
|
10000 - 400,
|
||||||
|
10000 - 200,
|
||||||
|
10000 //100Hz
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static nrf_pwm_values_wave_form_t seq2_current_values[] =
|
||||||
|
{
|
||||||
|
800 - 125,
|
||||||
|
800,
|
||||||
|
800,
|
||||||
|
800 //20khz
|
||||||
|
};
|
||||||
|
|
||||||
|
E_WORK_STATE eRmsState = E_RMS_STOP;
|
||||||
|
|
||||||
|
/* Private function prototypes -----------------------------------*/
|
||||||
|
|
||||||
|
/* Public constants ----------------------------------------------*/
|
||||||
|
/* Public variables ----------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : void acquisition_start(void)
|
||||||
|
* description : 开始采集肌电
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void acquisition_start(void)
|
||||||
|
{
|
||||||
|
eRmsState = E_RMS_START;
|
||||||
|
// rms_saadc_init();
|
||||||
|
nrf_gpio_pin_set(SAMPLE_POWER_PIN);
|
||||||
|
open_acquisition_relay();
|
||||||
|
|
||||||
|
timer3_rms_start();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : void acquisition_stop(void)
|
||||||
|
* description : 停止肌电采集
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void acquisition_stop(void)
|
||||||
|
{
|
||||||
|
timer3_rms_stop();
|
||||||
|
eRmsState = E_RMS_STOP;
|
||||||
|
nrf_gpio_pin_clear(SAMPLE_POWER_PIN);
|
||||||
|
close_acquisition_relay();
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : void stimulate_start(void)
|
||||||
|
* description : 开始刺激
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void stimulate_start(void)
|
||||||
|
{
|
||||||
|
acquisition_stop(); //先停止肌电采集
|
||||||
|
// stimulate_stop(); //停止刺激,重新开始刺激
|
||||||
|
|
||||||
|
eRmsState = E_STIM_START;
|
||||||
|
open_stimulate_relay();
|
||||||
|
pwm0_play();
|
||||||
|
pwm2_play();
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : void stimulate_stop(void)
|
||||||
|
* description : 停止刺激
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void stimulate_stop(void)
|
||||||
|
{
|
||||||
|
eRmsState = E_STIM_STOP;
|
||||||
|
close_stimulate_relay();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : static void detect_button(void)
|
||||||
|
* description : 开关机按键检测处理
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
static void detect_button(void)
|
||||||
|
{
|
||||||
|
static uint8_t CountValue=0;
|
||||||
|
if((Bit_RESET == nrf_gpio_pin_read(KEY_PWR_SWITICH))&&((ChargeState == Uncharged))) //检测按键是否按下
|
||||||
|
{
|
||||||
|
CountValue++;
|
||||||
|
|
||||||
|
if(CountValue == 10)
|
||||||
|
{
|
||||||
|
if(POWER_CLOSE == DeviceState) //开机
|
||||||
|
{
|
||||||
|
DeviceState = POWER_OPEN;
|
||||||
|
nrf_gpio_pin_set(KEY_POWER); //锁定电源键,给MCU供电
|
||||||
|
|
||||||
|
NRF_LOG_INFO("Open!");
|
||||||
|
StartAdv();
|
||||||
|
}
|
||||||
|
else if(POWER_OPEN == DeviceState) //关机
|
||||||
|
{
|
||||||
|
DeviceState = POWER_CLOSE;
|
||||||
|
acquisition_stop();
|
||||||
|
NRF_LOG_INFO("Close!");
|
||||||
|
nrf_gpio_pin_clear(KEY_POWER); //断电
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CountValue = 0;
|
||||||
|
}
|
||||||
|
static uint16_t runBlinkCount = 0;
|
||||||
|
|
||||||
|
if(runBlinkCount == 0 && DeviceState == POWER_OPEN)
|
||||||
|
nrf_gpio_pin_set(LED_YELLOW);
|
||||||
|
else if(runBlinkCount == 1)
|
||||||
|
nrf_gpio_pin_clear(LED_YELLOW);
|
||||||
|
|
||||||
|
if(runBlinkCount++ > 8) //1S闪烁一次
|
||||||
|
{
|
||||||
|
runBlinkCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : static void detect_charging_status(void)
|
||||||
|
* description : 充电状态检测处理
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
static void detect_charging_status(void)
|
||||||
|
{
|
||||||
|
static uint8_t CountValue=0;
|
||||||
|
if((Bit_RESET == nrf_gpio_pin_read(CHG_MANAGER_CHG))) //检测按键是否按下
|
||||||
|
{
|
||||||
|
ChargeState = Charging;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ChargeState = Uncharged;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : static void Hundredms_handler(void * p_context)
|
||||||
|
* description : 检测按键是否长按函数,100ms中断一次,累计计数
|
||||||
|
* Input : void *p_context
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
static void Hundredms_handler(void * p_context)
|
||||||
|
{
|
||||||
|
//防止编译器警告,同时清晰地的表明p_context未使用,而不是应用程序忽略了。如果应用
|
||||||
|
//程序需要使用p_context,则不需要这行代码
|
||||||
|
UNUSED_PARAMETER(p_context);
|
||||||
|
/* 开机按键检测处理 */
|
||||||
|
detect_button();
|
||||||
|
/* 电池电量检测 */
|
||||||
|
CalculateBatteryPower();
|
||||||
|
/* 充电状态检测 */
|
||||||
|
detect_charging_status();
|
||||||
|
static uint16_t delay_open = 0;
|
||||||
|
if(POWER_OPEN == DeviceState && delay_open != 70 && delay_open++ >60 )
|
||||||
|
{
|
||||||
|
//acquisition_start();
|
||||||
|
stimulate_start();
|
||||||
|
delay_open = 70;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : void AppTimersInit(void)
|
||||||
|
* description : 初始化APP定时器模块、创建APP定时器
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void AppTimersInit(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
ret_code_t err_code = app_timer_init();//初始化APP定时器模块
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
|
||||||
|
err_code = app_timer_create(&detect_button_100ms,
|
||||||
|
APP_TIMER_MODE_REPEATED,
|
||||||
|
Hundredms_handler);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
}
|
||||||
|
/********************************************************************
|
||||||
|
* name : void ApplicationTimersStart(void)
|
||||||
|
* description : 启动已经创建的的APP定时器
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void ApplicationTimersStart(void)
|
||||||
|
{
|
||||||
|
ret_code_t err_code;
|
||||||
|
|
||||||
|
err_code = app_timer_start(detect_button_100ms, DETECT_BUTTON, NULL);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
}
|
||||||
|
/********************************************************************
|
||||||
|
* name : void PwmDACInit(void)
|
||||||
|
* description : 控制DAC的pwm初始化
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void PwmDACInit(void)
|
||||||
|
{
|
||||||
|
//定义PWM初始化配置结构体并初始化参数
|
||||||
|
nrfx_pwm_config_t const config0 =
|
||||||
|
{
|
||||||
|
.output_pins =
|
||||||
|
{
|
||||||
|
PWM_DAC_GPIO, //通道0映射到P WM_DAC_GPIO,空闲状态输出低电平
|
||||||
|
NRFX_PWM_PIN_NOT_USED , //通道1不使用
|
||||||
|
NRFX_PWM_PIN_NOT_USED , //通道2不使用
|
||||||
|
NRFX_PWM_PIN_NOT_USED //通道3不使用
|
||||||
|
},
|
||||||
|
.irq_priority = APP_IRQ_PRIORITY_LOWEST,//中断优先级
|
||||||
|
.base_clock = NRF_PWM_CLK_1MHz, //PWM时钟频率设置为1MHz
|
||||||
|
.count_mode = NRF_PWM_MODE_UP, //向上计数模式
|
||||||
|
.top_value = CYCLE_CALUE, //该值为周期值
|
||||||
|
.load_mode = NRF_PWM_LOAD_COMMON, //通用模式
|
||||||
|
.step_mode = NRF_PWM_STEP_AUTO //序列中的周期自动推进
|
||||||
|
};
|
||||||
|
APP_ERROR_CHECK(nrfx_pwm_init(&m_pwm_dac, &config0, NULL));//初始化PWM
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : void PwmDACPlay(void)
|
||||||
|
* description : 播放充能PWM
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void PwmDACPlay(void)
|
||||||
|
{
|
||||||
|
//定义PWM播放序列,播放序列包含了PWM序列的起始地址、大小和序列播放控制描述
|
||||||
|
nrf_pwm_sequence_t const seq =
|
||||||
|
{
|
||||||
|
.values.p_common = dac_values,//指向PWM序列
|
||||||
|
.length = NRF_PWM_VALUES_LENGTH(dac_values),//PWM序列中包含的周期个数
|
||||||
|
.repeats = 0, //序列中周期重复次数为0
|
||||||
|
.end_delay = 0 //序列后不插入延时
|
||||||
|
};
|
||||||
|
//启动PWM序列播放,flags设置为NRFX_PWM_FLAG_LOOP:序列播放完成后,自动触发任务重新播放
|
||||||
|
(void)nrfx_pwm_simple_playback(&m_pwm_dac, &seq, 1, NRFX_PWM_FLAG_LOOP);
|
||||||
|
}
|
||||||
|
void SetPWMValues(uint16_t tempvalue)
|
||||||
|
{
|
||||||
|
*dac_values = CYCLE_CALUE - tempvalue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : void PwmDACStop(void)
|
||||||
|
* description : 停止播放充能PWM
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void PwmDACStop(void)
|
||||||
|
{
|
||||||
|
nrfx_pwm_stop(&m_pwm_dac,1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : void pwm0_common_init(void)
|
||||||
|
* description : 电流控制PWM初始化
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void pwm0_common_init(void)
|
||||||
|
{
|
||||||
|
//定义PWM初始化配置结构体并初始化参数
|
||||||
|
nrfx_pwm_config_t const config0 =
|
||||||
|
{
|
||||||
|
.output_pins =
|
||||||
|
{
|
||||||
|
BASE_WAVE_06_PIN,
|
||||||
|
BASE_WAVE_07_PIN,
|
||||||
|
BASE_WAVE_08_PIN,
|
||||||
|
NRFX_PWM_PIN_NOT_USED
|
||||||
|
},
|
||||||
|
.irq_priority = APP_IRQ_PRIORITY_LOWEST,//中断优先级
|
||||||
|
.base_clock = NRF_PWM_CLK_1MHz, //PWM时钟频率设置为16MHz
|
||||||
|
.count_mode = NRF_PWM_MODE_UP, //向上计数模式
|
||||||
|
.top_value = 0, //使用波形装载模式时,该值被忽略
|
||||||
|
.load_mode = NRF_PWM_LOAD_WAVE_FORM, //独立装载模式
|
||||||
|
.step_mode = NRF_PWM_STEP_AUTO //序列中的周期自动推进
|
||||||
|
};
|
||||||
|
//初始化PWM
|
||||||
|
APP_ERROR_CHECK(nrfx_pwm_init(&m_pwm0, &config0, NULL));
|
||||||
|
|
||||||
|
/////////////
|
||||||
|
//pwm0_play();
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : void pwm0_play(void)
|
||||||
|
* description : 电流控制PWM开始播放
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void pwm0_play(void)
|
||||||
|
{
|
||||||
|
//定义PWM播放序列,播放序列包含了PWM序列的起始地址、大小和序列播放控制描述
|
||||||
|
nrf_pwm_sequence_t const seq0 =
|
||||||
|
{
|
||||||
|
.values.p_wave_form = seq0_current_values,//指向PWM序列
|
||||||
|
.length = NRF_PWM_VALUES_LENGTH(seq0_current_values),//PWM序列中包含的周期个数
|
||||||
|
.repeats = 0, //序列中周期重复次数为0
|
||||||
|
.end_delay = 0 //序列后不插入延时
|
||||||
|
};
|
||||||
|
//启动PWM序列播放,flags设置为NRFX_PWM_FLAG_LOOP:序列播放完成后,自动触发任务重新播放
|
||||||
|
//如改为NRFX_PWM_FLAG_STOP,则播放结束后,PWM停止
|
||||||
|
(void)nrfx_pwm_simple_playback(&m_pwm0, &seq0, 1,
|
||||||
|
NRFX_PWM_FLAG_LOOP);
|
||||||
|
}
|
||||||
|
|
||||||
|
void pwm0_stop(void)
|
||||||
|
{
|
||||||
|
nrfx_pwm_stop(&m_pwm0, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : void pwm2_common_init(void)
|
||||||
|
* description : 电流控制PWM初始化
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void pwm2common_init(void)
|
||||||
|
{
|
||||||
|
//定义PWM初始化配置结构体并初始化参数
|
||||||
|
nrfx_pwm_config_t const config0 =
|
||||||
|
{
|
||||||
|
.output_pins =
|
||||||
|
{
|
||||||
|
BOOST_VOLTAGE_CONTROL_PIN,
|
||||||
|
NRFX_PWM_PIN_NOT_USED,
|
||||||
|
NRFX_PWM_PIN_NOT_USED,
|
||||||
|
NRFX_PWM_PIN_NOT_USED
|
||||||
|
},
|
||||||
|
.irq_priority = APP_IRQ_PRIORITY_LOWEST,//中断优先级
|
||||||
|
.base_clock = NRF_PWM_CLK_16MHz, //PWM时钟频率设置为16MHz
|
||||||
|
.count_mode = NRF_PWM_MODE_UP, //向上计数模式
|
||||||
|
.top_value = 0, //使用波形装载模式时,该值被忽略
|
||||||
|
.load_mode = NRF_PWM_LOAD_WAVE_FORM, //独立装载模式
|
||||||
|
.step_mode = NRF_PWM_STEP_AUTO //序列中的周期自动推进
|
||||||
|
};
|
||||||
|
//初始化PWM
|
||||||
|
APP_ERROR_CHECK(nrfx_pwm_init(&m_pwm2, &config0, NULL));
|
||||||
|
|
||||||
|
/////////////
|
||||||
|
//pwm2_play();
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : void pwm2_play(void)
|
||||||
|
* description : 电流控制PWM开始播放
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void pwm2_play(void)
|
||||||
|
{
|
||||||
|
//定义PWM播放序列,播放序列包含了PWM序列的起始地址、大小和序列播放控制描述
|
||||||
|
nrf_pwm_sequence_t const seq2 =
|
||||||
|
{
|
||||||
|
.values.p_wave_form = seq2_current_values,//指向PWM序列
|
||||||
|
.length = NRF_PWM_VALUES_LENGTH(seq2_current_values),//PWM序列中包含的周期个数
|
||||||
|
.repeats = 0, //序列中周期重复次数为0
|
||||||
|
.end_delay = 0 //序列后不插入延时
|
||||||
|
};
|
||||||
|
//启动PWM序列播放,flags设置为NRFX_PWM_FLAG_LOOP:序列播放完成后,自动触发任务重新播放
|
||||||
|
//如改为NRFX_PWM_FLAG_STOP,则播放结束后,PWM停止
|
||||||
|
(void)nrfx_pwm_simple_playback(&m_pwm2, &seq2, 1,
|
||||||
|
NRFX_PWM_FLAG_LOOP);
|
||||||
|
}
|
||||||
|
|
||||||
|
void pwm2_stop(void)
|
||||||
|
{
|
||||||
|
nrfx_pwm_stop(&m_pwm2, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : void GpioteInit(void)
|
||||||
|
* description : 刺激的任务GPIOTE初始化
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void GpioteInit(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* name : void PPIPwmInit(void)
|
||||||
|
* description : 刺激PWM的PPI初始化
|
||||||
|
* Input : void
|
||||||
|
* Output : void
|
||||||
|
* Return :
|
||||||
|
********************************************************************/
|
||||||
|
void PPIPwmInit(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*************************** END OF FILE ***************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
32
app/Src/user_config.c
Normal file
32
app/Src/user_config.c
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/********************************************************************
|
||||||
|
Copyright (c) 2025 Xiangyu Medical Co.,Ltd. All rights reserved.
|
||||||
|
FileName : spi.c
|
||||||
|
Author : xiaozhengsheng
|
||||||
|
Version : V1.0
|
||||||
|
Date :
|
||||||
|
Note :
|
||||||
|
History :
|
||||||
|
********************************************************************/
|
||||||
|
/* Includes ------------------------------------------------------*/
|
||||||
|
#include "user_config.h"
|
||||||
|
//Log需要引用的头文件
|
||||||
|
#include "nrf_log.h"
|
||||||
|
#include "nrf_log_ctrl.h"
|
||||||
|
#include "nrf_log_default_backends.h"
|
||||||
|
|
||||||
|
version_t softVersion={
|
||||||
|
.major = 1,
|
||||||
|
.minor = 0,
|
||||||
|
.patch = 0, // 修订号 (.0)
|
||||||
|
.build = 0, // 构建号 (.0)
|
||||||
|
.testVersion = {"alpha1-1"} //内部测试版本,正式发布需要填0,alpha内部测试
|
||||||
|
};
|
||||||
|
|
||||||
|
char softWareVersion[SOFT_VERSION_MAX_LENGTH] = {0}; //软件版本号
|
||||||
|
|
||||||
|
void read_config_user_config(void)
|
||||||
|
{
|
||||||
|
snprintf(softWareVersion, SOFT_VERSION_MAX_LENGTH, "V%d.%d.%d.%d-%s", softVersion.major, softVersion.minor, softVersion.patch, softVersion.build, softVersion.testVersion);
|
||||||
|
NRF_LOG_INFO("Software Version: %s", softWareVersion);
|
||||||
|
NRF_LOG_INFO("product model: HL-PDJ-1");
|
||||||
|
}
|
||||||
883
app/main.c
Normal file
883
app/main.c
Normal file
@ -0,0 +1,883 @@
|
|||||||
|
/****************************************Copyright (c)************************************************
|
||||||
|
** [翔宇医疗]
|
||||||
|
**--------------File Info-----------------------------------------------------------------------------
|
||||||
|
** File name : main.c
|
||||||
|
** Last modified Date:
|
||||||
|
** Last Version :
|
||||||
|
** Descriptions : 使用的SDK版本-SDK_17.0.2
|
||||||
|
**----------------------------------------------------------------------------------------------------
|
||||||
|
** Created by :
|
||||||
|
** Created date :
|
||||||
|
** Version : 1.0
|
||||||
|
** Descriptions : 2021.4.6:添加配对管理器功能,在配对管理处理事件中添加PM_EVT_CONN_SEC_CONFIG_REQ,修改参数,
|
||||||
|
实现取消配对后依然可以再次连接
|
||||||
|
2021.4.7:添加广播3分钟后芯片休眠操作,广播间隔调整为187.5ms
|
||||||
|
在BLE事件处理函数中添加pm_handler_secure_on_connection函数,实现连接成功后就绑定
|
||||||
|
2021.4.9:在GATT初始化中加入nrf_ble_gatt_att_mtu_periph_set()函数设置默认MTU大小
|
||||||
|
2021.4.12:在主函数中加入PWM初始化函数以及在定时器中调用PWM开始播放函数
|
||||||
|
2021.5.12:将最大连接间隔改为300ms,改善了在连接过程中交换MTU不成功的情况
|
||||||
|
**---------------------------------------------------------------------------------------------------*/
|
||||||
|
//引用的C库头文件
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
//APP定时器需要引用的头文件
|
||||||
|
#include "bsp_btn_ble.h"
|
||||||
|
//电源管理需要引用的头文件
|
||||||
|
#include "nrf_pwr_mgmt.h"
|
||||||
|
//SoftDevice handler configuration需要引用的头文件
|
||||||
|
#include "nrf_sdh.h"
|
||||||
|
#include "nrf_sdh_soc.h"
|
||||||
|
#include "nrf_sdh_ble.h"
|
||||||
|
//排序写入模块需要引用的头文件
|
||||||
|
#include "nrf_ble_qwr.h"
|
||||||
|
//GATT需要引用的头文件
|
||||||
|
#include "nrf_ble_gatt.h"
|
||||||
|
//连接参数协商需要引用的头文件
|
||||||
|
#include "ble_conn_params.h"
|
||||||
|
//广播需要引用的头文件
|
||||||
|
#include "ble_advdata.h"
|
||||||
|
#include "ble_advertising.h"
|
||||||
|
//串口透传需要引用的头文件
|
||||||
|
#include "drv_uart.h"
|
||||||
|
//引用FDS头文件
|
||||||
|
#include "fds.h"
|
||||||
|
//配对管理器包含头文件
|
||||||
|
#include "peer_manager.h"
|
||||||
|
#include "peer_manager_handler.h"
|
||||||
|
//WDT头文件
|
||||||
|
#include "nrfx_wdt.h"
|
||||||
|
#include "nrf_drv_clock.h"
|
||||||
|
#include "IoControl.h"
|
||||||
|
#include "IIR.h"
|
||||||
|
/***********************************************/
|
||||||
|
#define DEVICE_NAME "HL-PDJ-A" // 设备名称字符串
|
||||||
|
#define UARTS_SERVICE_UUID_TYPE BLE_UUID_TYPE_BLE // 串口透传服务UUID类型:厂商自定义UUID
|
||||||
|
#define MIN_CONN_INTERVAL MSEC_TO_UNITS(20, UNIT_1_25_MS) // 最小连接间隔 (0.1 秒)
|
||||||
|
#define MAX_CONN_INTERVAL MSEC_TO_UNITS(20, UNIT_1_25_MS) // 最大连接间隔 (0.2 秒)
|
||||||
|
#define SLAVE_LATENCY 0 // 从机延迟
|
||||||
|
#define CONN_SUP_TIMEOUT MSEC_TO_UNITS(4000, UNIT_10_MS) // 监督超时(4 秒)
|
||||||
|
#define FIRST_CONN_PARAMS_UPDATE_DELAY APP_TIMER_TICKS(5000) // 定义首次调用sd_ble_gap_conn_param_update()函数更新连接参数延迟时间(5秒)
|
||||||
|
#define NEXT_CONN_PARAMS_UPDATE_DELAY APP_TIMER_TICKS(30000) // 定义每次调用sd_ble_gap_conn_param_update()函数更新连接参数的间隔时间(30秒)
|
||||||
|
#define MAX_CONN_PARAMS_UPDATE_COUNT 3 // 定义放弃连接参数协商前尝试连接参数协商的最大次数(3次)
|
||||||
|
|
||||||
|
#define APP_ADV_INTERVAL 160 // 广播间隔 (100 ms),单位0.625 ms
|
||||||
|
#define APP_ADV_DURATION 0 // 广播持续时间,单位:10ms。设置为0表示不超时
|
||||||
|
|
||||||
|
#define SEC_PARAM_BOND 1 //是否支持绑定,1:支持,0:不支持
|
||||||
|
#define SEC_PARAM_MITM 0 //是否支持MITM保护,1:支持,0:不支持
|
||||||
|
#define SEC_PARAM_LESC 0 //是否使用安全连接配对(LESC),1:使用LESC,0:使用传统配对
|
||||||
|
#define SEC_PARAM_KEYPRESS 0 //是否生成按键通知,1:生成,0:不生成
|
||||||
|
#define SEC_PARAM_IO_CAPABILITIES BLE_GAP_IO_CAPS_NONE //IO能力:无输入/输出能力
|
||||||
|
#define SEC_PARAM_OOB 0 //是否支持OOB,1:支持,0:不支持
|
||||||
|
#define SEC_PARAM_MIN_KEY_SIZE 7 //最小加密密钥大小
|
||||||
|
#define SEC_PARAM_MAX_KEY_SIZE 16 //最大加密密钥大小
|
||||||
|
|
||||||
|
#define APP_BLE_OBSERVER_PRIO 3 //应用程序BLE事件监视者优先级,应用程序不能修改该数值
|
||||||
|
#define APP_BLE_CONN_CFG_TAG 1 //SoftDevice BLE配置标志
|
||||||
|
|
||||||
|
//用于stack dump的错误代码,可以用于栈回退时确定堆栈位置
|
||||||
|
#define DEAD_BEEF 0xDEADBEEF
|
||||||
|
|
||||||
|
//定义文件ID和该文件包含的记录的KEY
|
||||||
|
#define DEVICE_FILE (0x1000)//文件ID
|
||||||
|
#define DEVICE_SCHEME_KEY (0x1001)//记录KEY,该记录存放的文件ID=0X1001
|
||||||
|
|
||||||
|
ble_gap_addr_t addr_ios;
|
||||||
|
uint8_array_t address_ios;
|
||||||
|
|
||||||
|
// 包含参数信息的记录
|
||||||
|
fds_record_t const m_SchemePara =
|
||||||
|
{
|
||||||
|
.file_id = DEVICE_FILE,
|
||||||
|
.key = DEVICE_SCHEME_KEY,
|
||||||
|
.data.p_data = &SchemePara,
|
||||||
|
//记录的长度必须以4字节(字)为单位
|
||||||
|
.data.length_words = (sizeof(SchemePara) + 3) / sizeof(uint32_t),
|
||||||
|
};
|
||||||
|
|
||||||
|
//BLE串口透传例程中服务UUID列表
|
||||||
|
static ble_uuid_t m_adv_uuids[] =
|
||||||
|
{
|
||||||
|
{BLE_UUID_NUS_SERVICE,UARTS_SERVICE_UUID_TYPE}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//保存申请的喂狗通道
|
||||||
|
nrfx_wdt_channel_id m_channel_id;
|
||||||
|
|
||||||
|
/*必须的观察者函数*/
|
||||||
|
NRF_BLE_GATT_DEF(m_gatt); //定义名称为m_gatt的GATT模块实例
|
||||||
|
NRF_BLE_QWR_DEF(m_qwr); //定义一个名称为m_qwr的排队写入实例
|
||||||
|
BLE_ADVERTISING_DEF(m_advertising); //定义名称为m_advertising的广播模块实例
|
||||||
|
|
||||||
|
void WdtFeed(void);
|
||||||
|
//GATT事件处理函数
|
||||||
|
void gatt_evt_handler(nrf_ble_gatt_t * p_gatt, nrf_ble_gatt_evt_t const * p_evt)
|
||||||
|
{
|
||||||
|
//如果是MTU交换事件
|
||||||
|
if ((m_conn_handle == p_evt->conn_handle) && (p_evt->evt_id == NRF_BLE_GATT_EVT_ATT_MTU_UPDATED)) //如果主句发起MTU升级请求
|
||||||
|
{
|
||||||
|
//设置串口透传服务的有效数据长度(MTU-opcode-handle)
|
||||||
|
m_ble_nus_max_data_len = p_evt->params.att_mtu_effective - OPCODE_LENGTH - HANDLE_LENGTH;///247字节
|
||||||
|
NRF_LOG_INFO("Data len is set to 0x%X(%d)", m_ble_nus_max_data_len, m_ble_nus_max_data_len);
|
||||||
|
}
|
||||||
|
NRF_LOG_DEBUG("ATT MTU exchange completed. central 0x%x peripheral 0x%x",
|
||||||
|
p_gatt->att_mtu_desired_central,
|
||||||
|
p_gatt->att_mtu_desired_periph);
|
||||||
|
}
|
||||||
|
//初始化日志打印模块
|
||||||
|
static void log_init(void)
|
||||||
|
{
|
||||||
|
//初始化log程序模块
|
||||||
|
ret_code_t err_code = NRF_LOG_INIT(NULL);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
//设置log输出终端(根据sdk_config.h中的配置设置输出终端为UART或者RTT)
|
||||||
|
NRF_LOG_DEFAULT_BACKENDS_INIT();
|
||||||
|
}
|
||||||
|
//GAP Generic Access Profile参数初始化,该函数配置需要的GAP参数,包括设备名称,外观特征、首选连接参数
|
||||||
|
static void gap_params_init(void)
|
||||||
|
{
|
||||||
|
ret_code_t err_code;
|
||||||
|
//定义连接参数结构体变量
|
||||||
|
ble_gap_conn_params_t gap_conn_params;
|
||||||
|
ble_gap_conn_sec_mode_t sec_mode;
|
||||||
|
//设置GAP的安全模式,即设置设备名称特征的写权限,这里设置的是安全模式1等级1,即无安全性
|
||||||
|
BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
|
||||||
|
//设置GAP设备名称
|
||||||
|
err_code = sd_ble_gap_device_name_set(&sec_mode,
|
||||||
|
(const uint8_t *)DEVICE_NAME,
|
||||||
|
strlen(DEVICE_NAME));
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
|
||||||
|
//如果需要设置外观特征,在这里使用如下的代码设置
|
||||||
|
/* err_code = sd_ble_gap_appearance_set(BLE_APPEARANCE_);
|
||||||
|
APP_ERROR_CHECK(err_code); */
|
||||||
|
|
||||||
|
//设置首选连接参数,设置前先清零gap_conn_params
|
||||||
|
memset(&gap_conn_params, 0, sizeof(gap_conn_params));
|
||||||
|
|
||||||
|
gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;//最小连接间隔
|
||||||
|
gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;//最小连接间隔
|
||||||
|
gap_conn_params.slave_latency = SLAVE_LATENCY; //从机延迟
|
||||||
|
gap_conn_params.conn_sup_timeout = CONN_SUP_TIMEOUT; //监督超时
|
||||||
|
//调用协议栈API sd_ble_gap_ppcp_set配置GAP参数
|
||||||
|
err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
}
|
||||||
|
//初始化GATT程序模块
|
||||||
|
static void gatt_init(void)
|
||||||
|
{
|
||||||
|
//初始化GATT程序模块
|
||||||
|
ret_code_t err_code = nrf_ble_gatt_init(&m_gatt, gatt_evt_handler);
|
||||||
|
//检查函数返回的错误代码
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
|
||||||
|
//设置服务端的默认MTU大小
|
||||||
|
err_code = nrf_ble_gatt_att_mtu_periph_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
}
|
||||||
|
//空闲状态处理函数(该函数需要放到主循环里面执行)。如果没有挂起的日志操作,则睡眠直到下一个事件发生后唤醒系统
|
||||||
|
static void idle_state_handle(void)
|
||||||
|
{
|
||||||
|
//处理挂起的log
|
||||||
|
if (NRF_LOG_PROCESS() == false)
|
||||||
|
{
|
||||||
|
//运行电源管理
|
||||||
|
nrf_pwr_mgmt_run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//删除绑定信息
|
||||||
|
static void delete_bonds(void)
|
||||||
|
{
|
||||||
|
ret_code_t err_code;
|
||||||
|
|
||||||
|
err_code = pm_peers_delete();
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
}
|
||||||
|
|
||||||
|
//初始化电源管理模块
|
||||||
|
static void power_management_init(void)
|
||||||
|
{
|
||||||
|
ret_code_t err_code;
|
||||||
|
//初始化电源管理
|
||||||
|
err_code = nrf_pwr_mgmt_init();
|
||||||
|
//检查函数返回的错误代码
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
}
|
||||||
|
//连接参数协商模块错误处理事件,参数nrf_error包含了错误代码,通过nrf_error可以分析错误信息
|
||||||
|
static void conn_params_error_handler(uint32_t nrf_error)
|
||||||
|
{
|
||||||
|
//检查错误代码
|
||||||
|
APP_ERROR_HANDLER(nrf_error);
|
||||||
|
}
|
||||||
|
|
||||||
|
//连接参数协商模块事件处理函数
|
||||||
|
static void on_conn_params_evt(ble_conn_params_evt_t * p_evt)
|
||||||
|
{
|
||||||
|
ret_code_t err_code;
|
||||||
|
//判断事件类型,根据事件类型执行动作
|
||||||
|
//连接参数协商失败
|
||||||
|
if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_FAILED)
|
||||||
|
{
|
||||||
|
err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
}
|
||||||
|
//连接参数协商成功
|
||||||
|
if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_SUCCEEDED)
|
||||||
|
{
|
||||||
|
//功能代码;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//连接参数协商模块初始化(用于启动和执行连接参数协商规程)
|
||||||
|
static void conn_params_init(void)
|
||||||
|
{
|
||||||
|
ret_code_t err_code;
|
||||||
|
//定义连接参数协商模块初始化结构体
|
||||||
|
ble_conn_params_init_t cp_init;
|
||||||
|
//配置之前先清零
|
||||||
|
memset(&cp_init, 0, sizeof(cp_init));
|
||||||
|
//设置为NULL,从主机获取连接参数
|
||||||
|
cp_init.p_conn_params = NULL;
|
||||||
|
//连接或启动通知到首次发起连接参数更新请求之间的时间设置为5秒
|
||||||
|
cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY;
|
||||||
|
//每次调用sd_ble_gap_conn_param_update()函数发起连接参数更新请求的之间的间隔时间设置为:30秒
|
||||||
|
cp_init.next_conn_params_update_delay = NEXT_CONN_PARAMS_UPDATE_DELAY;
|
||||||
|
//放弃连接参数协商前尝试连接参数协商的最大次数设置为:3次
|
||||||
|
cp_init.max_conn_params_update_count = MAX_CONN_PARAMS_UPDATE_COUNT;
|
||||||
|
//连接参数更新从连接事件开始计时
|
||||||
|
cp_init.start_on_notify_cccd_handle = BLE_GATT_HANDLE_INVALID;
|
||||||
|
//连接参数更新失败不断开连接
|
||||||
|
cp_init.disconnect_on_fail = false;
|
||||||
|
//注册连接参数更新事件句柄
|
||||||
|
cp_init.evt_handler = on_conn_params_evt;
|
||||||
|
//注册连接参数更新错误事件句柄
|
||||||
|
cp_init.error_handler = conn_params_error_handler;
|
||||||
|
//调用库函数(以连接参数更新初始化结构体为输入参数)初始化连接参数协商模块
|
||||||
|
err_code = ble_conn_params_init(&cp_init);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
}
|
||||||
|
|
||||||
|
//BLE事件处理函数
|
||||||
|
static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
|
||||||
|
{
|
||||||
|
ret_code_t err_code = NRF_SUCCESS;
|
||||||
|
//连接建立后立即启动安全(当接收到连接建立事件(BLE_GAP_EVT_CONNECTED)时启动安全性)
|
||||||
|
pm_handler_secure_on_connection(p_ble_evt);
|
||||||
|
//判断BLE事件类型,根据事件类型执行相应操作
|
||||||
|
switch (p_ble_evt->header.evt_id)
|
||||||
|
{
|
||||||
|
//断开连接事件
|
||||||
|
case BLE_GAP_EVT_DISCONNECTED:
|
||||||
|
//打印提示信息
|
||||||
|
NRF_LOG_INFO("Disconnected.");
|
||||||
|
DeviceConnectState = DisconnectState;
|
||||||
|
|
||||||
|
DisconnectControl();
|
||||||
|
break;
|
||||||
|
|
||||||
|
//连接事件
|
||||||
|
case BLE_GAP_EVT_CONNECTED:
|
||||||
|
NRF_LOG_INFO("Connected.");
|
||||||
|
DeviceConnectState = ConnectState;
|
||||||
|
|
||||||
|
DisconnectControl();
|
||||||
|
//保存连接句柄
|
||||||
|
m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
|
||||||
|
//将连接句柄分配给排队写入实例,分配后排队写入实例和该连接关联,这样,当有
|
||||||
|
//多个连接的时候,通过关联不同的排队写入实例,很方便单独处理各个连接
|
||||||
|
err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, m_conn_handle);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
break;
|
||||||
|
|
||||||
|
//PHY更新事件
|
||||||
|
case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
|
||||||
|
{
|
||||||
|
NRF_LOG_DEBUG("PHY update request.");
|
||||||
|
ble_gap_phys_t const phys =
|
||||||
|
{
|
||||||
|
.rx_phys = BLE_GAP_PHY_AUTO,
|
||||||
|
.tx_phys = BLE_GAP_PHY_AUTO,
|
||||||
|
};
|
||||||
|
//响应PHY更新规程
|
||||||
|
err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
} break;
|
||||||
|
|
||||||
|
//GATT客户端超时事件
|
||||||
|
case BLE_GATTC_EVT_TIMEOUT:
|
||||||
|
NRF_LOG_DEBUG("GATT Client Timeout.");
|
||||||
|
//断开当前连接
|
||||||
|
err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle,
|
||||||
|
BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
break;
|
||||||
|
|
||||||
|
//GATT服务器超时事件
|
||||||
|
case BLE_GATTS_EVT_TIMEOUT:
|
||||||
|
NRF_LOG_DEBUG("GATT Server Timeout.");
|
||||||
|
//断开当前连接
|
||||||
|
err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle,
|
||||||
|
BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//初始化BLE协议栈
|
||||||
|
static void ble_stack_init(void)
|
||||||
|
{
|
||||||
|
ret_code_t err_code;
|
||||||
|
//请求使能SoftDevice,该函数中会根据sdk_config.h文件中低频时钟的设置来配置低频时钟
|
||||||
|
err_code = nrf_sdh_enable_request();
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
|
||||||
|
//定义保存应用程序RAM起始地址的变量
|
||||||
|
uint32_t ram_start = 0;
|
||||||
|
|
||||||
|
//使用sdk_config.h文件的默认参数配置协议栈,获取应用程序RAM起始地址,保存到变量ram_start
|
||||||
|
err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
|
||||||
|
//使能BLE协议栈
|
||||||
|
err_code = nrf_sdh_ble_enable(&ram_start);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
|
||||||
|
//注册BLE事件回调函数
|
||||||
|
NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
//广播事件处理函数
|
||||||
|
static void on_adv_evt(ble_adv_evt_t ble_adv_evt)
|
||||||
|
{
|
||||||
|
ret_code_t err_code;
|
||||||
|
//判断广播事件类型
|
||||||
|
switch (ble_adv_evt)
|
||||||
|
{
|
||||||
|
//快速广播启动事件:快速广播启动后会产生该事件
|
||||||
|
case BLE_ADV_EVT_FAST:
|
||||||
|
NRF_LOG_INFO("Fast advertising.");
|
||||||
|
//设置广播指示灯为正在广播(D1指示灯闪烁)
|
||||||
|
// err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING);
|
||||||
|
// APP_ERROR_CHECK(err_code);
|
||||||
|
break;
|
||||||
|
|
||||||
|
//广播IDLE事件:广播超时后会产生该事件
|
||||||
|
case BLE_ADV_EVT_IDLE:
|
||||||
|
//断电
|
||||||
|
NRF_LOG_INFO("BLE_ADV_EVT_IDLE");
|
||||||
|
nrf_gpio_pin_clear(KEY_POWER);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//广播初始化
|
||||||
|
static void advertising_init(void)
|
||||||
|
{
|
||||||
|
uint32_t err_code;
|
||||||
|
//定义广播初始化配置结构体变量
|
||||||
|
ble_advertising_init_t init;
|
||||||
|
|
||||||
|
err_code = sd_ble_gap_addr_get(&addr_ios);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
|
||||||
|
address_ios.size = 6;
|
||||||
|
address_ios.p_data = addr_ios.addr;
|
||||||
|
|
||||||
|
ble_advdata_manuf_data_t test;
|
||||||
|
|
||||||
|
test.company_identifier = 0x1122;
|
||||||
|
test.data = address_ios;
|
||||||
|
|
||||||
|
|
||||||
|
//配置之前先清零
|
||||||
|
memset(&init, 0, sizeof(init));
|
||||||
|
//设备名称类型:全名
|
||||||
|
init.advdata.name_type = BLE_ADVDATA_FULL_NAME;
|
||||||
|
//是否包含外观:包含
|
||||||
|
init.advdata.include_appearance = false;
|
||||||
|
//包含ble设备地址
|
||||||
|
// init.advdata.include_ble_device_addr = true;
|
||||||
|
init.advdata.p_manuf_specific_data = &test;
|
||||||
|
|
||||||
|
init.srdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids)/sizeof(m_adv_uuids[0]);
|
||||||
|
init.srdata.uuids_complete.p_uuids = m_adv_uuids;
|
||||||
|
|
||||||
|
//Flag:一般可发现模式,不支持BR/EDR
|
||||||
|
init.advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
|
||||||
|
|
||||||
|
//设置广播模式为快速广播
|
||||||
|
init.config.ble_adv_fast_enabled = true;
|
||||||
|
//设置广播间隔和广播持续时间
|
||||||
|
init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
|
||||||
|
init.config.ble_adv_fast_timeout = APP_ADV_DURATION;
|
||||||
|
//广播事件回调函数
|
||||||
|
init.evt_handler = on_adv_evt;
|
||||||
|
//初始化广播
|
||||||
|
err_code = ble_advertising_init(&m_advertising, &init);
|
||||||
|
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
//设置广播配置标记。APP_BLE_CONN_CFG_TAG是用于跟踪广播配置的标记,这是为未来预留的一个参数,在将来的SoftDevice版本中,
|
||||||
|
//可以使用sd_ble_gap_adv_set_configure()配置新的广播配置
|
||||||
|
//当前SoftDevice版本(S132 V7.2.0版本)支持的最大广播集数量为1,因此APP_BLE_CONN_CFG_TAG只能写1。
|
||||||
|
ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
|
||||||
|
}
|
||||||
|
|
||||||
|
//启动广播,该函数所用的模式必须和广播初始化中设置的广播模式一样
|
||||||
|
static void advertising_start(bool erase_bonds)
|
||||||
|
{
|
||||||
|
if(erase_bonds == true)
|
||||||
|
{
|
||||||
|
//删除flash中存储的配对信息,执行完删除后,会产生PM_EVT_PEERS_DELETE_SUCCEEDED事件,
|
||||||
|
//在该事件下会启动广播
|
||||||
|
delete_bonds();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//使用广播初始化中设置的广播模式启动广播
|
||||||
|
ret_code_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
|
||||||
|
//检查函数返回的错误代码
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//排队写入事件处理函数,用于处理排队写入模块的错误
|
||||||
|
static void nrf_qwr_error_handler(uint32_t nrf_error)
|
||||||
|
{
|
||||||
|
//检查错误代码
|
||||||
|
APP_ERROR_HANDLER(nrf_error);
|
||||||
|
}
|
||||||
|
|
||||||
|
//服务初始化,包含初始化排队写入模块和初始化应用程序使用的服务
|
||||||
|
static void services_init(void)
|
||||||
|
{
|
||||||
|
ret_code_t err_code;
|
||||||
|
//定义排队写入初始化结构体变量
|
||||||
|
nrf_ble_qwr_init_t qwr_init = {0};
|
||||||
|
|
||||||
|
//排队写入事件处理函数
|
||||||
|
qwr_init.error_handler = nrf_qwr_error_handler;
|
||||||
|
//初始化排队写入模块
|
||||||
|
err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
//串口透传服务初始化
|
||||||
|
service_nus_init();
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
//配对管理器事件处理函数
|
||||||
|
static void pm_evt_handler(pm_evt_t const * p_evt)
|
||||||
|
{
|
||||||
|
//1、打印日志 2、连接已绑定设备时启动加密 3、出现错误调用错误处理程序
|
||||||
|
pm_handler_on_pm_evt(p_evt);
|
||||||
|
//清理配对设备在flash中的保存的绑定信息,当flash存储空间不足时删除
|
||||||
|
//排列最低的配对设备的信息
|
||||||
|
pm_handler_flash_clean(p_evt);
|
||||||
|
|
||||||
|
switch(p_evt->evt_id)
|
||||||
|
{
|
||||||
|
//存储的绑定信息已成功删除
|
||||||
|
case PM_EVT_PEERS_DELETE_SUCCEEDED:
|
||||||
|
//若程序启动时执行了删除绑定信息操作,在该事件下启动广播
|
||||||
|
advertising_start(false);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PM_EVT_CONN_SEC_CONFIG_REQ:
|
||||||
|
{
|
||||||
|
// 拒绝来自已经绑定对等方的配对请求.
|
||||||
|
pm_conn_sec_config_t conn_sec_config = {.allow_repairing = true};
|
||||||
|
pm_conn_sec_config_reply(p_evt->conn_handle, &conn_sec_config);
|
||||||
|
} break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//配对管理器初始化
|
||||||
|
static void peer_manager_init(void)
|
||||||
|
{
|
||||||
|
ble_gap_sec_params_t sec_param;
|
||||||
|
ret_code_t err_code;
|
||||||
|
|
||||||
|
//初始化配对管理器软件库
|
||||||
|
err_code = pm_init();
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
//配置安全参数前先清零结构体sec_param
|
||||||
|
memset(&sec_param, 0, sizeof(ble_gap_sec_params_t));
|
||||||
|
|
||||||
|
//初始化安全性参数结构体,
|
||||||
|
sec_param.bond = SEC_PARAM_BOND; //支持绑定
|
||||||
|
sec_param.mitm = SEC_PARAM_MITM; //无MITM保护
|
||||||
|
sec_param.lesc = SEC_PARAM_LESC; //不支持安全连接配对,即使用传统配对
|
||||||
|
sec_param.keypress = SEC_PARAM_KEYPRESS; //无按键通知
|
||||||
|
sec_param.io_caps = SEC_PARAM_IO_CAPABILITIES; //无IO能力
|
||||||
|
sec_param.oob = SEC_PARAM_OOB; //不支持OOB
|
||||||
|
sec_param.min_key_size = SEC_PARAM_MIN_KEY_SIZE; //最小加密密钥大小:7字节
|
||||||
|
sec_param.max_key_size = SEC_PARAM_MAX_KEY_SIZE; //最大加密密钥大小:16字节
|
||||||
|
//本地密钥分发配置
|
||||||
|
sec_param.kdist_own.enc = 1; //分发本地LTK
|
||||||
|
sec_param.kdist_own.id = 1; //分发本地IRK
|
||||||
|
//对端密钥分发配置
|
||||||
|
sec_param.kdist_peer.enc = 1; //要求对方分发LTK
|
||||||
|
sec_param.kdist_peer.id = 1; //要求对方分发IRK
|
||||||
|
|
||||||
|
//配置安全参数
|
||||||
|
err_code = pm_sec_params_set(&sec_param);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
//向配对管理器注册事件句柄
|
||||||
|
err_code = pm_register(pm_evt_handler);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
}
|
||||||
|
|
||||||
|
//FDS事件处理函数
|
||||||
|
static void fds_evt_handler(fds_evt_t const * p_evt)
|
||||||
|
{
|
||||||
|
//判断事件类型
|
||||||
|
switch (p_evt->id)
|
||||||
|
{
|
||||||
|
case FDS_EVT_INIT://FDS初始化事件
|
||||||
|
if (p_evt->result == NRF_SUCCESS)//初始化成功
|
||||||
|
{
|
||||||
|
my_fds_info.busy = false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FDS_EVT_WRITE://FDS写记录事件
|
||||||
|
{
|
||||||
|
if (p_evt->result == NRF_SUCCESS)//写记录成功
|
||||||
|
{
|
||||||
|
my_fds_info.busy = false;
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
|
||||||
|
case FDS_EVT_UPDATE://FDS更新记录事件
|
||||||
|
{
|
||||||
|
if (p_evt->result == NRF_SUCCESS)//写记录成功
|
||||||
|
{
|
||||||
|
my_fds_info.busy = false;
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
|
||||||
|
case FDS_EVT_GC://FDS碎片整理事件
|
||||||
|
{
|
||||||
|
if (p_evt->result == NRF_SUCCESS)//碎片整理成功
|
||||||
|
{
|
||||||
|
my_fds_info.busy = false;
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//等待FDS初始化完成
|
||||||
|
static void wait_for_fds_ready(void)
|
||||||
|
{
|
||||||
|
while (my_fds_info.busy)
|
||||||
|
{
|
||||||
|
(void) sd_app_evt_wait();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 读取方案并且发送
|
||||||
|
void read_scheme(void)
|
||||||
|
{
|
||||||
|
ret_code_t rc;
|
||||||
|
//定义并初始化记录描述符结构体变量
|
||||||
|
fds_record_desc_t desc = {0};
|
||||||
|
//定义并初始化记录查找令牌结构体变量
|
||||||
|
fds_find_token_t tok = {0};
|
||||||
|
|
||||||
|
uint16_t tempidvalue;
|
||||||
|
//清零tok,从头查找
|
||||||
|
memset(&tok, 0x00, sizeof(fds_find_token_t));
|
||||||
|
//在DEVICE_FILE文件中查找记录m_version_record
|
||||||
|
rc = fds_record_find(DEVICE_FILE, DEVICE_SCHEME_KEY, &desc, &tok);
|
||||||
|
//查找到记录后,读取记录内容
|
||||||
|
if(rc == NRF_SUCCESS)
|
||||||
|
{
|
||||||
|
fds_flash_record_t temp = {0};
|
||||||
|
//打开记录读取记录内容
|
||||||
|
rc = fds_record_open(&desc, &temp);
|
||||||
|
APP_ERROR_CHECK(rc);
|
||||||
|
//拷贝记录内容
|
||||||
|
memcpy(&SchemeData, temp.p_data, sizeof(SchemeData_t));
|
||||||
|
//读取后,关闭记录
|
||||||
|
rc = fds_record_close(&desc);
|
||||||
|
APP_ERROR_CHECK(rc);
|
||||||
|
// 连接状态下发送方案ID
|
||||||
|
if(DeviceConnectState == ConnectState)
|
||||||
|
{
|
||||||
|
SchemeQuery(SchemeData.SchemeIDMSB,SchemeData.SchemeIDLSB);
|
||||||
|
}
|
||||||
|
// 未连接状态下给默认的治疗方案
|
||||||
|
else
|
||||||
|
{
|
||||||
|
StimStateInfoStructInit(SchemeData);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 存储管理中断处理函数
|
||||||
|
void FdsHandler(fds_record_desc_t *Desc,fds_find_token_t *Tok)
|
||||||
|
{
|
||||||
|
ret_code_t rc;
|
||||||
|
if(my_fds_info.read == true)//读取记录
|
||||||
|
{
|
||||||
|
my_fds_info.read = false;
|
||||||
|
read_scheme();//读取记录数据,并发送
|
||||||
|
}
|
||||||
|
//更新记录m_fw_record
|
||||||
|
if((my_fds_info.scheme_update == true) && (my_fds_info.busy == false))
|
||||||
|
{
|
||||||
|
//清零tok,从头查找
|
||||||
|
memset(Tok, 0x00, sizeof(fds_find_token_t));
|
||||||
|
//在DEVICE_FILE文件中查找记录m_fw_record
|
||||||
|
rc = fds_record_find(DEVICE_FILE, DEVICE_SCHEME_KEY, Desc, Tok);
|
||||||
|
if (rc == NRF_SUCCESS)
|
||||||
|
{
|
||||||
|
my_fds_info.busy = true;
|
||||||
|
my_fds_info.scheme_update = false;
|
||||||
|
//更新记录m_fw_record
|
||||||
|
rc = fds_record_update(Desc, &m_SchemePara);
|
||||||
|
APP_ERROR_CHECK(rc);
|
||||||
|
wait_for_fds_ready();
|
||||||
|
NRF_LOG_INFO("fds_record_update");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wdt_event_handler(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
void WdtInit(void)
|
||||||
|
{
|
||||||
|
ret_code_t err_code = NRF_SUCCESS;
|
||||||
|
|
||||||
|
//定义WDT配置结构体并使用
|
||||||
|
nrfx_wdt_config_t config = NRFX_WDT_DEAFULT_CONFIG;
|
||||||
|
//初始化WDT
|
||||||
|
err_code = nrfx_wdt_init(&config, wdt_event_handler);
|
||||||
|
//申请喂狗通道,也就是使用哪个
|
||||||
|
err_code = nrfx_wdt_channel_alloc(&m_channel_id);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
//启动WDT
|
||||||
|
nrfx_wdt_enable();
|
||||||
|
}
|
||||||
|
//喂狗函数
|
||||||
|
void WdtFeed(void)
|
||||||
|
{
|
||||||
|
//喂狗
|
||||||
|
nrfx_wdt_channel_feed(m_channel_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void clocks_start(void)
|
||||||
|
{
|
||||||
|
NRF_CLOCK->EVENTS_HFCLKSTARTED = 0;//清零高频时钟启动事件
|
||||||
|
NRF_CLOCK->TASKS_HFCLKSTART = 1; //启动高频时钟
|
||||||
|
//等待高频时钟启动完成
|
||||||
|
while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//驱动初始化
|
||||||
|
void DeviceInit(void)
|
||||||
|
{
|
||||||
|
/* 初始化控制gpio */
|
||||||
|
GpioInit();
|
||||||
|
clocks_start();
|
||||||
|
EXIT_KEY_Init();
|
||||||
|
/* 初始化APP定时器 */
|
||||||
|
AppTimersInit();
|
||||||
|
timer3_rms_init();
|
||||||
|
/* DACPWM初始化 */
|
||||||
|
// PwmDACInit();
|
||||||
|
|
||||||
|
/* SAADC初始化 */
|
||||||
|
battery_adc_init();
|
||||||
|
rms_saadc_init();
|
||||||
|
|
||||||
|
/* 采样的PPI初始化 */
|
||||||
|
//PPIPwmInit();
|
||||||
|
PPIEegAdcInit();
|
||||||
|
/* GPIOTE初始化 */
|
||||||
|
GpioteInit();
|
||||||
|
// nrf_gpio_pin_clear(H_CTL1_PWM);
|
||||||
|
// nrf_gpio_pin_clear(H_CTL2_PWM);
|
||||||
|
/* 刺激PWM初始化 */
|
||||||
|
pwm0_common_init();
|
||||||
|
|
||||||
|
pwm2common_init();
|
||||||
|
//timer1_output_ctrl_init();
|
||||||
|
/* 喂狗初始化 */
|
||||||
|
WdtInit();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//广播中添加MAC地址
|
||||||
|
void MacSet(void)
|
||||||
|
{
|
||||||
|
ble_gap_addr_t addr;
|
||||||
|
|
||||||
|
uint32_t err_code = sd_ble_gap_addr_get(&addr);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
memcpy(BLE_MAC,addr.addr,BLE_GAP_ADDR_LEN);
|
||||||
|
err_code = sd_ble_gap_addr_set(&addr);
|
||||||
|
APP_ERROR_CHECK(err_code);
|
||||||
|
}
|
||||||
|
void StartAdv(void)
|
||||||
|
{
|
||||||
|
//启动广播
|
||||||
|
advertising_start(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 关闭广播
|
||||||
|
void StopAdv(void)
|
||||||
|
{
|
||||||
|
NRF_LOG_INFO("StopAdv!");
|
||||||
|
|
||||||
|
sd_ble_gap_adv_stop(m_advertising.adv_handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
void user_ble_init(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
//初始化协议栈
|
||||||
|
ble_stack_init();
|
||||||
|
|
||||||
|
//变量初始化
|
||||||
|
VariableInit();
|
||||||
|
|
||||||
|
//配置GAP参数
|
||||||
|
gap_params_init();
|
||||||
|
//初始化GATT
|
||||||
|
gatt_init();
|
||||||
|
|
||||||
|
//初始化服务
|
||||||
|
services_init();
|
||||||
|
//在广播数据中添加MAC地址
|
||||||
|
MacSet();
|
||||||
|
//初始化广播
|
||||||
|
advertising_init();
|
||||||
|
|
||||||
|
//连接参数协商初始化
|
||||||
|
conn_params_init();
|
||||||
|
//配对管理器初始化
|
||||||
|
peer_manager_init();
|
||||||
|
//LOG打印信息
|
||||||
|
NRF_LOG_INFO("BLE started.");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//fds存储管理初始化
|
||||||
|
void fdsInit(ret_code_t rec,fds_record_desc_t desct,fds_find_token_t token)
|
||||||
|
{
|
||||||
|
|
||||||
|
//注册FDS事件回调函数接收FS事件
|
||||||
|
(void)fds_register(fds_evt_handler);
|
||||||
|
|
||||||
|
my_fds_info.busy = true;
|
||||||
|
rec = fds_init();//初始化FDS
|
||||||
|
APP_ERROR_CHECK(rec);//用错误处理模块检查函数返回值
|
||||||
|
//FDS初始化是异步的,因此要等待FDS初始化完成
|
||||||
|
wait_for_fds_ready();
|
||||||
|
//清零tok,从头查找
|
||||||
|
memset(&token, 0x00, sizeof(fds_find_token_t));
|
||||||
|
//在DEVICE_FILE文件中查找记录m_desp_record
|
||||||
|
rec = fds_record_find(DEVICE_FILE, DEVICE_SCHEME_KEY, &desct, &token);
|
||||||
|
|
||||||
|
NRF_LOG_INFO("rec = %d",rec);
|
||||||
|
|
||||||
|
//没有查找到m_desp_record记录,写入记录
|
||||||
|
if (rec != NRF_SUCCESS)
|
||||||
|
{
|
||||||
|
my_fds_info.busy = true;
|
||||||
|
StimStateInfoStructInit(PreStorageSchemeData); // 用预存的信息给刺激参数赋值
|
||||||
|
memcpy(SchemePara.text,&PreStorageSchemeData,sizeof(PreStorageSchemeData));
|
||||||
|
rec = fds_record_write(&desct, &m_SchemePara);
|
||||||
|
APP_ERROR_CHECK(rec);
|
||||||
|
wait_for_fds_ready();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
my_fds_info.read = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//主函数
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
ret_code_t rc;
|
||||||
|
//定义并初始化记录描述符结构体变量
|
||||||
|
fds_record_desc_t desc = {0};
|
||||||
|
//定义并初始化记录查找令牌结构体变量
|
||||||
|
fds_find_token_t tok = {0};
|
||||||
|
|
||||||
|
//初始化log程序模块
|
||||||
|
log_init();
|
||||||
|
//滤波器初始化
|
||||||
|
FilterInit();
|
||||||
|
// 设备预存信息初始化ID :101 腹直肌分离
|
||||||
|
PreStorageSchemeDataInit();
|
||||||
|
//fds存储管理初始化
|
||||||
|
fdsInit(rc,desc,tok);
|
||||||
|
//器件初始化
|
||||||
|
DeviceInit();
|
||||||
|
|
||||||
|
//初始化电源管理
|
||||||
|
power_management_init();
|
||||||
|
user_ble_init();
|
||||||
|
|
||||||
|
//启动已经创建的APP定时器
|
||||||
|
ApplicationTimersStart();
|
||||||
|
//主循环
|
||||||
|
while(true)
|
||||||
|
{
|
||||||
|
// 存储事件处理函数
|
||||||
|
FdsHandler(&desc,&tok);
|
||||||
|
//处理挂起的LOG和运行电源管理
|
||||||
|
idle_state_handle();
|
||||||
|
WdtFeed();
|
||||||
|
if(POWER_CLOSE == DeviceState)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
KeyPinHandler();// 按键中断处理
|
||||||
|
//输出电流控制
|
||||||
|
|
||||||
|
|
||||||
|
/* 适配器和电极片脱落状态变化上传 */
|
||||||
|
if(AdapterState == LastAdapterState)
|
||||||
|
{
|
||||||
|
StateUpLoad(AdapterState,ElectrodeStatusInfo);
|
||||||
|
if(AdapterState == AdapterConnected)
|
||||||
|
{
|
||||||
|
LastAdapterState = AdapterNotConnected;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LastAdapterState = AdapterConnected;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ElectrodeStatusInfo == LastElectrodeStatusInfo)
|
||||||
|
{
|
||||||
|
StateUpLoad(AdapterState,ElectrodeStatusInfo);
|
||||||
|
if(ElectrodeStatusInfo == ElectrodeFalloff)
|
||||||
|
{
|
||||||
|
LastElectrodeStatusInfo = ElectrodeConnectted;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LastElectrodeStatusInfo = ElectrodeFalloff;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
82
components/802_15_4/api/HAL/hal_atomic.h
Normal file
82
components/802_15_4/api/HAL/hal_atomic.h
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef HAL_ATOMIC_H_INCLUDED
|
||||||
|
#define HAL_ATOMIC_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* This file contains declarations of the Atomic section routines and necessary types.
|
||||||
|
*
|
||||||
|
* @defgroup hal_atomic HAL Atomic API
|
||||||
|
* @ingroup hal_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare HAL Atomic API
|
||||||
|
* @details The Atomic module implements atomic section interface. This is made by disabling the global interrupts,
|
||||||
|
* which is a hardware dependent feature. The user may call hal_atomic_start() to open an atomic section
|
||||||
|
* (disable interrupts) and hal_atomic_end() to exit from the section (restore interrupts). The algorithm
|
||||||
|
* supports nesting sections.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef volatile uint32_t atomic_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Enters atomic section.
|
||||||
|
*
|
||||||
|
* @details Disables global interrupts.
|
||||||
|
*
|
||||||
|
* @param[in] p_atomic pointer to buffer to store current value of the status register.
|
||||||
|
*/
|
||||||
|
void hal_atomic_start(atomic_t * p_atomic);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Exits atomic section
|
||||||
|
*
|
||||||
|
* @details Restores status register
|
||||||
|
*
|
||||||
|
* @param[in] p_atomic pointer to buffer to restore current value of the status register from.
|
||||||
|
*/
|
||||||
|
void hal_atomic_end(atomic_t * p_atomic);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // HAL_ATOMIC_H_INCLUDED
|
||||||
59
components/802_15_4/api/HAL/hal_clock.h
Normal file
59
components/802_15_4/api/HAL/hal_clock.h
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef HAL_CLOCK_H_INCLUDED
|
||||||
|
#define HAL_CLOCK_H_INCLUDED
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup hal_clock HAL Clock API
|
||||||
|
* @ingroup hal_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare HAL Clock library
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @brief This function performs initialization and configuration of processor's
|
||||||
|
* clock module.
|
||||||
|
*/
|
||||||
|
void hal_clock_init(void);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif /* HAL_CLOCK_H_INCLUDED */
|
||||||
113
components/802_15_4/api/HAL/hal_debug_interface.h
Normal file
113
components/802_15_4/api/HAL/hal_debug_interface.h
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef HAL_DEBUG_INTERFACE_H_INCLUDED
|
||||||
|
#define HAL_DEBUG_INTERFACE_H_INCLUDED
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(NRF52) || defined(NRF52840_XXAA)
|
||||||
|
|
||||||
|
#include "nrf_assert.h"
|
||||||
|
|
||||||
|
#endif // NRF52
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup hal_debug_interface HAL Debug Interface
|
||||||
|
* @ingroup hal_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare HAL debug interface
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef CONFIG_DEBUG
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define HAL_DEBUG_INTERFACE_INIT() hal_debug_init()
|
||||||
|
#define HAL_DEBUG_INTERFACE_PUT(c, n) hal_debug_put(c, n)
|
||||||
|
#define HAL_DEBUG_INTERFACE_PUTC(c) hal_debug_putc(c)
|
||||||
|
#define HAL_DEBUG_INTERFACE_PUTS(s) hal_debug_puts(s)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Debug interface initialization
|
||||||
|
*/
|
||||||
|
void hal_debug_init(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sends string to the debug interface
|
||||||
|
*
|
||||||
|
* @details send debug data using debug interface
|
||||||
|
*
|
||||||
|
* @param[in] p_data debug string.
|
||||||
|
* @param[in] len string length.
|
||||||
|
*/
|
||||||
|
void hal_debug_put(const void * p_data, uint8_t len);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sends char symbol to the debug interface
|
||||||
|
*
|
||||||
|
* @details send debug data using debug interface
|
||||||
|
*
|
||||||
|
* @param[in] data char symbol.
|
||||||
|
*/
|
||||||
|
void hal_debug_putc(const char data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sends a null-terminated string to the debug interface
|
||||||
|
*
|
||||||
|
* @details send debug data using debug interface
|
||||||
|
*
|
||||||
|
* @param[in] p_data null-terminated string.
|
||||||
|
*/
|
||||||
|
void hal_debug_puts(const char * p_data);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* If debug is disabled, these macros are just a stub.*/
|
||||||
|
#define HAL_DEBUG_INTERFACE_INIT()
|
||||||
|
#define HAL_DEBUG_INTERFACE_PUT(c, n)
|
||||||
|
#define HAL_DEBUG_INTERFACE_PUTC(c)
|
||||||
|
#define HAL_DEBUG_INTERFACE_PUTS(s)
|
||||||
|
|
||||||
|
#endif // CONFIG_DEBUG
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // HAL_DEBUG_INTERFACE_H_INCLUDED
|
||||||
65
components/802_15_4/api/HAL/hal_delay.h
Normal file
65
components/802_15_4/api/HAL/hal_delay.h
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef HAL_DELAY_H_INCLUDED
|
||||||
|
#define HAL_DELAY_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* This file contains declaration of the Hardware Delay routine.
|
||||||
|
*
|
||||||
|
* @defgroup hal_delay HAL Delay API
|
||||||
|
* @ingroup hal_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare HAL Delay API
|
||||||
|
* @details The Delay module implements the only hal_delay() routine to delay the execution for some microseconds.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief Function for delaying execution for number of microseconds.
|
||||||
|
*
|
||||||
|
* @param[in] number_of_us number of microseconds to delay.
|
||||||
|
*/
|
||||||
|
void hal_delay(uint32_t number_of_us);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // HAL_DELAY_H_INCLUDED
|
||||||
54
components/802_15_4/api/HAL/hal_led.h
Normal file
54
components/802_15_4/api/HAL/hal_led.h
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef HAL_LED_H_INCLUDED
|
||||||
|
#define HAL_LED_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define HAL_LED_AMOUNT 4
|
||||||
|
|
||||||
|
void hal_led_init(uint32_t led_mask);
|
||||||
|
void hal_led_on(uint32_t led_mask);
|
||||||
|
void hal_led_off(uint32_t led_mask);
|
||||||
|
void hal_led_toggle(uint32_t led_mask);
|
||||||
|
|
||||||
|
#endif /* HAL_LED_H_INCLUDED */
|
||||||
89
components/802_15_4/api/HAL/hal_mutex.h
Normal file
89
components/802_15_4/api/HAL/hal_mutex.h
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef HAL_MUTEX_H_INCLUDED
|
||||||
|
#define HAL_MUTEX_H_INCLUDED
|
||||||
|
|
||||||
|
#include "hal_atomic.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* This is a simple mutex interface to be used in System Memory Manager
|
||||||
|
* to make it thread aware.
|
||||||
|
*
|
||||||
|
* @defgroup hal_mutex HAL Mutex API
|
||||||
|
* @ingroup hal_15_4
|
||||||
|
* @{
|
||||||
|
* @details NRF52 implementation is void and PC implementation is identical to atomic.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#if defined ( __GNUC__ )
|
||||||
|
#include <signal.h>
|
||||||
|
typedef volatile sig_atomic_t mutex_t;
|
||||||
|
#else
|
||||||
|
#include <stdint.h>
|
||||||
|
typedef volatile uint32_t mutex_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Configures mutex lock before first usage.
|
||||||
|
*
|
||||||
|
* @param[inout] p_mutex pointer to mutex variable.
|
||||||
|
*/
|
||||||
|
void hal_mutex_init(mutex_t * p_mutex);
|
||||||
|
|
||||||
|
/**@brief Atomically sets mutex. If set is failed, enters spin lock loop.
|
||||||
|
*
|
||||||
|
* @param[in] p_mutex pointer to mutex variable.
|
||||||
|
*/
|
||||||
|
void hal_mutex_lock(mutex_t * p_mutex);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Atomically clears mutex. Every other thread, spinning at this lock may
|
||||||
|
* try to lock it afterwards.
|
||||||
|
*
|
||||||
|
* @param[in] p_mutex pointer to mutex variable.
|
||||||
|
*/
|
||||||
|
void hal_mutex_unlock(mutex_t * p_mutex);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif /* HAL_MUTEX_H_INCLUDED */
|
||||||
70
components/802_15_4/api/HAL/hal_rng.h
Normal file
70
components/802_15_4/api/HAL/hal_rng.h
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef HAL_RNG_H_INCLUDED
|
||||||
|
#define HAL_RNG_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* This file contains declaration of the random number generator routine.
|
||||||
|
*
|
||||||
|
* @defgroup hal_rng HAL Random Number Generator API
|
||||||
|
* @ingroup hal_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare HAL Random Number Generator API
|
||||||
|
* @details The Random number generator module implements the only hal_rand_get() routine to get an unsigned 8-bits
|
||||||
|
* random number generated by hardware.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief Initialize hardware random generator.
|
||||||
|
*/
|
||||||
|
extern void hal_rand_init(void);
|
||||||
|
|
||||||
|
/**@brief Generates random number using hardware.
|
||||||
|
*
|
||||||
|
* @return An unsigned 8-bits random number.
|
||||||
|
*/
|
||||||
|
extern uint8_t hal_rand_get(void);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif /* HAL_RNG_H_INCLUDED */
|
||||||
100
components/802_15_4/api/HAL/hal_sleep.h
Normal file
100
components/802_15_4/api/HAL/hal_sleep.h
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef HAL_SLEEP_H_INCLUDED
|
||||||
|
#define HAL_SLEEP_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* This file contains declaration of the HAL sleep interface.
|
||||||
|
*
|
||||||
|
* @defgroup hal_sleep HAL Sleep API
|
||||||
|
* @ingroup hal_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare HAL Sleep API
|
||||||
|
* @details The Sleep module implements the only hal_sleep() routine to put the hardware to the sleep mode for some
|
||||||
|
* milliseconds. The user can use convenient macros DAYS_TO_MS(), HOURS_TO_MS(), MINS_TO_MS(), and SEC_TO_MS()
|
||||||
|
* to convert different time periods into milliseconds. Please note that this module requires a call to
|
||||||
|
* hal_sleep_init() which is in turn called by sys_init() before using any module routines. This module is
|
||||||
|
* only used to implement the System Sleep interface. The hal_sleep() routine is not assumed to be used by
|
||||||
|
* the user explicitly.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief Converts days to milliseconds */
|
||||||
|
#define DAYS_TO_MS(d) ((d) * 3600L * 24L * 1000L )
|
||||||
|
|
||||||
|
/**@brief Converts hours to milliseconds */
|
||||||
|
#define HOURS_TO_MS(h) ((h) * 3600L * 1000L )
|
||||||
|
|
||||||
|
/**@brief Converts minutes to milliseconds */
|
||||||
|
#define MINS_TO_MS(m) ((m) * 60L * 1000L )
|
||||||
|
|
||||||
|
/**@brief Converts seconds to milliseconds */
|
||||||
|
#define SEC_TO_MS(s) ((s) * 1000L )
|
||||||
|
|
||||||
|
/**@brief Information, provided by the HAL, in order to explain the reason,
|
||||||
|
* which caused the system to wake up.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
UNKNOWN_INTERRUPT, /**< HAL can't define a wake up reason */
|
||||||
|
RTC_CC_INTERRUPT /**< RTC interrupt was the awakening reason */
|
||||||
|
} hal_wakeup_reason_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Puts hardware into the sleep mode for some milliseconds.
|
||||||
|
*
|
||||||
|
* @param[in] sleep_time_ms Time to sleep in ms
|
||||||
|
*
|
||||||
|
* @retval wakeup_reason Specifies reason of awakening
|
||||||
|
*/
|
||||||
|
hal_wakeup_reason_t hal_sleep(uint32_t sleep_time_ms);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Initialization of the sleep module
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void hal_sleep_init(void);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif /* HAL_SLEEP_H_INCLUDED */
|
||||||
124
components/802_15_4/api/HAL/hal_task_scheduler.h
Normal file
124
components/802_15_4/api/HAL/hal_task_scheduler.h
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef HAL_TASK_H_INCLUDED
|
||||||
|
#define HAL_TASK_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "hal_atomic.h"
|
||||||
|
#include "sys_utils.h"
|
||||||
|
#include "sys_task_scheduler.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup hal_task HAL Tasks
|
||||||
|
* @ingroup hal_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare HAL tasks library
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief Identifiers for registered HAL handlers.
|
||||||
|
*
|
||||||
|
* @details enumeration with identifiers of registered HAL handlers.
|
||||||
|
* HAL handlers will be called from the HAL task.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
HAL_TIMER_TASK_ID,
|
||||||
|
HAL_UART_TASK_ID,
|
||||||
|
HAL_TIMER_CRITICAL_MANUAL_TASK,
|
||||||
|
HAL_TASKS_AMOUNT,
|
||||||
|
} hal_task_id_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Prototype of a HAL task handler.
|
||||||
|
*
|
||||||
|
* @details Handler which will be called from HAL task.
|
||||||
|
*/
|
||||||
|
typedef void (* hal_task_handler_t)(void);
|
||||||
|
|
||||||
|
|
||||||
|
void hal_task_handler(void);
|
||||||
|
void hal_timer_task_handler(void);
|
||||||
|
void hal_uart_task_handler(void);
|
||||||
|
void hal_timer_critical_manual_handler(void);
|
||||||
|
|
||||||
|
/**@brief Pending HAL tasks.
|
||||||
|
*
|
||||||
|
* @details Variable which includes markers of pending HAL tasks.
|
||||||
|
*/
|
||||||
|
extern volatile uint_fast16_t g_hal_tasks;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Notify task scheduler to add a HAL task for execution.
|
||||||
|
*
|
||||||
|
* @details The function sets a marker for the HAL task for execution.
|
||||||
|
*
|
||||||
|
* @param[in] hal_task_id HAL task identifier (see \ref hal_task_id_t enumeration).
|
||||||
|
*/
|
||||||
|
static inline void hal_task_post(hal_task_id_t hal_task_id)
|
||||||
|
{
|
||||||
|
atomic_t atomic = 0;
|
||||||
|
|
||||||
|
hal_atomic_start(&atomic);
|
||||||
|
g_hal_tasks |= BIT(hal_task_id);
|
||||||
|
hal_atomic_end(&atomic);
|
||||||
|
|
||||||
|
sys_task_post(HAL_TASK_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@brief Removes a task from pending list in HAL task scheduler.
|
||||||
|
*
|
||||||
|
* @details The function removes a marker from the HAL execution list.
|
||||||
|
*
|
||||||
|
* @param[in] hal_task_id HAL task identifier (see \ref hal_task_id_t enumeration).
|
||||||
|
*/
|
||||||
|
static inline void hal_task_unpost(hal_task_id_t hal_task_id)
|
||||||
|
{
|
||||||
|
atomic_t atomic = 0;
|
||||||
|
|
||||||
|
hal_atomic_start(&atomic);
|
||||||
|
g_hal_tasks &= ~BIT(hal_task_id);
|
||||||
|
hal_atomic_end(&atomic);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // HAL_TASK_H_INCLUDED
|
||||||
80
components/802_15_4/api/HAL/hal_timer.h
Normal file
80
components/802_15_4/api/HAL/hal_timer.h
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef HAL_TIMER_H_INCLUDED
|
||||||
|
#define HAL_TIMER_H_INCLUDED
|
||||||
|
|
||||||
|
#include "hal_delay.h"
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup hal_timer HAL Timer
|
||||||
|
* @ingroup hal_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare HAL timer interface
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief Initializes hardware timer.
|
||||||
|
*/
|
||||||
|
void hal_timer_init(void);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Starts hardware timer.
|
||||||
|
*
|
||||||
|
* @param[in] interval timer interval in microseconds for timer start.
|
||||||
|
*/
|
||||||
|
void hal_timer_start(uint64_t interval);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Stops hardware timer.
|
||||||
|
*/
|
||||||
|
void hal_timer_stop(void);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Reads microseconds passed since the device start.
|
||||||
|
*
|
||||||
|
* @return time in microseconds since the device was launched.
|
||||||
|
*/
|
||||||
|
uint64_t hal_time_get(void);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif /* HAL_TIMER_H_INCLUDED */
|
||||||
82
components/802_15_4/api/HAL/hal_timer_critical.h
Normal file
82
components/802_15_4/api/HAL/hal_timer_critical.h
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef HAL_TIMER_CRITICAL_H_INCLUDED
|
||||||
|
#define HAL_TIMER_CRITICAL_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup hal_timer_critical HAL Hardware Critical Timer
|
||||||
|
* @ingroup hal_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare HAL hardware critical timer interface
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief Prototype for critical timer handler.
|
||||||
|
*/
|
||||||
|
typedef void (* hal_timer_critical_handler_t)(void);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Starts hardware critical timer.
|
||||||
|
*
|
||||||
|
* @param[in] interval_us timer interval for timer start.
|
||||||
|
* @param[in] handler critical timer event handler.
|
||||||
|
*/
|
||||||
|
void hal_timer_critical_start(uint32_t interval_us, hal_timer_critical_handler_t handler);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Stops hardware critical timer.
|
||||||
|
*/
|
||||||
|
void hal_timer_critical_stop(void);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Check if critical timer is currently used.
|
||||||
|
*
|
||||||
|
* @retval timer_state true - timer is running now
|
||||||
|
* false - timer in stop mode
|
||||||
|
*/
|
||||||
|
bool is_critical_timer_started(void);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif /* HAL_TIMER_CRITICAL_H_INCLUDED */
|
||||||
103
components/802_15_4/api/HAL/hal_trace_interface.h
Normal file
103
components/802_15_4/api/HAL/hal_trace_interface.h
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef HAL_TRACE_INTERFACE_H_INCLUDED
|
||||||
|
#define HAL_TRACE_INTERFACE_H_INCLUDED
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup hal_trace_interface HAL Trace Interface
|
||||||
|
* @ingroup hal_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare HAL Trace Interface
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef CONFIG_TRACE
|
||||||
|
|
||||||
|
#include "hal_uart.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define HAL_TRACE_INTERFACE_REUSE(p_uart_desc) hal_trace_reuse(p_uart_desc)
|
||||||
|
#define HAL_TRACE_INTERFACE_INIT() hal_trace_init()
|
||||||
|
#define HAL_TRACE_INTERFACE_PUTS(s) hal_trace_puts(s)
|
||||||
|
#define HAL_TRACE_INTERFACE_FINALIZE() hal_trace_finalize()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace interface initialization
|
||||||
|
*/
|
||||||
|
void hal_trace_init(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initializes trace interface, using already initialized UART.
|
||||||
|
*
|
||||||
|
* @param[in] p_uart_desc UART descriptor, which has been already initialized.
|
||||||
|
*/
|
||||||
|
void hal_trace_reuse(hal_uart_descriptor_t * p_uart_desc);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sends a null-terminated string to the debug interface
|
||||||
|
*
|
||||||
|
* @details send debug data using debug interface
|
||||||
|
*
|
||||||
|
* @param[in] p_data null-terminated string.
|
||||||
|
*/
|
||||||
|
void hal_trace_puts(const char * p_data);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Finalizes buffered trace data output to UART,
|
||||||
|
* before commencing non-buffered assertion output
|
||||||
|
*/
|
||||||
|
void hal_trace_finalize(void);
|
||||||
|
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* If debug is disabled, these macros are just a stub.*/
|
||||||
|
#define HAL_TRACE_INTERFACE_REUSE(p_uart_desc)
|
||||||
|
#define HAL_TRACE_INTERFACE_INIT()
|
||||||
|
#define HAL_TRACE_INTERFACE_PUTS(s)
|
||||||
|
#define HAL_TRACE_INTERFACE_FINALIZE()
|
||||||
|
|
||||||
|
#endif // CONFIG_DEBUG
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // HAL_TRACE_INTERFACE_H_INCLUDED
|
||||||
284
components/802_15_4/api/HAL/hal_uart.h
Normal file
284
components/802_15_4/api/HAL/hal_uart.h
Normal file
@ -0,0 +1,284 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef HAL_UART_H_INCLUDED
|
||||||
|
#define HAL_UART_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* This file contains declarations of the routines, types and macros to implement the UART protocol.
|
||||||
|
*
|
||||||
|
* @defgroup hal_uart HAL UART protocol
|
||||||
|
* @ingroup hal_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare HAL UART protocol
|
||||||
|
* @details The UART module implements the standard UART driver API. This includes open/close via hal_uart_open(),
|
||||||
|
* hal_uart_close(), read/write via hal_uart_read(), hal_uart_write() routines, and hal_uart_puts() for
|
||||||
|
* sending a null-terminated string in a non-blocking way. The user also can get some info about the available
|
||||||
|
* bytes for read/write via hal_uart_read_buffer_size_get() and hal_uart_write_buffer_size_get(). This implies
|
||||||
|
* that the user may register read/write buffers to use for buffered input/output and handler routines that
|
||||||
|
* will be called upon read/written characters. Also the most popular settings of the UART driver are supported:
|
||||||
|
* different baudrates, parity checks, flow control, character size, and stop bits.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @brief Maximum size in bytes of input and output buffers. */
|
||||||
|
#define MAX_QUEUE_LENGTH 0xffffu
|
||||||
|
|
||||||
|
/** @brief Maximum size in bytes of data can be stored in hardware unit output buffer. */
|
||||||
|
#define MAX_TX_CHUNK_SIZE UCHAR_MAX
|
||||||
|
|
||||||
|
/** @brief UART baudrate. */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
HAL_UART_BAUDRATE_38400, /**< 38400 bits per second.*/
|
||||||
|
HAL_UART_BAUDRATE_115200, /**< 115200 bits per second.*/
|
||||||
|
HAL_UART_BAUDRATE_230400 /**< 230400 bits per second.*/
|
||||||
|
} hal_uart_baudrate_t;
|
||||||
|
|
||||||
|
/** @brief UART parity check. */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
HAL_UART_PARITY_NONE, /**< Do not check parity.*/
|
||||||
|
HAL_UART_PARITY_EVEN /**< Check even parity.*/
|
||||||
|
} hal_uart_parity_t;
|
||||||
|
|
||||||
|
/** @brief UART flow control. */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
HAL_UART_FLOW_CONTROL_DISABLED, /**< Flow control is disabled.*/
|
||||||
|
HAL_UART_FLOW_CONTROL_ENABLED, /**< Flow control is enabled.*/
|
||||||
|
} hal_uart_flow_control_t;
|
||||||
|
|
||||||
|
/** @brief UART character size settings. */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
HAL_UART_FIVE_BITS_CHAR = 5, /**< 5 bits character.*/
|
||||||
|
HAL_UART_SIX_BITS_CHAR, /**< 6 bits character.*/
|
||||||
|
HAL_UART_SEVEN_BITS_CHAR, /**< 7 bits character.*/
|
||||||
|
HAL_UART_EIGHT_BITS_CHAR, /**< 8 bits character.*/
|
||||||
|
} hal_uart_char_size_t;
|
||||||
|
|
||||||
|
/** @brief UART stop bits settings. */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
HAL_UART_ONE_STOP_BIT, /**< 1 stop bit.*/
|
||||||
|
HAL_UART_ONEHALF_STOP_BITS, /**< 1.5 stop bits.*/
|
||||||
|
HAL_UART_TWO_STOP_BITS, /**< 2 stop bits.*/
|
||||||
|
} hal_uart_stop_bits_t;
|
||||||
|
|
||||||
|
/** @brief Represents error source for the UART driver. There might be other values,
|
||||||
|
* representing clearer elaborating of error statuses, if this module is used
|
||||||
|
* with Windows or Linux.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
HAL_UART_ERROR_NONE = 0, /**< Success.*/
|
||||||
|
HAL_UART_ERROR_TX_OVERFLOW = 252, /**< This error happens when amount of elements in
|
||||||
|
the transmitter ring buffer exceeds its size.
|
||||||
|
All the data above limit is not placed into
|
||||||
|
buffer.*/
|
||||||
|
HAL_UART_ERROR_RX_OVERFLOW = 253, /**< This error happens when amount of elements in
|
||||||
|
the receiver ring buffer exceeds its size.
|
||||||
|
All the unread data is overwritten with new
|
||||||
|
received data.*/
|
||||||
|
HAL_UART_ERROR_RX_UNDERFLOW = 254, /**< This error happens when the user-side software
|
||||||
|
tries to read more elements than it is available
|
||||||
|
in the receive buffer.
|
||||||
|
The user-side buffer will be filled with all available
|
||||||
|
characters and then the error handler is started.*/
|
||||||
|
HAL_UART_ERROR_HW_ERROR = 255, /**< There is some unrecoverable error in hardware.*/
|
||||||
|
} hal_uart_error_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief User-side handler of UART read and write events.
|
||||||
|
*
|
||||||
|
* @param[in] channel event channel number.
|
||||||
|
* @param[in] char_count number of characters successfully sent before entering
|
||||||
|
* the callback function.
|
||||||
|
*/
|
||||||
|
typedef void (*hal_uart_handler_t)(uint32_t channel, size_t char_count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief User-side handler for UART error events.
|
||||||
|
*
|
||||||
|
* @param[in] channel event channel number.
|
||||||
|
* @param[in] error_id call reason.
|
||||||
|
*/
|
||||||
|
typedef void (*hal_uart_error_handler_t)(uint32_t channel, hal_uart_error_t error_id);
|
||||||
|
|
||||||
|
/** @brief HAL UART configuration structure.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t module; /**< UART module number. By now zero
|
||||||
|
is the only option.*/
|
||||||
|
uint32_t tx_pin; /**< Number of pin used as TX.*/
|
||||||
|
uint32_t rx_pin; /**< Number of pin used as RX.*/
|
||||||
|
uint32_t cts_pin; /**< Number of pin used as CTS.*/
|
||||||
|
uint32_t rts_pin; /**< Number of pin used as RTS.*/
|
||||||
|
hal_uart_baudrate_t baudrate; /**< Baudrate selector.*/
|
||||||
|
hal_uart_parity_t parity; /**< Parity selector.*/
|
||||||
|
hal_uart_flow_control_t flow_control; /**< Flow control selector.*/
|
||||||
|
hal_uart_char_size_t char_size; /**< Size of char in bits.*/
|
||||||
|
hal_uart_stop_bits_t stop_bits; /**< Stop bits number.*/
|
||||||
|
} hal_uart_config_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This structure defines the UART module operation.
|
||||||
|
*
|
||||||
|
* If \a write_buffer_ptr is defined as NULL, then sending data will work
|
||||||
|
* in blocking way, that is call for \a hal_uart_write will be completed
|
||||||
|
* only after sending of the last byte passed as input parameter.
|
||||||
|
*
|
||||||
|
* If \a read_buffer_ptr is defined as NULL, then driver will drop every
|
||||||
|
* received byte.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
hal_uart_config_t uart_config; /**< UART settings struct.*/
|
||||||
|
hal_uart_handler_t write_handler; /**< Callback function for write operation.*/
|
||||||
|
void * write_buffer_ptr; /**< User-side buffer for write operation.*/
|
||||||
|
size_t write_buffer_size; /**< Size of write operation buffer.*/
|
||||||
|
hal_uart_handler_t read_handler; /**< Callback function for read operation.*/
|
||||||
|
void * read_buffer_ptr; /**< User-side buffer for read operation.*/
|
||||||
|
size_t read_buffer_size; /**< Size of read operation buffer.*/
|
||||||
|
hal_uart_error_handler_t error_handler; /**< Callback function in case of something
|
||||||
|
goes wrong.*/
|
||||||
|
} hal_uart_descriptor_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Configures UART interface using input parameter.
|
||||||
|
*
|
||||||
|
* @param[in] config pointer to a config struct.
|
||||||
|
* @param[in] descriptor pointer to a descriptor struct.
|
||||||
|
*
|
||||||
|
* @return Return status of operation.
|
||||||
|
*/
|
||||||
|
hal_uart_error_t hal_uart_open(const hal_uart_config_t * config,
|
||||||
|
const hal_uart_descriptor_t * descriptor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sends data in a non-blocking way.
|
||||||
|
*
|
||||||
|
* @param[in] descriptor pointer to the UART module operation structure.
|
||||||
|
* @param[in] data pointer to the user-side buffer of output data.
|
||||||
|
* @param[in] length number of bytes to transmit.
|
||||||
|
*
|
||||||
|
* If descriptor has a non-null \a write_buffer_ptr then this function will use it
|
||||||
|
* as a temporary buffer and will copy input \a data to it before starting
|
||||||
|
* transmit. If descriptor has the NULL \a write_buffer_ptr, then the user-side code
|
||||||
|
* is responsible to retain \a data until \a write_handler is called.
|
||||||
|
*/
|
||||||
|
void hal_uart_write(const hal_uart_descriptor_t * descriptor,
|
||||||
|
const uint8_t * data,
|
||||||
|
const size_t length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sends a null-terminated C-string in a non-blocking way.
|
||||||
|
*
|
||||||
|
* @param[in] descriptor pointer to the UART module operation structure.
|
||||||
|
* @param[in] s null-terminated string to send.
|
||||||
|
*/
|
||||||
|
void hal_uart_puts(const hal_uart_descriptor_t * descriptor, const char * s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Receives data in a non-blocking way.
|
||||||
|
*
|
||||||
|
* @param[in] descriptor pointer to the UART module operation structure.
|
||||||
|
* @param[out] data pointer to the user-side buffer used to receive data.
|
||||||
|
* @param[in] length number of bytes to receive.
|
||||||
|
*
|
||||||
|
* If descriptor has a non-null \a read_buffer_ptr, then this function is used to
|
||||||
|
* copy input characters from it to \a data.
|
||||||
|
* If \a read_buffer_ptr is NULL, then this function ignores all inputs.
|
||||||
|
*/
|
||||||
|
void hal_uart_read(const hal_uart_descriptor_t * descriptor,
|
||||||
|
uint8_t * data,
|
||||||
|
const size_t length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns number of bytes available to read from the income buffer of the
|
||||||
|
* driver.
|
||||||
|
*
|
||||||
|
* @param[in] descriptor pointer to driver structure.
|
||||||
|
*
|
||||||
|
* @return Number of bytes available to read.
|
||||||
|
*/
|
||||||
|
size_t hal_uart_read_buffer_size_get(const hal_uart_descriptor_t * descriptor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns number of bytes available to write to the outgoing buffer of the
|
||||||
|
* driver.
|
||||||
|
*
|
||||||
|
* @param[in] descriptor pointer to driver structure.
|
||||||
|
*
|
||||||
|
* @return Number of bytes available to write.
|
||||||
|
*/
|
||||||
|
size_t hal_uart_write_buffer_size_get(const hal_uart_descriptor_t * descriptor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function deallocates resources previously allocated by hal_uart_open.
|
||||||
|
*
|
||||||
|
* @param[in] descriptor pointer to driver structure.
|
||||||
|
*
|
||||||
|
* @return Return status of operation.
|
||||||
|
*/
|
||||||
|
hal_uart_error_t hal_uart_close(const hal_uart_descriptor_t * descriptor);
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(CONFIG_TRACE) && defined(CONFIG_DEBUG)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Finalizes remaining trace data output to UART.
|
||||||
|
*
|
||||||
|
* @details This debugging feature is needed to finalize buffered trace output
|
||||||
|
* to UART before commencing non-buffered assertion output.
|
||||||
|
*/
|
||||||
|
void hal_uart_trace_finalize(void);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif /* HAL_UART_H_INCLUDED */
|
||||||
105
components/802_15_4/api/HAL/hal_uart_task_scheduler.h
Normal file
105
components/802_15_4/api/HAL/hal_uart_task_scheduler.h
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef HAL_UART_TASK_SCHEDULER_H_INCLUDED
|
||||||
|
#define HAL_UART_TASK_SCHEDULER_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "hal_atomic.h"
|
||||||
|
#include "hal_task_scheduler.h"
|
||||||
|
#include "sys_utils.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup hal_uart_task_scheduler HAL UART Task Scheduler
|
||||||
|
* @ingroup hal_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare HAL UART Task Scheduler interface
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief Identifiers for registered UART event handlers.
|
||||||
|
*
|
||||||
|
* @details enumeration with identifiers of registered UART event handlers.
|
||||||
|
* UART handlers will be called from the HAL_UART task. */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
HAL_UART_RX_TASK_ID,
|
||||||
|
HAL_UART_TX_TASK_ID,
|
||||||
|
HAL_UART_ERROR_TASK_ID,
|
||||||
|
HAL_UART_TASKS_AMOUNT,
|
||||||
|
} hal_uart_task_id_t;
|
||||||
|
|
||||||
|
/**@brief Prototype of a UART task handler.
|
||||||
|
*
|
||||||
|
* @details Handler which will be called from HAL_UART task. */
|
||||||
|
typedef void (* hal_uart_task_handler_t)(uint32_t channel);
|
||||||
|
|
||||||
|
void hal_uart_rx_handler(uint32_t channel);
|
||||||
|
void hal_uart_tx_handler(uint32_t channel);
|
||||||
|
void hal_uart_error_handler(uint32_t channel);
|
||||||
|
|
||||||
|
/**@brief UART channels.
|
||||||
|
*
|
||||||
|
* @details Array which includes event id for every channel it happened. */
|
||||||
|
extern volatile uint16_t g_hal_uart_modules_tasks[CONFIG_HAL_UART_CHANNELS];
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Notifies HAL task scheduler to add an UART task for execution.
|
||||||
|
*
|
||||||
|
* @details The function sets a marker for the UART event task for execution.
|
||||||
|
* And sets this marker for a channel where event happened.
|
||||||
|
*
|
||||||
|
* @param[in] channel event channel.
|
||||||
|
* @param[in] hal_uart_task_id HAL task identificator. */
|
||||||
|
static inline void hal_uart_task_post(uint32_t channel,
|
||||||
|
uint8_t hal_uart_task_id)
|
||||||
|
{
|
||||||
|
atomic_t atomic = 0;
|
||||||
|
|
||||||
|
hal_atomic_start(&atomic);
|
||||||
|
g_hal_uart_modules_tasks[channel] |= BIT(hal_uart_task_id);
|
||||||
|
hal_atomic_end(&atomic);
|
||||||
|
|
||||||
|
hal_task_post(HAL_UART_TASK_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif /* HAL_UART_TASK_SCHEDULER_H_INCLUDED */
|
||||||
90
components/802_15_4/api/HAL/nrf52_soc/hal_nrf52_exceptions.h
Normal file
90
components/802_15_4/api/HAL/nrf52_soc/hal_nrf52_exceptions.h
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef HAL_EXCEPTIONS_H_INCLUDED
|
||||||
|
#define HAL_EXCEPTIONS_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup hal_15_4_nrf52 Chip-specific library interface
|
||||||
|
* @ingroup hal_15_4
|
||||||
|
*
|
||||||
|
* @defgroup hal_nrf52_exceptions HAL exceptions
|
||||||
|
* @ingroup hal_15_4_nrf52
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @brief Size of stack dump in 4-byte words.*/
|
||||||
|
#define HAL_EXCEPTIONS_DUMP_SIZE 16
|
||||||
|
/** @brief Defines where to put a '\n' in stack dump.
|
||||||
|
*
|
||||||
|
* This value defines power of 2 items in one row.
|
||||||
|
* E.g. 3 gives 2 ^ 3 = 8 items in a row.*/
|
||||||
|
#define HAL_EXCEPTIONS_ITEMS_IN_LINE 3
|
||||||
|
|
||||||
|
/** @brief This structure holds values of fault status registers.*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t CFSR; /*!< Configurable Fault Status Register.*/
|
||||||
|
uint32_t HFSR; /*!< HardFault Status Register.*/
|
||||||
|
uint32_t DFSR; /*!< Debug Fault Status Register.*/
|
||||||
|
uint32_t AFSR; /*!< Auxiliary Fault Status Register.*/
|
||||||
|
} hal_exceptions_status_registers_t;
|
||||||
|
|
||||||
|
/** @brief This structure is put into dump monitor port and holds values of said
|
||||||
|
* registers when exception has happen.*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t R0; /**< Register R0 (Argument 1 / word result).*/
|
||||||
|
uint32_t R1; /**< Register R1 (Argument 2 / double-word result).*/
|
||||||
|
uint32_t R2; /**< Register R2 (Argument 3).*/
|
||||||
|
uint32_t R3; /**< Register R3 (Argument 4).*/
|
||||||
|
uint32_t R12; /**< Register R12 (Scratch register (corruptible)).*/
|
||||||
|
uint32_t LR; /**< Link register (R14).*/
|
||||||
|
uint32_t PC; /**< Program counter (R15).*/
|
||||||
|
uint32_t PSR; /**< Combined processor status register.*/
|
||||||
|
uint32_t* FP; /**< Value of register, which may be used as Frame Pointer.*/
|
||||||
|
} hal_exceptions_dump_t;
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // HAL_EXCEPTIONS_H_INCLUDED
|
||||||
107
components/802_15_4/api/HAL/nrf52_soc/hal_nrf52_rtc.h
Normal file
107
components/802_15_4/api/HAL/nrf52_soc/hal_nrf52_rtc.h
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef HAL_NRF52_RTC_H_INCLUDED
|
||||||
|
#define HAL_NRF52_RTC_H_INCLUDED
|
||||||
|
|
||||||
|
#include "nordic_common.h"
|
||||||
|
#include "nrf_drv_config.h"
|
||||||
|
#include "nrf_drv_common.h"
|
||||||
|
#include "nrf_drv_rtc.h"
|
||||||
|
#include "nrf_rtc.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup hal_nrf52_rtc HAL RTC
|
||||||
|
* @ingroup hal_15_4_nrf52
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
// RTC counter bitlenght
|
||||||
|
#define LAGEST_PRESCALER_VALUE 4096
|
||||||
|
// RTC counter bitlenght
|
||||||
|
#define RTC_CNT_BITLENGHT 24
|
||||||
|
// Longest sleep time, ms
|
||||||
|
#define LONGEST_SLEEP_TIME ((( 1UL << RTC_CNT_BITLENGHT ) \
|
||||||
|
/(RTC_INPUT_FREQ/LAGEST_PRESCALER_VALUE)) * 1000UL )
|
||||||
|
|
||||||
|
// Shortest sleep time, ms
|
||||||
|
#define SHORTEST_SLEEP_TIME 1
|
||||||
|
|
||||||
|
/**@brief Function for initialize low frequency clock
|
||||||
|
*/
|
||||||
|
void rtc_lfclk_start(void);
|
||||||
|
|
||||||
|
|
||||||
|
/** @brief Function initialization and configuration of RTC driver instance.
|
||||||
|
*
|
||||||
|
* @param[in] sleep_time_ms after this time compare event will be triggered
|
||||||
|
*/
|
||||||
|
void rtc_start(uint32_t sleep_time_ms);
|
||||||
|
|
||||||
|
/** @brief Stop RTC
|
||||||
|
*/
|
||||||
|
void rtc_stop(void);
|
||||||
|
|
||||||
|
/** @brief Get RTC counter
|
||||||
|
*
|
||||||
|
* @retval uint32_t Contents of RTC counter register.
|
||||||
|
*/
|
||||||
|
uint32_t rtc_cnt_get(void);
|
||||||
|
|
||||||
|
/** @brief Get time elapsed since cnt_ticks
|
||||||
|
*
|
||||||
|
* @param[in] cnt_ticks Number of rtc-ticks
|
||||||
|
*
|
||||||
|
* @retval uint32_t Time since cnt_ticks, ms
|
||||||
|
*/
|
||||||
|
uint64_t get_rtc_time_since(uint32_t cnt_ticks);
|
||||||
|
|
||||||
|
/** @brief Check if rtc compare interrupt was triggered after calling
|
||||||
|
* rtc_start function
|
||||||
|
*
|
||||||
|
* @retval bool true - compare interrupt was triggered
|
||||||
|
* false - it wasn't
|
||||||
|
*/
|
||||||
|
bool is_rtc_comp_irq_triggerd(void);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif /* HAL_NRF52_RTC_H_INCLUDED */
|
||||||
75
components/802_15_4/api/HAL/nrf52_soc/hal_nrf52_timer.h
Normal file
75
components/802_15_4/api/HAL/nrf52_soc/hal_nrf52_timer.h
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef HAL_NRF52_TIMER_INCLUDED
|
||||||
|
#define HAL_NRF52_TIMER_INCLUDED
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup hal_nrf52_timer HAL timer - additional features
|
||||||
|
* @ingroup hal_15_4_nrf52
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief Pause hardware timer.
|
||||||
|
*/
|
||||||
|
void hal_timer_pause(void);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Resume hardware timer.
|
||||||
|
*/
|
||||||
|
void hal_timer_resume(void);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Set a new system time
|
||||||
|
*
|
||||||
|
* @param[in] time_us time to set.
|
||||||
|
*/
|
||||||
|
void hal_time_adjust(uint64_t time_us);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Uninit hardwware timer
|
||||||
|
*/
|
||||||
|
void hal_timer_uninit(void);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* HAL_NRF52_TIMER_INCLUDED */
|
||||||
61
components/802_15_4/api/MAC/mac_auto_request.h
Normal file
61
components/802_15_4/api/MAC/mac_auto_request.h
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef MAC_AUTO_REQUEST_H_INCLUDED
|
||||||
|
#define MAC_AUTO_REQUEST_H_INCLUDED
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
*
|
||||||
|
* @defgroup mac_auto_request MAC auto request
|
||||||
|
* @ingroup mac_15_4
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function is called when a new beacon has been sent.
|
||||||
|
*
|
||||||
|
* @param[in] p_ind - Pointer to beacon indication structure.
|
||||||
|
*/
|
||||||
|
void mac_auto_request_notify_ind(mac_beacon_ind_t * p_ind);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif /* MAC_AUTO_REQUEST_H_INCLUDED_ */
|
||||||
467
components/802_15_4/api/MAC/mac_common.h
Normal file
467
components/802_15_4/api/MAC/mac_common.h
Normal file
@ -0,0 +1,467 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef MAC_COMMON_H_INCLUDED
|
||||||
|
#define MAC_COMMON_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "phy_common.h"
|
||||||
|
|
||||||
|
#if (CONFIG_SECURE == 1)
|
||||||
|
#include "mac_security.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* Types and declarations common for different MLME transactions listed here.
|
||||||
|
*
|
||||||
|
* @defgroup mac_common MAC Common API
|
||||||
|
* @ingroup mac_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module for declaring MAC Common API.
|
||||||
|
* @details The Common MAC module contains declarations of commonly used MAC routines and necessary
|
||||||
|
* macros and types.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief Maximum interval for acknowledgement frame to arrive in microseconds.
|
||||||
|
*
|
||||||
|
* macAckWaitDuration = aUnitBackoffPeriod(only for beacon enabled PAN) +
|
||||||
|
* aTurnaroundTime +
|
||||||
|
* phySHRDuration + ceil(6 * phySymbolsPerOctet) =
|
||||||
|
* 20 + 12 + 10 + 6 * 2 =
|
||||||
|
* 54 symbols / 62.5 ksymbols/s = 864 us (544 us for beacon disabled PAN)
|
||||||
|
*/
|
||||||
|
#if (CONFIG_BEACON_ENABLED == 1)
|
||||||
|
#define macAckWaitDuration 864
|
||||||
|
#else
|
||||||
|
#define macAckWaitDuration 544
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**@brief The maximum number of octets added by the MAC
|
||||||
|
* sublayer to the MAC payload of a beacon frame.
|
||||||
|
*/
|
||||||
|
#define aMaxBeaconOverhead 75
|
||||||
|
|
||||||
|
/**@brief The number of symbols forming the basic time period
|
||||||
|
* used by the CSMA-CA algorithm.
|
||||||
|
*/
|
||||||
|
#define aUnitBackoffPeriod 20UL
|
||||||
|
|
||||||
|
/**@brief The number of symbols forming a superframe slot
|
||||||
|
* when the superframe order is equal to 0.
|
||||||
|
*/
|
||||||
|
#define aBaseSlotDuration 60UL
|
||||||
|
|
||||||
|
/**@brief The number of slots contained in any superframe. */
|
||||||
|
#define aNumSuperframeSlots 16UL
|
||||||
|
|
||||||
|
/**@brief The number of symbols forming a superframe when
|
||||||
|
* the superframe order is equal to 0.
|
||||||
|
*/
|
||||||
|
#define aBaseSuperframeDuration (aBaseSlotDuration * aNumSuperframeSlots)
|
||||||
|
|
||||||
|
/**@brief The maximum size, in octets, of a beacon payload. */
|
||||||
|
#define aMaxBeaconPayloadLength (aMaxPHYPacketSize - aMaxBeaconOverhead)
|
||||||
|
|
||||||
|
/**@brief The maximum number of octets added by the MAC
|
||||||
|
* sublayer to the PSDU without security.
|
||||||
|
*/
|
||||||
|
#define aMaxMPDUUnsecuredOverhead 25
|
||||||
|
|
||||||
|
/**@brief The maximum number of octets that can be transmitted in the MAC Payload
|
||||||
|
* field of an unsecured MAC frame that will be guaranteed not to exceed aMaxPHYPacketSize.
|
||||||
|
*/
|
||||||
|
#define aMaxMACSafePayloadSize (aMaxPHYPacketSize - aMaxMPDUUnsecuredOverhead)
|
||||||
|
|
||||||
|
/**@brief The minimum number of octets added by the MAC sublayer to the PSDU.*/
|
||||||
|
#define aMinMPDUOverhead 9
|
||||||
|
|
||||||
|
/**@brief The maximum number of octets that can be transmitted in the MAC
|
||||||
|
* Payload field.
|
||||||
|
*/
|
||||||
|
#define aMaxMACPayloadSize (aMaxPHYPacketSize - aMinMPDUOverhead)
|
||||||
|
|
||||||
|
/**@brief The maximum size of an MPDU, in octets, that can be followed by a SIFS period. */
|
||||||
|
#define aMaxSIFSFrameSize 18
|
||||||
|
|
||||||
|
/**@brief The minimum number of symbols forming the CAP.
|
||||||
|
*
|
||||||
|
* @details This ensures that MAC commands can still be transferred to devices
|
||||||
|
* when GTSs are being used.
|
||||||
|
*/
|
||||||
|
#define aMinCAPLength 440
|
||||||
|
|
||||||
|
/**@brief The number of superframes in which a GTS descriptor exists
|
||||||
|
* in the beacon frame of the PAN coordinator.
|
||||||
|
*/
|
||||||
|
#define aGTSDescPersistenceTime 4
|
||||||
|
|
||||||
|
/**@brief The number of consecutive lost beacons that will cause the MAC sublayer
|
||||||
|
* of a receiving device to declare a loss of synchronization.
|
||||||
|
*/
|
||||||
|
#define aMaxLostBeacons 4
|
||||||
|
|
||||||
|
/**@brief Maximum number of battery life extension periods. */
|
||||||
|
#define MAC_MIN_BATT_LIFE_EXT_PERIODS 6
|
||||||
|
/**@brief Minimum number of battery life extension periods. */
|
||||||
|
#define MAC_MAX_BATT_LIFE_EXT_PERIODS 41
|
||||||
|
|
||||||
|
/**@brief Minimum value for macBeaconOrder parameter. */
|
||||||
|
#define MAC_MIN_BEACON_ORDER 0
|
||||||
|
/**@brief Maximum value for macBeaconOrder parameter. */
|
||||||
|
#define MAC_MAX_BEACON_ORDER 15
|
||||||
|
|
||||||
|
/**@brief Minimum value for macMaxCSMABackoffs parameter. */
|
||||||
|
#define MAC_MIN_MAX_CSMA_BACKOFFS 0
|
||||||
|
/**@brief Maximum value for macMaxCSMABackoffs parameter. */
|
||||||
|
#define MAC_MAX_MAX_CSMA_BACKOFFS 5
|
||||||
|
|
||||||
|
/**@brief Minimum value for macMinBE parameter. */
|
||||||
|
#define MAC_MIN_MIN_BE 0
|
||||||
|
|
||||||
|
/**@brief Minimum value for macMaxBE parameter. */
|
||||||
|
#define MAC_MIN_MAX_BE 3
|
||||||
|
/**@brief Maximum value for macMaxBE parameter. */
|
||||||
|
#define MAC_MAX_MAX_BE 8
|
||||||
|
|
||||||
|
/**@brief Minimum value for macSuperframeOrder parameter. */
|
||||||
|
#define MAC_MIN_SUPERFRAME_ORDER 0
|
||||||
|
/**@brief Maximum value for macSuperframeOrder parameter. */
|
||||||
|
#define MAC_MAX_SUPERFRAME_ORDER 15
|
||||||
|
|
||||||
|
/**@brief Minimum value for macMaxFrameRetries parameter. */
|
||||||
|
#define MAC_MIN_MAX_FRAME_RETRIES 0
|
||||||
|
/**@brief Maximum value for macMaxFrameRetries parameter. */
|
||||||
|
#define MAC_MAX_MAX_FRAME_RETRIES 7
|
||||||
|
|
||||||
|
/**@brief Minimum value for macResponseWaitTime parameter. */
|
||||||
|
#define MAC_MIN_RESPONSE_WAIT_TIME 2
|
||||||
|
/**@brief Maximum value for macResponseWaitTime parameter. */
|
||||||
|
#define MAC_MAX_RESPONSE_WAIT_TIME 64
|
||||||
|
|
||||||
|
/**@brief A handy macro for a never initialized short address. */
|
||||||
|
#define MAC_SHORT_ADDRESS_NOT_SET 0xFFFF
|
||||||
|
|
||||||
|
/**@brief A handy macro for a never initialized short address. */
|
||||||
|
#define MAC_EXTENDED_ADDRESS_NOT_SET 0xFFFFFFFFFFFFFFFFULL
|
||||||
|
|
||||||
|
/**@brief A value of MAC beacon order attribute which determines
|
||||||
|
* a state with no periodic beacons.
|
||||||
|
*/
|
||||||
|
#define MAC_NO_BEACONS 15
|
||||||
|
|
||||||
|
/**@brief A handy macro for broadcast address. */
|
||||||
|
#define MAC_BROADCAST_SHORT_ADDRESS 0xFFFF
|
||||||
|
|
||||||
|
/**@brief A handy macro for unknown PAN ID. */
|
||||||
|
#define MAC_BROADCAST_PANID 0xFFFF
|
||||||
|
|
||||||
|
/**@brief Short address field value that is used when the device does not
|
||||||
|
* support short addressing mode.
|
||||||
|
*/
|
||||||
|
#define MAC_EXTENDED_ADDRESS_ONLY 0xFFFE
|
||||||
|
|
||||||
|
/**@brief Final CAP slot field value in the beacon for non-beacon enabled PAN. */
|
||||||
|
#define MAC_FINAL_CAP_SLOT_NBPAN 15
|
||||||
|
|
||||||
|
/**@brief Total amount of slots available in beacon enabled PAN. */
|
||||||
|
#define MAC_SLOT_AMOUNT 16
|
||||||
|
|
||||||
|
/**@brief This is the value of auto request key index until it has been set. */
|
||||||
|
#define MAC_SECURITY_KEY_INDEX_NOT_SET 0xFF
|
||||||
|
|
||||||
|
/**@brief Length of short MAC address in bytes. */
|
||||||
|
#define MAC_ADDR_SHORT_LEN 2
|
||||||
|
|
||||||
|
/**@brief Length of extended MAC address in bytes. */
|
||||||
|
#define MAC_ADDR_EXTENDED_LEN 8
|
||||||
|
|
||||||
|
/**@brief Length of PAN ID field in bytes. */
|
||||||
|
#define MAC_PAN_ID_LEN 2
|
||||||
|
|
||||||
|
/**@brief MAC footer (FCS) size. */
|
||||||
|
#define MAC_MFR_SIZE 2
|
||||||
|
|
||||||
|
/**@brief Maximum auxiliary header length */
|
||||||
|
#if (CONFIG_SECURE == 1)
|
||||||
|
#define MAC_MAX_AUX_HEADER_SIZE 14
|
||||||
|
#else
|
||||||
|
#define MAC_MAX_AUX_HEADER_SIZE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**@brief Maximum MAC header length */
|
||||||
|
#define MAC_MAX_MHR_SIZE (PHY_MAX_HEADER_SIZE + \
|
||||||
|
2 /* Frame control */ + \
|
||||||
|
1 /* Data sequence number */ + \
|
||||||
|
2 * (sizeof(uint16_t) + (sizeof(uint64_t))) /* Two PAN IDs and extended addresses */ + \
|
||||||
|
MAC_MAX_AUX_HEADER_SIZE)
|
||||||
|
/**@brief Maximum MAC header length for beacon frame */
|
||||||
|
#define MAC_MAX_BCN_MHR_SIZE (PHY_MAX_HEADER_SIZE + \
|
||||||
|
2 /* Frame control field */ + \
|
||||||
|
1 /* Beacon sequence number */ + \
|
||||||
|
sizeof(uint16_t) /* PAN ID */ + \
|
||||||
|
sizeof(uint64_t) /* Extended address */ + \
|
||||||
|
MAC_MAX_AUX_HEADER_SIZE)
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Memory which should be reserved for MAC fields */
|
||||||
|
#if (CONFIG_SECURE == 1)
|
||||||
|
#define MAC_MEMORY_RESERVE (MAC_MAX_MHR_SIZE + MAX_MIC_SIZE + MAC_MFR_SIZE)
|
||||||
|
#else
|
||||||
|
#define MAC_MEMORY_RESERVE (MAC_MAX_MHR_SIZE + MAC_MFR_SIZE)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**@brief Offset of MAC payload in the frame buffer */
|
||||||
|
#define MAC_MAX_MSDU_OFFSET MAC_MAX_MHR_SIZE
|
||||||
|
|
||||||
|
/**@brief Possible MAC frame types. */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
MAC_BEACON, /**< Frame is a beacon. */
|
||||||
|
MAC_DATA, /**< Frame is a data frame. */
|
||||||
|
MAC_ACK, /**< Frame is a MAC ACKnowledgement. */
|
||||||
|
MAC_COMMAND /**< Frame is a MAC command. */
|
||||||
|
} mac_frame_type_t;
|
||||||
|
|
||||||
|
/**@brief MAC ADDRESS. */
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
uint16_t short_address; /**< 16-bit short address. */
|
||||||
|
uint64_t long_address; /**< 64-bit long address. */
|
||||||
|
} mac_addr_t;
|
||||||
|
|
||||||
|
/**@brief MAC ADDR MODE. */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
MAC_ADDR_NONE = 0, /**< NO address is used. */
|
||||||
|
MAC_ADDR_SHORT = 2, /**< Short address is used. */
|
||||||
|
MAC_ADDR_LONG = 3 /**< Long address is used. */
|
||||||
|
} mac_addr_mode_t;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
MAC_FRAME_VERSION_2003, /**< IEEE 802.15.4-2003 compliant. */
|
||||||
|
MAC_FRAME_VERSION_2006 /**< IEEE 802.15.4-2006 compliant. */
|
||||||
|
} mac_frame_version_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MAC status
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.17
|
||||||
|
* excluding:
|
||||||
|
* MAC_IS_NOT_AVAILABLE
|
||||||
|
* This status is necessary for synchronous API.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
MAC_SUCCESS = 0x00, /* 0 */ /**< Operation is successful. */
|
||||||
|
MAC_COUNTER_ERROR = 0xDB, /* 219 */ /**< The frame counter purportedly applied
|
||||||
|
by the originator of the received
|
||||||
|
frame is invalid. */
|
||||||
|
MAC_IMPROPER_KEY_TYPE = 0xDC, /* 220 */ /**< The key purportedly applied by the
|
||||||
|
originator of the received frame is
|
||||||
|
not allowed to be used with that
|
||||||
|
frame type according to the key usage
|
||||||
|
policy of the recipient. */
|
||||||
|
MAC_IMPROPER_SECURITY_LEVEL = 0xDD, /* 221 */ /**< The security level purportedly applied
|
||||||
|
by the originator of the received
|
||||||
|
frame does not meet the minimum
|
||||||
|
security level required/expected by
|
||||||
|
the recipient for that frame type. */
|
||||||
|
MAC_UNSUPPORTED_LEGACY = 0xDE, /* 222 */ /**< The received frame was purportedly
|
||||||
|
secured using security based on IEEE
|
||||||
|
Std 802.15.4-2003, and such security
|
||||||
|
is not supported by this standard. */
|
||||||
|
MAC_UNSUPPORTED_SECURITY = 0xDF, /* 223 */ /**< The security purportedly applied by
|
||||||
|
the originator of the received frame
|
||||||
|
is not supported. */
|
||||||
|
MAC_BEACON_LOSS = 0xE0, /* 224 */ /**< The beacon was lost following a
|
||||||
|
synchronization request. */
|
||||||
|
MAC_CHANNEL_ACCESS_FAILURE = 0xE1, /* 225 */ /**< A transmission could not take place
|
||||||
|
due to activity on the channel, i.e.
|
||||||
|
the CSMA-CA mechanism has failed. */
|
||||||
|
MAC_DENIED = 0xE2, /* 226 */ /**< The GTS request has been denied by
|
||||||
|
the PAN coordinator. */
|
||||||
|
MAC_DISABLE_TRX_FAILURE = 0xE3, /* 227 */ /**< The attempt to disable the
|
||||||
|
transceiver has failed. */
|
||||||
|
MAC_SECURITY_ERROR = 0xE4, /* 228 */ /**< Cryptographic processing of the
|
||||||
|
received secured frame failed. */
|
||||||
|
MAC_FRAME_TOO_LONG = 0xE5, /* 229 */ /**< Either a frame resulting from
|
||||||
|
processing has a length that is
|
||||||
|
greater than aMaxPHYPacketSize or
|
||||||
|
a requested transaction is too large
|
||||||
|
to fit in the CAP or GTS. */
|
||||||
|
MAC_INVALID_GTS = 0xE6, /* 230 */ /**< The requested GTS transmission failed
|
||||||
|
because the specified GTS either did
|
||||||
|
not have a transmit GTS direction or
|
||||||
|
was not defined. */
|
||||||
|
MAC_INVALID_HANDLE = 0xE7, /* 231 */ /**< A request to purge an MSDU from the
|
||||||
|
transaction queue was made using an
|
||||||
|
MSDU handle that was not found in
|
||||||
|
the transaction table. */
|
||||||
|
MAC_INVALID_PARAMETER = 0xE8, /* 232 */ /**< A parameter in the primitive is
|
||||||
|
either not supported or is out of
|
||||||
|
the valid range. */
|
||||||
|
MAC_NO_ACK = 0xE9, /* 233 */ /**< No acknowledgment was received after
|
||||||
|
macMaxFrameRetries. */
|
||||||
|
MAC_NO_BEACON = 0xEA, /* 234 */ /**< A scan operation failed to find any
|
||||||
|
network beacons. */
|
||||||
|
MAC_NO_DATA = 0xEB, /* 235 */ /**< No response data was available
|
||||||
|
following a request. */
|
||||||
|
MAC_NO_SHORT_ADDRESS = 0xEC, /* 236 */ /**< The operation failed because a 16-bit
|
||||||
|
short address was not allocated. */
|
||||||
|
MAC_OUT_OF_CAP = 0xED, /* 237 */ /**< A receiver enable request was
|
||||||
|
unsuccessful because it could not be
|
||||||
|
completed within the CAP.
|
||||||
|
@note The enumeration description is
|
||||||
|
not used in this standard, and it is
|
||||||
|
included only to meet the backwards
|
||||||
|
compatibility requirements for
|
||||||
|
IEEE Std 802.15.4-2003. */
|
||||||
|
MAC_PAN_ID_CONFLICT = 0xEE, /* 238 */ /**< A PAN identifier conflict has been
|
||||||
|
detected and communicated to the PAN
|
||||||
|
coordinator. */
|
||||||
|
MAC_REALIGNMENT = 0xEF, /* 239 */ /**< A coordinator realignment command has
|
||||||
|
been received. */
|
||||||
|
MAC_TRANSACTION_EXPIRED = 0xF0, /* 240 */ /**< The transaction has expired and its
|
||||||
|
information was discarded. */
|
||||||
|
MAC_TRANSACTION_OVERFLOW = 0xF1, /* 241 */ /**< There is no capacity to store the
|
||||||
|
transaction. */
|
||||||
|
MAC_TX_ACTIVE = 0xF2, /* 242 */ /**< The transceiver was in the transmitter
|
||||||
|
enabled state when the receiver was
|
||||||
|
requested to be enabled.
|
||||||
|
@note The enumeration description is
|
||||||
|
not used in this standard, and it is
|
||||||
|
included only to meet the backwards
|
||||||
|
compatibility requirements for
|
||||||
|
IEEE Std 802.15.4-2003. */
|
||||||
|
MAC_UNAVAILABLE_KEY = 0xF3, /* 243 */ /**< The key purportedly used by the
|
||||||
|
originator of the received frame is
|
||||||
|
not available or, if available, the
|
||||||
|
originating device is not known or is
|
||||||
|
blacklisted with that particular
|
||||||
|
key. */
|
||||||
|
MAC_UNSUPPORTED_ATTRIBUTE = 0xF4, /* 244 */ /**< A SET/GET request was issued with the
|
||||||
|
identifier of a PIB attribute that is
|
||||||
|
not supported. */
|
||||||
|
MAC_INVALID_ADDRESS = 0xF5, /* 245 */ /**< A request to send data was
|
||||||
|
unsuccessful because neither the source
|
||||||
|
address parameters nor the destination
|
||||||
|
address parameters were present. */
|
||||||
|
MAC_ON_TIME_TOO_LONG = 0xF6, /* 246 */ /**< A receiver enable request was
|
||||||
|
unsuccessful because it specified a
|
||||||
|
number of symbols that was longer than
|
||||||
|
the beacon interval. */
|
||||||
|
MAC_PAST_TIME = 0xF7, /* 247 */ /**< A receiver enable request was
|
||||||
|
unsuccessful because it could not be
|
||||||
|
completed within the current superframe
|
||||||
|
and was not permitted to be deferred
|
||||||
|
until the next superframe. */
|
||||||
|
MAC_TRACKING_OFF = 0xF8, /* 248 */ /**< The device was instructed to start
|
||||||
|
sending beacons based on the timing
|
||||||
|
of the beacon transmissions of its
|
||||||
|
coordinator, but the device is not
|
||||||
|
currently tracking the beacon of its
|
||||||
|
coordinator. */
|
||||||
|
MAC_INVALID_INDEX = 0xF9, /* 249 */ /**< An attempt to write to a MAC PIB
|
||||||
|
attribute that is in a table failed
|
||||||
|
because the specified table index
|
||||||
|
was out of range. */
|
||||||
|
MAC_LIMIT_REACHED = 0xFA, /* 250 */ /**< A scan operation terminated
|
||||||
|
prematurely because the number of
|
||||||
|
PAN descriptors stored reached an
|
||||||
|
implementation specified maximum. */
|
||||||
|
MAC_READ_ONLY = 0xFB, /* 251 */ /**< A SET/GET request was issued with the
|
||||||
|
identifier of an attribute that is
|
||||||
|
read only. */
|
||||||
|
MAC_SCAN_IN_PROGRESS = 0xFC, /* 252 */ /**< A request to perform a scan operation
|
||||||
|
failed because the MLME was in the
|
||||||
|
process of performing a previously
|
||||||
|
initiated scan operation. */
|
||||||
|
MAC_SUPERFRAME_OVERLAP = 0xFD, /* 253 */ /**< The device was instructed to start
|
||||||
|
sending beacons based on the timing
|
||||||
|
of the beacon transmissions of its
|
||||||
|
coordinator, but the instructed start
|
||||||
|
time overlapped the transmission time
|
||||||
|
of the beacon of its coordinator. */
|
||||||
|
/* Statuses out from standard. It is used for synchronous API */
|
||||||
|
MAC_IS_NOT_AVAILABLE = 0xFF /* 255 */ /**< MAC is not available. */
|
||||||
|
} mac_status_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Payload descriptor.
|
||||||
|
*
|
||||||
|
* @details Not covered by the standard.
|
||||||
|
* Contains information sufficient to allow the next higher layer to clean
|
||||||
|
* the memory allocated for incoming frames.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Pointer to the set of octets forming the frame payload being indicated by
|
||||||
|
* the MAC sublayer entity.
|
||||||
|
*/
|
||||||
|
uint8_t * p_payload;
|
||||||
|
/**
|
||||||
|
* Offset of the payload data relative to the beginning of the frame.
|
||||||
|
* Equal to the MAC header.
|
||||||
|
*/
|
||||||
|
uint8_t payload_offset;
|
||||||
|
} mac_payload_descriptor_t;
|
||||||
|
|
||||||
|
/** @brief Command frame IDs defined by the MAC sublayer that are listed
|
||||||
|
* in Table 82 of the standard.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
MAC_CMD_ASSOC_REQ = 0x01, /**< Association request.*/
|
||||||
|
MAC_CMD_ASSOC_RESP = 0x02, /**< Association response.*/
|
||||||
|
MAC_CMD_DISASSOC_NTF = 0x03, /**< Disassociation notification.*/
|
||||||
|
MAC_CMD_DATA_REQ = 0x04, /**< Data request.*/
|
||||||
|
MAC_CMD_PANID_CONFLICT_NTF = 0x05, /**< PAN ID conflict notification.*/
|
||||||
|
MAC_CMD_ORPHAN_NTF = 0x06, /**< Orphan notification.*/
|
||||||
|
MAC_CMD_BEACON_REQ = 0x07, /**< Beacon request.*/
|
||||||
|
MAC_CMD_COORD_REALIGN = 0x08, /**< Coordinator realignment.*/
|
||||||
|
MAC_CMD_GTS_REQ = 0x09 /**< GTS request.*/
|
||||||
|
} mac_command_id_t;
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
|
||||||
|
#endif // MAC_COMMON_H_INCLUDED
|
||||||
333
components/802_15_4/api/MAC/mac_mcps_data.h
Normal file
333
components/802_15_4/api/MAC/mac_mcps_data.h
Normal file
@ -0,0 +1,333 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef MAC_MCPS_DATA_H_INCLUDED
|
||||||
|
#define MAC_MCPS_DATA_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "mac_common.h"
|
||||||
|
#include "mac_task_scheduler.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* The MAC Data module declares the MAC Data transmittion routines and necessary types
|
||||||
|
* according to the MAC specification.
|
||||||
|
*
|
||||||
|
* @defgroup mac_data MAC MCPS Data API
|
||||||
|
* @ingroup mac_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare MAC MCPS Data API.
|
||||||
|
* @details The MAC MCPS Data module declares the MAC Data transmission routines and necessary types according
|
||||||
|
* to the MAC specification. More specifically, MAC data request mcps_data_req(), and MAC Data
|
||||||
|
* indication mcps_data_ind() primitives are declared. The confirmation callback typedef is
|
||||||
|
* declared as mcps_data_conf_cb_t.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief TX options bit fields.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.1.1.
|
||||||
|
*/
|
||||||
|
#define TX_ACKNOWLEDGED_BIT (0)
|
||||||
|
#define TX_GTS_BIT (1)
|
||||||
|
#define TX_INDIRECT_BIT (2)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief TX options for MAC data transmission.
|
||||||
|
*
|
||||||
|
* @details The three bits (b0, b1, b2) indicate the transmission options for this MSDU.
|
||||||
|
* For b0, 1 = acknowledged transmission, 0 = unacknowledged transmission.
|
||||||
|
* For b1, 1 = GTS transmission, 0 = CAP transmission for a beacon-enabled PAN.
|
||||||
|
* For b2, 1 = indirect transmission, 0 = direct transmission.
|
||||||
|
* For a nonbeacon-enabled PAN, bit b1 should always be set to 0.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint8_t ack : 1;
|
||||||
|
uint8_t gts : 1;
|
||||||
|
uint8_t indirect : 1;
|
||||||
|
uint8_t : 5;
|
||||||
|
} mac_tx_options_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MCPS-DATA.confirm.
|
||||||
|
*
|
||||||
|
* @details The MCPS-DATA.confirm primitive reports the results of a request to transfer
|
||||||
|
* a data SPDU (MSDU) from a local SSCS entity to a single peer SSCS entity.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.1.2.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** The handle associated with the MSDU being confirmed. */
|
||||||
|
uint8_t msdu_handle;
|
||||||
|
|
||||||
|
/** The status of the last MSDU transmission. */
|
||||||
|
mac_status_t status;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Optional. The time, in symbols, at which the data was transmitted (see 7.5.4.1).
|
||||||
|
*
|
||||||
|
* The value of this parameter will be considered valid only if the value of the
|
||||||
|
* status parameter is SUCCESS; if the status parameter is not equal to
|
||||||
|
* SUCCESS, the value of the Timestamp parameter will not be used for any other
|
||||||
|
* purpose. The symbol boundary is described by macSyncSymbolOffset (see Table 86 in 7.4.1).
|
||||||
|
*
|
||||||
|
* This is a 24-bit value, and the precision of this value will be a minimum of 20 bits,
|
||||||
|
* with the lowest 4 bits being the least significant.
|
||||||
|
*/
|
||||||
|
uint32_t timestamp;
|
||||||
|
} mcps_data_conf_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MCPS-DATA.request.
|
||||||
|
*
|
||||||
|
* @details The MCPS-DATA.request primitive requests the transfer of
|
||||||
|
* a data SPDU (i.e., MSDU) from a local SSCS entity to a single peer SSCS entity.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.1.1.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** Do not edit this field. */
|
||||||
|
mac_abstract_req_t service;
|
||||||
|
|
||||||
|
/** Confirm to this request. */
|
||||||
|
mcps_data_conf_t confirm;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The source addressing mode for this primitive and
|
||||||
|
* subsequent MPDU. This value can take one of the following values:
|
||||||
|
* @ref mac_addr_mode_t
|
||||||
|
* 0x00 = no address (addressing fields omitted, see 7.2.1.1.8).
|
||||||
|
* 0x01 = reserved.
|
||||||
|
* 0x02 = 16-bit short address.
|
||||||
|
* 0x03 = 64-bit extended address.
|
||||||
|
*/
|
||||||
|
mac_addr_mode_t src_addr_mode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The destination addressing mode for this primitive
|
||||||
|
* and subsequent MPDU.
|
||||||
|
* According to 7.1.1.1.1, Table 41.
|
||||||
|
*/
|
||||||
|
mac_addr_mode_t dst_addr_mode;
|
||||||
|
|
||||||
|
/** The 16-bit PAN identifier of the entity to which the MSDU is being transferred. */
|
||||||
|
uint16_t dst_pan_id;
|
||||||
|
|
||||||
|
/** The individual device address of the entity to which the MSDU is being transferred. */
|
||||||
|
mac_addr_t dst_addr;
|
||||||
|
|
||||||
|
/** The number of octets contained in the MSDU to be transmitted by
|
||||||
|
* the MAC sublayer entity.
|
||||||
|
*/
|
||||||
|
uint8_t msdu_length;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The pointer to the set of octets forming the MSDU
|
||||||
|
* to be transmitted by the MAC sublayer entity.
|
||||||
|
*
|
||||||
|
* Caller must provide enough space for MAC and PHY header before this pointer.
|
||||||
|
*/
|
||||||
|
uint8_t * msdu;
|
||||||
|
|
||||||
|
/** The handle associated with the MSDU to be transmitted by the MAC sublayer entity. */
|
||||||
|
uint8_t msdu_handle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The bits (b0, b1, b2) indicate the transmission options for this MSDU.
|
||||||
|
* For b0, 1 = acknowledged transmission, 0 = unacknowledged transmission.
|
||||||
|
* For b1, 1 = GTS transmission, 0 = CAP transmission for a beacon-enabled PAN.
|
||||||
|
* For b2, 1 = indirect transmission, 0 = direct transmission.
|
||||||
|
* For a nonbeacon-enabled PAN, bit b1 should always be set to 0.
|
||||||
|
*/
|
||||||
|
mac_tx_options_t tx_options;
|
||||||
|
#if (CONFIG_SECURE == 1)
|
||||||
|
uint8_t security_level; /**< Security level. */
|
||||||
|
uint8_t key_id_mode; /**< Key ID node. */
|
||||||
|
uint64_t key_source; /**< Key source. */
|
||||||
|
uint8_t key_index; /**< Key index. */
|
||||||
|
#endif
|
||||||
|
} mcps_data_req_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Private information passed with MCPS-DATA.indication.
|
||||||
|
* Not covered by the standard.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** RSSI value, which corresponds to packet that caused this indication. */
|
||||||
|
int8_t rssi;
|
||||||
|
/** Value of a pending bit from MHR. */
|
||||||
|
uint8_t pending_bit;
|
||||||
|
} mcps_data_ind_private_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MCPS-DATA.indication
|
||||||
|
*
|
||||||
|
* @details The MCPS-DATA.indication primitive indicates the transfer of
|
||||||
|
* a data SPDU (i.e., MSDU) from the MAC sublayer to the local SSCS entity.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.1.3
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
mcps_data_ind_private_t service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The source addressing mode for this primitive corresponding to the received MPDU.
|
||||||
|
* According to 7.1.1.1.1, Table 43.
|
||||||
|
*/
|
||||||
|
mac_addr_mode_t src_addr_mode;
|
||||||
|
|
||||||
|
/** The 16-bit PAN identifier of the entity from which the MSDU was received. */
|
||||||
|
uint16_t src_pan_id;
|
||||||
|
|
||||||
|
/** The individual device address of the entity from which the MSDU was received. */
|
||||||
|
mac_addr_t src_addr;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The destination addressing mode for this primitive corresponding to the received MPDU.
|
||||||
|
* According to 7.1.1.1.1, Table 43.
|
||||||
|
*/
|
||||||
|
mac_addr_mode_t dst_addr_mode;
|
||||||
|
|
||||||
|
/** The 16-bit PAN identifier of the entity to which the MSDU is being transferred. */
|
||||||
|
uint16_t dst_pan_id;
|
||||||
|
|
||||||
|
/** The individual device address of the entity to which the MSDU is being transferred. */
|
||||||
|
mac_addr_t dst_addr;
|
||||||
|
|
||||||
|
/** The number of octets contained in the MSDU being indicated by the MAC sublayer entity. */
|
||||||
|
uint8_t msdu_length;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The information that is required for the next higher layer to read incoming message and to
|
||||||
|
* free the memory allocated for this message.
|
||||||
|
*/
|
||||||
|
mac_payload_descriptor_t msdu;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LQI value measured during reception of the MPDU.
|
||||||
|
* Lower values represent lower LQI (see 6.9.8).
|
||||||
|
*/
|
||||||
|
uint8_t mpdu_link_quality;
|
||||||
|
|
||||||
|
/** The DSN of the received data frame. */
|
||||||
|
uint8_t dsn;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Optional. The time, in symbols, at which the data was received (see 7.5.4.1).
|
||||||
|
* The symbol boundary is described by macSyncSymbolOffset (see Table 86 in 7.4.1).
|
||||||
|
*
|
||||||
|
* This is a 24-bit value, and the precision of this value shall be a minimum of 20 bits,
|
||||||
|
* with the lowest 4 bits being the least significant.
|
||||||
|
*/
|
||||||
|
uint32_t timestamp;
|
||||||
|
#if (CONFIG_SECURE == 1)
|
||||||
|
uint8_t security_level; /**< Security level. */
|
||||||
|
uint8_t key_id_mode; /**< Key ID node. */
|
||||||
|
uint64_t key_source; /**< Key source. */
|
||||||
|
uint8_t key_index; /**< Key index. */
|
||||||
|
#endif
|
||||||
|
} mcps_data_ind_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Confirmation function.
|
||||||
|
*
|
||||||
|
* @details The MCPS-DATA.confirm primitive is generated by the MAC sublayer
|
||||||
|
* entity in response to an MCPS-DATA. request primitive. The MCPS-DATA.confirm
|
||||||
|
* primitive returns a status of either SUCCESS, indicating that the request to
|
||||||
|
* transmit was successful, or the appropriate error code.
|
||||||
|
* The status values are fully described in 7.1.1.1.3 and subclauses referenced by 7.1.1.1.3.
|
||||||
|
*
|
||||||
|
* @param Pointer to confirmation primitive.
|
||||||
|
*/
|
||||||
|
typedef void (* mcps_data_conf_cb_t)(mcps_data_conf_t *);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MCPS-DATA.request service
|
||||||
|
*
|
||||||
|
* @details The MCPS-DATA.request primitive is generated by a local SSCS entity
|
||||||
|
* when a data SPDU (i.e., MSDU) is to be transferred to a peer SSCS entity.
|
||||||
|
* After request completion, user callback will be issued with
|
||||||
|
* valid data stored in structure @ref mcps_data_conf_t.
|
||||||
|
*
|
||||||
|
* @param req Pointer to MCPS-DATA request structure.
|
||||||
|
* @param conf_cb Pointer to confirmation function (user callback).
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.1.2.
|
||||||
|
*/
|
||||||
|
void mcps_data_req(mcps_data_req_t * req, mcps_data_conf_cb_t conf_cb);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MCPS-DATA.indication handler.
|
||||||
|
*
|
||||||
|
* @details The MCPS-DATA.indication primitive is generated by the MAC sublayer and
|
||||||
|
* issued to the SSCS on receipt of a data frame at the local MAC sublayer entity
|
||||||
|
* that passes the appropriate message filtering operations as described in 7.5.6.2.
|
||||||
|
*
|
||||||
|
* @param ind MCPS-DATA.indication structure.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.1.3.
|
||||||
|
*/
|
||||||
|
extern void mcps_data_ind(mcps_data_ind_t * ind);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Free memory allocated for incoming message.
|
||||||
|
*
|
||||||
|
* @details The function will be invoked after all manipulations
|
||||||
|
* with MSDU are completed. That is necessary to return the memory allocated by MAC
|
||||||
|
* into the heap.
|
||||||
|
*
|
||||||
|
* @param p_payload_descriptor - Pointer to MSDU descriptor.
|
||||||
|
*/
|
||||||
|
void mac_mem_msdu_free(mac_payload_descriptor_t * p_payload_descriptor);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // MAC_MCPS_DATA_H_INCLUDED
|
||||||
152
components/802_15_4/api/MAC/mac_mcps_purge.h
Normal file
152
components/802_15_4/api/MAC/mac_mcps_purge.h
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef MAC_MCPS_PURGE_H_INCLUDED
|
||||||
|
#define MAC_MCPS_PURGE_H_INCLUDED
|
||||||
|
|
||||||
|
#if (CONFIG_PURGE_ENABLED == 1)
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "mac_common.h"
|
||||||
|
#include "mac_task_scheduler.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* The MAC Purge module declares the MAC Purge routines and necessary types
|
||||||
|
* according to the MAC specification.
|
||||||
|
*
|
||||||
|
* @defgroup mac_purge MAC MCPS Purge API
|
||||||
|
* @ingroup mac_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare MAC MCPS Purge API.
|
||||||
|
* @details The MAC MCPS Purge module declares the MAC Purge routines and necessary types according to
|
||||||
|
* the MAC specification. More specifically, MAC purge request mcps_purge_req(), and the
|
||||||
|
* confirmation callback typedef is declared as mcps_purge_conf_cb_t. An additional primitive
|
||||||
|
* not covered by the standard is declared. This is mpcs_purge() which is a synchronous version
|
||||||
|
* of mcps_purge_req().
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MCPS-PURGE.confirm.
|
||||||
|
*
|
||||||
|
* @details The MCPS-PURGE.confirm primitive allows the MAC sublayer to notify the next higher layer
|
||||||
|
* of the success of its request to purge an MSDU from the transaction queue.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.1.5.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** The handle of the MSDU to be purged from the transaction queue. */
|
||||||
|
uint8_t msdu_handle;
|
||||||
|
|
||||||
|
/** The status of the request to be purged an MSDU from the transaction queue. */
|
||||||
|
mac_status_t status;
|
||||||
|
} mcps_purge_conf_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MCPS-PURGE.request.
|
||||||
|
*
|
||||||
|
* @details The MCPS-PURGE.request primitive allows the next higher layer
|
||||||
|
* to purge an MSDU from the transaction queue.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.1.4.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** Do not edit this field. */
|
||||||
|
mac_abstract_req_t service;
|
||||||
|
|
||||||
|
/** Confirmation to this request. */
|
||||||
|
mcps_purge_conf_t confirm;
|
||||||
|
|
||||||
|
/** The handle of the MSDU to be purged from the transaction queue. */
|
||||||
|
uint8_t msdu_handle;
|
||||||
|
} mcps_purge_req_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Confirmation function.
|
||||||
|
*
|
||||||
|
* @details The MCPS-PURGE.confirm primitive is generated by the MAC sublayer
|
||||||
|
* entity in response to an MCPS-PURGE.request primitive. The MCPS-PURGE.confirm
|
||||||
|
* primitive returns a status of either SUCCESS, indicating that the purge request
|
||||||
|
* was successful, or INVALID_HANDLE, indicating an error.
|
||||||
|
* The status values are fully described in 7.1.1.4.3.
|
||||||
|
*
|
||||||
|
* @param Pointer to confirmation primitive.
|
||||||
|
*/
|
||||||
|
typedef void (* mcps_purge_conf_cb_t)(mcps_purge_conf_t *);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MCPS-PURGE.request service.
|
||||||
|
*
|
||||||
|
* @details The MCPS-PURGE.request primitive is generated by the next higher layer
|
||||||
|
* whenever an MSDU is to be purged from the transaction queue.
|
||||||
|
* After request completion, user callback will be issued with
|
||||||
|
* valid data stored in structure mcps_purge_conf_t.
|
||||||
|
*
|
||||||
|
* @param req Pointer to MCPS-PURGE request structure.
|
||||||
|
* @param conf_cb Pointer to the confirmation function (user callback).
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.1.4.
|
||||||
|
*/
|
||||||
|
void mcps_purge_req(mcps_purge_req_t * req, mcps_purge_conf_cb_t conf_cb);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Performs MCPS-PURGE.request directly (without request - confirm approach).
|
||||||
|
*
|
||||||
|
* @details Optional. Not covered by the standard.
|
||||||
|
*
|
||||||
|
* The MCPS-PURGE.request primitive is generated by the next higher layer
|
||||||
|
* whenever an MSDU is to be purged from the transaction queue.
|
||||||
|
*
|
||||||
|
* @param req Pointer to MCPS-PURGE request structure.
|
||||||
|
*
|
||||||
|
* @return Result of the purge procedure.
|
||||||
|
*/
|
||||||
|
mac_status_t mcps_purge(mcps_purge_req_t * req);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // (CONFIG_PURGE_ENABLED == 1)
|
||||||
|
|
||||||
|
#endif // MAC_MCPS_PURGE_H_INCLUDED
|
||||||
336
components/802_15_4/api/MAC/mac_mlme_associate.h
Normal file
336
components/802_15_4/api/MAC/mac_mlme_associate.h
Normal file
@ -0,0 +1,336 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef MAC_MLME_ASSOCIATE_H_INCLUDED
|
||||||
|
#define MAC_MLME_ASSOCIATE_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "mac_common.h"
|
||||||
|
#include "mac_task_scheduler.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* The MAC Association module declares the MAC Association routines and necessary types/macros
|
||||||
|
* according to the MAC specification.
|
||||||
|
*
|
||||||
|
* @defgroup mac_assoc MAC MLME Association API
|
||||||
|
* @ingroup mac_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare MAC MLME Association API.
|
||||||
|
* @details The MLME Association module declares Association MAC routines and necessary macros/types according
|
||||||
|
* to the MAC specification. More specifically, MLME Association request aka mlme_associate_req(),
|
||||||
|
* MLME Association confirm callback typedef aka mlme_associate_conf_cb_t, MLME Association indication
|
||||||
|
* as mlme_associate_ind(), and MLME Response aka mlme_associate_resp() primitives are declared.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Capability information field.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.3.1.2.
|
||||||
|
*/
|
||||||
|
#define ALTERNATE_PAN_COORDINATOR_BIT (0)
|
||||||
|
#define DEVICE_TYPE_BIT (1)
|
||||||
|
#define POWER_SOURCE_BIT (2)
|
||||||
|
#define RECEIVER_ON_WHEN_IDLE_BIT (3)
|
||||||
|
#define SECURITY_CAPABILITY_BIT (6)
|
||||||
|
#define ALLOCATE_ADDRESS_BIT (7)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Valid values of the Association Status field
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.3.2.3
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
MAC_ASSOCIATION_SUCCESSFUL = 0,
|
||||||
|
MAC_PAN_AT_CAPACITY,
|
||||||
|
MAC_PAN_ACCESS_DENIED
|
||||||
|
} mac_association_status_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Capability information field
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.3.1.2.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint8_t alternate_pan_coordinator : 1;
|
||||||
|
uint8_t device_type : 1;
|
||||||
|
uint8_t power_source : 1;
|
||||||
|
uint8_t rx_on_when_idle : 1;
|
||||||
|
uint8_t reserved : 2;
|
||||||
|
uint8_t security_capability : 1;
|
||||||
|
uint8_t allocate_address : 1;
|
||||||
|
} mac_capability_t;
|
||||||
|
|
||||||
|
/**@brief The Alternate PAN Coordinator subfield of the Capability Information field. */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
MAC_CAP_CANNOT_BE_PAN_COORD = 0, /**< Device is not capable of becoming
|
||||||
|
the PAN coordinator.*/
|
||||||
|
MAC_CAP_CAN_BE_PAN_COORD /**< Device is capable of becoming
|
||||||
|
the PAN coordinator.*/
|
||||||
|
} mac_cap_alt_pan_coord_t;
|
||||||
|
|
||||||
|
/**@brief The Device Type subfield of the Capability Information field. */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
MAC_CAP_RFD_DEVICE = 0, /**< Device is an RFD.*/
|
||||||
|
MAC_CAP_FFD_DEVICE /**< Device is an FFD.*/
|
||||||
|
} mac_cap_device_type_t;
|
||||||
|
|
||||||
|
/**@brief The Power Source subfield of the Capability Information field. */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
MAC_CAP_BATTERY_POWERED = 0, /**< Device is not AC-powered.*/
|
||||||
|
MAC_CAP_MAINS_POWERED /**< Device is receiving power from the
|
||||||
|
alternating current mains.*/
|
||||||
|
} mac_cap_power_source_t;
|
||||||
|
|
||||||
|
/**@brief The Receiver On When Idle subfield of the Capability Information field. */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
MAC_CAP_RX_OFF_WHEN_IDLE = 0, /**< Device conserves power during idle.*/
|
||||||
|
MAC_CAP_RX_ON_WHEN_IDLE /**< Device does not disable its receiver
|
||||||
|
to conserve power during idle periods.*/
|
||||||
|
} mac_cap_rx_when_idle_t;
|
||||||
|
|
||||||
|
/**@brief The Security Capability subfield of the Capability Information field. */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
MAC_CAP_CANNOT_SECURE = 0, /**< Device does not support securing.*/
|
||||||
|
MAC_CAP_CAN_SECURE /**< Device is capable of sending and receiving
|
||||||
|
cryptographically protected MAC frames.*/
|
||||||
|
} mac_cap_secure_t;
|
||||||
|
|
||||||
|
/**@brief The Allocate Address subfield of the Capability Information field. */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
MAC_CAP_SHORT_ADDR_NOT_REQ = 0, /**< The coordinator will not allocate a
|
||||||
|
16-bit short address as a result of
|
||||||
|
the association procedure.*/
|
||||||
|
MAC_CAP_SHORT_ADDR_REQ /**< The coordinator will allocate a
|
||||||
|
16-bit short address as a result of
|
||||||
|
the association procedure.*/
|
||||||
|
} mac_cap_allocate_addr_t;
|
||||||
|
|
||||||
|
#if (CONFIG_ASSOCIATE_REQ_ENABLED == 1)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-ASSOCIATE.confirm
|
||||||
|
*
|
||||||
|
* The MLME-ASSOCIATE.confirm primitive is generated by the initiating MLME and
|
||||||
|
* issued to its next higher layer in response to an MLME-ASSOCIATE.request primitive.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.3.4.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t assoc_short_address; /**< Association short 16-bit address. */
|
||||||
|
mac_status_t status; /**< Status of operation. */
|
||||||
|
#if (CONFIG_SECURE == 1)
|
||||||
|
uint8_t security_level; /**< Security level. */
|
||||||
|
uint8_t key_id_mode; /**< Key ID mode. */
|
||||||
|
uint64_t key_source; /**< Key source. */
|
||||||
|
uint8_t key_index; /**< Key index. */
|
||||||
|
#endif
|
||||||
|
} mlme_associate_conf_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-ASSOCIATE.request.
|
||||||
|
*
|
||||||
|
* @details Allows a device to request an association with a coordinator.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.3.1.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** Do not edit this field. */
|
||||||
|
mac_abstract_req_t service;
|
||||||
|
|
||||||
|
/** Confirmation to this request. */
|
||||||
|
mlme_associate_conf_t confirm;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A total of 27 channels numbered 0 to 26.
|
||||||
|
* are available per channel page (section 6.1.2.1).
|
||||||
|
*/
|
||||||
|
uint8_t logical_channel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A total of 32 channel pages are available
|
||||||
|
* with channel pages 3 to 31 being reserved
|
||||||
|
* for future use (section 6.1.2.2).
|
||||||
|
*/
|
||||||
|
#ifdef CONFIG_SUB_GHZ
|
||||||
|
uint8_t channel_page; /**< Channel page. */
|
||||||
|
#endif
|
||||||
|
mac_addr_mode_t coord_addr_mode; /**< Coordinator address mode. */
|
||||||
|
uint16_t coord_pan_id; /**< Coordinator PAN ID. */
|
||||||
|
mac_addr_t coord_address; /**< Coordinator address. */
|
||||||
|
mac_capability_t capability_information; /**< Capability information. */
|
||||||
|
#if (CONFIG_SECURE == 1)
|
||||||
|
uint8_t security_level; /**< Security level. */
|
||||||
|
uint8_t key_id_mode; /**< Key ID mode. */
|
||||||
|
uint64_t key_source; /**< Key source. */
|
||||||
|
uint8_t key_index; /**< Key index. */
|
||||||
|
#endif
|
||||||
|
} mlme_associate_req_t;
|
||||||
|
|
||||||
|
|
||||||
|
#if (CONFIG_ASSOCIATE_IND_ENABLED == 1)
|
||||||
|
/**
|
||||||
|
* @brief MLME-ASSOCIATE.indication.
|
||||||
|
*
|
||||||
|
* @details The MLME-ASSOCIATE.indication primitive is generated by the MLME of
|
||||||
|
* the coordinator and issued to its next higher layer to indicate the reception
|
||||||
|
* of an association request command.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.3.2.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint64_t device_address; /**< 64-bit IEEE address. */
|
||||||
|
uint8_t capability_information; /**< Capability information. */
|
||||||
|
#if (CONFIG_SECURE == 1)
|
||||||
|
uint8_t security_level; /**< Security level. */
|
||||||
|
uint8_t key_id_mode; /**< Key ID mode. */
|
||||||
|
uint64_t key_source; /**< Key source. */
|
||||||
|
uint8_t key_index; /**< Key index. */
|
||||||
|
#endif
|
||||||
|
} mlme_associate_ind_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-ASSOCIATE.response.
|
||||||
|
*
|
||||||
|
* @details Generated by the next higher layer of a coordinator and issued
|
||||||
|
* to its MLME in order to respond to the MLME-ASSOCIATE.indication primitive.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.3.3.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint64_t device_address; /**< 64-bit IEEE address. */
|
||||||
|
uint16_t assoc_short_address; /**< Association short 16-bit address. */
|
||||||
|
mac_association_status_t status; /**< Status of operation. */
|
||||||
|
#if (CONFIG_SECURE == 1)
|
||||||
|
uint8_t security_level; /**< Security level. */
|
||||||
|
uint8_t key_id_mode; /**< Key ID mode. */
|
||||||
|
uint64_t key_source; /**< Key source. */
|
||||||
|
uint8_t key_index; /**< Key index. */
|
||||||
|
#endif
|
||||||
|
} mlme_associate_resp_t;
|
||||||
|
|
||||||
|
#endif // (CONFIG_ASSOCIATE_IND_ENABLED == 1)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Confirmation function.
|
||||||
|
*
|
||||||
|
* @details The MLME-ASSOCIATE.confirm primitive is generated by the
|
||||||
|
* initiating MLME and issued to its next higher layer in response to
|
||||||
|
* an MLME-ASSOCIATE.request primitive. If the request was successful,
|
||||||
|
* the status parameter will indicate a successful association, as
|
||||||
|
* contained in the Status field of the association response command.
|
||||||
|
* Otherwise, the status parameter indicates either an error code from
|
||||||
|
* the received association response command or the appropriate error
|
||||||
|
* code from Table 50.
|
||||||
|
* The status values are fully described in 7.1.3.1.3 and subclauses referenced by 7.1.3.1.3.
|
||||||
|
*
|
||||||
|
* @param Pointer to confirmation primitive.
|
||||||
|
*/
|
||||||
|
typedef void (* mlme_associate_conf_cb_t)(mlme_associate_conf_t *);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-ASSOCIATE request.
|
||||||
|
*
|
||||||
|
* @details Requests an association with a PAN through a coordinator
|
||||||
|
* After request completion, user callback will be issued with
|
||||||
|
* valid data stored in structure mlme_set_conf_t.
|
||||||
|
*
|
||||||
|
* @param req MLME_ASSOCIATE request structure.
|
||||||
|
* @param conf_cb Pointer to user callback.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.3.5
|
||||||
|
*/
|
||||||
|
void mlme_associate_req(mlme_associate_req_t * req, mlme_associate_conf_cb_t conf_cb);
|
||||||
|
|
||||||
|
|
||||||
|
#if (CONFIG_ASSOCIATE_IND_ENABLED == 1)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-ASSOCIATE indication handler.
|
||||||
|
*
|
||||||
|
* @details Indicates an association with a PAN through a coordinator
|
||||||
|
* next higher layer of a coordinator receives the MLME-ASSOCIATE.indication
|
||||||
|
* primitive to determine whether to accept or reject the unassociated device
|
||||||
|
* using an algorithm outside the scope of standard.
|
||||||
|
*
|
||||||
|
* @param ind MLME ASSOCIATE indication structure.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.3.5.
|
||||||
|
*/
|
||||||
|
extern void mlme_associate_ind(mlme_associate_ind_t * ind);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-ASSOCIATE response.
|
||||||
|
*
|
||||||
|
* @details Respond to an association with a PAN and issue to its MLME in order to
|
||||||
|
* respond to the MLME-ASSOCIATE.indication.
|
||||||
|
* Response structure passed as a parameter to this function must be retained
|
||||||
|
* in memory until the related MLME-COMM-STATUS.indication is received.
|
||||||
|
*
|
||||||
|
* @param resp MLME_ASSOCIATE response structure.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.3.5.
|
||||||
|
*/
|
||||||
|
void mlme_associate_resp(mlme_associate_resp_t * resp);
|
||||||
|
|
||||||
|
#endif // (CONFIG_ASSOCIATE_IND_ENABLED == 1)
|
||||||
|
|
||||||
|
#endif // (CONFIG_ASSOCIATE_REQ_ENABLED == 1)
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // MAC_MLME_ASSOCIATE_H_INCLUDED
|
||||||
175
components/802_15_4/api/MAC/mac_mlme_beacon_notify.h
Normal file
175
components/802_15_4/api/MAC/mac_mlme_beacon_notify.h
Normal file
@ -0,0 +1,175 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef MAC_MLME_BEACON_NOTIFY_H_INCLUDED
|
||||||
|
#define MAC_MLME_BEACON_NOTIFY_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "mac_common.h"
|
||||||
|
#include "mac_time.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* The MAC Beacon notify module declares the MAC beacon notification routine and necessary
|
||||||
|
* types/macros according to the MAC specification.
|
||||||
|
*
|
||||||
|
* @defgroup mac_beacon_notify MAC MLME Beacon Notify API
|
||||||
|
* @ingroup mac_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare MAC MLME Beacon Notify API.
|
||||||
|
* @details The MAC Beacon Notify module declares Beacon Notify MLME routines and necessary macros/types
|
||||||
|
* according to the MAC specification. MAC MLME Beacon notify indication is declared as
|
||||||
|
* mlme_beacon_notify_ind().
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief This constant is defined in 7.2.2.1.7 Address List field
|
||||||
|
*
|
||||||
|
* @details The maximum number of addresses pending shall be limited to seven and may comprise
|
||||||
|
* both short and extended addresses.
|
||||||
|
*/
|
||||||
|
#define MAC_PENDING_ADDR_MAX 7
|
||||||
|
|
||||||
|
/*@brief The maximum length of GTS fields inside beacon in octets.
|
||||||
|
*
|
||||||
|
* @details This definition is used to allocate memory for outgoing beacon.
|
||||||
|
*/
|
||||||
|
#define MAC_MAX_GTS_FIELD_LEN 23
|
||||||
|
|
||||||
|
/**@brief Superframe specification structure.*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t beacon_order : 4;
|
||||||
|
uint16_t superframe_order : 4;
|
||||||
|
uint16_t final_cap_slot : 4;
|
||||||
|
uint16_t battery_life_extension : 1;
|
||||||
|
uint16_t reserved : 1;
|
||||||
|
uint16_t pan_coordinator : 1;
|
||||||
|
uint16_t association_permit : 1;
|
||||||
|
} mac_superframe_spec_t;
|
||||||
|
|
||||||
|
|
||||||
|
/** @brief List of pending addresses
|
||||||
|
* Short addresses are at the top of the table.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
mac_addr_t addr_list[MAC_PENDING_ADDR_MAX];
|
||||||
|
/**< Addresses array. */
|
||||||
|
uint8_t short_addr_number; /**< Number of short addresses in the array. */
|
||||||
|
uint8_t ext_addr_number; /**< Number of long addresses in the array. */
|
||||||
|
} mac_pending_addr_list_t;
|
||||||
|
|
||||||
|
/**@brief PAN Descriptor structure.
|
||||||
|
*
|
||||||
|
* @details See Table 55-Elements of PANDescriptor.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
mac_addr_mode_t coord_addr_mode; /**< Coordinator addressing mode. */
|
||||||
|
uint16_t coord_pan_id; /**< Coordinator PAN ID. */
|
||||||
|
mac_addr_t coord_address; /**< Coordinator address. */
|
||||||
|
uint8_t logical_channel; /**< Logical channel. */
|
||||||
|
#ifdef CONFIG_SUB_GHZ
|
||||||
|
uint8_t channel_page; /**< Channel page. */
|
||||||
|
#endif
|
||||||
|
mac_superframe_spec_t superframe_spec; /**< Superframe specification. */
|
||||||
|
bool gts_permit; /**< Is GTS permitted? */
|
||||||
|
uint8_t link_quality; /**< Link quality. */
|
||||||
|
mac_timestamp_t timestamp; /**< Timestamp. */
|
||||||
|
#if (CONFIG_SECURE == 1)
|
||||||
|
uint8_t security_failure; /**< Security failure. */
|
||||||
|
uint8_t security_level; /**< Security level. */
|
||||||
|
uint8_t key_id_mode; /**< Key ID mode. */
|
||||||
|
uint64_t key_source; /**< Key source. */
|
||||||
|
uint8_t key_index; /**< Key index. */
|
||||||
|
#endif
|
||||||
|
} mac_pan_descriptor_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Pending Address Specification
|
||||||
|
*
|
||||||
|
* @details See Figure 51-Format of the Pending Address Specification field.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint8_t pending_short : 3;
|
||||||
|
uint8_t : 1;
|
||||||
|
uint8_t pending_extended : 3;
|
||||||
|
uint8_t : 1;
|
||||||
|
} mac_pend_addr_spec_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief MLME-BEACON-NOTIFY.indication parameters
|
||||||
|
*
|
||||||
|
* @details See 7.1.5.1 MLME-BEACON-NOTIFY.indication
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint8_t bsn; /**< Beacon sequence number. */
|
||||||
|
mac_pan_descriptor_t pan_descriptor; /**< PAN descriptor. */
|
||||||
|
mac_pend_addr_spec_t pend_addr_spec; /**< Pending address specification. */
|
||||||
|
mac_addr_t addr_list[MAC_PENDING_ADDR_MAX];
|
||||||
|
/**< Addresses array. */
|
||||||
|
uint8_t sdu_length; /**< SDU length. */
|
||||||
|
mac_payload_descriptor_t sdu; /**< SDU. */
|
||||||
|
#if (CONFIG_SECURE == 1)
|
||||||
|
uint8_t security_level; /**< Security level. */
|
||||||
|
uint8_t key_id_mode; /**< Key ID mode. */
|
||||||
|
uint64_t key_source; /**< Key source. */
|
||||||
|
uint8_t key_index; /**< Key index. */
|
||||||
|
#endif
|
||||||
|
} mlme_beacon_notify_ind_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief User implemented function, which handles MLME-BEACON-NOTIFY.indication.
|
||||||
|
*
|
||||||
|
* @details The MLME-BEACON-NOTIFY.indication primitive is used to send parameters contained
|
||||||
|
* within a beacon frame received by the MAC sublayer to the next higher layer.
|
||||||
|
* The primitive also sends a measure of the LQI and the time the beacon frame
|
||||||
|
* was received. See 7.1.5.1 MLME-BEACON-NOTIFY.indication.
|
||||||
|
*
|
||||||
|
* @param ind MLME-BEACON-NOTIFY.indication parameters. See @ref mlme_beacon_notify_ind_t.
|
||||||
|
*/
|
||||||
|
extern void mlme_beacon_notify_ind(mlme_beacon_notify_ind_t * ind);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // MAC_MLME_BEACON_NOTIFY_H_INCLUDED
|
||||||
135
components/802_15_4/api/MAC/mac_mlme_comm_status.h
Normal file
135
components/802_15_4/api/MAC/mac_mlme_comm_status.h
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
// Terms and conditions of usage are described in detail in NORDIC
|
||||||
|
// SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
|
||||||
|
//
|
||||||
|
// Licensees are granted free, non-transferable use of the information. NO
|
||||||
|
// WARRANTY of ANY KIND is provided. This heading must NOT be removed from
|
||||||
|
// the file.
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef MAC_MLME_COMM_STATUS_H_INCLUDED
|
||||||
|
#define MAC_MLME_COMM_STATUS_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "mac_common.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* The MAC Comm Status module declares the MAC communication status indication routine and
|
||||||
|
* necessary types/macros according to the MAC specification.
|
||||||
|
*
|
||||||
|
* @defgroup mac_comm_status MAC MLME Comm Status API
|
||||||
|
* @ingroup mac_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare MAC MLME Comm Status API.
|
||||||
|
* @details The MAC Comm Status module declares communication status indication MLME routine and necessary
|
||||||
|
* macros/types according to the MAC specification. MAC MLME Comm Status indication is declared as
|
||||||
|
* mlme_comm_status_ind().
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-COMM-STATUS.indication
|
||||||
|
*
|
||||||
|
* @details The MLME-COMM-STATUS.indication primitive allows the MLME to indicate a
|
||||||
|
* communication status.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.12.1
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The 16-bit PAN identifier of the device from which the frame was received or to
|
||||||
|
* which the frame was being sent.
|
||||||
|
*/
|
||||||
|
uint16_t pan_id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The source addressing mode for this primitive. This value can take one of the
|
||||||
|
* following values:
|
||||||
|
* @ref mac_addr_mode_t
|
||||||
|
* 0x00 = no address (addressing fields omitted).
|
||||||
|
* 0x01 = reserved.
|
||||||
|
* 0x02 = 16-bit short address.
|
||||||
|
* 0x03 = 64-bit extended address.
|
||||||
|
*/
|
||||||
|
mac_addr_mode_t src_addr_mode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The individual device address of the entity from which the frame causing the error
|
||||||
|
* originated.
|
||||||
|
*/
|
||||||
|
mac_addr_t src_addr;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The destination addressing mode for this primitive.
|
||||||
|
* According to 7.1.12.1.1, Table 69.
|
||||||
|
*/
|
||||||
|
mac_addr_mode_t dst_addr_mode;
|
||||||
|
|
||||||
|
/** The individual device address of the device for which the frame was intended. */
|
||||||
|
mac_addr_t dst_addr;
|
||||||
|
|
||||||
|
/** The communications status. */
|
||||||
|
mac_status_t status;
|
||||||
|
|
||||||
|
uint8_t security_level; /**< Security level. */
|
||||||
|
uint8_t key_id_mode; /**< Key ID mode. */
|
||||||
|
uint64_t key_source; /**< Key source. */
|
||||||
|
uint8_t key_index; /**< Key index. */
|
||||||
|
} mlme_comm_status_ind_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-COMM-STATUS.indication handler
|
||||||
|
*
|
||||||
|
* @details The MLME-COMM-STATUS.indication primitive is generated by the MLME and issued to its next higher
|
||||||
|
* layer either following a transmission instigated through a response primitive or on receipt of a frame that
|
||||||
|
* generates an error in its security processing (see 7.5.8.2.3).
|
||||||
|
*
|
||||||
|
* @param ind MLME-COMM-STATUS.indication structure.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.12.1
|
||||||
|
*/
|
||||||
|
extern void mlme_comm_status_ind(mlme_comm_status_ind_t * ind);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // MAC_MLME_COMM_STATUS_H_INCLUDED
|
||||||
199
components/802_15_4/api/MAC/mac_mlme_disassociate.h
Normal file
199
components/802_15_4/api/MAC/mac_mlme_disassociate.h
Normal file
@ -0,0 +1,199 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef MAC_MLME_DISASSOCIATE_H_INCLUDED
|
||||||
|
#define MAC_MLME_DISASSOCIATE_H_INCLUDED
|
||||||
|
|
||||||
|
#if (CONFIG_DISASSOCIATE_ENABLED == 1)
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "mac_common.h"
|
||||||
|
#include "mac_task_scheduler.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* The MAC MLME Disassociate module declares the MAC disassociation routines and
|
||||||
|
* necessary types/macros according to the MAC specification.
|
||||||
|
*
|
||||||
|
* @defgroup mac_diassociate MAC MLME Disassociate API
|
||||||
|
* @ingroup mac_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare MAC MLME Disassociate API.
|
||||||
|
* @details The MLME Disassociation module declares Disassociation MAC routines and necessary types
|
||||||
|
* according to the MAC specification. More specifically, MLME Disassociation request aka
|
||||||
|
* mlme_disassociate_req(), MLME Disassociation confirm callback typedef aka
|
||||||
|
* mlme_disassociate_conf_cb_t, and MLME Disassociation indication as mlme_disassociate_ind()
|
||||||
|
* primitives are declared.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MAC Disassociation Reason field
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.3.2.2
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
/** The coordinator wishes the device to leave the PAN. */
|
||||||
|
MAC_COORD_REASON = 1,
|
||||||
|
/** The device wishes to leave the PAN. */
|
||||||
|
MAC_DEV_REASON = 2
|
||||||
|
} mac_disassociate_reason_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-DISASSOCIATE.confirm
|
||||||
|
*
|
||||||
|
* @details On receipt of the MLME-DISASSOCIATE.confirm primitive, the next
|
||||||
|
* higher layer of the initiating device is notified of the result of the
|
||||||
|
* disassociation attempt. If the disassociation attempt was successful,
|
||||||
|
* the status parameter will be set to SUCCESS. Otherwise, the status parameter
|
||||||
|
* indicates the error.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.4.3
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
mac_status_t status; /**< Status of operation. */
|
||||||
|
mac_addr_mode_t device_addr_mode; /**< Device addressing mode. */
|
||||||
|
uint16_t device_pan_id; /**< Device PAN ID. */
|
||||||
|
mac_addr_t device_address; /**< Device address. */
|
||||||
|
} mlme_disassociate_conf_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-DISASSOCIATE.request
|
||||||
|
*
|
||||||
|
* @details The MLME-DISASSOCIATE.request primitive is generated by the next
|
||||||
|
* higher layer of an associated device and issued to its MLME to request
|
||||||
|
* disassociation from the PAN. It is also generated by the next higher layer
|
||||||
|
* of the coordinator and issued to its MLME to instruct an
|
||||||
|
* associated device to leave the PAN.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.4.1
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** Do not edit this field. */
|
||||||
|
mac_abstract_req_t service;
|
||||||
|
|
||||||
|
/** Confirm to this request. */
|
||||||
|
mlme_disassociate_conf_t confirm;
|
||||||
|
|
||||||
|
mac_addr_mode_t device_addr_mode; /**< Device addressing mode. */
|
||||||
|
uint16_t device_pan_id; /**< Device PAN ID. */
|
||||||
|
mac_addr_t device_address; /**< Device address. */
|
||||||
|
mac_disassociate_reason_t disassociate_reason; /**< Disassociation reason. */
|
||||||
|
bool tx_indirect; /**< Is TX indirect? */
|
||||||
|
#if (CONFIG_SECURE == 1)
|
||||||
|
uint8_t security_level; /**< Security level. */
|
||||||
|
uint8_t key_id_mode; /**< Key ID mode. */
|
||||||
|
uint64_t key_source; /**< Key source. */
|
||||||
|
uint8_t key_index; /**< Key index. */
|
||||||
|
#endif
|
||||||
|
} mlme_disassociate_req_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-DISASSOCIATE.indication
|
||||||
|
*
|
||||||
|
* @details Is generated by the MLME and issued to its next higher
|
||||||
|
* layer on receipt of a disassociation notification command.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.4.2
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint64_t device_address; /**< Device address. */
|
||||||
|
mac_disassociate_reason_t disassociate_reason; /**< Disassociation reason. */
|
||||||
|
#if (CONFIG_SECURE == 1)
|
||||||
|
uint8_t security_level; /**< Security level. */
|
||||||
|
uint8_t key_id_mode; /**< Key ID mode. */
|
||||||
|
uint64_t key_source; /**< Key source. */
|
||||||
|
uint8_t key_index; /**< Key index. */
|
||||||
|
#endif
|
||||||
|
} mlme_disassociate_ind_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Customer's function of confirmation
|
||||||
|
*
|
||||||
|
* @details The MLME-DISASSOCIATE.confirm primitive is generated by the initiating
|
||||||
|
* MLME and issued to its next higher layer in response to an MLME-DISASSOCIATE.request
|
||||||
|
* primitive. This primitive returns a status of either SUCCESS, indicating that the
|
||||||
|
* disassociation request was successful, or the appropriate error code.
|
||||||
|
* The status values are fully described in 7.1.4.1.3 and subclauses referenced by 7.1.4.1.3.
|
||||||
|
*
|
||||||
|
* @param pointer to confirmation primitive
|
||||||
|
*/
|
||||||
|
typedef void (* mlme_disassociate_conf_cb_t)(mlme_disassociate_conf_t *);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-DISASSOCIATE request
|
||||||
|
*
|
||||||
|
* @details Request disassociation with a PAN
|
||||||
|
* After request completion, user callback will be issued with
|
||||||
|
* valid data stored in structure @ref mlme_disassociate_conf_t.
|
||||||
|
*
|
||||||
|
* @param req MLME_DISASSOCIATE request structure.
|
||||||
|
* @param conf_cb pointer to user callback.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.4.4
|
||||||
|
*/
|
||||||
|
void mlme_disassociate_req(mlme_disassociate_req_t * req, mlme_disassociate_conf_cb_t conf_cb);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-DISASSOCIATE indication handler
|
||||||
|
*
|
||||||
|
* @details Indicates an disassociation with a PAN
|
||||||
|
*
|
||||||
|
* @param ind MLME_DISASSOCIATE indication structure.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.4.4
|
||||||
|
*/
|
||||||
|
extern void mlme_disassociate_ind(mlme_disassociate_ind_t * ind);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // (CONFIG_DISASSOCIATE_ENABLED == 1)
|
||||||
|
|
||||||
|
#endif // MAC_MLME_DISASSOCIATE_H_INCLUDED
|
||||||
211
components/802_15_4/api/MAC/mac_mlme_gts.h
Normal file
211
components/802_15_4/api/MAC/mac_mlme_gts.h
Normal file
@ -0,0 +1,211 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef MAC_MLME_GTS_H_INCLUDED
|
||||||
|
#define MAC_MLME_GTS_H_INCLUDED
|
||||||
|
|
||||||
|
#if (CONFIG_GTS_ENABLED == 1)
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "mac_common.h"
|
||||||
|
#include "mac_task_scheduler.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* The MAC MLME GTS module declares the MAC Guaranteed time slots routines and
|
||||||
|
* necessary types/macros according to the MAC specification.
|
||||||
|
*
|
||||||
|
* @defgroup mac_gts MAC MLME GTS API
|
||||||
|
* @ingroup mac_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare MAC MLME GTS API.
|
||||||
|
* @details The MAC GTS module declares MAC Guaranteed Time Slots routines and necessary types according to
|
||||||
|
* the MAC specification. More specifically, MLME GTS request aka mlme_gts_req(), MLME GTS indicaton
|
||||||
|
* aka mlme_gts_ind(), and MLME GTS confirm callback typedef aka mlme_gts_conf_cb_t primitives are
|
||||||
|
* declared.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief GTS directions, from device side. */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
MAC_GTS_DIR_TXONLY = 0, /**< TX only direction. */
|
||||||
|
MAC_GTS_DIR_RXONLY = 1 /**< RX only direction. */
|
||||||
|
} mac_gts_direction_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief GTS characteristics type. */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
MAC_GTS_DEALLOC = 0, /**< GTS Dealloc. */
|
||||||
|
MAC_GTS_ALLOC = 1 /**< GTS Alloc. */
|
||||||
|
} mac_gts_characteristics_type_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief MAC GTS characteristics (not packed)
|
||||||
|
*
|
||||||
|
* @details See Section 7.3.9.2
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint8_t gts_length : 4;
|
||||||
|
uint8_t gts_direction : 1;
|
||||||
|
uint8_t characterictics_type : 1;
|
||||||
|
uint8_t : 2;
|
||||||
|
} bit;
|
||||||
|
uint8_t all;
|
||||||
|
} mac_gts_characteristics_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-GTS.confirm
|
||||||
|
*
|
||||||
|
* @details The MLME-GTS.confirm primitive reports the results of a
|
||||||
|
* request to allocate a new GTS or deallocate an existing GTS.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.7.2
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
mac_gts_characteristics_t gts_characteristics; /**< GTS characteristics. */
|
||||||
|
mac_status_t status; /**< Status of operation. */
|
||||||
|
} mlme_gts_conf_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-GTS.request
|
||||||
|
*
|
||||||
|
* @details The MLME-GTS.request primitive allows a device to send a request
|
||||||
|
* to the PAN coordinator to allocate a new GTS or to deallocate an existing GTS.
|
||||||
|
* This primitive is also used by the PAN coordinator to initiate a GTS deallocation.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.7.1
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** Do not edit this field. */
|
||||||
|
mac_abstract_req_t service;
|
||||||
|
|
||||||
|
/** Confirm to this request. */
|
||||||
|
mlme_gts_conf_t confirm;
|
||||||
|
|
||||||
|
mac_gts_characteristics_t gts_characteristics; /**< GTS characteristics. */
|
||||||
|
#if (CONFIG_SECURE == 1)
|
||||||
|
uint8_t security_level; /**< Security level. */
|
||||||
|
uint8_t key_id_mode; /**< Key ID mode. */
|
||||||
|
uint64_t key_source; /**< Key source. */
|
||||||
|
uint8_t key_index; /**< Key index. */
|
||||||
|
#endif
|
||||||
|
} mlme_gts_req_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-GTS.indication
|
||||||
|
*
|
||||||
|
* @details The MLME-GTS.indication primitive indicates that a
|
||||||
|
* GTS has been allocated or that a previously allocated GTS
|
||||||
|
* has been deallocated.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.7.3
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t device_address; /**< Device address. */
|
||||||
|
mac_gts_characteristics_t gts_characteristics; /**< GTS characteristics. */
|
||||||
|
#if (CONFIG_SECURE == 1)
|
||||||
|
uint8_t security_level; /**< Security level. */
|
||||||
|
uint8_t key_id_mode; /**< Key ID mode. */
|
||||||
|
uint64_t key_source; /**< Key source. */
|
||||||
|
uint8_t key_index; /**< Key index. */
|
||||||
|
#endif
|
||||||
|
} mlme_gts_ind_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-GTS confirm callback
|
||||||
|
*
|
||||||
|
* @details The MLME-GTS.confirm primitive is generated by the MLME and
|
||||||
|
* issued to its next higher layer in response to a previously
|
||||||
|
* issued MLME-GTS.request primitive.
|
||||||
|
*
|
||||||
|
* @param MLME_GTS callback structure.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.7.4
|
||||||
|
*/
|
||||||
|
typedef void (* mlme_gts_conf_cb_t)(mlme_gts_conf_t *);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-GTS request
|
||||||
|
*
|
||||||
|
* @details The MLME-GTS.request primitive is generated by the next higher
|
||||||
|
* layer of a device and issued to its MLME to request the allocation of a
|
||||||
|
* new GTS or to request the deallocation of an existing GTS. It is also
|
||||||
|
* generated by the next higher layer of the PAN coordinator and issued to
|
||||||
|
* its MLME to request the deallocation of an existing GTS.
|
||||||
|
*
|
||||||
|
* @param req MLME_GTS request structure.
|
||||||
|
* @param conf_cb pointer to user callback.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.7.4
|
||||||
|
*/
|
||||||
|
void mlme_gts_req(mlme_gts_req_t * req, mlme_gts_conf_cb_t conf_cb);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-GTS indication handler
|
||||||
|
*
|
||||||
|
* @details The MLME-GTS.indication primitive is generated by the MLME of
|
||||||
|
* the PAN coordinator to its next higher layer whenever a GTS is allocated
|
||||||
|
* or deallocated following the reception of a GTS request command (see 7.3.9)
|
||||||
|
* by the MLME. The MLME of the PAN coordinator also generates this primitive when a GTS
|
||||||
|
* deallocation is initiated by the PAN coordinator itself.
|
||||||
|
*
|
||||||
|
* @param ind MLME_GTS indication structure.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.7.4
|
||||||
|
*/
|
||||||
|
extern void mlme_gts_ind(mlme_gts_ind_t * ind);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // (CONFIG_GTS_ENABLED == 1)
|
||||||
|
|
||||||
|
#endif // MAC_MLME_GTS_H_INCLUDED
|
||||||
151
components/802_15_4/api/MAC/mac_mlme_orphan.h
Normal file
151
components/802_15_4/api/MAC/mac_mlme_orphan.h
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef MAC_MLME_ORPHAN_H_INCLUDED
|
||||||
|
#define MAC_MLME_ORPHAN_H_INCLUDED
|
||||||
|
|
||||||
|
#if (CONFIG_ORPHAN_ENABLED == 1)
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "mac_common.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* The MAC MLME Orphan module declares the MAC Orphan routines and
|
||||||
|
* necessary types/macros according to the MAC specification.
|
||||||
|
*
|
||||||
|
* @defgroup mac_orphan MAC MLME Orphan API
|
||||||
|
* @ingroup mac_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare MAC MLME Orphan API.
|
||||||
|
* @details The MAC Orphan module declares routines and necessary types to deal with the Orphan devices
|
||||||
|
* according to the MAC specification. More specifically, MAC MLME Orphan indication aka
|
||||||
|
* mlme_orphan_ind(), MAC MLME Orphan response aka mlme_orphan_resp() primitives are declared.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-ORPHAN.indication
|
||||||
|
*
|
||||||
|
* @details The MLME-ORPHAN.indication primitive allows the MLME of a coordinator
|
||||||
|
* to notify the next higher layer of the presence of an orphaned device.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.8.1
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** The address of the orphaned device. */
|
||||||
|
uint64_t orphan_address;
|
||||||
|
#if (CONFIG_SECURE == 1)
|
||||||
|
uint8_t security_level; /**< Security level. */
|
||||||
|
uint8_t key_id_mode; /**< Key ID mode. */
|
||||||
|
uint64_t key_source; /**< Key source. */
|
||||||
|
uint8_t key_index; /**< Key index. */
|
||||||
|
#endif
|
||||||
|
} mlme_orphan_ind_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-ORPHAN.response
|
||||||
|
*
|
||||||
|
* @details The MLME-ORPHAN.response primitive allows the next higher layer of a coordinator
|
||||||
|
* to respond to the MLME-ORPHAN.indication primitive.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.8.2
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** Do not edit this field. */
|
||||||
|
mac_abstract_req_t service;
|
||||||
|
|
||||||
|
/** The address of the orphaned device. */
|
||||||
|
uint64_t orphan_address;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The 16-bit short address allocated to the orphaned device if it is associated with this
|
||||||
|
* coordinator. The special short address 0xfffe indicates that no short address was
|
||||||
|
* allocated, and the device will use its 64-bit extended address in all communications.
|
||||||
|
* If the device was not associated with this coordinator, this field will contain the
|
||||||
|
* value 0xffff and be ignored on receipt.
|
||||||
|
*/
|
||||||
|
uint16_t short_address;
|
||||||
|
|
||||||
|
/** TRUE if the orphaned device is associated with this coordinator or FALSE otherwise. */
|
||||||
|
bool associated_member;
|
||||||
|
#if (CONFIG_SECURE == 1)
|
||||||
|
uint8_t security_level; /**< Security level. */
|
||||||
|
uint8_t key_id_mode; /**< Key ID mode. */
|
||||||
|
uint64_t key_source; /**< Key source. */
|
||||||
|
uint8_t key_index; /**< Key index. */
|
||||||
|
#endif
|
||||||
|
} mlme_orphan_resp_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-ORPHAN.indication handler
|
||||||
|
*
|
||||||
|
* @details The MLME-ORPHAN.indication primitive is generated by the MLME of a coordinator
|
||||||
|
* and issued to its next higher layer on receipt of an orphan notification command (see 7.3.6).
|
||||||
|
*
|
||||||
|
* @param ind MLME-ORPHAN.indication structure.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.8.1
|
||||||
|
*/
|
||||||
|
extern void mlme_orphan_ind(mlme_orphan_ind_t * ind);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-ORPHAN.response handler
|
||||||
|
*
|
||||||
|
* @details The MLME-ORPHAN.response primitive is generated by the next higher layer and issued to its MLME
|
||||||
|
* when it reaches a decision about whether the orphaned device indicated in the MLME-ORPHAN.indication
|
||||||
|
* primitive is associated.
|
||||||
|
*
|
||||||
|
* @param resp MLME-ORPHAN.response structure.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.8.2
|
||||||
|
*/
|
||||||
|
void mlme_orphan_resp(mlme_orphan_resp_t * resp);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // (CONFIG_ORPHAN_ENABLED == 1)
|
||||||
|
|
||||||
|
#endif // MAC_MLME_ORPHAN_H_INCLUDED
|
||||||
508
components/802_15_4/api/MAC/mac_mlme_pib.h
Normal file
508
components/802_15_4/api/MAC/mac_mlme_pib.h
Normal file
@ -0,0 +1,508 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef MAC_MLME_PIB_H_INCLUDED
|
||||||
|
#define MAC_MLME_PIB_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "mac_common.h"
|
||||||
|
#include "phy_plme_pib.h"
|
||||||
|
#include "mac_task_scheduler.h"
|
||||||
|
#include "mac_security.h"
|
||||||
|
#include "sys_debug.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* The MAC MLME PIB module declares the MAC PHY Information Base routines and
|
||||||
|
* necessary types/macros according to the MAC specification.
|
||||||
|
*
|
||||||
|
* @defgroup mac_pib MAC MLME PIB API
|
||||||
|
* @ingroup mac_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare MAC MLME PIB API.
|
||||||
|
* @details The MAC PIB module declares routines and necessary types to deal with the PHY Information Base
|
||||||
|
* functionality related to MAC. More specifically, MLME PIB Get request aka mlme_get_req(), MLME
|
||||||
|
* PIB Set request aka mlme_set_req(), MLME PIB confirmation callbacks aka mlme_get_conf_cb_t, and
|
||||||
|
* mlme_set_conf_cb_t primitives are declared. Two additional primitives not covered by the
|
||||||
|
* standard are declared. These are mlme_get() and mlme_set() which are synchronous versions of
|
||||||
|
* mlme_get_req() and mlme_set_req() accordingly. There is one helper informational routine
|
||||||
|
* mlme_pib_attr_size_calc() to count MLME attribute size in bytes. Refer to the
|
||||||
|
* mac_pib_param_test application for detailed samples of implementation of these primitives.
|
||||||
|
* This module also defines the MAC Table API. The tables can be used to deal with MAC attributes.
|
||||||
|
* A special initialization routine mac_table_init() should be called before using of any other MAC
|
||||||
|
* table API. The mac_table_reset() routine is used to clean up an existing (initialized) table.
|
||||||
|
* mac_table_idx_get() searches through a MAC table to find the item with requested idx. The
|
||||||
|
* mac_table_item_set() routine is needed to substitute a table item with a new value. The
|
||||||
|
* mac_table_item_remove() routine removes the item with the given index from the table and
|
||||||
|
* frees all resources associated with the item. mac_table_item_front() and mac_table_item_next()
|
||||||
|
* return the first and next item from the table. The mac_table_size_get() routine returns the
|
||||||
|
* number of items in the table, while mac_table_is_empty() checks if the table is empty.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MAC PIB attribute identifiers
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.4.2
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
MAC_ACK_WAIT_DURATION = 0x40,
|
||||||
|
MAC_ASSOCIATION_PERMIT,
|
||||||
|
MAC_AUTO_REQUEST,
|
||||||
|
MAC_BATT_LIFE_EXT,
|
||||||
|
MAC_BATT_LIFE_EXT_PERIODS,
|
||||||
|
MAC_BEACON_PAYLOAD, /* 0x45 */
|
||||||
|
MAC_BEACON_PAYLOAD_LENGTH,
|
||||||
|
MAC_BEACON_ORDER, /**< Specification of how often the
|
||||||
|
coordinator transmits its
|
||||||
|
beacon. If BO = 15, the
|
||||||
|
coordinator will not transmit
|
||||||
|
a periodic beacon.*/
|
||||||
|
MAC_BEACON_TX_TIME,
|
||||||
|
MAC_BSN,
|
||||||
|
MAC_COORD_EXTENDED_ADDRESS, /* 0x4A */
|
||||||
|
MAC_COORD_SHORT_ADDRESS,
|
||||||
|
MAC_DSN,
|
||||||
|
MAC_GTS_PERMIT,
|
||||||
|
MAC_MAX_CSMA_BACKOFFS,
|
||||||
|
MAC_MIN_BE,
|
||||||
|
MAC_PAN_ID, /**< PAN Identifier.*/
|
||||||
|
/* 0x50 */
|
||||||
|
MAC_PROMISCUOUS_MODE,
|
||||||
|
MAC_RX_ON_WHEN_IDLE,
|
||||||
|
MAC_SHORT_ADDRESS, /**< MAC Short Address.*/
|
||||||
|
MAC_SUPERFRAME_ORDER,
|
||||||
|
MAC_TRANSACTION_PERSISTENCE_TIME, /* 0x55 */
|
||||||
|
MAC_ASSOCIATED_PAN_COORD,
|
||||||
|
MAC_MAX_BE,
|
||||||
|
MAC_MAX_FRAME_TOTAL_WAIT_TIME,
|
||||||
|
MAC_MAX_FRAME_RETRIES,
|
||||||
|
MAC_RESPONSE_WAIT_TIME, /* 0x5A */
|
||||||
|
MAC_SYNC_SYMBOL_OFFSET,
|
||||||
|
MAC_TIMESTAMP_SUPPORTED,
|
||||||
|
MAC_SECURITY_ENABLED,
|
||||||
|
MAC_MIN_LIFS_PERIOD, /* 0x5E No attribute id in Table 86.*/
|
||||||
|
MAC_MIN_SIFS_PERIOD, /* 0x5F No attribute id in Table 86.*/
|
||||||
|
MAC_EXTENDED_ADDRESS, /**< MAC Extended Address.*/
|
||||||
|
/* 0x60 Not covered by standard.*/
|
||||||
|
MAC_IS_PAN_COORD,
|
||||||
|
|
||||||
|
#if (CONFIG_SECURE == 1)
|
||||||
|
MAC_KEY_TABLE = 0x71,
|
||||||
|
MAC_KEY_TABLE_ENTRIES,
|
||||||
|
MAC_DEVICE_TABLE,
|
||||||
|
MAC_DEVICE_TABLE_ENTRIES,
|
||||||
|
MAC_SECURITY_LEVEL_TABLE, /* 0x75 */
|
||||||
|
MAC_SECURITY_LEVEL_TABLE_ENTRIES,
|
||||||
|
MAC_FRAME_COUNTER,
|
||||||
|
MAC_AUTO_REQUEST_SECURITY_LEVEL,
|
||||||
|
MAC_AUTO_REQUEST_KEY_ID_MODE,
|
||||||
|
MAC_AUTO_REQUEST_KEY_SOURCE, /* 0x7A */
|
||||||
|
MAC_AUTO_REQUEST_KEY_INDEX,
|
||||||
|
MAC_DEFAULT_KEY_SOURCE,
|
||||||
|
MAC_PAN_COORD_EXTENDED_ADDRESS,
|
||||||
|
MAC_PAN_COORD_SHORT_ADDRESS,
|
||||||
|
|
||||||
|
/* Items below do not covered by the standard */
|
||||||
|
|
||||||
|
// these three IDs are used to make access to the root of security tables
|
||||||
|
MAC_KEY_TABLE_POINTER,
|
||||||
|
MAC_DEVICE_TABLE_POINTER,
|
||||||
|
MAC_SECURITY_LEVEL_TABLE_POINTER,
|
||||||
|
|
||||||
|
// these three IDs are stored inside PIB base and
|
||||||
|
// used to get table item sizes
|
||||||
|
MAC_KEY_ID_LOOKUP_LIST,
|
||||||
|
MAC_KEY_DEVICE_LIST,
|
||||||
|
MAC_KEY_USAGE_LIST,
|
||||||
|
#endif
|
||||||
|
} mlme_pib_attr_id_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief United PIB attribute identifiers
|
||||||
|
*
|
||||||
|
* To unite access to MAC and PHY PIB by one API
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
mlme_pib_attr_id_t mlme_id; /**< PIB is MAC-based. */
|
||||||
|
plme_pib_attr_id_t plme_id; /**< PIB is PHY-based. */
|
||||||
|
} pib_id_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-GET.confirm
|
||||||
|
*
|
||||||
|
* @details structure for confirming information about a given PIB attribute.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.6.2
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
mac_status_t status; /**< Status of operation. */
|
||||||
|
pib_id_t pib_attribute; /**< PIB Attribute. */
|
||||||
|
uint8_t pib_attribute_idx; /**< PIB Attribute index. */
|
||||||
|
/** value size is calculated with 'mlme_pib_attr_size_calc' */
|
||||||
|
uint8_t * value; /**< Attribute value. */
|
||||||
|
} mlme_get_conf_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-GET.request
|
||||||
|
*
|
||||||
|
* @details structure for requesting information about a given PIB attribute.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.6.1
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** Do not edit this field. */
|
||||||
|
mac_abstract_req_t service;
|
||||||
|
|
||||||
|
/** Confirm to this request. */
|
||||||
|
mlme_get_conf_t confirm;
|
||||||
|
|
||||||
|
pib_id_t pib_attribute; /**< PIB Attribute. */
|
||||||
|
uint8_t pib_attribute_idx; /**< PIB Attribute index. */
|
||||||
|
} mlme_get_req_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-SET.confirm
|
||||||
|
*
|
||||||
|
* @details structure for reporting the results of an attempt to write a value
|
||||||
|
* to a PIB attribute.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.13.2
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
mac_status_t status; /**< Status of operation. */
|
||||||
|
pib_id_t pib_attribute; /**< PIB Attribute. */
|
||||||
|
uint8_t pib_attribute_idx; /**< PIB Attribute index. */
|
||||||
|
} mlme_set_conf_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-SET.request
|
||||||
|
*
|
||||||
|
* @details structure for setting a PIB attribute.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.13.1
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** Do not edit this field. */
|
||||||
|
mac_abstract_req_t service;
|
||||||
|
|
||||||
|
/** Confirm to this request. */
|
||||||
|
mlme_set_conf_t confirm;
|
||||||
|
|
||||||
|
pib_id_t pib_attribute; /**< PIB Attribute. */
|
||||||
|
uint8_t pib_attribute_idx; /**< PIB Attribute index. */
|
||||||
|
uint8_t * value; /**< Attribute value. The value size is calculated
|
||||||
|
with mlme_pib_attr_size_calc. */
|
||||||
|
} mlme_set_req_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Customer's function of confirmation
|
||||||
|
*
|
||||||
|
* @details The MLME-GET.confirm primitive is generated by the MLME and issued
|
||||||
|
* to its next higher layer in response to an MLME-GET.request primitive.
|
||||||
|
* This primitive returns a status of either SUCCESS, indicating that the request
|
||||||
|
* to read a PIB attribute was successful, or an error code of UNSUPPORTED_ATTRIBUTE.
|
||||||
|
* When an error code of UNSUPPORTED_ATTRIBUTE is returned, the PIBAttribute value
|
||||||
|
* parameter will be set to length zero. The status values are fully described in 7.1.6.1.3.
|
||||||
|
*
|
||||||
|
* @param pointer to confirmation primitive
|
||||||
|
*/
|
||||||
|
typedef void (* mlme_get_conf_cb_t)(mlme_get_conf_t *);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Customer's function of confirmation
|
||||||
|
*
|
||||||
|
* @details The MLME-SET.confirm primitive is generated by the MLME and issued to its
|
||||||
|
* next higher layer in response to an MLME-SET.request primitive. The MLME-SET.confirm
|
||||||
|
* primitive returns a status of either SUCCESS, indicating that the requested value was
|
||||||
|
* written to the indicated PIB attribute, or the appropriate error code.
|
||||||
|
* The status values are fully described in 7.1.13.1.3.
|
||||||
|
*
|
||||||
|
* @param pointer to confirmation primitive
|
||||||
|
*/
|
||||||
|
typedef void (* mlme_set_conf_cb_t)(mlme_set_conf_t *);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-GET request
|
||||||
|
*
|
||||||
|
* @details Request information about a given PIB attribute.
|
||||||
|
*
|
||||||
|
* @param[in] req pointer to request structure.
|
||||||
|
* @param[in] conf_cb pointer to user callback.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.6.
|
||||||
|
* See \a mlme_get() for more details.
|
||||||
|
*/
|
||||||
|
void mlme_get_req(mlme_get_req_t * req, mlme_get_conf_cb_t conf_cb);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-SET request
|
||||||
|
*
|
||||||
|
* @details Request to set a PIB attribute.
|
||||||
|
* After request completion, user callback will be issued with
|
||||||
|
* valid data stored in structure @ref mlme_set_conf_t.
|
||||||
|
*
|
||||||
|
* See \a mlme_set() for more details.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.13
|
||||||
|
*
|
||||||
|
* @param[in] req MLME_SET request structure.
|
||||||
|
* @param[in] conf_cb pointer to user callback.
|
||||||
|
*/
|
||||||
|
void mlme_set_req(mlme_set_req_t * req, mlme_set_conf_cb_t conf_cb);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Counts MLME attribute size
|
||||||
|
*
|
||||||
|
* @details This is an implementation-specific function not covered by the standard.
|
||||||
|
*
|
||||||
|
* @param[in] id attribute id.
|
||||||
|
* @param[in] idx index inside the table in case the attribute is a table.
|
||||||
|
*
|
||||||
|
* @return size of attribute in bytes.
|
||||||
|
*/
|
||||||
|
size_t mlme_pib_attr_size_calc(pib_id_t id, uint8_t idx);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gets parameters from PIB directly (without request - confirm approach)
|
||||||
|
*
|
||||||
|
* @details Optional. Not covered by a standard.
|
||||||
|
*
|
||||||
|
* For non-tabled attributes this function will return value to location
|
||||||
|
* passed to the last argument.
|
||||||
|
*
|
||||||
|
* For tabled attributes this function will return pointer to
|
||||||
|
* a descriptor structure of corresponding table.
|
||||||
|
*
|
||||||
|
* @param[in] id attribute id.
|
||||||
|
* @param[in] idx index inside the table in case the attribute is a table.
|
||||||
|
* @param[out] mem either pointer to memory where attribute value is returned
|
||||||
|
* (for all attributes except MAC_KEY_TABLE, MAC_DEVICE_TABLE,
|
||||||
|
* MAC_SECURITY_LEVEL_TABLE), or pointer to memory where pointer
|
||||||
|
* to attribute storage place is returned.
|
||||||
|
*
|
||||||
|
* @return status of operation
|
||||||
|
*/
|
||||||
|
mac_status_t mlme_get(pib_id_t id, uint8_t idx, void * mem);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets parameters to PIB directly (without request - confirm approach)
|
||||||
|
*
|
||||||
|
* @details Optional. Not covered by a standard.
|
||||||
|
*
|
||||||
|
* This function performs copying or replacement of some attribute value
|
||||||
|
* into the PIB base memory.
|
||||||
|
*
|
||||||
|
* Note, that all security tables are copied into dynamic memory, that
|
||||||
|
* mlme_set is responsible to allocate. For nested tables copying is done
|
||||||
|
* in a shallow manner (in Python sense). It means that passed \a mac_key_descr_t
|
||||||
|
* is copied as-is, without creating copies of internal tables.
|
||||||
|
* Caller must allocate and prepare all nested tables such as
|
||||||
|
* #MAC_KEY_DEVICE_LIST, #MAC_KEY_ID_LOOKUP_LIST and #MAC_KEY_USAGE_LIST
|
||||||
|
* before calling this function.
|
||||||
|
*
|
||||||
|
* Passed attribute value will replace the current one, if the item with such
|
||||||
|
* \a id and \a idx already exists. This function is responsible for
|
||||||
|
* freeing all items during destruction of existing objects.
|
||||||
|
*
|
||||||
|
* @note Nested tables may be expanded and reduced with \a mac_table_item_set()
|
||||||
|
* and other similar functions.
|
||||||
|
*
|
||||||
|
* @param[in] id attribute id.
|
||||||
|
* @param[in] idx index inside the table in case the attribute is a table.
|
||||||
|
* @param[out] mem pointer to memory for parameter storing.
|
||||||
|
*
|
||||||
|
* @return status of operation
|
||||||
|
*/
|
||||||
|
mac_status_t mlme_set(pib_id_t id, uint8_t idx, void * mem);
|
||||||
|
|
||||||
|
|
||||||
|
#if (CONFIG_SECURE == 1)
|
||||||
|
/**
|
||||||
|
* @brief Initializes a table. This function MUST be called before accessing
|
||||||
|
* to a newly allocated table.
|
||||||
|
*
|
||||||
|
* @param[out] p_table Pointer to a fresh table.
|
||||||
|
*/
|
||||||
|
void mac_table_init(mac_table_t * p_table);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Resets a table, freeing all its elements.
|
||||||
|
*
|
||||||
|
* @param[in] p_table Pointer to the table to reset.
|
||||||
|
* @param[in] id One of #MAC_KEY_TABLE, #MAC_DEVICE_TABLE, #MAC_SECURITY_LEVEL_TABLE,
|
||||||
|
* #MAC_KEY_ID_LOOKUP_LIST, #MAC_KEY_DEVICE_LIST, #MAC_KEY_USAGE_LIST to let
|
||||||
|
* function know about the size of p_item.
|
||||||
|
*/
|
||||||
|
void mac_table_reset(mac_table_t * p_table, mlme_pib_attr_id_t id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Searches through mac_table_t and finds the item with requested idx.
|
||||||
|
*
|
||||||
|
* @param[in] p_table Table to search through.
|
||||||
|
* @param[in] idx Item idx to match.
|
||||||
|
*
|
||||||
|
* @return Pointer to mac_table_item_t with requested idx or NULL if such
|
||||||
|
* an item cannot be found.
|
||||||
|
*/
|
||||||
|
mac_table_item_t * mac_table_idx_get(const mac_table_t * p_table, uint8_t idx);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets new value item for mac_table_t.
|
||||||
|
*
|
||||||
|
* @param[out] p_table Pointer to the table to add item to.
|
||||||
|
* @param[in] p_item Pointer to a new item. This item must include appropriate idx
|
||||||
|
* (less than the maximum table size).
|
||||||
|
* @param[in] id One of #MAC_KEY_TABLE, #MAC_DEVICE_TABLE, #MAC_SECURITY_LEVEL_TABLE,
|
||||||
|
* #MAC_KEY_ID_LOOKUP_LIST, #MAC_KEY_DEVICE_LIST, #MAC_KEY_USAGE_LIST to let
|
||||||
|
* function know about the size of p_item.
|
||||||
|
* @param[in] idx Item index inside the selected table.
|
||||||
|
*
|
||||||
|
* @details This function performs a "deep copy" of passed table item to conform with
|
||||||
|
* mlme_set behavior. New copy resides in the heap memory. If an item with requested
|
||||||
|
* idx has been already set earlier, this function frees the old item and pushes
|
||||||
|
* a new one instead.
|
||||||
|
*
|
||||||
|
* @retval #MAC_INVALID_INDEX if idx exceeds allowed maximum number of items in
|
||||||
|
* the table.
|
||||||
|
* @retval #MAC_LIMIT_REACHED if there is no enough dynamic memory to put this item
|
||||||
|
* into the security table.
|
||||||
|
* @retval #MAC_SUCCESS if insertion has been performed successfully.
|
||||||
|
*/
|
||||||
|
mac_status_t mac_table_item_set(mac_table_t * p_table,
|
||||||
|
const mac_table_item_t * p_item,
|
||||||
|
mlme_pib_attr_id_t id,
|
||||||
|
uint8_t idx);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Removes an item from a mac_table_t instance and frees all resources,
|
||||||
|
* associated with this item.
|
||||||
|
*
|
||||||
|
* @param[out] p_table Pointer to the table to remove item from.
|
||||||
|
* @param[in] id One of #MAC_KEY_TABLE, #MAC_DEVICE_TABLE, #MAC_SECURITY_LEVEL_TABLE,
|
||||||
|
* #MAC_KEY_ID_LOOKUP_LIST, #MAC_KEY_DEVICE_LIST, #MAC_KEY_USAGE_LIST to let
|
||||||
|
* function perform down-casting correctly.
|
||||||
|
* @param[in] idx Item index inside of selected table.
|
||||||
|
*
|
||||||
|
* @retval #MAC_INVALID_INDEX if passed index is not found in the table or exceeds
|
||||||
|
* the allowed maximum.
|
||||||
|
* @retval #MAC_SUCCESS if no errors happen during removing.
|
||||||
|
*/
|
||||||
|
mac_status_t mac_table_item_remove(mac_table_t * p_table,
|
||||||
|
mlme_pib_attr_id_t id,
|
||||||
|
uint8_t idx);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gets first available item from a table.
|
||||||
|
*
|
||||||
|
* @details This function might be used along with \a mac_table_item_next to
|
||||||
|
* search through some table.
|
||||||
|
*
|
||||||
|
* @param[in] p_table Pointer to a MAC table.
|
||||||
|
*
|
||||||
|
* @return Pointer to the first table item or NULL if the table is empty.
|
||||||
|
*/
|
||||||
|
mac_table_item_t * mac_table_item_front(const mac_table_t * p_table);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the next available item in table.
|
||||||
|
*
|
||||||
|
* @details MAC tables are stored unsorted in memory, so there is no guarantee that
|
||||||
|
* index of the next item is always greater or smaller than the current one.
|
||||||
|
* Items are not stored in chronological order either.
|
||||||
|
*
|
||||||
|
* @param[in] p_table Pointer to a table to select item from.
|
||||||
|
* @param[in] p_current_item Pointer to the current item.
|
||||||
|
*
|
||||||
|
* @return Pointer to the next item in table or NULL, if the item is the last one.
|
||||||
|
*/
|
||||||
|
mac_table_item_t * mac_table_item_next(const mac_table_t * p_table,
|
||||||
|
const mac_table_item_t * p_current_item);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gets number of items used inside mac_table_t.
|
||||||
|
*
|
||||||
|
* @param[in] p_table Pointer to interested table.
|
||||||
|
*
|
||||||
|
* @return 8-bit integer equal to number of items inside the table that have
|
||||||
|
* been set at least once.
|
||||||
|
*/
|
||||||
|
static inline uint8_t mac_table_size_get(const mac_table_t * p_table)
|
||||||
|
{
|
||||||
|
ASSERT(p_table != NULL);
|
||||||
|
|
||||||
|
return p_table->size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function checks if a MAC table is empty.
|
||||||
|
*
|
||||||
|
* @param[in] p_table Pointer to a MAC table.
|
||||||
|
*
|
||||||
|
* @return true if there are no items inside table, false otherwise.
|
||||||
|
*/
|
||||||
|
static inline bool mac_table_is_empty(const mac_table_t * p_table)
|
||||||
|
{
|
||||||
|
ASSERT(p_table != NULL);
|
||||||
|
|
||||||
|
return sys_queue_is_empty(&p_table->queue);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // MAC_MLME_PIB_H_INCLUDED
|
||||||
151
components/802_15_4/api/MAC/mac_mlme_poll.h
Normal file
151
components/802_15_4/api/MAC/mac_mlme_poll.h
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef MAC_MLME_POLL_H_INCLUDED
|
||||||
|
#define MAC_MLME_POLL_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "mac_common.h"
|
||||||
|
#include "mac_task_scheduler.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* The MAC MLME Poll module declares the MAC Poll primitives and necessary types
|
||||||
|
* according to the MAC specification.
|
||||||
|
*
|
||||||
|
* @defgroup mac_poll MAC MLME Poll API
|
||||||
|
* @ingroup mac_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare MAC MLME Poll API.
|
||||||
|
* @details The MAC Poll module declares MLME Poll primitives and necessary types according to
|
||||||
|
* the MAC specification. More specifically, MLME Poll request aka mlme_poll_req(), MLME Poll
|
||||||
|
* indicaton aka mlme_poll_ind(), and MLME Poll confirm callback typedef aka mlme_poll_conf_cb_t
|
||||||
|
* primitives are declared.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief MLME-POLL.confirm
|
||||||
|
*
|
||||||
|
* @details The MLME-POLL.confirm primitive reports the results of a request
|
||||||
|
* to poll the coordinator for data.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.16.2
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
mac_status_t status; /**< Status of operation. */
|
||||||
|
} mlme_poll_conf_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief MLME-POLL.request
|
||||||
|
*
|
||||||
|
* @details The MLME-POLL.request primitive prompts the device
|
||||||
|
* to request data from the coordinator.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.16.1
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** Do not edit this field. */
|
||||||
|
mac_abstract_req_t service;
|
||||||
|
|
||||||
|
/** Confirm to this request. */
|
||||||
|
mlme_poll_conf_t confirm;
|
||||||
|
|
||||||
|
mac_addr_mode_t coord_addr_mode; /**< Coordinator address mode. */
|
||||||
|
uint16_t coord_pan_id; /**< Coordinator PAN ID. */
|
||||||
|
mac_addr_t coord_address; /**< Coordinator address. */
|
||||||
|
#if (CONFIG_SECURE == 1)
|
||||||
|
uint8_t security_level; /**< Security level. */
|
||||||
|
uint8_t key_id_mode; /**< Key ID mode. */
|
||||||
|
uint64_t key_source; /**< Key source. */
|
||||||
|
uint8_t key_index; /**< Key index. */
|
||||||
|
#endif
|
||||||
|
} mlme_poll_req_t;
|
||||||
|
|
||||||
|
/** @brief MLME-Poll.indication
|
||||||
|
*
|
||||||
|
* @details The MLME-POLL.indication primitive indicates the reception
|
||||||
|
* of a Data request command frame by the MAC sub-layer and issued to
|
||||||
|
* the local SSCS (service specific convergence sublayer).
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
mac_addr_mode_t src_addr_mode; /**< Source address mode. */
|
||||||
|
mac_addr_t src_address; /**< Source address. */
|
||||||
|
} mlme_poll_ind_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Prototype of the user-implemented MLME-POLL.confirm callback function.
|
||||||
|
*
|
||||||
|
* @details The MLME-POLL.confirm primitive is generated by the MLME and issued
|
||||||
|
* to its next higher layer in response to an MLME-POLL.request primitive.
|
||||||
|
* If the request was successful, the status parameter will be equal to SUCCESS,
|
||||||
|
* indicating a successful poll for data. Otherwise, the status parameter indicates the
|
||||||
|
* appropriate error code. The status values are fully described in 7.1.16.1.3 and
|
||||||
|
* the subclauses referenced by 7.1.16.1.3.
|
||||||
|
*
|
||||||
|
* @param pointer to a confirmation primitive.
|
||||||
|
*/
|
||||||
|
typedef void (* mlme_poll_conf_cb_t)(mlme_poll_conf_t *);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief MLME-POLL.request
|
||||||
|
*
|
||||||
|
* @details The MLME-POLL.request primitive is generated by the next higher layer and
|
||||||
|
* issued to its MLME when data are to be requested from a coordinator.
|
||||||
|
*
|
||||||
|
* @param[in] req MLME-POLL.request parameters
|
||||||
|
* @param[in] conf_cb User-implemented callback function, which will be
|
||||||
|
* called by MLME in order to pass MLME-POLL.confirm to the user.
|
||||||
|
*/
|
||||||
|
void mlme_poll_req(mlme_poll_req_t * req, mlme_poll_conf_cb_t conf_cb);
|
||||||
|
|
||||||
|
/**@brief MLME-POLL.indication
|
||||||
|
*
|
||||||
|
* @details The MLME-Poll.indication primitive notifies the next higher level that
|
||||||
|
* a request for data has been received.
|
||||||
|
*
|
||||||
|
* @param[in] p_ind pointer to a poll indication structure
|
||||||
|
*/
|
||||||
|
extern void mlme_poll_ind(mlme_poll_ind_t * p_ind);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // MAC_MLME_POLL_H_INCLUDED
|
||||||
125
components/802_15_4/api/MAC/mac_mlme_reset.h
Normal file
125
components/802_15_4/api/MAC/mac_mlme_reset.h
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef MAC_MLME_RESET_H_INCLUDED
|
||||||
|
#define MAC_MLME_RESET_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "mac_common.h"
|
||||||
|
#include "mac_task_scheduler.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* The MAC MLME Reset module declares the MAC Reset primitives and necessary types
|
||||||
|
* according to the MAC specification.
|
||||||
|
*
|
||||||
|
* @defgroup mac_reset MAC MLME Reset API
|
||||||
|
* @ingroup mac_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare MAC MLME Reset API.
|
||||||
|
* @details The MAC Reset module declares MLME Reset primitives and necessary types according to
|
||||||
|
* the MAC specification. More specifically, MLME Reset request aka mlme_reset_req(), and MLME
|
||||||
|
* Reset confirm callback typedef aka mlme_reset_conf_cb_t primitives are declared.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief MLME-Reset.confirm
|
||||||
|
*
|
||||||
|
* @details The MLME-Reset.confirm primitive reports the results of a request
|
||||||
|
* to reset MAC layer of the device.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.9.2
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
mac_status_t status; /**< Status of operation. */
|
||||||
|
} mlme_reset_conf_t;
|
||||||
|
|
||||||
|
/**@brief MLME-RESET.request
|
||||||
|
*
|
||||||
|
* @details The MLME-RESET.request primitive allows the next
|
||||||
|
* higher layer to request that the MLME performs a reset operation.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.9.1
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** Do not edit this field. */
|
||||||
|
mac_abstract_req_t service;
|
||||||
|
|
||||||
|
/** Confirm to this request. */
|
||||||
|
mlme_reset_conf_t confirm;
|
||||||
|
|
||||||
|
bool set_default_pib; /**< Set the default PIB. */
|
||||||
|
} mlme_reset_req_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-RESET confirm callback
|
||||||
|
*
|
||||||
|
* @details The MLME-RESET.confirm primitive is generated by the MLME and
|
||||||
|
* issued to its next higher layer in response to an MLME-RESET.request primitive and
|
||||||
|
* following the receipt of the PLME-SET-TRXSTATE.confirm primitive.
|
||||||
|
*
|
||||||
|
* @param reset status (@c MAC_SUCCESS only).
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.9.2
|
||||||
|
*/
|
||||||
|
typedef void (* mlme_reset_conf_cb_t)(mlme_reset_conf_t *);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-RESET request
|
||||||
|
*
|
||||||
|
* @details The MLME-RESET.request primitive is generated by the next higher layer and
|
||||||
|
* issued to the MLME to request a reset of the MAC sublayer to its initial conditions.
|
||||||
|
* The MLME-RESET.request primitive is issued prior to the use of the MLME-START.request
|
||||||
|
* or the MLME-ASSOCIATE.request primitives.
|
||||||
|
*
|
||||||
|
* @param[in] req pointer to MCPS-RESET.request structure.
|
||||||
|
* @param[in] conf_cb pointer to user callback.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.9.1
|
||||||
|
*/
|
||||||
|
void mlme_reset_req(mlme_reset_req_t * req, mlme_reset_conf_cb_t conf_cb);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // MAC_MLME_RESET_H_INCLUDED
|
||||||
181
components/802_15_4/api/MAC/mac_mlme_rx_enable.h
Normal file
181
components/802_15_4/api/MAC/mac_mlme_rx_enable.h
Normal file
@ -0,0 +1,181 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef MAC_MLME_RX_ENABLE_H_INCLUDED
|
||||||
|
#define MAC_MLME_RX_ENABLE_H_INCLUDED
|
||||||
|
|
||||||
|
#if (CONFIG_RXE_ENABLED == 1)
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "mac_common.h"
|
||||||
|
#include "mac_task_scheduler.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* The MAC MLME RX-Enable module declares the MAC RX-Enable primitives and necessary types
|
||||||
|
* according to the MAC specification.
|
||||||
|
*
|
||||||
|
* @defgroup mac_rx_enable MAC MLME RX-Enable API
|
||||||
|
* @ingroup mac_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare MAC MLME RX-Enable API.
|
||||||
|
* @details The MAC RX-Enable module declares MLME RX-Enable primitives and necessary types according to
|
||||||
|
* the MAC specification. More specifically, MLME RX-Enable request aka mlme_rx_enable_req(),
|
||||||
|
* and MLME RX-Enable confirm callback typedef aka mlme_rx_enable_conf_cb_t primitives are
|
||||||
|
* declared. One additional primitive not covered by the standard is declared. This is
|
||||||
|
* mlme_rx_enable() which is synchronous (i.e. does not require confirmation) version of
|
||||||
|
* mlme_rx_enable_req().
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-RX-ENABLE.confirm
|
||||||
|
*
|
||||||
|
* @details The MLME-RX-ENABLE.confirm primitive reports the results of an attempt
|
||||||
|
* to enable or disable the receiver.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.10.2
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
mac_status_t status; /**< Status of operation. */
|
||||||
|
} mlme_rx_enable_conf_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-RX-ENABLE.request
|
||||||
|
*
|
||||||
|
* @details The MLME-RX-ENABLE.request primitive allows the next higher layer
|
||||||
|
* to request that the receiver is either enabled for a finite period of time or disabled.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.10.1
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** Do not edit this field. */
|
||||||
|
mac_abstract_req_t service;
|
||||||
|
|
||||||
|
/** Confirm to this request. */
|
||||||
|
mlme_rx_enable_conf_t confirm;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @details
|
||||||
|
* TRUE if the requested operation can be deferred until the next superframe
|
||||||
|
* if the requested time has already passed.
|
||||||
|
* FALSE if the requested operation is only to be attempted in the current superframe.
|
||||||
|
*
|
||||||
|
* If the issuing device is the PAN coordinator, the term superframe refers to its own
|
||||||
|
* superframe. Otherwise, the term refers to the superframe of the coordinator through
|
||||||
|
* which the issuing device is associated.
|
||||||
|
*
|
||||||
|
* @note This parameter is ignored for nonbeacon-enabled PANs.
|
||||||
|
*/
|
||||||
|
bool defer_permit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @details
|
||||||
|
* The number of symbols measured from the start of the superframe before the receiver is
|
||||||
|
* to be enabled or disabled.
|
||||||
|
* This is a 24-bit value, and the precision of this value shall be a minimum of 20 bits,
|
||||||
|
* with the lowest 4 bits being the least significant.
|
||||||
|
*
|
||||||
|
* If the issuing device is the PAN coordinator, the term superframe refers to its own
|
||||||
|
* superframe. Otherwise, the term refers to the superframe of the coordinator through
|
||||||
|
* which the issuing device is associated.
|
||||||
|
*
|
||||||
|
* @note This parameter is ignored for nonbeacon-enabled PANs.
|
||||||
|
*/
|
||||||
|
uint32_t rx_on_time;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of symbols the receiver is to be enabled for.
|
||||||
|
*
|
||||||
|
* If this parameter is equal to 0x000000, the receiver is to be disabled.
|
||||||
|
*/
|
||||||
|
uint32_t rx_on_duration;
|
||||||
|
} mlme_rx_enable_req_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Customer's function of confirmation.
|
||||||
|
*
|
||||||
|
* @details The MLME-RX-ENABLE.confirm primitive is generated by the MLME and issued to
|
||||||
|
* its next higher layer in response to an MLME-RX-ENABLE.request primitive.
|
||||||
|
*
|
||||||
|
* @param pointer to a confirmation primitive.
|
||||||
|
*/
|
||||||
|
typedef void (* mlme_rx_enable_conf_cb_t)(mlme_rx_enable_conf_t *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-RX-ENABLE.request service
|
||||||
|
*
|
||||||
|
* @details The MLME-RX-ENABLE.request primitive is generated by the next higher layer and
|
||||||
|
* issued to the MLME to enable the receiver for a fixed duration, at a time relative to the
|
||||||
|
* start of the current or next superframe on a beacon-enabled PAN or immediately on a
|
||||||
|
* nonbeacon-enabled PAN. This primitive may also be generated to cancel a previously generated
|
||||||
|
* request to enable the receiver. After request completion, user callback will be issued with
|
||||||
|
* valid data stored in structure mlme_rx_enable_conf_t.
|
||||||
|
*
|
||||||
|
* @note The receiver is enabled or disabled exactly once per primitive request.
|
||||||
|
*
|
||||||
|
* @param[in] req pointer to MLME-RX-ENABLE request structure.
|
||||||
|
* @param[in] conf_cb - pointer to confirm function (user callback).
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.10.1
|
||||||
|
*/
|
||||||
|
void mlme_rx_enable_req(mlme_rx_enable_req_t * req, mlme_rx_enable_conf_cb_t conf_cb);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables permission for receiving.
|
||||||
|
*
|
||||||
|
* @details Optional. Not covered by a standard.
|
||||||
|
*
|
||||||
|
* @param[in] req pointer to MLME-RX-ENABLE request structure.
|
||||||
|
*
|
||||||
|
* @return status of operation.
|
||||||
|
*/
|
||||||
|
mac_status_t mlme_rx_enable(mlme_rx_enable_req_t * req);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // (CONFIG_RXE_ENABLED == 1)
|
||||||
|
|
||||||
|
#endif // MAC_MLME_RX_ENABLE_H_INCLUDED
|
||||||
160
components/802_15_4/api/MAC/mac_mlme_scan.h
Normal file
160
components/802_15_4/api/MAC/mac_mlme_scan.h
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef MAC_MLME_SCAN_H_INCLUDED
|
||||||
|
#define MAC_MLME_SCAN_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "mac_common.h"
|
||||||
|
#include "mac_mlme_beacon_notify.h"
|
||||||
|
#include "mac_task_scheduler.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* The MAC MLME Scan module declares the MAC Scan primitives and necessary types
|
||||||
|
* according to the MAC specification.
|
||||||
|
*
|
||||||
|
* @defgroup mac_scan MAC MLME Scan API
|
||||||
|
* @ingroup mac_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare MAC MLME Scan API.
|
||||||
|
* @details The MAC Scan module declares MLME Scan primitives and necessary types according to
|
||||||
|
* the MAC specification. More specifically, MLME Scan request aka mlme_scan_req(), and MLME
|
||||||
|
* Scan confirm callback typedef aka mlme_scan_conf_cb_t primitives are declared.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief Type of scan. */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
ED_SCAN = 0, /**< Energy detection scan. */
|
||||||
|
ACTIVE_SCAN, /**< Active scan. */
|
||||||
|
PASSIVE_SCAN, /**< Passive scan. */
|
||||||
|
ORPHAN_SCAN /**< Orphan scan. */
|
||||||
|
} mac_scan_type_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-SCAN.confirm
|
||||||
|
*
|
||||||
|
* @details The MLME-SCAN.confirm reports the result of the channel scan request.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.11.2
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
mac_status_t status; /**< Status of operation. */
|
||||||
|
mac_scan_type_t scan_type; /**< Scan type. */
|
||||||
|
#ifdef CONFIG_SUB_GHZ
|
||||||
|
uint8_t channel_page; /**< Channel page. */
|
||||||
|
#endif
|
||||||
|
uint32_t unscanned_channels; /**< Unscanned channels. */
|
||||||
|
uint8_t result_list_size; /**< Result list size. */
|
||||||
|
uint8_t * energy_detect_list; /**< Energy detection list. */
|
||||||
|
mac_pan_descriptor_t * pan_descriptor_list; /**< PAN descriptor list. */
|
||||||
|
} mlme_scan_conf_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-SCAN.request
|
||||||
|
*
|
||||||
|
* @details The MLME-SCAN.request primitive is used to initiate a channel
|
||||||
|
* scan over a given list of channels.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.11.1
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** Do not edit this field. */
|
||||||
|
mac_abstract_req_t service;
|
||||||
|
|
||||||
|
/** Confirm to this request. */
|
||||||
|
mlme_scan_conf_t confirm;
|
||||||
|
|
||||||
|
mac_scan_type_t scan_type; /**< Scan type. */
|
||||||
|
uint32_t scan_channels; /**< Scan channels. */
|
||||||
|
uint8_t scan_duration; /**< Scan duration. */
|
||||||
|
|
||||||
|
uint8_t pan_descriptors_buf_size; /**< PAN descriptor buffer size. */
|
||||||
|
mac_pan_descriptor_t * pan_descriptors_buf; /**< PAN descriptor buffer. */
|
||||||
|
|
||||||
|
uint8_t energy_detect_buf_size; /**< Energy detection buffer size. */
|
||||||
|
uint8_t * energy_detect_buf; /**< Energy detection buffer. */
|
||||||
|
|
||||||
|
#ifdef CONFIG_SUB_GHZ
|
||||||
|
uint8_t channel_page; /**< Channel page. */
|
||||||
|
#endif
|
||||||
|
#if (CONFIG_SECURE == 1)
|
||||||
|
uint8_t security_level; /**< Security level. */
|
||||||
|
uint8_t key_id_mode; /**< Key ID mode. */
|
||||||
|
uint64_t key_source; /**< Key source. */
|
||||||
|
uint8_t key_index; /**< Key index. */
|
||||||
|
#endif
|
||||||
|
} mlme_scan_req_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief User callback to scan request.
|
||||||
|
*
|
||||||
|
* @details The MLME-SCAN.confirm primitive is generated by the MLME and issued to
|
||||||
|
* its next higher layer when the channel scan initiated with
|
||||||
|
* the MLME-SCAN.request primitive has completed.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.11.2
|
||||||
|
*/
|
||||||
|
typedef void (* mlme_scan_conf_cb_t)(mlme_scan_conf_t *);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-SCAN request
|
||||||
|
*
|
||||||
|
* @details The MLME-SCAN.request primitive is generated by the next higher layer and
|
||||||
|
* issued to its MLME to initiate a channel scan to search for activity within the POS
|
||||||
|
* of the device. This primitive can be used to perform an ED scan to determine channel
|
||||||
|
* usage, an active or passive scan to locate beacon frames containing any PAN identifier,
|
||||||
|
* or an orphan scan to locate a PAN to which the device is currently associated.
|
||||||
|
*
|
||||||
|
* @param[in] req MLME-SCAN request structure.
|
||||||
|
* @param[in] conf_cb pointer to user callback.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.11.1
|
||||||
|
*/
|
||||||
|
void mlme_scan_req(mlme_scan_req_t * req, mlme_scan_conf_cb_t conf_cb);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // MAC_MLME_SCAN_H_INCLUDED
|
||||||
150
components/802_15_4/api/MAC/mac_mlme_start.h
Normal file
150
components/802_15_4/api/MAC/mac_mlme_start.h
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef MAC_MLME_START_H_INCLUDED
|
||||||
|
#define MAC_MLME_START_H_INCLUDED
|
||||||
|
|
||||||
|
#if (CONFIG_START_ENABLED == 1)
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "mac_common.h"
|
||||||
|
#include "sys_utils.h"
|
||||||
|
#include "mac_task_scheduler.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* The MAC MLME Start module declares the MAC Start primitives and necessary types
|
||||||
|
* according to the MAC specification.
|
||||||
|
*
|
||||||
|
* @defgroup mac_start MAC MLME Start API
|
||||||
|
* @ingroup mac_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare MAC MLME Start API.
|
||||||
|
* @details The MAC Start module declares MLME Start primitives and necessary types according to
|
||||||
|
* the MAC specification. More specifically, MLME Start request aka mlme_start_req(), and MLME
|
||||||
|
* Start confirm callback typedef aka mlme_start_conf_cb_t primitives are declared.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief MLME-Start.confirm
|
||||||
|
*
|
||||||
|
* @details The MLME-Start.confirm primitive reports the results of a request
|
||||||
|
* to start the device.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.14.1.2
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
mac_status_t status; /**< Status of operation. */
|
||||||
|
} mlme_start_conf_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-START.request
|
||||||
|
*
|
||||||
|
* @details The MLME-START.request primitive allows the PAN coordinator
|
||||||
|
* to initiate a new PAN or to start using a new superframe configuration.
|
||||||
|
* This primitive may also be used by a device already associated with an
|
||||||
|
* existing PAN to start using a new superframe configuration.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.14.1.1
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** Do not edit this field. */
|
||||||
|
mac_abstract_req_t service;
|
||||||
|
|
||||||
|
/** Confirm to this request. */
|
||||||
|
mlme_start_conf_t confirm;
|
||||||
|
|
||||||
|
uint16_t pan_id; /**< PAN ID. */
|
||||||
|
uint8_t logical_channel; /**< Logical channel. */
|
||||||
|
#ifdef CONFIG_SUB_GHZ
|
||||||
|
uint8_t channel_page; /**< Channel page. */
|
||||||
|
#endif
|
||||||
|
uint32_t start_time; /**< Start time. */
|
||||||
|
uint8_t beacon_order; /**< Beacon order. */
|
||||||
|
uint8_t superframe_order; /**< Superframe order. */
|
||||||
|
bool pan_coordinator; /**< Is PAN Coordinator? */
|
||||||
|
bool battery_life_extension; /**< Is battery life long? */
|
||||||
|
bool coord_realignment; /**< Is coordinator realignment? */
|
||||||
|
#if (CONFIG_SECURE == 1)
|
||||||
|
/* The security parameters for the coordinator realignment are declared below. */
|
||||||
|
uint8_t coord_realign_security_level; /**< Security level. */
|
||||||
|
uint8_t coord_realign_key_id_mode; /**< Key ID mode. */
|
||||||
|
uint64_t coord_realign_key_source; /**< Key source. */
|
||||||
|
uint8_t coord_realign_key_index; /**< Key index. */
|
||||||
|
|
||||||
|
/* The security parameters for the beacon are declared below. */
|
||||||
|
uint8_t beacon_security_level; /**< Security level. */
|
||||||
|
uint8_t beacon_key_id_mode; /**< Key ID mode. */
|
||||||
|
uint64_t beacon_key_source; /**< Key source. */
|
||||||
|
uint8_t beacon_key_index; /**< Key index. */
|
||||||
|
#endif
|
||||||
|
} mlme_start_req_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Callback to the next higher layer.
|
||||||
|
*
|
||||||
|
* @details After request completion, passed callback
|
||||||
|
* will be issued with status provided as a parameter.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.14.2.2
|
||||||
|
*/
|
||||||
|
typedef void (* mlme_start_conf_cb_t)(mlme_start_conf_t *);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-START request.
|
||||||
|
*
|
||||||
|
* @details Generated by the next higher layer and issued to its MLME to
|
||||||
|
* request that a device starts using a new superframe configuration.
|
||||||
|
*
|
||||||
|
* @param[in] req MLME-START request structure.
|
||||||
|
* @param[in] conf_cb pointer to user callback.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.14.1.2
|
||||||
|
*/
|
||||||
|
void mlme_start_req(mlme_start_req_t * req, mlme_start_conf_cb_t conf_cb);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // (CONFIG_START_ENABLED == 1)
|
||||||
|
|
||||||
|
#endif // MAC_MLME_START_H_INCLUDED
|
||||||
153
components/802_15_4/api/MAC/mac_mlme_sync.h
Normal file
153
components/802_15_4/api/MAC/mac_mlme_sync.h
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef MAC_MLME_SYNC_H_INCLUDED
|
||||||
|
#define MAC_MLME_SYNC_H_INCLUDED
|
||||||
|
|
||||||
|
#if (CONFIG_SYNC_ENABLED == 1)
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "mac_common.h"
|
||||||
|
#include "mac_task_scheduler.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* The MAC MLME Sync module declares the MAC Sync primitives and necessary types
|
||||||
|
* according to the MAC specification.
|
||||||
|
*
|
||||||
|
* @defgroup mac_sync MAC MLME Sync API
|
||||||
|
* @ingroup mac_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare MAC MLME Sync API.
|
||||||
|
* @details The MAC Sync module declares MLME Sync and sync loss primitives and necessary types according to
|
||||||
|
* the MAC specification. More specifically, MLME Sync request aka mlme_sync_req(), and MLME
|
||||||
|
* Sync Loss indication aka mlme_sync_loss_ind() primitives are declared.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief Sync Loss reason enumeration. */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
MAC_SYNC_BEACON_LOST, /**< Beacon lost. */
|
||||||
|
MAC_SYNC_REALIGNMENT, /**< Realignment. */
|
||||||
|
MAC_SYNC_PAN_ID_CONFLICT /**< PAN ID Conflict. */
|
||||||
|
} mlme_sync_loss_reason_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-SYNC-LOSS.indication
|
||||||
|
*
|
||||||
|
* @details On receipt of the MLME-SYNC-LOSS.indication primitive, the next
|
||||||
|
* higher layer is notified of a loss of synchronization.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.15.2
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
mlme_sync_loss_reason_t loss_reason; /**< Loss reason. */
|
||||||
|
uint16_t pan_id; /**< PAN ID. */
|
||||||
|
uint8_t logical_channel; /**< Logical channel. */
|
||||||
|
#ifdef CONFIG_SUB_GHZ
|
||||||
|
uint8_t channel_page; /**< Channel page. */
|
||||||
|
#endif
|
||||||
|
#if (CONFIG_SECURE == 1)
|
||||||
|
uint8_t security_level; /**< Security level. */
|
||||||
|
uint8_t key_id_mode; /**< Key ID mode. */
|
||||||
|
uint64_t key_source; /**< Key source. */
|
||||||
|
uint8_t key_index; /**< Key index. */
|
||||||
|
#endif
|
||||||
|
} mlme_sync_loss_ind_t;
|
||||||
|
|
||||||
|
|
||||||
|
#if (CONFIG_SYNC_REQ_ENABLED == 1)
|
||||||
|
/**
|
||||||
|
* @brief MLME-SYNC.request
|
||||||
|
*
|
||||||
|
* @details The MLME-SYNC.request primitive is generated by the next higher
|
||||||
|
* layer of a device on a beacon-enabled PAN and issued to its MLME to
|
||||||
|
* synchronize with the coordinator.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.15.1
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** Do not edit this field. */
|
||||||
|
mac_abstract_req_t service;
|
||||||
|
|
||||||
|
uint8_t logical_channel; /**< Logical channel. */
|
||||||
|
#ifdef CONFIG_SUB_GHZ
|
||||||
|
uint8_t channel_page; /**< Channel page. */
|
||||||
|
#endif
|
||||||
|
bool track_beacon; /**< Track beacon? */
|
||||||
|
} mlme_sync_req_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-SYNC-LOSS indication.
|
||||||
|
*
|
||||||
|
* @details Generated by the MLME of a device and issued to its next
|
||||||
|
* higher layer in the event of a loss of synchronization with the
|
||||||
|
* coordinator. It is also generated by the MLME of the PAN coordinator
|
||||||
|
* and issued to its next higher layer in the event of a PAN ID conflict.
|
||||||
|
*
|
||||||
|
* @param[in] ind MLME-SYNC-LOSS indication structure.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.7.4
|
||||||
|
*/
|
||||||
|
extern void mlme_sync_loss_ind(mlme_sync_loss_ind_t * ind);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MLME-SYNC request.
|
||||||
|
*
|
||||||
|
* @details Generated by the next higher layer of a device on a
|
||||||
|
* beacon-enabled PAN and issued to its MLME to synchronize with
|
||||||
|
* the coordinator.
|
||||||
|
*
|
||||||
|
* @param[in] req MLME_SYNC request structure.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.1.15.1
|
||||||
|
*/
|
||||||
|
void mlme_sync_req(mlme_sync_req_t * req);
|
||||||
|
|
||||||
|
#endif // (CONFIG_SYNC_REQ_ENABLED == 1)
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // (CONFIG_SYNC_ENABLED == 1)
|
||||||
|
|
||||||
|
#endif // MAC_MLME_SYNC_H_INCLUDED
|
||||||
82
components/802_15_4/api/MAC/mac_panid_conflict.h
Normal file
82
components/802_15_4/api/MAC/mac_panid_conflict.h
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef MAC_PANID_CONFLICT_H_INCLUDED
|
||||||
|
#define MAC_PANID_CONFLICT_H_INCLUDED
|
||||||
|
|
||||||
|
#if (CONFIG_PANID_CONFLICT_ENABLED == 1)
|
||||||
|
|
||||||
|
#include "mac_common.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* @defgroup mac_pan_id PAN ID Conflict API
|
||||||
|
* @ingroup mac_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module for handling PAN ID conflicts.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief A callback function used to notify Pan ID conflict detection algorithm about
|
||||||
|
* a new beacon frame.
|
||||||
|
*
|
||||||
|
* @param p_beacon - pointer to beacon descriptor struct.
|
||||||
|
*/
|
||||||
|
void mac_panid_conflict_beacon_notify_ind(const mac_beacon_ind_t * p_beacon);
|
||||||
|
|
||||||
|
#if (CONFIG_PANID_CONFLICT_RESOLUTION_ENABLED == 1)
|
||||||
|
/**@brief Callback function which handles end of Pan ID conflict cmd TX,
|
||||||
|
* called by FP
|
||||||
|
* @param[in] status Confirmation status to be raised
|
||||||
|
*/
|
||||||
|
void mac_panid_conflict_cb(mac_status_t status);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**@brief Indicates whether the pan id conflict was detected
|
||||||
|
*
|
||||||
|
* @return Result of pan id conflict detection
|
||||||
|
*/
|
||||||
|
bool mac_panid_conflict_detected(void);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* MAC_PANID_CONFLICT_H_INCLUDED */
|
||||||
318
components/802_15_4/api/MAC/mac_security.h
Normal file
318
components/802_15_4/api/MAC/mac_security.h
Normal file
@ -0,0 +1,318 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef MAC_SECURITY_H_INCLUDED
|
||||||
|
#define MAC_SECURITY_H_INCLUDED
|
||||||
|
|
||||||
|
#include "sys_queue.h"
|
||||||
|
#include "sec_aes_ccm.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* The MAC MLME Security module declares the MAC Security types
|
||||||
|
* according to the MAC specification.
|
||||||
|
*
|
||||||
|
* @defgroup mac_security MAC MLME Security API
|
||||||
|
* @ingroup mac_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare MAC MLME Security API.
|
||||||
|
* @details The MAC Security module declares types/macros needed to implement and use the MAC security
|
||||||
|
* engine according to the MAC specification. No routines or callbacks are declared here.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MAC sublayer security levels.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.6.2.2.1
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
MAC_SEC_OFF = 0, /**< Security is OFF. */
|
||||||
|
MAC_SEC_MIC32, /**< MIC32 security. */
|
||||||
|
MAC_SEC_MIC64, /**< MIC64 security. */
|
||||||
|
MAC_SEC_MIC128, /**< MIC128 security. */
|
||||||
|
MAC_SEC_ENC, /**< ENC security. */
|
||||||
|
MAC_SEC_ENC_MIC32, /**< ENC/MIC32 security. */
|
||||||
|
MAC_SEC_ENC_MIC64, /**< ENC/MIC64 security. */
|
||||||
|
MAC_SEC_ENC_MIC128 /**< ENC/MIC128 security. */
|
||||||
|
} mac_security_level_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MAC key identifier mode.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 7.6.2.2.2
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
MAC_KEY_ID_IMPL = 0, /**< Impl. */
|
||||||
|
MAC_KEY_ID_ONE_OCTET, /**< One octet. */
|
||||||
|
MAC_KEY_ID_FOUR_OCTET, /**< 4 octets. */
|
||||||
|
MAC_KEY_ID_EIGHT_OCTET /**< 8 octets. */
|
||||||
|
} mac_key_id_mode_t;
|
||||||
|
|
||||||
|
/**@brief Size (in bytes) of short security look up item. This size is
|
||||||
|
* set when lookup size equals to 0.
|
||||||
|
*/
|
||||||
|
#define MAC_LOOKUP_DATA_SIZE_SHORT 5
|
||||||
|
|
||||||
|
/**@brief Size (in bytes) of long security Key look up item. This size is
|
||||||
|
* set when lookup size equals to 1.
|
||||||
|
*/
|
||||||
|
#define MAC_KEY_LOOKUP_DATA_SIZE_LONG 9
|
||||||
|
|
||||||
|
/**@brief Size (in bytes) of long security Data look up item. This size is
|
||||||
|
* set when lookup size equals to 1.
|
||||||
|
*/
|
||||||
|
#define MAC_DATA_LOOKUP_DATA_SIZE_LONG 8
|
||||||
|
|
||||||
|
/**@brief Length of \a mac_key_source_t. Equals to extended address length. */
|
||||||
|
#define MAC_KEY_SOURCE_SIZE 8
|
||||||
|
|
||||||
|
/**@brief This bit-mask is used to get UniqueDevice field value of
|
||||||
|
* \a mac_key_device_descr_t.
|
||||||
|
*/
|
||||||
|
#define MAC_KEY_DEVICE_FLAG_UNIQUE 0x01
|
||||||
|
|
||||||
|
/**@brief This bit-mask is used to get BlackListed field value of
|
||||||
|
* \a mac_key_device_descr_t.
|
||||||
|
*/
|
||||||
|
#define MAC_KEY_DEVICE_FLAG_BLACKLISTED 0x02
|
||||||
|
|
||||||
|
/**@brief Length of key. */
|
||||||
|
#define MAC_SECURITY_KEY_SIZE 16
|
||||||
|
|
||||||
|
/**@brief Length of nonce for aes-ccm algorithm .*/
|
||||||
|
#define MAC_SECURITY_NONCE_SIZE 13
|
||||||
|
|
||||||
|
/**@brief Maximum MIC size .*/
|
||||||
|
#define MAX_MIC_SIZE 16
|
||||||
|
|
||||||
|
/**@brief This type is used to store security key .*/
|
||||||
|
typedef uint8_t mac_key_t[MAC_SECURITY_KEY_SIZE];
|
||||||
|
|
||||||
|
/**@brief This type is used to store security key lookup data .*/
|
||||||
|
typedef uint8_t mac_key_lookup_data_t[MAC_KEY_LOOKUP_DATA_SIZE_LONG];
|
||||||
|
|
||||||
|
/**@brief This type is used to store security data lookup data .*/
|
||||||
|
typedef uint8_t mac_data_lookup_data_t[MAC_DATA_LOOKUP_DATA_SIZE_LONG];
|
||||||
|
|
||||||
|
/**@brief This type is used to store security key source address .*/
|
||||||
|
typedef uint64_t mac_key_source_t;
|
||||||
|
|
||||||
|
/**@brief This type represents key LookupDataSize according to Table 94 .*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
KEY_LOOKUP_SIZE_FIVE = 0, /**< Size is 5. */
|
||||||
|
KEY_LOOKUP_SIZE_NINE = 1 /**< Size is 9. */
|
||||||
|
} mac_key_lookup_size_t;
|
||||||
|
|
||||||
|
/**@brief This type represents real size of key LookupData .*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
KEY_LOOKUP_SIZE_FIVE_VAL = 5, /**< Size is 5. */
|
||||||
|
KEY_LOOKUP_SIZE_NINE_VAL = 9 /**< Size is 9. */
|
||||||
|
} mac_key_lookup_size_val_t;
|
||||||
|
|
||||||
|
/**@brief This type represents data LookupDataSize .*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
DATA_LOOKUP_SIZE_FOUR_VAL = 4, /**< Size is 4. */
|
||||||
|
DATA_LOOKUP_SIZE_EIGHT_VAL = 8 /**< Size is 8. */
|
||||||
|
} mac_data_lookup_size_val_t;
|
||||||
|
|
||||||
|
/**@brief Abstract type to work with growing tables such as some of MAC
|
||||||
|
* security attributes.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
sys_queue_t queue; /**< Service field .*/
|
||||||
|
uint8_t size; /**< Number of currently allocated
|
||||||
|
items inside the table .*/
|
||||||
|
} mac_table_t;
|
||||||
|
|
||||||
|
/**@brief Due to processing algorithm this field MUST be the first inside a
|
||||||
|
* table or list.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
sys_queue_item_t item; /**< Service field .*/
|
||||||
|
uint8_t idx; /**< Index inside table .*/
|
||||||
|
} mac_table_item_t;
|
||||||
|
|
||||||
|
/**@brief KeyIdLookupDescriptor as described in Table 94 .*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
mac_table_item_t table_service; /**< Service field .*/
|
||||||
|
mac_key_lookup_data_t data; /**< Set of 5 or 9 bytes.
|
||||||
|
Data used to identify the key .*/
|
||||||
|
mac_key_lookup_size_t size; /**< A value of LOOKUP_SIZE_FIVE indicates a set
|
||||||
|
of 5 bytes; a value of LOOKUP_SIZE_NINE
|
||||||
|
indicates a set of 9 bytes .*/
|
||||||
|
} mac_key_id_lookup_descr_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief KeyIdLookupLis as described in Table 89 .*/
|
||||||
|
typedef mac_table_t mac_key_id_lookup_list_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief DeviceDescriptor as described in Table 93 .*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
mac_table_item_t table_service; /**< Service field .*/
|
||||||
|
uint16_t pan_id; /**< The 16-bit PAN identifier of the device in
|
||||||
|
this DeviceDescriptor .*/
|
||||||
|
uint16_t short_address; /**< The 16-bit short address of the device in
|
||||||
|
this DeviceDescriptor. A value of
|
||||||
|
#MAC_EXTENDED_ADDRESS_ONLY
|
||||||
|
indicates that this device is using only its
|
||||||
|
extended address. A value of
|
||||||
|
#MAC_BROADCAST_SHORT_ADDRESS
|
||||||
|
indicates that this value is unknown .*/
|
||||||
|
uint64_t extended_address; /**< The 64-bit IEEE extended address of the
|
||||||
|
device in this DeviceDescriptor. This
|
||||||
|
element is also used in unsecuring
|
||||||
|
operations on incoming frames .*/
|
||||||
|
uint32_t frame_counter; /**< The incoming frame counter of the device
|
||||||
|
in this DeviceDescriptor. This value is used
|
||||||
|
to ensure sequential freshness of frames .*/
|
||||||
|
bool exempt; /**< Indication of whether the device may
|
||||||
|
override the minimum security level
|
||||||
|
settings defined in \a mac_security_level_table_t .*/
|
||||||
|
} mac_device_descr_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief DeviceTable as described in Table 93 .*/
|
||||||
|
typedef mac_table_t mac_device_table_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief KeyDeviceDescriptor as described in Table 91 .*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
mac_table_item_t table_service; /**< Service field .*/
|
||||||
|
uint8_t device_handle; /**< Handle to the DeviceDescriptor
|
||||||
|
corresponding to the device (see
|
||||||
|
\a mac_device_descr_t).
|
||||||
|
The value is an index of the device descriptor
|
||||||
|
instance from device table .*/
|
||||||
|
uint8_t unique_device : 1; /**< Indication of whether the device indicated
|
||||||
|
by DeviceDescriptorHandle is uniquely
|
||||||
|
associated with the KeyDescriptor, i.e., it
|
||||||
|
is a link key as opposed to a group key .*/
|
||||||
|
uint8_t blacklisted : 1; /**< Indication of whether the device indicated
|
||||||
|
by DeviceDescriptorHandle previously
|
||||||
|
communicated with this key prior to the
|
||||||
|
exhaustion of the frame counter. If TRUE,
|
||||||
|
this indicates that the device shall not use
|
||||||
|
this key further because it exhausted its
|
||||||
|
use of the frame counter used with this
|
||||||
|
key .*/
|
||||||
|
} mac_key_device_descr_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief KeyDeviceList as described in Table 89 .*/
|
||||||
|
typedef mac_table_t mac_key_device_list_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief KeyUsageDescriptor as described in Table 90 .*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
mac_table_item_t table_service; /**< Service field .*/
|
||||||
|
|
||||||
|
uint8_t frame_type : 3; /**< See \a mac_frame_type_t .*/
|
||||||
|
uint8_t cmd_frame_id : 4; /**< See \a mac_command_id_t .*/
|
||||||
|
} mac_key_usage_descr_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief KeyUsageList as described in Table 89 .*/
|
||||||
|
typedef mac_table_t mac_key_usage_list_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief KeyDescriptor as described in Table 89 .*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
mac_table_item_t table_service; /**< Service field .*/
|
||||||
|
mac_key_id_lookup_list_t id_lookup_list; /**< A list of KeyIdLookupDescriptor entries
|
||||||
|
used to identify this KeyDescriptor .*/
|
||||||
|
mac_key_device_list_t key_device_list; /**< A list of KeyDeviceDescriptor entries
|
||||||
|
indicating which devices are currently
|
||||||
|
using this key, including their blacklist
|
||||||
|
status .*/
|
||||||
|
mac_key_usage_list_t key_usage_list; /**< A list of KeyUsageDescriptor entries
|
||||||
|
indicating which frame types this key may
|
||||||
|
be used with .*/
|
||||||
|
mac_key_t key; /**< The actual value of the key .*/
|
||||||
|
} mac_key_descr_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief KeyTable as described in Table 88 .*/
|
||||||
|
typedef mac_table_t mac_key_table_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief SecurityLevelDescriptor as described in Table 93 .*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
mac_table_item_t table_service; /**< Service field. */
|
||||||
|
|
||||||
|
uint16_t frame_type : 3; /**< See \a mac_frame_type_t .*/
|
||||||
|
uint16_t cmd_frame_id : 4; /**< See \a mac_command_id_t .*/
|
||||||
|
uint16_t security_min : 3; /**< The minimal required/expected security
|
||||||
|
level for incoming MAC frames with the
|
||||||
|
indicated frame type and, if present,
|
||||||
|
command frame type (see
|
||||||
|
\a mac_security_level_t) .*/
|
||||||
|
uint16_t override_min : 1; /**< Indication of whether originating devices
|
||||||
|
for which the Exempt flag is set may
|
||||||
|
override the minimum security level
|
||||||
|
indicated by the SecurityMinimum
|
||||||
|
element. If TRUE, this indicates that for
|
||||||
|
originating devices with Exempt status,
|
||||||
|
the incoming security level zero is
|
||||||
|
acceptable, in addition to the incoming
|
||||||
|
security levels meeting the minimum
|
||||||
|
expected security level indicated by the
|
||||||
|
SecurityMinimum element .*/
|
||||||
|
} mac_security_level_descr_t;
|
||||||
|
|
||||||
|
typedef mac_table_t mac_security_level_table_t;
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // MAC_SECURITY_H_INCLUDED
|
||||||
205
components/802_15_4/api/MAC/mac_task_scheduler.h
Normal file
205
components/802_15_4/api/MAC/mac_task_scheduler.h
Normal file
@ -0,0 +1,205 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef MAC_TASK_SCHEDULER_H_INCLUDED
|
||||||
|
#define MAC_TASK_SCHEDULER_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "sys_queue.h"
|
||||||
|
#include "sys_time.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
*
|
||||||
|
* @defgroup mac_task_scheduler MAC task scheduler
|
||||||
|
* @ingroup mac_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module for MAC task scheduling.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief Identifiers for external requests.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
#if (CONFIG_PURGE_ENABLED == 1)
|
||||||
|
MAC_PURGE_REQ_ID,
|
||||||
|
#endif
|
||||||
|
#if (CONFIG_ASSOCIATE_REQ_ENABLED == 1)
|
||||||
|
MAC_ASSOCIATE_REQ_ID,
|
||||||
|
#endif
|
||||||
|
#if (CONFIG_DISASSOCIATE_ENABLED == 1)
|
||||||
|
MAC_DISASSOCIATE_REQ_ID,
|
||||||
|
#endif
|
||||||
|
MAC_GET_REQ_ID,
|
||||||
|
#if (CONFIG_GTS_ENABLED == 1)
|
||||||
|
MAC_GTS_REQ_ID,
|
||||||
|
#endif
|
||||||
|
MAC_RESET_REQ_ID,
|
||||||
|
#if (CONFIG_RXE_ENABLED == 1)
|
||||||
|
MAC_RX_ENABLE_REQ_ID,
|
||||||
|
#endif
|
||||||
|
MAC_SCAN_REQ_ID,
|
||||||
|
MAC_SET_REQ_ID,
|
||||||
|
#if (CONFIG_SYNC_REQ_ENABLED == 1)
|
||||||
|
MAC_SYNC_REQ_ID,
|
||||||
|
#endif
|
||||||
|
MAC_POLL_REQ_ID,
|
||||||
|
#if (CONFIG_START_ENABLED == 1)
|
||||||
|
MAC_START_REQ_ID,
|
||||||
|
#endif
|
||||||
|
MAC_DATA_REQ_ID,
|
||||||
|
#if (CONFIG_ORPHAN_ENABLED == 1)
|
||||||
|
MAC_ORPHAN_RESP_ID,
|
||||||
|
#endif
|
||||||
|
MAC_REQS_AMOUNT
|
||||||
|
} mac_req_id_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Identifiers for internal handlers.
|
||||||
|
*
|
||||||
|
* These handlers are used for private MAC task scheduling.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
#if (CONFIG_FFD_DEVICE == 1) && (CONFIG_BEACON_ENABLED == 1)
|
||||||
|
MAC_SUPERFRAME_OUT_TASK_ID,
|
||||||
|
#endif
|
||||||
|
MAC_CSMA_CA_TASK_ID,
|
||||||
|
#if (CONFIG_START_ENABLED == 1)
|
||||||
|
MAC_START_TASK_ID,
|
||||||
|
#endif
|
||||||
|
MAC_FP_TX_TASK_ID,
|
||||||
|
MAC_DATA_DIR_CONF_ID,
|
||||||
|
#if (CONFIG_INDIRECT_ENGINE_ENABLED == 1)
|
||||||
|
MAC_INDIR_ENGINE_REQ_ID,
|
||||||
|
#endif
|
||||||
|
MAC_FP_RX_TASK_ID,
|
||||||
|
#if (CONFIG_ORPHAN_ENABLED == 1)
|
||||||
|
MAC_ORPHAN_IND_ID,
|
||||||
|
#endif
|
||||||
|
#if (CONFIG_DISASSOCIATE_ENABLED == 1)
|
||||||
|
MAC_DISASSOC_IND_ID,
|
||||||
|
#endif
|
||||||
|
#if (CONFIG_SYNC_ENABLED == 1)
|
||||||
|
MAC_SYNC_LOSS_IND_ID,
|
||||||
|
#endif
|
||||||
|
MAC_GET_CONF_ID,
|
||||||
|
MAC_SET_CONF_ID,
|
||||||
|
MAC_REQ_QUEUE_TASK_ID,
|
||||||
|
MAC_POLL_TASK_ID,
|
||||||
|
MAC_SCAN_CONF_ID,
|
||||||
|
MAC_MEM_ALLOCATOR_TASK_ID,
|
||||||
|
MAC_TASKS_AMOUNT
|
||||||
|
} mac_task_id_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief MAC request descriptor.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
sys_queue_item_t item;
|
||||||
|
mac_req_id_t id;
|
||||||
|
void * p_conf_cb; //pointer to confirmation primitive
|
||||||
|
} mac_abstract_req_t;
|
||||||
|
|
||||||
|
/**@brief scheduler memory.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
sys_queue_t outer_req_queue;
|
||||||
|
volatile uint32_t pending_tasks;
|
||||||
|
bool mac_scheduler_busy;
|
||||||
|
} mac_scheduler_mem_t;
|
||||||
|
|
||||||
|
/**@brief MAC task handler prototype.
|
||||||
|
*
|
||||||
|
* @details Handler which will be called by the MAC scheduler.
|
||||||
|
*/
|
||||||
|
typedef void (* mac_task_handler_t)(void);
|
||||||
|
|
||||||
|
/**@brief MAC external requests queue task handler prototype.
|
||||||
|
*
|
||||||
|
* @details Handler which will be called by the MAC scheduler inside
|
||||||
|
* corresponding task handler.
|
||||||
|
*/
|
||||||
|
typedef void (* mac_req_handler_t)(mac_abstract_req_t *);
|
||||||
|
|
||||||
|
/**@brief Initialize MAC scheduler.
|
||||||
|
*
|
||||||
|
* @details Clean up MAC request's queue.
|
||||||
|
*/
|
||||||
|
void mac_init(void);
|
||||||
|
|
||||||
|
/**@brief MAC task handler.
|
||||||
|
*
|
||||||
|
* @details Handler invokes a MAC primitives routine for a request according to
|
||||||
|
* the requests identification.
|
||||||
|
*/
|
||||||
|
void mac_task_handler(void);
|
||||||
|
|
||||||
|
/**@brief Scheduler request from some MAC primitive.
|
||||||
|
*
|
||||||
|
* @details Place request to MAC scheduler queue for a further handling.
|
||||||
|
*
|
||||||
|
* @param[in] p_req Pointer to a request structure.
|
||||||
|
*/
|
||||||
|
void mac_request_schedule(mac_abstract_req_t * p_req);
|
||||||
|
|
||||||
|
/**@brief Internal function of MAC API.
|
||||||
|
*
|
||||||
|
* This function is used to post tasks between MAC primitives.
|
||||||
|
*
|
||||||
|
* @param[in] id MAC task ID.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void mac_internal_task_post(mac_task_id_t id);
|
||||||
|
|
||||||
|
/**@brief Internal function of MAC API.
|
||||||
|
*
|
||||||
|
* Notifies mac scheduler that incoming request has been completely
|
||||||
|
* served and may be safely removed from MAC task queue.
|
||||||
|
*
|
||||||
|
* @param[in] p_req Pointer to a request structure.
|
||||||
|
*/
|
||||||
|
void mac_close_request(mac_abstract_req_t * p_req);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // MAC_TASK_SCHEDULER_H_INCLUDED
|
||||||
151
components/802_15_4/api/MAC/mac_time.h
Normal file
151
components/802_15_4/api/MAC/mac_time.h
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef MAC_TIME_H_INCLUDED
|
||||||
|
#define MAC_TIME_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "sys_time.h"
|
||||||
|
#include "hal_timer.h"
|
||||||
|
#include "hal_timer_critical.h"
|
||||||
|
#include "sys_debug.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* The MAC Time module declares some useful macros/types and routines that deal with the MAC
|
||||||
|
* timer.
|
||||||
|
*
|
||||||
|
* @defgroup mac_time MAC Time API
|
||||||
|
* @ingroup mac_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare MAC Time API.
|
||||||
|
* @details The MAC Time module declares some useful macros/types and routines that deal with the MAC
|
||||||
|
* timer. More specifically, some convertion routines such as mac_timestamp_from_systime(),
|
||||||
|
* mac_time_from_us(), and mac_time_to_us() are declared here.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief This mask shall always be used after any mathematical operation on
|
||||||
|
* mac_time_t to avoid overflow.
|
||||||
|
*/
|
||||||
|
#define MAC_TIME_MASK 0xFFFFFFULL
|
||||||
|
|
||||||
|
/**@brief Type of MAC time in symbols. */
|
||||||
|
typedef uint32_t mac_time_t;
|
||||||
|
|
||||||
|
/**@brief Type is used to save timestamps with microsecond precision. */
|
||||||
|
typedef uint32_t mac_timestamp_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Gets timestamp from system time.
|
||||||
|
*
|
||||||
|
* @param[in] time_us System time.
|
||||||
|
*
|
||||||
|
* @return Time in us but smaller type size.
|
||||||
|
*/
|
||||||
|
static inline mac_timestamp_t mac_timestamp_from_systime(sys_time_t time_us)
|
||||||
|
{
|
||||||
|
return (mac_timestamp_t)time_us;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@brief Converts microseconds to symbol time.
|
||||||
|
*
|
||||||
|
* @details Symbol time is measured in PHY Symbol Periods (16 us).
|
||||||
|
*
|
||||||
|
* @param[in] time_us Time in microseconds.
|
||||||
|
*
|
||||||
|
* @return Time in PHY Symbol Periods (16 us).
|
||||||
|
*/
|
||||||
|
static inline mac_time_t mac_time_from_us(sys_time_t time_us)
|
||||||
|
{
|
||||||
|
return (mac_time_t)((time_us >> 4ull) & MAC_TIME_MASK);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Converts symbol time to microseconds.
|
||||||
|
*
|
||||||
|
* @details Symbol time is measured in PHY Symbol Periods (16 us).
|
||||||
|
*
|
||||||
|
* @param[in] time_symbol Time in PHY Symbol Periods (16 us).
|
||||||
|
*
|
||||||
|
* @return Time in microseconds.
|
||||||
|
*/
|
||||||
|
static inline sys_time_t mac_time_to_us(mac_time_t time_symbol)
|
||||||
|
{
|
||||||
|
return time_symbol << 4u;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Starts the critical MAC timer.
|
||||||
|
*
|
||||||
|
* @details The callback function of the critical MAC timer will be called from
|
||||||
|
* the timer's interrupt routine. Only one critical MAC timer can run
|
||||||
|
* at the same time.
|
||||||
|
*
|
||||||
|
* @warning This is internal MAC functionality, needed for the realtime channel access.
|
||||||
|
* This function must not be used by other modules.
|
||||||
|
*
|
||||||
|
* @param[in] interval_us Interval in microseconds, after which the callback
|
||||||
|
* function will be called.
|
||||||
|
* @param[in] callback Callback function to be called after the specified inteval.
|
||||||
|
*/
|
||||||
|
static inline void mac_timer_critical_start(sys_time_t interval_us, void (* callback)(void))
|
||||||
|
{
|
||||||
|
// Make sure interval_us fits into 32 bits, since hardware critical timer is 32 bit.
|
||||||
|
ASSERT(interval_us < (1ULL << 32));
|
||||||
|
|
||||||
|
hal_timer_critical_start((uint32_t)interval_us, callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Stops the critical MAC timer.
|
||||||
|
*
|
||||||
|
* @details After critical MAC timer is stopped with this function, its callback will not be called.
|
||||||
|
*
|
||||||
|
* @warning This is internal MAC functionality, needed for the realtime channel access.
|
||||||
|
* This function must not be used by other modules.
|
||||||
|
*/
|
||||||
|
static inline void mac_timer_critical_stop(void)
|
||||||
|
{
|
||||||
|
hal_timer_critical_stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // MAC_TIME_H_INCLUDED
|
||||||
240
components/802_15_4/api/PHY/phy_common.h
Normal file
240
components/802_15_4/api/PHY/phy_common.h
Normal file
@ -0,0 +1,240 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef PHY_COMMON_H_INCLUDED
|
||||||
|
#define PHY_COMMON_H_INCLUDED
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* This file contains declarations of commonly used PHY routines and necessary macros/types.
|
||||||
|
*
|
||||||
|
* @defgroup phy_common PHY Common API
|
||||||
|
* @ingroup phy_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare Common PHY API
|
||||||
|
* @details The Common PHY module contains declarations of commonly used PHY routines and necessary macros/types.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief The maximum PSDU size (in octets) the PHY shall be able to receive (aMaxPHYPacketSize).
|
||||||
|
*
|
||||||
|
* @details See Table 22 - PHY constants.
|
||||||
|
*/
|
||||||
|
#define PHY_MAX_PACKET_SIZE 127
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief The maximum PHR size (in octets).
|
||||||
|
*
|
||||||
|
* @details See 6.3 PPDU format.
|
||||||
|
*/
|
||||||
|
#define PHY_MAX_HEADER_SIZE 1
|
||||||
|
|
||||||
|
/**@brief Maximum PPDU size */
|
||||||
|
#define PHY_MAX_PPDU_SIZE (PHY_MAX_HEADER_SIZE + PHY_MAX_PACKET_SIZE)
|
||||||
|
|
||||||
|
/**@brief Position of PHY header related to income PPDU start pointer.*/
|
||||||
|
#define PHY_HEADER_POS (-1)
|
||||||
|
|
||||||
|
/**@brief Size of PHY header in bytes.*/
|
||||||
|
#define PHY_HEADER_SIZE 1
|
||||||
|
|
||||||
|
/**@brief Maximum channel number.*/
|
||||||
|
#define PHY_MAX_CHANNEL_NUM 0x1Au
|
||||||
|
|
||||||
|
/**@brief Minimum channel number.*/
|
||||||
|
#define PHY_MIN_CHANNEL_NUM 0x0Bu
|
||||||
|
|
||||||
|
// for 2400 MHz O-QPSK 1 octet = 2 symbols 1 symbol = 32bits chip
|
||||||
|
#define aMaxPHYPacketSize PHY_MAX_PACKET_SIZE // in octets
|
||||||
|
#define aTurnaroundTime 12 // in symbols
|
||||||
|
|
||||||
|
#define aTurnaroundTimeUs 192 // in us
|
||||||
|
|
||||||
|
|
||||||
|
// Read only parameters
|
||||||
|
#define PHY_CURRENT_PAGE 0x0u
|
||||||
|
#define PHY_CHANNEL_SUPPORTED 0x07FFF800ul
|
||||||
|
#define PHY_SHR_DURATION 10u
|
||||||
|
#define PHY_MAX_FRAME_DURATION (PHY_SHR_DURATION + (int)((aMaxPHYPacketSize + 1) * PHY_SYMBOLS_PER_OCTET))
|
||||||
|
#define PHY_SYMBOLS_PER_OCTET 2u
|
||||||
|
|
||||||
|
// CCA values
|
||||||
|
#define PHY_TRX_CCA_MODE0 0
|
||||||
|
#define PHY_TRX_CCA_MODE1 1
|
||||||
|
#define PHY_TRX_CCA_MODE2 2
|
||||||
|
#define PHY_TRX_CCA_MODE3 3
|
||||||
|
|
||||||
|
|
||||||
|
/** @brief Minimum value that can be used to set radio transmit power. Equals
|
||||||
|
* to -32 dBm.
|
||||||
|
*
|
||||||
|
* This is a combination of digits which includes:
|
||||||
|
* 2 MSBs represent the tolerance on the transmit power
|
||||||
|
* 6 LSBs which may be written to, represent a signed integer in twos-complement format,
|
||||||
|
* corresponding to the nominal transmit power of the device in decibels relative to 1 mW.
|
||||||
|
* All combinations less than 0xBF are valid.
|
||||||
|
*/
|
||||||
|
#define PHY_MIN_TX_POWER 0x20
|
||||||
|
|
||||||
|
/** @brief Internal parameter of the PHY layer.
|
||||||
|
*
|
||||||
|
* @details Position of the sign bit inside transmit power attribute.*/
|
||||||
|
#define PHY_TRANSMIT_POWER_SIGN_BIT_POS 5
|
||||||
|
|
||||||
|
/** @brief Internal parameter of the PHY layer.
|
||||||
|
*
|
||||||
|
* @details This mask hides transmit power from transmit power attribute value,
|
||||||
|
* but leaves precision bitfield.
|
||||||
|
*/
|
||||||
|
#define PHY_TRANSMIT_POWER_MASK 0xC0
|
||||||
|
|
||||||
|
/** @brief Internal parameter of the PHY layer.
|
||||||
|
*
|
||||||
|
* @details This mask hides precision bitfield from transmit power attribute value,
|
||||||
|
* leaving transmit power unchanged.
|
||||||
|
*/
|
||||||
|
#define PHY_TRANSMIT_POWER_MASK_INV 0x3F
|
||||||
|
|
||||||
|
// Possible transmit power
|
||||||
|
#define DBM_11 ( 11 & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_10 ( 10 & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_9 ( 9 & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_8 ( 8 & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_7 ( 7 & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_6 ( 6 & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_5 ( 5 & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_4 ( 4 & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_3 ( 3 & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_2 ( 2 & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_1 ( 1 & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_0 ( 0 & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_MIN_1 (( -1) & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_MIN_2 (( -2) & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_MIN_3 (( -3) & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_MIN_4 (( -4) & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_MIN_5 (( -5) & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_MIN_6 (( -6) & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_MIN_7 (( -7) & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_MIN_8 (( -8) & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_MIN_9 (( -9) & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_MIN_10 ((-10) & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_MIN_11 ((-11) & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_MIN_12 ((-12) & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_MIN_13 ((-13) & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_MIN_14 ((-14) & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_MIN_15 ((-15) & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_MIN_16 ((-16) & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_MIN_17 ((-17) & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_MIN_18 ((-18) & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_MIN_19 ((-19) & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_MIN_20 ((-20) & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_MIN_21 ((-21) & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_MIN_22 ((-22) & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_MIN_23 ((-23) & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_MIN_24 ((-24) & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_MIN_25 ((-25) & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_MIN_26 ((-26) & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
#define DBM_MIN_27 ((-27) & PHY_TRANSMIT_POWER_MASK_INV)
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Common PHY enumerations description used in various PHY primitives.
|
||||||
|
*
|
||||||
|
* @details See Table 18-PHY enumerations description for detailed info on the statuses up to PHY_READ_ONLY.
|
||||||
|
* The statuses with higher numbers are implementation specific and used for synchronous API only.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
/** The CCA attempt has detected a busy channel. */
|
||||||
|
PHY_BUSY = 0x00,
|
||||||
|
|
||||||
|
/** The transceiver is asked to change its state while receiving. */
|
||||||
|
PHY_BUSY_RX = 0x01,
|
||||||
|
|
||||||
|
/** The transceiver is asked to change its state while transmitting. */
|
||||||
|
PHY_BUSY_TX = 0x02,
|
||||||
|
|
||||||
|
/** The transceiver is to be switched off immediately. */
|
||||||
|
PHY_FORCE_TRX_OFF = 0x03,
|
||||||
|
|
||||||
|
/** The CCA attempt has detected an idle channel. */
|
||||||
|
PHY_IDLE = 0x04,
|
||||||
|
|
||||||
|
/** A SET/GET request was issued with a parameter in the primitive that is
|
||||||
|
out of the valid range. */
|
||||||
|
PHY_INVALID_PARAMETER = 0x05,
|
||||||
|
|
||||||
|
/** The transceiver is in or is to be configured into the receiver enabled state. */
|
||||||
|
PHY_RX_ON = 0x06,
|
||||||
|
|
||||||
|
/** A SET/GET, an ED operation, or a transceiver state change was successful. */
|
||||||
|
PHY_SUCCESS = 0x07,
|
||||||
|
|
||||||
|
/** The transceiver is in or is to be configured into the transceiver disabled state. */
|
||||||
|
PHY_TRX_OFF = 0x08,
|
||||||
|
|
||||||
|
/** The transceiver is in or is to be configured into the transmitter enabled state. */
|
||||||
|
PHY_TX_ON = 0x09,
|
||||||
|
|
||||||
|
/** A SET/GET request was issued with the identifier of an attribute that is not supported. */
|
||||||
|
PHY_UNSUPPORTED_ATTRIBUTE = 0x0A,
|
||||||
|
|
||||||
|
/** A SET/GET request was issued with the identifier of an attribute that is read-only.*/
|
||||||
|
PHY_READ_ONLY = 0x0B,
|
||||||
|
|
||||||
|
|
||||||
|
/* Statuses out of the standard. They are used for synchronous API */
|
||||||
|
/** Transceiver is forced to change it's state to PHY_TX_ON (potential packet drop). */
|
||||||
|
PHY_FORCE_TX_ON = 0xFC,
|
||||||
|
|
||||||
|
/** Data cannot be sent due to failed CCA results.*/
|
||||||
|
PHY_CHANNEL_ACCESS_FAILURE = 0xFD,
|
||||||
|
|
||||||
|
/** Data had been sent but ACK frame hasn't been received.*/
|
||||||
|
PHY_NO_ACK = 0xFE,
|
||||||
|
|
||||||
|
/** PHY is not available for synchronous access */
|
||||||
|
PHY_IS_NOT_AVAILABLE = 0xFF
|
||||||
|
} phy_enum_t;
|
||||||
|
|
||||||
|
/**@brief PHY status type.*/
|
||||||
|
typedef phy_enum_t phy_status_t;
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // PHY_COMMON_H_INCLUDED
|
||||||
187
components/802_15_4/api/PHY/phy_pd_data.h
Normal file
187
components/802_15_4/api/PHY/phy_pd_data.h
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef PHY_PD_DATA_H_INCLUDED
|
||||||
|
#define PHY_PD_DATA_H_INCLUDED
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "sys_utils.h"
|
||||||
|
#include "sys_time.h"
|
||||||
|
#include "phy_common.h"
|
||||||
|
#include "mac_time.h"
|
||||||
|
#include "sys_queue.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* This file contains declarations of PHY Data transmission routines and necessary types.
|
||||||
|
*
|
||||||
|
* @defgroup phy_data PHY Data API
|
||||||
|
* @ingroup phy_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare PHY Data API
|
||||||
|
* @details The PHY Data module declares the PHY Data transmission routines and necessary types according to
|
||||||
|
* the PHY specification. More specifically, PHY data request pd_data_req(), PHY data confirm
|
||||||
|
* pd_data_conf(), and PHY Data indication pd_data_ind() primitives are declared.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief PD-DATA.request parameters.
|
||||||
|
*
|
||||||
|
* @details See 6.2.1.1 PD-DATA.request.
|
||||||
|
* See Table 6 - PD-DATA.request parameters.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** The set of octets forming the PSDU to be transmitted by the PHY entity. */
|
||||||
|
uint8_t * psdu;
|
||||||
|
|
||||||
|
/** The number of octets contained in the PSDU to be transmitted by the PHY entity.
|
||||||
|
Valid range: less or equal to @ref PHY_MAX_PACKET_SIZE. */
|
||||||
|
uint8_t psdu_length;
|
||||||
|
} pd_data_req_t;
|
||||||
|
|
||||||
|
/**@brief Private information which is passed with PD-DATA.confirm.
|
||||||
|
* Not covered by standard.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** pending value to store pending bit value if frame was acknowledged. */
|
||||||
|
bool pending;
|
||||||
|
} pd_data_conf_private_t;
|
||||||
|
|
||||||
|
/**@brief PD-DATA.confirm parameters.
|
||||||
|
*
|
||||||
|
* @details See 6.2.1.2 PD-DATA.confirm.
|
||||||
|
* See Table 7 - PD-DATA.confirm parameters.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** Service field. */
|
||||||
|
pd_data_conf_private_t service;
|
||||||
|
|
||||||
|
/** The result of the request to transmit a packet.
|
||||||
|
* Valid range: PHY_SUCCESS, PHY_RX_ON, PHY_TRX_OFF, PHY_BUSY_TX.
|
||||||
|
* See @ref phy_enum_t.
|
||||||
|
*
|
||||||
|
* When radio chip successfully transmits data, but cannot receive
|
||||||
|
* ACK in FAST_ACK mode, the result is PHY_TX_ON.
|
||||||
|
*/
|
||||||
|
phy_enum_t status;
|
||||||
|
} pd_data_conf_t;
|
||||||
|
|
||||||
|
/**@brief Private information which is passed with PD-DATA.indication.
|
||||||
|
* Not covered by standard.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** RSSI value, which corresponds to packet that caused this indication. */
|
||||||
|
int8_t rssi;
|
||||||
|
|
||||||
|
/** Buffer to store incoming frame. */
|
||||||
|
uint8_t frame_buffer[PHY_MAX_PACKET_SIZE + PHY_MAX_HEADER_SIZE];
|
||||||
|
|
||||||
|
/** Timestamp of the moment when PHY header octet reception has been started. */
|
||||||
|
mac_timestamp_t timestamp;
|
||||||
|
|
||||||
|
/** This field allows storing instances of this structure in a queue. */
|
||||||
|
sys_queue_item_t queue_item;
|
||||||
|
#ifdef CONFIG_PHY_CERT_CRC_HOOK
|
||||||
|
bool crc_status;
|
||||||
|
#endif
|
||||||
|
} pd_data_ind_private_t;
|
||||||
|
|
||||||
|
/**@brief PD-DATA.indication parameters.
|
||||||
|
*
|
||||||
|
* @details See 6.2.1.3 PD-DATA.indication.
|
||||||
|
* See Table 8 - PD-DATA.indication parameters.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** Service field. */
|
||||||
|
pd_data_ind_private_t service;
|
||||||
|
|
||||||
|
/** The set of octets forming the PSDU received by the PHY entity. */
|
||||||
|
uint8_t * psdu;
|
||||||
|
|
||||||
|
/** The number of octets contained in the PSDU received by the PHY entity.
|
||||||
|
Valid range: less or equal to @ref PHY_MAX_PACKET_SIZE. */
|
||||||
|
uint8_t psdu_length;
|
||||||
|
|
||||||
|
/** Link quality (LQI) value measured during reception of the PPDU (see 6.9.8).
|
||||||
|
Valid range: 0x00 - 0xFF. */
|
||||||
|
uint8_t ppdu_link_quality;
|
||||||
|
} pd_data_ind_t;
|
||||||
|
|
||||||
|
/**@brief PD-DATA.request primitive.
|
||||||
|
*
|
||||||
|
* @details The PD-DATA.request primitive requests the transfer of an MPDU (i.e., PSDU)
|
||||||
|
* from the MAC sublayer to the local PHY entity.
|
||||||
|
* See 6.2.1.1 PD-DATA.request.
|
||||||
|
*
|
||||||
|
* @param[in] req Pointer to PD-DATA.request parameters. See @ref pd_data_req_t.
|
||||||
|
*/
|
||||||
|
void pd_data_req(pd_data_req_t * req);
|
||||||
|
|
||||||
|
/**@brief PD-DATA.confirm primitive.
|
||||||
|
*
|
||||||
|
* @details Callback function, implemented by the next higher layer,
|
||||||
|
* which handles the PD-DATA.confirm primitive.
|
||||||
|
* See 6.2.1.2 PD-DATA.confirm.
|
||||||
|
*
|
||||||
|
* @param[out] conf Pointer to PD-DATA.confirm parameters. See @ref pd_data_conf_t.
|
||||||
|
*/
|
||||||
|
void pd_data_conf(pd_data_conf_t * conf);
|
||||||
|
|
||||||
|
/**@brief PD-DATA.indication primitive.
|
||||||
|
*
|
||||||
|
* @details The PD-DATA.indication primitive indicates the transfer of an MPDU (i.e., PSDU)
|
||||||
|
* from the PHY to the local MAC sublayer entity.
|
||||||
|
* See 6.2.1.3 PD-DATA.indication.
|
||||||
|
* This function must be implemented by the next higher layer.
|
||||||
|
*
|
||||||
|
* @param[out] ind Pointer to PD-DATA.indication parameters. See @ref pd_data_ind_t.
|
||||||
|
* Data are valid until next fully received packet.
|
||||||
|
*/
|
||||||
|
void pd_data_ind(pd_data_ind_t * ind);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // PHY_PD_DATA_H_INCLUDED
|
||||||
106
components/802_15_4/api/PHY/phy_plme_cca.h
Normal file
106
components/802_15_4/api/PHY/phy_plme_cca.h
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef PHY_PLME_CCA_H_INCLUDED
|
||||||
|
#define PHY_PLME_CCA_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "phy_common.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* This file contains declarations of Clear Channel Assessment PHY routines and necessary types.
|
||||||
|
*
|
||||||
|
* @defgroup phy_cca PHY CCA API
|
||||||
|
* @ingroup phy_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare PHY Clear Channel Assessment API
|
||||||
|
* @details The PHY CCA module declares Clear Channel Assessment PHY routines and necessary types according to
|
||||||
|
* the PHY specification. More specifically, PHY CCA request plme_cca_req(), PHY CCA confirm
|
||||||
|
* plme_cca_conf() primitives are declared. An additional primitive not covered by the standard is declared.
|
||||||
|
* This is plme_cca() which is a synchronous version of plme_cca_req().
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief PLME-CCA.confirm parameters
|
||||||
|
*
|
||||||
|
* @details The PLME-CCA.confirm primitive is generated by
|
||||||
|
* the initiating PLME and issued to its next higher layer
|
||||||
|
* in response to an PLME-CCA.request primitive.
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 6.2.2.2.1
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** One of PHY_TRX_OFF, PHY_BUSY or PHY_IDLE. */
|
||||||
|
phy_enum_t status;
|
||||||
|
} plme_cca_conf_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief PLME-CCA.request
|
||||||
|
*
|
||||||
|
* @details Request for clear channel assessment.
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 6.2.2.1
|
||||||
|
*/
|
||||||
|
void plme_cca_req(void);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief PLME-CCA.confirm callback function, implemented by the next higher layer.
|
||||||
|
*
|
||||||
|
* @details The PLME-CCA.confirm primitive is generated by the PLME and issued
|
||||||
|
* to its next higher layer in response to an PLME-CCA.request primitive.
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 6.2.2.2
|
||||||
|
*
|
||||||
|
* @param[out] conf Pointer to PLME-CCA.confirm parameters
|
||||||
|
*/
|
||||||
|
void plme_cca_conf(plme_cca_conf_t * conf);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Direct (synchronous) PLME-CCA.request
|
||||||
|
*
|
||||||
|
* @details Optional. Not covered by a standard.
|
||||||
|
*
|
||||||
|
* @return One of PHY_TRX_OFF, PHY_BUSY or PHY_IDLE,
|
||||||
|
* or implementation defined error code in case of
|
||||||
|
* unavailability of access to system resources.
|
||||||
|
*/
|
||||||
|
phy_enum_t plme_cca(void);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // PHY_PLME_CCA_H_INCLUDED
|
||||||
110
components/802_15_4/api/PHY/phy_plme_ed.h
Normal file
110
components/802_15_4/api/PHY/phy_plme_ed.h
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef PHY_PLME_ED_H_INCLUDED
|
||||||
|
#define PHY_PLME_ED_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "phy_common.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* This file contains declarations of Energy Detection PHY routines and necessary types.
|
||||||
|
*
|
||||||
|
* @defgroup phy_ed PHY ED API
|
||||||
|
* @ingroup phy_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare PHY Energy Detection API
|
||||||
|
* @details The PHY ED module declares Energy Detection PHY routines and necessary types according to
|
||||||
|
* the PHY specification. More specifically, PHY ED request plme_ed_req(), PHY ED confirm
|
||||||
|
* plme_ed_conf() primitives are declared.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief Describes the current state of the ED algorithm. */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
PHY_PLME_ED_STATE_IDLE, /**< Algorithm is idle. */
|
||||||
|
PHY_PLME_ED_STATE_BUSY /**< Currently performing ED. */
|
||||||
|
} phy_plme_ed_state_t;
|
||||||
|
|
||||||
|
/**@brief This structure holds static data of this module. */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
phy_plme_ed_state_t state;
|
||||||
|
} phy_plme_ed_mem_t;
|
||||||
|
|
||||||
|
/**@brief PLME-ED.confirm parameters.
|
||||||
|
*
|
||||||
|
* @details The PLME-ED.confirm primitive is generated by the PLME and issued
|
||||||
|
* to its next higher layer in response to an PLME-ED.request primitive.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 6.2.2.4.1.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** One of PHY_SUCCESS, PHY_TRX_OFF or PHY_TX_ON. */
|
||||||
|
phy_enum_t status;
|
||||||
|
|
||||||
|
/** Energy level for the current channel, if status is SUCCESS. */
|
||||||
|
uint8_t energy_level;
|
||||||
|
} plme_ed_conf_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief PLME-ED.request.
|
||||||
|
*
|
||||||
|
* @details Request ED measurement for the current channel.
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 6.2.2.3.
|
||||||
|
*/
|
||||||
|
void plme_ed_req(void);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief The PLME-ED.confirm callback function, implemented by the next higher layer.
|
||||||
|
*
|
||||||
|
* @details The PLME-ED.confirm primitive is generated by the PLME and issued
|
||||||
|
* to its next higher layer in response to an PLME-ED.request primitive.
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 6.2.2.4.
|
||||||
|
*
|
||||||
|
* @param[out] conf Pointer to PLME-ED.confirm parameters
|
||||||
|
*/
|
||||||
|
void plme_ed_conf(plme_ed_conf_t * conf);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // PHY_PLME_ED_H_INCLUDED
|
||||||
212
components/802_15_4/api/PHY/phy_plme_pib.h
Normal file
212
components/802_15_4/api/PHY/phy_plme_pib.h
Normal file
@ -0,0 +1,212 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef PHY_PLME_PIB_H_INCLUDED
|
||||||
|
#define PHY_PLME_PIB_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include "phy_common.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* This file contains declarations of PHY Information Base routines and necessary types.
|
||||||
|
*
|
||||||
|
* @defgroup phy_pib PHY PIB API
|
||||||
|
* @ingroup phy_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare PHY Information Base API
|
||||||
|
* @details The PHY PIB module declares PHY Information Base routines and necessary types according to
|
||||||
|
* the PHY specification. More specifically, PHY PIB Get request plme_get_req(), PHY PIB Set request
|
||||||
|
* plme_set_req(), PHY PIB Get confirm plme_get_conf(), and PHY PIB Set confirm plme_set_conf()
|
||||||
|
* primitives are declared. Two additional primitives not covered by the standard are declared. These are
|
||||||
|
* plme_get() and plme_set() which are synchronous versions of plme_get_req() and plme_set_req() accordingly.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define PHY_TX_POWER_TOLERANCE_1DB 0x00
|
||||||
|
#define PHY_TX_POWER_TOLERANCE_3DB 0x40
|
||||||
|
#define PHY_TX_POWER_TOLERANCE_6DB 0x80
|
||||||
|
#define PHY_TX_POWER_TOLERANCE_MASK 0xC0
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief PHY PIB attribute identificators.
|
||||||
|
*
|
||||||
|
* @details In accordance with IEEE Std 802.15.4-2006, section 6.4.2.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
PHY_CURRENT_CHANNEL_ID = 0x00, /**< Current channel. */
|
||||||
|
PHY_CHANNELS_SUPPORTED_ID = 0x01, /**< Supported channels. @note read only. */
|
||||||
|
PHY_TRANSMIT_POWER_ID = 0x02, /**< Transmit power. */
|
||||||
|
PHY_CCA_MODE_ID = 0x03, /**< CCA mode. */
|
||||||
|
PHY_CURRENT_PAGE_ID = 0x04, /**< Current page. */
|
||||||
|
PHY_MAX_FRAME_DURATION_ID = 0X05, /**< MAX Frame duration. @note read only. */
|
||||||
|
PHY_SHR_DURATION_ID = 0x06, /**< SHR Duration. @note read only. */
|
||||||
|
PHY_SYMBOLS_PER_OCTET_ID = 0x07, /**< Symbols per octet. @note read only. */
|
||||||
|
} plme_pib_attr_id_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief PHY PIB attribute type sizes.
|
||||||
|
*
|
||||||
|
* @details In accordance with IEEE Std 802.15.4-2006, Table 23.
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
uint8_t phy_current_channel; /**< Current channel. */
|
||||||
|
uint32_t phy_channels_supported; /**< Supported channels. */
|
||||||
|
int8_t phy_transmit_power; /**< Returns one of the DBM_xxx macro values. */
|
||||||
|
uint8_t phy_cca_mode; /**< CCA mode. */
|
||||||
|
uint8_t phy_current_page; /**< Current page. */
|
||||||
|
uint16_t phy_max_frame_duration; /**< MAX Frame duration. */
|
||||||
|
uint8_t phy_shr_duration; /**< SHR Duration. */
|
||||||
|
uint16_t phy_symbols_per_octet; /**< Symbols per octet. */
|
||||||
|
} phy_pib_item_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief PLME-GET.request parameters.
|
||||||
|
*
|
||||||
|
* @details In accordance with IEEE Std 802.15.4-2006, section 6.2.2.5.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
plme_pib_attr_id_t pib_attribute; /**< PIB attribute. */
|
||||||
|
} plme_get_req_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief PLME-GET.confirm parameters.
|
||||||
|
*
|
||||||
|
* @details In accordance with IEEE Std 802.15.4-2006, section 6.2.2.6.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
phy_status_t status; /**< Status of operation. */
|
||||||
|
plme_pib_attr_id_t pib_attribute; /**< PIB attribute. */
|
||||||
|
phy_pib_item_t pib_attribute_value; /**< Attribute value. */
|
||||||
|
} plme_get_conf_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief PLME-SET.request parameters.
|
||||||
|
*
|
||||||
|
* @details In accordance with IEEE Std 802.15.4-2006, section 6.2.2.9.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
plme_pib_attr_id_t pib_attribute; /**< PIB attribute. */
|
||||||
|
phy_pib_item_t pib_attribute_value; /**< Attribute value. */
|
||||||
|
} plme_set_req_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief PLME-SET.confirm parameters.
|
||||||
|
*
|
||||||
|
* @details In accordance with IEEE Std 802.15.4-2006, section 6.2.2.10.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
phy_status_t status; /**< Status of operation. */
|
||||||
|
plme_pib_attr_id_t pib_attribute; /**< PIB attribute. */
|
||||||
|
} plme_set_conf_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief PLME-GET.request.
|
||||||
|
*
|
||||||
|
* @details In accordance with IEEE Std 802.15.4-2006, section 6.2.2.5.
|
||||||
|
*
|
||||||
|
* @param[in] req Pointer to PLME-GET.request parameters. See @ref plme_get_req_t.
|
||||||
|
*/
|
||||||
|
void plme_get_req(plme_get_req_t * req);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief PLME-GET.confirm callback function, implemented by the next higher layer.
|
||||||
|
*
|
||||||
|
* @details The PLME-GET.confirm primitive is generated by the PLME and issued
|
||||||
|
* to its next higher layer in response to an PLME-GET.request primitive.
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 6.2.2.6.
|
||||||
|
*
|
||||||
|
* @param[out] conf Pointer to PLME-GET.confirm parameters. See @ref plme_get_conf_t.
|
||||||
|
*/
|
||||||
|
void plme_get_conf(plme_get_conf_t * conf);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief PLME-SET.request.
|
||||||
|
*
|
||||||
|
* @details In accordance with IEEE Std 802.15.4-2006, section 6.2.2.9.
|
||||||
|
*
|
||||||
|
* @param[in] req Pointer to PLME-SET.request parameters. See @ref plme_set_req_t.
|
||||||
|
*/
|
||||||
|
void plme_set_req(plme_set_req_t * req);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief PLME-SET.confirm callback function, implemented by the next higher layer.
|
||||||
|
*
|
||||||
|
* @details In accordance with IEEE Std 802.15.4-2006, section 6.2.2.10.
|
||||||
|
*
|
||||||
|
* @param[out] conf Pointer to PLME-SET.confirm parameters. See @ref plme_set_conf_t.
|
||||||
|
*/
|
||||||
|
void plme_set_conf(plme_set_conf_t * conf);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Getting parameters from PIB directly (without request - confirm approach)
|
||||||
|
*
|
||||||
|
* @details Optional. Not covered by a standard.
|
||||||
|
*
|
||||||
|
* @param[in] id attribute id.
|
||||||
|
* @param[out] mem pointer to memory for parameter storing.
|
||||||
|
*
|
||||||
|
* @return status of operation.
|
||||||
|
*/
|
||||||
|
phy_status_t plme_get(plme_pib_attr_id_t id, void * mem);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Setting parameters to PIB directly (without request - confirm approach)
|
||||||
|
*
|
||||||
|
* @details Optional. Not covered by a standard.
|
||||||
|
*
|
||||||
|
* @param[in] id attribute id.
|
||||||
|
* @param[out] mem pointer to memory for parameter storing.
|
||||||
|
*
|
||||||
|
* @return status of operation.
|
||||||
|
*/
|
||||||
|
phy_status_t plme_set(plme_pib_attr_id_t id, void * mem);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // PHY_PLME_PIB_H_INCLUDED
|
||||||
135
components/802_15_4/api/PHY/phy_plme_trx.h
Normal file
135
components/802_15_4/api/PHY/phy_plme_trx.h
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef PHY_PLME_TRX_H_INCLUDED
|
||||||
|
#define PHY_PLME_TRX_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "phy_common.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* This file contains declarations of PHY TRX routines and necessary types.
|
||||||
|
*
|
||||||
|
* @defgroup phy_trx PHY TRX API
|
||||||
|
* @ingroup phy_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare PHY Transceiver State API
|
||||||
|
* @details The PHY TRX module declares Transceiver state change PHY routines and necessary types according to
|
||||||
|
* the PHY specification. More specifically, PHY set TRX state request plme_set_trx_state_req(),
|
||||||
|
* PHY TRX state change confirm plme_set_trx_state_conf() primitives are declared. An additional
|
||||||
|
* primitive not covered by the standard is declared. This is plme_set_trx_state() which is a synchronous
|
||||||
|
* version of plme_set_trx_state_req().
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief PLME-SET_TRX_STATE.request parameters.
|
||||||
|
*
|
||||||
|
* @details The PLME-SET_TRX_STATE.request primitive is generated
|
||||||
|
* by the next higher layer of a device and issued to its PLME to
|
||||||
|
* set transmitter status.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 6.2.2.7.1
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** One of PHY_RX_ON, PHY_TRX_OFF, PHY_FORCE_TRX_OFF, PHY_TX_ON or PHY_FORCE_TX_ON. */
|
||||||
|
phy_enum_t state;
|
||||||
|
} plme_trx_req_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief PLME-TRX.confirm parameters.
|
||||||
|
*
|
||||||
|
* @details The PLME-TRX.confirm primitive is generated by
|
||||||
|
* PLME and issued to its next higher layer in response to
|
||||||
|
* an PLME-SET_TRX_STATE.request primitive.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 6.2.2.8.1
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** Holds result of trx state change request.
|
||||||
|
*
|
||||||
|
* @details Equals to PHY_SUCCESS if state changed successfully
|
||||||
|
* or current PHY state in either case.
|
||||||
|
*/
|
||||||
|
phy_enum_t status;
|
||||||
|
} plme_trx_conf_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief PLME-SET_TRX_STATE request.
|
||||||
|
*
|
||||||
|
* @details Request PHY to change internal operating state.
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 6.2.2.7
|
||||||
|
*
|
||||||
|
* @param[in] req Pointer to PLME-SET_TRX_STATE.request parameters.
|
||||||
|
* See @ref plme_trx_req_t.
|
||||||
|
*/
|
||||||
|
void plme_set_trx_state_req(plme_trx_req_t * req);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief PLME-SET_TRX_STATE.confirm callback function, implemented by the next higher layer.
|
||||||
|
*
|
||||||
|
* @details The PLME-SET_TRX_STATE.confirm primitive is generated
|
||||||
|
* by the PLME and issued to its next higher layer in response to
|
||||||
|
* an PLME-SET_TRX_STATE.request primitive.
|
||||||
|
*
|
||||||
|
* In accordance with IEEE Std 802.15.4-2006, section 6.2.2.8
|
||||||
|
*
|
||||||
|
* @param[out] conf Pointer to PLME-TRX.confirm parameters. See @ref plme_trx_conf_t.
|
||||||
|
*/
|
||||||
|
void plme_set_trx_state_conf(plme_trx_conf_t * conf);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Direct (synchronous) PLME-SET_TRX_STATE access.
|
||||||
|
*
|
||||||
|
* @details Optional. Not covered by the standard.
|
||||||
|
|
||||||
|
* @param[in] state One of PHY_RX_ON, PHY_TRX_OFF, PHY_FORCE_TRX_OFF or PHY_TX_ON.
|
||||||
|
*
|
||||||
|
* @return PHY_SUCCESS if state changed successfully or current PHY state
|
||||||
|
* in either case.
|
||||||
|
*/
|
||||||
|
phy_enum_t plme_set_trx_state(phy_enum_t state);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // PHY_PLME_TRX_H_INCLUDED
|
||||||
99
components/802_15_4/api/RAL/nrf52_soc/ral_api_spec.h
Normal file
99
components/802_15_4/api/RAL/nrf52_soc/ral_api_spec.h
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef RAL_API_SPEC_H_INCLUDED
|
||||||
|
#define RAL_API_SPEC_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup ral_api_spec RAL Special API
|
||||||
|
* @ingroup ral_api
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief Specific CCA MODE for FPGA RAL
|
||||||
|
*/
|
||||||
|
#define RAL_TRX_CCA_MODE4 4
|
||||||
|
|
||||||
|
/**@brief Maximum available value of CCA MODE for FPGA RAL
|
||||||
|
*/
|
||||||
|
#define RAL_TRX_CCA_MODE_MAX RAL_TRX_CCA_MODE4
|
||||||
|
|
||||||
|
/**@brief Maximum duration of CCA algorithm including a task scheduling
|
||||||
|
*/
|
||||||
|
#define RAL_LONGEST_CCA_DURATION_US 500
|
||||||
|
|
||||||
|
/**@brief Maximum transmit power in dBm
|
||||||
|
*/
|
||||||
|
#define RAL_MAXIMUM_TX_POWER 9
|
||||||
|
|
||||||
|
/**@brief Maximum tolerance of transmit power in dBm
|
||||||
|
*/
|
||||||
|
#define RAL_TX_POWER_TOLERANCE PHY_TX_POWER_TOLERANCE_6DB
|
||||||
|
|
||||||
|
/**@brief Value of RF signal power (in dBm) for RSSI equals zero.
|
||||||
|
*/
|
||||||
|
#define RSSI_BASE_VAL 90
|
||||||
|
|
||||||
|
/**@brief Values above this shouldn't appear in RSSI register result.*/
|
||||||
|
#define RSSI_REG_MAX_VAL 20
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Controls whether radio module will automatically calculate Frame
|
||||||
|
* Control Sequence field.
|
||||||
|
*
|
||||||
|
* @param auto_fcs_enabled if set to true, automatically generated FCS will
|
||||||
|
* replace the last two bytes of PHY service data unit.
|
||||||
|
*/
|
||||||
|
void ral_auto_fcs_set(bool auto_fcs_enabled);
|
||||||
|
|
||||||
|
/**@brief Controls whether radio module will enter channel jamming mode.
|
||||||
|
*
|
||||||
|
* @param jamming_enabled if set to true, radio will perform jamming on current
|
||||||
|
* channel and energy. No data transmission can be done
|
||||||
|
* while jamming is enabled.
|
||||||
|
*/
|
||||||
|
void ral_jam_control_set(bool jamming_enabled);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif// RAL_API_SPEC_H_INCLUDED
|
||||||
96
components/802_15_4/api/RAL/nrf52_soc/ral_fsm.h
Normal file
96
components/802_15_4/api/RAL/nrf52_soc/ral_fsm.h
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef RAL_FSM_H_INCLUDED
|
||||||
|
#define RAL_FSM_H_INCLUDED
|
||||||
|
|
||||||
|
#include "sys_fsm.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup ral_api_fsm RAL FSM API
|
||||||
|
* @ingroup ral_api
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
// list of possible events
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
E_RESET,
|
||||||
|
E_TRX_END, /**< Radio signals that TX or RX is complete.*/
|
||||||
|
E_TX_REQ, /**< Initiates upload of a frame into radio memory and
|
||||||
|
transmission of it into air.*/
|
||||||
|
E_TRX_OFF,
|
||||||
|
E_TX_ON,
|
||||||
|
E_FORCE_TX_ON,
|
||||||
|
E_RX_ON,
|
||||||
|
} ral_fsm_events_t;
|
||||||
|
|
||||||
|
// states
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
/* State symbol for short FSM debug mode */
|
||||||
|
/* I */ S_TRX_OFF,
|
||||||
|
/* J */ S_TX_ON,
|
||||||
|
/* */ S_BUSY_TX,
|
||||||
|
/* G */ S_RX_ON,
|
||||||
|
/* B */ S_BUSY_RX,
|
||||||
|
} ral_fsm_states_t;
|
||||||
|
|
||||||
|
/**@brief Reads current state of RAL state machine.
|
||||||
|
*
|
||||||
|
* @return Current state.
|
||||||
|
*/
|
||||||
|
ral_fsm_states_t ral_fsm_current_state_get(void);
|
||||||
|
|
||||||
|
/**@brief Initializes finite state machine of radio chip.*/
|
||||||
|
void ral_fsm_init(void);
|
||||||
|
|
||||||
|
/**@brief Sends new event to radio FSM. This function is used for
|
||||||
|
* changing radio state.
|
||||||
|
*
|
||||||
|
* @param event - event id for FSM.
|
||||||
|
* @param p_data - pointer to event specific data (expects pointer to ral_mem_t).
|
||||||
|
*/
|
||||||
|
void ral_fsm_event_post(ral_fsm_events_t event, void * p_data);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif /* RAL_FSM_H_INCLUDED */
|
||||||
88
components/802_15_4/api/RAL/nrf52_soc/ral_fsm_private.h
Normal file
88
components/802_15_4/api/RAL/nrf52_soc/ral_fsm_private.h
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef RAL_FSM_PRIVATE_H_INCLUDED
|
||||||
|
#define RAL_FSM_PRIVATE_H_INCLUDED
|
||||||
|
|
||||||
|
#include "nrf52840.h"
|
||||||
|
#include "nrf52840_bitfields.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup ral_api_fsm_private RAL FSM private API
|
||||||
|
* @ingroup ral_api
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @brief Private RAL function. Sets radio module into TRX_OFF mode if
|
||||||
|
* it was in RX or TX mode. */
|
||||||
|
void ral_fsm_a_trx_off(void * p_data);
|
||||||
|
|
||||||
|
/** @brief Private RAL function. Sets radio module into TRX_OFF mode if
|
||||||
|
* it was in BUSY_RX or BUSY_TX mode. */
|
||||||
|
void ral_fsm_a_force_trx_off(void * p_data);
|
||||||
|
|
||||||
|
/** @brief Private RAL function. Switches radio module from TRX_OFF
|
||||||
|
* to TX_ON mode. */
|
||||||
|
void ral_fsm_a_tx_on(void * p_data);
|
||||||
|
|
||||||
|
/** @brief Private RAL function. Switches radio module from TRX_OFF
|
||||||
|
* to RX_ON mode. */
|
||||||
|
void ral_fsm_a_rx_on(void * p_data);
|
||||||
|
|
||||||
|
/** @brief Private RAL function. Switches radio module from TX_ON
|
||||||
|
* to RX_ON mode. */
|
||||||
|
void ral_fsm_a_tx_to_rx(void * p_data);
|
||||||
|
|
||||||
|
/** @brief Private RAL function. Switches radio module from RX_ON
|
||||||
|
* to TX_ON mode. */
|
||||||
|
void ral_fsm_a_rx_to_tx(void * p_data);
|
||||||
|
|
||||||
|
/** @brief Private RAL function. Switches radio module from TRX_OFF
|
||||||
|
* to channel jamming mode. */
|
||||||
|
void ral_jamming_on(void);
|
||||||
|
|
||||||
|
/** @brief Private RAL function. Switches radio module from channel jamming
|
||||||
|
* mode to TRX_OFF state. */
|
||||||
|
void ral_jamming_off(void);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif /* RAL_FSM_PRIVATE_H_INCLUDED */
|
||||||
65
components/802_15_4/api/RAL/nrf52_soc/ral_irq_handlers.h
Normal file
65
components/802_15_4/api/RAL/nrf52_soc/ral_irq_handlers.h
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef RAL_IRQ_HANDLERS_H_INCLUDED
|
||||||
|
#define RAL_IRQ_HANDLERS_H_INCLUDED
|
||||||
|
|
||||||
|
#define RAL_NRF_BCC_COMPARE_VALUE 32
|
||||||
|
#define RAL_NRF_BCC_COMPARE_NONE (RAL_NRF_BCC_COMPARE_VALUE + 16)
|
||||||
|
#define RAL_NRF_BCC_COMPARE_SHORT (RAL_NRF_BCC_COMPARE_VALUE + 32)
|
||||||
|
#define RAL_NRF_BCC_COMPARE_LONG (RAL_NRF_BCC_COMPARE_VALUE + 80)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup ral_api_irq_handlers RAL auxiliary functions
|
||||||
|
* @ingroup ral_api
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief RAL IRQ handler symbol importer (dummy function).
|
||||||
|
*
|
||||||
|
* @details This function is only used to correctly import
|
||||||
|
* RADIO_IRQHandler symbol.
|
||||||
|
*/
|
||||||
|
void ral_irq_handler_import(void);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif// RAL_IRQ_HANDLERS_H_INCLUDED
|
||||||
69
components/802_15_4/api/RAL/nrf52_soc/ral_rf_init.h
Normal file
69
components/802_15_4/api/RAL/nrf52_soc/ral_rf_init.h
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef RAL_INIT_H_INCLUDED
|
||||||
|
#define RAL_INIT_H_INCLUDED
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup ral_api_init RAL RF initialization API
|
||||||
|
* @ingroup ral_api
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief Initializes radio transceiver.
|
||||||
|
*/
|
||||||
|
void ral_rf_init(void);
|
||||||
|
|
||||||
|
/**@brief Channel number setting.
|
||||||
|
*
|
||||||
|
* @param channel_num - channel number
|
||||||
|
*/
|
||||||
|
void ral_rf_channel_set(uint8_t channel_num);
|
||||||
|
|
||||||
|
/**@brief Channel number getting.
|
||||||
|
*
|
||||||
|
* @return channel number
|
||||||
|
*/
|
||||||
|
uint8_t ral_rf_channel_get(void);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif /* RAL_INIT_H_INCLUDED */
|
||||||
230
components/802_15_4/api/RAL/ral_api.h
Normal file
230
components/802_15_4/api/RAL/ral_api.h
Normal file
@ -0,0 +1,230 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef RAL_API_H_INCLUDED
|
||||||
|
#define RAL_API_H_INCLUDED
|
||||||
|
|
||||||
|
#include "ral_api_spec.h"
|
||||||
|
#include "sys_time.h"
|
||||||
|
#include "phy_common.h"
|
||||||
|
#include "phy_pd_data.h"
|
||||||
|
#include "mac_common.h"
|
||||||
|
#include "mac_mlme_pib.h"
|
||||||
|
#include "mac_time.h"
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
/**@file ral_api.h
|
||||||
|
*
|
||||||
|
* @defgroup ral_api Radio Abstraction Layer common API
|
||||||
|
* @ingroup ral_15_4
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
* @brief Radio abstraction layer common interface.
|
||||||
|
*
|
||||||
|
* @details These are requirements for the implementation code:
|
||||||
|
*
|
||||||
|
* - no frames must be received between new frame indication and
|
||||||
|
* a call to ral_data_ind_read.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// various constants to use with MAC/PHY header parsing
|
||||||
|
#define PHR_POS 0
|
||||||
|
#define PHR_SIZE 1
|
||||||
|
#define CRC_SIZE 2
|
||||||
|
#define MAC_FRAME_CTRL_POS 0
|
||||||
|
#define MAC_FRAME_CTRL_SIZE 2
|
||||||
|
#define ACK_REQUEST_MASK 0x20
|
||||||
|
#define SEQ_NUM_POS (MAC_FRAME_CTRL_POS + MAC_FRAME_CTRL_SIZE)
|
||||||
|
#define ACK_PD_BIT_MASK 0x0010
|
||||||
|
|
||||||
|
#define FRAME_TYPE_MASK 0x0007
|
||||||
|
#define FRAME_TYPE_BEACON 0x0000
|
||||||
|
#define FRAME_TYPE_DATA 0x0001
|
||||||
|
#define FRAME_TYPE_ACK 0x0002
|
||||||
|
#define FRAME_TYPE_COMMAND 0x0003
|
||||||
|
|
||||||
|
#define FRAME_PENDING_MASK 0x0010
|
||||||
|
|
||||||
|
/**@brief RAL atomic section */
|
||||||
|
typedef volatile uint8_t ral_atomic_t;
|
||||||
|
|
||||||
|
// private RAL data
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
volatile uint8_t tx_seq_num;
|
||||||
|
volatile bool ack_needed;
|
||||||
|
volatile bool waiting_for_ack;
|
||||||
|
volatile ral_atomic_t ral_atomic;
|
||||||
|
volatile mac_timestamp_t received_frame_timestamp;
|
||||||
|
volatile bool spi_transfer;
|
||||||
|
volatile bool cca_performing;
|
||||||
|
#if defined(AT86RF231)
|
||||||
|
volatile int8_t ed_value;
|
||||||
|
volatile bool unread_frame; /** This flag is used to deny transmission if incoming frame
|
||||||
|
has not been read from radio buffer.
|
||||||
|
todo: remove this deny to accelerate data exchange.
|
||||||
|
*/
|
||||||
|
volatile bool is_promiscuous_mode; /**< Set to true if promiscuous mode is enabled.*/
|
||||||
|
#elif (defined(NRF52_SERIES) || defined(NRF52))
|
||||||
|
// pointer to free memory for rx DMA
|
||||||
|
volatile uint8_t * p_buffer;
|
||||||
|
volatile sys_time_t calibr_value;
|
||||||
|
volatile uint8_t bcc_part;
|
||||||
|
#endif
|
||||||
|
} ral_mem_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Initializes radio abstraction layer.
|
||||||
|
*/
|
||||||
|
void ral_init(void);
|
||||||
|
|
||||||
|
/**@brief Resets radio abstraction layer.
|
||||||
|
*/
|
||||||
|
void ral_reset(void);
|
||||||
|
|
||||||
|
/**@brief Performs synchronous ED measurement.
|
||||||
|
*/
|
||||||
|
uint8_t ral_ed_perform(void);
|
||||||
|
|
||||||
|
/**@brief Sends request to change radio state.
|
||||||
|
*
|
||||||
|
* @param state - New radio state. One of...
|
||||||
|
*
|
||||||
|
* @return PHY_SUCCESS, if state has been successfully achieved;
|
||||||
|
* current state, if state cannot be reached.*/
|
||||||
|
phy_enum_t ral_state_set(const phy_enum_t state);
|
||||||
|
|
||||||
|
/**@brief Returns current state of radio.
|
||||||
|
*/
|
||||||
|
phy_enum_t ral_state_get(void);
|
||||||
|
|
||||||
|
/**@brief Puts radio into sleep mode
|
||||||
|
*/
|
||||||
|
void ral_sleep(void);
|
||||||
|
|
||||||
|
/**@brief Awakes a radio
|
||||||
|
*/
|
||||||
|
void ral_wakeup(void);
|
||||||
|
|
||||||
|
/**@brief Performs synchronous cca.
|
||||||
|
*/
|
||||||
|
phy_status_t ral_cca_perform(void);
|
||||||
|
|
||||||
|
/**@brief Sends PHY frame.
|
||||||
|
*
|
||||||
|
* @param[in] pd_data - full data frame to be send.
|
||||||
|
*
|
||||||
|
* @details RAL automatically adds header and FCS control bytes
|
||||||
|
* to \a pd_data. Caller must reserve 1 byte before \a psdu
|
||||||
|
* pointer and may leave last two bytes of payload (i.e. FCS
|
||||||
|
* control field) uninitialized.
|
||||||
|
*
|
||||||
|
* RF chip or RAL code is responsible to receive an ACK frame.
|
||||||
|
* After ACK is handled, device should be restored to the TX state.*/
|
||||||
|
void ral_data_req(pd_data_req_t * pd_data);
|
||||||
|
|
||||||
|
/**@brief Reads indication frame from radio.
|
||||||
|
*
|
||||||
|
* @retval Pointer on the structure of a PHY data indication
|
||||||
|
* with received frame.
|
||||||
|
*/
|
||||||
|
pd_data_ind_t * ral_data_ind_read(void);
|
||||||
|
|
||||||
|
/**@brief Enable data flow from radio hardware after it was disabled
|
||||||
|
* by ral_data_flow_disable().
|
||||||
|
*/
|
||||||
|
void ral_data_flow_enable(void);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Disable data flow from radio hardware
|
||||||
|
*/
|
||||||
|
void ral_data_flow_disable(void);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief This function is used to set attribute from MAC or PHY layer
|
||||||
|
* without checking of its boundaries.
|
||||||
|
*
|
||||||
|
* @param id - one of #MAC_SHORT_ADDRESS, #MAC_EXTENDED_ADDRESS, #MAC_PAN_ID
|
||||||
|
* and some other values.
|
||||||
|
* @param p_value - pointer to new value.
|
||||||
|
*/
|
||||||
|
void ral_attribute_set(uint8_t id, const void * p_value);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief This function is used to get a copy of attribute value stored inside
|
||||||
|
* radio module.
|
||||||
|
*
|
||||||
|
* @param[in] id - one of #PHY_CURRENT_CHANNEL_ID, #PHY_TRANSMIT_POWER_ID or
|
||||||
|
* #PHY_CCA_MODE_ID. Other attributes are not supported.
|
||||||
|
* @param[out] p_attr_value - pointer to value to get.
|
||||||
|
*/
|
||||||
|
void ral_attribute_get(uint8_t id, void * p_attr_value);
|
||||||
|
|
||||||
|
/**@brief This function is used to define frame start time by it's size
|
||||||
|
* and the timestamp, when RX IRQ has been received.
|
||||||
|
*
|
||||||
|
* @param irq_time - moment when IRQ has been received.
|
||||||
|
* @param frame_size - size of received frame in bytes.
|
||||||
|
*
|
||||||
|
* @retval MAC timestamp when PHY header has been started to receive.
|
||||||
|
*/
|
||||||
|
mac_timestamp_t ral_rx_start_time(mac_timestamp_t irq_time, uint8_t frame_size);
|
||||||
|
|
||||||
|
/**@brief This function performs RSSI.
|
||||||
|
*
|
||||||
|
* @return RSSI sample value.
|
||||||
|
*/
|
||||||
|
uint8_t ral_rssi_get(void);
|
||||||
|
|
||||||
|
/**@brief This function calculates the adjusted RSSI value using a temperature
|
||||||
|
* correction factor.
|
||||||
|
*
|
||||||
|
* @param[in] rssi - RSSI sample value (as returned by @ref ral_rssi_get).
|
||||||
|
* @param[in] temp - Temperature value in °C.
|
||||||
|
*
|
||||||
|
* @return Temperature-corrected RSSI value.
|
||||||
|
*/
|
||||||
|
uint8_t ral_rssi_corrected_get(uint8_t rssi, int8_t temp);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif /* RAL_API_H_INCLUDED */
|
||||||
128
components/802_15_4/api/SecAL/sec_aes_ccm.h
Normal file
128
components/802_15_4/api/SecAL/sec_aes_ccm.h
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef SEC_AES_CCM_H_INCLUDED
|
||||||
|
#define SEC_AES_CCM_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* This file contains declarations of the AES CCM encryption/decryption routines and necessary types.
|
||||||
|
* It also contains the declaration of the Security Abstract library initialization routine.
|
||||||
|
*
|
||||||
|
* @defgroup sec_aes_ccm Security AES CCM declarations
|
||||||
|
* @ingroup sec_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare Security AES CCM API
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief AES CCM Status enumeration.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
AES_CCM_OK, /**< AES CCM operation succeeded. */
|
||||||
|
AES_ENGINE_FAIL, /**< AES engine failed. */
|
||||||
|
AES_CCM_FAIL, /**< CCM algorithm failed. */
|
||||||
|
AES_CCM_AUTH_FAIL /**< CCM authentication failed. */
|
||||||
|
} sec_aes_ccm_status_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief AES CCM request.
|
||||||
|
*
|
||||||
|
* @details The AES CCM request primitive is issued by the AES user.
|
||||||
|
* There are two use cases for the request:
|
||||||
|
* The first one is to encrypt the user text with some given key.
|
||||||
|
* The second one is to decrypt the cipher text against the key.
|
||||||
|
* The encrypted or decrypted data is stored in text_data.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** Counted authentication tag. */
|
||||||
|
uint8_t * mic;
|
||||||
|
/** Security level identifier. */
|
||||||
|
uint8_t level;
|
||||||
|
/** A 128-bit-long string to be used as a key. Each entity must have evidence that access
|
||||||
|
* to this key is restricted to the entity itself and its intended key sharing group member(s). */
|
||||||
|
uint8_t * key;
|
||||||
|
/** A nonce N of 15 - L octets. Within the scope of any encryption key, the nonce value must be unique. */
|
||||||
|
uint8_t * nonce;
|
||||||
|
/** An octet string representing plain text data in case of encryption and cipher text data
|
||||||
|
* in case of decryption. */
|
||||||
|
uint8_t * text_data;
|
||||||
|
/** Text data length. */
|
||||||
|
uint8_t text_data_len;
|
||||||
|
/** Octet string representing input data to perform authentication. */
|
||||||
|
uint8_t * auth_data;
|
||||||
|
/** Auth data length. */
|
||||||
|
uint8_t auth_data_len;
|
||||||
|
} sec_aes_ccm_req_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function for initializing the security abstraction layer.
|
||||||
|
*/
|
||||||
|
void sec_init(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief AES CCM encryption transformation.
|
||||||
|
*
|
||||||
|
* @details Performs synchronous encryption of data.
|
||||||
|
*
|
||||||
|
* @param req Encryption request structure.
|
||||||
|
* @return AES_CCM_OK on success, otherwise an implementation defined error.
|
||||||
|
*/
|
||||||
|
sec_aes_ccm_status_t sec_aes_ccm_enc(sec_aes_ccm_req_t * req);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief AES CCM decryption transformation.
|
||||||
|
*
|
||||||
|
* @details Performs synchronous decryption of a cipher.
|
||||||
|
*
|
||||||
|
* @param req Decryption request structure.
|
||||||
|
* @return AES_CCM_OK on success, otherwise an implementation defined error.
|
||||||
|
*/
|
||||||
|
sec_aes_ccm_status_t sec_aes_ccm_dec(sec_aes_ccm_req_t * req);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif /* SEC_AES_CCM_H_INCLUDED */
|
||||||
75
components/802_15_4/api/SecAL/sec_aes_entity.h
Normal file
75
components/802_15_4/api/SecAL/sec_aes_entity.h
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef SEC_AES_ENTITY_H_INCLUDED
|
||||||
|
#define SEC_AES_ENTITY_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* This file contains declaration of the AES encryption routine.
|
||||||
|
* It also contains the declaration of the AES entity initialization routine.
|
||||||
|
*
|
||||||
|
* @defgroup aes_entity Security AES entity declarations
|
||||||
|
* @ingroup sec_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare AES entity API.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function for initializing the AES ECB module.
|
||||||
|
*/
|
||||||
|
void aes_entity_init(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief AES encryption.
|
||||||
|
*
|
||||||
|
* @details Performs synchronous encryption of text against the key.
|
||||||
|
* Encrypted data is stored to text memory.
|
||||||
|
*
|
||||||
|
* @param key Pointer to a 128-bit key.
|
||||||
|
* @param text Pointer to a 128-bit plain text data.
|
||||||
|
*/
|
||||||
|
void aes_handle(uint8_t * key, uint8_t * text);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif /* SEC_AES_ENTITY_H_INCLUDED */
|
||||||
95
components/802_15_4/api/SysAL/sys_crc.h
Normal file
95
components/802_15_4/api/SysAL/sys_crc.h
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef SYS_CRC_H_INCLUDED
|
||||||
|
#define SYS_CRC_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* This file contains declarations of the CRC computing routines and necessary macros/types.
|
||||||
|
*
|
||||||
|
* @defgroup sys_crc System CRC API
|
||||||
|
* @ingroup sys_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare System CRC API.
|
||||||
|
* @details The CRC module implements a set of routines to compute the 16-bit CRC value for octet arrays.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Defines an initial value for the CRC sum.
|
||||||
|
*/
|
||||||
|
#define SYS_CRC_INIT 0
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief CRC value type. This module uses 16-bit CRC.
|
||||||
|
*/
|
||||||
|
typedef uint16_t sys_crc_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function for computing CRC value for given data.
|
||||||
|
*
|
||||||
|
* @param[in] p_data Pointer to data to compute.
|
||||||
|
* @param[in] length Length of data.
|
||||||
|
*
|
||||||
|
* @return Returns the CRC value for input data.
|
||||||
|
*/
|
||||||
|
sys_crc_t sys_crc_calc(const uint8_t * p_data, size_t length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function for updating the CRC value taking into the account the previously counted value.
|
||||||
|
*
|
||||||
|
* @details This function is used when input data is represented by several pieces.
|
||||||
|
* Consequently, a call to this function for each piece will give a correct
|
||||||
|
* total CRC value.
|
||||||
|
*
|
||||||
|
* @param[in] current_crc Previously counted CRC value. Should be SYS_CRC_INIT for the first piece.
|
||||||
|
* @param[in] p_data Pointer to the current piece of data.
|
||||||
|
* @param[in] length Length of the current piece of data.
|
||||||
|
*
|
||||||
|
* @return Returns the updated CRC value.
|
||||||
|
*/
|
||||||
|
sys_crc_t sys_crc_continue(sys_crc_t current_crc, const uint8_t * p_data, size_t length);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif /* SYS_CRC_H_INCLUDED */
|
||||||
180
components/802_15_4/api/SysAL/sys_debug.h
Normal file
180
components/802_15_4/api/SysAL/sys_debug.h
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef SYS_DEBUG_H_INCLUDED
|
||||||
|
#define SYS_DEBUG_H_INCLUDED
|
||||||
|
|
||||||
|
|
||||||
|
#include "hal_debug_interface.h"
|
||||||
|
#include "hal_trace_interface.h"
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
/* This header file contains macros for debugging. */
|
||||||
|
#ifndef __FILENAME__
|
||||||
|
#define __FILENAME__ __FILE__
|
||||||
|
#endif // __FILENAME__
|
||||||
|
|
||||||
|
#ifndef ASSERT
|
||||||
|
#ifdef CONFIG_DEBUG
|
||||||
|
#define ASSERT(CONDITION_STATEMENT) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
bool LOCAL_CONDITION_CHECK = (CONDITION_STATEMENT); \
|
||||||
|
if (LOCAL_CONDITION_CHECK != true) \
|
||||||
|
{ \
|
||||||
|
sys_assert_handler((#CONDITION_STATEMENT), __LINE__, __FILENAME__); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define ASSERT(CONDITION_STATEMENT)
|
||||||
|
|
||||||
|
#endif // CONFIG_DEBUG
|
||||||
|
#endif // ASSERT
|
||||||
|
|
||||||
|
#ifndef ASSERT_INFO
|
||||||
|
#ifdef CONFIG_DEBUG
|
||||||
|
#define ASSERT_INFO(CONDITION_STATEMENT, INFO_FMT, ...) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
bool LOCAL_CONDITION_CHECK = (CONDITION_STATEMENT); \
|
||||||
|
if (LOCAL_CONDITION_CHECK != true) \
|
||||||
|
{ \
|
||||||
|
sys_assert_info_handler((#CONDITION_STATEMENT), __LINE__, __FILENAME__, \
|
||||||
|
INFO_FMT, __VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define ASSERT_INFO(CONDITION_STATEMENT, INFO_FMT, ...)
|
||||||
|
|
||||||
|
#endif // CONFIG_DEBUG
|
||||||
|
#endif // ASSERT_INFO
|
||||||
|
|
||||||
|
#ifndef ASSERT_STATIC
|
||||||
|
#ifdef CONFIG_DEBUG
|
||||||
|
#define ASSERT_STATIC(e) do { enum {SA = 1/(e)}; } while (0)
|
||||||
|
#else
|
||||||
|
#define ASSERT_STATIC(e)
|
||||||
|
#endif // CONFIG_DEBUG
|
||||||
|
#endif // ASSERT_STATIC
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup sys_debug Debugging macros
|
||||||
|
* @ingroup sys_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Functions used for debugging.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief System assertion fault handler.
|
||||||
|
*
|
||||||
|
* @details This macro should be used whenever an assertion fault is detected.
|
||||||
|
*
|
||||||
|
* @param[in] CONDITION_STRING Assertion condition string, which occurred to be not true.
|
||||||
|
*/
|
||||||
|
#define SYS_ASSERT_HANDLER(CONDITION_STRING) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
sys_assert_handler(CONDITION_STRING, __LINE__, __FILE__); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef TRACE_PUTS
|
||||||
|
#ifdef CONFIG_TRACE
|
||||||
|
#define TRACE_PUTS(s) HAL_TRACE_INTERFACE_PUTS(s)
|
||||||
|
#else
|
||||||
|
#define TRACE_PUTS(s)
|
||||||
|
#endif //CONFIG_TRACE
|
||||||
|
#endif //TRACE_PUTS
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef TRACE
|
||||||
|
#ifdef CONFIG_TRACE
|
||||||
|
#define TRACE(INFO_FMT, ...) sys_trace_handler(INFO_FMT, __VA_ARGS__)
|
||||||
|
#else
|
||||||
|
#define TRACE(INFO_FMT, ...)
|
||||||
|
#endif // CONFIG_DEBUG
|
||||||
|
#endif // TRACE
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief System assertion fault handler function.
|
||||||
|
*
|
||||||
|
* @param[in] condition Assertion condition string, which was expected to be true.
|
||||||
|
*
|
||||||
|
* @param[in] line Line number.
|
||||||
|
*
|
||||||
|
* @param[in] file File name.
|
||||||
|
*/
|
||||||
|
extern void sys_assert_handler(
|
||||||
|
const char * condition, const int line, const char * file);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief System assertion fault handler function with additional assertion information.
|
||||||
|
*
|
||||||
|
* @param[in] condition Assertion condition string, which was expected to be true.
|
||||||
|
*
|
||||||
|
* @param[in] line Line number.
|
||||||
|
*
|
||||||
|
* @param[in] file File name.
|
||||||
|
*
|
||||||
|
* @param[in] info_fmt Format string for additional assert information.
|
||||||
|
*
|
||||||
|
* @param[in] ... Arguments list corresponding to the format string.
|
||||||
|
*/
|
||||||
|
extern void sys_assert_info_handler(
|
||||||
|
const char * condition, const int line, const char * file,
|
||||||
|
const char * info_fmt, ...);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief System trace output handler function.
|
||||||
|
*
|
||||||
|
* @param[in] fmt Format string for trace output.
|
||||||
|
*
|
||||||
|
* @param[in] ... Arguments list corresponding to the format string.
|
||||||
|
*/
|
||||||
|
extern void sys_trace_handler(const char * fmt, ...);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // SYS_DEBUG_H_INCLUDED
|
||||||
167
components/802_15_4/api/SysAL/sys_events.h
Normal file
167
components/802_15_4/api/SysAL/sys_events.h
Normal file
@ -0,0 +1,167 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef SYS_EVENTS_H_INCLUDED
|
||||||
|
#define SYS_EVENTS_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include "sys_queue.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* This file contains declarations of the Events API and necessary types. The Events feature is implemented
|
||||||
|
* using the Queue functionality.
|
||||||
|
*
|
||||||
|
* @defgroup sys_events System events API
|
||||||
|
* @ingroup sys_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module for declaring system events API.
|
||||||
|
* @details The Events module defines some routines to subscribe/unsubscribe to/from system events. The events pool
|
||||||
|
* can be extended by adding new events to the sys_event_id_t enumeration. The registered callbacks
|
||||||
|
* can be called for an array of events. The callbacks can be called implicitly via posting the event by the
|
||||||
|
* sys_event_post() routine.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief IDs of globally available events.
|
||||||
|
*
|
||||||
|
* @details Event IDs are system extension points that allow the user to implement
|
||||||
|
* specific processing of predefined set of events, occurring in different modules.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
SYS_EVENT_FALLING_ASLEEP, /**< Falling asleep event. */
|
||||||
|
SYS_EVENT_WAKE_UP, /**< Waking up event. */
|
||||||
|
SYS_EVENT_OUT_OF_MEMORY, /**< Out of memory event. */
|
||||||
|
SYS_EVENT_MEMORY_FREED, /**< Memory was freed up event. */
|
||||||
|
|
||||||
|
/** \note The list of system events can be extended during the implementation phase. */
|
||||||
|
|
||||||
|
/* The following event IDs are used only for unit testing */
|
||||||
|
TST_EVENT_0, /**< Test event #0. */
|
||||||
|
TST_EVENT_1, /**< Test event #1. */
|
||||||
|
TST_EVENT_2, /**< Test event #2. */
|
||||||
|
|
||||||
|
#if (CONFIG_USE_SYS_TASK_NOTIFIER == 1)
|
||||||
|
/** This event is posted when there are unhandled events available in
|
||||||
|
* any of the schedulers.
|
||||||
|
*/
|
||||||
|
SYS_EVENT_NEW_TASK,
|
||||||
|
#endif
|
||||||
|
|
||||||
|
SYS_EVENTS_AMOUNT
|
||||||
|
} sys_event_id_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Prototype of user-implemented callback for processing an event.
|
||||||
|
*
|
||||||
|
* @details This callback is registered for the given event by a *_subscribe routine,
|
||||||
|
* and is then called by the system events engine, when this event occurs.
|
||||||
|
*
|
||||||
|
* @param[in] p_data Pointer to the data, specific for this event.
|
||||||
|
*/
|
||||||
|
typedef void (* sys_event_callback_t)(const void * p_data);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Event descriptor.
|
||||||
|
*
|
||||||
|
* @details This descriptor is used to subscribe/unsubscribe to/from the event.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** Service field. */
|
||||||
|
sys_queue_item_t queue_item;
|
||||||
|
|
||||||
|
/** ID of the event to which this callback is to be subscribed. */
|
||||||
|
sys_event_id_t event_id;
|
||||||
|
|
||||||
|
/** Callback function which is to be called when this event occurs. */
|
||||||
|
sys_event_callback_t callback;
|
||||||
|
} sys_event_desc_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for initializing the global events infrastructure.
|
||||||
|
*/
|
||||||
|
void sys_events_init(void);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for subscribing to a system event.
|
||||||
|
*
|
||||||
|
* @param[in] p_event_desc Pointer to the event descriptor.
|
||||||
|
*/
|
||||||
|
void sys_event_subscribe(sys_event_desc_t * p_event_desc);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for unsubscribing from a system event event.
|
||||||
|
*
|
||||||
|
* @param[in] p_event_desc Pointer to the event descriptor.
|
||||||
|
*/
|
||||||
|
void sys_event_unsubscribe(sys_event_desc_t * p_event_desc);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for subscribing to a group of events.
|
||||||
|
*
|
||||||
|
* @param[in] p_desc_array Pointer to the array of event descriptors.
|
||||||
|
* @param[in] desc_amount Amount of event descriptors in the array.
|
||||||
|
*/
|
||||||
|
void sys_events_array_subscribe(sys_event_desc_t * p_desc_array, size_t desc_amount);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for unsubscribing from the group of events.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param[in] p_desc_array Pointer to the array of event descriptors.
|
||||||
|
* @param[in] desc_amount Amount of the event descriptors in the array.
|
||||||
|
*/
|
||||||
|
void sys_events_array_unsubscribe(sys_event_desc_t * p_desc_array, size_t desc_amount);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for posting an event.
|
||||||
|
*
|
||||||
|
* @details This function is used to notify all the subscribers of the given events via
|
||||||
|
* their callbacks, when the given event occurs.
|
||||||
|
*
|
||||||
|
* @param[in] event_id ID of the event to be posted.
|
||||||
|
* @param[in] p_data Pointer to be passed to the event handlers' callbacks.
|
||||||
|
*/
|
||||||
|
void sys_event_post(sys_event_id_t event_id, const void * p_data);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // SYS_EVENTS_H_INCLUDED
|
||||||
286
components/802_15_4/api/SysAL/sys_fsm.h
Normal file
286
components/802_15_4/api/SysAL/sys_fsm.h
Normal file
@ -0,0 +1,286 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef SYS_FSM_H_INCLUDED
|
||||||
|
#define SYS_FSM_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* This file contains declarations of the Finite State Machine (FSM) primitives and necessary types.
|
||||||
|
*
|
||||||
|
* @defgroup sys_fsm Finite State Machine API
|
||||||
|
* @ingroup sys_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare Finite State Machine API
|
||||||
|
* @details The FSM module implements the Finite State Machine abstraction. The user is intended to implement a transition
|
||||||
|
* table of states with guards and actions in order to represent some event-driven subject. When a table is
|
||||||
|
* implemented, call sys_fsm_init() to initialize the FSM. After that, the only routine to
|
||||||
|
* work with FSM is sys_fsm_event_post().
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief Fixed-size type for FSM state ID.
|
||||||
|
*/
|
||||||
|
typedef uint8_t sys_fsm_state_id_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Fixed-size type for FSM event ID.
|
||||||
|
*/
|
||||||
|
typedef uint8_t sys_fsm_event_id_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Fixed-size type for FSM guard condition ID.
|
||||||
|
*/
|
||||||
|
typedef uint8_t sys_fsm_guard_id_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Fixed-size type for FSM action ID.
|
||||||
|
*/
|
||||||
|
typedef uint8_t sys_fsm_action_id_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief FSM transition description (item of FSM transition table).
|
||||||
|
*
|
||||||
|
* @details When an event with given event_id occurs, the guard condition with guard_id
|
||||||
|
* is checked, and if it returns true, the action with action_id is performed,
|
||||||
|
* and state machine is switched to the state with new_state_id.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
sys_fsm_event_id_t event_id; /**< FSM event ID. */
|
||||||
|
sys_fsm_guard_id_t guard_id; /**< FSM guard ID. */
|
||||||
|
sys_fsm_action_id_t action_id; /**< FSM action ID. */
|
||||||
|
sys_fsm_state_id_t new_state_id; /**< New state ID. */
|
||||||
|
#if defined(CONFIG_FSM_DEBUG)
|
||||||
|
const char * debug_string;
|
||||||
|
#endif
|
||||||
|
} sys_fsm_transition_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief FSM transition declaration (item of FSM transition table).
|
||||||
|
*/
|
||||||
|
#if defined(CONFIG_FSM_DEBUG)
|
||||||
|
# define SYS_FSM_TRANSITION(event_id, guard_id, action_id, new_state_id) \
|
||||||
|
{(event_id), (guard_id), (action_id), (new_state_id), \
|
||||||
|
"(" #event_id ", " #guard_id ", " #action_id " -> " #new_state_id ")"}
|
||||||
|
#else
|
||||||
|
# define SYS_FSM_TRANSITION(event_id, guard_id, action_id, new_state_id) \
|
||||||
|
{(event_id), (guard_id), (action_id), (new_state_id)}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief FSM state declaration.
|
||||||
|
*
|
||||||
|
* @details The state is an aggregator item of the FSM transition table, aggregating
|
||||||
|
* the transitions, declared immediately after this state declaration.
|
||||||
|
* All transition declaration items, following the state declaration item,
|
||||||
|
* will be aggregated in this state, until the next state declaration item,
|
||||||
|
* or the "end of table" item.
|
||||||
|
*/
|
||||||
|
#define SYS_FSM_STATE(state_id) \
|
||||||
|
{(state_id) | SYS_FSM_STATE_FLAG, 0, 0, 0}
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Empty guard condition ID.
|
||||||
|
*
|
||||||
|
* @details Special value of the guard_id field. If it is used in transition declaration,
|
||||||
|
* guard check will be omitted.
|
||||||
|
*/
|
||||||
|
#define SYS_FSM_NO_GUARD 0xFF
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Empty guard condition ID (useful synonym).
|
||||||
|
*
|
||||||
|
* @details Special value of the guard_id field. If it is used in transition declaration,
|
||||||
|
* guard check will be omitted.
|
||||||
|
*/
|
||||||
|
#define SYS_FSM_OTHERWISE 0xFF
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Empty guard condition ID (useful synonym).
|
||||||
|
*
|
||||||
|
* @details Special value of the guard_id field. If it is used in transition declaration,
|
||||||
|
* guard check will be omitted.
|
||||||
|
*/
|
||||||
|
#define SYS_FSM_ALWAYS 0xFF
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Empty action ID.
|
||||||
|
*
|
||||||
|
* @details Special value of the action_id field. If it is used in transition declaration,
|
||||||
|
* no action will be performed during the transition.
|
||||||
|
*/
|
||||||
|
#define SYS_FSM_NO_ACTION 0xFF
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Same state ID.
|
||||||
|
*
|
||||||
|
* @details Special value of the next_state_id field. If it is used in transition
|
||||||
|
* declaration, the current state will not be changed.
|
||||||
|
*/
|
||||||
|
#define SYS_FSM_SAME_STATE 0xFF
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Any state ID.
|
||||||
|
*
|
||||||
|
* @details Special value of the event_id field. If it is used in transition
|
||||||
|
* declaration table, then the transitions listed in this state will be applied
|
||||||
|
* in case they have not been listed in the transition table for the
|
||||||
|
* current FSM state.
|
||||||
|
* Only one SYS_FSM_STATE(SYS_FSM_ANY_STATE) can be present in the transition table.
|
||||||
|
*/
|
||||||
|
#define SYS_FSM_ANY_STATE 0xFF
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief State declaration flag.
|
||||||
|
*
|
||||||
|
* @details Special flag of the event_id field. This flag is used to distinguish
|
||||||
|
* between state declaration and transition declaration.
|
||||||
|
*/
|
||||||
|
#define SYS_FSM_STATE_FLAG 0x80
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Prototype of a user-defined FSM guard condition function.
|
||||||
|
*
|
||||||
|
* @details You must implement a single FSM guard condition function which will
|
||||||
|
* use an ID of the needed guard check as a parameter.
|
||||||
|
*
|
||||||
|
* @param[in] guard_id Guard condition ID to be checked.
|
||||||
|
* @param[in] p_data Additional FSM specific data.
|
||||||
|
*
|
||||||
|
* @retval true Transition is allowed, false otherwise.
|
||||||
|
*/
|
||||||
|
typedef bool (* sys_fsm_guard_t)(sys_fsm_guard_id_t guard_id, void * p_data);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Prototype of a user-defined FSM action function.
|
||||||
|
*
|
||||||
|
* @details You must implement a single FSM action function which will
|
||||||
|
* use an ID of the needed action as a parameter.
|
||||||
|
*
|
||||||
|
* @param[in] action_id Action ID to be performed.
|
||||||
|
* @param[in] p_data Additional FSM specific data.
|
||||||
|
*/
|
||||||
|
typedef void (* sys_fsm_action_t)(sys_fsm_action_id_t action_id, void * p_data);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Constant FSM descriptor which can reside in read-only memory.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
#if defined(CONFIG_FSM_DEBUG)
|
||||||
|
const char * debug_fsm_name;
|
||||||
|
#endif
|
||||||
|
/** Pointer to the transition table.
|
||||||
|
*/
|
||||||
|
const sys_fsm_transition_t * transition_table;
|
||||||
|
|
||||||
|
/** Number of transitions in the transition table.
|
||||||
|
*/
|
||||||
|
uint8_t transitions_amount;
|
||||||
|
|
||||||
|
/** Initial state ID.
|
||||||
|
*/
|
||||||
|
sys_fsm_state_id_t initial_state;
|
||||||
|
|
||||||
|
/** Pointer to the guard condition function.
|
||||||
|
*/
|
||||||
|
sys_fsm_guard_t guard;
|
||||||
|
|
||||||
|
/** Pointer to the action function.
|
||||||
|
*/
|
||||||
|
sys_fsm_action_t action;
|
||||||
|
} sys_fsm_const_descriptor_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief FSM dynamic descriptor, holding the current state of the FSM.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** Pointer to the constant FSM descriptor which can reside in read-only memory.
|
||||||
|
*/
|
||||||
|
const sys_fsm_const_descriptor_t * fsm_const_desc;
|
||||||
|
|
||||||
|
/** Index of the "any state transitions" block.
|
||||||
|
*/
|
||||||
|
uint8_t any_state_transitions_index;
|
||||||
|
|
||||||
|
/** Current state ID.
|
||||||
|
*/
|
||||||
|
volatile sys_fsm_state_id_t current_state;
|
||||||
|
|
||||||
|
/** Recursion protection.
|
||||||
|
*/
|
||||||
|
volatile uint8_t recursion_protection;
|
||||||
|
} sys_fsm_t;
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(CONFIG_FSM_DEBUG)
|
||||||
|
#define FSM_DEBUG_NAME(name_string) .debug_fsm_name = name_string,
|
||||||
|
#else
|
||||||
|
#define FSM_DEBUG_NAME(name_string)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for initializing a specific FSM.
|
||||||
|
*
|
||||||
|
* @param[in] p_fsm Pointer to FSM descriptor to initialize.
|
||||||
|
* @param[in] p_fsm_const Pointer to constant FSM descriptor with transition table, etc.
|
||||||
|
*/
|
||||||
|
void sys_fsm_init(sys_fsm_t * p_fsm, const sys_fsm_const_descriptor_t * p_fsm_const);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for posting an event to FSM.
|
||||||
|
*
|
||||||
|
* @details This function causes FSM transition from the current state to the new state,
|
||||||
|
* according to the transition table of this FSM.
|
||||||
|
* The corresponding guard check and action is performed.
|
||||||
|
*
|
||||||
|
* @param[in] p_fsm Pointer to FSM descriptor.
|
||||||
|
* @param[in] event_id Event ID to post.
|
||||||
|
* @param[in] p_data Pointer to the FSM-specific data.
|
||||||
|
*/
|
||||||
|
void sys_fsm_event_post(sys_fsm_t * p_fsm, sys_fsm_event_id_t event_id, void * p_data);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // SYS_FSM_H_INCLUDED
|
||||||
69
components/802_15_4/api/SysAL/sys_init.h
Normal file
69
components/802_15_4/api/SysAL/sys_init.h
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef SYS_INIT_H_INCLUDED
|
||||||
|
#define SYS_INIT_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup sys_15_4_init Initialization API
|
||||||
|
* @ingroup sys_15_4
|
||||||
|
* @{
|
||||||
|
* @brief API for initizalizing the system abstraction library.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @brief Initializes every component of this stack.
|
||||||
|
*
|
||||||
|
* This function must be called before using any of the components.
|
||||||
|
*
|
||||||
|
* @param[in] p_start Pool start address.
|
||||||
|
* @param[in] size Size of the pool in bytes.
|
||||||
|
*
|
||||||
|
* @details The pool start address must be aligned on the ALIGN_VALUE boundary, which is
|
||||||
|
* defined in @c sys_utils.h.
|
||||||
|
* The pool size should be multiple of an ALIGN_VALUE, which is defined in @c sys_utils.h.
|
||||||
|
*/
|
||||||
|
void sys_init(void * p_start, size_t size);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif /* SYS_INIT_H_INCLUDED */
|
||||||
248
components/802_15_4/api/SysAL/sys_list.h
Normal file
248
components/802_15_4/api/SysAL/sys_list.h
Normal file
@ -0,0 +1,248 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef SYS_LIST_H_INCLUDED
|
||||||
|
#define SYS_LIST_H_INCLUDED
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* This file contains declarations of the doubly linked list primitives and necessary types.
|
||||||
|
* This implementation is Linux-proven and used in the memory management module.
|
||||||
|
*
|
||||||
|
* @defgroup sys_list Doubly linked list API.
|
||||||
|
* @ingroup sys_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare the doubly linked list API.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal list "head" struct.
|
||||||
|
*/
|
||||||
|
struct sys_list_head
|
||||||
|
{
|
||||||
|
struct sys_list_head * next;
|
||||||
|
struct sys_list_head * prev;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct sys_list_head sys_list_head_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initializes a list by variable name.
|
||||||
|
* @warning this macro assumes that a list "head" (sys_list_head_t) variable
|
||||||
|
* with name \a name is already created.
|
||||||
|
*
|
||||||
|
* @param[inout] name The "head" struct name.
|
||||||
|
*/
|
||||||
|
#define LIST_HEAD_INIT(name) { &(name), &(name) }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Defines and initializes a new list.
|
||||||
|
* @details A call to this macro creates a new variable with the given name and
|
||||||
|
* initializes it as a list "head".
|
||||||
|
*
|
||||||
|
* @param[inout] name The "head" struct name.
|
||||||
|
*/
|
||||||
|
#define LIST_HEAD(name) sys_list_head_t name = { &(name), &(name) }
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initializes a list by pointer.
|
||||||
|
*
|
||||||
|
* @param[inout] ptr Pointer to a list.
|
||||||
|
*/
|
||||||
|
#define INIT_LIST_HEAD(ptr) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
(ptr)->prev = (ptr); \
|
||||||
|
(ptr)->next = (ptr); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Checks if a list is empty.
|
||||||
|
*
|
||||||
|
* @param[in] sys_list_head Pointer to a list.
|
||||||
|
* @return 0 if not empty, non-zero otherwise.
|
||||||
|
*/
|
||||||
|
#define IS_EMPTY(sys_list_head) (sys_list_head)->next == (sys_list_head)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Adds a new item to the list between \a l_prev and \a l_next elements.
|
||||||
|
* @warning This routine assumes that \a l_next is next to \a l_prev in the list.
|
||||||
|
* @note This is an internal helper routine which is not intended to be used by the user.
|
||||||
|
*
|
||||||
|
* @param[in] l_prev Pointer to the previous element.
|
||||||
|
* @param[in] l_next Pointer to the next element.
|
||||||
|
* @param[in] l_new Pointer to a new element.
|
||||||
|
*/
|
||||||
|
static inline void sys_ll_list_add(sys_list_head_t * l_prev,
|
||||||
|
sys_list_head_t * l_next,
|
||||||
|
sys_list_head_t * l_new)
|
||||||
|
{
|
||||||
|
l_new->prev = l_prev;
|
||||||
|
l_prev->next = l_new;
|
||||||
|
l_next->prev = l_new;
|
||||||
|
l_new->next = l_next;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Deletes an element between \a l_prev and \a l_next elements.
|
||||||
|
* @warning This macro assumes that \a l_next is next to \a l_prev in the list.
|
||||||
|
* @note This is an internal helper routine which is not intended to be used by the user.
|
||||||
|
*
|
||||||
|
* @param[in] l_prev Pointer to the previous element.
|
||||||
|
* @param[in] l_next Pointer to the next element.
|
||||||
|
*/
|
||||||
|
static inline void sys_ll_list_del(sys_list_head_t * l_next,
|
||||||
|
sys_list_head_t * l_prev)
|
||||||
|
{
|
||||||
|
l_next->prev = l_prev;
|
||||||
|
l_prev->next = l_next;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function for adding a new item to the head of the list.
|
||||||
|
*
|
||||||
|
* @param[in] new Pointer to a new element.
|
||||||
|
* @param[in] head Pointer to the list head.
|
||||||
|
*/
|
||||||
|
static inline void sys_list_add(sys_list_head_t * new, sys_list_head_t * head)
|
||||||
|
{
|
||||||
|
sys_ll_list_add(head, head->next, new);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function for adding a new item to the tail of the list.
|
||||||
|
*
|
||||||
|
* @param[in] new Pointer to a new element.
|
||||||
|
* @param[in] head Pointer to the list head.
|
||||||
|
*/
|
||||||
|
static inline void sys_list_add_tail(sys_list_head_t * new, sys_list_head_t * head)
|
||||||
|
{
|
||||||
|
sys_ll_list_add(head->prev, head, new);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function for deleting an entry from list.
|
||||||
|
*
|
||||||
|
* @param[in] entry The element to delete from the list.
|
||||||
|
*/
|
||||||
|
static inline void sys_list_del(sys_list_head_t * entry)
|
||||||
|
{
|
||||||
|
sys_ll_list_del(entry->next, entry->prev);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function for deleting an entry from the list and reinitializing it.
|
||||||
|
*
|
||||||
|
* @param[in] entry The element to delete from the list.
|
||||||
|
*/
|
||||||
|
static inline void sys_list_del_init(sys_list_head_t * entry)
|
||||||
|
{
|
||||||
|
sys_ll_list_del(entry->next, entry->prev);
|
||||||
|
INIT_LIST_HEAD(entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function for testing if a list is empty.
|
||||||
|
|
||||||
|
* @param[in] head The list to test.
|
||||||
|
* @return 0 if not empty, non-zero otherwise.
|
||||||
|
*/
|
||||||
|
static inline unsigned int sys_list_empty(sys_list_head_t * head)
|
||||||
|
{
|
||||||
|
return IS_EMPTY(head);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets a pointer to a variable to the parent structure pointer using a
|
||||||
|
* pointer to a field in this structure.
|
||||||
|
*
|
||||||
|
* @note This is a version of @ref GET_PARENT_BY_FIELD() extended by setting to a variable.
|
||||||
|
*
|
||||||
|
* @param[out] ll_ret_var Variable pointer name to return.
|
||||||
|
* @param[in] ll_ptr Pointer to the structure field.
|
||||||
|
* @param[in] ll_type Name of the parent structure.
|
||||||
|
* @param[in] ll_member Name of the structure field.
|
||||||
|
*/
|
||||||
|
#define SYS_LIST_ENTRY(ll_ret_var, ll_ptr, ll_type, ll_member) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
size_t p = (size_t) ll_ptr; \
|
||||||
|
size_t off = offsetof(ll_type, ll_member); \
|
||||||
|
ll_ret_var = (ll_type *) (p - off); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Iterates through the list.
|
||||||
|
* @note Use @ref SYS_LIST_FOR_EACH_SAFE() for thread-safe cases.
|
||||||
|
*
|
||||||
|
* @param[out] pos Iterator variable.
|
||||||
|
* @param[in] head Pointer to the list head.
|
||||||
|
*/
|
||||||
|
#define SYS_LIST_FOR_EACH(pos, head) \
|
||||||
|
for (pos = ((head)->next); \
|
||||||
|
((pos) != (head)); \
|
||||||
|
pos = (pos)->next)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Thread-safe version of @ref SYS_LIST_FOR_EACH().
|
||||||
|
*
|
||||||
|
* @param[out] ll_pos Iterator variable.
|
||||||
|
* @param[out] ll_pos_n Temporary iterator variable (next entry).
|
||||||
|
* @param[in] ll_head Pointer to the list head.
|
||||||
|
*/
|
||||||
|
#define SYS_LIST_FOR_EACH_SAFE(ll_pos, ll_pos_n, ll_head) \
|
||||||
|
for (ll_pos = (ll_head)->next, ll_pos_n = (ll_head)->next->next; \
|
||||||
|
(ll_pos) != (ll_head); \
|
||||||
|
ll_pos = ll_pos_n, ll_pos_n = ll_pos->next)
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif /* SYS_LIST_H_INCLUDED */
|
||||||
92
components/802_15_4/api/SysAL/sys_memory_manager.h
Normal file
92
components/802_15_4/api/SysAL/sys_memory_manager.h
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef SYS_MEMORY_MANAGER_H_INCLUDED
|
||||||
|
#define SYS_MEMORY_MANAGER_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* This file contains declarations of the Memory manager API.
|
||||||
|
*
|
||||||
|
* @defgroup sys_memory_manager Memory Manager API
|
||||||
|
* @ingroup sys_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare Memory Manager API.
|
||||||
|
* @details The Memory Manager module implements the standard API for allocating/freeing memory chunks. The module must
|
||||||
|
* be initialized by sys_mm_init() before a call to any alloc/free routines. The memory can be allocated by a
|
||||||
|
* call to sys_mm_alloc() and freed by a call to sys_mm_free(). Minimal chunk of memory to allocate is one byte,
|
||||||
|
* however the sys_mm_alloc() routine will allocate the number of bytes aligned to the length of the
|
||||||
|
* machine word (e.g. 4 bytes for 32-bit architectures). The module is implemented using the doubly linked
|
||||||
|
* lists API.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief Function for initializing the memory manager.
|
||||||
|
* @details Initialize the memory manager pool of the 'size' bytes length at 'p_start' address.
|
||||||
|
*
|
||||||
|
* @param p_start Pool start address.
|
||||||
|
* @param size Size of the pool in bytes.
|
||||||
|
*/
|
||||||
|
void sys_mm_init(void * p_start, size_t size);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for allocating memory in the pool.
|
||||||
|
* @details Search and allocate free memory resources.
|
||||||
|
*
|
||||||
|
* @param[in] size Size of the requested memory.
|
||||||
|
*
|
||||||
|
* @retval Pointer to allocated memory,
|
||||||
|
* NULL in case of error.
|
||||||
|
*/
|
||||||
|
void * sys_mm_alloc(size_t size);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for freeing the allocated memory.
|
||||||
|
*
|
||||||
|
* @param[in] p_addr Pointer to the memory to free.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void sys_mm_free(void * p_addr);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // SYS_MEMORY_MANAGER_H_INCLUDED
|
||||||
290
components/802_15_4/api/SysAL/sys_queue.h
Normal file
290
components/802_15_4/api/SysAL/sys_queue.h
Normal file
@ -0,0 +1,290 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef SYS_QUEUE_H_INCLUDED
|
||||||
|
#define SYS_QUEUE_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* This file contains declarations of the primitives to work with queues and necessary types.
|
||||||
|
*
|
||||||
|
* @defgroup sys_queues Queue API
|
||||||
|
* @ingroup sys_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare the queue API.
|
||||||
|
* @details The queue module implements a set of routines to deal with queues. Before
|
||||||
|
* any calls to its API are issued, a queue must be initialized using sys_queue_init(). The following routines
|
||||||
|
* return queue items from different parts of an initialized queue without removing it from the queue:
|
||||||
|
* sys_queue_front(), sys_queue_back(), sys_queue_next(), and sys_queue_at().
|
||||||
|
* The following routines insert elements to the queue: sys_queue_push_front(),
|
||||||
|
* sys_queue_push_back(), sys_queue_push_predicated(), sys_queue_push_predicated_force(), and sys_queue_insert().
|
||||||
|
* The following routines remove elements from the queue: sys_queue_pop_front(), sys_queue_remove(),
|
||||||
|
* sys_queue_remove_after(). These helper routines get information about a queue: sys_queue_size() and
|
||||||
|
* sys_queue_is_empty(). The module also supports an iterator macro implemented by SYS_QUEUE_FOR_EACH().
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief Queue item descriptor.
|
||||||
|
*
|
||||||
|
* @details In order to store any user data struct in a queue, the user struct should contain
|
||||||
|
* a field of type 'sys_queue_item_t'. This field may be at any offset.
|
||||||
|
* The user data item can be cast from the queue item,
|
||||||
|
* by the \ref GET_PARENT_BY_FIELD() macro from sys_utils.h.
|
||||||
|
*/
|
||||||
|
typedef struct sys_queue_item_s
|
||||||
|
{
|
||||||
|
struct sys_queue_item_s * next;
|
||||||
|
} sys_queue_item_t;
|
||||||
|
|
||||||
|
/**@brief Queue descriptor.
|
||||||
|
*/
|
||||||
|
typedef sys_queue_item_t sys_queue_t;
|
||||||
|
|
||||||
|
/**@brief Prototype of a predicate function for pushing an item into the queue.
|
||||||
|
*
|
||||||
|
* @details As a user of the queue library, implement the predicate function and pass it
|
||||||
|
* as a parameter to \ref sys_queue_push_predicated(). You can choose
|
||||||
|
* whether insertion of a new item should be done before the given existing item of
|
||||||
|
* the queue, or not.
|
||||||
|
*
|
||||||
|
* @param[in] p_before_item Pointer to the existing item before which a new item
|
||||||
|
* should be inserted.
|
||||||
|
* @param[in] p_new_item Pointer to the item to be inserted into the queue.
|
||||||
|
*
|
||||||
|
* @retval true Insertion is to be done before the given item, false otherwise.
|
||||||
|
*/
|
||||||
|
typedef bool (* sys_queue_push_predicate_t)(
|
||||||
|
sys_queue_item_t * p_before_item,
|
||||||
|
sys_queue_item_t * p_new_item);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for initializing the queue before any other usage of the queue.
|
||||||
|
*
|
||||||
|
* @details Initialize (reset) the queue to its initial state. The queue becomes empty.
|
||||||
|
*
|
||||||
|
* @param[in] p_queue Queue to be initialized.
|
||||||
|
*/
|
||||||
|
void sys_queue_init(sys_queue_t * p_queue);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for getting the front (head) item of the queue without removing it.
|
||||||
|
*
|
||||||
|
* @details Return a pointer to the item from the head of the queue but leave it in the queue.
|
||||||
|
*
|
||||||
|
* @param[in] p_queue Queue to get the item from.
|
||||||
|
*
|
||||||
|
* @retval Pointer to the head item of the queue, or NULL if the queue is empty.
|
||||||
|
*/
|
||||||
|
sys_queue_item_t * sys_queue_front(const sys_queue_t * p_queue);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for getting the back (tail) item of the queue without removing it.
|
||||||
|
*
|
||||||
|
* @details Return a pointer to the item from the tail of the queue but leave it in the queue.
|
||||||
|
*
|
||||||
|
* @param[in] p_queue Queue to get the item from.
|
||||||
|
*
|
||||||
|
* @retval Pointer to the tail item of the queue, or NULL if the queue is empty.
|
||||||
|
*/
|
||||||
|
sys_queue_item_t * sys_queue_back(const sys_queue_t * p_queue);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for getting the item, next to the given item of the queue.
|
||||||
|
*
|
||||||
|
* @details Return a pointer to the next item after the given one, or NULL if the
|
||||||
|
* given item is the last item of the queue.
|
||||||
|
*
|
||||||
|
* @param[in] p_queue Pointer to the queue.
|
||||||
|
* @param[in] p_item Pointer to the item.
|
||||||
|
*
|
||||||
|
* @retval Pointer to the next item after the given one, or NULL if the
|
||||||
|
* given item is the last item of the queue.
|
||||||
|
*/
|
||||||
|
sys_queue_item_t * sys_queue_next(const sys_queue_t * p_queue, const sys_queue_item_t * p_item);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for pushing an item to the front (head) of the queue.
|
||||||
|
*
|
||||||
|
* @details This function inserts an item to the head of the queue.
|
||||||
|
*
|
||||||
|
* @param[in] p_queue Queue to push the item to.
|
||||||
|
* @param[in] p_item Item to insert to the front of the queue.
|
||||||
|
*/
|
||||||
|
void sys_queue_push_front(sys_queue_t * p_queue, sys_queue_item_t * p_item);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for pushing an item to the back (tail) of the queue.
|
||||||
|
*
|
||||||
|
* @details This function inserts an item to the tail of the queue.
|
||||||
|
*
|
||||||
|
* @param[in] p_queue Queue to push the item to.
|
||||||
|
* @param[in] p_item Item to insert to the tail of the queue.
|
||||||
|
*/
|
||||||
|
void sys_queue_push_back(sys_queue_t * p_queue, sys_queue_item_t * p_item);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for pushing an item to the queue with a predicate.
|
||||||
|
*
|
||||||
|
* @details Conditionally push an item to the queue using the given predicate that tries to determine
|
||||||
|
* the insertion position.
|
||||||
|
*
|
||||||
|
* @param[in] p_queue Queue to push the item to.
|
||||||
|
* @param[in] p_item Item to be pushed.
|
||||||
|
* @param[in] predicate Predicate to be used to find the insertion position.
|
||||||
|
*
|
||||||
|
* @retval true The item was inserted into the queue, false otherwise.
|
||||||
|
*/
|
||||||
|
bool sys_queue_push_predicated(
|
||||||
|
sys_queue_t * p_queue,
|
||||||
|
sys_queue_item_t * p_item,
|
||||||
|
sys_queue_push_predicate_t predicate);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for pushing an item to the queue with a predicate forcing insertion to the tail if the predicate
|
||||||
|
* fails.
|
||||||
|
*
|
||||||
|
* @details Unconditionally push an item to the queue using the given predicate that tries to
|
||||||
|
* determine the insertion position.
|
||||||
|
* If predicate returns false, then force the insertion to the tail of the queue.
|
||||||
|
*
|
||||||
|
* @param[in] p_queue Queue to push item to.
|
||||||
|
* @param[in] p_item Item to be pushed.
|
||||||
|
* @param[in] predicate Predicate to be used to find the insertion position.
|
||||||
|
*/
|
||||||
|
void sys_queue_push_predicated_force(
|
||||||
|
sys_queue_t * p_queue,
|
||||||
|
sys_queue_item_t * p_item,
|
||||||
|
sys_queue_push_predicate_t predicate);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for getting and removing the front (head) item from the queue.
|
||||||
|
*
|
||||||
|
* @details Get an item from the head of the queue and remove it from the queue.
|
||||||
|
*
|
||||||
|
* @param[in] p_queue Queue to get and remove the head item from.
|
||||||
|
*
|
||||||
|
* @retval Pointer to the head item of queue or NULL if the queue is empty.
|
||||||
|
*/
|
||||||
|
sys_queue_item_t * sys_queue_pop_front(sys_queue_t * p_queue);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for removing an item from the queue.
|
||||||
|
*
|
||||||
|
* @details The given item will be removed from the queue.
|
||||||
|
*
|
||||||
|
* @note The complexity of this function is O(n). Use function \ref sys_queue_remove_after()
|
||||||
|
* whenever the previous item of the queue is known.
|
||||||
|
*
|
||||||
|
* @param[in] p_queue Queue to remove the item from.
|
||||||
|
* @param[in] p_item Item to remove from the queue.
|
||||||
|
*/
|
||||||
|
void sys_queue_remove(sys_queue_t * p_queue, sys_queue_item_t * p_item);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for removing the item after the given item from the queue.
|
||||||
|
*
|
||||||
|
* @details The item next to the given one will be removed from the queue.
|
||||||
|
*
|
||||||
|
* @param[in] p_queue Queue to remove the item from.
|
||||||
|
* @param[in] p_after_item Next to this item will be removed.
|
||||||
|
*/
|
||||||
|
void sys_queue_remove_after(sys_queue_t * p_queue, sys_queue_item_t * p_after_item);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for returning the current size of a queue, i.e. number of elements inside it.
|
||||||
|
*
|
||||||
|
* @details This function goes through the whole queue, so it is relatively slow.
|
||||||
|
*
|
||||||
|
* @param[in] p_queue Queue to work with.
|
||||||
|
*
|
||||||
|
* @retval Number of items currently inserted into the queue.
|
||||||
|
*/
|
||||||
|
uint8_t sys_queue_size(const sys_queue_t * p_queue);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for returning a pointer to the item inside a queue represented by an index.
|
||||||
|
*
|
||||||
|
* @details This function searches through the whole queue, so it is relatively slow.
|
||||||
|
*
|
||||||
|
* @param[in] p_queue Queue to work with.
|
||||||
|
* @param[in] index Requested index.
|
||||||
|
*
|
||||||
|
* @retval Pointer to the requested item or NULL if the queue size is less
|
||||||
|
* than \a index.
|
||||||
|
*/
|
||||||
|
sys_queue_item_t * sys_queue_at(const sys_queue_t * p_queue, const uint8_t index);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for inserting an item at the specified position represented by an index in the queue.
|
||||||
|
* If this position is too big, it is inserted to the tail of the queue.
|
||||||
|
*
|
||||||
|
* @details This function searches through the whole queue, so it is relatively slow.
|
||||||
|
*
|
||||||
|
* @param[in] p_queue Queue to insert to.
|
||||||
|
* @param[in] p_item Item to be inserted.
|
||||||
|
* @param[in] pos Position inside the queue (0 is the front).
|
||||||
|
*/
|
||||||
|
void sys_queue_insert(sys_queue_t * p_queue, sys_queue_item_t * p_item, const uint8_t pos);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for determining if a queue is empty.
|
||||||
|
*
|
||||||
|
* @param[in] p_queue Queue to be checked.
|
||||||
|
*
|
||||||
|
* @retval True if queue is empty, false otherwise.
|
||||||
|
*/
|
||||||
|
bool sys_queue_is_empty(const sys_queue_t * p_queue);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Macro for iterating through all items in the queue.
|
||||||
|
*
|
||||||
|
* @param[in] p_queue Pointer to the queue (sys_queue_t *).
|
||||||
|
* @param[in] p_iterator Variable to be used as an iterator (sys_queue_item_t *).
|
||||||
|
*/
|
||||||
|
#define SYS_QUEUE_FOR_EACH(p_queue, p_iterator) \
|
||||||
|
for (sys_queue_item_t * p_iterator = sys_queue_front(p_queue); \
|
||||||
|
p_iterator != NULL; \
|
||||||
|
p_iterator = sys_queue_next(p_queue, p_iterator))
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // SYS_QUEUE_H_INCLUDED
|
||||||
202
components/802_15_4/api/SysAL/sys_ringbuffer.h
Normal file
202
components/802_15_4/api/SysAL/sys_ringbuffer.h
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef SYS_RINGBUFFER_H_INCLUDED
|
||||||
|
#define SYS_RINGBUFFER_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* This file contains declarations of the Ring buffer routines and necessary types. Please note that
|
||||||
|
* each ring buffer element should have size of 1 byte.
|
||||||
|
*
|
||||||
|
* @defgroup sys_ringbuffer System Ring buffer API
|
||||||
|
* @ingroup sys_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module for declaring System Ring buffer API.
|
||||||
|
* @details The Ring Buffer module implements routines to deal with the ring buffer. The following routines are supported:
|
||||||
|
* sys_ringbuffer_insert(), sys_ringbuffer_remove() to operate with single element. The
|
||||||
|
* sys_ringbuffer_remove_multiple() can be used to remove (read) several elements at once. The
|
||||||
|
* sys_ringbuffer_clear(), sys_ringbuffer_init(), and sys_ringbuffer_init_over() functions are used to clean up and
|
||||||
|
* initialize the ring buffer. Some information about the initialized ring buffer is available via the
|
||||||
|
* following routines: sys_ringbuffer_size_get() to get the number of used elements, sys_ringbuffer_chunk_get()
|
||||||
|
* to return the biggest, available to read, continuous chunk of elements, sys_ringbuffer_is_empty() and
|
||||||
|
* sys_ringbuffer_is_full() to check if the ring buffer is empty/full, and sys_ringbuffer_max_size_get() to get
|
||||||
|
* the ring buffer capacity. One of the samples for ring buffer usage is the UART implementation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** This structure holds all necessary information about a ring buffer. It is intentionally left undocumented
|
||||||
|
* by Doxygen.
|
||||||
|
*
|
||||||
|
* All these fields are private and must NOT be changed by the user.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
size_t write_index;
|
||||||
|
size_t read_index;
|
||||||
|
uint8_t * array;
|
||||||
|
size_t size;
|
||||||
|
bool is_full;
|
||||||
|
} sys_ringbuffer_t;
|
||||||
|
|
||||||
|
/** @brief Function for initializing an empty ring buffer over passed memory.
|
||||||
|
*
|
||||||
|
* @param[inout] buffer Instance of sys_ringbuffer_t that will be initialized.
|
||||||
|
* @param[in] memory Start address of the memory region used as a ring buffer.
|
||||||
|
* @param[in] length Size in bytes of the memory region used as a ring buffer.
|
||||||
|
*/
|
||||||
|
void sys_ringbuffer_init(sys_ringbuffer_t * buffer,
|
||||||
|
const void * memory,
|
||||||
|
const size_t length);
|
||||||
|
|
||||||
|
/** @brief Function for initializing a ring buffer over passed memory and marking all
|
||||||
|
* pre_init_length elements as inserted.
|
||||||
|
*
|
||||||
|
* @details This function may be used to initialize a buffer with some
|
||||||
|
* pre-initialized data in it. Passed memory region is interpreted by this function
|
||||||
|
* as an already filled (partly or fully) ring buffer so that \a pre_init_length
|
||||||
|
* elements are marked as inserted.
|
||||||
|
*
|
||||||
|
* @param[inout] buffer Instance of sys_ringbuffer_t that will be initialized.
|
||||||
|
* @param[in] memory Start address of the memory region used as a ring buffer.
|
||||||
|
* @param[in] pre_init_length Number of elements (bytes) that had already been in \a memory.
|
||||||
|
* They would be inserted into the newly-initialized ring buffer in a FIFO manner.
|
||||||
|
* @param[in] length Size of the memory region used as a ring buffer.
|
||||||
|
*/
|
||||||
|
void sys_ringbuffer_init_over(sys_ringbuffer_t * buffer,
|
||||||
|
const void * memory,
|
||||||
|
const size_t pre_init_length,
|
||||||
|
const size_t length);
|
||||||
|
|
||||||
|
/** @brief Function for removing an element from a ring buffer and returning it.
|
||||||
|
*
|
||||||
|
* @param[inout] buf Instance of @c sys_ringbuffer_t.
|
||||||
|
*
|
||||||
|
* @return Value of the removed element.
|
||||||
|
*
|
||||||
|
* @warning This buffer has no underflow control except assert.
|
||||||
|
*/
|
||||||
|
uint8_t sys_ringbuffer_remove(sys_ringbuffer_t * buf);
|
||||||
|
|
||||||
|
/** @brief Function for quickly removing up to chunk_size elements from a ring buffer
|
||||||
|
* and marking those elements as available in the ring buffer.
|
||||||
|
*
|
||||||
|
* @param[inout] buffer Instance of @c sys_ringbuffer_t.
|
||||||
|
* @param[in] chunk_size Number of elements to release.
|
||||||
|
*/
|
||||||
|
void sys_ringbuffer_remove_multiple(sys_ringbuffer_t * buffer,
|
||||||
|
const size_t chunk_size);
|
||||||
|
|
||||||
|
/** @brief Function for inserting a new element into a ring buffer.
|
||||||
|
*
|
||||||
|
* @param[inout] buffer Instance of @c sys_ringbuffer_t.
|
||||||
|
* @param[in] data Element value to insert.
|
||||||
|
*
|
||||||
|
* @warning In case of overflow, this buffer will overwrite the oldest
|
||||||
|
* element and the number of available elements will remain unchanged.
|
||||||
|
*/
|
||||||
|
void sys_ringbuffer_insert(sys_ringbuffer_t * buffer, const uint8_t data);
|
||||||
|
|
||||||
|
/** @brief Function for clearing an instance of \a sys_ringbuffer_t, making it empty.
|
||||||
|
*
|
||||||
|
* @param[inout] buffer Instance of @c sys_ringbuffer_t.
|
||||||
|
*/
|
||||||
|
void sys_ringbuffer_clear(sys_ringbuffer_t * buffer);
|
||||||
|
|
||||||
|
/** @brief Function for returning the number of used elements in a ring buffer instance.
|
||||||
|
*
|
||||||
|
* @param[inout] buf Instance of sys_ringbuffer_t.
|
||||||
|
*
|
||||||
|
* @return Number of elements.
|
||||||
|
*/
|
||||||
|
size_t sys_ringbuffer_size_get(const sys_ringbuffer_t * buf);
|
||||||
|
|
||||||
|
/** @brief Function for returning the biggest, available to read, continuous chunk from a ring buffer array.
|
||||||
|
*
|
||||||
|
* @param[inout] buffer Instance of @c sys_ringbuffer_t.
|
||||||
|
* @param[out] chunk Pointer to a memory chunk removed from the ring buffer.
|
||||||
|
* @param[out] chunk_size Size of the removed chunk.
|
||||||
|
*
|
||||||
|
* @warning The returned chunk is still part of the ring buffer. To make the chunk elements available
|
||||||
|
* for write, call @c sys_ringbuffer_remove_multiple() after the chunk is processed.
|
||||||
|
*/
|
||||||
|
void sys_ringbuffer_chunk_get(sys_ringbuffer_t * buffer,
|
||||||
|
void ** chunk,
|
||||||
|
size_t * chunk_size);
|
||||||
|
|
||||||
|
/** @brief Function for checking whether a ring buffer is empty.
|
||||||
|
*
|
||||||
|
* @param[inout] buf Instance of @c sys_ringbuffer_t.
|
||||||
|
*
|
||||||
|
* @return True if the ring buffer is empty.
|
||||||
|
*/
|
||||||
|
static inline bool sys_ringbuffer_is_empty(const sys_ringbuffer_t * buf)
|
||||||
|
{
|
||||||
|
return ((buf->write_index == buf->read_index) && (!buf->is_full));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @brief Function for checking whether a ring buffer is full.
|
||||||
|
*
|
||||||
|
* @param[inout] buf Instance of @c sys_ringbuffer_t.
|
||||||
|
*
|
||||||
|
* @return True if number of items in the buffer equals to (length - 1).
|
||||||
|
*/
|
||||||
|
static inline bool sys_ringbuffer_is_full(const sys_ringbuffer_t * buf)
|
||||||
|
{
|
||||||
|
return buf->is_full;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @brief Function for returning number of elements that can be potentially put into the buffer.
|
||||||
|
*
|
||||||
|
* @param[inout] buf Instance of @c sys_ringbuffer_t.
|
||||||
|
*
|
||||||
|
* @return Number of elements.
|
||||||
|
*/
|
||||||
|
static inline size_t sys_ringbuffer_max_size_get(const sys_ringbuffer_t * buf)
|
||||||
|
{
|
||||||
|
return buf->size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif /* SYS_RINGBUFFER_H_INCLUDED */
|
||||||
142
components/802_15_4/api/SysAL/sys_slab_allocator.h
Normal file
142
components/802_15_4/api/SysAL/sys_slab_allocator.h
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef SYS_SLAB_ALLOCATOR_H_INCLUDED
|
||||||
|
#define SYS_SLAB_ALLOCATOR_H_INCLUDED
|
||||||
|
|
||||||
|
#include "phy_pd_data.h"
|
||||||
|
|
||||||
|
#ifndef CONFIG_SLAB_FRAME_POOL_SIZE
|
||||||
|
#define CONFIG_SLAB_FRAME_POOL_SIZE 4
|
||||||
|
#warning "CONFIG_SLAB_FRAME_POOL_SIZE not set in .config, using default"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* This file contains declarations of the SLAB allocator API.
|
||||||
|
*
|
||||||
|
* @defgroup sys_slab_allocator SLAB Allocator API
|
||||||
|
* @ingroup sys_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module for declaring the SLAB Allocator API
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief The SLAB allocator buffer type (free or busy buffer).
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
SYS_SLAB_FREE_BUFFER, /**< The buffer is free */
|
||||||
|
SYS_SLAB_BUSY_BUFFER, /**< The buffer is busy */
|
||||||
|
} sys_slab_buffer_type_t;
|
||||||
|
|
||||||
|
/**@brief Initializes the SLAB allocator.
|
||||||
|
*
|
||||||
|
* @details Preallocates the frame pool
|
||||||
|
*/
|
||||||
|
void sys_sa_init(void);
|
||||||
|
|
||||||
|
/**@brief Resets the SLAB allocator.
|
||||||
|
*
|
||||||
|
* @details Clear allocated the frame pools
|
||||||
|
*/
|
||||||
|
void sys_sa_reset(void);
|
||||||
|
|
||||||
|
/**@brief Inserts item into one of the queues of the SLAB allocator.
|
||||||
|
*
|
||||||
|
* @details This function is used to put the item into the SLAB allocator
|
||||||
|
* queue. Type of buffer shall be chosen.
|
||||||
|
*
|
||||||
|
* @param[in] type Type of an inserted buffer (free or busy).
|
||||||
|
* @param[in] p_item Pointer to an inserted buffer.
|
||||||
|
*/
|
||||||
|
void sys_sa_buffer_put(sys_slab_buffer_type_t type, pd_data_ind_t * p_item);
|
||||||
|
|
||||||
|
/**@brief Gets item from one of the queues of the SLAB allocator.
|
||||||
|
*
|
||||||
|
* @details This function is used to get the item from the SLAB allocator
|
||||||
|
* queues. Type of buffer shall be chosen. The buffer is deleted
|
||||||
|
* from the SLAB allocator
|
||||||
|
*
|
||||||
|
* @param[in] type Type of a gotten buffer (free or busy).
|
||||||
|
*
|
||||||
|
* @retval Pointer to a gotten buffer in case of success. NULL otherwise.
|
||||||
|
*/
|
||||||
|
pd_data_ind_t * sys_sa_buffer_get(sys_slab_buffer_type_t type);
|
||||||
|
|
||||||
|
/**@brief Deletes an allocated item from the heap.
|
||||||
|
*
|
||||||
|
* @details This function is used to delete allocated by SLAB allocator buffer
|
||||||
|
* from the heap. Pointer to a frame memory of an allocated item shall be used.
|
||||||
|
*
|
||||||
|
* @param[in] p_frame Pointer to a frame memory of an allocated item.
|
||||||
|
*/
|
||||||
|
void sys_sa_buffer_free(uint8_t * p_frame);
|
||||||
|
|
||||||
|
/**@brief Returns buffer back to queue of free buffers.
|
||||||
|
*
|
||||||
|
* @details This function is used to return allocated buffer back to the queue
|
||||||
|
* without allocation and deallocation.
|
||||||
|
*
|
||||||
|
* @param[in] p_item Pointer to an allocated item.
|
||||||
|
*/
|
||||||
|
void sys_sa_buffer_release(pd_data_ind_t * p_item);
|
||||||
|
|
||||||
|
/**@brief Allocates memory for the queue of free buffers.
|
||||||
|
*
|
||||||
|
* @details This function is used to allocate buffer from heap
|
||||||
|
* and put them into the queue
|
||||||
|
*
|
||||||
|
* @retval True in case of success. False otherwise.
|
||||||
|
*/
|
||||||
|
bool sys_sa_memory_allocate(void);
|
||||||
|
|
||||||
|
/**@brief Checks if there are any buffers in the SLAB allocator queue or not.
|
||||||
|
*
|
||||||
|
* @details Type of checked buffers shall be passed.
|
||||||
|
*
|
||||||
|
* @param[in] type Type of an checked buffers (free or busy).
|
||||||
|
*
|
||||||
|
* @retval True in case of absence of buffers. False otherwise.
|
||||||
|
*/
|
||||||
|
bool sys_sa_is_empty(sys_slab_buffer_type_t type);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif /* SYS_SLAB_ALLOCATOR_H_INCLUDED */
|
||||||
155
components/802_15_4/api/SysAL/sys_sleep.h
Normal file
155
components/802_15_4/api/SysAL/sys_sleep.h
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef SYS_SLEEP_H_INCLUDED
|
||||||
|
#define SYS_SLEEP_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "sys_events.h"
|
||||||
|
#include "hal_sleep.h"
|
||||||
|
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
*
|
||||||
|
* @defgroup sys_sleep Falling Asleep API
|
||||||
|
* @ingroup sys_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module for declaring the Falling Asleep API.
|
||||||
|
* @details Because additional preparation may be required to be done by user modules,
|
||||||
|
* prior to putting hardware into the sleep mode, a notification and approval mechanism
|
||||||
|
* is provided to the user.
|
||||||
|
* Each module that wants to be notified about the "falling asleep" event, has to subscribe
|
||||||
|
* to the HAL_EVENT_FALLING_ASLEEP event, using sys_sleep_approver_register(), and to
|
||||||
|
* get the unique approver's ID value.
|
||||||
|
* In the handler of the HAL_EVENT_FALLING_ASLEEP event, the module is able to perform
|
||||||
|
* the required preparation before falling asleep, and to approve the falling asleep request,
|
||||||
|
* using the module unique approver ID, after all preparation to sleep is finished.
|
||||||
|
* The hardware will fall asleep only after all the registered approvers
|
||||||
|
* approve the fall asleep request.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief Approver ID typedef.
|
||||||
|
*/
|
||||||
|
typedef uint8_t sys_sleep_approver_id_t;
|
||||||
|
|
||||||
|
|
||||||
|
/* Sanity check for CONFIG_MAX_SLEEP_APPROVERS
|
||||||
|
*/
|
||||||
|
#if (!defined(CONFIG_MAX_SLEEP_APPROVERS))
|
||||||
|
# error "CONFIG_MAX_SLEEP_APPROVERS must be defined in config file"
|
||||||
|
#elif (CONFIG_MAX_SLEEP_APPROVERS >= 256)
|
||||||
|
# error "CONFIG_MAX_SLEEP_APPROVERS must be less than 256"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for initializing the system sleep module.
|
||||||
|
*
|
||||||
|
* @details This function must be called before any usage of the System Sleep module.
|
||||||
|
*/
|
||||||
|
void sys_sleep_init(void);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for registering the approver of the system sleep request.
|
||||||
|
*
|
||||||
|
* @details After the sleep approver is registered with this function, the hardware will
|
||||||
|
* not fall asleep without its approval.
|
||||||
|
*
|
||||||
|
* @param[in] p_event_falling_asleep Event descriptor, which will handle
|
||||||
|
* the SYS_EVENT_FALLING_ASLEEP event.
|
||||||
|
* @param[in] p_event_wake_up Event descriptor, which will handle
|
||||||
|
* the SYS_EVENT_WAKE_UP event.
|
||||||
|
*
|
||||||
|
* @retval The unique approver ID, reserved for this newly-registered approver.
|
||||||
|
* This ID will be required to approve system sleep requests by this approver module.
|
||||||
|
*/
|
||||||
|
sys_sleep_approver_id_t sys_sleep_approver_register(
|
||||||
|
sys_event_desc_t * p_event_falling_asleep,
|
||||||
|
sys_event_desc_t * p_event_wake_up);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for unregistering the approver of the system sleep request.
|
||||||
|
*
|
||||||
|
* @details After the approver is unregistered, its approval will not be
|
||||||
|
* required to put the system into sleep mode.
|
||||||
|
*
|
||||||
|
* @param[in] approver_id The unique approver ID to be unregistered.
|
||||||
|
* @param[in] p_event_falling_asleep Event descriptor to unsubscribe from
|
||||||
|
* the SYS_EVENT_FALLING_ASLEEP event.
|
||||||
|
* @param[in] p_event_wake_up Event descriptor to unsubscribe from
|
||||||
|
* the SYS_EVENT_WAKE_UP event.
|
||||||
|
*/
|
||||||
|
void sys_sleep_approver_unregister(
|
||||||
|
sys_sleep_approver_id_t approver_id,
|
||||||
|
sys_event_desc_t * p_event_falling_asleep,
|
||||||
|
sys_event_desc_t * p_event_wake_up);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for approving the system sleep request.
|
||||||
|
*
|
||||||
|
* @details This function is to be called by the registered approver
|
||||||
|
* in order to approve putting the system into the sleep mode.
|
||||||
|
*
|
||||||
|
* @param[in] approver_id The unique approver ID.
|
||||||
|
*/
|
||||||
|
void sys_sleep_approve(sys_sleep_approver_id_t approver_id);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for requesting the system to safely enter into sleep mode.
|
||||||
|
*
|
||||||
|
* @details This function notifies all the registered sleep approvers with the
|
||||||
|
* HAL_EVENT_FALLING_ASLEEP event, allowing them to perform all the needed preparation
|
||||||
|
* before the hardware falls asleep. The hardware will enter sleep mode only after
|
||||||
|
* all registered approvers approve the fall asleep request.
|
||||||
|
*
|
||||||
|
* @param[in] sleep_time_ms Defines sleep time in ms.
|
||||||
|
*/
|
||||||
|
void sys_sleep_request_ms(uint32_t sleep_time_ms);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for getting information about the wakeup reason.
|
||||||
|
*
|
||||||
|
* @retval hal_wakeup_reason Interrupt source which was the wakeup reason.
|
||||||
|
*/
|
||||||
|
hal_wakeup_reason_t sys_sleep_wakeup_reason(void);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // SYS_SLEEP_H_INCLUDED
|
||||||
121
components/802_15_4/api/SysAL/sys_task_scheduler.h
Normal file
121
components/802_15_4/api/SysAL/sys_task_scheduler.h
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef SYS_TASK_SCHEDULER_H_INCLUDED
|
||||||
|
#define SYS_TASK_SCHEDULER_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "sys_utils.h"
|
||||||
|
#include "hal_atomic.h"
|
||||||
|
#include "sys_events.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* @defgroup sys_task_scheduler Task scheduler
|
||||||
|
* @ingroup sys_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module for task scheduling.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief Identificators for registered handlers.
|
||||||
|
*
|
||||||
|
* Handlers will be called from the task scheduler.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
PHY_TASK_ID,
|
||||||
|
HAL_TASK_ID,
|
||||||
|
#if (CONFIG_HIGHEST_LAYER_PHY == 0)
|
||||||
|
MAC_TASK_ID,
|
||||||
|
#endif
|
||||||
|
APP_TASK_ID,
|
||||||
|
SYS_TASK_ID,
|
||||||
|
SYS_TASKS_AMOUNT
|
||||||
|
} sys_task_ids_t;
|
||||||
|
|
||||||
|
/**@brief Prototype of a task handler.
|
||||||
|
*
|
||||||
|
* @details Handler which will be called by the scheduler.
|
||||||
|
*/
|
||||||
|
typedef void (* sys_task_handler_t)(void);
|
||||||
|
|
||||||
|
/**@brief Pending tasks.
|
||||||
|
*
|
||||||
|
* @details Variable which includes markers of pending tasks.
|
||||||
|
*/
|
||||||
|
extern volatile uint_fast16_t g_tasks;
|
||||||
|
|
||||||
|
/**@brief Notify task scheduler to add a task for execution.
|
||||||
|
*
|
||||||
|
* @details The function sets a marker for the task for execution.
|
||||||
|
* The task handler implements a tree architecture.
|
||||||
|
* Task handler of each layer includes handlers of the layer's components.
|
||||||
|
*
|
||||||
|
* @param[in] task_id Task identificator.
|
||||||
|
*/
|
||||||
|
static inline void sys_task_post(sys_task_ids_t task_id)
|
||||||
|
{
|
||||||
|
atomic_t atomic = 0;
|
||||||
|
|
||||||
|
hal_atomic_start(&atomic);
|
||||||
|
g_tasks |= BIT(task_id);
|
||||||
|
#if (CONFIG_USE_SYS_TASK_NOTIFIER == 1)
|
||||||
|
sys_event_post(SYS_EVENT_NEW_TASK, NULL);
|
||||||
|
#endif
|
||||||
|
hal_atomic_end(&atomic);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@brief Returns true, if there are any event flags awaiting in the system scheduler.
|
||||||
|
*/
|
||||||
|
static inline bool sys_tasks_pending(void)
|
||||||
|
{
|
||||||
|
return g_tasks != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@brief Handle tasks in the main function.
|
||||||
|
*
|
||||||
|
* @details Handle tasks in the main function.
|
||||||
|
*/
|
||||||
|
void sys_task_run(void);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // SYS_TASK_SCHEDULER_H_INCLUDED
|
||||||
180
components/802_15_4/api/SysAL/sys_time.h
Normal file
180
components/802_15_4/api/SysAL/sys_time.h
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef SYS_TIME_H_INCLUDED
|
||||||
|
#define SYS_TIME_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "sys_queue.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* This file contains declarations of the primitives to work with Time (timers) and necessary types.
|
||||||
|
*
|
||||||
|
* @defgroup sys_time Time API
|
||||||
|
* @ingroup sys_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module for declaring Time API.
|
||||||
|
* @details The system time module implements some routines to deal with time (timers). The timer can be started by
|
||||||
|
* sys_timer_start(), stopped by sys_timer_stop(), and adjusted after sleep by sys_timer_adjust(). Some
|
||||||
|
* information can be acquired by sys_timer_is_started() and sys_time_get(). The correct API for implementing hardware
|
||||||
|
* delays is sys_time_delay_us(). Note that the module must be initialized by sys_timers_init() which
|
||||||
|
* is done by sys_init().
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief Unsigned type of system time.
|
||||||
|
*/
|
||||||
|
typedef uint64_t sys_time_t;
|
||||||
|
|
||||||
|
/**@brief Signed type of system time.
|
||||||
|
*/
|
||||||
|
typedef int64_t sys_signed_time_t;
|
||||||
|
|
||||||
|
/**@brief Prototype of the user-defined timer callback.
|
||||||
|
*
|
||||||
|
* @param p_data Pointer to the data, specific for this callback.
|
||||||
|
*/
|
||||||
|
typedef void (* sys_timer_callback_t)(void * p_data);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief System timer type (one-shot or periodic timer).
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
SYS_TIMER_ONESHOT, /**< The timer is Oneshot */
|
||||||
|
SYS_TIMER_PERIODIC /**< The timer is Periodic */
|
||||||
|
} sys_timer_type_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Timer descriptor.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** Service field. */
|
||||||
|
sys_queue_item_t item;
|
||||||
|
|
||||||
|
/** Service field. */
|
||||||
|
sys_time_t absolute_time;
|
||||||
|
|
||||||
|
/** Relevant time moment, at which this timer is programmed to be triggered,
|
||||||
|
* measured in microseconds.
|
||||||
|
*/
|
||||||
|
sys_time_t interval;
|
||||||
|
|
||||||
|
/** Periodic or one-shot timer.
|
||||||
|
*
|
||||||
|
* @details If type is set to SYS_TIMER_PERIODIC, the timer will restart automatically
|
||||||
|
* with the same period.
|
||||||
|
*/
|
||||||
|
sys_timer_type_t type;
|
||||||
|
|
||||||
|
/** Timer callback function.
|
||||||
|
*
|
||||||
|
* @details This function is to be called, when this timer triggers.
|
||||||
|
*/
|
||||||
|
sys_timer_callback_t callback;
|
||||||
|
|
||||||
|
/** Timer callback parameter.
|
||||||
|
*
|
||||||
|
* @details This pointer is to be passed to the timer callback function.
|
||||||
|
*/
|
||||||
|
void * p_data;
|
||||||
|
} sys_timer_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for initializing the timers module.
|
||||||
|
*/
|
||||||
|
void sys_timers_init(void);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for starting the timer.
|
||||||
|
*
|
||||||
|
* @details See the description of \ref sys_timer_t fields for the details
|
||||||
|
* on how to program the timer.
|
||||||
|
*
|
||||||
|
* @param[in] p_timer Pointer to a valid timer descriptor, which is filled by the user,
|
||||||
|
* according to \ref sys_timer_t fields description.
|
||||||
|
*/
|
||||||
|
void sys_timer_start(sys_timer_t * p_timer);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for stopping the timer.
|
||||||
|
*
|
||||||
|
* @details This function is used to stop the timer, which was started earlier.
|
||||||
|
* After this function is called, the timer will not fire.
|
||||||
|
*
|
||||||
|
* @param[in] p_timer Pointer to a valid timer descriptor.
|
||||||
|
*/
|
||||||
|
void sys_timer_stop(sys_timer_t * p_timer);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for checking if input timer has been started.
|
||||||
|
*
|
||||||
|
* @param[in] p_timer Pointer to a timer.
|
||||||
|
*
|
||||||
|
* @retval true p_timer has been started and has not been stopped yet.
|
||||||
|
* @retval false p_timer has never been started or already timed out.
|
||||||
|
*/
|
||||||
|
bool sys_timer_is_started(sys_timer_t * p_timer);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for getting the current system time.
|
||||||
|
*
|
||||||
|
* @retval The current system timer counter value in microseconds.
|
||||||
|
*/
|
||||||
|
sys_time_t sys_time_get(void);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for implementing a delay for short hardware delays.
|
||||||
|
*
|
||||||
|
* @warning Interrupts are NOT disabled inside this function.
|
||||||
|
*
|
||||||
|
* @param[in] delay_us Number of microseconds to delay.
|
||||||
|
*/
|
||||||
|
void sys_time_delay_us(uint32_t delay_us);
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Function for executing expired timers after sleep.
|
||||||
|
*/
|
||||||
|
void sys_timer_adjust(void);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif // SYS_TIME_H_INCLUDED
|
||||||
541
components/802_15_4/api/SysAL/sys_utils.h
Normal file
541
components/802_15_4/api/SysAL/sys_utils.h
Normal file
@ -0,0 +1,541 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef SYS_UTILS_H_INCLUDED
|
||||||
|
#define SYS_UTILS_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <string.h>
|
||||||
|
#if (defined(__GNUC__) && !defined(__SES_ARM))
|
||||||
|
#include <strings.h>
|
||||||
|
#endif
|
||||||
|
#ifdef __MINGW32__
|
||||||
|
#define ffs __builtin_ffs
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* This file contains definitions of useful macros and types.
|
||||||
|
*
|
||||||
|
* @defgroup sys_utils System Utilities API
|
||||||
|
* @ingroup sys_15_4
|
||||||
|
* @{
|
||||||
|
* @brief Module to declare System Utilities API.
|
||||||
|
* @details The System Utilities module implements multiple useful macros and inlines for the whole stack. Including
|
||||||
|
* this header you will get access to GET_PARENT_BY_FIELD(), FIELD_SIZE() to work with complex structures,
|
||||||
|
* ARRAY_SIZE() for arrays, mathematics macros like IMP(), LL_MIN(), LL_MAX(), CEIL(), ROUND(), Bitmap helpers
|
||||||
|
* and many others. The variable arguments support macros are also defined here. Some SWAP routines are implemented
|
||||||
|
* by this module as well.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**@brief Returns the pointer to the data structure
|
||||||
|
*
|
||||||
|
* @param[in] struct_type name of the parent structure
|
||||||
|
* @param[in] field_name name of the structure field
|
||||||
|
* @param[in] field_pointer pointer to the structure field
|
||||||
|
*
|
||||||
|
* @retval Pointer to the parent structure which includes the field.
|
||||||
|
*/
|
||||||
|
#define GET_PARENT_BY_FIELD(struct_type, field_name, field_pointer) \
|
||||||
|
((struct_type*)(void*)(((uint8_t*)field_pointer) - offsetof(struct_type, field_name)))
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Returns the implication of two given expressions x and y.
|
||||||
|
* @details The implication means: if X==TRUE then Y==TRUE.
|
||||||
|
* The formula is: (X imp Y) = ((not X) or Y)
|
||||||
|
*/
|
||||||
|
#define IMP(x, y) ( !(x) || (y) )
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Returns the minimum of two given expressions x and y.
|
||||||
|
*/
|
||||||
|
#define LL_MIN(x, y) ( ((x) < (y)) ? (x) : (y) )
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Returns the maximum of two given expressions x and y.
|
||||||
|
*/
|
||||||
|
#define LL_MAX(x, y) ( ((x) > (y)) ? (x) : (y) )
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Returns the quotient of a divided by b rounded upwards to the nearest
|
||||||
|
* integer.
|
||||||
|
*/
|
||||||
|
#define CEIL(a, b) ((a) ? (((a) - 1U) / (b) + 1U) : 0U)
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Returns the quotient of a divided by b rounded to the nearest integer
|
||||||
|
* according to the standard arithmetic rules: if the fractional part of (a/b) is greater
|
||||||
|
* or equal to 0.5 then the result is rounded upwards; if the fractional part of (a/b) is
|
||||||
|
* less then 0.5 the result is rounded downwards.
|
||||||
|
*
|
||||||
|
* @note Use this formula only for unsigned arguments. The formula is not compatible with
|
||||||
|
* the signed arguments: when a and b have different signs it gives incorrect result.
|
||||||
|
*/
|
||||||
|
#define ROUND(a, b) ( ((a) + ((b) >> 1)) / (b) )
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Declares a long bitmap named name of size bits. The size is rounded
|
||||||
|
* upwards to come a multiple of 8.
|
||||||
|
*/
|
||||||
|
#define BITMAP_DECLARE(name, size) uint8_t name[CEIL(size, 8)]
|
||||||
|
|
||||||
|
/**@brief Clears all bits in given bitmap.
|
||||||
|
*/
|
||||||
|
#define BITMAP_RESET(name) memset((name), 0U, sizeof(name))
|
||||||
|
|
||||||
|
/**@brief Returns the value of a bit at position bit in the long bitmap named name.
|
||||||
|
*/
|
||||||
|
#define BITMAP_ISSET(name, bit) ( 0 != ((name)[(bit) >> 3] & (1 << ((bit) & 0x7))) )
|
||||||
|
|
||||||
|
/**@brief Sets the bit at position bit in the long bitmap named name.
|
||||||
|
*/
|
||||||
|
#define BITMAP_SET(name, bit) (name)[(bit) >> 3] |= (1 << ((bit) & 0x7))
|
||||||
|
|
||||||
|
/**@brief Clears the bit at position bit in the long bitmap named name.
|
||||||
|
*/
|
||||||
|
#define BITMAP_CLR(name, bit) (name)[(bit) >> 3] &= ~(1 << ((bit) & 0x7))
|
||||||
|
|
||||||
|
/**@brief Assigns the given bitmap with the second bitmap.
|
||||||
|
*/
|
||||||
|
#define BITMAP_ASSIGN(nameDst, nameSrc) memcpy((nameDst), (nameSrc), sizeof(nameDst))
|
||||||
|
|
||||||
|
/**@brief Compares two bitmaps and returns zero if they are equal.
|
||||||
|
*/
|
||||||
|
#define BITMAP_EQUAL(name1, name2) ((sizeof(name1) == sizeof(name2)) && \
|
||||||
|
(memcmp((name1), (name2), sizeof(name1)) == 0))
|
||||||
|
|
||||||
|
/**@brief Checks number. Return true if number is power of two.
|
||||||
|
*/
|
||||||
|
#define LL_IS_POWER_OF_TWO(name) ((0 != (name)) && (0 == ((name)&(name - 1))))
|
||||||
|
|
||||||
|
/**@brief Return True if mask is fully included into a given set and False otherwise
|
||||||
|
*/
|
||||||
|
#define IS_SUBSET_OF(mask, set) ((mask) == ((set) & (mask)))
|
||||||
|
|
||||||
|
/**@brief Creates a bit mask with single set bit on the specified position.
|
||||||
|
*/
|
||||||
|
#define BIT(pos) (1UL << (pos))
|
||||||
|
|
||||||
|
/**@brief Gets the given bit in the given value
|
||||||
|
*/
|
||||||
|
#define BIT_GET(val, pos) ((((uint32_t)val) & BIT(pos)) != 0)
|
||||||
|
|
||||||
|
/**@brief Sets or clears the given bit in the given value
|
||||||
|
*/
|
||||||
|
#define BIT_SET(val, pos, bit) { \
|
||||||
|
if (bit) \
|
||||||
|
{ \
|
||||||
|
val |= BIT(pos); \
|
||||||
|
} \
|
||||||
|
else \
|
||||||
|
{ \
|
||||||
|
val &= ~BIT(pos); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@brief Returns two to the income power.*/
|
||||||
|
#define POWER2(n) (1ULL << (n))
|
||||||
|
|
||||||
|
/**@brief Creates a bit mask of specified length.
|
||||||
|
*/
|
||||||
|
#define BIT_MASK(len) (BIT(len) - 1UL)
|
||||||
|
|
||||||
|
/**@brief Creates a bit field mask of specified length and start position.
|
||||||
|
*/
|
||||||
|
#define BIT_FIELD_MASK(start, len) (BIT_MASK(len) << (start))
|
||||||
|
|
||||||
|
/**@brief Creates a bit field mask of specified length, start position and value.
|
||||||
|
*/
|
||||||
|
#define BIT_FIELD_VALUE(value, start, len) (((value) & BIT_MASK(len)) << (start))
|
||||||
|
|
||||||
|
/**@brief Extracts a bit field value of specified start position and length.
|
||||||
|
*/
|
||||||
|
#define GET_BITFIELD_VALUE(bitmask, start, len) (((bitmask) >> (start)) & BIT_MASK(len))
|
||||||
|
|
||||||
|
/**@brief Inserts a bit field value with specified start position and length.
|
||||||
|
*/
|
||||||
|
#define SET_BITFIELD_VALUE(bitmask, start, len, value) \
|
||||||
|
(bitmask = (bitmask & ~BIT_FIELD_MASK(start, len)) | BIT_FIELD_VALUE(value, start, len))
|
||||||
|
|
||||||
|
/**@brief Extracts a mask from a BITMAP.
|
||||||
|
* BITMAP MUST be aligned and mask length MUST be one of 2, 4, 8, 16, 32.
|
||||||
|
*/
|
||||||
|
#define BITMAP_MASK_GET(bitmap, bit, len) \
|
||||||
|
GET_BITFIELD_VALUE(((uint32_t*)(bitmap))[(bit) >> 5], (bit) & 0x1F, len)
|
||||||
|
|
||||||
|
/**@brief Sets up a mask to a BITMAP.
|
||||||
|
* BITMAP MUST be aligned and mask length MUST be one of 2, 4, 8, 16, 32.
|
||||||
|
*/
|
||||||
|
#define BITMAP_MASK_SET(bitmap, bit, len, value) \
|
||||||
|
SET_BITFIELD_VALUE(((uint32_t*)(bitmap))[(bit) >> 5], (bit) & 0x1F, len, value)
|
||||||
|
|
||||||
|
/**@brief Gets amount of the arguments.
|
||||||
|
*/
|
||||||
|
#define VA_NARGS(...) VA_NARGS_EVAL(__VA_ARGS__)
|
||||||
|
#define VA_NARGS_EVAL(...) VA_NARGS_IMPL(__VA_ARGS__, \
|
||||||
|
/* 255, 254, */ 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240, \
|
||||||
|
239, 238, 237, 236, 235, 234, 233, 232, 231, 230, 229, 228, 227, 226, 225, 224, \
|
||||||
|
223, 222, 221, 220, 219, 218, 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, \
|
||||||
|
207, 206, 205, 204, 203, 202, 201, 200, 199, 198, 197, 196, 195, 194, 193, 192, \
|
||||||
|
191, 190, 189, 188, 187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176, \
|
||||||
|
175, 174, 173, 172, 171, 170, 169, 168, 167, 166, 165, 164, 163, 162, 161, 160, \
|
||||||
|
159, 158, 157, 156, 155, 154, 153, 152, 151, 150, 149, 148, 147, 146, 145, 144, \
|
||||||
|
143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129, 128, \
|
||||||
|
127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, 115, 114, 113, 112, \
|
||||||
|
111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97, 96, \
|
||||||
|
095, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, \
|
||||||
|
079, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, \
|
||||||
|
063, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, \
|
||||||
|
047, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, \
|
||||||
|
031, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, \
|
||||||
|
015, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
|
||||||
|
|
||||||
|
/**@brief Helper macro. Gets amount of the arguments.
|
||||||
|
*/
|
||||||
|
#define VA_NARGS_IMPL(_________1, _2, _3, _4, _5, _6, _7, \
|
||||||
|
_8, _9, _10, _11, _12, _13, _14, _15, \
|
||||||
|
__16, _17, _18, _19, _20, _21, _22, _23, \
|
||||||
|
_24, _25, _26, _27, _28, _29, _30, _31, \
|
||||||
|
__32, _33, _34, _35, _36, _37, _38, _39, \
|
||||||
|
_40, _41, _42, _43, _44, _45, _46, _47, \
|
||||||
|
__48, _49, _50, _51, _52, _53, _54, _55, \
|
||||||
|
_56, _57, _58, _59, _60, _61, _62, _63, \
|
||||||
|
__64, _65, _66, _67, _68, _69, _70, _71, \
|
||||||
|
_72, _73, _74, _75, _76, _77, _78, _79, \
|
||||||
|
__80, _81, _82, _83, _84, _85, _86, _87, \
|
||||||
|
_88, _89, _90, _91, _92, _93, _94, _95, \
|
||||||
|
__96, _97, _98, _99, _100, _101, _102, _103, \
|
||||||
|
_104, _105, _106, _107, _108, _109, _110, _111, \
|
||||||
|
_112, _113, _114, _115, _116, _117, _118, _119, \
|
||||||
|
_120, _121, _122, _123, _124, _125, _126, _127, \
|
||||||
|
_128, _129, _130, _131, _132, _133, _134, _135, \
|
||||||
|
_136, _137, _138, _139, _140, _141, _142, _143, \
|
||||||
|
_144, _145, _146, _147, _148, _149, _150, _151, \
|
||||||
|
_152, _153, _154, _155, _156, _157, _158, _159, \
|
||||||
|
_160, _161, _162, _163, _164, _165, _166, _167, \
|
||||||
|
_168, _169, _170, _171, _172, _173, _174, _175, \
|
||||||
|
_176, _177, _178, _179, _180, _181, _182, _183, \
|
||||||
|
_184, _185, _186, _187, _188, _189, _190, _191, \
|
||||||
|
_192, _193, _194, _195, _196, _197, _198, _199, \
|
||||||
|
_200, _201, _202, _203, _204, _205, _206, _207, \
|
||||||
|
_208, _209, _210, _211, _212, _213, _214, _215, \
|
||||||
|
_216, _217, _218, _219, _220, _221, _222, _223, \
|
||||||
|
_224, _225, _226, _227, _228, _229, _230, _231, \
|
||||||
|
_232, _233, _234, _235, _236, _237, _238, _239, \
|
||||||
|
_240, _241, _242, _243, _244, _245, _246, _247, \
|
||||||
|
_248, _249, _250, _251, _252, _253, /* _254, _255, */\
|
||||||
|
N, ...) N
|
||||||
|
|
||||||
|
/**@brief Gets amount of the arguments. Execute by compiler.
|
||||||
|
*/
|
||||||
|
#define VA_NARGS_COMPILE_TIME(...) ((uint8_t)(sizeof((uint8_t[]){ __VA_ARGS__ })/sizeof(uint8_t)))
|
||||||
|
|
||||||
|
/**@brief Swaps values.
|
||||||
|
*/
|
||||||
|
#define SWAP_XOR(a, b) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
(((b) ^= (a) ^= (b), (a) ^= (b))); \
|
||||||
|
} while(0);
|
||||||
|
|
||||||
|
/**@brief Compare two number and take care of overflow threshold limit.
|
||||||
|
*/
|
||||||
|
#define COMPARE_WITH_THRESHOLD(a, b, threshold) \
|
||||||
|
(((LL_MAX((a), (b)) - LL_MIN((a), (b))) < (threshold)) ? ((a) >= (b) ? 1 : 0) : ((a) > (b) ? 0 : 1))
|
||||||
|
|
||||||
|
|
||||||
|
#define ROUND_MASK(a) ((a) - 1)
|
||||||
|
#define ROUND_UP(x, a) (((x) + ROUND_MASK(a)) & ~ROUND_MASK(a))
|
||||||
|
#define ROUND_DOWN(x, a) ((x) & ~ROUND_MASK(a))
|
||||||
|
|
||||||
|
/**@brief Dereferences input pointer \a y as a type \a x.
|
||||||
|
*
|
||||||
|
* @param[in] x type name.
|
||||||
|
* @param[in] y pointer name.
|
||||||
|
*/
|
||||||
|
#define DEREF_VOID_PTR_AS(x, y) (*(x *)y)
|
||||||
|
|
||||||
|
/**@brief Extends some bit value to the left extending 2's complement value
|
||||||
|
* to 8-bit length.
|
||||||
|
*
|
||||||
|
* @param[out] result variable, where result is store to.
|
||||||
|
* @param[in] x input value.
|
||||||
|
* @param[in] sign_pos an integer in range 2..6 specifying bit position of sign bit.
|
||||||
|
*/
|
||||||
|
#define SIGN_EXTENSION(result, x, sign_pos) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
result = x & (1 << sign_pos) ? \
|
||||||
|
x | (~((1 << (sign_pos + 1)) - 1)) : \
|
||||||
|
x & ((1 << (sign_pos + 1)) - 1); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**@brief Clears some most significant bits of integer value reducing it precision.
|
||||||
|
* Name and interface of the macro emphasizes complementary action to #SIGN_EXTENSION.
|
||||||
|
*
|
||||||
|
* @param[out] result variable, where result is store to.
|
||||||
|
* @param[in] x input value.
|
||||||
|
* @param[in] sign_pos an integer in range 2..6 specifying bit position of sign bit.
|
||||||
|
*/
|
||||||
|
#define SIGN_COMPRESSION(result, x, sign_pos) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
result = x & ((1 << (sign_pos + 1)) - 1); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/************************* PROTOTYPES **************************************************/
|
||||||
|
/**@brief Swaps values of two bytes.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static inline void SWAP8(uint8_t * const x, uint8_t * const y)
|
||||||
|
{
|
||||||
|
uint8_t _x = *x;
|
||||||
|
*x = *y;
|
||||||
|
*y = _x;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@brief Swaps values of two double words (DWORD).
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static inline void SWAP32(uint32_t * const x, uint32_t * const y)
|
||||||
|
{
|
||||||
|
uint32_t _x = *x;
|
||||||
|
*x = *y;
|
||||||
|
*y = _x;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@brief Swaps values of two arrays.
|
||||||
|
*
|
||||||
|
* @param[inout] x array pointer
|
||||||
|
* @param[inout] y array pointer
|
||||||
|
* @param[in] length amount of bytes to swap
|
||||||
|
*/
|
||||||
|
static inline void SWAP_ARRAYS(void * x, void * y, uint32_t length)
|
||||||
|
{
|
||||||
|
uint8_t *_x = (uint8_t *)(void *)x;
|
||||||
|
uint8_t *_y = (uint8_t *)(void *)y;
|
||||||
|
if (0x0 == ((((size_t)_x) | ((size_t)_y)) & 0x3))
|
||||||
|
{
|
||||||
|
size_t len4 = length / sizeof(uint32_t);
|
||||||
|
for (size_t i = 0; i < len4; i++)
|
||||||
|
{
|
||||||
|
SWAP32((uint32_t*)_x, (uint32_t*)_y);
|
||||||
|
_x += sizeof(uint32_t);
|
||||||
|
_y += sizeof(uint32_t);
|
||||||
|
}
|
||||||
|
length &= 0x3;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = 0; i < length; i++)
|
||||||
|
{
|
||||||
|
SWAP8(_x, _y);
|
||||||
|
_x++;
|
||||||
|
_y++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**@brief Find the first bit of the bitmap with the given value
|
||||||
|
* (one or zero, as specified).
|
||||||
|
*
|
||||||
|
* @param[in] p_bitmap Pointer to bitmap.
|
||||||
|
* @param[in] bitmap_size Number of bits in the bitmap.
|
||||||
|
* @param[in] bit_value The bit value to find (one or zero).
|
||||||
|
*
|
||||||
|
* @retval Bit position of the bit with specified value, or bitmap_size if no such bit
|
||||||
|
* was found.
|
||||||
|
*/
|
||||||
|
static inline size_t bitmap_find_bit(uint8_t * p_bitmap, size_t bitmap_size, uint8_t bit_value)
|
||||||
|
{
|
||||||
|
#if (defined(__GNUC__) && !defined(__SES_ARM))
|
||||||
|
if (bitmap_size <= 32)
|
||||||
|
{
|
||||||
|
uint32_t bitmap;
|
||||||
|
memcpy(&bitmap, p_bitmap, sizeof(uint32_t));
|
||||||
|
if (!bit_value)
|
||||||
|
{
|
||||||
|
bitmap ^= 0xFFFFFFFF;
|
||||||
|
}
|
||||||
|
size_t result = ffs(bitmap);
|
||||||
|
if (result == 0 || result > bitmap_size)
|
||||||
|
{
|
||||||
|
return bitmap_size;
|
||||||
|
}
|
||||||
|
// built-in ffs implementation gives ffs(1) = 1, not 0
|
||||||
|
return result - 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < bitmap_size; i++)
|
||||||
|
{
|
||||||
|
if (BITMAP_ISSET(p_bitmap, i) == bit_value)
|
||||||
|
{
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return bitmap_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@brief Reverse the elements of array
|
||||||
|
*
|
||||||
|
* @param[in] ptr Pointer to array.
|
||||||
|
* @param[in] len Length of array.
|
||||||
|
*/
|
||||||
|
static inline void array_reverse(uint8_t * ptr, size_t len)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < len/2; i++)
|
||||||
|
{
|
||||||
|
SWAP_XOR(ptr[i], ptr[len - 1 - i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@brief Returns least significant byte of word.
|
||||||
|
*/
|
||||||
|
#define LSB_WORD(x) ((uint8_t)(x & 0xFF))
|
||||||
|
|
||||||
|
/**@brief Returns least significant byte of halfword.
|
||||||
|
*/
|
||||||
|
#define LSB_HWORD(x) LSB_WORD(x)
|
||||||
|
|
||||||
|
/**@brief Returns most significant byte of halfword.
|
||||||
|
*/
|
||||||
|
#define MSB_HWORD(x) ((uint8_t)(x >> 8))
|
||||||
|
|
||||||
|
#define ALIGN_VALUE (sizeof(size_t))
|
||||||
|
|
||||||
|
/**@brief Compiler-independent definitions.
|
||||||
|
*/
|
||||||
|
#if defined ( __CC_ARM )
|
||||||
|
|
||||||
|
#ifndef __WEAK
|
||||||
|
#define __WEAK __weak
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef PACK
|
||||||
|
#define PACK __attribute__ ((packed))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef BEGIN_PACK
|
||||||
|
#define BEGIN_PACK
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef END_PACK
|
||||||
|
#define END_PACK
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __ALIGN
|
||||||
|
#define __ALIGN(n) __align(n)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __ICCARM__ )
|
||||||
|
|
||||||
|
#ifndef __WEAK
|
||||||
|
#define __WEAK __weak
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef PACK
|
||||||
|
#define PACK
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef BEGIN_PACK
|
||||||
|
#define BEGIN_PACK _Pragma("pack(push, 1)")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef END_PACK
|
||||||
|
#define END_PACK _Pragma("pack(pop)")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __ALIGN
|
||||||
|
#define __ALIGN(n)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __GNUC__ )
|
||||||
|
|
||||||
|
#ifndef __WEAK
|
||||||
|
#define __WEAK __attribute__((weak))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef PACK
|
||||||
|
#define PACK __attribute__ ((packed))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef BEGIN_PACK
|
||||||
|
#define BEGIN_PACK _Pragma("pack(push,1)")
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef END_PACK
|
||||||
|
#define END_PACK _Pragma("pack(pop)")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __ALIGN
|
||||||
|
#define __ALIGN(n) __attribute__((aligned(n)))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __TASKING__ )
|
||||||
|
|
||||||
|
#ifndef __WEAK
|
||||||
|
#define __WEAK __attribute__((weak))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef PACK
|
||||||
|
#define PACK __attribute__ ((packed))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef BEGIN_PACK
|
||||||
|
#define BEGIN_PACK
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef END_PACK
|
||||||
|
#define END_PACK
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __ALIGN
|
||||||
|
#define __ALIGN(n) __align(n)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif /* SYS_UTILS_H_INCLUDED */
|
||||||
110
components/802_15_4/raw/802_15_4_config.h
Normal file
110
components/802_15_4/raw/802_15_4_config.h
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
*
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
* such product, must reproduce the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 4. This software, with or without modification, must only be used with a
|
||||||
|
* Nordic Semiconductor ASA integrated circuit.
|
||||||
|
*
|
||||||
|
* 5. Any software provided in binary form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef STACK_802_15_4_CONFIG_H__
|
||||||
|
#define STACK_802_15_4_CONFIG_H__
|
||||||
|
|
||||||
|
#define CONFIG_DEBUG 1
|
||||||
|
#define CONFIG_MM_DEBUG 1
|
||||||
|
#define CONFIG_TEST_CHANNEL 15
|
||||||
|
#define CONFIG_TEST_CHANNEL_MASK (1 << CONFIG_TEST_CHANNEL)
|
||||||
|
#define CONFIG_BEACON_ENABLED 1
|
||||||
|
#define CONFIG_FFD_DEVICE 1
|
||||||
|
#define CONFIG_RXE_ENABLED 1
|
||||||
|
#define CONFIG_GTS_ENABLED 1
|
||||||
|
#define CONFIG_SYNC_REQ_ENABLED 1
|
||||||
|
#define CONFIG_ASSOCIATE_IND_ENABLED 1
|
||||||
|
#define CONFIG_ORPHAN_ENABLED 1
|
||||||
|
#define CONFIG_START_ENABLED 1
|
||||||
|
#define CONFIG_ED_SCAN_ENABLED 1
|
||||||
|
#define CONFIG_ACTIVE_SCAN_ENABLED 1
|
||||||
|
#define CONFIG_PURGE_ENABLED 1
|
||||||
|
#define CONFIG_PANID_CONFLICT_RESOLUTION_ENABLED 1
|
||||||
|
#define CONFIG_ASSOCIATION_REQ_CMD_RX_ENABLED 1
|
||||||
|
#define CONFIG_ASSOCIATION_REQ_CMD_TX_ENABLED 1
|
||||||
|
#define CONFIG_ASSOCIATION_RESP_CMD_RX_ENABLED 1
|
||||||
|
#define CONFIG_ASSOCIATION_RESP_CMD_TX_ENABLED 1
|
||||||
|
#define CONFIG_DISASSOCIATION_NTF_CMD_RX_ENABLED 1
|
||||||
|
#define CONFIG_DISASSOCIATION_NTF_CMD_TX_ENABLED 1
|
||||||
|
#define CONFIG_DATA_REQ_CMD_RX_ENABLED 1
|
||||||
|
#define CONFIG_DATA_REQ_CMD_TX_ENABLED 1
|
||||||
|
#define CONFIG_PAN_CONFLICT_NTF_CMD_RX_ENABLED 1
|
||||||
|
#define CONFIG_PAN_CONFLICT_NTF_CMD_TX_ENABLED 1
|
||||||
|
#define CONFIG_ORPHAN_NTF_CMD_RX_ENABLED 1
|
||||||
|
#define CONFIG_ORPHAN_NTF_CMD_TX_ENABLED 1
|
||||||
|
#define CONFIG_BEACON_REQ_CMD_RX_ENABLED 1
|
||||||
|
#define CONFIG_BEACON_REQ_CMD_TX_ENABLED 1
|
||||||
|
#define CONFIG_COORD_REALIGN_CMD_RX_ENABLED 1
|
||||||
|
#define CONFIG_COORD_REALIGN_CMD_TX_ENABLED 1
|
||||||
|
#define CONFIG_GTS_REQ_CMD_RX_ENABLED 1
|
||||||
|
#define CONFIG_GTS_REQ_CMD_TX_ENABLED 1
|
||||||
|
#define CONFIG_INDIRECT_ENGINE_ENABLED 1
|
||||||
|
#define CONFIG_ASSOCIATE_REQ_ENABLED 1
|
||||||
|
#define CONFIG_DISASSOCIATE_ENABLED 1
|
||||||
|
#define CONFIG_PANID_CONFLICT_ENABLED 1
|
||||||
|
#define CONFIG_SYNC_ENABLED 1
|
||||||
|
#define CONFIG_NONE_ADDR_SUPPORT_ENABLED 1
|
||||||
|
#define CONFIG_PASSIVE_ORPHAN_SCAN_ENABLED 1
|
||||||
|
#define CONFIG_PROMISCUOUS_MODE_ENABLED 1
|
||||||
|
#define CONFIG_USE_SYS_TASK_NOTIFIER 1
|
||||||
|
#define CONFIG_POOL_SIZE 0x2000
|
||||||
|
#define CONFIG_SLAB_FRAME_POOL_SIZE 4
|
||||||
|
#define CONFIG_MEMORY_POLLING_INTERVAL_MS 10
|
||||||
|
#define CONFIG_MAX_SLEEP_APPROVERS 32
|
||||||
|
#define CONFIG_HAL_UART_CHANNELS 1
|
||||||
|
#define CONFIG_MAC_KEY_TABLE_SIZE 8
|
||||||
|
#define CONFIG_MAC_DEVICE_TABLE_SIZE 8
|
||||||
|
#define CONFIG_MAC_SECURITY_LEVEL_TABLE_SIZE 8
|
||||||
|
#define CONFIG_MAC_KEY_ID_LOOKUP_LIST_SIZE 8
|
||||||
|
#define CONFIG_MAC_KEY_DEVICE_LIST_SIZE 8
|
||||||
|
#define CONFIG_MAC_KEY_USAGE_LIST_SIZE 8
|
||||||
|
#define CONFIG_IEEE_ADDRESS 0x0123456789ABCDEFULL
|
||||||
|
#define CONFIG_BEACON_RX_TIME 5000
|
||||||
|
#define CONFIG_TEST_SUBTREE_MAC 1
|
||||||
|
#define CONFIG_TEST_SUBTREE_TST 1
|
||||||
|
#define CONFIG_COAP_TICK_INTERVAL_US 500000
|
||||||
|
#define CONFIG_COAP_MM_SMALL_BLOCK_COUNT 32
|
||||||
|
#define CONFIG_COAP_MM_MEDIUM_BLOCK_COUNT 32
|
||||||
|
#define CONFIG_COAP_MM_LARGE_BLOCK_COUNT 32
|
||||||
|
#define CONFIG_COAP_MESSAGE_QUEUE_SIZE 32
|
||||||
|
|
||||||
|
#endif // STACK_802_15_4_CONFIG_H__
|
||||||
|
|
||||||
BIN
components/802_15_4/raw/802_15_4_lib_keil.lib
Normal file
BIN
components/802_15_4/raw/802_15_4_lib_keil.lib
Normal file
Binary file not shown.
38
components/802_15_4/raw/license.txt
Normal file
38
components/802_15_4/raw/license.txt
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
|
||||||
|
|
||||||
|
All Rights Reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
2. Redistributions in binary form, except as embedded into a Nordic
|
||||||
|
Semiconductor ASA integrated circuit in a product or a software update for
|
||||||
|
such product, must reproduce the above copyright notice, this list of
|
||||||
|
conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived from this
|
||||||
|
software without specific prior written permission.
|
||||||
|
|
||||||
|
4. This software, with or without modification, must only be used with a
|
||||||
|
Nordic Semiconductor ASA integrated circuit.
|
||||||
|
|
||||||
|
5. Any software provided in binary form under this license must not be reverse
|
||||||
|
engineered, decompiled, modified and/or disassembled.
|
||||||
|
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||||
|
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||||
|
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user