@@ -0,0 +1,71 @@ | |||
/* | |||
* 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 |
@@ -0,0 +1,98 @@ | |||
// 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 | |||
@@ -0,0 +1,37 @@ | |||
/* 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 |
@@ -0,0 +1,43 @@ | |||
/* 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 |