wait.c (1308B)
1 /* Copyright 2021 QMK 2 * 3 * This program is free software: you can redistribute it and/or modify 4 * it under the terms of the GNU General Public License as published by 5 * the Free Software Foundation, either version 3 of the License, or 6 * (at your option) any later version. 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU General Public License for more details. 12 * 13 * You should have received a copy of the GNU General Public License 14 * along with this program. If not, see <http://www.gnu.org/licenses/>. 15 */ 16 17 #include <ch.h> 18 #include <hal.h> 19 20 #include "_wait.h" 21 22 #ifdef WAIT_US_TIMER 23 void wait_us(uint16_t duration) { 24 static const GPTConfig gpt_cfg = {.frequency = 1000000}; /* 1MHz timer, no callback */ 25 26 if (duration == 0) { 27 duration = 1; 28 } 29 30 /* 31 * Only use this timer on the main thread; 32 * other threads need to use their own timer. 33 */ 34 if (chThdGetSelfX() == &(currcore->mainthread) && duration < (1ULL << (sizeof(gptcnt_t) * 8))) { 35 gptStart(&WAIT_US_TIMER, &gpt_cfg); 36 gptPolledDelay(&WAIT_US_TIMER, duration); 37 } else { 38 chThdSleepMicroseconds(duration); 39 } 40 } 41 #endif