/* | |||||
* This is port of Dean Camera's ATOMIC_BLOCK macros for AVR to ARM Cortex M3 | |||||
* v1.0 | |||||
* Mark Pendrith, Nov 27, 2012. | |||||
* | |||||
* From Mark: | |||||
* >When I ported the macros I emailed Dean to ask what attribution would be | |||||
* >appropriate, and here is his response: | |||||
* > | |||||
* >>Mark, | |||||
* >>I think it's great that you've ported the macros; consider them | |||||
* >>public domain, to do with whatever you wish. I hope you find them >useful . | |||||
* >> | |||||
* >>Cheers! | |||||
* >>- Dean | |||||
*/ | |||||
#ifdef __arm__ | |||||
#ifndef _CORTEX_M3_ATOMIC_H_ | |||||
#define _CORTEX_M3_ATOMIC_H_ | |||||
static __inline__ uint32_t __get_primask(void) \ | |||||
{ uint32_t primask = 0; \ | |||||
__asm__ volatile ("MRS %[result], PRIMASK\n\t":[result]"=r"(primask)::); \ | |||||
return primask; } // returns 0 if interrupts enabled, 1 if disabled | |||||
static __inline__ void __set_primask(uint32_t setval) \ | |||||
{ __asm__ volatile ("MSR PRIMASK, %[value]\n\t""dmb\n\t""dsb\n\t""isb\n\t"::[value]"r"(setval):); | |||||
__asm__ volatile ("" ::: "memory");} | |||||
static __inline__ uint32_t __iSeiRetVal(void) \ | |||||
{ __asm__ volatile ("CPSIE i\n\t""dmb\n\t""dsb\n\t""isb\n\t"); \ | |||||
__asm__ volatile ("" ::: "memory"); return 1; } | |||||
static __inline__ uint32_t __iCliRetVal(void) \ | |||||
{ __asm__ volatile ("CPSID i\n\t""dmb\n\t""dsb\n\t""isb\n\t"); \ | |||||
__asm__ volatile ("" ::: "memory"); return 1; } | |||||
static __inline__ void __iSeiParam(const uint32_t *__s) \ | |||||
{ __asm__ volatile ("CPSIE i\n\t""dmb\n\t""dsb\n\t""isb\n\t"); \ | |||||
__asm__ volatile ("" ::: "memory"); (void)__s; } | |||||
static __inline__ void __iCliParam(const uint32_t *__s) \ | |||||
{ __asm__ volatile ("CPSID i\n\t""dmb\n\t""dsb\n\t""isb\n\t"); \ | |||||
__asm__ volatile ("" ::: "memory"); (void)__s; } | |||||
static __inline__ void __iRestore(const uint32_t *__s) \ | |||||
{ __set_primask(*__s); __asm__ volatile ("dmb\n\t""dsb\n\t""isb\n\t"); \ | |||||
__asm__ volatile ("" ::: "memory"); } | |||||
#define ATOMIC_BLOCK(type) \ | |||||
for ( type, __ToDo = __iCliRetVal(); __ToDo ; __ToDo = 0 ) | |||||
#define ATOMIC_RESTORESTATE \ | |||||
uint32_t primask_save __attribute__((__cleanup__(__iRestore))) = __get_primask() | |||||
#define ATOMIC_FORCEON \ | |||||
uint32_t primask_save __attribute__((__cleanup__(__iSeiParam))) = 0 | |||||
#define NONATOMIC_BLOCK(type) \ | |||||
for ( type, __ToDo = __iSeiRetVal(); __ToDo ; __ToDo = 0 ) | |||||
#define NONATOMIC_RESTORESTATE \ | |||||
uint32_t primask_save __attribute__((__cleanup__(__iRestore))) = __get_primask() | |||||
#define NONATOMIC_FORCEOFF \ | |||||
uint32_t primask_save __attribute__((__cleanup__(__iCliParam))) = 0 | |||||
#endif | |||||
#endif |
// CRC compatibility, adapted from the C-only comments here: | |||||
// http://svn.savannah.nongnu.org/viewvc/trunk/avr-libc/include/util/crc16.h?revision=933&root=avr-libc&view=markup | |||||
/* Copyright (c) 2002, 2003, 2004 Marek Michalkiewicz | |||||
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 copyright holders nor the names of | |||||
contributors may be used to endorse or promote products derived | |||||
from this software without specific prior written permission. | |||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | |||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |||||
POSSIBILITY OF SUCH DAMAGE. */ | |||||
#ifndef _UTIL_CRC16_H_ | |||||
#define _UTIL_CRC16_H_ | |||||
#include <stdint.h> | |||||
static inline uint16_t _crc16_update(uint16_t crc, uint8_t data) __attribute__((always_inline, unused)); | |||||
static inline uint16_t _crc16_update(uint16_t crc, uint8_t data) | |||||
{ | |||||
unsigned int i; | |||||
crc ^= data; | |||||
for (i = 0; i < 8; ++i) { | |||||
if (crc & 1) { | |||||
crc = (crc >> 1) ^ 0xA001; | |||||
} else { | |||||
crc = (crc >> 1); | |||||
} | |||||
} | |||||
return crc; | |||||
} | |||||
static inline uint16_t _crc_xmodem_update(uint16_t crc, uint8_t data) __attribute__((always_inline, unused)); | |||||
static inline uint16_t _crc_xmodem_update(uint16_t crc, uint8_t data) | |||||
{ | |||||
unsigned int i; | |||||
crc = crc ^ ((uint16_t)data << 8); | |||||
for (i=0; i<8; i++) { | |||||
if (crc & 0x8000) { | |||||
crc = (crc << 1) ^ 0x1021; | |||||
} else { | |||||
crc <<= 1; | |||||
} | |||||
} | |||||
return crc; | |||||
} | |||||
static inline uint16_t _crc_ccitt_update (uint16_t crc, uint8_t data) __attribute__((always_inline, unused)); | |||||
static inline uint16_t _crc_ccitt_update (uint16_t crc, uint8_t data) | |||||
{ | |||||
data ^= (crc & 255); | |||||
data ^= data << 4; | |||||
return ((((uint16_t)data << 8) | (crc >> 8)) ^ (uint8_t)(data >> 4) | |||||
^ ((uint16_t)data << 3)); | |||||
} | |||||
static inline uint8_t _crc_ibutton_update(uint8_t crc, uint8_t data) __attribute__((always_inline, unused)); | |||||
static inline uint8_t _crc_ibutton_update(uint8_t crc, uint8_t data) | |||||
{ | |||||
unsigned int i; | |||||
crc = crc ^ data; | |||||
for (i = 0; i < 8; i++) { | |||||
if (crc & 0x01) { | |||||
crc = (crc >> 1) ^ 0x8C; | |||||
} else { | |||||
crc >>= 1; | |||||
} | |||||
} | |||||
return crc; | |||||
} | |||||
#endif | |||||
/* Teensyduino Core Library | |||||
* http://www.pjrc.com/teensy/ | |||||
* Copyright (c) 2016 PJRC.COM, LLC. | |||||
* | |||||
* Permission is hereby granted, free of charge, to any person obtaining | |||||
* a copy of this software and associated documentation files (the | |||||
* "Software"), to deal in 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: | |||||
* | |||||
* 1. The above copyright notice and this permission notice shall be | |||||
* included in all copies or substantial portions of the Software. | |||||
* | |||||
* 2. If the Software is incorporated into a build system that allows | |||||
* selection among a list of target devices, then similar target | |||||
* devices manufactured by PJRC.COM must be included in the list of | |||||
* target devices and selectable in the same manner. | |||||
* | |||||
* 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 AUTHORS 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 IN THE | |||||
* SOFTWARE. | |||||
*/ | |||||
#ifndef _delay_us | |||||
#define _delay_us(n) delayMicroseconds(n) | |||||
#endif | |||||
#ifndef _delay_ms | |||||
#define _delay_ms(n) delay(n) | |||||
#endif |
/* Teensyduino Core Library | |||||
* http://www.pjrc.com/teensy/ | |||||
* Copyright (c) 2016 PJRC.COM, LLC. | |||||
* | |||||
* Permission is hereby granted, free of charge, to any person obtaining | |||||
* a copy of this software and associated documentation files (the | |||||
* "Software"), to deal in 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: | |||||
* | |||||
* 1. The above copyright notice and this permission notice shall be | |||||
* included in all copies or substantial portions of the Software. | |||||
* | |||||
* 2. If the Software is incorporated into a build system that allows | |||||
* selection among a list of target devices, then similar target | |||||
* devices manufactured by PJRC.COM must be included in the list of | |||||
* target devices and selectable in the same manner. | |||||
* | |||||
* 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 AUTHORS 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 IN THE | |||||
* SOFTWARE. | |||||
*/ | |||||
#ifndef _UTIL_PARITY_H_ | |||||
#define _UTIL_PARITY_H_ | |||||
static inline uint8_t parity_even_bit(uint8_t x) __attribute__((pure, always_inline, unused)); | |||||
static inline uint8_t parity_even_bit(uint8_t x) | |||||
{ | |||||
x ^= x >> 1; | |||||
x ^= x >> 2; | |||||
x ^= x >> 4; | |||||
return x & 1; | |||||
} | |||||
#endif |