| /* | |||||
| * 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 |