diff options
Diffstat (limited to 'tmk_core/common/wait.h')
| -rw-r--r-- | tmk_core/common/wait.h | 89 |
1 files changed, 58 insertions, 31 deletions
diff --git a/tmk_core/common/wait.h b/tmk_core/common/wait.h index 0b3fd755a..28224fe3a 100644 --- a/tmk_core/common/wait.h +++ b/tmk_core/common/wait.h | |||
| @@ -15,44 +15,71 @@ extern "C" { | |||
| 15 | 15 | ||
| 16 | # define CLOCK_DELAY_NOP8 "nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t" | 16 | # define CLOCK_DELAY_NOP8 "nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t" |
| 17 | 17 | ||
| 18 | __attribute__((always_inline)) | 18 | __attribute__((always_inline)) static inline void wait_cpuclock_allnop(unsigned int n) { /* n: 1..135 */ |
| 19 | static inline void wait_cpuclock_allnop(unsigned int n) { /* n: 1..135 */ | ||
| 20 | /* The argument n must be a constant expression. | 19 | /* The argument n must be a constant expression. |
| 21 | * That way, compiler optimization will remove unnecessary code. */ | 20 | * That way, compiler optimization will remove unnecessary code. */ |
| 22 | if (n < 1) { return; } | 21 | if (n < 1) { |
| 22 | return; | ||
| 23 | } | ||
| 23 | if (n > 8) { | 24 | if (n > 8) { |
| 24 | unsigned int n8 = n/8; | 25 | unsigned int n8 = n / 8; |
| 25 | n = n - n8*8; | 26 | n = n - n8 * 8; |
| 26 | switch (n8) { | 27 | switch (n8) { |
| 27 | case 16: asm volatile (CLOCK_DELAY_NOP8::: "memory"); | 28 | case 16: |
| 28 | case 15: asm volatile (CLOCK_DELAY_NOP8::: "memory"); | 29 | asm volatile(CLOCK_DELAY_NOP8::: "memory"); |
| 29 | case 14: asm volatile (CLOCK_DELAY_NOP8::: "memory"); | 30 | case 15: |
| 30 | case 13: asm volatile (CLOCK_DELAY_NOP8::: "memory"); | 31 | asm volatile(CLOCK_DELAY_NOP8::: "memory"); |
| 31 | case 12: asm volatile (CLOCK_DELAY_NOP8::: "memory"); | 32 | case 14: |
| 32 | case 11: asm volatile (CLOCK_DELAY_NOP8::: "memory"); | 33 | asm volatile(CLOCK_DELAY_NOP8::: "memory"); |
| 33 | case 10: asm volatile (CLOCK_DELAY_NOP8::: "memory"); | 34 | case 13: |
| 34 | case 9: asm volatile (CLOCK_DELAY_NOP8::: "memory"); | 35 | asm volatile(CLOCK_DELAY_NOP8::: "memory"); |
| 35 | case 8: asm volatile (CLOCK_DELAY_NOP8::: "memory"); | 36 | case 12: |
| 36 | case 7: asm volatile (CLOCK_DELAY_NOP8::: "memory"); | 37 | asm volatile(CLOCK_DELAY_NOP8::: "memory"); |
| 37 | case 6: asm volatile (CLOCK_DELAY_NOP8::: "memory"); | 38 | case 11: |
| 38 | case 5: asm volatile (CLOCK_DELAY_NOP8::: "memory"); | 39 | asm volatile(CLOCK_DELAY_NOP8::: "memory"); |
| 39 | case 4: asm volatile (CLOCK_DELAY_NOP8::: "memory"); | 40 | case 10: |
| 40 | case 3: asm volatile (CLOCK_DELAY_NOP8::: "memory"); | 41 | asm volatile(CLOCK_DELAY_NOP8::: "memory"); |
| 41 | case 2: asm volatile (CLOCK_DELAY_NOP8::: "memory"); | 42 | case 9: |
| 42 | case 1: asm volatile (CLOCK_DELAY_NOP8::: "memory"); | 43 | asm volatile(CLOCK_DELAY_NOP8::: "memory"); |
| 43 | case 0: break; | 44 | case 8: |
| 45 | asm volatile(CLOCK_DELAY_NOP8::: "memory"); | ||
| 46 | case 7: | ||
| 47 | asm volatile(CLOCK_DELAY_NOP8::: "memory"); | ||
| 48 | case 6: | ||
| 49 | asm volatile(CLOCK_DELAY_NOP8::: "memory"); | ||
| 50 | case 5: | ||
| 51 | asm volatile(CLOCK_DELAY_NOP8::: "memory"); | ||
| 52 | case 4: | ||
| 53 | asm volatile(CLOCK_DELAY_NOP8::: "memory"); | ||
| 54 | case 3: | ||
| 55 | asm volatile(CLOCK_DELAY_NOP8::: "memory"); | ||
| 56 | case 2: | ||
| 57 | asm volatile(CLOCK_DELAY_NOP8::: "memory"); | ||
| 58 | case 1: | ||
| 59 | asm volatile(CLOCK_DELAY_NOP8::: "memory"); | ||
| 60 | case 0: | ||
| 61 | break; | ||
| 44 | } | 62 | } |
| 45 | } | 63 | } |
| 46 | switch (n) { | 64 | switch (n) { |
| 47 | case 8: asm volatile ("nop"::: "memory"); | 65 | case 8: |
| 48 | case 7: asm volatile ("nop"::: "memory"); | 66 | asm volatile("nop" ::: "memory"); |
| 49 | case 6: asm volatile ("nop"::: "memory"); | 67 | case 7: |
| 50 | case 5: asm volatile ("nop"::: "memory"); | 68 | asm volatile("nop" ::: "memory"); |
| 51 | case 4: asm volatile ("nop"::: "memory"); | 69 | case 6: |
| 52 | case 3: asm volatile ("nop"::: "memory"); | 70 | asm volatile("nop" ::: "memory"); |
| 53 | case 2: asm volatile ("nop"::: "memory"); | 71 | case 5: |
| 54 | case 1: asm volatile ("nop"::: "memory"); | 72 | asm volatile("nop" ::: "memory"); |
| 55 | case 0: break; | 73 | case 4: |
| 74 | asm volatile("nop" ::: "memory"); | ||
| 75 | case 3: | ||
| 76 | asm volatile("nop" ::: "memory"); | ||
| 77 | case 2: | ||
| 78 | asm volatile("nop" ::: "memory"); | ||
| 79 | case 1: | ||
| 80 | asm volatile("nop" ::: "memory"); | ||
| 81 | case 0: | ||
| 82 | break; | ||
| 56 | } | 83 | } |
| 57 | } | 84 | } |
| 58 | #endif | 85 | #endif |
