parent
018b69cdc8
commit
11ccc7496e
@ -0,0 +1,208 @@ |
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> |
||||
<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40"><head> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> |
||||
|
||||
|
||||
<link rel="File-List" href="Library_files/filelist.xml"> |
||||
|
||||
|
||||
<link rel="Edit-Time-Data" href="Library_files/editdata.mso"><!--[if !mso]> <style> v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} </style> <![endif]--><title>Release Notes for SX1272 component</title><!--[if gte mso 9]><xml> <o:DocumentProperties> <o:Author>STMicroelectronics</o:Author> <o:LastAuthor>STMicroelectronics</o:LastAuthor> <o:Revision>37</o:Revision> <o:TotalTime>136</o:TotalTime> <o:Created>2009-02-27T19:26:00Z</o:Created> <o:LastSaved>2009-03-01T17:56:00Z</o:LastSaved> <o:Pages>1</o:Pages> <o:Words>522</o:Words> <o:Characters>2977</o:Characters> <o:Company>STMicroelectronics</o:Company> <o:Lines>24</o:Lines> <o:Paragraphs>6</o:Paragraphs> <o:CharactersWithSpaces>3493</o:CharactersWithSpaces> <o:Version>11.6568</o:Version> </o:DocumentProperties> </xml><![endif]--><!--[if gte mso 9]><xml> <w:WordDocument> <w:Zoom>110</w:Zoom> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<style> |
||||
<!-- |
||||
/* Style Definitions */ |
||||
p.MsoNormal, li.MsoNormal, div.MsoNormal |
||||
{mso-style-parent:""; |
||||
margin:0in; |
||||
margin-bottom:.0001pt; |
||||
mso-pagination:widow-orphan; |
||||
font-size:12.0pt; |
||||
font-family:"Times New Roman"; |
||||
mso-fareast-font-family:"Times New Roman";} |
||||
h2 |
||||
{mso-style-next:Normal; |
||||
margin-top:12.0pt; |
||||
margin-right:0in; |
||||
margin-bottom:3.0pt; |
||||
margin-left:0in; |
||||
mso-pagination:widow-orphan; |
||||
page-break-after:avoid; |
||||
mso-outline-level:2; |
||||
font-size:14.0pt; |
||||
font-family:Arial; |
||||
font-weight:bold; |
||||
font-style:italic;} |
||||
a:link, span.MsoHyperlink |
||||
{color:blue; |
||||
text-decoration:underline; |
||||
text-underline:single;} |
||||
a:visited, span.MsoHyperlinkFollowed |
||||
{color:blue; |
||||
text-decoration:underline; |
||||
text-underline:single;} |
||||
p |
||||
{mso-margin-top-alt:auto; |
||||
margin-right:0in; |
||||
mso-margin-bottom-alt:auto; |
||||
margin-left:0in; |
||||
mso-pagination:widow-orphan; |
||||
font-size:12.0pt; |
||||
font-family:"Times New Roman"; |
||||
mso-fareast-font-family:"Times New Roman";} |
||||
@page Section1 |
||||
{size:8.5in 11.0in; |
||||
margin:1.0in 1.25in 1.0in 1.25in; |
||||
mso-header-margin:.5in; |
||||
mso-footer-margin:.5in; |
||||
mso-paper-source:0;} |
||||
div.Section1 |
||||
{page:Section1;} |
||||
--> |
||||
</style><!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0in 5.4pt 0in 5.4pt; mso-para-margin:0in; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} </style> <![endif]--><!--[if gte mso 9]><xml> <o:shapedefaults v:ext="edit" spidmax="5122"/> </xml><![endif]--><!--[if gte mso 9]><xml> <o:shapelayout v:ext="edit"> <o:idmap v:ext="edit" data="1"/> </o:shapelayout></xml><![endif]--> |
||||
<meta content="MCD Application Team" name="author"></head> |
||||
<body link="blue" vlink="blue"> |
||||
<div class="Section1"> |
||||
<p class="MsoNormal"><span style="font-family: Arial;"><o:p><br> |
||||
</o:p></span></p> |
||||
<div align="center"> |
||||
<table class="MsoNormalTable" style="width: 675pt;" border="0" cellpadding="0" cellspacing="0" width="900"> |
||||
<tbody> |
||||
<tr> |
||||
<td style="padding: 0cm;" valign="top"> |
||||
<table class="MsoNormalTable" style="width: 675pt;" border="0" cellpadding="0" cellspacing="0" width="900"> |
||||
<tbody> |
||||
<tr style=""> |
||||
<td style="padding: 1.5pt;"> |
||||
<h1 style="margin-bottom: 18pt; text-align: center;" align="center"><span style="font-size: 20pt; font-family: Verdana; color: rgb(51, 102, 255);">Release |
||||
Notes for SX1272 component</span><span style="font-size: 20pt; font-family: Verdana;"><o:p></o:p></span></h1> |
||||
<p class="MsoNormal" style="text-align: center;" align="center"><span style="font-size: 10pt; font-family: Arial; color: black;">Copyright |
||||
2017 STMicroelectronics</span><span style="color: black;"><u1:p></u1:p><o:p></o:p></span></p> |
||||
<p class="MsoNormal" style="text-align: center;" align="center"><span style="font-size: 10pt; font-family: Arial; color: black;"><img alt="" id="_x0000_i1025" src="../../../../_htmresc/st_logo.png" style="border: 0px solid ; width: 86px; height: 65px;"></span><span style="font-size: 10pt;"><o:p></o:p></span></p> |
||||
</td> |
||||
</tr> |
||||
</tbody> |
||||
</table> |
||||
<p class="MsoNormal"><span style="font-family: Arial; display: none;"><o:p> </o:p></span></p> |
||||
<table class="MsoNormalTable" style="width: 675pt;" border="0" cellpadding="0" width="900"> |
||||
<tbody> |
||||
<tr style=""> |
||||
|
||||
<span style="font-family: "Times New Roman";"></span> |
||||
<h3 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; margin-right: 500pt; width: 200px;"> |
||||
<span style="font-size: 10pt; font-family: Arial; color: white;">V1.0.1 / 08-September-2017</span> |
||||
</h3> |
||||
<p class="MsoNormal" style="margin: 4.5pt 0cm 4.5pt 18pt;"> |
||||
<b style=""> |
||||
<u> |
||||
<span style="font-size: 10pt; font-family: Verdana; color: black;">Main Changes<o:p></o:p> |
||||
</span> |
||||
</u> |
||||
</b> |
||||
</p> |
||||
|
||||
<ul style="margin-top: 0cm;" type="square"> |
||||
<li class="MsoNormal"> |
||||
<span style="font-size: 10pt; font-family: Verdana;">Retrieve Public Network handling in the radio driver |
||||
<span style="font-weight: bold; font-style: italic;"> |
||||
</span> |
||||
</span> |
||||
</li> |
||||
<li class="MsoNormal"> |
||||
<span style="font-size: 10pt; font-family: Verdana;">Carrier Sense update |
||||
<span style="font-weight: bold; font-style: italic;"> |
||||
</span> |
||||
</span> |
||||
</li> |
||||
<li class="MsoNormal"> |
||||
<span style="font-size: 10pt; font-family: Verdana;">Modem selection update |
||||
<span style="font-weight: bold; font-style: italic;"> |
||||
</span> |
||||
</span> |
||||
</li> |
||||
</ul> |
||||
|
||||
<span style="font-family: "Times New Roman";"></span> |
||||
<h3 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; margin-right: 500pt; width: 200px;"> |
||||
<span style="font-size: 10pt; font-family: Arial; color: white;">V1.0.0 / 01-June-2017</span> |
||||
</h3> |
||||
<p class="MsoNormal" style="margin: 4.5pt 0cm 4.5pt 18pt;"> |
||||
<b style=""> |
||||
<u> |
||||
<span style="font-size: 10pt; font-family: Verdana; color: black;">Main Changes<o:p></o:p> |
||||
</span> |
||||
</u> |
||||
</b> |
||||
</p> |
||||
|
||||
<ul style="margin-top: 0cm;" type="square"> |
||||
<li class="MsoNormal"> |
||||
<span style="font-size: 10pt; font-family: Verdana;">First Release |
||||
<span style="font-weight: bold; font-style: italic;"> |
||||
</span> |
||||
</span> |
||||
</li> |
||||
</ul> |
||||
<span style="font-size: 10pt; font-family: Verdana;"> </span> |
||||
<h2 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;"> |
||||
<a name="License"></a> |
||||
<span style="font-size: 12pt; color: white;">License<o:p></o:p> |
||||
</span> |
||||
</h2> |
||||
<div style="text-align: justify;"> |
||||
<div style="text-align: justify;"><font size="-1"> |
||||
<span style="font-family: "Verdana","sans-serif";"> |
||||
Redistribution and use in source and binary forms, with or without |
||||
modification, are permitted provided that the following conditions are |
||||
met: |
||||
</span> |
||||
<br> |
||||
</font> |
||||
<ol><li><font size="-1"><span style="font-family: "Verdana","sans-serif";">Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.</span><span style="font-family: "Verdana","sans-serif";"></span></font></li><li><font size="-1"><span style="font-family: "Verdana","sans-serif";">Redistributions |
||||
in binary form must reproduce the above copyright notice, this list of |
||||
conditions and the following disclaimer in </span><span style="font-family: "Verdana","sans-serif";">the documentation and/or other materials provided with the distribution.</span><span style="font-family: "Verdana","sans-serif";"></span></font></li><li><font size="-1"><span style="font-family: "Verdana","sans-serif";">Neither the name of STMicroelectronics nor the names of its contributors may be used to endorse or promote products derived |
||||
</span><span style="font-family: "Verdana","sans-serif";">from this software without specific prior written permission.</span><br> |
||||
</font> |
||||
</li></ol> |
||||
<font size="-1"> |
||||
|
||||
<span style="font-family: "Verdana","sans-serif";">THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED</span><span style="font-family: "Verdana","sans-serif";"> WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A </span><span style="font-family: "Verdana","sans-serif";">PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY </span><span style="font-family: "Verdana","sans-serif";">DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, </span><span style="font-family: "Verdana","sans-serif";">PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER</span><span style="font-family: "Verdana","sans-serif";"> CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR </span><span style="font-family: "Verdana","sans-serif";">OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span></font> |
||||
|
||||
</div> |
||||
<span style="font-family: "Verdana","sans-serif";"></span></div> |
||||
<span style="font-size: 10pt; font-family: "Verdana","sans-serif"; color: black;"></span> <b><span style="font-size: 10pt; font-family: Verdana; color: black;"></span></b> |
||||
|
||||
<div class="MsoNormal" style="text-align: center;" align="center"><span style="color: black;"> |
||||
<hr align="center" size="2" width="100%"></span></div> |
||||
<p class="MsoNormal" style="margin: 4.5pt 0cm 4.5pt 18pt; text-align: center;" align="center"><span style="font-size: 10pt; font-family: Verdana; color: black;">For |
||||
complete documentation on </span><span style="font-size: 10pt; font-family: Verdana;">STM32<span style="color: black;"> Microcontrollers |
||||
visit </span><u><span style="color: blue;"><a href="http://www.st.com/internet/mcu/class/1734.jsp" target="_blank">www.st.com/STM32</a></span></u></span><span style="font-size: 10pt; font-family: Verdana;"><a target="_blank" href="http://www.st.com/internet/mcu/family/141.jsp"><u><span style="color: blue;"></span></u></a></span><span style="font-size: 10pt; font-family: Verdana;"><u><span style="color: blue;"></span></u></span><span style="color: black;"><o:p></o:p></span></p> |
||||
</td> |
||||
</tr> |
||||
</tbody> |
||||
</table> |
||||
<p class="MsoNormal"><span style="font-size: 10pt;"><o:p></o:p></span></p> |
||||
</td> |
||||
</tr> |
||||
</tbody> |
||||
</table> |
||||
</div> |
||||
<p class="MsoNormal"><o:p> </o:p></p> |
||||
</div> |
||||
|
||||
</body></html> |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,523 @@ |
||||
/*
|
||||
/ _____) _ | | |
||||
( (____ _____ ____ _| |_ _____ ____| |__ |
||||
\____ \| ___ | (_ _) ___ |/ ___) _ \
|
||||
_____) ) ____| | | || |_| ____( (___| | | | |
||||
(______/|_____)_|_|_| \__)_____)\____)_| |_| |
||||
(C)2013 Semtech |
||||
|
||||
Description: Generic SX1272 driver implementation |
||||
|
||||
License: Revised BSD License, see LICENSE.TXT file include in the project |
||||
|
||||
Maintainer: Miguel Luis and Gregory Cristian |
||||
*/ |
||||
/*******************************************************************************
|
||||
* @file sx1272.h |
||||
* @author MCD Application Team |
||||
* @version V1.0.1 |
||||
* @date 08-September-2017 |
||||
* @brief Header for driver sx1272.c |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT(c) 2017 STMicroelectronics</center></h2> |
||||
* |
||||
* 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 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 STMicroelectronics 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 HOLDER 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 __SX1272_H__ |
||||
#define __SX1272_H__ |
||||
|
||||
#include "sx1272Regs-Fsk.h" |
||||
#include "sx1272Regs-LoRa.h" |
||||
|
||||
/*!
|
||||
* Radio wake-up time from sleep |
||||
*/ |
||||
#define RADIO_WAKEUP_TIME 2 // [ms]
|
||||
|
||||
/*!
|
||||
* Sync word for Private LoRa networks |
||||
*/ |
||||
#define LORA_MAC_PRIVATE_SYNCWORD 0x12 |
||||
|
||||
/*!
|
||||
* Sync word for Public LoRa networks |
||||
*/ |
||||
#define LORA_MAC_PUBLIC_SYNCWORD 0x34 |
||||
|
||||
/*!
|
||||
* Radio FSK modem parameters |
||||
*/ |
||||
typedef struct |
||||
{ |
||||
int8_t Power; |
||||
uint32_t Fdev; |
||||
uint32_t Bandwidth; |
||||
uint32_t BandwidthAfc; |
||||
uint32_t Datarate; |
||||
uint16_t PreambleLen; |
||||
bool FixLen; |
||||
uint8_t PayloadLen; |
||||
bool CrcOn; |
||||
bool IqInverted; |
||||
bool RxContinuous; |
||||
uint32_t TxTimeout; |
||||
uint32_t RxSingleTimeout; |
||||
}RadioFskSettings_t; |
||||
|
||||
/*!
|
||||
* Radio FSK packet handler state |
||||
*/ |
||||
typedef struct |
||||
{ |
||||
uint8_t PreambleDetected; |
||||
uint8_t SyncWordDetected; |
||||
int8_t RssiValue; |
||||
int32_t AfcValue; |
||||
uint8_t RxGain; |
||||
uint16_t Size; |
||||
uint16_t NbBytes; |
||||
uint8_t FifoThresh; |
||||
uint8_t ChunkSize; |
||||
}RadioFskPacketHandler_t; |
||||
|
||||
/*!
|
||||
* Radio LoRa modem parameters |
||||
*/ |
||||
typedef struct |
||||
{ |
||||
int8_t Power; |
||||
uint32_t Bandwidth; |
||||
uint32_t Datarate; |
||||
bool LowDatarateOptimize; |
||||
uint8_t Coderate; |
||||
uint16_t PreambleLen; |
||||
bool FixLen; |
||||
uint8_t PayloadLen; |
||||
bool CrcOn; |
||||
bool FreqHopOn; |
||||
uint8_t HopPeriod; |
||||
bool IqInverted; |
||||
bool RxContinuous; |
||||
uint32_t TxTimeout; |
||||
bool PublicNetwork; |
||||
}RadioLoRaSettings_t; |
||||
|
||||
/*!
|
||||
* Radio LoRa packet handler state |
||||
*/ |
||||
typedef struct |
||||
{ |
||||
int8_t SnrValue; |
||||
int16_t RssiValue; |
||||
uint8_t Size; |
||||
}RadioLoRaPacketHandler_t; |
||||
|
||||
/*!
|
||||
* Radio Settings |
||||
*/ |
||||
typedef struct |
||||
{ |
||||
RadioState_t State; |
||||
RadioModems_t Modem; |
||||
uint32_t Channel; |
||||
RadioFskSettings_t Fsk; |
||||
RadioFskPacketHandler_t FskPacketHandler; |
||||
RadioLoRaSettings_t LoRa; |
||||
RadioLoRaPacketHandler_t LoRaPacketHandler; |
||||
}RadioSettings_t; |
||||
|
||||
/*!
|
||||
* Radio hardware and global parameters |
||||
*/ |
||||
typedef struct SX1272_s |
||||
{ |
||||
uint8_t RxTx; |
||||
RadioSettings_t Settings; |
||||
}SX1272_t; |
||||
|
||||
extern SX1272_t SX1272; |
||||
/*!
|
||||
* Hardware IO IRQ callback function definition |
||||
*/ |
||||
typedef void ( DioIrqHandler )( void ); |
||||
|
||||
/*!
|
||||
* SX1272 definitions |
||||
*/ |
||||
#define XTAL_FREQ 32000000 |
||||
#define FREQ_STEP 61.03515625 |
||||
#define FREQ_STEP_8 15625 /* FREQ_STEP<<8 */ |
||||
|
||||
/*!
|
||||
* \brief Radio hardware registers initialization definition |
||||
* |
||||
* \remark Can be automatically generated by the SX1272 GUI (not yet implemented) |
||||
*/ |
||||
#define RADIO_INIT_REGISTERS_VALUE \ |
||||
{ \
|
||||
{ MODEM_FSK , REG_LNA , 0x23 },\
|
||||
{ MODEM_FSK , REG_RXCONFIG , 0x1E },\
|
||||
{ MODEM_FSK , REG_RSSICONFIG , 0xD2 },\
|
||||
{ MODEM_FSK , REG_AFCFEI , 0x01 },\
|
||||
{ MODEM_FSK , REG_PREAMBLEDETECT , 0xAA },\
|
||||
{ MODEM_FSK , REG_OSC , 0x07 },\
|
||||
{ MODEM_FSK , REG_SYNCCONFIG , 0x12 },\
|
||||
{ MODEM_FSK , REG_SYNCVALUE1 , 0xC1 },\
|
||||
{ MODEM_FSK , REG_SYNCVALUE2 , 0x94 },\
|
||||
{ MODEM_FSK , REG_SYNCVALUE3 , 0xC1 },\
|
||||
{ MODEM_FSK , REG_PACKETCONFIG1 , 0xD8 },\
|
||||
{ MODEM_FSK , REG_FIFOTHRESH , 0x8F },\
|
||||
{ MODEM_FSK , REG_IMAGECAL , 0x02 },\
|
||||
{ MODEM_FSK , REG_DIOMAPPING1 , 0x00 },\
|
||||
{ MODEM_FSK , REG_DIOMAPPING2 , 0x30 },\
|
||||
{ MODEM_LORA, REG_LR_DETECTOPTIMIZE , 0x43 },\
|
||||
{ MODEM_LORA, REG_LR_PAYLOADMAXLENGTH, 0x40 },\
|
||||
} \
|
||||
|
||||
/* Freq = channel * FREQ_STEP */ |
||||
#define SX_CHANNEL_TO_FREQ( channel, freq ) \ |
||||
do \
|
||||
{ \
|
||||
uint32_t initialChanInt, initialChanFrac; \
|
||||
initialChanInt = channel >> 8; \
|
||||
initialChanFrac = channel - ( initialChanInt << 8 ); \
|
||||
freq = initialChanInt * FREQ_STEP_8 + ( ( initialChanFrac * FREQ_STEP_8 + ( 128 ) ) >> 8 ); \
|
||||
}while( 0 ) |
||||
|
||||
/* channel = Freq / FREQ_STEP */ |
||||
#define SX_FREQ_TO_CHANNEL( channel, freq ) \ |
||||
do \
|
||||
{ \
|
||||
uint32_t initialFreqInt, initialFreqFrac; \
|
||||
initialFreqInt = freq / FREQ_STEP_8; \
|
||||
initialFreqFrac = freq - ( initialFreqInt * FREQ_STEP_8 ); \
|
||||
channel = ( initialFreqInt << 8 ) + ( ( ( initialFreqFrac << 8 ) + ( FREQ_STEP_8 / 2 ) ) / FREQ_STEP_8 ); \
|
||||
}while( 0 ) |
||||
|
||||
#define RX_BUFFER_SIZE 256 |
||||
|
||||
typedef struct sBoardCallback |
||||
{ |
||||
/*!
|
||||
* \brief Set XO state on the board |
||||
*/ |
||||
void ( *SX1272BoardSetXO )( uint8_t state ); |
||||
/*!
|
||||
* \brief Get Board Wake Up time |
||||
*/ |
||||
uint32_t ( *SX1272BoardGetWakeTime )( void ); |
||||
/*!
|
||||
* \brief Initializes the radio I/Os Irq |
||||
*/ |
||||
void ( *SX1272BoardIoIrqInit )( DioIrqHandler **irqHandlers ); |
||||
/*!
|
||||
* \brief Sets the radio output power. |
||||
* |
||||
* \param [IN] power Sets the RF output power |
||||
*/ |
||||
void ( *SX1272BoardSetRfTxPower )( int8_t power ); |
||||
/*!
|
||||
* \brief Set the RF Switch I/Os pins in Low Power mode |
||||
* |
||||
* \param [IN] status enable or disable |
||||
*/ |
||||
void ( *SX1272BoardSetAntSwLowPower )( bool status ); |
||||
/*!
|
||||
* \brief Controls the antena switch if necessary. |
||||
* |
||||
* \remark see errata note |
||||
* |
||||
* \param [IN] opMode Current radio operating mode |
||||
*/ |
||||
void ( *SX1272BoardSetAntSw )( uint8_t opMode ); |
||||
}LoRaBoardCallback_t; |
||||
|
||||
/*!
|
||||
* ============================================================================ |
||||
* Public functions prototypes |
||||
* ============================================================================ |
||||
*/ |
||||
void SX1272BoardInit( LoRaBoardCallback_t *callbacks ); |
||||
/*!
|
||||
* \brief Initializes the radio |
||||
* |
||||
* \param [IN] events Structure containing the driver callback functions |
||||
* \param [OUT] returns the wake up time of the radio and associated board |
||||
*/ |
||||
uint32_t SX1272Init( RadioEvents_t *events ); |
||||
|
||||
/*!
|
||||
* Return current radio status |
||||
* |
||||
* \param status Radio status.[RF_IDLE, RF_RX_RUNNING, RF_TX_RUNNING] |
||||
*/ |
||||
RadioState_t SX1272GetStatus( void ); |
||||
|
||||
/*!
|
||||
* \brief Configures the radio with the given modem |
||||
* |
||||
* \param [IN] modem Modem to be used [0: FSK, 1: LoRa] |
||||
*/ |
||||
void SX1272SetModem( RadioModems_t modem ); |
||||
|
||||
/*!
|
||||
* \brief Sets the channel configuration |
||||
* |
||||
* \param [IN] freq Channel RF frequency |
||||
*/ |
||||
void SX1272SetChannel( uint32_t freq ); |
||||
|
||||
/*!
|
||||
* \brief Checks if the channel is free for the given time |
||||
* |
||||
* \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] |
||||
* \param [IN] freq Channel RF frequency |
||||
* \param [IN] rssiThresh RSSI threshold |
||||
* \param [IN] maxCarrierSenseTime Max time while the RSSI is measured |
||||
* |
||||
* \retval isFree [true: Channel is free, false: Channel is not free] |
||||
*/ |
||||
bool SX1272IsChannelFree( RadioModems_t modem, uint32_t freq, int16_t rssiThresh, uint32_t maxCarrierSenseTime ); |
||||
|
||||
/*!
|
||||
* \brief Generates a 32 bits random value based on the RSSI readings |
||||
* |
||||
* \remark This function sets the radio in LoRa modem mode and disables |
||||
* all interrupts. |
||||
* After calling this function either SX1272SetRxConfig or |
||||
* SX1272SetTxConfig functions must be called. |
||||
* |
||||
* \retval randomValue 32 bits random value |
||||
*/ |
||||
uint32_t SX1272Random( void ); |
||||
|
||||
/*!
|
||||
* \brief Sets the reception parameters |
||||
* |
||||
* \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] |
||||
* \param [IN] bandwidth Sets the bandwidth |
||||
* FSK : >= 2600 and <= 250000 Hz |
||||
* LoRa: [0: 125 kHz, 1: 250 kHz, |
||||
* 2: 500 kHz, 3: Reserved] |
||||
* \param [IN] datarate Sets the Datarate |
||||
* FSK : 600..300000 bits/s |
||||
* LoRa: [6: 64, 7: 128, 8: 256, 9: 512, |
||||
* 10: 1024, 11: 2048, 12: 4096 chips] |
||||
* \param [IN] coderate Sets the coding rate (LoRa only) |
||||
* FSK : N/A ( set to 0 ) |
||||
* LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8] |
||||
* \param [IN] bandwidthAfc Sets the AFC Bandwidth (FSK only) |
||||
* FSK : >= 2600 and <= 250000 Hz |
||||
* LoRa: N/A ( set to 0 ) |
||||
* \param [IN] preambleLen Sets the Preamble length |
||||
* FSK : Number of bytes |
||||
* LoRa: Length in symbols (the hardware adds 4 more symbols) |
||||
* \param [IN] symbTimeout Sets the RxSingle timeout value |
||||
* FSK : timeout number of bytes |
||||
* LoRa: timeout in symbols |
||||
* \param [IN] fixLen Fixed length packets [0: variable, 1: fixed] |
||||
* \param [IN] payloadLen Sets payload length when fixed length is used |
||||
* \param [IN] crcOn Enables/Disables the CRC [0: OFF, 1: ON] |
||||
* \param [IN] freqHopOn Enables disables the intra-packet frequency hopping |
||||
* FSK : N/A ( set to 0 ) |
||||
* LoRa: [0: OFF, 1: ON] |
||||
* \param [IN] hopPeriod Number of symbols between each hop |
||||
* FSK : N/A ( set to 0 ) |
||||
* LoRa: Number of symbols |
||||
* \param [IN] iqInverted Inverts IQ signals (LoRa only) |
||||
* FSK : N/A ( set to 0 ) |
||||
* LoRa: [0: not inverted, 1: inverted] |
||||
* \param [IN] rxContinuous Sets the reception in continuous mode |
||||
* [false: single mode, true: continuous mode] |
||||
*/ |
||||
void SX1272SetRxConfig( RadioModems_t modem, uint32_t bandwidth, |
||||
uint32_t datarate, uint8_t coderate, |
||||
uint32_t bandwidthAfc, uint16_t preambleLen, |
||||
uint16_t symbTimeout, bool fixLen, |
||||
uint8_t payloadLen, |
||||
bool crcOn, bool freqHopOn, uint8_t hopPeriod, |
||||
bool iqInverted, bool rxContinuous ); |
||||
|
||||
/*!
|
||||
* \brief Sets the transmission parameters |
||||
* |
||||
* \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] |
||||
* \param [IN] power Sets the output power [dBm] |
||||
* \param [IN] fdev Sets the frequency deviation (FSK only) |
||||
* FSK : [Hz] |
||||
* LoRa: 0 |
||||
* \param [IN] bandwidth Sets the bandwidth (LoRa only) |
||||
* FSK : 0 |
||||
* LoRa: [0: 125 kHz, 1: 250 kHz, |
||||
* 2: 500 kHz, 3: Reserved] |
||||
* \param [IN] datarate Sets the Datarate |
||||
* FSK : 600..300000 bits/s |
||||
* LoRa: [6: 64, 7: 128, 8: 256, 9: 512, |
||||
* 10: 1024, 11: 2048, 12: 4096 chips] |
||||
* \param [IN] coderate Sets the coding rate (LoRa only) |
||||
* FSK : N/A ( set to 0 ) |
||||
* LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8] |
||||
* \param [IN] preambleLen Sets the preamble length |
||||
* FSK : Number of bytes |
||||
* LoRa: Length in symbols (the hardware adds 4 more symbols) |
||||
* \param [IN] fixLen Fixed length packets [0: variable, 1: fixed] |
||||
* \param [IN] crcOn Enables disables the CRC [0: OFF, 1: ON] |
||||
* \param [IN] freqHopOn Enables disables the intra-packet frequency hopping |
||||
* FSK : N/A ( set to 0 ) |
||||
* LoRa: [0: OFF, 1: ON] |
||||
* \param [IN] hopPeriod Number of symbols between each hop |
||||
* FSK : N/A ( set to 0 ) |
||||
* LoRa: Number of symbols |
||||
* \param [IN] iqInverted Inverts IQ signals (LoRa only) |
||||
* FSK : N/A ( set to 0 ) |
||||
* LoRa: [0: not inverted, 1: inverted] |
||||
* \param [IN] timeout Transmission timeout [ms] |
||||
*/ |
||||
void SX1272SetTxConfig( RadioModems_t modem, int8_t power, uint32_t fdev, |
||||
uint32_t bandwidth, uint32_t datarate, |
||||
uint8_t coderate, uint16_t preambleLen, |
||||
bool fixLen, bool crcOn, bool freqHopOn, |
||||
uint8_t hopPeriod, bool iqInverted, uint32_t timeout ); |
||||
|
||||
/*!
|
||||
* \brief Computes the packet time on air in ms for the given payload |
||||
* |
||||
* \Remark Can only be called once SetRxConfig or SetTxConfig have been called |
||||
* |
||||
* \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] |
||||
* \param [IN] pktLen Packet payload length |
||||
* |
||||
* \retval airTime Computed airTime (ms) for the given packet payload length |
||||
*/ |
||||
uint32_t SX1272GetTimeOnAir( RadioModems_t modem, uint8_t pktLen ); |
||||
|
||||
/*!
|
||||
* \brief Sends the buffer of size. Prepares the packet to be sent and sets |
||||
* the radio in transmission |
||||
* |
||||
* \param [IN]: buffer Buffer pointer |
||||
* \param [IN]: size Buffer size |
||||
*/ |
||||
void SX1272Send( uint8_t *buffer, uint8_t size ); |
||||
|
||||
/*!
|
||||
* \brief Sets the radio in sleep mode |
||||
*/ |
||||
void SX1272SetSleep( void ); |
||||
|
||||
/*!
|
||||
* \brief Sets the radio in standby mode |
||||
*/ |
||||
void SX1272SetStby( void ); |
||||
|
||||
/*!
|
||||
* \brief Sets the radio in reception mode for the given time |
||||
* \param [IN] timeout Reception timeout [ms] [0: continuous, others timeout] |
||||
*/ |
||||
void SX1272SetRx( uint32_t timeout ); |
||||
|
||||
/*!
|
||||
* \brief Start a Channel Activity Detection |
||||
*/ |
||||
void SX1272StartCad( void ); |
||||
|
||||
/*!
|
||||
* \brief Sets the radio in continuous wave transmission mode |
||||
* |
||||
* \param [IN]: freq Channel RF frequency |
||||
* \param [IN]: power Sets the output power [dBm] |
||||
* \param [IN]: time Transmission mode timeout [s] |
||||
*/ |
||||
void SX1272SetTxContinuousWave( uint32_t freq, int8_t power, uint16_t time ); |
||||
|
||||
/*!
|
||||
* \brief Reads the current RSSI value |
||||
* |
||||
* \retval rssiValue Current RSSI value in [dBm] |
||||
*/ |
||||
int16_t SX1272ReadRssi( RadioModems_t modem ); |
||||
|
||||
/*!
|
||||
* \brief Writes the radio register at the specified address |
||||
* |
||||
* \param [IN]: addr Register address |
||||
* \param [IN]: data New register value |
||||
*/ |
||||
void SX1272Write( uint8_t addr, uint8_t data ); |
||||
|
||||
/*!
|
||||
* \brief Reads the radio register at the specified address |
||||
* |
||||
* \param [IN]: addr Register address |
||||
* \retval data Register value |
||||
*/ |
||||
uint8_t SX1272Read( uint8_t addr ); |
||||
|
||||
/*!
|
||||
* \brief Writes multiple radio registers starting at address |
||||
* |
||||
* \param [IN] addr First Radio register address |
||||
* \param [IN] buffer Buffer containing the new register's values |
||||
* \param [IN] size Number of registers to be written |
||||
*/ |
||||
void SX1272WriteBuffer( uint8_t addr, uint8_t *buffer, uint8_t size ); |
||||
|
||||
/*!
|
||||
* \brief Reads multiple radio registers starting at address |
||||
* |
||||
* \param [IN] addr First Radio register address |
||||
* \param [OUT] buffer Buffer where to copy the registers data |
||||
* \param [IN] size Number of registers to be read |
||||
*/ |
||||
void SX1272ReadBuffer( uint8_t addr, uint8_t *buffer, uint8_t size ); |
||||
|
||||
/*!
|
||||
* \brief Sets the maximum payload length. |
||||
* |
||||
* \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] |
||||
* \param [IN] max Maximum payload length in bytes |
||||
*/ |
||||
void SX1272SetMaxPayloadLength( RadioModems_t modem, uint8_t max ); |
||||
|
||||
/*!
|
||||
* \brief Sets the network to public or private. Updates the sync byte. |
||||
* |
||||
* \remark Applies to LoRa modem only |
||||
* |
||||
* \param [IN] enable if true, it enables a public network |
||||
*/ |
||||
void SX1272SetPublicNetwork( bool enable ); |
||||
|
||||
/*!
|
||||
* \brief Service to get the radio wake-up time. |
||||
* |
||||
* \retval Value of the radio wake-up time. |
||||
*/ |
||||
uint32_t SX1272GetRadioWakeUpTime( void ); |
||||
|
||||
#endif /* __SX1272_H__ */ |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,545 @@ |
||||
/*
|
||||
/ _____) _ | | |
||||
( (____ _____ ____ _| |_ _____ ____| |__ |
||||
\____ \| ___ | (_ _) ___ |/ ___) _ \
|
||||
_____) ) ____| | | || |_| ____( (___| | | | |
||||
(______/|_____)_|_|_| \__)_____)\____)_| |_| |
||||
(C)2013 Semtech |
||||
|
||||
Description: SX1272 LoRa modem registers and bits definitions |
||||
|
||||
License: Revised BSD License, see LICENSE.TXT file include in the project |
||||
|
||||
Maintainer: Miguel Luis and Gregory Cristian |
||||
*/ |
||||
#ifndef __SX1272_REGS_LORA_H__ |
||||
#define __SX1272_REGS_LORA_H__ |
||||
|
||||
/*!
|
||||
* ============================================================================ |
||||
* SX1272 Internal registers Address |
||||
* ============================================================================ |
||||
*/ |
||||
#define REG_LR_FIFO 0x00 |
||||
// Common settings
|
||||
#define REG_LR_OPMODE 0x01 |
||||
#define REG_LR_FRFMSB 0x06 |
||||
#define REG_LR_FRFMID 0x07 |
||||
#define REG_LR_FRFLSB 0x08 |
||||
// Tx settings
|
||||
#define REG_LR_PACONFIG 0x09 |
||||
#define REG_LR_PARAMP 0x0A |
||||
#define REG_LR_OCP 0x0B |
||||
// Rx settings
|
||||
#define REG_LR_LNA 0x0C |
||||
// LoRa registers
|
||||
#define REG_LR_FIFOADDRPTR 0x0D |
||||
#define REG_LR_FIFOTXBASEADDR 0x0E |
||||
#define REG_LR_FIFORXBASEADDR 0x0F |
||||
#define REG_LR_FIFORXCURRENTADDR 0x10 |
||||
#define REG_LR_IRQFLAGSMASK 0x11 |
||||
#define REG_LR_IRQFLAGS 0x12 |
||||
#define REG_LR_RXNBBYTES 0x13 |
||||
#define REG_LR_RXHEADERCNTVALUEMSB 0x14 |
||||
#define REG_LR_RXHEADERCNTVALUELSB 0x15 |
||||
#define REG_LR_RXPACKETCNTVALUEMSB 0x16 |
||||
#define REG_LR_RXPACKETCNTVALUELSB 0x17 |
||||
#define REG_LR_MODEMSTAT 0x18 |
||||
#define REG_LR_PKTSNRVALUE 0x19 |
||||
#define REG_LR_PKTRSSIVALUE 0x1A |
||||
#define REG_LR_RSSIVALUE 0x1B |
||||
#define REG_LR_HOPCHANNEL 0x1C |
||||
#define REG_LR_MODEMCONFIG1 0x1D |
||||
#define REG_LR_MODEMCONFIG2 0x1E |
||||
#define REG_LR_SYMBTIMEOUTLSB 0x1F |
||||
#define REG_LR_PREAMBLEMSB 0x20 |
||||
#define REG_LR_PREAMBLELSB 0x21 |
||||
#define REG_LR_PAYLOADLENGTH 0x22 |
||||
#define REG_LR_PAYLOADMAXLENGTH 0x23 |
||||
#define REG_LR_HOPPERIOD 0x24 |
||||
#define REG_LR_FIFORXBYTEADDR 0x25 |
||||
#define REG_LR_FEIMSB 0x28 |
||||
#define REG_LR_FEIMID 0x29 |
||||
#define REG_LR_FEILSB 0x2A |
||||
#define REG_LR_RSSIWIDEBAND 0x2C |
||||
#define REG_LR_DETECTOPTIMIZE 0x31 |
||||
#define REG_LR_INVERTIQ 0x33 |
||||
#define REG_LR_DETECTIONTHRESHOLD 0x37 |
||||
#define REG_LR_SYNCWORD 0x39 |
||||
#define REG_LR_INVERTIQ2 0x3B |
||||
|
||||
// end of documented register in datasheet
|
||||
// I/O settings
|
||||
#define REG_LR_DIOMAPPING1 0x40 |
||||
#define REG_LR_DIOMAPPING2 0x41 |
||||
// Version
|
||||
#define REG_LR_VERSION 0x42 |
||||
// Additional settings
|
||||
#define REG_LR_AGCREF 0x43 |
||||
#define REG_LR_AGCTHRESH1 0x44 |
||||
#define REG_LR_AGCTHRESH2 0x45 |
||||
#define REG_LR_AGCTHRESH3 0x46 |
||||
#define REG_LR_PLLHOP 0x4B |
||||
#define REG_LR_TCXO 0x58 |
||||
#define REG_LR_PADAC 0x5A |
||||
#define REG_LR_PLL 0x5C |
||||
#define REG_LR_PLLLOWPN 0x5E |
||||
#define REG_LR_FORMERTEMP 0x6C |
||||
|
||||
/*!
|
||||
* ============================================================================ |
||||
* SX1272 LoRa bits control definition |
||||
* ============================================================================ |
||||
*/ |
||||
|
||||
/*!
|
||||
* RegFifo |
||||
*/ |
||||
|
||||
/*!
|
||||
* RegOpMode |
||||
*/ |
||||
#define RFLR_OPMODE_LONGRANGEMODE_MASK 0x7F |
||||
#define RFLR_OPMODE_LONGRANGEMODE_OFF 0x00 // Default
|
||||
#define RFLR_OPMODE_LONGRANGEMODE_ON 0x80 |
||||
|
||||
#define RFLR_OPMODE_ACCESSSHAREDREG_MASK 0xBF |
||||
#define RFLR_OPMODE_ACCESSSHAREDREG_ENABLE 0x40 |
||||
#define RFLR_OPMODE_ACCESSSHAREDREG_DISABLE 0x00 // Default
|
||||
|
||||
#define RFLR_OPMODE_MASK 0xF8 |
||||
#define RFLR_OPMODE_SLEEP 0x00 |
||||
#define RFLR_OPMODE_STANDBY 0x01 // Default
|
||||
#define RFLR_OPMODE_SYNTHESIZER_TX 0x02 |
||||
#define RFLR_OPMODE_TRANSMITTER 0x03 |
||||
#define RFLR_OPMODE_SYNTHESIZER_RX 0x04 |
||||
#define RFLR_OPMODE_RECEIVER 0x05 |
||||
// LoRa specific modes
|
||||
#define RFLR_OPMODE_RECEIVER_SINGLE 0x06 |
||||
#define RFLR_OPMODE_CAD 0x07 |
||||
|
||||
/*!
|
||||
* RegFrf (MHz) |
||||
*/ |
||||
#define RFLR_FRFMSB_915_MHZ 0xE4 // Default
|
||||
#define RFLR_FRFMID_915_MHZ 0xC0 // Default
|
||||
#define RFLR_FRFLSB_915_MHZ 0x00 // Default
|
||||
|
||||
/*!
|
||||
* RegPaConfig |
||||
*/ |
||||
#define RFLR_PACONFIG_PASELECT_MASK 0x7F |
||||
#define RFLR_PACONFIG_PASELECT_PABOOST 0x80 |
||||
#define RFLR_PACONFIG_PASELECT_RFO 0x00 // Default
|
||||
|
||||
#define RFLR_PACONFIG_OUTPUTPOWER_MASK 0xF0 |
||||
|
||||
/*!
|
||||
* RegPaRamp |
||||
*/ |
||||
#define RFLR_PARAMP_LOWPNTXPLL_MASK 0xE0 |
||||
#define RFLR_PARAMP_LOWPNTXPLL_OFF 0x10 // Default
|
||||
#define RFLR_PARAMP_LOWPNTXPLL_ON 0x00 |
||||
|
||||
#define RFLR_PARAMP_MASK 0xF0 |
||||
#define RFLR_PARAMP_3400_US 0x00 |
||||
#define RFLR_PARAMP_2000_US 0x01 |
||||
#define RFLR_PARAMP_1000_US 0x02 |
||||
#define RFLR_PARAMP_0500_US 0x03 |
||||
#define RFLR_PARAMP_0250_US 0x04 |
||||
#define RFLR_PARAMP_0125_US 0x05 |
||||
#define RFLR_PARAMP_0100_US 0x06 |
||||
#define RFLR_PARAMP_0062_US 0x07 |
||||
#define RFLR_PARAMP_0050_US 0x08 |
||||
#define RFLR_PARAMP_0040_US 0x09 // Default
|
||||
#define RFLR_PARAMP_0031_US 0x0A |
||||
#define RFLR_PARAMP_0025_US 0x0B |
||||
#define RFLR_PARAMP_0020_US 0x0C |
||||
#define RFLR_PARAMP_0015_US 0x0D |
||||
#define RFLR_PARAMP_0012_US 0x0E |
||||
#define RFLR_PARAMP_0010_US 0x0F |
||||
|
||||
/*!
|
||||
* RegOcp |
||||
*/ |
||||
#define RFLR_OCP_MASK 0xDF |
||||
#define RFLR_OCP_ON 0x20 // Default
|
||||
#define RFLR_OCP_OFF 0x00 |
||||
|
||||
#define RFLR_OCP_TRIM_MASK 0xE0 |
||||
#define RFLR_OCP_TRIM_045_MA 0x00 |
||||
#define RFLR_OCP_TRIM_050_MA 0x01 |
||||
#define RFLR_OCP_TRIM_055_MA 0x02 |
||||
#define RFLR_OCP_TRIM_060_MA 0x03 |
||||
#define RFLR_OCP_TRIM_065_MA 0x04 |
||||
#define RFLR_OCP_TRIM_070_MA 0x05 |
||||
#define RFLR_OCP_TRIM_075_MA 0x06 |
||||
#define RFLR_OCP_TRIM_080_MA 0x07 |
||||
#define RFLR_OCP_TRIM_085_MA 0x08 |
||||
#define RFLR_OCP_TRIM_090_MA 0x09 |
||||
#define RFLR_OCP_TRIM_095_MA 0x0A |
||||
#define RFLR_OCP_TRIM_100_MA 0x0B // Default
|
||||
#define RFLR_OCP_TRIM_105_MA 0x0C |
||||
#define RFLR_OCP_TRIM_110_MA 0x0D |
||||
#define RFLR_OCP_TRIM_115_MA 0x0E |
||||
#define RFLR_OCP_TRIM_120_MA 0x0F |
||||
#define RFLR_OCP_TRIM_130_MA 0x10 |
||||
#define RFLR_OCP_TRIM_140_MA 0x11 |
||||
#define RFLR_OCP_TRIM_150_MA 0x12 |
||||
#define RFLR_OCP_TRIM_160_MA 0x13 |
||||
#define RFLR_OCP_TRIM_170_MA 0x14 |
||||
#define RFLR_OCP_TRIM_180_MA 0x15 |
||||
#define RFLR_OCP_TRIM_190_MA 0x16 |
||||
#define RFLR_OCP_TRIM_200_MA 0x17 |
||||
#define RFLR_OCP_TRIM_210_MA 0x18 |
||||
#define RFLR_OCP_TRIM_220_MA 0x19 |
||||
#define RFLR_OCP_TRIM_230_MA 0x1A |
||||
#define RFLR_OCP_TRIM_240_MA 0x1B |
||||
|
||||
/*!
|
||||
* RegLna |
||||
*/ |
||||
#define RFLR_LNA_GAIN_MASK 0x1F |
||||
#define RFLR_LNA_GAIN_G1 0x20 // Default
|
||||
#define RFLR_LNA_GAIN_G2 0x40 |
||||
#define RFLR_LNA_GAIN_G3 0x60 |
||||
#define RFLR_LNA_GAIN_G4 0x80 |
||||
#define RFLR_LNA_GAIN_G5 0xA0 |
||||
#define RFLR_LNA_GAIN_G6 0xC0 |
||||
|
||||
#define RFLR_LNA_BOOST_MASK 0xFC |
||||
#define RFLR_LNA_BOOST_OFF 0x00 // Default
|
||||
#define RFLR_LNA_BOOST_ON 0x03 |
||||
|
||||
/*!
|
||||
* RegFifoAddrPtr |
||||
*/ |
||||
#define RFLR_FIFOADDRPTR 0x00 // Default
|
||||
|
||||
/*!
|
||||
* RegFifoTxBaseAddr |
||||
*/ |
||||
#define RFLR_FIFOTXBASEADDR 0x80 // Default
|
||||
|
||||
/*!
|
||||
* RegFifoTxBaseAddr |
||||
*/ |
||||
#define RFLR_FIFORXBASEADDR 0x00 // Default
|
||||
|
||||
/*!
|
||||
* RegFifoRxCurrentAddr (Read Only) |
||||
*/ |
||||
|
||||
/*!
|
||||
* RegIrqFlagsMask |
||||
*/ |
||||
#define RFLR_IRQFLAGS_RXTIMEOUT_MASK 0x80 |
||||
#define RFLR_IRQFLAGS_RXDONE_MASK 0x40 |
||||
#define RFLR_IRQFLAGS_PAYLOADCRCERROR_MASK 0x20 |
||||
#define RFLR_IRQFLAGS_VALIDHEADER_MASK 0x10 |
||||
#define RFLR_IRQFLAGS_TXDONE_MASK 0x08 |
||||
#define RFLR_IRQFLAGS_CADDONE_MASK 0x04 |
||||
#define RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL_MASK 0x02 |
||||
#define RFLR_IRQFLAGS_CADDETECTED_MASK 0x01 |
||||
|
||||
/*!
|
||||
* RegIrqFlags |
||||
*/ |
||||
#define RFLR_IRQFLAGS_RXTIMEOUT 0x80 |
||||
#define RFLR_IRQFLAGS_RXDONE 0x40 |
||||
#define RFLR_IRQFLAGS_PAYLOADCRCERROR 0x20 |
||||
#define RFLR_IRQFLAGS_VALIDHEADER 0x10 |
||||
#define RFLR_IRQFLAGS_TXDONE 0x08 |
||||
#define RFLR_IRQFLAGS_CADDONE 0x04 |
||||
#define RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL 0x02 |
||||
#define RFLR_IRQFLAGS_CADDETECTED 0x01 |
||||
|
||||
/*!
|
||||
* RegFifoRxNbBytes (Read Only) |
||||
*/ |
||||
|
||||
/*!
|
||||
* RegRxHeaderCntValueMsb (Read Only) |
||||
*/ |
||||
|
||||
/*!
|
||||
* RegRxHeaderCntValueLsb (Read Only) |
||||
*/ |
||||
|
||||
/*!
|
||||
* RegRxPacketCntValueMsb (Read Only) |
||||
*/ |
||||
|
||||
/*!
|
||||
* RegRxPacketCntValueLsb (Read Only) |
||||
*/ |
||||
|
||||
/*!
|
||||
* RegModemStat (Read Only) |
||||
*/ |
||||
#define RFLR_MODEMSTAT_RX_CR_MASK 0x1F |
||||
#define RFLR_MODEMSTAT_MODEM_STATUS_MASK 0xE0 |
||||
|
||||
/*!
|
||||
* RegPktSnrValue (Read Only) |
||||
*/ |
||||
|
||||
/*!
|
||||
* RegPktRssiValue (Read Only) |
||||
*/ |
||||
|
||||
/*!
|
||||
* RegRssiValue (Read Only) |
||||
*/ |
||||
|
||||
/*!
|
||||
* RegHopChannel (Read Only) |
||||
*/ |
||||
#define RFLR_HOPCHANNEL_PLL_LOCK_TIMEOUT_MASK 0x7F |
||||
#define RFLR_HOPCHANNEL_PLL_LOCK_FAIL 0x80 |
||||
#define RFLR_HOPCHANNEL_PLL_LOCK_SUCCEED 0x00 // Default
|
||||
|
||||
#define RFLR_HOPCHANNEL_CRCONPAYLOAD_MASK 0xBF |
||||
#define RFLR_HOPCHANNEL_CRCONPAYLOAD_ON 0x40 |
||||
#define RFLR_HOPCHANNEL_CRCONPAYLOAD_OFF 0x00 // Default
|
||||
|
||||
#define RFLR_HOPCHANNEL_CHANNEL_MASK 0x3F |
||||
|
||||
/*!
|
||||
* RegModemConfig1 |
||||
*/ |
||||
#define RFLR_MODEMCONFIG1_BW_MASK 0x3F |
||||
#define RFLR_MODEMCONFIG1_BW_125_KHZ 0x00 // Default
|
||||
#define RFLR_MODEMCONFIG1_BW_250_KHZ 0x40 |
||||
#define RFLR_MODEMCONFIG1_BW_500_KHZ 0x80 |
||||
|
||||
#define RFLR_MODEMCONFIG1_CODINGRATE_MASK 0xC7 |
||||
#define RFLR_MODEMCONFIG1_CODINGRATE_4_5 0x08 |
||||
#define RFLR_MODEMCONFIG1_CODINGRATE_4_6 0x10 // Default
|
||||
#define RFLR_MODEMCONFIG1_CODINGRATE_4_7 0x18 |
||||
#define RFLR_MODEMCONFIG1_CODINGRATE_4_8 0x20 |
||||
|
||||
#define RFLR_MODEMCONFIG1_IMPLICITHEADER_MASK 0xFB |
||||
#define RFLR_MODEMCONFIG1_IMPLICITHEADER_ON 0x04 |
||||
#define RFLR_MODEMCONFIG1_IMPLICITHEADER_OFF 0x00 // Default
|
||||
|
||||
#define RFLR_MODEMCONFIG1_RXPAYLOADCRC_MASK 0xFD |
||||
#define RFLR_MODEMCONFIG1_RXPAYLOADCRC_ON 0x02 |
||||
#define RFLR_MODEMCONFIG1_RXPAYLOADCRC_OFF 0x00 // Default
|
||||
|
||||
#define RFLR_MODEMCONFIG1_LOWDATARATEOPTIMIZE_MASK 0xFE |
||||
#define RFLR_MODEMCONFIG1_LOWDATARATEOPTIMIZE_ON 0x01 |
||||
#define RFLR_MODEMCONFIG1_LOWDATARATEOPTIMIZE_OFF 0x00 // Default
|
||||
|
||||
/*!
|
||||
* RegModemConfig2 |
||||
*/ |
||||
#define RFLR_MODEMCONFIG2_SF_MASK 0x0F |
||||
#define RFLR_MODEMCONFIG2_SF_6 0x60 |
||||
#define RFLR_MODEMCONFIG2_SF_7 0x70 // Default
|
||||
#define RFLR_MODEMCONFIG2_SF_8 0x80 |
||||
#define RFLR_MODEMCONFIG2_SF_9 0x90 |
||||
#define RFLR_MODEMCONFIG2_SF_10 0xA0 |
||||
#define RFLR_MODEMCONFIG2_SF_11 0xB0 |
||||
#define RFLR_MODEMCONFIG2_SF_12 0xC0 |
||||
|
||||
#define RFLR_MODEMCONFIG2_TXCONTINUOUSMODE_MASK 0xF7 |
||||
#define RFLR_MODEMCONFIG2_TXCONTINUOUSMODE_ON 0x08 |
||||
#define RFLR_MODEMCONFIG2_TXCONTINUOUSMODE_OFF 0x00 |
||||
|
||||
#define RFLR_MODEMCONFIG2_AGCAUTO_MASK 0xFB |
||||
#define RFLR_MODEMCONFIG2_AGCAUTO_ON 0x04 // Default
|
||||
#define RFLR_MODEMCONFIG2_AGCAUTO_OFF 0x00 |
||||
|
||||
#define RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK 0xFC |
||||
#define RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB 0x00 // Default
|
||||
|
||||
/*!
|
||||
* RegSymbTimeoutLsb |
||||
*/ |
||||
#define RFLR_SYMBTIMEOUTLSB_SYMBTIMEOUT 0x64 // Default
|
||||
|
||||
/*!
|
||||
* RegPreambleLengthMsb |
||||
*/ |
||||
#define RFLR_PREAMBLELENGTHMSB 0x00 // Default
|
||||
|
||||
/*!
|
||||
* RegPreambleLengthLsb |
||||
*/ |
||||
#define RFLR_PREAMBLELENGTHLSB 0x08 // Default
|
||||
|
||||
/*!
|
||||
* RegPayloadLength |
||||
*/ |
||||
#define RFLR_PAYLOADLENGTH 0x0E // Default
|
||||
|
||||
/*!
|
||||
* RegPayloadMaxLength |
||||
*/ |
||||
#define RFLR_PAYLOADMAXLENGTH 0xFF // Default
|
||||
|
||||
/*!
|
||||
* RegHopPeriod |
||||
*/ |
||||
#define RFLR_HOPPERIOD_FREQFOPPINGPERIOD 0x00 // Default
|
||||
|
||||
/*!
|
||||
* RegFifoRxByteAddr (Read Only) |
||||
*/ |
||||
|
||||
/*!
|
||||
* RegFeiMsb (Read Only) |
||||
*/ |
||||
|
||||
/*!
|
||||
* RegFeiMid (Read Only) |
||||
*/ |
||||
|
||||
/*!
|
||||
* RegFeiLsb (Read Only) |
||||
*/ |
||||
|
||||
/*!
|
||||
* RegRssiWideband (Read Only) |
||||
*/ |
||||
|
||||
/*!
|
||||
* RegDetectOptimize |
||||
*/ |
||||
#define RFLR_DETECTIONOPTIMIZE_MASK 0xF8 |
||||
#define RFLR_DETECTIONOPTIMIZE_SF7_TO_SF12 0x03 // Default
|
||||
#define RFLR_DETECTIONOPTIMIZE_SF6 0x05 |
||||
|
||||
/*!
|
||||
* RegInvertIQ |
||||
*/ |
||||
#define RFLR_INVERTIQ_RX_MASK 0xBF |
||||
#define RFLR_INVERTIQ_RX_OFF 0x00 |
||||
#define RFLR_INVERTIQ_RX_ON 0x40 |
||||
#define RFLR_INVERTIQ_TX_MASK 0xFE |
||||
#define RFLR_INVERTIQ_TX_OFF 0x01 |
||||
#define RFLR_INVERTIQ_TX_ON 0x00 |
||||
|
||||
/*!
|
||||
* RegDetectionThreshold |
||||
*/ |
||||
#define RFLR_DETECTIONTHRESH_SF7_TO_SF12 0x0A // Default
|
||||
#define RFLR_DETECTIONTHRESH_SF6 0x0C |
||||
|
||||
/*!
|
||||
* RegInvertIQ2 |
||||
*/ |
||||
#define RFLR_INVERTIQ2_ON 0x19 |
||||
#define RFLR_INVERTIQ2_OFF 0x1D |
||||
|
||||
/*!
|
||||
* RegDioMapping1 |
||||
*/ |
||||
#define RFLR_DIOMAPPING1_DIO0_MASK 0x3F |
||||
#define RFLR_DIOMAPPING1_DIO0_00 0x00 // Default
|
||||
#define RFLR_DIOMAPPING1_DIO0_01 0x40 |
||||
#define RFLR_DIOMAPPING1_DIO0_10 0x80 |
||||
#define RFLR_DIOMAPPING1_DIO0_11 0xC0 |
||||
|
||||
#define RFLR_DIOMAPPING1_DIO1_MASK 0xCF |
||||
#define RFLR_DIOMAPPING1_DIO1_00 0x00 // Default
|
||||
#define RFLR_DIOMAPPING1_DIO1_01 0x10 |
||||
#define RFLR_DIOMAPPING1_DIO1_10 0x20 |
||||
#define RFLR_DIOMAPPING1_DIO1_11 0x30 |
||||
|
||||
#define RFLR_DIOMAPPING1_DIO2_MASK 0xF3 |
||||
#define RFLR_DIOMAPPING1_DIO2_00 0x00 // Default
|
||||
#define RFLR_DIOMAPPING1_DIO2_01 0x04 |
||||
#define RFLR_DIOMAPPING1_DIO2_10 0x08 |
||||
#define RFLR_DIOMAPPING1_DIO2_11 0x0C |
||||
|
||||
#define RFLR_DIOMAPPING1_DIO3_MASK 0xFC |
||||
#define RFLR_DIOMAPPING1_DIO3_00 0x00 // Default
|
||||
#define RFLR_DIOMAPPING1_DIO3_01 0x01 |
||||
#define RFLR_DIOMAPPING1_DIO3_10 0x02 |
||||
#define RFLR_DIOMAPPING1_DIO3_11 0x03 |
||||
|
||||
/*!
|
||||
* RegDioMapping2 |
||||
*/ |
||||
#define RFLR_DIOMAPPING2_DIO4_MASK 0x3F |
||||
#define RFLR_DIOMAPPING2_DIO4_00 0x00 // Default
|
||||
#define RFLR_DIOMAPPING2_DIO4_01 0x40 |
||||
#define RFLR_DIOMAPPING2_DIO4_10 0x80 |
||||
#define RFLR_DIOMAPPING2_DIO4_11 0xC0 |
||||
|
||||
#define RFLR_DIOMAPPING2_DIO5_MASK 0xCF |
||||
#define RFLR_DIOMAPPING2_DIO5_00 0x00 // Default
|
||||
#define RFLR_DIOMAPPING2_DIO5_01 0x10 |
||||
#define RFLR_DIOMAPPING2_DIO5_10 0x20 |
||||
#define RFLR_DIOMAPPING2_DIO5_11 0x30 |
||||
|
||||
#define RFLR_DIOMAPPING2_MAP_MASK 0xFE |
||||
#define RFLR_DIOMAPPING2_MAP_PREAMBLEDETECT 0x01 |
||||
#define RFLR_DIOMAPPING2_MAP_RSSI 0x00 // Default
|
||||
|
||||
/*!
|
||||
* RegVersion (Read Only) |
||||
*/ |
||||
|
||||
/*!
|
||||
* RegAgcRef |
||||
*/ |
||||
|
||||
/*!
|
||||
* RegAgcThresh1 |
||||
*/ |
||||
|
||||
/*!
|
||||
* RegAgcThresh2 |
||||
*/ |
||||
|
||||
/*!
|
||||
* RegAgcThresh3 |
||||
*/ |
||||
|
||||
/*!
|
||||
* RegPllHop |
||||
*/ |
||||
#define RFLR_PLLHOP_FASTHOP_MASK 0x7F |
||||
#define RFLR_PLLHOP_FASTHOP_ON 0x80 |
||||
#define RFLR_PLLHOP_FASTHOP_OFF 0x00 // Default
|
||||
|
||||
/*!
|
||||
* RegTcxo |
||||
*/ |
||||
#define RFLR_TCXO_TCXOINPUT_MASK 0xEF |
||||
#define RFLR_TCXO_TCXOINPUT_ON 0x10 |
||||
#define RFLR_TCXO_TCXOINPUT_OFF 0x00 // Default
|
||||
|
||||
/*!
|
||||
* RegPaDac |
||||
*/ |
||||
#define RFLR_PADAC_20DBM_MASK 0xF8 |
||||
#define RFLR_PADAC_20DBM_ON 0x07 |
||||
#define RFLR_PADAC_20DBM_OFF 0x04 // Default
|
||||
|
||||
/*!
|
||||
* RegPll |
||||
*/ |
||||
#define RFLR_PLL_BANDWIDTH_MASK 0x3F |
||||
#define RFLR_PLL_BANDWIDTH_75 0x00 |
||||
#define RFLR_PLL_BANDWIDTH_150 0x40 |
||||
#define RFLR_PLL_BANDWIDTH_225 0x80 |
||||
#define RFLR_PLL_BANDWIDTH_300 0xC0 // Default
|
||||
|
||||
/*!
|
||||
* RegPllLowPn |
||||
*/ |
||||
#define RFLR_PLLLOWPN_BANDWIDTH_MASK 0x3F |
||||
#define RFLR_PLLLOWPN_BANDWIDTH_75 0x00 |
||||
#define RFLR_PLLLOWPN_BANDWIDTH_150 0x40 |
||||
#define RFLR_PLLLOWPN_BANDWIDTH_225 0x80 |
||||
#define RFLR_PLLLOWPN_BANDWIDTH_300 0xC0 // Default
|
||||
|
||||
/*!
|
||||
* RegFormerTemp |
||||
*/ |
||||
|
||||
#endif // __SX1272_REGS_LORA_H__
|
@ -0,0 +1,269 @@ |
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> |
||||
<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40"><head> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> |
||||
|
||||
|
||||
<link rel="File-List" href="Library_files/filelist.xml"> |
||||
|
||||
|
||||
<link rel="Edit-Time-Data" href="Library_files/editdata.mso"><!--[if !mso]> <style> v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} </style> <![endif]--><title>Release Notes for sx1272mb2das Board Drivers</title><!--[if gte mso 9]><xml> <o:DocumentProperties> <o:Author>STMicroelectronics</o:Author> <o:LastAuthor>STMicroelectronics</o:LastAuthor> <o:Revision>37</o:Revision> <o:TotalTime>136</o:TotalTime> <o:Created>2009-02-27T19:26:00Z</o:Created> <o:LastSaved>2009-03-01T17:56:00Z</o:LastSaved> <o:Pages>1</o:Pages> <o:Words>522</o:Words> <o:Characters>2977</o:Characters> <o:Company>STMicroelectronics</o:Company> <o:Lines>24</o:Lines> <o:Paragraphs>6</o:Paragraphs> <o:CharactersWithSpaces>3493</o:CharactersWithSpaces> <o:Version>11.6568</o:Version> </o:DocumentProperties> </xml><![endif]--><!--[if gte mso 9]><xml> <w:WordDocument> <w:Zoom>110</w:Zoom> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<style> |
||||
<!-- |
||||
/* Style Definitions */ |
||||
p.MsoNormal, li.MsoNormal, div.MsoNormal |
||||
{mso-style-parent:""; |
||||
margin:0in; |
||||
margin-bottom:.0001pt; |
||||
mso-pagination:widow-orphan; |
||||
font-size:12.0pt; |
||||
font-family:"Times New Roman"; |
||||
mso-fareast-font-family:"Times New Roman";} |
||||
h2 |
||||
{mso-style-next:Normal; |
||||
margin-top:12.0pt; |
||||
margin-right:0in; |
||||
margin-bottom:3.0pt; |
||||
margin-left:0in; |
||||
mso-pagination:widow-orphan; |
||||
page-break-after:avoid; |
||||
mso-outline-level:2; |
||||
font-size:14.0pt; |
||||
font-family:Arial; |
||||
font-weight:bold; |
||||
font-style:italic;} |
||||
a:link, span.MsoHyperlink |
||||
{color:blue; |
||||
text-decoration:underline; |
||||
text-underline:single;} |
||||
a:visited, span.MsoHyperlinkFollowed |
||||
{color:blue; |
||||
text-decoration:underline; |
||||
text-underline:single;} |
||||
p |
||||
{mso-margin-top-alt:auto; |
||||
margin-right:0in; |
||||
mso-margin-bottom-alt:auto; |
||||
margin-left:0in; |
||||
mso-pagination:widow-orphan; |
||||
font-size:12.0pt; |
||||
font-family:"Times New Roman"; |
||||
mso-fareast-font-family:"Times New Roman";} |
||||
@page Section1 |
||||
{size:8.5in 11.0in; |
||||
margin:1.0in 1.25in 1.0in 1.25in; |
||||
mso-header-margin:.5in; |
||||
mso-footer-margin:.5in; |
||||
mso-paper-source:0;} |
||||
div.Section1 |
||||
{page:Section1;} |
||||
--> |
||||
</style><!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0in 5.4pt 0in 5.4pt; mso-para-margin:0in; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} </style> <![endif]--><!--[if gte mso 9]><xml> <o:shapedefaults v:ext="edit" spidmax="5122"/> </xml><![endif]--><!--[if gte mso 9]><xml> <o:shapelayout v:ext="edit"> <o:idmap v:ext="edit" data="1"/> </o:shapelayout></xml><![endif]--> |
||||
<meta content="MCD Application Team" name="author"></head> |
||||
<body link="blue" vlink="blue"> |
||||
<div class="Section1"> |
||||
<p class="MsoNormal"><span style="font-family: Arial;"><o:p><br> |
||||
</o:p></span></p> |
||||
<div align="center"> |
||||
<table class="MsoNormalTable" style="width: 675pt;" border="0" cellpadding="0" cellspacing="0" width="900"> |
||||
<tbody> |
||||
<tr> |
||||
<td style="padding: 0cm;" valign="top"> |
||||
<table class="MsoNormalTable" style="width: 675pt;" border="0" cellpadding="0" cellspacing="0" width="900"> |
||||
<tbody> |
||||
<tr style=""> |
||||
<td style="padding: 1.5pt;"> |
||||
<h1 style="margin-bottom: 18pt; text-align: center;" align="center"><span style="font-size: 20pt; font-family: Verdana; color: rgb(51, 102, 255);">Release |
||||
Notes for sx1272mb2das Board Drivers</span><span style="font-size: 20pt; font-family: Verdana;"><o:p></o:p></span></h1> |
||||
<p class="MsoNormal" style="text-align: center;" align="center"><span style="font-size: 10pt; font-family: Arial; color: black;">Copyright |
||||
2017 STMicroelectronics</span><span style="color: black;"><u1:p></u1:p><o:p></o:p></span></p> |
||||
<p class="MsoNormal" style="text-align: center;" align="center"><span style="font-size: 10pt; font-family: Arial; color: black;"><img alt="" id="_x0000_i1025" src="../../../_htmresc/st_logo.png" style="border: 0px solid ; width: 86px; height: 65px;"></span><span style="font-size: 10pt;"><o:p></o:p></span></p> |
||||
</td> |
||||
</tr> |
||||
</tbody> |
||||
</table> |
||||
<p class="MsoNormal"><span style="font-family: Arial; display: none;"><o:p> </o:p></span></p> |
||||
<table class="MsoNormalTable" style="width: 675pt;" border="0" cellpadding="0" width="900"> |
||||
<tbody> |
||||
<tr style=""> |
||||
<td style="padding: 0cm;" valign="top"> |
||||
<span style="font-family: "Times New Roman";"> |
||||
</span> |
||||
<h3 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; margin-right: 500pt; width: 200px;"> |
||||
<span style="font-size: 10pt; font-family: Arial; color: white;">V1.0.4 / 08-September-2017 |
||||
</span> |
||||
</h3> |
||||
<p class="MsoNormal" style="margin: 4.5pt 0cm 4.5pt 18pt;"> |
||||
<b style=""> |
||||
<u> |
||||
<span style="font-size: 10pt; font-family: Verdana; color: black;">Main Changes<o:p></o:p> |
||||
</span> |
||||
</u> |
||||
</b> |
||||
</p> |
||||
|
||||
<ul style="margin-top: 0cm;" type="square"> |
||||
<li class="MsoNormal"> |
||||
<span style="font-size: 10pt; font-family: Verdana;">Retrieve Public Network handling in the radio driver |
||||
<span style="font-weight: bold; font-style: italic;"> |
||||
</span> |
||||
</span> |
||||
</li> |
||||
</ul> |
||||
<span style="font-family: "Times New Roman";"> |
||||
</span> |
||||
<h3 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; margin-right: 500pt; width: 200px;"> |
||||
<span style="font-size: 10pt; font-family: Arial; color: white;">V1.0.3 / 01-June-2017 |
||||
</span> |
||||
</h3> |
||||
<p class="MsoNormal" style="margin: 4.5pt 0cm 4.5pt 18pt;"> |
||||
<b style=""> |
||||
<u> |
||||
<span style="font-size: 10pt; font-family: Verdana; color: black;">Main Changes<o:p></o:p> |
||||
</span> |
||||
</u> |
||||
</b> |
||||
</p> |
||||
|
||||
<ul style="margin-top: 0cm;" type="square"> |
||||
<li class="MsoNormal"> |
||||
<span style="font-size: 10pt; font-family: Verdana;">SX1272 radio driver externalized as component |
||||
<span style="font-weight: bold; font-style: italic;"> |
||||
</span> |
||||
</span> |
||||
</li> |
||||
</ul> |
||||
<span style="font-family: "Times New Roman";"> |
||||
</span> |
||||
<h3 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; margin-right: 500pt; width: 200px;"> |
||||
<span style="font-size: 10pt; font-family: Arial; color: white;">V1.0.2 / 27-February-2017 |
||||
</span> |
||||
</h3> |
||||
<p class="MsoNormal" style="margin: 4.5pt 0cm 4.5pt 18pt;"> |
||||
<b style=""> |
||||
<u> |
||||
<span style="font-size: 10pt; font-family: Verdana; color: black;">Main Changes<o:p></o:p> |
||||
</span> |
||||
</u> |
||||
</b> |
||||
</p> |
||||
|
||||
<ul style="margin-top: 0cm;" type="square"> |
||||
<li class="MsoNormal"> |
||||
<span style="font-size: 10pt; font-family: Verdana;">Power settings now board dependent |
||||
<span style="font-weight: bold; font-style: italic;"> |
||||
</span> |
||||
</span> |
||||
</li> |
||||
</ul> |
||||
<span style="font-family: "Times New Roman";"> |
||||
</span> |
||||
<h3 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; margin-right: 500pt; width: 200px;"> |
||||
<span style="font-size: 10pt; font-family: Arial; color: white;">V1.0.1 / 15-September-2016 |
||||
</span> |
||||
</h3> |
||||
<p class="MsoNormal" style="margin: 4.5pt 0cm 4.5pt 18pt;"> |
||||
<b style=""> |
||||
<u> |
||||
<span style="font-size: 10pt; font-family: Verdana; color: black;">Main Changes<o:p></o:p> |
||||
</span> |
||||
</u> |
||||
</b> |
||||
</p> |
||||
|
||||
<ul style="margin-top: 0cm;" type="square"> |
||||
<li class="MsoNormal"> |
||||
<span style="font-size: 10pt; font-family: Verdana;">Interrupt handling |
||||
<span style="font-weight: bold; font-style: italic;"> |
||||
</span> |
||||
</span> |
||||
</li> |
||||
</ul> |
||||
<span style="font-family: "Times New Roman";"> |
||||
</span> |
||||
<h3 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; margin-right: 500pt; width: 200px;"> |
||||
<span style="font-size: 10pt; font-family: Arial; color: white;">V1.0.0 / 01-July-2016 |
||||
</span> |
||||
</h3> |
||||
<p class="MsoNormal" style="margin: 4.5pt 0cm 4.5pt 18pt;"> |
||||
<b style=""> |
||||
<u> |
||||
<span style="font-size: 10pt; font-family: Verdana; color: black;">Main Changes<o:p></o:p> |
||||
</span> |
||||
</u> |
||||
</b> |
||||
</p> |
||||
|
||||
<ul style="margin-top: 0cm;" type="square"> |
||||
<li class="MsoNormal"> |
||||
<span style="font-size: 10pt; font-family: Verdana;">First Release |
||||
<span style="font-weight: bold; font-style: italic;"> |
||||
</span> |
||||
</span> |
||||
</li> |
||||
</ul> |
||||
<span style="font-size: 10pt; font-family: Verdana;"> |
||||
</span> |
||||
<h2 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;"> |
||||
<a name="License"></a> |
||||
<span style="font-size: 12pt; color: white;">License<o:p></o:p> |
||||
</span> |
||||
</h2> |
||||
<div style="text-align: justify;"> |
||||
<div style="text-align: justify;"><font size="-1"> |
||||
<span style="font-family: "Verdana","sans-serif";"> |
||||
Redistribution and use in source and binary forms, with or without |
||||
modification, are permitted provided that the following conditions are |
||||
met: |
||||
</span> |
||||
<br> |
||||
</font> |
||||
<ol><li><font size="-1"><span style="font-family: "Verdana","sans-serif";">Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.</span><span style="font-family: "Verdana","sans-serif";"></span></font></li><li><font size="-1"><span style="font-family: "Verdana","sans-serif";">Redistributions |
||||
in binary form must reproduce the above copyright notice, this list of |
||||
conditions and the following disclaimer in </span><span style="font-family: "Verdana","sans-serif";">the documentation and/or other materials provided with the distribution.</span><span style="font-family: "Verdana","sans-serif";"></span></font></li><li><font size="-1"><span style="font-family: "Verdana","sans-serif";">Neither the name of STMicroelectronics nor the names of its contributors may be used to endorse or promote products derived |
||||
</span><span style="font-family: "Verdana","sans-serif";">from this software without specific prior written permission.</span><br> |
||||
</font> |
||||
</li></ol> |
||||
<font size="-1"> |
||||
|
||||
<span style="font-family: "Verdana","sans-serif";">THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED</span><span style="font-family: "Verdana","sans-serif";"> WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A </span><span style="font-family: "Verdana","sans-serif";">PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY </span><span style="font-family: "Verdana","sans-serif";">DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, </span><span style="font-family: "Verdana","sans-serif";">PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER</span><span style="font-family: "Verdana","sans-serif";"> CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR </span><span style="font-family: "Verdana","sans-serif";">OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span></font> |
||||
|
||||
</div> |
||||
<span style="font-family: "Verdana","sans-serif";"></span></div> |
||||
<span style="font-size: 10pt; font-family: "Verdana","sans-serif"; color: black;"></span> <b><span style="font-size: 10pt; font-family: Verdana; color: black;"></span></b> |
||||
|
||||
<div class="MsoNormal" style="text-align: center;" align="center"><span style="color: black;"> |
||||
<hr align="center" size="2" width="100%"></span></div> |
||||
<p class="MsoNormal" style="margin: 4.5pt 0cm 4.5pt 18pt; text-align: center;" align="center"><span style="font-size: 10pt; font-family: Verdana; color: black;">For |
||||
complete documentation on </span><span style="font-size: 10pt; font-family: Verdana;">STM32<span style="color: black;"> Microcontrollers |
||||
visit </span><u><span style="color: blue;"><a href="http://www.st.com/internet/mcu/class/1734.jsp" target="_blank">www.st.com/STM32</a></span></u></span><span style="font-size: 10pt; font-family: Verdana;"><a target="_blank" href="http://www.st.com/internet/mcu/family/141.jsp"><u><span style="color: blue;"></span></u></a></span><span style="font-size: 10pt; font-family: Verdana;"><u><span style="color: blue;"></span></u></span><span style="color: black;"><o:p></o:p></span></p> |
||||
</td> |
||||
</tr> |
||||
</tbody> |
||||
</table> |
||||
<p class="MsoNormal"><span style="font-size: 10pt;"><o:p></o:p></span></p> |
||||
</td> |
||||
</tr> |
||||
</tbody> |
||||
</table> |
||||
</div> |
||||
<p class="MsoNormal"><o:p> </o:p></p> |
||||
</div> |
||||
|
||||
</body></html> |
@ -0,0 +1,262 @@ |
||||
/*
|
||||
/ _____) _ | | |
||||
( (____ _____ ____ _| |_ _____ ____| |__ |
||||
\____ \| ___ | (_ _) ___ |/ ___) _ \
|
||||
_____) ) ____| | | || |_| ____( (___| | | | |
||||
(______/|_____)_|_|_| \__)_____)\____)_| |_| |
||||
(C)2013 Semtech |
||||
|
||||
Description: SX1272 driver specific target board functions implementation |
||||
|
||||
License: Revised BSD License, see LICENSE.TXT file include in the project |
||||
|
||||
Maintainer: Miguel Luis and Gregory Cristian |
||||
*/ |
||||
/*******************************************************************************
|
||||
* @file sx1272mb2das.c |
||||
* @author MCD Application Team |
||||
* @version V1.0.4 |
||||
* @date 08-September-2017 |
||||
* @brief driver sx1272mb2das board
|
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT(c) 2017 STMicroelectronics</center></h2> |
||||
* |
||||
* 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 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 STMicroelectronics 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 HOLDER 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "hw.h" |
||||
#include "radio.h" |
||||
#include "sx1272.h" |
||||
#include "sx1272mb2das.h" |
||||
|
||||
|
||||
#define IRQ_HIGH_PRIORITY 0 |
||||
|
||||
/*!
|
||||
* Flag used to set the RF switch control pins in low power mode when the radio is not active. |
||||
*/ |
||||
|
||||
|
||||
void SX1272SetXO( uint8_t state ); |
||||
|
||||
uint32_t SX1272GetWakeTime( void ); |
||||
|
||||
void SX1272IoIrqInit( DioIrqHandler **irqHandlers ); |
||||
|
||||
uint8_t SX1272GetPaSelect( uint32_t channel ); |
||||
|
||||
void SX1272SetAntSwLowPower( bool status ); |
||||
|
||||
void SX1272SetRfTxPower( int8_t power ); |
||||
|
||||
void SX1272SetAntSw( uint8_t opMode ); |
||||
/*!
|
||||
* \brief Controls the antena switch if necessary. |
||||
* |
||||
* \remark see errata note |
||||
* |
||||
* \param [IN] opMode Current radio operating mode |
||||
*/ |
||||
static LoRaBoardCallback_t BoardCallbacks = { SX1272SetXO, |
||||
SX1272GetWakeTime, |
||||
SX1272IoIrqInit, |
||||
SX1272SetRfTxPower, |
||||
SX1272SetAntSwLowPower, |
||||
SX1272SetAntSw}; |
||||
|
||||
/*!
|
||||
* Radio driver structure initialization |
||||
*/ |
||||
const struct Radio_s Radio = |
||||
{ |
||||
SX1272IoInit, |
||||
SX1272IoDeInit, |
||||
SX1272Init, |
||||
SX1272GetStatus, |
||||
SX1272SetModem, |
||||
SX1272SetChannel, |
||||
SX1272IsChannelFree, |
||||
SX1272Random, |
||||
SX1272SetRxConfig, |
||||
SX1272SetTxConfig, |
||||
SX1272CheckRfFrequency, |
||||
SX1272GetTimeOnAir, |
||||
SX1272Send, |
||||
SX1272SetSleep, |
||||
SX1272SetStby, |
||||
SX1272SetRx, |
||||
SX1272StartCad, |
||||
SX1272SetTxContinuousWave, |
||||
SX1272ReadRssi, |
||||
SX1272Write, |
||||
SX1272Read, |
||||
SX1272WriteBuffer, |
||||
SX1272ReadBuffer, |
||||
SX1272SetMaxPayloadLength, |
||||
SX1272SetPublicNetwork, |
||||
SX1272GetRadioWakeUpTime |
||||
}; |
||||
|
||||
uint32_t SX1272GetWakeTime( void ) |
||||
{ |
||||
return BOARD_WAKEUP_TIME; |
||||
} |
||||
|
||||
void SX1272SetXO( uint8_t state ) |
||||
{ |
||||
} |
||||
void SX1272IoInit( void ) |
||||
{ |
||||
GPIO_InitTypeDef initStruct={0}; |
||||
|
||||
SX1272BoardInit( &BoardCallbacks ); |
||||
|
||||
initStruct.Mode = GPIO_MODE_IT_RISING; |
||||
initStruct.Pull = GPIO_PULLDOWN; |
||||
initStruct.Speed = GPIO_SPEED_HIGH; |
||||
|
||||
HW_GPIO_Init( RADIO_DIO_0_PORT, RADIO_DIO_0_PIN, &initStruct ); |
||||
HW_GPIO_Init( RADIO_DIO_1_PORT, RADIO_DIO_1_PIN, &initStruct ); |
||||
HW_GPIO_Init( RADIO_DIO_2_PORT, RADIO_DIO_2_PIN, &initStruct ); |
||||
HW_GPIO_Init( RADIO_DIO_3_PORT, RADIO_DIO_3_PIN, &initStruct ); |
||||
} |
||||
|
||||
void SX1272IoIrqInit( DioIrqHandler **irqHandlers ) |
||||
{ |
||||
HW_GPIO_SetIrq( RADIO_DIO_0_PORT, RADIO_DIO_0_PIN, IRQ_HIGH_PRIORITY, irqHandlers[0] ); |
||||
HW_GPIO_SetIrq( RADIO_DIO_1_PORT, RADIO_DIO_1_PIN, IRQ_HIGH_PRIORITY, irqHandlers[1] ); |
||||
HW_GPIO_SetIrq( RADIO_DIO_2_PORT, RADIO_DIO_2_PIN, IRQ_HIGH_PRIORITY, irqHandlers[2] ); |
||||
HW_GPIO_SetIrq( RADIO_DIO_3_PORT, RADIO_DIO_3_PIN, IRQ_HIGH_PRIORITY, irqHandlers[3] ); |
||||
} |
||||
|
||||
void SX1272IoDeInit( void ) |
||||
{ |
||||
GPIO_InitTypeDef initStruct={0}; |
||||
|
||||
initStruct.Mode = GPIO_MODE_IT_RISING ;//GPIO_MODE_ANALOG;
|
||||
initStruct.Pull = GPIO_PULLDOWN; |
||||
|
||||
HW_GPIO_Init( RADIO_DIO_0_PORT, RADIO_DIO_0_PIN, &initStruct ); |
||||
HW_GPIO_Init( RADIO_DIO_1_PORT, RADIO_DIO_1_PIN, &initStruct ); |
||||
HW_GPIO_Init( RADIO_DIO_2_PORT, RADIO_DIO_2_PIN, &initStruct ); |
||||
HW_GPIO_Init( RADIO_DIO_3_PORT, RADIO_DIO_3_PIN, &initStruct ); |
||||
} |
||||
|
||||
void SX1272SetRfTxPower( int8_t power ) |
||||
{ |
||||
uint8_t paConfig = 0; |
||||
uint8_t paDac = 0; |
||||
|
||||
paConfig = SX1272Read( REG_PACONFIG ); |
||||
paDac = SX1272Read( REG_PADAC ); |
||||
|
||||
paConfig = ( paConfig & RF_PACONFIG_PASELECT_MASK ) | SX1272GetPaSelect( SX1272.Settings.Channel ); |
||||
|
||||
if( ( paConfig & RF_PACONFIG_PASELECT_PABOOST ) == RF_PACONFIG_PASELECT_PABOOST ) |
||||
{ |
||||
if( power > 17 ) |
||||
{ |
||||
paDac = ( paDac & RF_PADAC_20DBM_MASK ) | RF_PADAC_20DBM_ON; |
||||
} |
||||
else |
||||
{ |
||||
paDac = ( paDac & RF_PADAC_20DBM_MASK ) | RF_PADAC_20DBM_OFF; |
||||
} |
||||
if( ( paDac & RF_PADAC_20DBM_ON ) == RF_PADAC_20DBM_ON ) |
||||
{ |
||||
if( power < 5 ) |
||||
{ |
||||
power = 5; |
||||
} |
||||
if( power > 20 ) |
||||
{ |
||||
power = 20; |
||||
} |
||||
paConfig = ( paConfig & RFLR_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power - 5 ) & 0x0F ); |
||||
} |
||||
else |
||||
{ |
||||
if( power < 2 ) |
||||
{ |
||||
power = 2; |
||||
} |
||||
if( power > 17 ) |
||||
{ |
||||
power = 17; |
||||
} |
||||
paConfig = ( paConfig & RFLR_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power - 2 ) & 0x0F ); |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
if( power < -1 ) |
||||
{ |
||||
power = -1; |
||||
} |
||||
if( power > 14 ) |
||||
{ |
||||
power = 14; |
||||
} |
||||
paConfig = ( paConfig & RFLR_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power + 1 ) & 0x0F ); |
||||
} |
||||
SX1272Write( REG_PACONFIG, paConfig ); |
||||
SX1272Write( REG_PADAC, paDac ); |
||||
} |
||||
|
||||
uint8_t SX1272GetPaSelect( uint32_t channel ) |
||||
{ |
||||
return RF_PACONFIG_PASELECT_RFO; |
||||
} |
||||
|
||||
void SX1272SetAntSwLowPower( bool status ) |
||||
{ |
||||
//Ant Switch Controlled by SX1272 IC
|
||||
} |
||||
|
||||
void SX1272SetAntSw( uint8_t opMode ) |
||||
{ |
||||
switch( opMode ) |
||||
{ |
||||
case RFLR_OPMODE_TRANSMITTER: |
||||
SX1272.RxTx = 1; |
||||
break; |
||||
case RFLR_OPMODE_RECEIVER: |
||||
case RFLR_OPMODE_RECEIVER_SINGLE: |
||||
case RFLR_OPMODE_CAD: |
||||
default: |
||||
SX1272.RxTx = 0; |
||||
break; |
||||
} |
||||
} |
||||
|
||||
bool SX1272CheckRfFrequency( uint32_t frequency ) |
||||
{ |
||||
// Implement check. Currently all frequencies are supported
|
||||
return true; |
||||
} |
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,98 @@ |
||||
/*
|
||||
/ _____) _ | | |
||||
( (____ _____ ____ _| |_ _____ ____| |__ |
||||
\____ \| ___ | (_ _) ___ |/ ___) _ \
|
||||
_____) ) ____| | | || |_| ____( (___| | | | |
||||
(______/|_____)_|_|_| \__)_____)\____)_| |_| |
||||
(C)2013 Semtech |
||||
|
||||
Description: SX1272 driver specific target board functions implementation |
||||
|
||||
License: Revised BSD License, see LICENSE.TXT file include in the project |
||||
|
||||
Maintainer: Miguel Luis and Gregory Cristian |
||||
*/ |
||||
/*******************************************************************************
|
||||
* @file sx1272mb2das.c |
||||
* @author MCD Application Team |
||||
* @version V1.0.4 |
||||
* @date 08-September-2017 |
||||
* @brief driver sx1272 board ( sx1272mb2das ) |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© COPYRIGHT(c) 2017 STMicroelectronics</center></h2> |
||||
* |
||||
* 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 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 STMicroelectronics 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 HOLDER 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __SX1272MB2DAS__ |
||||
#define __SX1272MB2DAS__ |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
/* Exported types ------------------------------------------------------------*/ |
||||
/* Exported constants --------------------------------------------------------*/ |
||||
|
||||
#define BOARD_WAKEUP_TIME 0 // no TCXO
|
||||
|
||||
/* Exported functions ------------------------------------------------------- */
|
||||
|
||||
/*!
|
||||
* \brief Initializes the radio I/Os pins interface |
||||
*/ |
||||
void SX1272IoInit( void ); |
||||
|
||||
|
||||
/*!
|
||||
* \brief De-initializes the radio I/Os pins interface. |
||||
* |
||||
* \remark Useful when going in MCU low power modes |
||||
*/ |
||||
void SX1272IoDeInit( void ); |
||||
|
||||
/*!
|
||||
* \brief Checks if the given RF frequency is supported by the hardware |
||||
* |
||||
* \param [IN] frequency RF frequency to be checked |
||||
* \retval isSupported [true: supported, false: unsupported] |
||||
*/ |
||||
bool SX1272CheckRfFrequency( uint32_t frequency ); |
||||
|
||||
/*!
|
||||
* Radio hardware and global parameters |
||||
*/ |
||||
extern SX1272_t SX1272; |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __SX1272MB2DAS__ */ |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,147 @@ |
||||
/*
|
||||
/ _____) _ | | |
||||
( (____ _____ ____ _| |_ _____ ____| |__ |
||||
\____ \| ___ | (_ _) ___ |/ ___) _ \
|
||||
_____) ) ____| | | || |_| ____( (___| | | | |
||||
(______/|_____)_|_|_| \__)_____)\____)_| |_| |
||||
(C)2015 Semtech |
||||
|
||||
Description: End device commissioning parameters |
||||
|
||||
License: Revised BSD License, see LICENSE.TXT file include in the project |
||||
|
||||
Maintainer: Miguel Luis and Gregory Cristian |
||||
*/ |
||||
/******************************************************************************
|
||||
* @file commissioning.h |
||||
* @author MCD Application Team |
||||
* @version V1.1.2 |
||||
* @date 08-September-2017 |
||||
* @brief End device commissioning parameters |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics International N.V.
|
||||
* All rights reserved.</center></h2> |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted, provided that the following conditions are met: |
||||
* |
||||
* 1. Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer. |
||||
* 2. 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. |
||||
* 3. Neither the name of STMicroelectronics nor the names of other
|
||||
* contributors to this software may be used to endorse or promote products
|
||||
* derived from this software without specific written permission. |
||||
* 4. This software, including modifications and/or derivative works of this
|
||||
* software, must execute solely and exclusively on microcontroller or |
||||
* microprocessor devices manufactured by or for STMicroelectronics. |
||||
* 5. Redistribution and use of this software other than as permitted under
|
||||
* this license is void and will automatically terminate your rights under
|
||||
* this license.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
* PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY |
||||
* RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
|
||||
* SHALL STMICROELECTRONICS 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __LORA_COMMISSIONING_H__ |
||||
#define __LORA_COMMISSIONING_H__ |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
/* Exported constants --------------------------------------------------------*/ |
||||
/* External variables --------------------------------------------------------*/ |
||||
/* Exported macros -----------------------------------------------------------*/ |
||||
/* Exported functions ------------------------------------------------------- */
|
||||
/*!
|
||||
* When set to 1 the application uses the Over-the-Air activation procedure |
||||
* When set to 0 the application uses the Personalization activation procedure |
||||
*/ |
||||
#define OVER_THE_AIR_ACTIVATION 1 |
||||
|
||||
/*!
|
||||
* Indicates if the end-device is to be connected to a private or public network |
||||
*/ |
||||
#define LORAWAN_PUBLIC_NETWORK true |
||||
|
||||
/*!
|
||||
* When set to 1 DevEui is LORAWAN_DEVICE_EUI |
||||
* When set to 0 DevEui is automatically generated by calling |
||||
* BoardGetUniqueId function |
||||
*/ |
||||
#define STATIC_DEVICE_EUI 0 |
||||
|
||||
/*!
|
||||
* Mote device IEEE EUI (big endian) |
||||
* |
||||
* \remark see STATIC_DEVICE_EUI comments |
||||
*/ |
||||
#define LORAWAN_DEVICE_EUI { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 } |
||||
|
||||
|
||||
/*!
|
||||
* Application IEEE EUI (big endian) |
||||
*/ |
||||
#define LORAWAN_APPLICATION_EUI { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 } |
||||
|
||||
/*!
|
||||
* AES encryption/decryption cipher application key |
||||
*/ |
||||
#define LORAWAN_APPLICATION_KEY { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C } |
||||
|
||||
#if( OVER_THE_AIR_ACTIVATION == 0 ) |
||||
|
||||
/*!
|
||||
* Current network ID |
||||
*/ |
||||
#define LORAWAN_NETWORK_ID ( uint32_t )0 |
||||
|
||||
/*!
|
||||
* When set to 1 DevAdd is LORAWAN_DEVICE_ADDRESS |
||||
* When set to 0 DevAdd is automatically generated using |
||||
* a pseudo random generator seeded with a value derived from |
||||
* BoardUniqueId value |
||||
*/ |
||||
#define STATIC_DEVICE_ADDRESS 0 |
||||
/*!
|
||||
* Device address on the network (big endian) |
||||
* |
||||
* \remark see STATIC_DEVICE_ADDRESS comments |
||||
*/ |
||||
#define LORAWAN_DEVICE_ADDRESS ( uint32_t )0x0100000a |
||||
|
||||
/*!
|
||||
* AES encryption/decryption cipher network session key |
||||
*/ |
||||
#define LORAWAN_NWKSKEY { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C } |
||||
|
||||
/*!
|
||||
* AES encryption/decryption cipher application session key |
||||
*/ |
||||
#define LORAWAN_APPSKEY { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C } |
||||
|
||||
#endif /* OVER_THE_AIR_ACTIVATION == 0 */ |
||||
|
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __LORA_COMMISSIONING_H__ */ |
@ -0,0 +1,154 @@ |
||||
/*
|
||||
/ _____) _ | | |
||||
( (____ _____ ____ _| |_ _____ ____| |__ |
||||
\____ \| ___ | (_ _) ___ |/ ___) _ \
|
||||
_____) ) ____| | | || |_| ____( (___| | | | |
||||
(______/|_____)_|_|_| \__)_____)\____)_| |_| |
||||
(C)2013 Semtech |
||||
|
||||
Description: Bleeper board GPIO driver implementation |
||||
|
||||
License: Revised BSD License, see LICENSE.TXT file include in the project |
||||
|
||||
Maintainer: Miguel Luis and Gregory Cristian |
||||
*/ |
||||
/******************************************************************************
|
||||
* @file hw_gpio.h |
||||
* @author MCD Application Team |
||||
* @version V1.1.2 |
||||
* @date 08-September-2017 |
||||
* @brief Header for driver hw_rtc.c module |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics International N.V.
|
||||
* All rights reserved.</center></h2> |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted, provided that the following conditions are met: |
||||
* |
||||
* 1. Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer. |
||||
* 2. 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. |
||||
* 3. Neither the name of STMicroelectronics nor the names of other
|
||||
* contributors to this software may be used to endorse or promote products
|
||||
* derived from this software without specific written permission. |
||||
* 4. This software, including modifications and/or derivative works of this
|
||||
* software, must execute solely and exclusively on microcontroller or |
||||
* microprocessor devices manufactured by or for STMicroelectronics. |
||||
* 5. Redistribution and use of this software other than as permitted under
|
||||
* this license is void and will automatically terminate your rights under
|
||||
* this license.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
* PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY |
||||
* RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
|
||||
* SHALL STMICROELECTRONICS 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
#if 0 |
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __HW_GPIO_H__ |
||||
#define __HW_GPIO_H__ |
||||
|
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
|
||||
typedef void( GpioIrqHandler )( void ); |
||||
|
||||
/* Exported constants --------------------------------------------------------*/ |
||||
/* External variables --------------------------------------------------------*/ |
||||
/* Exported macros -----------------------------------------------------------*/ |
||||
/* Exported functions ------------------------------------------------------- */
|
||||
|
||||
|
||||
/*!
|
||||
* GPIO IRQ handler function prototype |
||||
*/ |
||||
|
||||
|
||||
IRQn_Type MSP_GetIRQn( uint16_t gpioPin); |
||||
|
||||
|
||||
/*!
|
||||
* @brief Initializes the given GPIO object |
||||
* |
||||
* @param GPIOx: where x can be (A..E and H) |
||||
* @param GPIO_Pin: specifies the port bit to be written. |
||||
* This parameter can be one of GPIO_PIN_x where x can be (0..15). |
||||
* All port bits are not necessarily available on all GPIOs. |
||||
* @param [IN] initStruct GPIO_InitTypeDef intit structure |
||||
* @retval none |
||||
*/ |
||||
void HW_GPIO_Init( GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_InitTypeDef* initStruct); |
||||
|
||||
/*!
|
||||
* @brief Records the interrupt handler for the GPIO object |
||||
* |
||||
* @param GPIOx: where x can be (A..E and H)
|
||||
* @param GPIO_Pin: specifies the port bit to be written. |
||||
* This parameter can be one of GPIO_PIN_x where x can be (0..15). |
||||
* All port bits are not necessarily available on all GPIOs. |
||||
* @param [IN] prio NVIC priority (0 is highest) |
||||
* @param [IN] irqHandler points to the function to execute |
||||
* @retval none |
||||
*/ |
||||
void HW_GPIO_SetIrq( GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, uint32_t prio, GpioIrqHandler *irqHandler ); |
||||
|
||||
/*!
|
||||
* @brief Execute the interrupt from the object |
||||
* |
||||
* @param GPIOx: where x can be (A..E and H)
|
||||
* @param GPIO_Pin: specifies the port bit to be written. |
||||
* This parameter can be one of GPIO_PIN_x where x can be (0..15). |
||||
* All port bits are not necessarily available on all GPIOs. |
||||
* @retval none |
||||
*/ |
||||
void HW_GPIO_IrqHandler( uint16_t GPIO_Pin ); |
||||
|
||||
/*!
|
||||
* @brief Writes the given value to the GPIO output |
||||
* |
||||
* @param GPIO_Pin: specifies the port bit to be written. |
||||
* This parameter can be one of GPIO_PIN_x where x can be (0..15). |
||||
* All port bits are not necessarily available on all GPIOs. |
||||
* @param [IN] value New GPIO output value |
||||
* @retval none |
||||
*/ |
||||
void HW_GPIO_Write( GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, uint32_t value ); |
||||
|
||||
/*!
|
||||
* @brief Reads the current GPIO input value |
||||
* |
||||
* @param GPIOx: where x can be (A..E and H)
|
||||
* @param GPIO_Pin: specifies the port bit to be written. |
||||
* This parameter can be one of GPIO_PIN_x where x can be (0..15). |
||||
* All port bits are not necessarily available on all GPIOs. |
||||
* @retval value Current GPIO input value |
||||
*/ |
||||
uint32_t HW_GPIO_Read( GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin ); |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __HW_GPIO_H__ */ |
||||
#endif |
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
||||
|
@ -0,0 +1,181 @@ |
||||
/*
|
||||
/ _____) _ | | |
||||
( (____ _____ ____ _| |_ _____ ____| |__ |
||||
\____ \| ___ | (_ _) ___ |/ ___) _ \
|
||||
_____) ) ____| | | || |_| ____( (___| | | | |
||||
(______/|_____)_|_|_| \__)_____)\____)_| |_| |
||||
(C)2013 Semtech |
||||
|
||||
Description: Bleeper board GPIO driver implementation |
||||
|
||||
License: Revised BSD License, see LICENSE.TXT file include in the project |
||||
|
||||
Maintainer: Miguel Luis and Gregory Cristian |
||||
*/ |
||||
/******************************************************************************
|
||||
* @file hw_rtc.h |
||||
* @author MCD Application Team |
||||
* @version V1.1.2 |
||||
* @date 08-September-2017 |
||||
* @brief Header for driver hw_rtc.c module |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics International N.V.
|
||||
* All rights reserved.</center></h2> |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted, provided that the following conditions are met: |
||||
* |
||||
* 1. Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer. |
||||
* 2. 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. |
||||
* 3. Neither the name of STMicroelectronics nor the names of other
|
||||
* contributors to this software may be used to endorse or promote products
|
||||
* derived from this software without specific written permission. |
||||
* 4. This software, including modifications and/or derivative works of this
|
||||
* software, must execute solely and exclusively on microcontroller or |
||||
* microprocessor devices manufactured by or for STMicroelectronics. |
||||
* 5. Redistribution and use of this software other than as permitted under
|
||||
* this license is void and will automatically terminate your rights under
|
||||
* this license.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
* PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY |
||||
* RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
|
||||
* SHALL STMICROELECTRONICS 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
#if 0 |
||||
|
||||
#ifndef __HW_RTC_H__ |
||||
#define __HW_RTC_H__ |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "utilities.h" |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
/* Exported constants --------------------------------------------------------*/ |
||||
/* External variables --------------------------------------------------------*/ |
||||
/* Exported macros -----------------------------------------------------------*/ |
||||
/* Exported functions ------------------------------------------------------- */
|
||||
|
||||
/*!
|
||||
* @brief Initializes the RTC timer |
||||
* @note The timer is based on the RTC |
||||
* @param none |
||||
* @retval none |
||||
*/ |
||||
void HW_RTC_Init( void ); |
||||
|
||||
/*!
|
||||
* @brief Stop the Alarm |
||||
* @param none |
||||
* @retval none |
||||
*/ |
||||
void HW_RTC_StopAlarm( void ); |
||||
|
||||
/*!
|
||||
* @brief Return the minimum timeout the RTC is able to handle |
||||
* @param none |
||||
* @retval minimum value for a timeout |
||||
*/ |
||||
uint32_t HW_RTC_GetMinimumTimeout( void ); |
||||
|
||||
/*!
|
||||
* @brief Set the alarm |
||||
* @note The alarm is set at Reference + timeout |
||||
* @param timeout Duration of the Timer in ticks |
||||
*/ |
||||
void HW_RTC_SetAlarm( uint32_t timeout ); |
||||
|
||||
/*!
|
||||
* @brief Get the RTC timer elapsed time since the last Reference was set |
||||
* @retval RTC Elapsed time in ticks |
||||
*/ |
||||
uint32_t HW_RTC_GetTimerElapsedTime( void ); |
||||
|
||||
/*!
|
||||
* @brief Get the RTC timer value |
||||
* @retval none |
||||
*/ |
||||
uint32_t HW_RTC_GetTimerValue( void ); |
||||
|
||||
/*!
|
||||
* @brief Set the RTC timer Reference |
||||
* @retval Timer Reference Value in Ticks |
||||
*/ |
||||
uint32_t HW_RTC_SetTimerContext( void ); |
||||
|
||||
/*!
|
||||
* @brief Get the RTC timer Reference |
||||
* @retval Timer Value in Ticks |
||||
*/ |
||||
uint32_t HW_RTC_GetTimerContext( void ); |
||||
/*!
|
||||
* @brief RTC IRQ Handler on the RTC Alarm |
||||
* @param none |
||||
* @retval none |
||||
*/ |
||||
void HW_RTC_IrqHandler ( void ); |
||||
|
||||
/*!
|
||||
* @brief a delay of delay ms by polling RTC |
||||
* @param delay in ms |
||||
* @param none |
||||
* @retval none |
||||
*/ |
||||
void HW_RTC_DelayMs( uint32_t delay ); |
||||
|
||||
/*!
|
||||
* @brief calculates the wake up time between wake up and mcu start |
||||
* @note resolution in RTC_ALARM_TIME_BASE |
||||
* @param none |
||||
* @retval none |
||||
*/ |
||||
void HW_RTC_setMcuWakeUpTime( void ); |
||||
|
||||
/*!
|
||||
* @brief returns the wake up time in us |
||||
* @param none |
||||
* @retval wake up time in ticks |
||||
*/ |
||||
int16_t HW_RTC_getMcuWakeUpTime( void ); |
||||
|
||||
/*!
|
||||
* @brief converts time in ms to time in ticks |
||||
* @param [IN] time in milliseconds |
||||
* @retval returns time in timer ticks |
||||
*/ |
||||
uint32_t HW_RTC_ms2Tick( TimerTime_t timeMicroSec ); |
||||
|
||||
/*!
|
||||
* @brief converts time in ticks to time in ms |
||||
* @param [IN] time in timer ticks |
||||
* @retval returns time in timer milliseconds |
||||
*/ |
||||
TimerTime_t HW_RTC_Tick2ms( uint32_t tick ); |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __HW_RTC_H__ */ |
||||
|
||||
#endif |
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,128 @@ |
||||
/*
|
||||
/ _____) _ | | |
||||
( (____ _____ ____ _| |_ _____ ____| |__ |
||||
\____ \| ___ | (_ _) ___ |/ ___) _ \
|
||||
_____) ) ____| | | || |_| ____( (___| | | | |
||||
(______/|_____)_|_|_| \__)_____)\____)_| |_| |
||||
(C)2013 Semtech |
||||
|
||||
Description: Header for driver hw spi module |
||||
|
||||
License: Revised BSD License, see LICENSE.TXT file include in the project |
||||
|
||||
Maintainer: Miguel Luis and Gregory Cristian |
||||
*/ |
||||
/******************************************************************************
|
||||
* @file hw_spi.h |
||||
* @author MCD Application Team |
||||
* @version V1.1.2 |
||||
* @date 08-September-2017 |
||||
* @brief Header for driver hw_spi.c module |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics International N.V.
|
||||
* All rights reserved.</center></h2> |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted, provided that the following conditions are met: |
||||
* |
||||
* 1. Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer. |
||||
* 2. 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. |
||||
* 3. Neither the name of STMicroelectronics nor the names of other
|
||||
* contributors to this software may be used to endorse or promote products
|
||||
* derived from this software without specific written permission. |
||||
* 4. This software, including modifications and/or derivative works of this
|
||||
* software, must execute solely and exclusively on microcontroller or |
||||
* microprocessor devices manufactured by or for STMicroelectronics. |
||||
* 5. Redistribution and use of this software other than as permitted under
|
||||
* this license is void and will automatically terminate your rights under
|
||||
* this license.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
* PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY |
||||
* RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
|
||||
* SHALL STMICROELECTRONICS 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
#if 0 |
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __HW_SPI_H__ |
||||
#define __HW_SPI_H__ |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
/* Exported constants --------------------------------------------------------*/ |
||||
/* External variables --------------------------------------------------------*/ |
||||
/* Exported macros -----------------------------------------------------------*/ |
||||
/* Exported functions ------------------------------------------------------- */
|
||||
|
||||
/*!
|
||||
* @brief Initializes the SPI object and MCU peripheral |
||||
* |
||||
* @param [IN] none |
||||
*/ |
||||
void HW_SPI_Init( void ); |
||||
|
||||
/*!
|
||||
* @brief De-initializes the SPI object and MCU peripheral |
||||
* |
||||
* @param [IN] none |
||||
*/ |
||||
void HW_SPI_DeInit( void ); |
||||
|
||||
/*!
|
||||
* @brief Initializes the SPI IOs |
||||
* |
||||
* @param [IN] none |
||||
*/ |
||||
void HW_SPI_IoInit( void ); |
||||
|
||||
/*!
|
||||
* @brief De-initializes the SPI IOs |
||||
* |
||||
* @param [IN] none |
||||
*/ |
||||
void HW_SPI_IoDeInit( void ); |
||||
|
||||
/*!
|
||||
* @brief Sends outData and receives inData |
||||
* |
||||
* @param [IN] outData Byte to be sent |
||||
* @retval inData Received byte. |
||||
*/ |
||||
uint16_t HW_SPI_InOut( uint16_t outData ); |
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __HW_SPI_H__ */ |
||||
#endif |
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,87 @@ |
||||
/*
|
||||
/ _____) _ | | |
||||
( (____ _____ ____ _| |_ _____ ____| |__ |
||||
\____ \| ___ | (_ _) ___ |/ ___) _ \
|
||||
_____) ) ____| | | || |_| ____( (___| | | | |
||||
(______/|_____)_|_|_| \__)_____)\____)_| |_| |
||||
(C)2013 Semtech |
||||
|
||||
Description: contains all hardware driver |
||||
|
||||
License: Revised BSD License, see LICENSE.TXT file include in the project |
||||
|
||||
Maintainer: Miguel Luis and Gregory Cristian |
||||
*/ |
||||
/******************************************************************************
|
||||
* @file hw.h |
||||
* @author MCD Application Team |
||||
* @version V1.1.2 |
||||
* @date 08-September-2017 |
||||
* @brief contains all hardware driver |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics International N.V.
|
||||
* All rights reserved.</center></h2> |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted, provided that the following conditions are met: |
||||
* |
||||
* 1. Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer. |
||||
* 2. 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. |
||||
* 3. Neither the name of STMicroelectronics nor the names of other
|
||||
* contributors to this software may be used to endorse or promote products
|
||||
* derived from this software without specific written permission. |
||||
* 4. This software, including modifications and/or derivative works of this
|
||||
* software, must execute solely and exclusively on microcontroller or |
||||
* microprocessor devices manufactured by or for STMicroelectronics. |
||||
* 5. Redistribution and use of this software other than as permitted under
|
||||
* this license is void and will automatically terminate your rights under
|
||||
* this license.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
* PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY |
||||
* RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
|
||||
* SHALL STMICROELECTRONICS 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
#if 0 |
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __HW_H__ |
||||
#define __HW_H__ |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include <math.h> |
||||
#include <stdbool.h> |
||||
#include <stdint.h> |
||||
#include "hw_conf.h" |
||||
#include "hw_gpio.h" |
||||
#include "hw_spi.h" |
||||
#include "hw_rtc.h" |
||||
#include "hw_msp.h" |
||||
#include "debug.h" |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __HW_H__ */ |
||||
|
||||
#endif |
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
||||
|
@ -0,0 +1,192 @@ |
||||
/*
|
||||
/ _____) _ | | |
||||
( (____ _____ ____ _| |_ _____ ____| |__ |
||||
\____ \| ___ | (_ _) ___ |/ ___) _ \
|
||||
_____) ) ____| | | || |_| ____( (___| | | | |
||||
(______/|_____)_|_|_| \__)_____)\____)_| |_| |
||||
(C)2013 Semtech |
||||
|
||||
Description: Bleeper board GPIO driver implementation |
||||
|
||||
License: Revised BSD License, see LICENSE.TXT file include in the project |
||||
|
||||
Maintainer: Miguel Luis and Gregory Cristian |
||||
*/ |
||||
/******************************************************************************
|
||||
* @file hw_gpio.c |
||||
* @author MCD Application Team |
||||
* @version V1.1.2 |
||||
* @date 08-September-2017 |
||||
* @brief driver for GPIO |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics International N.V.
|
||||
* All rights reserved.</center></h2> |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted, provided that the following conditions are met: |
||||
* |
||||
* 1. Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer. |
||||
* 2. 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. |
||||
* 3. Neither the name of STMicroelectronics nor the names of other
|
||||
* contributors to this software may be used to endorse or promote products
|
||||
* derived from this software without specific written permission. |
||||
* 4. This software, including modifications and/or derivative works of this
|
||||
* software, must execute solely and exclusively on microcontroller or |
||||
* microprocessor devices manufactured by or for STMicroelectronics. |
||||
* 5. Redistribution and use of this software other than as permitted under
|
||||
* this license is void and will automatically terminate your rights under
|
||||
* this license.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
* PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY |
||||
* RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
|
||||
* SHALL STMICROELECTRONICS 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
#if 0 |
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "hw.h" |
||||
|
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private define ------------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
static GpioIrqHandler *GpioIrq[16] = { NULL }; |
||||
|
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
|
||||
static uint8_t HW_GPIO_GetBitPos(uint16_t GPIO_Pin); |
||||
|
||||
/* Exported functions ---------------------------------------------------------*/ |
||||
/*!
|
||||
* @brief Initializes the given GPIO object |
||||
* |
||||
* @param GPIOx: where x can be (A..E and H) |
||||
* @param GPIO_Pin: specifies the port bit to be written. |
||||
* This parameter can be one of GPIO_PIN_x where x can be (0..15). |
||||
* All port bits are not necessarily available on all GPIOs. |
||||
* @param [IN] initStruct GPIO_InitTypeDef intit structure |
||||
* @retval none |
||||
*/ |
||||
void HW_GPIO_Init( GPIO_TypeDef* port, uint16_t GPIO_Pin, GPIO_InitTypeDef* initStruct) |
||||
{ |
||||
|
||||
RCC_GPIO_CLK_ENABLE( (uint32_t) port); |
||||
|
||||
initStruct->Pin = GPIO_Pin ; |
||||
|
||||
HAL_GPIO_Init( port, initStruct ); |
||||
} |
||||
|
||||
/*!
|
||||
* @brief Records the interrupt handler for the GPIO object |
||||
* |
||||
* @param GPIOx: where x can be (A..E and H)
|
||||
* @param GPIO_Pin: specifies the port bit to be written. |
||||
* This parameter can be one of GPIO_PIN_x where x can be (0..15). |
||||
* All port bits are not necessarily available on all GPIOs. |
||||
* @param [IN] prio NVIC priority (0 is highest) |
||||
* @param [IN] irqHandler points to the function to execute |
||||
* @retval none |
||||
*/ |
||||
void HW_GPIO_SetIrq( GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, uint32_t prio, GpioIrqHandler *irqHandler ) |
||||
{ |
||||
IRQn_Type IRQnb; |
||||
|
||||
uint32_t BitPos = HW_GPIO_GetBitPos( GPIO_Pin ) ; |
||||
|
||||
if ( irqHandler != NULL) |
||||
{ |
||||
GpioIrq[ BitPos ] = irqHandler; |
||||
|
||||
IRQnb = MSP_GetIRQn( GPIO_Pin ); |
||||
|
||||
HAL_NVIC_SetPriority( IRQnb , prio, 0); |
||||
|
||||
HAL_NVIC_EnableIRQ( IRQnb ); |
||||
} |
||||
} |
||||
|
||||
/*!
|
||||
* @brief Execute the interrupt from the object |
||||
* |
||||
* @param GPIO_Pin: specifies the port bit to be written. |
||||
* This parameter can be one of GPIO_PIN_x where x can be (0..15). |
||||
* All port bits are not necessarily available on all GPIOs. |
||||
* @retval none |
||||
*/ |
||||
void HW_GPIO_IrqHandler( uint16_t GPIO_Pin ) |
||||
{ |
||||
uint32_t BitPos = HW_GPIO_GetBitPos( GPIO_Pin ); |
||||
|
||||
if ( GpioIrq[ BitPos ] != NULL) |
||||
{ |
||||
GpioIrq[ BitPos ] ( ); |
||||
} |
||||
} |
||||
|
||||
/*!
|
||||
* @brief Writes the given value to the GPIO output |
||||
* |
||||
* @param GPIO_Pin: specifies the port bit to be written. |
||||
* This parameter can be one of GPIO_PIN_x where x can be (0..15). |
||||
* All port bits are not necessarily available on all GPIOs. |
||||
* @param [IN] value New GPIO output value |
||||
* @retval none |
||||
*/ |
||||
void HW_GPIO_Write( GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, uint32_t value ) |
||||
{ |
||||
HAL_GPIO_WritePin( GPIOx, GPIO_Pin , (GPIO_PinState) value ); |
||||
} |
||||
|
||||
/*!
|
||||
* @brief Reads the current GPIO input value |
||||
* |
||||
* @param GPIOx: where x can be (A..E and H)
|
||||
* @param GPIO_Pin: specifies the port bit to be written. |
||||
* This parameter can be one of GPIO_PIN_x where x can be (0..15). |
||||
* All port bits are not necessarily available on all GPIOs. |
||||
* @retval value Current GPIO input value |
||||
*/ |
||||
uint32_t HW_GPIO_Read( GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin ) |
||||
{ |
||||
return HAL_GPIO_ReadPin( GPIOx, GPIO_Pin); |
||||
} |
||||
|
||||
/* Private functions ---------------------------------------------------------*/ |
||||
|
||||
/*!
|
||||
* @brief Get the position of the bit set in the GPIO_Pin |
||||
* @param GPIO_Pin: specifies the port bit to be written. |
||||
* This parameter can be one of GPIO_PIN_x where x can be (0..15). |
||||
* All port bits are not necessarily available on all GPIOs. |
||||
* @retval the position of the bit |
||||
*/ |
||||
static uint8_t HW_GPIO_GetBitPos(uint16_t GPIO_Pin) |
||||
{ |
||||
uint8_t PinPos=0; |
||||
|
||||
if ( ( GPIO_Pin & 0xFF00 ) != 0) { PinPos |= 0x8; } |
||||
if ( ( GPIO_Pin & 0xF0F0 ) != 0) { PinPos |= 0x4; } |
||||
if ( ( GPIO_Pin & 0xCCCC ) != 0) { PinPos |= 0x2; } |
||||
if ( ( GPIO_Pin & 0xAAAA ) != 0) { PinPos |= 0x1; } |
||||
|
||||
return PinPos; |
||||
} |
||||
|
||||
#endif |
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,632 @@ |
||||
/*
|
||||
/ _____) _ | | |
||||
( (____ _____ ____ _| |_ _____ ____| |__ |
||||
\____ \| ___ | (_ _) ___ |/ ___) _ \
|
||||
_____) ) ____| | | || |_| ____( (___| | | | |
||||
(______/|_____)_|_|_| \__)_____)\____)_| |_| |
||||
(C)2013 Semtech |
||||
|
||||
Description: MCU RTC timer |
||||
|
||||
License: Revised BSD License, see LICENSE.TXT file include in the project |
||||
|
||||
Maintainer: Miguel Luis and Gregory Cristian |
||||
*/ |
||||
/*******************************************************************************
|
||||
* @file hw_rtc.c |
||||
* @author MCD Application Team |
||||
* @version V1.1.2 |
||||
* @date 08-September-2017 |
||||
* @brief driver for RTC |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics International N.V.
|
||||
* All rights reserved.</center></h2> |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted, provided that the following conditions are met: |
||||
* |
||||
* 1. Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer. |
||||
* 2. 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. |
||||
* 3. Neither the name of STMicroelectronics nor the names of other
|
||||
* contributors to this software may be used to endorse or promote products
|
||||
* derived from this software without specific written permission. |
||||
* 4. This software, including modifications and/or derivative works of this
|
||||
* software, must execute solely and exclusively on microcontroller or |
||||
* microprocessor devices manufactured by or for STMicroelectronics. |
||||
* 5. Redistribution and use of this software other than as permitted under
|
||||
* this license is void and will automatically terminate your rights under
|
||||
* this license.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
* PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY |
||||
* RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
|
||||
* SHALL STMICROELECTRONICS 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
#if 0 |
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "hw.h" |
||||
#include "low_power.h" |
||||
|
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
typedef struct |
||||
{ |
||||
TimerTime_t Rtc_Time; /* Reference time */ |
||||
|
||||
RTC_TimeTypeDef RTC_Calndr_Time; /* Reference time in calendar format */ |
||||
|
||||
RTC_DateTypeDef RTC_Calndr_Date; /* Reference date in calendar format */ |
||||
|
||||
} RtcTimerContext_t; |
||||
|
||||
/* Private define ------------------------------------------------------------*/ |
||||
|
||||
/* MCU Wake Up Time */ |
||||
#define MIN_ALARM_DELAY 3 /* in ticks */ |
||||
|
||||
/* subsecond number of bits */ |
||||
#define N_PREDIV_S 10 |
||||
|
||||
/* Synchonuous prediv */ |
||||
#define PREDIV_S ((1<<N_PREDIV_S)-1) |
||||
|
||||
/* Asynchonuous prediv */ |
||||
#define PREDIV_A (1<<(15-N_PREDIV_S))-1 |
||||
|
||||
/* Sub-second mask definition */ |
||||
#if (N_PREDIV_S == 10) |
||||
#define HW_RTC_ALARMSUBSECONDMASK RTC_ALARMSUBSECONDMASK_SS14_10 |
||||
#else |
||||
#error "Please define HW_RTC_ALARMSUBSECONDMASK" |
||||
#endif |
||||
|
||||
/* RTC Time base in us */ |
||||
#define USEC_NUMBER 1000000 |
||||
#define MSEC_NUMBER (USEC_NUMBER/1000) |
||||
#define RTC_ALARM_TIME_BASE (USEC_NUMBER>>N_PREDIV_S) |
||||
|
||||
#define COMMON_FACTOR 3 |
||||
#define CONV_NUMER (MSEC_NUMBER>>COMMON_FACTOR) |
||||
#define CONV_DENOM (1<<(N_PREDIV_S-COMMON_FACTOR)) |
||||
|
||||
#define DAYS_IN_LEAP_YEAR (uint32_t) 366 |
||||
|
||||
#define DAYS_IN_YEAR (uint32_t) 365 |
||||
|
||||
#define SECONDS_IN_1DAY (uint32_t) 86400 |
||||
|
||||
#define SECONDS_IN_1HOUR (uint32_t) 3600 |
||||
|
||||
#define SECONDS_IN_1MINUTE (uint32_t) 60 |
||||
|
||||
#define MINUTES_IN_1HOUR (uint32_t) 60 |
||||
|
||||
#define HOURS_IN_1DAY (uint32_t) 24 |
||||
|
||||
#define DAYS_IN_MONTH_CORRECTION_NORM ((uint32_t) 0x99AAA0 ) |
||||
#define DAYS_IN_MONTH_CORRECTION_LEAP ((uint32_t) 0x445550 ) |
||||
|
||||
|
||||
/* Calculates ceiling(X/N) */ |
||||
#define DIVC(X,N) ( ( (X) + (N) -1 ) / (N) ) |
||||
|
||||
|
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/*!
|
||||
* \brief Indicates if the RTC is already Initalized or not |
||||
*/ |
||||
static bool HW_RTC_Initalized = false; |
||||
|
||||
/*!
|
||||
* \brief compensates MCU wakeup time |
||||
*/ |
||||
|
||||
static bool McuWakeUpTimeInitialized = false; |
||||
|
||||
/*!
|
||||
* \brief compensates MCU wakeup time |
||||
*/ |
||||
|
||||
static int16_t McuWakeUpTimeCal = 0; |
||||
|
||||
/*!
|
||||
* Number of days in each month on a normal year |
||||
*/ |
||||
static const uint8_t DaysInMonth[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; |
||||
|
||||
/*!
|
||||
* Number of days in each month on a leap year |
||||
*/ |
||||
static const uint8_t DaysInMonthLeapYear[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; |
||||
|
||||
static RTC_HandleTypeDef RtcHandle={0}; |
||||
|
||||
static RTC_AlarmTypeDef RTC_AlarmStructure; |
||||
|
||||
/*!
|
||||
* Keep the value of the RTC timer when the RTC alarm is set |
||||
* Set with the HW_RTC_SetTimerContext function |
||||
* Value is kept as a Reference to calculate alarm |
||||
*/ |
||||
static RtcTimerContext_t RtcTimerContext; |
||||
|
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
|
||||
static void HW_RTC_SetConfig( void ); |
||||
|
||||
static void HW_RTC_SetAlarmConfig( void ); |
||||
|
||||
static void HW_RTC_StartWakeUpAlarm( uint32_t timeoutValue ); |
||||
|
||||
static TimerTime_t HW_RTC_GetCalendarValue( RTC_DateTypeDef* RTC_DateStruct, RTC_TimeTypeDef* RTC_TimeStruct ); |
||||
|
||||
/* Exported functions ---------------------------------------------------------*/ |
||||
|
||||
/*!
|
||||
* @brief Initializes the RTC timer |
||||
* @note The timer is based on the RTC |
||||
* @param none |
||||
* @retval none |
||||
*/ |
||||
void HW_RTC_Init( void ) |
||||
{ |
||||
if( HW_RTC_Initalized == false ) |
||||
{ |
||||
HW_RTC_SetConfig( ); |
||||
HW_RTC_SetAlarmConfig( ); |
||||
HW_RTC_SetTimerContext( ); |
||||
HW_RTC_Initalized = true; |
||||
} |
||||
} |
||||
|
||||
/*!
|
||||
* @brief Configures the RTC timer |
||||
* @note The timer is based on the RTC |
||||
* @param none |
||||
* @retval none |
||||
*/ |
||||
static void HW_RTC_SetConfig( void ) |
||||
{ |
||||
RTC_TimeTypeDef RTC_TimeStruct; |
||||
RTC_DateTypeDef RTC_DateStruct; |
||||
|
||||
RtcHandle.Instance = RTC; |
||||
|
||||
RtcHandle.Init.HourFormat = RTC_HOURFORMAT_24; |
||||
RtcHandle.Init.AsynchPrediv = PREDIV_A; /* RTC_ASYNCH_PREDIV; */ |
||||
RtcHandle.Init.SynchPrediv = PREDIV_S; /* RTC_SYNCH_PREDIV; */ |
||||
RtcHandle.Init.OutPut = RTC_OUTPUT; |
||||
RtcHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; |
||||
RtcHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; |
||||
|
||||
HAL_RTC_Init( &RtcHandle ); |
||||
|
||||
/*Monday 1st January 2016*/ |
||||
RTC_DateStruct.Year = 0; |
||||
RTC_DateStruct.Month = RTC_MONTH_JANUARY; |
||||
RTC_DateStruct.Date = 1; |
||||
RTC_DateStruct.WeekDay = RTC_WEEKDAY_MONDAY; |
||||
HAL_RTC_SetDate(&RtcHandle , &RTC_DateStruct, RTC_FORMAT_BIN); |
||||
|
||||
/*at 0:0:0*/ |
||||
RTC_TimeStruct.Hours = 0; |
||||
RTC_TimeStruct.Minutes = 0; |
||||
|
||||
RTC_TimeStruct.Seconds = 0; |
||||
RTC_TimeStruct.TimeFormat = 0; |
||||
RTC_TimeStruct.SubSeconds = 0; |
||||
RTC_TimeStruct.StoreOperation = RTC_DAYLIGHTSAVING_NONE; |
||||
RTC_TimeStruct.DayLightSaving = RTC_STOREOPERATION_RESET; |
||||
|
||||
HAL_RTC_SetTime(&RtcHandle , &RTC_TimeStruct, RTC_FORMAT_BIN); |
||||
|
||||
/*Enable Direct Read of the calendar registers (not through Shadow) */ |
||||
HAL_RTCEx_EnableBypassShadow(&RtcHandle); |
||||
} |
||||
|
||||
/*!
|
||||
* @brief calculates the wake up time between wake up and mcu start |
||||
* @note resulotion in RTC_ALARM_TIME_BASE in timer ticks |
||||
* @param none |
||||
* @retval none |
||||
*/ |
||||
void HW_RTC_setMcuWakeUpTime( void ) |
||||
{ |
||||
RTC_TimeTypeDef RTC_TimeStruct; |
||||
RTC_DateTypeDef RTC_DateStruct; |
||||
|
||||
TimerTime_t now, hit; |
||||
int16_t McuWakeUpTime; |
||||
|
||||
if ((McuWakeUpTimeInitialized == false) && |
||||
( HAL_NVIC_GetPendingIRQ( RTC_Alarm_IRQn ) == 1)) |
||||
{ /* warning: works ok if now is below 30 days
|
||||
it is ok since it's done once at first alarm wake-up*/ |
||||
McuWakeUpTimeInitialized = true; |
||||
now = HW_RTC_GetCalendarValue( &RTC_DateStruct, &RTC_TimeStruct ); |
||||
|
||||
DBG_GPIO_SET(GPIOB, GPIO_PIN_13); |
||||
DBG_GPIO_RST(GPIOB, GPIO_PIN_13); |
||||
HAL_RTC_GetAlarm(&RtcHandle, &RTC_AlarmStructure, RTC_ALARM_A, RTC_FORMAT_BIN ); |
||||
hit = RTC_AlarmStructure.AlarmTime.Seconds+ |
||||
60*(RTC_AlarmStructure.AlarmTime.Minutes+ |
||||
60*(RTC_AlarmStructure.AlarmTime.Hours+ |
||||
24*(RTC_AlarmStructure.AlarmDateWeekDay))); |
||||
hit = ( hit << N_PREDIV_S ) + (PREDIV_S - RTC_AlarmStructure.AlarmTime.SubSeconds); |
||||
|
||||
McuWakeUpTime = (int16_t) ((now-hit)); |
||||
McuWakeUpTimeCal += McuWakeUpTime; |
||||
DBG_PRINTF("Cal=%d, %d\n\r",McuWakeUpTimeCal, McuWakeUpTime); |
||||
} |
||||
} |
||||
|
||||
int16_t HW_RTC_getMcuWakeUpTime( void ) |
||||
{ |
||||
return McuWakeUpTimeCal; |
||||
} |
||||
|
||||
/*!
|
||||
* @brief returns the wake up time in ticks |
||||
* @param none |
||||
* @retval wake up time in ticks |
||||
*/ |
||||
uint32_t HW_RTC_GetMinimumTimeout( void ) |
||||
{ |
||||
return( MIN_ALARM_DELAY ); |
||||
} |
||||
|
||||
/*!
|
||||
* @brief converts time in ms to time in ticks |
||||
* @param [IN] time in milliseconds |
||||
* @retval returns time in timer ticks |
||||
*/ |
||||
uint32_t HW_RTC_ms2Tick( TimerTime_t timeMicroSec ) |
||||
{ |
||||
/*return( ( timeMicroSec / RTC_ALARM_TIME_BASE ) ); */ |
||||
return ( uint32_t) ( ( ((uint64_t)timeMicroSec) * CONV_DENOM ) / CONV_NUMER ); |
||||
} |
||||
|
||||
/*!
|
||||
* @brief converts time in ticks to time in ms |
||||
* @param [IN] time in timer ticks |
||||
* @retval returns time in milliseconds |
||||
*/ |
||||
TimerTime_t HW_RTC_Tick2ms( uint32_t tick ) |
||||
{ |
||||
/*return( ( timeMicroSec * RTC_ALARM_TIME_BASE ) ); */ |
||||
return ( ( (uint64_t)( tick )* CONV_NUMER ) / CONV_DENOM ); |
||||
} |
||||
|
||||
/*!
|
||||
* @brief Set the alarm |
||||
* @note The alarm is set at now (read in this funtion) + timeout |
||||
* @param timeout Duration of the Timer ticks |
||||
*/ |
||||
void HW_RTC_SetAlarm( uint32_t timeout ) |
||||
{ |
||||
/* we don't go in Low Power mode for timeout below MIN_ALARM_DELAY */ |
||||
if ( (MIN_ALARM_DELAY + McuWakeUpTimeCal ) < ((timeout - HW_RTC_GetTimerElapsedTime( ) )) ) |
||||
{ |
||||
LowPower_Enable( e_LOW_POWER_RTC ); |
||||
} |
||||
else |
||||
{ |
||||
LowPower_Disable( e_LOW_POWER_RTC ); |
||||
} |
||||
|
||||
if( LowPower_GetState() == 0 ) |
||||
{ |
||||
LowPower_Enable( e_LOW_POWER_RTC ); |
||||
timeout = timeout - McuWakeUpTimeCal; |
||||
} |
||||
|
||||
HW_RTC_StartWakeUpAlarm( timeout ); |
||||
} |
||||
|
||||
/*!
|
||||
* @brief Get the RTC timer elapsed time since the last Alarm was set |
||||
* @param none |
||||
* @retval RTC Elapsed time in ticks |
||||
*/ |
||||
uint32_t HW_RTC_GetTimerElapsedTime( void ) |
||||
{ |
||||
RTC_TimeTypeDef RTC_TimeStruct; |
||||
RTC_DateTypeDef RTC_DateStruct; |
||||
|
||||
TimerTime_t CalendarValue = HW_RTC_GetCalendarValue(&RTC_DateStruct, &RTC_TimeStruct ); |
||||
|
||||
return( ( uint32_t )( CalendarValue - RtcTimerContext.Rtc_Time )); |
||||
} |
||||
|
||||
/*!
|
||||
* @brief Get the RTC timer value |
||||
* @param none |
||||
* @retval RTC Timer value in ticks |
||||
*/ |
||||
uint32_t HW_RTC_GetTimerValue( void ) |
||||
{ |
||||
RTC_TimeTypeDef RTC_TimeStruct; |
||||
RTC_DateTypeDef RTC_DateStruct; |
||||
|
||||
uint32_t CalendarValue = (uint32_t) HW_RTC_GetCalendarValue(&RTC_DateStruct, &RTC_TimeStruct ); |
||||
|
||||
return( CalendarValue ); |
||||
} |
||||
|
||||
/*!
|
||||
* @brief Stop the Alarm |
||||
* @param none |
||||
* @retval none |
||||
*/ |
||||
void HW_RTC_StopAlarm( void ) |
||||
{ |
||||
|
||||
/* Clear RTC Alarm Flag */ |
||||
__HAL_RTC_ALARM_CLEAR_FLAG( &RtcHandle, RTC_FLAG_ALRAF); |
||||
|
||||
/* Disable the Alarm A interrupt */ |
||||
|
||||
HAL_RTC_DeactivateAlarm(&RtcHandle, RTC_ALARM_A ); |
||||
} |
||||
|
||||
/*!
|
||||
* @brief RTC IRQ Handler on the RTC Alarm |
||||
* @param none |
||||
* @retval none |
||||
*/ |
||||
void HW_RTC_IrqHandler ( void ) |
||||
{ |
||||
RTC_HandleTypeDef* hrtc=&RtcHandle; |
||||
/* enable low power at irq*/ |
||||
LowPower_Enable( e_LOW_POWER_RTC ); |
||||
|
||||
/* Get the AlarmA interrupt source enable status */ |
||||
if(__HAL_RTC_ALARM_GET_IT_SOURCE(hrtc, RTC_IT_ALRA) != RESET) |
||||
{ |
||||
/* Get the pending status of the AlarmA Interrupt */ |
||||
if(__HAL_RTC_ALARM_GET_FLAG(hrtc, RTC_FLAG_ALRAF) != RESET) |
||||
{ |
||||
/* Clear the AlarmA interrupt pending bit */ |
||||
__HAL_RTC_ALARM_CLEAR_FLAG(hrtc, RTC_FLAG_ALRAF);
|
||||
/* Clear the EXTI's line Flag for RTC Alarm */ |
||||
__HAL_RTC_ALARM_EXTI_CLEAR_FLAG(); |
||||
/* AlarmA callback */ |
||||
HAL_RTC_AlarmAEventCallback(hrtc); |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
/*!
|
||||
* @brief a delay of delay ms by polling RTC |
||||
* @param delay in ms |
||||
* @retval none |
||||
*/ |
||||
void HW_RTC_DelayMs( uint32_t delay ) |
||||
{ |
||||
TimerTime_t delayValue = 0; |
||||
TimerTime_t timeout = 0; |
||||
|
||||
delayValue = HW_RTC_ms2Tick( delay ); |
||||
|
||||
/* Wait delay ms */ |
||||
timeout = HW_RTC_GetTimerValue( ); |
||||
while( ( ( HW_RTC_GetTimerValue( ) - timeout ) ) < delayValue ) |
||||
{ |
||||
__NOP( ); |
||||
} |
||||
} |
||||
|
||||
/*!
|
||||
* @brief set Time Reference set also the RTC_DateStruct and RTC_TimeStruct |
||||
* @param none |
||||
* @retval Timer Value |
||||
*/ |
||||
uint32_t HW_RTC_SetTimerContext( void ) |
||||
{ |
||||
RtcTimerContext.Rtc_Time = HW_RTC_GetCalendarValue( &RtcTimerContext.RTC_Calndr_Date, &RtcTimerContext.RTC_Calndr_Time ); |
||||
return ( uint32_t ) RtcTimerContext.Rtc_Time; |
||||
} |
||||
|
||||
/*!
|
||||
* @brief Get the RTC timer Reference |
||||
* @param none |
||||
* @retval Timer Value in Ticks |
||||
*/ |
||||
uint32_t HW_RTC_GetTimerContext( void ) |
||||
{ |
||||
return (uint32_t) RtcTimerContext.Rtc_Time; |
||||
} |
||||
/* Private functions ---------------------------------------------------------*/ |
||||
|
||||
/*!
|
||||
* @brief configure alarm at init |
||||
* @param none |
||||
* @retval none |
||||
*/ |
||||
static void HW_RTC_SetAlarmConfig( void ) |
||||
{ |
||||
HAL_RTC_DeactivateAlarm(&RtcHandle, RTC_ALARM_A); |
||||
} |
||||
|
||||
/*!
|
||||
* @brief start wake up alarm |
||||
* @note alarm in RtcTimerContext.Rtc_Time + timeoutValue |
||||
* @param timeoutValue in ticks |
||||
* @retval none |
||||
*/ |
||||
static void HW_RTC_StartWakeUpAlarm( uint32_t timeoutValue ) |
||||
{ |
||||
uint16_t rtcAlarmSubSeconds = 0; |
||||
uint16_t rtcAlarmSeconds = 0; |
||||
uint16_t rtcAlarmMinutes = 0; |
||||
uint16_t rtcAlarmHours = 0; |
||||
uint16_t rtcAlarmDays = 0; |
||||
RTC_TimeTypeDef RTC_TimeStruct = RtcTimerContext.RTC_Calndr_Time; |
||||
RTC_DateTypeDef RTC_DateStruct = RtcTimerContext.RTC_Calndr_Date; |
||||
|
||||
HW_RTC_StopAlarm( ); |
||||
DBG_GPIO_SET(GPIOB, GPIO_PIN_13); |
||||
|
||||
/*reverse counter */ |
||||
rtcAlarmSubSeconds = PREDIV_S - RTC_TimeStruct.SubSeconds; |
||||
rtcAlarmSubSeconds += ( timeoutValue & PREDIV_S); |
||||
/* convert timeout to seconds */ |
||||
timeoutValue >>= N_PREDIV_S; /* convert timeout in seconds */ |
||||
|
||||
/*convert microsecs to RTC format and add to 'Now' */ |
||||
rtcAlarmDays = RTC_DateStruct.Date; |
||||
while (timeoutValue >= SECONDS_IN_1DAY) |
||||
{ |
||||
timeoutValue -= SECONDS_IN_1DAY; |
||||
rtcAlarmDays++; |
||||
} |
||||
|
||||
/* calc hours */ |
||||
rtcAlarmHours = RTC_TimeStruct.Hours; |
||||
while (timeoutValue >= SECONDS_IN_1HOUR) |
||||
{ |
||||
timeoutValue -= SECONDS_IN_1HOUR; |
||||
rtcAlarmHours++; |
||||
} |
||||
|
||||
/* calc minutes */ |
||||
rtcAlarmMinutes = RTC_TimeStruct.Minutes; |
||||
while (timeoutValue >= SECONDS_IN_1MINUTE) |
||||
{ |
||||
timeoutValue -= SECONDS_IN_1MINUTE; |
||||
rtcAlarmMinutes++; |
||||
} |
||||
|
||||
/* calc seconds */ |
||||
rtcAlarmSeconds = RTC_TimeStruct.Seconds + timeoutValue; |
||||
|
||||
/***** correct for modulo********/ |
||||
while (rtcAlarmSubSeconds >= (PREDIV_S+1)) |
||||
{ |
||||
rtcAlarmSubSeconds -= (PREDIV_S+1); |
||||
rtcAlarmSeconds++; |
||||
} |
||||
|
||||
while (rtcAlarmSeconds >= SECONDS_IN_1MINUTE) |
||||
{
|
||||
rtcAlarmSeconds -= SECONDS_IN_1MINUTE; |
||||
rtcAlarmMinutes++; |
||||
} |
||||
|
||||
while (rtcAlarmMinutes >= MINUTES_IN_1HOUR) |
||||
{ |
||||
rtcAlarmMinutes -= MINUTES_IN_1HOUR; |
||||
rtcAlarmHours++; |
||||
} |
||||
|
||||
while (rtcAlarmHours >= HOURS_IN_1DAY) |
||||
{ |
||||
rtcAlarmHours -= HOURS_IN_1DAY; |
||||
rtcAlarmDays++; |
||||
} |
||||
|
||||
if( RTC_DateStruct.Year % 4 == 0 )
|
||||
{ |
||||
if( rtcAlarmDays > DaysInMonthLeapYear[ RTC_DateStruct.Month - 1 ] )
|
||||
{ |
||||
rtcAlarmDays = rtcAlarmDays % DaysInMonthLeapYear[ RTC_DateStruct.Month - 1 ]; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
if( rtcAlarmDays > DaysInMonth[ RTC_DateStruct.Month - 1 ] )
|
||||
{
|
||||
rtcAlarmDays = rtcAlarmDays % DaysInMonth[ RTC_DateStruct.Month - 1 ]; |
||||
} |
||||
} |
||||
|
||||
/* Set RTC_AlarmStructure with calculated values*/ |
||||
RTC_AlarmStructure.AlarmTime.SubSeconds = PREDIV_S-rtcAlarmSubSeconds; |
||||
RTC_AlarmStructure.AlarmSubSecondMask = HW_RTC_ALARMSUBSECONDMASK;
|
||||
RTC_AlarmStructure.AlarmTime.Seconds = rtcAlarmSeconds; |
||||
RTC_AlarmStructure.AlarmTime.Minutes = rtcAlarmMinutes; |
||||
RTC_AlarmStructure.AlarmTime.Hours = rtcAlarmHours; |
||||
RTC_AlarmStructure.AlarmDateWeekDay = ( uint8_t )rtcAlarmDays; |
||||
RTC_AlarmStructure.AlarmTime.TimeFormat = RTC_TimeStruct.TimeFormat; |
||||
RTC_AlarmStructure.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
|
||||
RTC_AlarmStructure.AlarmMask = RTC_ALARMMASK_NONE; |
||||
RTC_AlarmStructure.Alarm = RTC_ALARM_A; |
||||
RTC_AlarmStructure.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; |
||||
RTC_AlarmStructure.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET; |
||||
|
||||
/* Set RTC_Alarm */ |
||||
HAL_RTC_SetAlarm_IT( &RtcHandle, &RTC_AlarmStructure, RTC_FORMAT_BIN ); |
||||
|
||||
/* Debug Printf*/ |
||||
DBG( HW_RTC_GetCalendarValue( &RTC_DateStruct, &RTC_TimeStruct ); ); |
||||
DBG_PRINTF("it's %d:%d:%d:%d ", RTC_TimeStruct.Hours, RTC_TimeStruct.Minutes, RTC_TimeStruct.Seconds, ((PREDIV_S - RTC_TimeStruct.SubSeconds)*1000)>>N_PREDIV_S); |
||||
DBG_PRINTF("WU@ %d:%d:%d:%d\n\r", rtcAlarmHours, rtcAlarmMinutes, rtcAlarmSeconds, (rtcAlarmSubSeconds*1000)>>N_PREDIV_S ); |
||||
|
||||
DBG_GPIO_RST(GPIOB, GPIO_PIN_13); |
||||
} |
||||
|
||||
|
||||
/*!
|
||||
* @brief get current time from calendar in ticks |
||||
* @param pointer to RTC_DateStruct |
||||
* @param pointer to RTC_TimeStruct |
||||
* @retval time in ticks |
||||
*/ |
||||
static TimerTime_t HW_RTC_GetCalendarValue( RTC_DateTypeDef* RTC_DateStruct, RTC_TimeTypeDef* RTC_TimeStruct ) |
||||
{ |
||||
TimerTime_t calendarValue = 0; |
||||
uint32_t first_read; |
||||
uint32_t correction; |
||||
|
||||
/* Get Time and Date*/ |
||||
HAL_RTC_GetTime( &RtcHandle, RTC_TimeStruct, RTC_FORMAT_BIN ); |
||||
|
||||
/* make sure it is correct due to asynchronus nature of RTC*/ |
||||
do { |
||||
first_read = RTC_TimeStruct->SubSeconds; |
||||
HAL_RTC_GetDate( &RtcHandle, RTC_DateStruct, RTC_FORMAT_BIN ); |
||||
HAL_RTC_GetTime( &RtcHandle, RTC_TimeStruct, RTC_FORMAT_BIN ); |
||||
} while (first_read != RTC_TimeStruct->SubSeconds); |
||||
|
||||
/* calculte amount of elapsed days since 01/01/2000 */ |
||||
calendarValue= DIVC( (DAYS_IN_YEAR*3 + DAYS_IN_LEAP_YEAR)* RTC_DateStruct->Year , 4); |
||||
|
||||
correction = ( (RTC_DateStruct->Year % 4) == 0 ) ? DAYS_IN_MONTH_CORRECTION_LEAP : DAYS_IN_MONTH_CORRECTION_NORM ; |
||||
|
||||
calendarValue +=( DIVC( (RTC_DateStruct->Month-1)*(30+31) ,2 ) - (((correction>> ((RTC_DateStruct->Month-1)*2) )&0x3))); |
||||
|
||||
calendarValue += (RTC_DateStruct->Date -1); |
||||
|
||||
/* convert from days to seconds */ |
||||
calendarValue *= SECONDS_IN_1DAY;
|
||||
|
||||
calendarValue += ( ( uint32_t )RTC_TimeStruct->Seconds +
|
||||
( ( uint32_t )RTC_TimeStruct->Minutes * SECONDS_IN_1MINUTE ) + |
||||
( ( uint32_t )RTC_TimeStruct->Hours * SECONDS_IN_1HOUR ) ) ; |
||||
|
||||
|
||||
|
||||
calendarValue = (calendarValue<<N_PREDIV_S) + ( PREDIV_S - RTC_TimeStruct->SubSeconds); |
||||
|
||||
return( calendarValue ); |
||||
} |
||||
|
||||
#endif |
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
||||
|
@ -0,0 +1,224 @@ |
||||
/*
|
||||
/ _____) _ | | |
||||
( (____ _____ ____ _| |_ _____ ____| |__ |
||||
\____ \| ___ | (_ _) ___ |/ ___) _ \
|
||||
_____) ) ____| | | || |_| ____( (___| | | | |
||||
(______/|_____)_|_|_| \__)_____)\____)_| |_| |
||||
(C)2013 Semtech |
||||
|
||||
Description: Bleeper board SPI driver implementation |
||||
|
||||
License: Revised BSD License, see LICENSE.TXT file include in the project |
||||
|
||||
Maintainer: Miguel Luis and Gregory Cristian |
||||
*/ |
||||
/*******************************************************************************
|
||||
* @file hw_spi.c |
||||
* @author MCD Application Team |
||||
* @version V1.1.2 |
||||
* @date 08-September-2017 |
||||
* @brief manages the SPI interface |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics International N.V.
|
||||
* All rights reserved.</center></h2> |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted, provided that the following conditions are met: |
||||
* |
||||
* 1. Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer. |
||||
* 2. 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. |
||||
* 3. Neither the name of STMicroelectronics nor the names of other
|
||||
* contributors to this software may be used to endorse or promote products
|
||||
* derived from this software without specific written permission. |
||||
* 4. This software, including modifications and/or derivative works of this
|
||||
* software, must execute solely and exclusively on microcontroller or |
||||
* microprocessor devices manufactured by or for STMicroelectronics. |
||||
* 5. Redistribution and use of this software other than as permitted under
|
||||
* this license is void and will automatically terminate your rights under
|
||||
* this license.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
* PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY |
||||
* RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
|
||||
* SHALL STMICROELECTRONICS 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
#if 0 |
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "hw.h" |
||||
#include "utilities.h" |
||||
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private define ------------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
static SPI_HandleTypeDef hspi; |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
|
||||
/*!
|
||||
* @brief Calculates Spi Divisor based on Spi Frequency and Mcu Frequency |
||||
* |
||||
* @param [IN] Spi Frequency |
||||
* @retval Spi divisor |
||||
*/ |
||||
static uint32_t SpiFrequency( uint32_t hz ); |
||||
|
||||
/* Exported functions ---------------------------------------------------------*/ |
||||
|
||||
/*!
|
||||
* @brief Initializes the SPI object and MCU peripheral |
||||
* |
||||
* @param [IN] none |
||||
*/ |
||||
void HW_SPI_Init( void ) |
||||
{ |
||||
|
||||
/*##-1- Configure the SPI peripheral */ |
||||
/* Set the SPI parameters */ |
||||
|
||||
hspi.Instance = SPI1; |
||||
|
||||
hspi.Init.BaudRatePrescaler = SpiFrequency( 10000000 ); |
||||
hspi.Init.Direction = SPI_DIRECTION_2LINES; |
||||
hspi.Init.Mode = SPI_MODE_MASTER; |
||||
hspi.Init.CLKPolarity = SPI_POLARITY_LOW; |
||||
hspi.Init.CLKPhase = SPI_PHASE_1EDGE; |
||||
hspi.Init.DataSize = SPI_DATASIZE_8BIT; |
||||
hspi.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
|
||||
hspi.Init.FirstBit = SPI_FIRSTBIT_MSB; |
||||
hspi.Init.NSS = SPI_NSS_SOFT; |
||||
hspi.Init.TIMode = SPI_TIMODE_DISABLE; |
||||
|
||||
|
||||
SPI_CLK_ENABLE();
|
||||
|
||||
|
||||
if(HAL_SPI_Init( &hspi) != HAL_OK) |
||||
{ |
||||
/* Initialization Error */ |
||||
Error_Handler(); |
||||
} |
||||
|
||||
/*##-2- Configure the SPI GPIOs */ |
||||
HW_SPI_IoInit( ); |
||||
} |
||||
|
||||
/*!
|
||||
* @brief De-initializes the SPI object and MCU peripheral |
||||
* |
||||
* @param [IN] none |
||||
*/ |
||||
void HW_SPI_DeInit( void ) |
||||
{ |
||||
|
||||
HAL_SPI_DeInit( &hspi); |
||||
|
||||
/*##-1- Reset peripherals ####*/ |
||||
__HAL_RCC_SPI1_FORCE_RESET(); |
||||
__HAL_RCC_SPI1_RELEASE_RESET(); |
||||
/*##-2- Configure the SPI GPIOs */ |
||||
HW_SPI_IoDeInit( ); |
||||
} |
||||
|
||||
void HW_SPI_IoInit( void ) |
||||
{ |
||||
GPIO_InitTypeDef initStruct={0}; |
||||
|
||||
|
||||
initStruct.Mode =GPIO_MODE_AF_PP; |
||||
initStruct.Pull = GPIO_PULLDOWN; |
||||
initStruct.Speed = GPIO_SPEED_HIGH; |
||||
initStruct.Alternate= SPI1_AF ; |
||||
|
||||
HW_GPIO_Init( RADIO_SCLK_PORT, RADIO_SCLK_PIN, &initStruct); |
||||
HW_GPIO_Init( RADIO_MISO_PORT, RADIO_MISO_PIN, &initStruct); |
||||
HW_GPIO_Init( RADIO_MOSI_PORT, RADIO_MOSI_PIN, &initStruct); |
||||
|
||||
initStruct.Mode = GPIO_MODE_OUTPUT_PP; |
||||
initStruct.Pull = GPIO_PULLUP; |
||||
|
||||
HW_GPIO_Init( RADIO_NSS_PORT, RADIO_NSS_PIN, &initStruct ); |
||||
|
||||
HW_GPIO_Write ( RADIO_NSS_PORT, RADIO_NSS_PIN, 1 ); |
||||
} |
||||
|
||||
void HW_SPI_IoDeInit( void ) |
||||
{ |
||||
GPIO_InitTypeDef initStruct={0}; |
||||
|
||||
initStruct.Mode =GPIO_MODE_OUTPUT_PP; |
||||
|
||||
initStruct.Pull =GPIO_PULLDOWN ; |
||||
HW_GPIO_Init ( RADIO_MOSI_PORT, RADIO_MOSI_PIN, &initStruct );
|
||||
HW_GPIO_Write( RADIO_MOSI_PORT, RADIO_MOSI_PIN, 0 ); |
||||
|
||||
initStruct.Pull =GPIO_PULLDOWN;
|
||||
HW_GPIO_Init ( RADIO_MISO_PORT, RADIO_MISO_PIN, &initStruct );
|
||||
HW_GPIO_Write( RADIO_MISO_PORT, RADIO_MISO_PIN, 0 ); |
||||
|
||||
initStruct.Pull =GPIO_PULLDOWN ;
|
||||
HW_GPIO_Init ( RADIO_SCLK_PORT, RADIO_SCLK_PIN, &initStruct );
|
||||
HW_GPIO_Write( RADIO_SCLK_PORT, RADIO_SCLK_PIN, 0 ); |
||||
|
||||
initStruct.Pull = GPIO_PULLUP; |
||||
HW_GPIO_Init ( RADIO_NSS_PORT, RADIO_NSS_PIN , &initStruct );
|
||||
HW_GPIO_Write( RADIO_NSS_PORT, RADIO_NSS_PIN , 1 ); |
||||
} |
||||
|
||||
/*!
|
||||
* @brief Sends outData and receives inData |
||||
* |
||||
* @param [IN] outData Byte to be sent |
||||
* @retval inData Received byte. |
||||
*/ |
||||
uint16_t HW_SPI_InOut( uint16_t txData ) |
||||
{ |
||||
uint16_t rxData ; |
||||
|
||||
HAL_SPI_TransmitReceive( &hspi, ( uint8_t * ) &txData, ( uint8_t* ) &rxData, 1, HAL_MAX_DELAY);
|
||||
|
||||
return rxData; |
||||
} |
||||
|
||||
/* Private functions ---------------------------------------------------------*/ |
||||
|
||||
static uint32_t SpiFrequency( uint32_t hz ) |
||||
{ |
||||
uint32_t divisor = 0; |
||||
uint32_t SysClkTmp = SystemCoreClock; |
||||
uint32_t baudRate; |
||||
|
||||
while( SysClkTmp > hz) |
||||
{ |
||||
divisor++; |
||||
SysClkTmp= ( SysClkTmp >> 1); |
||||
|
||||
if (divisor >= 7) |
||||
break; |
||||
} |
||||
|
||||
baudRate =((( divisor & 0x4 ) == 0 )? 0x0 : SPI_CR1_BR_2 )|
|
||||
((( divisor & 0x2 ) == 0 )? 0x0 : SPI_CR1_BR_1 )|
|
||||
((( divisor & 0x1 ) == 0 )? 0x0 : SPI_CR1_BR_0 ); |
||||
|
||||
return baudRate; |
||||
} |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
||||
|
||||
#endif |
@ -0,0 +1,773 @@ |
||||
/*
|
||||
/ _____) _ | | |
||||
( (____ _____ ____ _| |_ _____ ____| |__ |
||||
\____ \| ___ | (_ _) ___ |/ ___) _ \
|
||||
_____) ) ____| | | || |_| ____( (___| | | | |
||||
(______/|_____)_|_|_| \__)_____)\____)_| |_| |
||||
(C)2013 Semtech |
||||
|
||||
Description: LoRaMac classA device implementation |
||||
|
||||
License: Revised BSD License, see LICENSE.TXT file include in the project |
||||
|
||||
Maintainer: Miguel Luis, Gregory Cristian and Wael Guibene |
||||
*/ |
||||
/******************************************************************************
|
||||
* @file lora.c |
||||
* @author MCD Application Team |
||||
* @version V1.1.2 |
||||
* @date 08-September-2017 |
||||
* @brief lora API to drive the lora state Machine |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics International N.V.
|
||||
* All rights reserved.</center></h2> |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted, provided that the following conditions are met: |
||||
* |
||||
* 1. Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer. |
||||
* 2. 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. |
||||
* 3. Neither the name of STMicroelectronics nor the names of other
|
||||
* contributors to this software may be used to endorse or promote products
|
||||
* derived from this software without specific written permission. |
||||
* 4. This software, including modifications and/or derivative works of this
|
||||
* software, must execute solely and exclusively on microcontroller or |
||||
* microprocessor devices manufactured by or for STMicroelectronics. |
||||
* 5. Redistribution and use of this software other than as permitted under
|
||||
* this license is void and will automatically terminate your rights under
|
||||
* this license.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
* PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY |
||||
* RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
|
||||
* SHALL STMICROELECTRONICS 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "hw.h" |
||||
#include "timeServer.h" |
||||
#include "LoRaMac.h" |
||||
#include "lora.h" |
||||
|
||||
/*!
|
||||
* Join requests trials duty cycle. |
||||
*/ |
||||
#define OVER_THE_AIR_ACTIVATION_DUTYCYCLE 10000 // 10 [s] value in ms
|
||||
|
||||
#if defined( REGION_EU868 ) |
||||
|
||||
#include "LoRaMacTest.h" |
||||
|
||||
/*!
|
||||
* LoRaWAN ETSI duty cycle control enable/disable |
||||
* |
||||
* \remark Please note that ETSI mandates duty cycled transmissions. Use only for test purposes |
||||
*/ |
||||
#define LORAWAN_DUTYCYCLE_ON true |
||||
|
||||
#define USE_SEMTECH_DEFAULT_CHANNEL_LINEUP 0 |
||||
|
||||
#if( USE_SEMTECH_DEFAULT_CHANNEL_LINEUP == 1 ) |
||||
|
||||
#define LC4 { 867100000, 0, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 } |
||||
#define LC5 { 867300000, 0, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 } |
||||
#define LC6 { 867500000, 0, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 } |
||||
#define LC7 { 867700000, 0, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 } |
||||
#define LC8 { 867900000, 0, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 } |
||||
#define LC9 { 868800000, 0, { ( ( DR_7 << 4 ) | DR_7 ) }, 2 } |
||||
#define LC10 { 868300000, 0, { ( ( DR_6 << 4 ) | DR_6 ) }, 1 } |
||||
|
||||
#endif |
||||
|
||||
#endif |
||||
|
||||
static uint8_t DevEui[] = LORAWAN_DEVICE_EUI; |
||||
static uint8_t AppEui[] = LORAWAN_APPLICATION_EUI; |
||||
static uint8_t AppKey[] = LORAWAN_APPLICATION_KEY; |
||||
|
||||
#if( OVER_THE_AIR_ACTIVATION == 0 ) |
||||
|
||||
static uint8_t NwkSKey[] = LORAWAN_NWKSKEY; |
||||
static uint8_t AppSKey[] = LORAWAN_APPSKEY; |
||||
|
||||
/*!
|
||||
* Device address |
||||
*/ |
||||
static uint32_t DevAddr = LORAWAN_DEVICE_ADDRESS; |
||||
|
||||
#endif |
||||
|
||||
/*!
|
||||
* User application data buffer size |
||||
*/ |
||||
#define LORAWAN_APP_DATA_BUFF_SIZE 64 |
||||
|
||||
/*!
|
||||
* User application data |
||||
*/ |
||||
static uint8_t AppDataBuff[LORAWAN_APP_DATA_BUFF_SIZE]; |
||||
|
||||
/*!
|
||||
* User application data structure |
||||
*/ |
||||
static lora_AppData_t AppData={ AppDataBuff, 0 ,0 }; |
||||
|
||||
/*!
|
||||
* Indicates if the node is sending confirmed or unconfirmed messages |
||||
*/ |
||||
static FunctionalState IsTxConfirmed ; |
||||
|
||||
/*!
|
||||
* Defines the LoRa parameters at Init |
||||
*/ |
||||
static LoRaParam_t* LoRaParamInit; |
||||
/*!
|
||||
* Timer to handle the application data transmission duty cycle |
||||
*/ |
||||
static TimerEvent_t TxNextPacketTimer; |
||||
|
||||
static DeviceState_t DeviceState = DEVICE_STATE_INIT ; |
||||
|
||||
/*!
|
||||
* Timer to handle the state of LED1 |
||||
*/ |
||||
|
||||
static LoRaMacPrimitives_t LoRaMacPrimitives; |
||||
static LoRaMacCallback_t LoRaMacCallbacks; |
||||
static MibRequestConfirm_t mibReq; |
||||
|
||||
static LoRaMainCallback_t *LoRaMainCallbacks; |
||||
|
||||
|
||||
/*!
|
||||
* Indicates if a new packet can be sent |
||||
*/ |
||||
static bool NextTx = true; |
||||
|
||||
/*!
|
||||
* LoRaWAN compliance tests support data |
||||
*/ |
||||
struct ComplianceTest_s |
||||
{ |
||||
bool Running; |
||||
uint8_t State; |
||||
FunctionalState IsTxConfirmed; |
||||
uint8_t AppPort; |
||||
uint8_t AppDataSize; |
||||
uint8_t *AppDataBuffer; |
||||
uint16_t DownLinkCounter; |
||||
bool LinkCheck; |
||||
uint8_t DemodMargin; |
||||
uint8_t NbGateways; |
||||
}ComplianceTest; |
||||
|
||||
/*!
|
||||
* \brief Prepares the payload of the frame |
||||
*/ |
||||
static void PrepareTxFrame( ) |
||||
{ |
||||
if( ComplianceTest.Running == true ) |
||||
{ |
||||
if( ComplianceTest.LinkCheck == true ) |
||||
{ |
||||
ComplianceTest.LinkCheck = false; |
||||
AppData.BuffSize = 3; |
||||
AppData.Buff[0] = 5; |
||||
AppData.Buff[1] = ComplianceTest.DemodMargin; |
||||
AppData.Buff[2] = ComplianceTest.NbGateways; |
||||
ComplianceTest.State = 1; |
||||
} |
||||
else |
||||
{ |
||||
switch( ComplianceTest.State ) |
||||
{ |
||||
case 4: |
||||
ComplianceTest.State = 1; |
||||
break; |
||||
case 1: |
||||
AppData.BuffSize = 2; |
||||
AppData.Buff[0] = ComplianceTest.DownLinkCounter >> 8; |
||||
AppData.Buff[1] = ComplianceTest.DownLinkCounter; |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
LoRaMainCallbacks->LoraTxData(&AppData, &IsTxConfirmed); |
||||
} |
||||
} |
||||
|
||||
/*!
|
||||
* \brief Prepares the payload of the frame |
||||
* |
||||
* \retval [0: frame could be send, 1: error] |
||||
*/ |
||||
static bool SendFrame( void ) |
||||
{ |
||||
McpsReq_t mcpsReq; |
||||
LoRaMacTxInfo_t txInfo; |
||||
|
||||
if( LoRaMacQueryTxPossible( AppData.BuffSize, &txInfo ) != LORAMAC_STATUS_OK ) |
||||
{ |
||||
// Send empty frame in order to flush MAC commands
|
||||
mcpsReq.Type = MCPS_UNCONFIRMED; |
||||
mcpsReq.Req.Unconfirmed.fBuffer = NULL; |
||||
mcpsReq.Req.Unconfirmed.fBufferSize = 0; |
||||
mcpsReq.Req.Unconfirmed.Datarate = LoRaParamInit->TxDatarate; |
||||
} |
||||
else |
||||
{ |
||||
if( IsTxConfirmed == DISABLE ) |
||||
{ |
||||
mcpsReq.Type = MCPS_UNCONFIRMED; |
||||
mcpsReq.Req.Unconfirmed.fPort = AppData.Port; |
||||
mcpsReq.Req.Unconfirmed.fBuffer = AppData.Buff; |
||||
mcpsReq.Req.Unconfirmed.fBufferSize = AppData.BuffSize; |
||||
mcpsReq.Req.Unconfirmed.Datarate = LoRaParamInit->TxDatarate; |
||||
} |
||||
else |
||||
{ |
||||
mcpsReq.Type = MCPS_CONFIRMED; |
||||
mcpsReq.Req.Confirmed.fPort = AppData.Port; |
||||
mcpsReq.Req.Confirmed.fBuffer = AppData.Buff; |
||||
mcpsReq.Req.Confirmed.fBufferSize = AppData.BuffSize; |
||||
mcpsReq.Req.Confirmed.NbTrials = 8; |
||||
mcpsReq.Req.Confirmed.Datarate = LoRaParamInit->TxDatarate; |
||||
} |
||||
} |
||||
if( LoRaMacMcpsRequest( &mcpsReq ) == LORAMAC_STATUS_OK ) |
||||
{ |
||||
return false; |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
void OnSendEvent( void ) |
||||
{ |
||||
MibRequestConfirm_t mibReq; |
||||
LoRaMacStatus_t status; |
||||
|
||||
mibReq.Type = MIB_NETWORK_JOINED; |
||||
status = LoRaMacMibGetRequestConfirm( &mibReq ); |
||||
|
||||
if( status == LORAMAC_STATUS_OK ) |
||||
{ |
||||
if( mibReq.Param.IsNetworkJoined == true ) |
||||
{ |
||||
DeviceState = DEVICE_STATE_SEND; |
||||
NextTx = true; |
||||
} |
||||
else |
||||
{ |
||||
DeviceState = DEVICE_STATE_JOIN; |
||||
} |
||||
} |
||||
} |
||||
/*!
|
||||
* \brief Function executed on TxNextPacket Timeout event |
||||
*/ |
||||
static void OnTxNextPacketTimerEvent( void ) |
||||
{ |
||||
TimerStop( &TxNextPacketTimer ); |
||||
OnSendEvent(); |
||||
} |
||||
|
||||
/*!
|
||||
* \brief MCPS-Confirm event function |
||||
* |
||||
* \param [IN] McpsConfirm - Pointer to the confirm structure, |
||||
* containing confirm attributes. |
||||
*/ |
||||
static void McpsConfirm( McpsConfirm_t *mcpsConfirm ) |
||||
{ |
||||
if( mcpsConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK ) |
||||
{ |
||||
switch( mcpsConfirm->McpsRequest ) |
||||
{ |
||||
case MCPS_UNCONFIRMED: |
||||
{ |
||||
// Check Datarate
|
||||
// Check TxPower
|
||||
break; |
||||
} |
||||
case MCPS_CONFIRMED: |
||||
{ |
||||
// Check Datarate
|
||||
// Check TxPower
|
||||
// Check AckReceived
|
||||
// Check NbTrials
|
||||
break; |
||||
} |
||||
case MCPS_PROPRIETARY: |
||||
{ |
||||
break; |
||||
} |
||||
default: |
||||
break; |
||||
} |
||||
} |
||||
NextTx = true; |
||||
} |
||||
|
||||
/*!
|
||||
* \brief MCPS-Indication event function |
||||
* |
||||
* \param [IN] mcpsIndication - Pointer to the indication structure, |
||||
* containing indication attributes. |
||||
*/ |
||||
static void McpsIndication( McpsIndication_t *mcpsIndication ) |
||||
{ |
||||
if( mcpsIndication->Status != LORAMAC_EVENT_INFO_STATUS_OK ) |
||||
{ |
||||
return; |
||||
} |
||||
|
||||
switch( mcpsIndication->McpsIndication ) |
||||
{ |
||||
case MCPS_UNCONFIRMED: |
||||
{ |
||||
break; |
||||
} |
||||
case MCPS_CONFIRMED: |
||||
{ |
||||
break; |
||||
} |
||||
case MCPS_PROPRIETARY: |
||||
{ |
||||
break; |
||||
} |
||||
case MCPS_MULTICAST: |
||||
{ |
||||
break; |
||||
} |
||||
default: |
||||
break; |
||||
} |
||||
|
||||
// Check Multicast
|
||||
// Check Port
|
||||
// Check Datarate
|
||||
// Check FramePending
|
||||
// Check Buffer
|
||||
// Check BufferSize
|
||||
// Check Rssi
|
||||
// Check Snr
|
||||
// Check RxSlot
|
||||
|
||||
if( ComplianceTest.Running == true ) |
||||
{ |
||||
ComplianceTest.DownLinkCounter++; |
||||
} |
||||
|
||||
if( mcpsIndication->RxData == true ) |
||||
{ |
||||
switch( mcpsIndication->Port ) |
||||
{ |
||||
case 224: |
||||
if( ComplianceTest.Running == false ) |
||||
{ |
||||
// Check compliance test enable command (i)
|
||||
if( ( mcpsIndication->BufferSize == 4 ) && |
||||
( mcpsIndication->Buffer[0] == 0x01 ) && |
||||
( mcpsIndication->Buffer[1] == 0x01 ) && |
||||
( mcpsIndication->Buffer[2] == 0x01 ) && |
||||
( mcpsIndication->Buffer[3] == 0x01 ) ) |
||||
{ |
||||
IsTxConfirmed = DISABLE; |
||||
AppData.Port = 224; |
||||
AppData.BuffSize = 2; |
||||
ComplianceTest.DownLinkCounter = 0; |
||||
ComplianceTest.LinkCheck = false; |
||||
ComplianceTest.DemodMargin = 0; |
||||
ComplianceTest.NbGateways = 0; |
||||
ComplianceTest.Running = true; |
||||
ComplianceTest.State = 1; |
||||
|
||||
MibRequestConfirm_t mibReq; |
||||
mibReq.Type = MIB_ADR; |
||||
mibReq.Param.AdrEnable = true; |
||||
LoRaMacMibSetRequestConfirm( &mibReq ); |
||||
|
||||
#if defined( REGION_EU868 ) |
||||
LoRaMacTestSetDutyCycleOn( false ); |
||||
#endif |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
ComplianceTest.State = mcpsIndication->Buffer[0]; |
||||
switch( ComplianceTest.State ) |
||||
{ |
||||
case 0: // Check compliance test disable command (ii)
|
||||
ComplianceTest.DownLinkCounter = 0; |
||||
ComplianceTest.Running = false; |
||||
|
||||
MibRequestConfirm_t mibReq; |
||||
mibReq.Type = MIB_ADR; |
||||
mibReq.Param.AdrEnable = LoRaParamInit->AdrEnable; |
||||
LoRaMacMibSetRequestConfirm( &mibReq ); |
||||
#if defined( REGION_EU868 ) |
||||
LoRaMacTestSetDutyCycleOn( LORAWAN_DUTYCYCLE_ON ); |
||||
#endif |
||||
break; |
||||
case 1: // (iii, iv)
|
||||
AppData.BuffSize = 2; |
||||
break; |
||||
case 2: // Enable confirmed messages (v)
|
||||
IsTxConfirmed = ENABLE; |
||||
ComplianceTest.State = 1; |
||||
break; |
||||
case 3: // Disable confirmed messages (vi)
|
||||
IsTxConfirmed = DISABLE; |
||||
ComplianceTest.State = 1; |
||||
break; |
||||
case 4: // (vii)
|
||||
AppData.BuffSize = mcpsIndication->BufferSize; |
||||
|
||||
AppData.Buff[0] = 4; |
||||
for( uint8_t i = 1; i < AppData.BuffSize; i++ ) |
||||
{ |
||||
AppData.Buff[i] = mcpsIndication->Buffer[i] + 1; |
||||
} |
||||
break; |
||||
case 5: // (viii)
|
||||
{ |
||||
MlmeReq_t mlmeReq; |
||||
mlmeReq.Type = MLME_LINK_CHECK; |
||||
LoRaMacMlmeRequest( &mlmeReq ); |
||||
} |
||||
break; |
||||
case 6: // (ix)
|
||||
{ |
||||
MlmeReq_t mlmeReq; |
||||
|
||||
// Disable TestMode and revert back to normal operation
|
||||
|
||||
ComplianceTest.DownLinkCounter = 0; |
||||
ComplianceTest.Running = false; |
||||
|
||||
MibRequestConfirm_t mibReq; |
||||
mibReq.Type = MIB_ADR; |
||||
mibReq.Param.AdrEnable = LoRaParamInit->AdrEnable; |
||||
LoRaMacMibSetRequestConfirm( &mibReq ); |
||||
|
||||
mlmeReq.Type = MLME_JOIN; |
||||
|
||||
mlmeReq.Req.Join.DevEui = DevEui; |
||||
mlmeReq.Req.Join.AppEui = AppEui; |
||||
mlmeReq.Req.Join.AppKey = AppKey; |
||||
mlmeReq.Req.Join.NbTrials = 3; |
||||
|
||||
LoRaMacMlmeRequest( &mlmeReq ); |
||||
DeviceState = DEVICE_STATE_SLEEP; |
||||
} |
||||
break; |
||||
case 7: // (x)
|
||||
{ |
||||
if( mcpsIndication->BufferSize == 3 ) |
||||
{ |
||||
MlmeReq_t mlmeReq; |
||||
mlmeReq.Type = MLME_TXCW; |
||||
mlmeReq.Req.TxCw.Timeout = ( uint16_t )( ( mcpsIndication->Buffer[1] << 8 ) | mcpsIndication->Buffer[2] ); |
||||
LoRaMacMlmeRequest( &mlmeReq ); |
||||
} |
||||
else if( mcpsIndication->BufferSize == 7 ) |
||||
{ |
||||
MlmeReq_t mlmeReq; |
||||
mlmeReq.Type = MLME_TXCW_1; |
||||
mlmeReq.Req.TxCw.Timeout = ( uint16_t )( ( mcpsIndication->Buffer[1] << 8 ) | mcpsIndication->Buffer[2] ); |
||||
mlmeReq.Req.TxCw.Frequency = ( uint32_t )( ( mcpsIndication->Buffer[3] << 16 ) | ( mcpsIndication->Buffer[4] << 8 ) | mcpsIndication->Buffer[5] ) * 100; |
||||
mlmeReq.Req.TxCw.Power = mcpsIndication->Buffer[6]; |
||||
LoRaMacMlmeRequest( &mlmeReq ); |
||||
} |
||||
ComplianceTest.State = 1; |
||||
} |
||||
break; |
||||
default:
|
||||
break; |
||||
} |
||||
} |
||||
break; |
||||
default: |
||||
|
||||
AppData.Port = mcpsIndication->Port; |
||||
AppData.BuffSize = mcpsIndication->BufferSize; |
||||
memcpy1( AppData.Buff, mcpsIndication->Buffer, AppData.BuffSize ); |
||||
|
||||
LoRaMainCallbacks->LoraRxData( &AppData ); |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
|
||||
/*!
|
||||
* \brief MLME-Confirm event function |
||||
* |
||||
* \param [IN] MlmeConfirm - Pointer to the confirm structure, |
||||
* containing confirm attributes. |
||||
*/ |
||||
static void MlmeConfirm( MlmeConfirm_t *mlmeConfirm ) |
||||
{ |
||||
switch( mlmeConfirm->MlmeRequest ) |
||||
{ |
||||
case MLME_JOIN: |
||||
{ |
||||
if( mlmeConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK ) |
||||
{ |
||||
// Status is OK, node has joined the network
|
||||
DeviceState = DEVICE_STATE_JOINED; |
||||
} |
||||
else |
||||
{ |
||||
// Join was not successful. Try to join again
|
||||
DeviceState = DEVICE_STATE_JOIN; |
||||
} |
||||
break; |
||||
} |
||||
case MLME_LINK_CHECK: |
||||
{ |
||||
if( mlmeConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK ) |
||||
{ |
||||
// Check DemodMargin
|
||||
// Check NbGateways
|
||||
if( ComplianceTest.Running == true ) |
||||
{ |
||||
ComplianceTest.LinkCheck = true; |
||||
ComplianceTest.DemodMargin = mlmeConfirm->DemodMargin; |
||||
ComplianceTest.NbGateways = mlmeConfirm->NbGateways; |
||||
} |
||||
} |
||||
break; |
||||
} |
||||
default: |
||||
break; |
||||
} |
||||
NextTx = true; |
||||
} |
||||
/**
|
||||
* lora Init |
||||
*/ |
||||
void lora_Init (LoRaMainCallback_t *callbacks, LoRaParam_t* LoRaParam ) |
||||
{ |
||||
/* init the DeviceState*/ |
||||
DeviceState= DEVICE_STATE_INIT; |
||||
|
||||
/* init the Tx Duty Cycle*/ |
||||
LoRaParamInit = LoRaParam; |
||||
|
||||
/* init the main call backs*/ |
||||
LoRaMainCallbacks = callbacks; |
||||
|
||||
#if (STATIC_DEVICE_EUI != 1) |
||||
LoRaMainCallbacks->BoardGetUniqueId( DevEui );
|
||||
#endif |
||||
|
||||
#if( OVER_THE_AIR_ACTIVATION != 0 ) |
||||
|
||||
PRINTF("OTAA\n\r");
|
||||
PRINTF("DevEui= %02X", DevEui[0]) ;for(int i=1; i<8 ; i++) {PRINTF("-%02X", DevEui[i]); }; PRINTF("\n\r"); |
||||
PRINTF("AppEui= %02X", AppEui[0]) ;for(int i=1; i<8 ; i++) {PRINTF("-%02X", AppEui[i]); }; PRINTF("\n\r"); |
||||
PRINTF("AppKey= %02X", AppKey[0]) ;for(int i=1; i<16; i++) {PRINTF(" %02X", AppKey[i]); }; PRINTF("\n\n\r"); |
||||
#else |
||||
|
||||
#if (STATIC_DEVICE_ADDRESS != 1) |
||||
// Random seed initialization
|
||||
srand1( LoRaMainCallbacks->BoardGetRandomSeed( ) ); |
||||
// Choose a random device address
|
||||
DevAddr = randr( 0, 0x01FFFFFF ); |
||||
#endif |
||||
PRINTF("ABP\n\r");
|
||||
PRINTF("DevEui= %02X", DevEui[0]) ;for(int i=1; i<8 ; i++) {PRINTF("-%02X", DevEui[i]); }; PRINTF("\n\r"); |
||||
PRINTF("DevAdd= %08X\n\r", DevAddr) ; |
||||
PRINTF("NwkSKey= %02X", NwkSKey[0]) ;for(int i=1; i<16 ; i++) {PRINTF(" %02X", NwkSKey[i]); }; PRINTF("\n\r"); |
||||
PRINTF("AppSKey= %02X", AppSKey[0]) ;for(int i=1; i<16 ; i++) {PRINTF(" %02X", AppSKey[i]); }; PRINTF("\n\r"); |
||||
#endif |
||||
|
||||
} |
||||
|
||||
/**
|
||||
* lora class A state machine |
||||
*/ |
||||
|
||||
void lora_fsm( void) |
||||
{ |
||||
switch( DeviceState ) |
||||
{ |
||||
case DEVICE_STATE_INIT: |
||||
{ |
||||
LoRaMacPrimitives.MacMcpsConfirm = McpsConfirm; |
||||
LoRaMacPrimitives.MacMcpsIndication = McpsIndication; |
||||
LoRaMacPrimitives.MacMlmeConfirm = MlmeConfirm; |
||||
LoRaMacCallbacks.GetBatteryLevel = LoRaMainCallbacks->BoardGetBatteryLevel; |
||||
#if defined( REGION_AS923 ) |
||||
LoRaMacInitialization( &LoRaMacPrimitives, &LoRaMacCallbacks, LORAMAC_REGION_AS923 ); |
||||
#elif defined( REGION_AU915 ) |
||||
LoRaMacInitialization( &LoRaMacPrimitives, &LoRaMacCallbacks, LORAMAC_REGION_AU915 ); |
||||
#elif defined( REGION_CN470 ) |
||||
LoRaMacInitialization( &LoRaMacPrimitives, &LoRaMacCallbacks, LORAMAC_REGION_CN470 ); |
||||
#elif defined( REGION_CN779 ) |
||||
LoRaMacInitialization( &LoRaMacPrimitives, &LoRaMacCallbacks, LORAMAC_REGION_CN779 ); |
||||
#elif defined( REGION_EU433 ) |
||||
LoRaMacInitialization( &LoRaMacPrimitives, &LoRaMacCallbacks, LORAMAC_REGION_EU433 ); |
||||
#elif defined( REGION_IN865 ) |
||||
LoRaMacInitialization( &LoRaMacPrimitives, &LoRaMacCallbacks, LORAMAC_REGION_IN865 ); |
||||
#elif defined( REGION_EU868 ) |
||||
LoRaMacInitialization( &LoRaMacPrimitives, &LoRaMacCallbacks, LORAMAC_REGION_EU868 ); |
||||
#elif defined( REGION_KR920 ) |
||||
LoRaMacInitialization( &LoRaMacPrimitives, &LoRaMacCallbacks, LORAMAC_REGION_KR920 ); |
||||
#elif defined( REGION_US915 ) |
||||
LoRaMacInitialization( &LoRaMacPrimitives, &LoRaMacCallbacks, LORAMAC_REGION_US915 ); |
||||
#elif defined( REGION_US915_HYBRID ) |
||||
LoRaMacInitialization( &LoRaMacPrimitives, &LoRaMacCallbacks, LORAMAC_REGION_US915_HYBRID ); |
||||
#else |
||||
#error "Please define a region in the compiler options." |
||||
#endif |
||||
|
||||
TimerInit( &TxNextPacketTimer, OnTxNextPacketTimerEvent ); |
||||
|
||||
mibReq.Type = MIB_ADR; |
||||
mibReq.Param.AdrEnable = LoRaParamInit->AdrEnable; |
||||
LoRaMacMibSetRequestConfirm( &mibReq ); |
||||
|
||||
mibReq.Type = MIB_PUBLIC_NETWORK; |
||||
mibReq.Param.EnablePublicNetwork = LoRaParamInit->EnablePublicNetwork; |
||||
LoRaMacMibSetRequestConfirm( &mibReq ); |
||||
|
||||
mibReq.Type = MIB_DEVICE_CLASS; |
||||
mibReq.Param.Class= LoRaParamInit->Class; |
||||
LoRaMacMibSetRequestConfirm( &mibReq ); |
||||
|
||||
#if defined( REGION_EU868 ) |
||||
LoRaMacTestSetDutyCycleOn( LORAWAN_DUTYCYCLE_ON ); |
||||
|
||||
#if( USE_SEMTECH_DEFAULT_CHANNEL_LINEUP == 1 ) |
||||
LoRaMacChannelAdd( 3, ( ChannelParams_t )LC4 ); |
||||
LoRaMacChannelAdd( 4, ( ChannelParams_t )LC5 ); |
||||
LoRaMacChannelAdd( 5, ( ChannelParams_t )LC6 ); |
||||
LoRaMacChannelAdd( 6, ( ChannelParams_t )LC7 ); |
||||
LoRaMacChannelAdd( 7, ( ChannelParams_t )LC8 ); |
||||
LoRaMacChannelAdd( 8, ( ChannelParams_t )LC9 ); |
||||
LoRaMacChannelAdd( 9, ( ChannelParams_t )LC10 ); |
||||
|
||||
mibReq.Type = MIB_RX2_DEFAULT_CHANNEL; |
||||
mibReq.Param.Rx2DefaultChannel = ( Rx2ChannelParams_t ){ 869525000, DR_3 }; |
||||
LoRaMacMibSetRequestConfirm( &mibReq ); |
||||
|
||||
mibReq.Type = MIB_RX2_CHANNEL; |
||||
mibReq.Param.Rx2Channel = ( Rx2ChannelParams_t ){ 869525000, DR_3 }; |
||||
LoRaMacMibSetRequestConfirm( &mibReq ); |
||||
#endif |
||||
|
||||
#endif |
||||
DeviceState = DEVICE_STATE_JOIN; |
||||
break; |
||||
} |
||||
case DEVICE_STATE_JOIN: |
||||
{ |
||||
#if( OVER_THE_AIR_ACTIVATION != 0 ) |
||||
MlmeReq_t mlmeReq; |
||||
|
||||
mlmeReq.Type = MLME_JOIN; |
||||
mlmeReq.Req.Join.DevEui = DevEui; |
||||
mlmeReq.Req.Join.AppEui = AppEui; |
||||
mlmeReq.Req.Join.AppKey = AppKey; |
||||
mlmeReq.Req.Join.NbTrials = LoRaParamInit->NbTrials; |
||||
|
||||
if( NextTx == true ) |
||||
{ |
||||
LoRaMacMlmeRequest( &mlmeReq ); |
||||
} |
||||
|
||||
DeviceState = DEVICE_STATE_SLEEP; |
||||
#else |
||||
mibReq.Type = MIB_NET_ID; |
||||
mibReq.Param.NetID = LORAWAN_NETWORK_ID; |
||||
LoRaMacMibSetRequestConfirm( &mibReq ); |
||||
|
||||
mibReq.Type = MIB_DEV_ADDR; |
||||
mibReq.Param.DevAddr = DevAddr; |
||||
LoRaMacMibSetRequestConfirm( &mibReq ); |
||||
|
||||
mibReq.Type = MIB_NWK_SKEY; |
||||
mibReq.Param.NwkSKey = NwkSKey; |
||||
LoRaMacMibSetRequestConfirm( &mibReq ); |
||||
|
||||
mibReq.Type = MIB_APP_SKEY; |
||||
mibReq.Param.AppSKey = AppSKey; |
||||
LoRaMacMibSetRequestConfirm( &mibReq ); |
||||
|
||||
mibReq.Type = MIB_NETWORK_JOINED; |
||||
mibReq.Param.IsNetworkJoined = true; |
||||
LoRaMacMibSetRequestConfirm( &mibReq ); |
||||
|
||||
DeviceState = DEVICE_STATE_SEND; |
||||
#endif |
||||
break; |
||||
} |
||||
case DEVICE_STATE_JOINED: |
||||
{ |
||||
PRINTF("JOINED\n\r"); |
||||
DeviceState = DEVICE_STATE_SEND; |
||||
break; |
||||
} |
||||
case DEVICE_STATE_SEND: |
||||
{ |
||||
if( NextTx == true ) |
||||
{ |
||||
PrepareTxFrame( ); |
||||
|
||||
NextTx = SendFrame( ); |
||||
} |
||||
if( ComplianceTest.Running == true ) |
||||
{ |
||||
// Schedule next packet transmission as soon as possible
|
||||
TimerSetValue( &TxNextPacketTimer, 5000); /* 5s */ |
||||
TimerStart( &TxNextPacketTimer ); |
||||
} |
||||
else if (LoRaParamInit->TxEvent == TX_ON_TIMER ) |
||||
{ |
||||
// Schedule next packet transmission
|
||||
TimerSetValue( &TxNextPacketTimer, LoRaParamInit->TxDutyCycleTime ); |
||||
TimerStart( &TxNextPacketTimer ); |
||||
} |
||||
|
||||
DeviceState = DEVICE_STATE_SLEEP; |
||||
break; |
||||
} |
||||
case DEVICE_STATE_SLEEP: |
||||
{ |
||||
// Wake up through events
|
||||
break; |
||||
} |
||||
default: |
||||
{ |
||||
DeviceState = DEVICE_STATE_INIT; |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
DeviceState_t lora_getDeviceState( void ) |
||||
{ |
||||
return DeviceState; |
||||
} |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
||||
|
@ -0,0 +1,251 @@ |
||||
/*
|
||||
/ _____) _ | | |
||||
( (____ _____ ____ _| |_ _____ ____| |__ |
||||
\____ \| ___ | (_ _) ___ |/ ___) _ \
|
||||
_____) ) ____| | | || |_| ____( (___| | | | |
||||
(______/|_____)_|_|_| \__)_____)\____)_| |_| |
||||
(C)2013 Semtech |
||||
|
||||
Description: LoRaMac classA device implementation |
||||
|
||||
License: Revised BSD License, see LICENSE.TXT file include in the project |
||||
|
||||
Maintainer: Miguel Luis, Gregory Cristian and Wael Guibene |
||||
*/ |
||||
/******************************************************************************
|
||||
* @file lora.h |
||||
* @author MCD Application Team |
||||
* @version V1.1.2 |
||||
* @date 08-September-2017 |
||||
* @brief lora API to drive the lora state Machine |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics International N.V.
|
||||
* All rights reserved.</center></h2> |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted, provided that the following conditions are met: |
||||
* |
||||
* 1. Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer. |
||||
* 2. 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. |
||||
* 3. Neither the name of STMicroelectronics nor the names of other
|
||||
* contributors to this software may be used to endorse or promote products
|
||||
* derived from this software without specific written permission. |
||||
* 4. This software, including modifications and/or derivative works of this
|
||||
* software, must execute solely and exclusively on microcontroller or |
||||
* microprocessor devices manufactured by or for STMicroelectronics. |
||||
* 5. Redistribution and use of this software other than as permitted under
|
||||
* this license is void and will automatically terminate your rights under
|
||||
* this license.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
* PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY |
||||
* RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
|
||||
* SHALL STMICROELECTRONICS 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
|
||||
#ifndef __LORA_MAIN_H__ |
||||
#define __LORA_MAIN_H__ |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "Commissioning.h" |
||||
#include "LoRaMac.h" |
||||
#include "region/Region.h" |
||||
|
||||
/* Exported constants --------------------------------------------------------*/ |
||||
/* Exported types ------------------------------------------------------------*/ |
||||
|
||||
/*!
|
||||
* Application Data structure |
||||
*/ |
||||
typedef struct |
||||
{ |
||||
/*point to the LoRa App data buffer*/ |
||||
uint8_t* Buff; |
||||
/*LoRa App data buffer size*/ |
||||
uint8_t BuffSize; |
||||
/*Port on which the LoRa App is data is sent/ received*/ |
||||
uint8_t Port; |
||||
|
||||
} lora_AppData_t; |
||||
|
||||
/*!
|
||||
* LoRa State Machine states
|
||||
*/ |
||||
typedef enum eDevicState |
||||
{ |
||||
DEVICE_STATE_INIT, |
||||
DEVICE_STATE_JOIN, |
||||
DEVICE_STATE_JOINED, |
||||
DEVICE_STATE_SEND, |
||||
DEVICE_STATE_CYCLE, |
||||
DEVICE_STATE_SLEEP |
||||
} DeviceState_t; |
||||
|
||||
/*!
|
||||
* LoRa State Machine states
|
||||
*/ |
||||
typedef enum eTxEventType |
||||
{ |
||||
/*!
|
||||
* @brief AppdataTransmition issue based on timer every TxDutyCycleTime |
||||
*/ |
||||
TX_ON_TIMER, |
||||
/*!
|
||||
* @brief AppdataTransmition external event plugged on OnSendEvent( ) |
||||
*/ |
||||
TX_ON_EVENT |
||||
} TxEventType_t; |
||||
|
||||
|
||||
/*!
|
||||
* LoRa State Machine states
|
||||
*/ |
||||
typedef struct sLoRaParam |
||||
{ |
||||
/*!
|
||||
* @brief Event type |
||||
* |
||||
* @retval value battery level ( 0: very low, 254: fully charged ) |
||||
*/ |
||||
TxEventType_t TxEvent; |
||||
/*!
|
||||
* @brief Application data transmission duty cycle in ms |
||||
* |
||||
* @note when TX_ON_TIMER Event type is selected |
||||
*/ |
||||
uint32_t TxDutyCycleTime; |
||||
/*!
|
||||
* @brief LoRaWAN device class |
||||
*/ |
||||
DeviceClass_t Class; |
||||
/*!
|
||||
* @brief Activation state of adaptativeDatarate |
||||
*/ |
||||
bool AdrEnable; |
||||
/*!
|
||||
* @brief Uplink datarate, if AdrEnable is off |
||||
*/ |
||||
int8_t TxDatarate; |
||||
/*!
|
||||
* @brief Enable or disable a public network |
||||
* |
||||
*/ |
||||
bool EnablePublicNetwork; |
||||
/*!
|
||||
* @brief Number of trials for the join request. |
||||
*/ |
||||
uint8_t NbTrials; |
||||
|
||||
} LoRaParam_t; |
||||
|
||||
/* Lora Main callbacks*/ |
||||
typedef struct sLoRaMainCallback |
||||
{ |
||||
/*!
|
||||
* @brief Get the current battery level |
||||
* |
||||
* @retval value battery level ( 0: very low, 254: fully charged ) |
||||
*/ |
||||
uint8_t ( *BoardGetBatteryLevel )( void ); |
||||
|
||||
/*!
|
||||
* @brief Gets the board 64 bits unique ID
|
||||
* |
||||
* @param [IN] id Pointer to an array that will contain the Unique ID |
||||
*/ |
||||
void ( *BoardGetUniqueId ) ( uint8_t *id); |
||||
/*!
|
||||
* Returns a pseudo random seed generated using the MCU Unique ID |
||||
* |
||||
* @retval seed Generated pseudo random seed |
||||
*/ |
||||
uint32_t ( *BoardGetRandomSeed ) (void); |
||||
/*!
|
||||
* @brief Prepares Tx Data to be sent on Lora network
|
||||
* |
||||
* @param [IN] AppData is a buffer to fill |
||||
* |
||||
* @param [IN] port is a Application port on wicth Appdata will be sent |
||||
* |
||||
* @param [IN] length of the AppDataBuffer to send |
||||
* |
||||
* @param [IN] requests a confirmed Frame from the Network |
||||
*/ |
||||
void ( *LoraTxData ) ( lora_AppData_t *AppData, FunctionalState* IsTxConfirmed); |
||||
/*!
|
||||
* @brief Process Rx Data received from Lora network
|
||||
* |
||||
* @param [IN] AppData is a buffer to process |
||||
* |
||||
* @param [IN] port is a Application port on wicth Appdata will be sent |
||||
* |
||||
* @param [IN] length is the number of recieved bytes |
||||
*/ |
||||
void ( *LoraRxData ) ( lora_AppData_t *AppData); |
||||
|
||||
} LoRaMainCallback_t; |
||||
|
||||
|
||||
|
||||
/* External variables --------------------------------------------------------*/ |
||||
/* Exported macros -----------------------------------------------------------*/ |
||||
/* Exported functions ------------------------------------------------------- */
|
||||
/**
|
||||
* @brief Lora Initialisation |
||||
* @param [IN] LoRaMainCallback_t |
||||
* @param [IN] application parmaters |
||||
* @retval none |
||||
*/ |
||||
void lora_Init (LoRaMainCallback_t *callbacks, LoRaParam_t* LoRaParam ); |
||||
|
||||
/**
|
||||
* @brief run Lora classA state Machine
|
||||
* @param [IN] none |
||||
* @retval none |
||||
*/ |
||||
void lora_fsm( void ); |
||||
|
||||
/**
|
||||
* @brief functionl requesting loRa state machine to send data
|
||||
* @note function to link in mode TX_ON_EVENT
|
||||
* @param none |
||||
* @retval none |
||||
*/ |
||||
void OnSendEvent( void ); |
||||
|
||||
|
||||
/**
|
||||
* @brief API returns the state of the lora state machine |
||||
* @note return @DeviceState_t state |
||||
* @param [IN] none |
||||
* @retval return @FlagStatus |
||||
*/ |
||||
DeviceState_t lora_getDeviceState( void ); |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /*__LORA_MAIN_H__*/ |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,88 @@ |
||||
/*
|
||||
/ _____) _ | | |
||||
( (____ _____ ____ _| |_ _____ ____| |__ |
||||
\____ \| ___ | (_ _) ___ |/ ___) _ \
|
||||
_____) ) ____| | | || |_| ____( (___| | | | |
||||
(______/|_____)_|_|_| \__)_____)\____)_| |_| |
||||
(C)2013 Semtech |
||||
|
||||
Description: LoRaMac classA device implementation |
||||
|
||||
License: Revised BSD License, see LICENSE.TXT file include in the project |
||||
|
||||
Maintainer: Miguel Luis, Gregory Cristian and Wael Guibene |
||||
*/ |
||||
/******************************************************************************
|
||||
* @file lora_mac_version.h |
||||
* @author MCD Application Team |
||||
* @version V1.1.2 |
||||
* @date 08-September-2017 |
||||
* @brief defines the lora mac version |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics International N.V.
|
||||
* All rights reserved.</center></h2> |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted, provided that the following conditions are met: |
||||
* |
||||
* 1. Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer. |
||||
* 2. 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. |
||||
* 3. Neither the name of STMicroelectronics nor the names of other
|
||||
* contributors to this software may be used to endorse or promote products
|
||||
* derived from this software without specific written permission. |
||||
* 4. This software, including modifications and/or derivative works of this
|
||||
* software, must execute solely and exclusively on microcontroller or |
||||
* microprocessor devices manufactured by or for STMicroelectronics. |
||||
* 5. Redistribution and use of this software other than as permitted under
|
||||
* this license is void and will automatically terminate your rights under
|
||||
* this license.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
* PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY |
||||
* RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
|
||||
* SHALL STMICROELECTRONICS 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. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
|
||||
#ifndef __LORA_MAC_VERSION_H__ |
||||
#define __LORA_MAC_VERSION_H__ |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
/* Exported constants --------------------------------------------------------*/ |
||||
|
||||
/*the 3 MSBs define the version based on Github version */ |
||||
/*https://github.com/Lora-net/LoRaMac-node/wiki/LoRaMAC-node-Wiki*/ |
||||
/* version 4.4.0 from develop branch */ |
||||
#define LORA_MAC_VERSION (uint32_t) 0x44030000 |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
/* External variables --------------------------------------------------------*/ |
||||
/* Exported macros -----------------------------------------------------------*/ |
||||
/* Exported functions ------------------------------------------------------- */
|
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /*__LORA_MAC_VERSION_H__*/ |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,936 @@ |
||||
/*
|
||||
--------------------------------------------------------------------------- |
||||
Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved. |
||||
|
||||
LICENSE TERMS |
||||
|
||||
The redistribution and use of this software (with or without changes) |
||||
is allowed without the payment of fees or royalties provided that: |
||||
|
||||
1. source code distributions include the above copyright notice, this |
||||
list of conditions and the following disclaimer; |
||||
|
||||
2. binary distributions include the above copyright notice, this list |
||||
of conditions and the following disclaimer in their documentation; |
||||
|
||||
3. the name of the copyright holder is not used to endorse products |
||||
built using this software without specific written permission. |
||||
|
||||
DISCLAIMER |
||||
|
||||
This software is provided 'as is' with no explicit or implied warranties |
||||
in respect of its properties, including, but not limited to, correctness |
||||
and/or fitness for purpose. |
||||
--------------------------------------------------------------------------- |
||||
Issue 09/09/2006 |
||||
|
||||
This is an AES implementation that uses only 8-bit byte operations on the |
||||
cipher state (there are options to use 32-bit types if available). |
||||
|
||||
The combination of mix columns and byte substitution used here is based on |
||||
that developed by Karl Malbrain. His contribution is acknowledged. |
||||
*/ |
||||
|
||||
/* define if you have a fast memcpy function on your system */ |
||||
#if 0 |
||||
# define HAVE_MEMCPY |
||||
# include <string.h> |
||||
# if defined( _MSC_VER ) |
||||
# include <intrin.h> |
||||
# pragma intrinsic( memcpy ) |
||||
# endif |
||||
#endif |
||||
|
||||
|
||||
#include <stdlib.h> |
||||
#include <stdint.h> |
||||
|
||||
/* define if you have fast 32-bit types on your system */ |
||||
#if 0 |
||||
# define HAVE_UINT_32T |
||||
#endif |
||||
|
||||
/* define if you don't want any tables */ |
||||
#if 1 |
||||
# define USE_TABLES |
||||
#endif |
||||
|
||||
/* On Intel Core 2 duo VERSION_1 is faster */ |
||||
|
||||
/* alternative versions (test for performance on your system) */ |
||||
#if 1 |
||||
# define VERSION_1 |
||||
#endif |
||||
|
||||
#include "aes.h" |
||||
|
||||
//#if defined( HAVE_UINT_32T )
|
||||
// typedef unsigned long uint32_t;
|
||||
//#endif
|
||||
|
||||
/* functions for finite field multiplication in the AES Galois field */ |
||||
|
||||
#define WPOLY 0x011b |
||||
#define BPOLY 0x1b |
||||
#define DPOLY 0x008d |
||||
|
||||
#define f1(x) (x) |
||||
#define f2(x) ((x << 1) ^ (((x >> 7) & 1) * WPOLY)) |
||||
#define f4(x) ((x << 2) ^ (((x >> 6) & 1) * WPOLY) ^ (((x >> 6) & 2) * WPOLY)) |
||||
#define f8(x) ((x << 3) ^ (((x >> 5) & 1) * WPOLY) ^ (((x >> 5) & 2) * WPOLY) \ |
||||
^ (((x >> 5) & 4) * WPOLY)) |
||||
#define d2(x) (((x) >> 1) ^ ((x) & 1 ? DPOLY : 0)) |
||||
|
||||
#define f3(x) (f2(x) ^ x) |
||||
#define f9(x) (f8(x) ^ x) |
||||
#define fb(x) (f8(x) ^ f2(x) ^ x) |
||||
#define fd(x) (f8(x) ^ f4(x) ^ x) |
||||
#define fe(x) (f8(x) ^ f4(x) ^ f2(x)) |
||||
|
||||
#if defined( USE_TABLES ) |
||||
|
||||
#define sb_data(w) { /* S Box data values */ \ |
||||
w(0x63), w(0x7c), w(0x77), w(0x7b), w(0xf2), w(0x6b), w(0x6f), w(0xc5),\
|
||||
w(0x30), w(0x01), w(0x67), w(0x2b), w(0xfe), w(0xd7), w(0xab), w(0x76),\
|
||||
w(0xca), w(0x82), w(0xc9), w(0x7d), w(0xfa), w(0x59), w(0x47), w(0xf0),\
|
||||
w(0xad), w(0xd4), w(0xa2), w(0xaf), w(0x9c), w(0xa4), w(0x72), w(0xc0),\
|
||||
w(0xb7), w(0xfd), w(0x93), w(0x26), w(0x36), w(0x3f), w(0xf7), w(0xcc),\
|
||||
w(0x34), w(0xa5), w(0xe5), w(0xf1), w(0x71), w(0xd8), w(0x31), w(0x15),\
|
||||
w(0x04), w(0xc7), w(0x23), w(0xc3), w(0x18), w(0x96), w(0x05), w(0x9a),\
|
||||
w(0x07), w(0x12), w(0x80), w(0xe2), w(0xeb), w(0x27), w(0xb2), w(0x75),\
|
||||
w(0x09), w(0x83), w(0x2c), w(0x1a), w(0x1b), w(0x6e), w(0x5a), w(0xa0),\
|
||||
w(0x52), w(0x3b), w(0xd6), w(0xb3), w(0x29), w(0xe3), w(0x2f), w(0x84),\
|
||||
w(0x53), w(0xd1), w(0x00), w(0xed), w(0x20), w(0xfc), w(0xb1), w(0x5b),\
|
||||
w(0x6a), w(0xcb), w(0xbe), w(0x39), w(0x4a), w(0x4c), w(0x58), w(0xcf),\
|
||||
w(0xd0), w(0xef), w(0xaa), w(0xfb), w(0x43), w(0x4d), w(0x33), w(0x85),\
|
||||
w(0x45), w(0xf9), w(0x02), w(0x7f), w(0x50), w(0x3c), w(0x9f), w(0xa8),\
|
||||
w(0x51), w(0xa3), w(0x40), w(0x8f), w(0x92), w(0x9d), w(0x38), w(0xf5),\
|
||||
w(0xbc), w(0xb6), w(0xda), w(0x21), w(0x10), w(0xff), w(0xf3), w(0xd2),\
|
||||
w(0xcd), w(0x0c), w(0x13), w(0xec), w(0x5f), w(0x97), w(0x44), w(0x17),\
|
||||
w(0xc4), w(0xa7), w(0x7e), w(0x3d), w(0x64), w(0x5d), w(0x19), w(0x73),\
|
||||
w(0x60), w(0x81), w(0x4f), w(0xdc), w(0x22), w(0x2a), w(0x90), w(0x88),\
|
||||
w(0x46), w(0xee), w(0xb8), w(0x14), w(0xde), w(0x5e), w(0x0b), w(0xdb),\
|
||||
w(0xe0), w(0x32), w(0x3a), w(0x0a), w(0x49), w(0x06), w(0x24), w(0x5c),\
|
||||
w(0xc2), w(0xd3), w(0xac), w(0x62), w(0x91), w(0x95), w(0xe4), w(0x79),\
|
||||
w(0xe7), w(0xc8), w(0x37), w(0x6d), w(0x8d), w(0xd5), w(0x4e), w(0xa9),\
|
||||
w(0x6c), w(0x56), w(0xf4), w(0xea), w(0x65), w(0x7a), w(0xae), w(0x08),\
|
||||
w(0xba), w(0x78), w(0x25), w(0x2e), w(0x1c), w(0xa6), w(0xb4), w(0xc6),\
|
||||
w(0xe8), w(0xdd), w(0x74), w(0x1f), w(0x4b), w(0xbd), w(0x8b), w(0x8a),\
|
||||
w(0x70), w(0x3e), w(0xb5), w(0x66), w(0x48), w(0x03), w(0xf6), w(0x0e),\
|
||||
w(0x61), w(0x35), w(0x57), w(0xb9), w(0x86), w(0xc1), w(0x1d), w(0x9e),\
|
||||
w(0xe1), w(0xf8), w(0x98), w(0x11), w(0x69), w(0xd9), w(0x8e), w(0x94),\
|
||||
w(0x9b), w(0x1e), w(0x87), w(0xe9), w(0xce), w(0x55), w(0x28), w(0xdf),\
|
||||
w(0x8c), w(0xa1), w(0x89), w(0x0d), w(0xbf), w(0xe6), w(0x42), w(0x68),\
|
||||
w(0x41), w(0x99), w(0x2d), w(0x0f), w(0xb0), w(0x54), w(0xbb), w(0x16) } |
||||
|
||||
#define isb_data(w) { /* inverse S Box data values */ \ |
||||
w(0x52), w(0x09), w(0x6a), w(0xd5), w(0x30), w(0x36), w(0xa5), w(0x38),\
|
||||
w(0xbf), w(0x40), w(0xa3), w(0x9e), w(0x81), w(0xf3), w(0xd7), w(0xfb),\
|
||||
w(0x7c), w(0xe3), w(0x39), w(0x82), w(0x9b), w(0x2f), w(0xff), w(0x87),\
|
||||
w(0x34), w(0x8e), w(0x43), w(0x44), w(0xc4), w(0xde), w(0xe9), w(0xcb),\
|
||||
w(0x54), w(0x7b), w(0x94), w(0x32), w(0xa6), w(0xc2), w(0x23), w(0x3d),\
|
||||
w(0xee), w(0x4c), w(0x95), w(0x0b), w(0x42), w(0xfa), w(0xc3), w(0x4e),\
|
||||
w(0x08), w(0x2e), w(0xa1), w(0x66), w(0x28), w(0xd9), w(0x24), w(0xb2),\
|
||||
w(0x76), w(0x5b), w(0xa2), w(0x49), w(0x6d), w(0x8b), w(0xd1), w(0x25),\
|
||||
w(0x72), w(0xf8), w(0xf6), w(0x64), w(0x86), w(0x68), w(0x98), w(0x16),\
|
||||
w(0xd4), w(0xa4), w(0x5c), w(0xcc), w(0x5d), w(0x65), w(0xb6), w(0x92),\
|
||||
w(0x6c), w(0x70), w(0x48), w(0x50), w(0xfd), w(0xed), w(0xb9), w(0xda),\
|
||||
w(0x5e), w(0x15), w(0x46), w(0x57), w(0xa7), w(0x8d), w(0x9d), w(0x84),\
|
||||
w(0x90), w(0xd8), w(0xab), w(0x00), w(0x8c), w(0xbc), w(0xd3), w(0x0a),\
|
||||
w(0xf7), w(0xe4), w(0x58), w(0x05), w(0xb8), w(0xb3), w(0x45), w(0x06),\
|
||||
w(0xd0), w(0x2c), w(0x1e), w(0x8f), w(0xca), w(0x3f), w(0x0f), w(0x02),\
|
||||
w(0xc1), w(0xaf), w(0xbd), w(0x03), w(0x01), w(0x13), w(0x8a), w(0x6b),\
|
||||
w(0x3a), w(0x91), w(0x11), w(0x41), w(0x4f), w(0x67), w(0xdc), w(0xea),\
|
||||
w(0x97), w(0xf2), w(0xcf), w(0xce), w(0xf0), w(0xb4), w(0xe6), w(0x73),\
|
||||
w(0x96), w(0xac), w(0x74), w(0x22), w(0xe7), w(0xad), w(0x35), w(0x85),\
|
||||
w(0xe2), w(0xf9), w(0x37), w(0xe8), w(0x1c), w(0x75), w(0xdf), w(0x6e),\
|
||||
w(0x47), w(0xf1), w(0x1a), w(0x71), w(0x1d), w(0x29), w(0xc5), w(0x89),\
|
||||
w(0x6f), w(0xb7), w(0x62), w(0x0e), w(0xaa), w(0x18), w(0xbe), w(0x1b),\
|
||||
w(0xfc), w(0x56), w(0x3e), w(0x4b), w(0xc6), w(0xd2), w(0x79), w(0x20),\
|
||||
w(0x9a), w(0xdb), w(0xc0), w(0xfe), w(0x78), w(0xcd), w(0x5a), w(0xf4),\
|
||||
w(0x1f), w(0xdd), w(0xa8), w(0x33), w(0x88), w(0x07), w(0xc7), w(0x31),\
|
||||
w(0xb1), w(0x12), w(0x10), w(0x59), w(0x27), w(0x80), w(0xec), w(0x5f),\
|
||||
w(0x60), w(0x51), w(0x7f), w(0xa9), w(0x19), w(0xb5), w(0x4a), w(0x0d),\
|
||||
w(0x2d), w(0xe5), w(0x7a), w(0x9f), w(0x93), w(0xc9), w(0x9c), w(0xef),\
|
||||
w(0xa0), w(0xe0), w(0x3b), w(0x4d), w(0xae), w(0x2a), w(0xf5), w(0xb0),\
|
||||
w(0xc8), w(0xeb), w(0xbb), w(0x3c), w(0x83), w(0x53), w(0x99), w(0x61),\
|
||||
w(0x17), w(0x2b), w(0x04), w(0x7e), w(0xba), w(0x77), w(0xd6), w(0x26),\
|
||||
w(0xe1), w(0x69), w(0x14), w(0x63), w(0x55), w(0x21), w(0x0c), w(0x7d) } |
||||
|
||||
#define mm_data(w) { /* basic data for forming finite field tables */ \ |
||||
w(0x00), w(0x01), w(0x02), w(0x03), w(0x04), w(0x05), w(0x06), w(0x07),\
|
||||
w(0x08), w(0x09), w(0x0a), w(0x0b), w(0x0c), w(0x0d), w(0x0e), w(0x0f),\
|
||||
w(0x10), w(0x11), w(0x12), w(0x13), w(0x14), w(0x15), w(0x16), w(0x17),\
|
||||
w(0x18), w(0x19), w(0x1a), w(0x1b), w(0x1c), w(0x1d), w(0x1e), w(0x1f),\
|
||||
w(0x20), w(0x21), w(0x22), w(0x23), w(0x24), w(0x25), w(0x26), w(0x27),\
|
||||
w(0x28), w(0x29), w(0x2a), w(0x2b), w(0x2c), w(0x2d), w(0x2e), w(0x2f),\
|
||||
w(0x30), w(0x31), w(0x32), w(0x33), w(0x34), w(0x35), w(0x36), w(0x37),\
|
||||
w(0x38), w(0x39), w(0x3a), w(0x3b), w(0x3c), w(0x3d), w(0x3e), w(0x3f),\
|
||||
w(0x40), w(0x41), w(0x42), w(0x43), w(0x44), w(0x45), w(0x46), w(0x47),\
|
||||
w(0x48), w(0x49), w(0x4a), w(0x4b), w(0x4c), w(0x4d), w(0x4e), w(0x4f),\
|
||||
w(0x50), w(0x51), w(0x52), w(0x53), w(0x54), w(0x55), w(0x56), w(0x57),\
|
||||
w(0x58), w(0x59), w(0x5a), w(0x5b), w(0x5c), w(0x5d), w(0x5e), w(0x5f),\
|
||||
w(0x60), w(0x61), w(0x62), w(0x63), w(0x64), w(0x65), w(0x66), w(0x67),\
|
||||
w(0x68), w(0x69), w(0x6a), w(0x6b), w(0x6c), w(0x6d), w(0x6e), w(0x6f),\
|
||||
w(0x70), w(0x71), w(0x72), w(0x73), w(0x74), w(0x75), w(0x76), w(0x77),\
|
||||
w(0x78), w(0x79), w(0x7a), w(0x7b), w(0x7c), w(0x7d), w(0x7e), w(0x7f),\
|
||||
w(0x80), w(0x81), w(0x82), w(0x83), w(0x84), w(0x85), w(0x86), w(0x87),\
|
||||
w(0x88), w(0x89), w(0x8a), w(0x8b), w(0x8c), w(0x8d), w(0x8e), w(0x8f),\
|
||||
w(0x90), w(0x91), w(0x92), w(0x93), w(0x94), w(0x95), w(0x96), w(0x97),\
|
||||
w(0x98), w(0x99), w(0x9a), w(0x9b), w(0x9c), w(0x9d), w(0x9e), w(0x9f),\
|
||||
w(0xa0), w(0xa1), w(0xa2), w(0xa3), w(0xa4), w(0xa5), w(0xa6), w(0xa7),\
|
||||
w(0xa8), w(0xa9), w(0xaa), w(0xab), w(0xac), w(0xad), w(0xae), w(0xaf),\
|
||||
w(0xb0), w(0xb1), w(0xb2), w(0xb3), w(0xb4), w(0xb5), w(0xb6), w(0xb7),\
|
||||
w(0xb8), w(0xb9), w(0xba), w(0xbb), w(0xbc), w(0xbd), w(0xbe), w(0xbf),\
|
||||
w(0xc0), w(0xc1), w(0xc2), w(0xc3), w(0xc4), w(0xc5), w(0xc6), w(0xc7),\
|
||||
w(0xc8), w(0xc9), w(0xca), w(0xcb), w(0xcc), w(0xcd), w(0xce), w(0xcf),\
|
||||
w(0xd0), w(0xd1), w(0xd2), w(0xd3), w(0xd4), w(0xd5), w(0xd6), w(0xd7),\
|
||||
w(0xd8), w(0xd9), w(0xda), w(0xdb), w(0xdc), w(0xdd), w(0xde), w(0xdf),\
|
||||
w(0xe0), w(0xe1), w(0xe2), w(0xe3), w(0xe4), w(0xe5), w(0xe6), w(0xe7),\
|
||||
w(0xe8), w(0xe9), w(0xea), w(0xeb), w(0xec), w(0xed), w(0xee), w(0xef),\
|
||||
w(0xf0), w(0xf1), w(0xf2), w(0xf3), w(0xf4), w(0xf5), w(0xf6), w(0xf7),\
|
||||
w(0xf8), w(0xf9), w(0xfa), w(0xfb), w(0xfc), w(0xfd), w(0xfe), w(0xff) } |
||||
|
||||
static const uint8_t sbox[256] = sb_data(f1); |
||||
|
||||
#if defined( AES_DEC_PREKEYED ) |
||||
static const uint8_t isbox[256] = isb_data(f1); |
||||
#endif |
||||
|
||||
static const uint8_t gfm2_sbox[256] = sb_data(f2); |
||||
static const uint8_t gfm3_sbox[256] = sb_data(f3); |
||||
|
||||
#if defined( AES_DEC_PREKEYED ) |
||||
static const uint8_t gfmul_9[256] = mm_data(f9); |
||||
static const uint8_t gfmul_b[256] = mm_data(fb); |
||||
static const uint8_t gfmul_d[256] = mm_data(fd); |
||||
static const uint8_t gfmul_e[256] = mm_data(fe); |
||||
#endif |
||||
|
||||
#define s_box(x) sbox[(x)] |
||||
#if defined( AES_DEC_PREKEYED ) |
||||
#define is_box(x) isbox[(x)] |
||||
#endif |
||||
#define gfm2_sb(x) gfm2_sbox[(x)] |
||||
#define gfm3_sb(x) gfm3_sbox[(x)] |
||||
#if defined( AES_DEC_PREKEYED ) |
||||
#define gfm_9(x) gfmul_9[(x)] |
||||
#define gfm_b(x) gfmul_b[(x)] |
||||
#define gfm_d(x) gfmul_d[(x)] |
||||
#define gfm_e(x) gfmul_e[(x)] |
||||
#endif |
||||
#else |
||||
|
||||
/* this is the high bit of x right shifted by 1 */ |
||||
/* position. Since the starting polynomial has */ |
||||
/* 9 bits (0x11b), this right shift keeps the */ |
||||
/* values of all top bits within a byte */ |
||||
|
||||
static uint8_t hibit(const uint8_t x) |
||||
{ uint8_t r = (uint8_t)((x >> 1) | (x >> 2)); |
||||
|
||||
r |= (r >> 2); |
||||
r |= (r >> 4); |
||||
return (r + 1) >> 1; |
||||
} |
||||
|
||||
/* return the inverse of the finite field element x */ |
||||
|
||||
static uint8_t gf_inv(const uint8_t x) |
||||
{ uint8_t p1 = x, p2 = BPOLY, n1 = hibit(x), n2 = 0x80, v1 = 1, v2 = 0; |
||||
|
||||
if(x < 2) |
||||
return x; |
||||
|
||||
for( ; ; ) |
||||
{ |
||||
if(n1) |
||||
while(n2 >= n1) /* divide polynomial p2 by p1 */ |
||||
{ |
||||
n2 /= n1; /* shift smaller polynomial left */ |
||||
p2 ^= (p1 * n2) & 0xff; /* and remove from larger one */ |
||||
v2 ^= (v1 * n2); /* shift accumulated value and */ |
||||
n2 = hibit(p2); /* add into result */ |
||||
} |
||||
else |
||||
return v1; |
||||
|
||||
if(n2) /* repeat with values swapped */ |
||||
while(n1 >= n2) |
||||
{ |
||||
n1 /= n2; |
||||
p1 ^= p2 * n1; |
||||
v1 ^= v2 * n1; |
||||
n1 = hibit(p1); |
||||
} |
||||
else |
||||
return v2; |
||||
} |
||||
} |
||||
|
||||
/* The forward and inverse affine transformations used in the S-box */ |
||||
uint8_t fwd_affine(const uint8_t x) |
||||
{ |
||||
#if defined( HAVE_UINT_32T ) |
||||
uint32_t w = x; |
||||
w ^= (w << 1) ^ (w << 2) ^ (w << 3) ^ (w << 4); |
||||
return 0x63 ^ ((w ^ (w >> 8)) & 0xff); |
||||
#else |
||||
return 0x63 ^ x ^ (x << 1) ^ (x << 2) ^ (x << 3) ^ (x << 4) |
||||
^ (x >> 7) ^ (x >> 6) ^ (x >> 5) ^ (x >> 4); |
||||
#endif |
||||
} |
||||
|
||||
uint8_t inv_affine(const uint8_t x) |
||||
{ |
||||
#if defined( HAVE_UINT_32T ) |
||||
uint32_t w = x; |
||||
w = (w << 1) ^ (w << 3) ^ (w << 6); |
||||
return 0x05 ^ ((w ^ (w >> 8)) & 0xff); |
||||
#else |
||||
return 0x05 ^ (x << 1) ^ (x << 3) ^ (x << 6) |
||||
^ (x >> 7) ^ (x >> 5) ^ (x >> 2); |
||||
#endif |
||||
} |
||||
|
||||
#define s_box(x) fwd_affine(gf_inv(x)) |
||||
#define is_box(x) gf_inv(inv_affine(x)) |
||||
#define gfm2_sb(x) f2(s_box(x)) |
||||
#define gfm3_sb(x) f3(s_box(x)) |
||||
#define gfm_9(x) f9(x) |
||||
#define gfm_b(x) fb(x) |
||||
#define gfm_d(x) fd(x) |
||||
#define gfm_e(x) fe(x) |
||||
|
||||
#endif |
||||
|
||||
#if defined( HAVE_MEMCPY ) |
||||
# define block_copy_nn(d, s, l) memcpy(d, s, l) |
||||
# define block_copy(d, s) memcpy(d, s, N_BLOCK) |
||||
#else |
||||
# define block_copy_nn(d, s, l) copy_block_nn(d, s, l) |
||||
# define block_copy(d, s) copy_block(d, s) |
||||
#endif |
||||
|
||||
static void copy_block( void *d, const void *s ) |
||||
{ |
||||
#if defined( HAVE_UINT_32T ) |
||||
((uint32_t*)d)[ 0] = ((uint32_t*)s)[ 0]; |
||||
((uint32_t*)d)[ 1] = ((uint32_t*)s)[ 1]; |
||||
((uint32_t*)d)[ 2] = ((uint32_t*)s)[ 2]; |
||||
((uint32_t*)d)[ 3] = ((uint32_t*)s)[ 3]; |
||||
#else |
||||
((uint8_t*)d)[ 0] = ((uint8_t*)s)[ 0]; |
||||
((uint8_t*)d)[ 1] = ((uint8_t*)s)[ 1]; |
||||
((uint8_t*)d)[ 2] = ((uint8_t*)s)[ 2]; |
||||
((uint8_t*)d)[ 3] = ((uint8_t*)s)[ 3]; |
||||
((uint8_t*)d)[ 4] = ((uint8_t*)s)[ 4]; |
||||
((uint8_t*)d)[ 5] = ((uint8_t*)s)[ 5]; |
||||
((uint8_t*)d)[ 6] = ((uint8_t*)s)[ 6]; |
||||
((uint8_t*)d)[ 7] = ((uint8_t*)s)[ 7]; |
||||
((uint8_t*)d)[ 8] = ((uint8_t*)s)[ 8]; |
||||
((uint8_t*)d)[ 9] = ((uint8_t*)s)[ 9]; |
||||
((uint8_t*)d)[10] = ((uint8_t*)s)[10]; |
||||
((uint8_t*)d)[11] = ((uint8_t*)s)[11]; |
||||
((uint8_t*)d)[12] = ((uint8_t*)s)[12]; |
||||
((uint8_t*)d)[13] = ((uint8_t*)s)[13]; |
||||
((uint8_t*)d)[14] = ((uint8_t*)s)[14]; |
||||
((uint8_t*)d)[15] = ((uint8_t*)s)[15]; |
||||
#endif |
||||
} |
||||
|
||||
static void copy_block_nn( uint8_t * d, const uint8_t *s, uint8_t nn ) |
||||
{ |
||||
while( nn-- ) |
||||
//*((uint8_t*)d)++ = *((uint8_t*)s)++;
|
||||
*d++ = *s++; |
||||
} |
||||
|
||||
static void xor_block( void *d, const void *s ) |
||||
{ |
||||
#if defined( HAVE_UINT_32T ) |
||||
((uint32_t*)d)[ 0] ^= ((uint32_t*)s)[ 0]; |
||||
((uint32_t*)d)[ 1] ^= ((uint32_t*)s)[ 1]; |
||||
((uint32_t*)d)[ 2] ^= ((uint32_t*)s)[ 2]; |
||||
((uint32_t*)d)[ 3] ^= ((uint32_t*)s)[ 3]; |
||||
#else |
||||
((uint8_t*)d)[ 0] ^= ((uint8_t*)s)[ 0]; |
||||
((uint8_t*)d)[ 1] ^= ((uint8_t*)s)[ 1]; |
||||
((uint8_t*)d)[ 2] ^= ((uint8_t*)s)[ 2]; |
||||
((uint8_t*)d)[ 3] ^= ((uint8_t*)s)[ 3]; |
||||
((uint8_t*)d)[ 4] ^= ((uint8_t*)s)[ 4]; |
||||
((uint8_t*)d)[ 5] ^= ((uint8_t*)s)[ 5]; |
||||
((uint8_t*)d)[ 6] ^= ((uint8_t*)s)[ 6]; |
||||
((uint8_t*)d)[ 7] ^= ((uint8_t*)s)[ 7]; |
||||
((uint8_t*)d)[ 8] ^= ((uint8_t*)s)[ 8]; |
||||
((uint8_t*)d)[ 9] ^= ((uint8_t*)s)[ 9]; |
||||
((uint8_t*)d)[10] ^= ((uint8_t*)s)[10]; |
||||
((uint8_t*)d)[11] ^= ((uint8_t*)s)[11]; |
||||
((uint8_t*)d)[12] ^= ((uint8_t*)s)[12]; |
||||
((uint8_t*)d)[13] ^= ((uint8_t*)s)[13]; |
||||
((uint8_t*)d)[14] ^= ((uint8_t*)s)[14]; |
||||
((uint8_t*)d)[15] ^= ((uint8_t*)s)[15]; |
||||
#endif |
||||
} |
||||
|
||||
static void copy_and_key( void *d, const void *s, const void *k ) |
||||
{ |
||||
#if defined( HAVE_UINT_32T ) |
||||
((uint32_t*)d)[ 0] = ((uint32_t*)s)[ 0] ^ ((uint32_t*)k)[ 0]; |
||||
((uint32_t*)d)[ 1] = ((uint32_t*)s)[ 1] ^ ((uint32_t*)k)[ 1]; |
||||
((uint32_t*)d)[ 2] = ((uint32_t*)s)[ 2] ^ ((uint32_t*)k)[ 2]; |
||||
((uint32_t*)d)[ 3] = ((uint32_t*)s)[ 3] ^ ((uint32_t*)k)[ 3]; |
||||
#elif 1 |
||||
((uint8_t*)d)[ 0] = ((uint8_t*)s)[ 0] ^ ((uint8_t*)k)[ 0]; |
||||
((uint8_t*)d)[ 1] = ((uint8_t*)s)[ 1] ^ ((uint8_t*)k)[ 1]; |
||||
((uint8_t*)d)[ 2] = ((uint8_t*)s)[ 2] ^ ((uint8_t*)k)[ 2]; |
||||
((uint8_t*)d)[ 3] = ((uint8_t*)s)[ 3] ^ ((uint8_t*)k)[ 3]; |
||||
((uint8_t*)d)[ 4] = ((uint8_t*)s)[ 4] ^ ((uint8_t*)k)[ 4]; |
||||
((uint8_t*)d)[ 5] = ((uint8_t*)s)[ 5] ^ ((uint8_t*)k)[ 5]; |
||||
((uint8_t*)d)[ 6] = ((uint8_t*)s)[ 6] ^ ((uint8_t*)k)[ 6]; |
||||
((uint8_t*)d)[ 7] = ((uint8_t*)s)[ 7] ^ ((uint8_t*)k)[ 7]; |
||||
((uint8_t*)d)[ 8] = ((uint8_t*)s)[ 8] ^ ((uint8_t*)k)[ 8]; |
||||
((uint8_t*)d)[ 9] = ((uint8_t*)s)[ 9] ^ ((uint8_t*)k)[ 9]; |
||||
((uint8_t*)d)[10] = ((uint8_t*)s)[10] ^ ((uint8_t*)k)[10]; |
||||
((uint8_t*)d)[11] = ((uint8_t*)s)[11] ^ ((uint8_t*)k)[11]; |
||||
((uint8_t*)d)[12] = ((uint8_t*)s)[12] ^ ((uint8_t*)k)[12]; |
||||
((uint8_t*)d)[13] = ((uint8_t*)s)[13] ^ ((uint8_t*)k)[13]; |
||||
((uint8_t*)d)[14] = ((uint8_t*)s)[14] ^ ((uint8_t*)k)[14]; |
||||
((uint8_t*)d)[15] = ((uint8_t*)s)[15] ^ ((uint8_t*)k)[15]; |
||||
#else |
||||
block_copy(d, s); |
||||
xor_block(d, k); |
||||
#endif |
||||
} |
||||
|
||||
static void add_round_key( uint8_t d[N_BLOCK], const uint8_t k[N_BLOCK] ) |
||||
{ |
||||
xor_block(d, k); |
||||
} |
||||
|
||||
static void shift_sub_rows( uint8_t st[N_BLOCK] ) |
||||
{ uint8_t tt; |
||||
|
||||
st[ 0] = s_box(st[ 0]); st[ 4] = s_box(st[ 4]); |
||||
st[ 8] = s_box(st[ 8]); st[12] = s_box(st[12]); |
||||
|
||||
tt = st[1]; st[ 1] = s_box(st[ 5]); st[ 5] = s_box(st[ 9]); |
||||
st[ 9] = s_box(st[13]); st[13] = s_box( tt ); |
||||
|
||||
tt = st[2]; st[ 2] = s_box(st[10]); st[10] = s_box( tt ); |
||||
tt = st[6]; st[ 6] = s_box(st[14]); st[14] = s_box( tt ); |
||||
|
||||
tt = st[15]; st[15] = s_box(st[11]); st[11] = s_box(st[ 7]); |
||||
st[ 7] = s_box(st[ 3]); st[ 3] = s_box( tt ); |
||||
} |
||||
|
||||
#if defined( AES_DEC_PREKEYED ) |
||||
|
||||
static void inv_shift_sub_rows( uint8_t st[N_BLOCK] ) |
||||
{ uint8_t tt; |
||||
|
||||
st[ 0] = is_box(st[ 0]); st[ 4] = is_box(st[ 4]); |
||||
st[ 8] = is_box(st[ 8]); st[12] = is_box(st[12]); |
||||
|
||||
tt = st[13]; st[13] = is_box(st[9]); st[ 9] = is_box(st[5]); |
||||
st[ 5] = is_box(st[1]); st[ 1] = is_box( tt ); |
||||
|
||||
tt = st[2]; st[ 2] = is_box(st[10]); st[10] = is_box( tt ); |
||||
tt = st[6]; st[ 6] = is_box(st[14]); st[14] = is_box( tt ); |
||||
|
||||
tt = st[3]; st[ 3] = is_box(st[ 7]); st[ 7] = is_box(st[11]); |
||||
st[11] = is_box(st[15]); st[15] = is_box( tt ); |
||||
} |
||||
|
||||
#endif |
||||
|
||||
#if defined( VERSION_1 ) |
||||
static void mix_sub_columns( uint8_t dt[N_BLOCK] ) |
||||
{ uint8_t st[N_BLOCK]; |
||||
block_copy(st, dt); |
||||
#else |
||||
static void mix_sub_columns( uint8_t dt[N_BLOCK], uint8_t st[N_BLOCK] ) |
||||
{ |
||||
#endif |
||||
dt[ 0] = gfm2_sb(st[0]) ^ gfm3_sb(st[5]) ^ s_box(st[10]) ^ s_box(st[15]); |
||||
dt[ 1] = s_box(st[0]) ^ gfm2_sb(st[5]) ^ gfm3_sb(st[10]) ^ s_box(st[15]); |
||||
dt[ 2] = s_box(st[0]) ^ s_box(st[5]) ^ gfm2_sb(st[10]) ^ gfm3_sb(st[15]); |
||||
dt[ 3] = gfm3_sb(st[0]) ^ s_box(st[5]) ^ s_box(st[10]) ^ gfm2_sb(st[15]); |
||||
|
||||
dt[ 4] = gfm2_sb(st[4]) ^ gfm3_sb(st[9]) ^ s_box(st[14]) ^ s_box(st[3]); |
||||
dt[ 5] = s_box(st[4]) ^ gfm2_sb(st[9]) ^ gfm3_sb(st[14]) ^ s_box(st[3]); |
||||
dt[ 6] = s_box(st[4]) ^ s_box(st[9]) ^ gfm2_sb(st[14]) ^ gfm3_sb(st[3]); |
||||
dt[ 7] = gfm3_sb(st[4]) ^ s_box(st[9]) ^ s_box(st[14]) ^ gfm2_sb(st[3]); |
||||
|
||||
dt[ 8] = gfm2_sb(st[8]) ^ gfm3_sb(st[13]) ^ s_box(st[2]) ^ s_box(st[7]); |
||||
dt[ 9] = s_box(st[8]) ^ gfm2_sb(st[13]) ^ gfm3_sb(st[2]) ^ s_box(st[7]); |
||||
dt[10] = s_box(st[8]) ^ s_box(st[13]) ^ gfm2_sb(st[2]) ^ gfm3_sb(st[7]); |
||||
dt[11] = gfm3_sb(st[8]) ^ s_box(st[13]) ^ s_box(st[2]) ^ gfm2_sb(st[7]); |
||||
|
||||
dt[12] = gfm2_sb(st[12]) ^ gfm3_sb(st[1]) ^ s_box(st[6]) ^ s_box(st[11]); |
||||
dt[13] = s_box(st[12]) ^ gfm2_sb(st[1]) ^ gfm3_sb(st[6]) ^ s_box(st[11]); |
||||
dt[14] = s_box(st[12]) ^ s_box(st[1]) ^ gfm2_sb(st[6]) ^ gfm3_sb(st[11]); |
||||
dt[15] = gfm3_sb(st[12]) ^ s_box(st[1]) ^ s_box(st[6]) ^ gfm2_sb(st[11]); |
||||
} |
||||
|
||||
#if defined( AES_DEC_PREKEYED ) |
||||
|
||||
#if defined( VERSION_1 ) |
||||
static void inv_mix_sub_columns( uint8_t dt[N_BLOCK] ) |
||||
{ uint8_t st[N_BLOCK]; |
||||
block_copy(st, dt); |
||||
#else |
||||
static void inv_mix_sub_columns( uint8_t dt[N_BLOCK], uint8_t st[N_BLOCK] ) |
||||
{ |
||||
#endif |
||||
dt[ 0] = is_box(gfm_e(st[ 0]) ^ gfm_b(st[ 1]) ^ gfm_d(st[ 2]) ^ gfm_9(st[ 3])); |
||||
dt[ 5] = is_box(gfm_9(st[ 0]) ^ gfm_e(st[ 1]) ^ gfm_b(st[ 2]) ^ gfm_d(st[ 3])); |
||||
dt[10] = is_box(gfm_d(st[ 0]) ^ gfm_9(st[ 1]) ^ gfm_e(st[ 2]) ^ gfm_b(st[ 3])); |
||||
dt[15] = is_box(gfm_b(st[ 0]) ^ gfm_d(st[ 1]) ^ gfm_9(st[ 2]) ^ gfm_e(st[ 3])); |
||||
|
||||
dt[ 4] = is_box(gfm_e(st[ 4]) ^ gfm_b(st[ 5]) ^ gfm_d(st[ 6]) ^ gfm_9(st[ 7])); |
||||
dt[ 9] = is_box(gfm_9(st[ 4]) ^ gfm_e(st[ 5]) ^ gfm_b(st[ 6]) ^ gfm_d(st[ 7])); |
||||
dt[14] = is_box(gfm_d(st[ 4]) ^ gfm_9(st[ 5]) ^ gfm_e(st[ 6]) ^ gfm_b(st[ 7])); |
||||
dt[ 3] = is_box(gfm_b(st[ 4]) ^ gfm_d(st[ 5]) ^ gfm_9(st[ 6]) ^ gfm_e(st[ 7])); |
||||
|
||||
dt[ 8] = is_box(gfm_e(st[ 8]) ^ gfm_b(st[ 9]) ^ gfm_d(st[10]) ^ gfm_9(st[11])); |
||||
dt[13] = is_box(gfm_9(st[ 8]) ^ gfm_e(st[ 9]) ^ gfm_b(st[10]) ^ gfm_d(st[11])); |
||||
dt[ 2] = is_box(gfm_d(st[ 8]) ^ gfm_9(st[ 9]) ^ gfm_e(st[10]) ^ gfm_b(st[11])); |
||||
dt[ 7] = is_box(gfm_b(st[ 8]) ^ gfm_d(st[ 9]) ^ gfm_9(st[10]) ^ gfm_e(st[11])); |
||||
|
||||
dt[12] = is_box(gfm_e(st[12]) ^ gfm_b(st[13]) ^ gfm_d(st[14]) ^ gfm_9(st[15])); |
||||
dt[ 1] = is_box(gfm_9(st[12]) ^ gfm_e(st[13]) ^ gfm_b(st[14]) ^ gfm_d(st[15])); |
||||
dt[ 6] = is_box(gfm_d(st[12]) ^ gfm_9(st[13]) ^ gfm_e(st[14]) ^ gfm_b(st[15])); |
||||
dt[11] = is_box(gfm_b(st[12]) ^ gfm_d(st[13]) ^ gfm_9(st[14]) ^ gfm_e(st[15])); |
||||
} |
||||
|
||||
#endif |
||||
|
||||
#if defined( AES_ENC_PREKEYED ) || defined( AES_DEC_PREKEYED ) |
||||
|
||||
/* Set the cipher key for the pre-keyed version */ |
||||
|
||||
return_type aes_set_key( const uint8_t key[], length_type keylen, aes_context ctx[1] ) |
||||
{ |
||||
uint8_t cc, rc, hi; |
||||
|
||||
switch( keylen ) |
||||
{ |
||||
case 16: |
||||
case 24: |
||||
case 32: |
||||
break; |
||||
default: |
||||
ctx->rnd = 0; |
||||
return ( uint8_t )-1; |
||||
} |
||||
block_copy_nn(ctx->ksch, key, keylen); |
||||
hi = (keylen + 28) << 2; |
||||
ctx->rnd = (hi >> 4) - 1; |
||||
for( cc = keylen, rc = 1; cc < hi; cc += 4 ) |
||||
{ uint8_t tt, t0, t1, t2, t3; |
||||
|
||||
t0 = ctx->ksch[cc - 4]; |
||||
t1 = ctx->ksch[cc - 3]; |
||||
t2 = ctx->ksch[cc - 2]; |
||||
t3 = ctx->ksch[cc - 1]; |
||||
if( cc % keylen == 0 ) |
||||
{ |
||||
tt = t0; |
||||
t0 = s_box(t1) ^ rc; |
||||
t1 = s_box(t2); |
||||
t2 = s_box(t3); |
||||
t3 = s_box(tt); |
||||
rc = f2(rc); |
||||
} |
||||
else if( keylen > 24 && cc % keylen == 16 ) |
||||
{ |
||||
t0 = s_box(t0); |
||||
t1 = s_box(t1); |
||||
t2 = s_box(t2); |
||||
t3 = s_box(t3); |
||||
} |
||||
tt = cc - keylen; |
||||
ctx->ksch[cc + 0] = ctx->ksch[tt + 0] ^ t0; |
||||
ctx->ksch[cc + 1] = ctx->ksch[tt + 1] ^ t1; |
||||
ctx->ksch[cc + 2] = ctx->ksch[tt + 2] ^ t2; |
||||
ctx->ksch[cc + 3] = ctx->ksch[tt + 3] ^ t3; |
||||
} |
||||
return 0; |
||||
} |
||||
|
||||
#endif |
||||
|
||||
#if defined( AES_ENC_PREKEYED ) |
||||
|
||||
/* Encrypt a single block of 16 bytes */ |
||||
|
||||
return_type aes_encrypt( const uint8_t in[N_BLOCK], uint8_t out[N_BLOCK], const aes_context ctx[1] ) |
||||
{ |
||||
if( ctx->rnd ) |
||||
{ |
||||
uint8_t s1[N_BLOCK], r; |
||||
copy_and_key( s1, in, ctx->ksch ); |
||||
|
||||
for( r = 1 ; r < ctx->rnd ; ++r ) |
||||
#if defined( VERSION_1 ) |
||||
{ |
||||
mix_sub_columns( s1 ); |
||||
add_round_key( s1, ctx->ksch + r * N_BLOCK); |
||||
} |
||||
#else |
||||
{ uint8_t s2[N_BLOCK]; |
||||
mix_sub_columns( s2, s1 ); |
||||
copy_and_key( s1, s2, ctx->ksch + r * N_BLOCK); |
||||
} |
||||
#endif |
||||
shift_sub_rows( s1 ); |
||||
copy_and_key( out, s1, ctx->ksch + r * N_BLOCK ); |
||||
} |
||||
else |
||||
return ( uint8_t )-1; |
||||
return 0; |
||||
} |
||||
|
||||
/* CBC encrypt a number of blocks (input and return an IV) */ |
||||
|
||||
return_type aes_cbc_encrypt( const uint8_t *in, uint8_t *out, |
||||
int32_t n_block, uint8_t iv[N_BLOCK], const aes_context ctx[1] ) |
||||
{ |
||||
|
||||
while(n_block--) |
||||
{ |
||||
xor_block(iv, in); |
||||
if(aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS) |
||||
return EXIT_FAILURE; |
||||
//memcpy(out, iv, N_BLOCK);
|
||||
block_copy(out, iv); |
||||
in += N_BLOCK; |
||||
out += N_BLOCK; |
||||
} |
||||
return EXIT_SUCCESS; |
||||
} |
||||
|
||||
#endif |
||||
|
||||
#if defined( AES_DEC_PREKEYED ) |
||||
|
||||
/* Decrypt a single block of 16 bytes */ |
||||
|
||||
return_type aes_decrypt( const uint8_t in[N_BLOCK], uint8_t out[N_BLOCK], const aes_context ctx[1] ) |
||||
{ |
||||
if( ctx->rnd ) |
||||
{ |
||||
uint8_t s1[N_BLOCK], r; |
||||
copy_and_key( s1, in, ctx->ksch + ctx->rnd * N_BLOCK ); |
||||
inv_shift_sub_rows( s1 ); |
||||
|
||||
for( r = ctx->rnd ; --r ; ) |
||||
#if defined( VERSION_1 ) |
||||
{ |
||||
add_round_key( s1, ctx->ksch + r * N_BLOCK ); |
||||
inv_mix_sub_columns( s1 ); |
||||
} |
||||
#else |
||||
{ uint8_t s2[N_BLOCK]; |
||||
copy_and_key( s2, s1, ctx->ksch + r * N_BLOCK ); |
||||
inv_mix_sub_columns( s1, s2 ); |
||||
} |
||||
#endif |
||||
copy_and_key( out, s1, ctx->ksch ); |
||||
} |
||||
else |
||||
return -1; |
||||
return 0; |
||||
} |
||||
|
||||
/* CBC decrypt a number of blocks (input and return an IV) */ |
||||
|
||||
return_type aes_cbc_decrypt( const uint8_t *in, uint8_t *out, |
||||
int32_t n_block, uint8_t iv[N_BLOCK], const aes_context ctx[1] ) |
||||
{ |
||||
while(n_block--) |
||||
{ uint8_t tmp[N_BLOCK]; |
||||
|
||||
//memcpy(tmp, in, N_BLOCK);
|
||||
block_copy(tmp, in); |
||||
if(aes_decrypt(in, out, ctx) != EXIT_SUCCESS) |
||||
return EXIT_FAILURE; |
||||
xor_block(out, iv); |
||||
//memcpy(iv, tmp, N_BLOCK);
|
||||
block_copy(iv, tmp); |
||||
in += N_BLOCK; |
||||
out += N_BLOCK; |
||||
} |
||||
return EXIT_SUCCESS; |
||||
} |
||||
|
||||
#endif |
||||
|
||||
#if defined( AES_ENC_128_OTFK ) |
||||
|
||||
/* The 'on the fly' encryption key update for for 128 bit keys */ |
||||
|
||||
static void update_encrypt_key_128( uint8_t k[N_BLOCK], uint8_t *rc ) |
||||
{ uint8_t cc; |
||||
|
||||
k[0] ^= s_box(k[13]) ^ *rc; |
||||
k[1] ^= s_box(k[14]); |
||||
k[2] ^= s_box(k[15]); |
||||
k[3] ^= s_box(k[12]); |
||||
*rc = f2( *rc ); |
||||
|
||||
for(cc = 4; cc < 16; cc += 4 ) |
||||
{ |
||||
k[cc + 0] ^= k[cc - 4]; |
||||
k[cc + 1] ^= k[cc - 3]; |
||||
k[cc + 2] ^= k[cc - 2]; |
||||
k[cc + 3] ^= k[cc - 1]; |
||||
} |
||||
} |
||||
|
||||
/* Encrypt a single block of 16 bytes with 'on the fly' 128 bit keying */ |
||||
|
||||
void aes_encrypt_128( const uint8_t in[N_BLOCK], uint8_t out[N_BLOCK], |
||||
const uint8_t key[N_BLOCK], uint8_t o_key[N_BLOCK] ) |
||||
{ uint8_t s1[N_BLOCK], r, rc = 1; |
||||
|
||||
if(o_key != key) |
||||
block_copy( o_key, key ); |
||||
copy_and_key( s1, in, o_key ); |
||||
|
||||
for( r = 1 ; r < 10 ; ++r ) |
||||
#if defined( VERSION_1 ) |
||||
{ |
||||
mix_sub_columns( s1 ); |
||||
update_encrypt_key_128( o_key, &rc ); |
||||
add_round_key( s1, o_key ); |
||||
} |
||||
#else |
||||
{ uint8_t s2[N_BLOCK]; |
||||
mix_sub_columns( s2, s1 ); |
||||
update_encrypt_key_128( o_key, &rc ); |
||||
copy_and_key( s1, s2, o_key ); |
||||
} |
||||
#endif |
||||
|
||||
shift_sub_rows( s1 ); |
||||
update_encrypt_key_128( o_key, &rc ); |
||||
copy_and_key( out, s1, o_key ); |
||||
} |
||||
|
||||
#endif |
||||
|
||||
#if defined( AES_DEC_128_OTFK ) |
||||
|
||||
/* The 'on the fly' decryption key update for for 128 bit keys */ |
||||
|
||||
static void update_decrypt_key_128( uint8_t k[N_BLOCK], uint8_t *rc ) |
||||
{ uint8_t cc; |
||||
|
||||
for( cc = 12; cc > 0; cc -= 4 ) |
||||
{ |
||||
k[cc + 0] ^= k[cc - 4]; |
||||
k[cc + 1] ^= k[cc - 3]; |
||||
k[cc + 2] ^= k[cc - 2]; |
||||
k[cc + 3] ^= k[cc - 1]; |
||||
} |
||||
*rc = d2(*rc); |
||||
k[0] ^= s_box(k[13]) ^ *rc; |
||||
k[1] ^= s_box(k[14]); |
||||
k[2] ^= s_box(k[15]); |
||||
k[3] ^= s_box(k[12]); |
||||
} |
||||
|
||||
/* Decrypt a single block of 16 bytes with 'on the fly' 128 bit keying */ |
||||
|
||||
void aes_decrypt_128( const uint8_t in[N_BLOCK], uint8_t out[N_BLOCK], |
||||
const uint8_t key[N_BLOCK], uint8_t o_key[N_BLOCK] ) |
||||
{ |
||||
uint8_t s1[N_BLOCK], r, rc = 0x6c; |
||||
if(o_key != key) |
||||
block_copy( o_key, key ); |
||||
|
||||
copy_and_key( s1, in, o_key ); |
||||
inv_shift_sub_rows( s1 ); |
||||
|
||||
for( r = 10 ; --r ; ) |
||||
#if defined( VERSION_1 ) |
||||
{ |
||||
update_decrypt_key_128( o_key, &rc ); |
||||
add_round_key( s1, o_key ); |
||||
inv_mix_sub_columns( s1 ); |
||||
} |
||||
#else |
||||
{ uint8_t s2[N_BLOCK]; |
||||
update_decrypt_key_128( o_key, &rc ); |
||||
copy_and_key( s2, s1, o_key ); |
||||
inv_mix_sub_columns( s1, s2 ); |
||||
} |
||||
#endif |
||||
update_decrypt_key_128( o_key, &rc ); |
||||
copy_and_key( out, s1, o_key ); |
||||
} |
||||
|
||||
#endif |
||||
|
||||
#if defined( AES_ENC_256_OTFK ) |
||||
|
||||
/* The 'on the fly' encryption key update for for 256 bit keys */ |
||||
|
||||
static void update_encrypt_key_256( uint8_t k[2 * N_BLOCK], uint8_t *rc ) |
||||
{ uint8_t cc; |
||||
|
||||
k[0] ^= s_box(k[29]) ^ *rc; |
||||
k[1] ^= s_box(k[30]); |
||||
k[2] ^= s_box(k[31]); |
||||
k[3] ^= s_box(k[28]); |
||||
*rc = f2( *rc ); |
||||
|
||||
for(cc = 4; cc < 16; cc += 4) |
||||
{ |
||||
k[cc + 0] ^= k[cc - 4]; |
||||
k[cc + 1] ^= k[cc - 3]; |
||||
k[cc + 2] ^= k[cc - 2]; |
||||
k[cc + 3] ^= k[cc - 1]; |
||||
} |
||||
|
||||
k[16] ^= s_box(k[12]); |
||||
k[17] ^= s_box(k[13]); |
||||
k[18] ^= s_box(k[14]); |
||||
k[19] ^= s_box(k[15]); |
||||
|
||||
for( cc = 20; cc < 32; cc += 4 ) |
||||
{ |
||||
k[cc + 0] ^= k[cc - 4]; |
||||
k[cc + 1] ^= k[cc - 3]; |
||||
k[cc + 2] ^= k[cc - 2]; |
||||
k[cc + 3] ^= k[cc - 1]; |
||||
} |
||||
} |
||||
|
||||
/* Encrypt a single block of 16 bytes with 'on the fly' 256 bit keying */ |
||||
|
||||
void aes_encrypt_256( const uint8_t in[N_BLOCK], uint8_t out[N_BLOCK], |
||||
const uint8_t key[2 * N_BLOCK], uint8_t o_key[2 * N_BLOCK] ) |
||||
{ |
||||
uint8_t s1[N_BLOCK], r, rc = 1; |
||||
if(o_key != key) |
||||
{ |
||||
block_copy( o_key, key ); |
||||
block_copy( o_key + 16, key + 16 ); |
||||
} |
||||
copy_and_key( s1, in, o_key ); |
||||
|
||||
for( r = 1 ; r < 14 ; ++r ) |
||||
#if defined( VERSION_1 ) |
||||
{ |
||||
mix_sub_columns(s1); |
||||
if( r & 1 ) |
||||
add_round_key( s1, o_key + 16 ); |
||||
else |
||||
{ |
||||
update_encrypt_key_256( o_key, &rc ); |
||||
add_round_key( s1, o_key ); |
||||
} |
||||
} |
||||
#else |
||||
{ uint8_t s2[N_BLOCK]; |
||||
mix_sub_columns( s2, s1 ); |
||||
if( r & 1 ) |
||||
copy_and_key( s1, s2, o_key + 16 ); |
||||
else |
||||
{ |
||||
update_encrypt_key_256( o_key, &rc ); |
||||
copy_and_key( s1, s2, o_key ); |
||||
} |
||||
} |
||||
#endif |
||||
|
||||
shift_sub_rows( s1 ); |
||||
update_encrypt_key_256( o_key, &rc ); |
||||
copy_and_key( out, s1, o_key ); |
||||
} |
||||
|
||||
#endif |
||||
|
||||
#if defined( AES_DEC_256_OTFK ) |
||||
|
||||
/* The 'on the fly' encryption key update for for 256 bit keys */ |
||||
|
||||
static void update_decrypt_key_256( uint8_t k[2 * N_BLOCK], uint8_t *rc ) |
||||
{ uint8_t cc; |
||||
|
||||
for(cc = 28; cc > 16; cc -= 4) |
||||
{ |
||||
k[cc + 0] ^= k[cc - 4]; |
||||
k[cc + 1] ^= k[cc - 3]; |
||||
k[cc + 2] ^= k[cc - 2]; |
||||
k[cc + 3] ^= k[cc - 1]; |
||||
} |
||||
|
||||
k[16] ^= s_box(k[12]); |
||||
k[17] ^= s_box(k[13]); |
||||
k[18] ^= s_box(k[14]); |
||||
k[19] ^= s_box(k[15]); |
||||
|
||||
for(cc = 12; cc > 0; cc -= 4) |
||||
{ |
||||
k[cc + 0] ^= k[cc - 4]; |
||||
k[cc + 1] ^= k[cc - 3]; |
||||
k[cc + 2] ^= k[cc - 2]; |
||||
k[cc + 3] ^= k[cc - 1]; |
||||
} |
||||
|
||||
*rc = d2(*rc); |
||||
k[0] ^= s_box(k[29]) ^ *rc; |
||||
k[1] ^= s_box(k[30]); |
||||
k[2] ^= s_box(k[31]); |
||||
k[3] ^= s_box(k[28]); |
||||
} |
||||
|
||||
/* Decrypt a single block of 16 bytes with 'on the fly'
|
||||
256 bit keying |
||||
*/ |
||||
void aes_decrypt_256( const uint8_t in[N_BLOCK], uint8_t out[N_BLOCK], |
||||
const uint8_t key[2 * N_BLOCK], uint8_t o_key[2 * N_BLOCK] ) |
||||
{ |
||||
uint8_t s1[N_BLOCK], r, rc = 0x80; |
||||
|
||||
if(o_key != key) |
||||
{ |
||||
block_copy( o_key, key ); |
||||
block_copy( o_key + 16, key + 16 ); |
||||
} |
||||
|
||||
copy_and_key( s1, in, o_key ); |
||||
inv_shift_sub_rows( s1 ); |
||||
|
||||
for( r = 14 ; --r ; ) |
||||
#if defined( VERSION_1 ) |
||||
{ |
||||
if( ( r & 1 ) ) |
||||
{ |
||||
update_decrypt_key_256( o_key, &rc ); |
||||
add_round_key( s1, o_key + 16 ); |
||||
} |
||||
else |
||||
add_round_key( s1, o_key ); |
||||
inv_mix_sub_columns( s1 ); |
||||
} |
||||
#else |
||||
{ uint8_t s2[N_BLOCK]; |
||||
if( ( r & 1 ) ) |
||||
{ |
||||
update_decrypt_key_256( o_key, &rc ); |
||||
copy_and_key( s2, s1, o_key + 16 ); |
||||
} |
||||
else |
||||
copy_and_key( s2, s1, o_key ); |
||||
inv_mix_sub_columns( s1, s2 ); |
||||
} |
||||
#endif |
||||
copy_and_key( out, s1, o_key ); |
||||
} |
||||
|
||||
#endif |
@ -0,0 +1,160 @@ |
||||
/*
|
||||
--------------------------------------------------------------------------- |
||||
Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved. |
||||
|
||||
LICENSE TERMS |
||||
|
||||
The redistribution and use of this software (with or without changes) |
||||
is allowed without the payment of fees or royalties provided that: |
||||
|
||||
1. source code distributions include the above copyright notice, this |
||||
list of conditions and the following disclaimer; |
||||
|
||||
2. binary distributions include the above copyright notice, this list |
||||
of conditions and the following disclaimer in their documentation; |
||||
|
||||
3. the name of the copyright holder is not used to endorse products |
||||
built using this software without specific written permission. |
||||
|
||||
DISCLAIMER |
||||
|
||||
This software is provided 'as is' with no explicit or implied warranties |
||||
in respect of its properties, including, but not limited to, correctness |
||||
and/or fitness for purpose. |
||||
--------------------------------------------------------------------------- |
||||
Issue 09/09/2006 |
||||
|
||||
This is an AES implementation that uses only 8-bit byte operations on the |
||||
cipher state. |
||||
*/ |
||||
|
||||
#ifndef AES_H |
||||
#define AES_H |
||||
|
||||
#if 1 |
||||
# define AES_ENC_PREKEYED /* AES encryption with a precomputed key schedule */ |
||||
#endif |
||||
#if 0 |
||||
# define AES_DEC_PREKEYED /* AES decryption with a precomputed key schedule */ |
||||
#endif |
||||
#if 0 |
||||
# define AES_ENC_128_OTFK /* AES encryption with 'on the fly' 128 bit keying */ |
||||
#endif |
||||
#if 0 |
||||
# define AES_DEC_128_OTFK /* AES decryption with 'on the fly' 128 bit keying */ |
||||
#endif |
||||
#if 0 |
||||
# define AES_ENC_256_OTFK /* AES encryption with 'on the fly' 256 bit keying */ |
||||
#endif |
||||
#if 0 |
||||
# define AES_DEC_256_OTFK /* AES decryption with 'on the fly' 256 bit keying */ |
||||
#endif |
||||
|
||||
#define N_ROW 4 |
||||
#define N_COL 4 |
||||
#define N_BLOCK (N_ROW * N_COL) |
||||
#define N_MAX_ROUNDS 14 |
||||
|
||||
typedef uint8_t return_type; |
||||
|
||||
/* Warning: The key length for 256 bit keys overflows a byte
|
||||
(see comment below) |
||||
*/ |
||||
|
||||
typedef uint8_t length_type; |
||||
|
||||
typedef struct |
||||
{ uint8_t ksch[(N_MAX_ROUNDS + 1) * N_BLOCK]; |
||||
uint8_t rnd; |
||||
} aes_context; |
||||
|
||||
/* The following calls are for a precomputed key schedule
|
||||
|
||||
NOTE: If the length_type used for the key length is an |
||||
unsigned 8-bit character, a key length of 256 bits must |
||||
be entered as a length in bytes (valid inputs are hence |
||||
128, 192, 16, 24 and 32). |
||||
*/ |
||||
|
||||
#if defined( AES_ENC_PREKEYED ) || defined( AES_DEC_PREKEYED ) |
||||
|
||||
return_type aes_set_key( const uint8_t key[], |
||||
length_type keylen, |
||||
aes_context ctx[1] ); |
||||
#endif |
||||
|
||||
#if defined( AES_ENC_PREKEYED ) |
||||
|
||||
return_type aes_encrypt( const uint8_t in[N_BLOCK], |
||||
uint8_t out[N_BLOCK], |
||||
const aes_context ctx[1] ); |
||||
|
||||
return_type aes_cbc_encrypt( const uint8_t *in, |
||||
uint8_t *out, |
||||
int32_t n_block, |
||||
uint8_t iv[N_BLOCK], |
||||
const aes_context ctx[1] ); |
||||
#endif |
||||
|
||||
#if defined( AES_DEC_PREKEYED ) |
||||
|
||||
return_type aes_decrypt( const uint8_t in[N_BLOCK], |
||||
uint8_t out[N_BLOCK], |
||||
const aes_context ctx[1] ); |
||||
|
||||
return_type aes_cbc_decrypt( const uint8_t *in, |
||||
uint8_t *out, |
||||
int32_t n_block, |
||||
uint8_t iv[N_BLOCK], |
||||
const aes_context ctx[1] ); |
||||
#endif |
||||
|
||||
/* The following calls are for 'on the fly' keying. In this case the
|
||||
encryption and decryption keys are different. |
||||
|
||||
The encryption subroutines take a key in an array of bytes in |
||||
key[L] where L is 16, 24 or 32 bytes for key lengths of 128, |
||||
192, and 256 bits respectively. They then encrypts the input |
||||
data, in[] with this key and put the reult in the output array |
||||
out[]. In addition, the second key array, o_key[L], is used |
||||
to output the key that is needed by the decryption subroutine |
||||
to reverse the encryption operation. The two key arrays can |
||||
be the same array but in this case the original key will be |
||||
overwritten. |
||||
|
||||
In the same way, the decryption subroutines output keys that |
||||
can be used to reverse their effect when used for encryption. |
||||
|
||||
Only 128 and 256 bit keys are supported in these 'on the fly' |
||||
modes. |
||||
*/ |
||||
|
||||
#if defined( AES_ENC_128_OTFK ) |
||||
void aes_encrypt_128( const uint8_t in[N_BLOCK], |
||||
uint8_t out[N_BLOCK], |
||||
const uint8_t key[N_BLOCK], |
||||
uint8_t o_key[N_BLOCK] ); |
||||
#endif |
||||
|
||||
#if defined( AES_DEC_128_OTFK ) |
||||
void aes_decrypt_128( const uint8_t in[N_BLOCK], |
||||
uint8_t out[N_BLOCK], |
||||
const uint8_t key[N_BLOCK], |
||||
uint8_t o_key[N_BLOCK] ); |
||||
#endif |
||||
|
||||
#if defined( AES_ENC_256_OTFK ) |
||||
void aes_encrypt_256( const uint8_t in[N_BLOCK], |
||||
uint8_t out[N_BLOCK], |
||||
const uint8_t key[2 * N_BLOCK], |
||||
uint8_t o_key[2 * N_BLOCK] ); |
||||
#endif |
||||
|
||||
#if defined( AES_DEC_256_OTFK ) |
||||
void aes_decrypt_256( const uint8_t in[N_BLOCK], |
||||
uint8_t out[N_BLOCK], |
||||
const uint8_t key[2 * N_BLOCK], |
||||
uint8_t o_key[2 * N_BLOCK] ); |
||||
#endif |
||||
|
||||
#endif |
@ -0,0 +1,153 @@ |
||||
/**************************************************************************
|
||||
Copyright (C) 2009 Lander Casado, Philippas Tsigas |
||||
|
||||
All rights reserved. |
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining |
||||
a copy of this software and associated documentation files
|
||||
(the "Software"), to deal with the Software without restriction, including |
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to |
||||
permit persons to whom the Software is furnished to do so, subject to |
||||
the following conditions:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimers. Redistributions in |
||||
binary form must reproduce the above copyright notice, this list of |
||||
conditions and the following disclaimers in the documentation and/or
|
||||
other materials provided with the distribution. |
||||
|
||||
In no event shall the authors or copyright holders be liable for any special, |
||||
incidental, indirect or consequential damages of any kind, or any damages
|
||||
whatsoever resulting from loss of use, data or profits, whether or not
|
||||
advised of the possibility of damage, and on any theory of liability,
|
||||
arising out of or in connection with the use or performance of this software. |
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
||||
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||
CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS WITH THE SOFTWARE |
||||
|
||||
*****************************************************************************/ |
||||
//#include <sys/param.h>
|
||||
//#include <sys/systm.h>
|
||||
#include <stdint.h> |
||||
#include "aes.h" |
||||
#include "cmac.h" |
||||
#include "utilities.h" |
||||
|
||||
#define LSHIFT(v, r) do { \ |
||||
int32_t i; \
|
||||
for (i = 0; i < 15; i++) \
|
||||
(r)[i] = (v)[i] << 1 | (v)[i + 1] >> 7; \
|
||||
(r)[15] = (v)[15] << 1; \
|
||||
} while (0) |
||||
|
||||
#define XOR(v, r) do { \ |
||||
int32_t i; \
|
||||
for (i = 0; i < 16; i++) \
|
||||
{ \
|
||||
(r)[i] = (r)[i] ^ (v)[i]; \
|
||||
} \
|
||||
} while (0) \
|
||||
|
||||
|
||||
void AES_CMAC_Init(AES_CMAC_CTX *ctx) |
||||
{ |
||||
memset1(ctx->X, 0, sizeof ctx->X); |
||||
ctx->M_n = 0; |
||||
memset1(ctx->rijndael.ksch, '\0', 240); |
||||
} |
||||
|
||||
void AES_CMAC_SetKey(AES_CMAC_CTX *ctx, const uint8_t key[AES_CMAC_KEY_LENGTH]) |
||||
{ |
||||
//rijndael_set_key_enc_only(&ctx->rijndael, key, 128);
|
||||
aes_set_key( key, AES_CMAC_KEY_LENGTH, &ctx->rijndael); |
||||
} |
||||
|
||||
void AES_CMAC_Update(AES_CMAC_CTX *ctx, const uint8_t *data, uint32_t len) |
||||
{ |
||||
uint32_t mlen; |
||||
uint8_t in[16]; |
||||
|
||||
if (ctx->M_n > 0) { |
||||
mlen = MIN(16 - ctx->M_n, len); |
||||
memcpy1(ctx->M_last + ctx->M_n, data, mlen); |
||||
ctx->M_n += mlen; |
||||
if (ctx->M_n < 16 || len == mlen) |
||||
return; |
||||
XOR(ctx->M_last, ctx->X); |
||||
//rijndael_encrypt(&ctx->rijndael, ctx->X, ctx->X);
|
||||
aes_encrypt( ctx->X, ctx->X, &ctx->rijndael); |
||||
data += mlen; |
||||
len -= mlen; |
||||
} |
||||
while (len > 16) { /* not last block */ |
||||
|
||||
XOR(data, ctx->X); |
||||
//rijndael_encrypt(&ctx->rijndael, ctx->X, ctx->X);
|
||||
|
||||
memcpy1(in, &ctx->X[0], 16); //Bestela ez du ondo iten
|
||||
aes_encrypt( in, in, &ctx->rijndael); |
||||
memcpy1(&ctx->X[0], in, 16); |
||||
|
||||
data += 16; |
||||
len -= 16; |
||||
} |
||||
/* potential last block, save it */ |
||||
memcpy1(ctx->M_last, data, len); |
||||
ctx->M_n = len; |
||||
} |
||||
|
||||
void AES_CMAC_Final(uint8_t digest[AES_CMAC_DIGEST_LENGTH], AES_CMAC_CTX *ctx) |
||||
{ |
||||
uint8_t K[16]; |
||||
uint8_t in[16]; |
||||
/* generate subkey K1 */ |
||||
memset1(K, '\0', 16); |
||||
|
||||
//rijndael_encrypt(&ctx->rijndael, K, K);
|
||||
|
||||
aes_encrypt( K, K, &ctx->rijndael); |
||||
|
||||
if (K[0] & 0x80) { |
||||
LSHIFT(K, K); |
||||
K[15] ^= 0x87; |
||||
} else |
||||
LSHIFT(K, K); |
||||
|
||||
|
||||
if (ctx->M_n == 16) { |
||||
/* last block was a complete block */ |
||||
XOR(K, ctx->M_last); |
||||
|
||||
} else { |
||||
/* generate subkey K2 */ |
||||
if (K[0] & 0x80) { |
||||
LSHIFT(K, K); |
||||
K[15] ^= 0x87; |
||||
} else |
||||
LSHIFT(K, K); |
||||
|
||||
/* padding(M_last) */ |
||||
ctx->M_last[ctx->M_n] = 0x80; |
||||
while (++ctx->M_n < 16) |
||||
ctx->M_last[ctx->M_n] = 0; |
||||
|
||||
XOR(K, ctx->M_last); |
||||
|
||||
|
||||
} |
||||
XOR(ctx->M_last, ctx->X); |
||||
|
||||
//rijndael_encrypt(&ctx->rijndael, ctx->X, digest);
|
||||
|
||||
memcpy1(in, &ctx->X[0], 16); //Bestela ez du ondo iten
|
||||
aes_encrypt(in, digest, &ctx->rijndael); |
||||
memset1(K, 0, sizeof K); |
||||
|
||||
} |
||||
|
@ -0,0 +1,63 @@ |
||||
/**************************************************************************
|
||||
Copyright (C) 2009 Lander Casado, Philippas Tsigas |
||||
|
||||
All rights reserved. |
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining |
||||
a copy of this software and associated documentation files
|
||||
(the "Software"), to deal with the Software without restriction, including |
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to |
||||
permit persons to whom the Software is furnished to do so, subject to |
||||
the following conditions:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimers. Redistributions in |
||||
binary form must reproduce the above copyright notice, this list of |
||||
conditions and the following disclaimers in the documentation and/or
|
||||
other materials provided with the distribution. |
||||
|
||||
In no event shall the authors or copyright holders be liable for any special, |
||||
incidental, indirect or consequential damages of any kind, or any damages
|
||||
whatsoever resulting from loss of use, data or profits, whether or not
|
||||
advised of the possibility of damage, and on any theory of liability,
|
||||
arising out of or in connection with the use or performance of this software. |
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
||||
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||
CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS WITH THE SOFTWARE |
||||
|
||||
*****************************************************************************/ |
||||
|
||||
#ifndef _CMAC_H_ |
||||
#define _CMAC_H_ |
||||
|
||||
#include "aes.h" |
||||
|
||||
#define AES_CMAC_KEY_LENGTH 16 |
||||
#define AES_CMAC_DIGEST_LENGTH 16 |
||||
|
||||
typedef struct _AES_CMAC_CTX { |
||||
aes_context rijndael; |
||||
uint8_t X[16]; |
||||
uint8_t M_last[16]; |
||||
uint32_t M_n; |
||||
} AES_CMAC_CTX; |
||||
|
||||
//#include <sys/cdefs.h>
|
||||
|
||||
//__BEGIN_DECLS
|
||||
void AES_CMAC_Init(AES_CMAC_CTX * ctx); |
||||
void AES_CMAC_SetKey(AES_CMAC_CTX * ctx, const uint8_t key[AES_CMAC_KEY_LENGTH]); |
||||
void AES_CMAC_Update(AES_CMAC_CTX * ctx, const uint8_t * data, uint32_t len); |
||||
// __attribute__((__bounded__(__string__,2,3)));
|
||||
void AES_CMAC_Final(uint8_t digest[AES_CMAC_DIGEST_LENGTH], AES_CMAC_CTX * ctx); |
||||
// __attribute__((__bounded__(__minbytes__,1,AES_CMAC_DIGEST_LENGTH)));
|
||||
//__END_DECLS
|
||||
|
||||
#endif /* _CMAC_H_ */ |
||||
|
@ -0,0 +1,25 @@ |
||||
--- Revised BSD License --- |
||||
Copyright (c) 2013, SEMTECH S.A. |
||||
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 the Semtech corporation 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 SEMTECH S.A. 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. |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,202 @@ |
||||
/*
|
||||
/ _____) _ | | |
||||
( (____ _____ ____ _| |_ _____ ____| |__ |
||||
\____ \| ___ | (_ _) ___ |/ ___) _ \
|
||||
_____) ) ____| | | || |_| ____( (___| | | | |
||||
(______/|_____)_|_|_| \__)_____)\____)_| |_| |
||||
(C)2013 Semtech |
||||
___ _____ _ ___ _ _____ ___ ___ ___ ___ |
||||
/ __|_ _/_\ / __| |/ / __/ _ \| _ \/ __| __| |
||||
\__ \ | |/ _ \ (__| ' <| _| (_) | / (__| _| |
||||
|___/ |_/_/ \_\___|_|\_\_| \___/|_|_\\___|___| |
||||
embedded.connectivity.solutions=============== |
||||
|
||||
Description: LoRa MAC layer implementation |
||||
|
||||
License: Revised BSD License, see LICENSE.TXT file include in the project |
||||
|
||||
Maintainer: Miguel Luis ( Semtech ), Gregory Cristian ( Semtech ) and Daniel Jaeckle ( STACKFORCE ) |
||||
*/ |
||||
#include <stdlib.h> |
||||
#include <stdint.h> |
||||
#include "utilities.h" |
||||
|
||||
#include "aes.h" |
||||
#include "cmac.h" |
||||
|
||||
#include "LoRaMacCrypto.h" |
||||
|
||||
/*!
|
||||
* CMAC/AES Message Integrity Code (MIC) Block B0 size |
||||
*/ |
||||
#define LORAMAC_MIC_BLOCK_B0_SIZE 16 |
||||
|
||||
/*!
|
||||
* MIC field computation initial data |
||||
*/ |
||||
static uint8_t MicBlockB0[] = { 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 |
||||
}; |
||||
|
||||
/*!
|
||||
* Contains the computed MIC field. |
||||
* |
||||
* \remark Only the 4 first bytes are used |
||||
*/ |
||||
static uint8_t Mic[16]; |
||||
|
||||
/*!
|
||||
* Encryption aBlock and sBlock |
||||
*/ |
||||
static uint8_t aBlock[] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 |
||||
}; |
||||
static uint8_t sBlock[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 |
||||
}; |
||||
|
||||
/*!
|
||||
* AES computation context variable |
||||
*/ |
||||
static aes_context AesContext; |
||||
|
||||
/*!
|
||||
* CMAC computation context variable |
||||
*/ |
||||
static AES_CMAC_CTX AesCmacCtx[1]; |
||||
|
||||
/*!
|
||||
* \brief Computes the LoRaMAC frame MIC field
|
||||
* |
||||
* \param [IN] buffer Data buffer |
||||
* \param [IN] size Data buffer size |
||||
* \param [IN] key AES key to be used |
||||
* \param [IN] address Frame address |
||||
* \param [IN] dir Frame direction [0: uplink, 1: downlink] |
||||
* \param [IN] sequenceCounter Frame sequence counter |
||||
* \param [OUT] mic Computed MIC field |
||||
*/ |
||||
void LoRaMacComputeMic( const uint8_t *buffer, uint16_t size, const uint8_t *key, uint32_t address, uint8_t dir, uint32_t sequenceCounter, uint32_t *mic ) |
||||
{ |
||||
MicBlockB0[5] = dir; |
||||
|
||||
MicBlockB0[6] = ( address ) & 0xFF; |
||||
MicBlockB0[7] = ( address >> 8 ) & 0xFF; |
||||
MicBlockB0[8] = ( address >> 16 ) & 0xFF; |
||||
MicBlockB0[9] = ( address >> 24 ) & 0xFF; |
||||
|
||||
MicBlockB0[10] = ( sequenceCounter ) & 0xFF; |
||||
MicBlockB0[11] = ( sequenceCounter >> 8 ) & 0xFF; |
||||
MicBlockB0[12] = ( sequenceCounter >> 16 ) & 0xFF; |
||||
MicBlockB0[13] = ( sequenceCounter >> 24 ) & 0xFF; |
||||
|
||||
MicBlockB0[15] = size & 0xFF; |
||||
|
||||
AES_CMAC_Init( AesCmacCtx ); |
||||
|
||||
AES_CMAC_SetKey( AesCmacCtx, key ); |
||||
|
||||
AES_CMAC_Update( AesCmacCtx, MicBlockB0, LORAMAC_MIC_BLOCK_B0_SIZE ); |
||||
|
||||
AES_CMAC_Update( AesCmacCtx, buffer, size & 0xFF ); |
||||
|
||||
AES_CMAC_Final( Mic, AesCmacCtx ); |
||||
|
||||
*mic = ( uint32_t )( ( uint32_t )Mic[3] << 24 | ( uint32_t )Mic[2] << 16 | ( uint32_t )Mic[1] << 8 | ( uint32_t )Mic[0] ); |
||||
} |
||||
|
||||
void LoRaMacPayloadEncrypt( const uint8_t *buffer, uint16_t size, const uint8_t *key, uint32_t address, uint8_t dir, uint32_t sequenceCounter, uint8_t *encBuffer ) |
||||
{ |
||||
uint16_t i; |
||||
uint8_t bufferIndex = 0; |
||||
uint16_t ctr = 1; |
||||
|
||||
memset1( AesContext.ksch, '\0', 240 ); |
||||
aes_set_key( key, 16, &AesContext ); |
||||
|
||||
aBlock[5] = dir; |
||||
|
||||
aBlock[6] = ( address ) & 0xFF; |
||||
aBlock[7] = ( address >> 8 ) & 0xFF; |
||||
aBlock[8] = ( address >> 16 ) & 0xFF; |
||||
aBlock[9] = ( address >> 24 ) & 0xFF; |
||||
|
||||
aBlock[10] = ( sequenceCounter ) & 0xFF; |
||||
aBlock[11] = ( sequenceCounter >> 8 ) & 0xFF; |
||||
aBlock[12] = ( sequenceCounter >> 16 ) & 0xFF; |
||||
aBlock[13] = ( sequenceCounter >> 24 ) & 0xFF; |
||||
|
||||
while( size >= 16 ) |
||||
{ |
||||
aBlock[15] = ( ( ctr ) & 0xFF ); |
||||
ctr++; |
||||
aes_encrypt( aBlock, sBlock, &AesContext ); |
||||
for( i = 0; i < 16; i++ ) |
||||
{ |
||||
encBuffer[bufferIndex + i] = buffer[bufferIndex + i] ^ sBlock[i]; |
||||
} |
||||
size -= 16; |
||||
bufferIndex += 16; |
||||
} |
||||
|
||||
if( size > 0 ) |
||||
{ |
||||
aBlock[15] = ( ( ctr ) & 0xFF ); |
||||
aes_encrypt( aBlock, sBlock, &AesContext ); |
||||
for( i = 0; i < size; i++ ) |
||||
{ |
||||
encBuffer[bufferIndex + i] = buffer[bufferIndex + i] ^ sBlock[i]; |
||||
} |
||||
} |
||||
} |
||||
|
||||
void LoRaMacPayloadDecrypt( const uint8_t *buffer, uint16_t size, const uint8_t *key, uint32_t address, uint8_t dir, uint32_t sequenceCounter, uint8_t *decBuffer ) |
||||
{ |
||||
LoRaMacPayloadEncrypt( buffer, size, key, address, dir, sequenceCounter, decBuffer ); |
||||
} |
||||
|
||||
void LoRaMacJoinComputeMic( const uint8_t *buffer, uint16_t size, const uint8_t *key, uint32_t *mic ) |
||||
{ |
||||
AES_CMAC_Init( AesCmacCtx ); |
||||
|
||||
AES_CMAC_SetKey( AesCmacCtx, key ); |
||||
|
||||
AES_CMAC_Update( AesCmacCtx, buffer, size & 0xFF ); |
||||
|
||||
AES_CMAC_Final( Mic, AesCmacCtx ); |
||||
|
||||
*mic = ( uint32_t )( ( uint32_t )Mic[3] << 24 | ( uint32_t )Mic[2] << 16 | ( uint32_t )Mic[1] << 8 | ( uint32_t )Mic[0] ); |
||||
} |
||||
|
||||
void LoRaMacJoinDecrypt( const uint8_t *buffer, uint16_t size, const uint8_t *key, uint8_t *decBuffer ) |
||||
{ |
||||
memset1( AesContext.ksch, '\0', 240 ); |
||||
aes_set_key( key, 16, &AesContext ); |
||||
aes_encrypt( buffer, decBuffer, &AesContext ); |
||||
// Check if optional CFList is included
|
||||
if( size >= 16 ) |
||||
{ |
||||
aes_encrypt( buffer + 16, decBuffer + 16, &AesContext ); |
||||
} |
||||
} |
||||
|
||||
void LoRaMacJoinComputeSKeys( const uint8_t *key, const uint8_t *appNonce, uint16_t devNonce, uint8_t *nwkSKey, uint8_t *appSKey ) |
||||
{ |
||||
uint8_t nonce[16]; |
||||
uint8_t *pDevNonce = ( uint8_t * )&devNonce; |
||||
|
||||
memset1( AesContext.ksch, '\0', 240 ); |
||||
aes_set_key( key, 16, &AesContext ); |
||||
|
||||
memset1( nonce, 0, sizeof( nonce ) ); |
||||
nonce[0] = 0x01; |
||||
memcpy1( nonce + 1, appNonce, 6 ); |
||||
memcpy1( nonce + 7, pDevNonce, 2 ); |
||||
aes_encrypt( nonce, nwkSKey, &AesContext ); |
||||
|
||||
memset1( nonce, 0, sizeof( nonce ) ); |
||||
nonce[0] = 0x02; |
||||
memcpy1( nonce + 1, appNonce, 6 ); |
||||
memcpy1( nonce + 7, pDevNonce, 2 ); |
||||
aes_encrypt( nonce, appSKey, &AesContext ); |
||||
} |
@ -0,0 +1,111 @@ |
||||
/*!
|
||||
* \file LoRaMacCrypto.h |
||||
* |
||||
* \brief LoRa MAC layer cryptography implementation |
||||
* |
||||
* \copyright Revised BSD License, see section \ref LICENSE. |
||||
* |
||||
* \code |
||||
* ______ _ |
||||
* / _____) _ | | |
||||
* ( (____ _____ ____ _| |_ _____ ____| |__ |
||||
* \____ \| ___ | (_ _) ___ |/ ___) _ \
|
||||
* _____) ) ____| | | || |_| ____( (___| | | | |
||||
* (______/|_____)_|_|_| \__)_____)\____)_| |_| |
||||
* (C)2013 Semtech |
||||
* |
||||
* ___ _____ _ ___ _ _____ ___ ___ ___ ___ |
||||
* / __|_ _/_\ / __| |/ / __/ _ \| _ \/ __| __| |
||||
* \__ \ | |/ _ \ (__| ' <| _| (_) | / (__| _| |
||||
* |___/ |_/_/ \_\___|_|\_\_| \___/|_|_\\___|___| |
||||
* embedded.connectivity.solutions=============== |
||||
* |
||||
* \endcode |
||||
* |
||||
* \author Miguel Luis ( Semtech ) |
||||
* |
||||
* \author Gregory Cristian ( Semtech ) |
||||
* |
||||
* \author Daniel Jaeckle ( STACKFORCE ) |
||||
* |
||||
* \defgroup LORAMAC_CRYPTO LoRa MAC layer cryptography implementation |
||||
* This module covers the implementation of cryptographic functions |
||||
* of the LoRaMAC layer. |
||||
* \{ |
||||
*/ |
||||
#ifndef __LORAMAC_CRYPTO_H__ |
||||
#define __LORAMAC_CRYPTO_H__ |
||||
|
||||
/*!
|
||||
* Computes the LoRaMAC frame MIC field |
||||
* |
||||
* \param [IN] buffer - Data buffer |
||||
* \param [IN] size - Data buffer size |
||||
* \param [IN] key - AES key to be used |
||||
* \param [IN] address - Frame address |
||||
* \param [IN] dir - Frame direction [0: uplink, 1: downlink] |
||||
* \param [IN] sequenceCounter - Frame sequence counter |
||||
* \param [OUT] mic - Computed MIC field |
||||
*/ |
||||
void LoRaMacComputeMic( const uint8_t *buffer, uint16_t size, const uint8_t *key, uint32_t address, uint8_t dir, uint32_t sequenceCounter, uint32_t *mic ); |
||||
|
||||
/*!
|
||||
* Computes the LoRaMAC payload encryption |
||||
* |
||||
* \param [IN] buffer - Data buffer |
||||
* \param [IN] size - Data buffer size |
||||
* \param [IN] key - AES key to be used |
||||
* \param [IN] address - Frame address |
||||
* \param [IN] dir - Frame direction [0: uplink, 1: downlink] |
||||
* \param [IN] sequenceCounter - Frame sequence counter |
||||
* \param [OUT] encBuffer - Encrypted buffer |
||||
*/ |
||||
void LoRaMacPayloadEncrypt( const uint8_t *buffer, uint16_t size, const uint8_t *key, uint32_t address, uint8_t dir, uint32_t sequenceCounter, uint8_t *encBuffer ); |
||||
|
||||
/*!
|
||||
* Computes the LoRaMAC payload decryption |
||||
* |
||||
* \param [IN] buffer - Data buffer |
||||
* \param [IN] size - Data buffer size |
||||
* \param [IN] key - AES key to be used |
||||
* \param [IN] address - Frame address |
||||
* \param [IN] dir - Frame direction [0: uplink, 1: downlink] |
||||
* \param [IN] sequenceCounter - Frame sequence counter |
||||
* \param [OUT] decBuffer - Decrypted buffer |
||||
*/ |
||||
void LoRaMacPayloadDecrypt( const uint8_t *buffer, uint16_t size, const uint8_t *key, uint32_t address, uint8_t dir, uint32_t sequenceCounter, uint8_t *decBuffer ); |
||||
|
||||
/*!
|
||||
* Computes the LoRaMAC Join Request frame MIC field |
||||
* |
||||
* \param [IN] buffer - Data buffer |
||||
* \param [IN] size - Data buffer size |
||||
* \param [IN] key - AES key to be used |
||||
* \param [OUT] mic - Computed MIC field |
||||
*/ |
||||
void LoRaMacJoinComputeMic( const uint8_t *buffer, uint16_t size, const uint8_t *key, uint32_t *mic ); |
||||
|
||||
/*!
|
||||
* Computes the LoRaMAC join frame decryption |
||||
* |
||||
* \param [IN] buffer - Data buffer |
||||
* \param [IN] size - Data buffer size |
||||
* \param [IN] key - AES key to be used |
||||
* \param [OUT] decBuffer - Decrypted buffer |
||||
*/ |
||||
void LoRaMacJoinDecrypt( const uint8_t *buffer, uint16_t size, const uint8_t *key, uint8_t *decBuffer ); |
||||
|
||||
/*!
|
||||
* Computes the LoRaMAC join frame decryption |
||||
* |
||||
* \param [IN] key - AES key to be used |
||||
* \param [IN] appNonce - Application nonce |
||||
* \param [IN] devNonce - Device nonce |
||||
* \param [OUT] nwkSKey - Network session key |
||||
* \param [OUT] appSKey - Application session key |
||||
*/ |
||||
void LoRaMacJoinComputeSKeys( const uint8_t *key, const uint8_t *appNonce, uint16_t devNonce, uint8_t *nwkSKey, uint8_t *appSKey ); |
||||
|
||||
/*! \} defgroup LORAMAC */ |
||||
|
||||
#endif // __LORAMAC_CRYPTO_H__
|
@ -0,0 +1,81 @@ |
||||
/*!
|
||||
* \file LoRaMacTest.h |
||||
* |
||||
* \brief LoRa MAC layer test function implementation |
||||
* |
||||
* \copyright Revised BSD License, see section \ref LICENSE. |
||||
* |
||||
* \code |
||||
* ______ _ |
||||
* / _____) _ | | |
||||
* ( (____ _____ ____ _| |_ _____ ____| |__ |
||||
* \____ \| ___ | (_ _) ___ |/ ___) _ \
|
||||
* _____) ) ____| | | || |_| ____( (___| | | | |
||||
* (______/|_____)_|_|_| \__)_____)\____)_| |_| |
||||
* (C)2013 Semtech |
||||
* |
||||
* ___ _____ _ ___ _ _____ ___ ___ ___ ___ |
||||
* / __|_ _/_\ / __| |/ / __/ _ \| _ \/ __| __| |
||||
* \__ \ | |/ _ \ (__| ' <| _| (_) | / (__| _| |
||||
* |___/ |_/_/ \_\___|_|\_\_| \___/|_|_\\___|___| |
||||
* embedded.connectivity.solutions=============== |
||||
* |
||||
* \endcode |
||||
* |
||||
* \author Miguel Luis ( Semtech ) |
||||
* |
||||
* \author Gregory Cristian ( Semtech ) |
||||
* |
||||
* \author Daniel Jaeckle ( STACKFORCE ) |
||||
* |
||||
* \defgroup LORAMACTEST LoRa MAC layer test function implementation |
||||
* This module specifies the API implementation of test function of the LoRaMAC layer. |
||||
* The functions in this file are only for testing purposes only. |
||||
* \{ |
||||
*/ |
||||
#ifndef __LORAMACTEST_H__ |
||||
#define __LORAMACTEST_H__ |
||||
|
||||
/*!
|
||||
* \brief Enabled or disables the reception windows |
||||
* |
||||
* \details This is a test function. It shall be used for testing purposes only. |
||||
* Changing this attribute may lead to a non-conformance LoRaMac operation. |
||||
* |
||||
* \param [IN] enable - Enabled or disables the reception windows |
||||
*/ |
||||
void LoRaMacTestRxWindowsOn( bool enable ); |
||||
|
||||
/*!
|
||||
* \brief Enables the MIC field test |
||||
* |
||||
* \details This is a test function. It shall be used for testing purposes only. |
||||
* Changing this attribute may lead to a non-conformance LoRaMac operation. |
||||
* |
||||
* \param [IN] txPacketCounter - Fixed Tx packet counter value |
||||
*/ |
||||
void LoRaMacTestSetMic( uint16_t txPacketCounter ); |
||||
|
||||
/*!
|
||||
* \brief Enabled or disables the duty cycle |
||||
* |
||||
* \details This is a test function. It shall be used for testing purposes only. |
||||
* Changing this attribute may lead to a non-conformance LoRaMac operation. |
||||
* |
||||
* \param [IN] enable - Enabled or disables the duty cycle |
||||
*/ |
||||
void LoRaMacTestSetDutyCycleOn( bool enable ); |
||||
|
||||
/*!
|
||||
* \brief Sets the channel index |
||||
* |
||||
* \details This is a test function. It shall be used for testing purposes only. |
||||
* Changing this attribute may lead to a non-conformance LoRaMac operation. |
||||
* |
||||
* \param [IN] channel - Channel index |
||||
*/ |
||||
void LoRaMacTestSetChannel( uint8_t channel ); |
||||
|
||||
/*! \} defgroup LORAMACTEST */ |
||||
|
||||
#endif // __LORAMACTEST_H__
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,503 @@ |
||||
/*!
|
||||
* \file RegionAS923.h |
||||
* |
||||
* \brief Region definition for AS923 |
||||
* |
||||
* \copyright Revised BSD License, see section \ref LICENSE. |
||||
* |
||||
* \code |
||||
* ______ _ |
||||
* / _____) _ | | |
||||
* ( (____ _____ ____ _| |_ _____ ____| |__ |
||||
* \____ \| ___ | (_ _) ___ |/ ___) _ \
|
||||
* _____) ) ____| | | || |_| ____( (___| | | | |
||||
* (______/|_____)_|_|_| \__)_____)\____)_| |_| |
||||
* (C)2013 Semtech |
||||
* |
||||
* ___ _____ _ ___ _ _____ ___ ___ ___ ___ |
||||
* / __|_ _/_\ / __| |/ / __/ _ \| _ \/ __| __| |
||||
* \__ \ | |/ _ \ (__| ' <| _| (_) | / (__| _| |
||||
* |___/ |_/_/ \_\___|_|\_\_| \___/|_|_\\___|___| |
||||
* embedded.connectivity.solutions=============== |
||||
* |
||||
* \endcode |
||||
* |
||||
* \author Miguel Luis ( Semtech ) |
||||
* |
||||
* \author Gregory Cristian ( Semtech ) |
||||
* |
||||
* \author Daniel Jaeckle ( STACKFORCE ) |
||||
* |
||||
* \defgroup REGIONAS923 Region AS923 |
||||
* Implementation according to LoRaWAN Specification v1.0.2. |
||||
* \{ |
||||
*/ |
||||
#ifndef __REGION_AS923_H__ |
||||
#define __REGION_AS923_H__ |
||||
|
||||
/*!
|
||||
* LoRaMac maximum number of channels |
||||
*/ |
||||
#define AS923_MAX_NB_CHANNELS 16 |
||||
|
||||
/*!
|
||||
* Number of default channels |
||||
*/ |
||||
#define AS923_NUMB_DEFAULT_CHANNELS 2 |
||||
|
||||
/*!
|
||||
* Number of channels to apply for the CF list |
||||
*/ |
||||
#define AS923_NUMB_CHANNELS_CF_LIST 5 |
||||
|
||||
/*!
|
||||
* Minimal datarate that can be used by the node |
||||
*/ |
||||
#define AS923_TX_MIN_DATARATE DR_0 |
||||
|
||||
/*!
|
||||
* Maximal datarate that can be used by the node |
||||
*/ |
||||
#define AS923_TX_MAX_DATARATE DR_7 |
||||
|
||||
/*!
|
||||
* Minimal datarate that can be used by the node |
||||
*/ |
||||
#define AS923_RX_MIN_DATARATE DR_0 |
||||
|
||||
/*!
|
||||
* Maximal datarate that can be used by the node |
||||
*/ |
||||
#define AS923_RX_MAX_DATARATE DR_7 |
||||
|
||||
/*!
|
||||
* Default datarate used by the node |
||||
*/ |
||||
#define AS923_DEFAULT_DATARATE DR_2 |
||||
|
||||
/*!
|
||||
* The minimum datarate which is used when the |
||||
* dwell time is limited. |
||||
*/ |
||||
#define AS923_DWELL_LIMIT_DATARATE DR_2 |
||||
|
||||
/*!
|
||||
* Minimal Rx1 receive datarate offset |
||||
*/ |
||||
#define AS923_MIN_RX1_DR_OFFSET 0 |
||||
|
||||
/*!
|
||||
* Maximal Rx1 receive datarate offset |
||||
*/ |
||||
#define AS923_MAX_RX1_DR_OFFSET 7 |
||||
|
||||
/*!
|
||||
* Default Rx1 receive datarate offset |
||||
*/ |
||||
#define AS923_DEFAULT_RX1_DR_OFFSET 0 |
||||
|
||||
/*!
|
||||
* Minimal Tx output power that can be used by the node |
||||
*/ |
||||
#define AS923_MIN_TX_POWER TX_POWER_7 |
||||
|
||||
/*!
|
||||
* Maximal Tx output power that can be used by the node |
||||
*/ |
||||
#define AS923_MAX_TX_POWER TX_POWER_0 |
||||
|
||||
/*!
|
||||
* Default Tx output power used by the node |
||||
*/ |
||||
#define AS923_DEFAULT_TX_POWER TX_POWER_0 |
||||
|
||||
/*!
|
||||
* Default uplink dwell time configuration |
||||
*/ |
||||
#define AS923_DEFAULT_UPLINK_DWELL_TIME 1 |
||||
|
||||
/*!
|
||||