| @@ -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 | |||