]> git.donarmstrong.com Git - kiibohd-controller.git/blob - Lib/delay.h
Adding initial Teensy 3 support, compiles, but not fully functional yet.
[kiibohd-controller.git] / Lib / delay.h
1
2 #ifndef __DELAY_H
3 #define __DELAY_H
4
5 #include <stdint.h>
6
7 // Convenience Macros, for delay compatibility with AVR-GCC
8 #define _delay_ms(val) delay( val )
9 #define _delay_us(val) delayMicroseconds( val )
10
11
12 // the systick interrupt is supposed to increment this at 1 kHz rate
13 extern volatile uint32_t systick_millis_count;
14
15 static inline uint32_t millis(void) __attribute__((always_inline, unused));
16 static inline uint32_t millis(void)
17 {
18         return systick_millis_count; // single aligned 32 bit is atomic;
19 }
20
21
22 static inline void delayMicroseconds(uint32_t) __attribute__((always_inline, unused));
23 static inline void delayMicroseconds(uint32_t usec)
24 {
25 #if F_CPU == 96000000
26         uint32_t n = usec << 5;
27 #elif F_CPU == 48000000
28         uint32_t n = usec << 4;
29 #elif F_CPU == 24000000
30         uint32_t n = usec << 3;
31 #endif
32         asm volatile(
33                 "L_%=_delayMicroseconds:"               "\n\t"
34                 "subs   %0, #1"                         "\n\t"
35                 "bne    L_%=_delayMicroseconds"         "\n"
36                 : "+r" (n) :
37         );
38 }
39
40
41 void yield(void) __attribute__ ((weak));
42
43 uint32_t micros(void);
44
45 void delay(uint32_t ms);
46
47 #endif
48