aboutsummaryrefslogtreecommitdiff
path: root/quantum/quantum.h
diff options
context:
space:
mode:
authorTakeshi ISHII <2170248+mtei@users.noreply.github.com>2021-01-13 10:46:22 +0900
committerGitHub <noreply@github.com>2021-01-13 12:46:22 +1100
commit302b35c2a0ac90208e523944e8cc4b44a793d8d5 (patch)
tree473bf6d47b42125027fde59c409971b0b1c925c6 /quantum/quantum.h
parent017aa5988af308ae6d585b4afea6f28c28e2d238 (diff)
downloadqmk_firmware-302b35c2a0ac90208e523944e8cc4b44a793d8d5.tar.gz
qmk_firmware-302b35c2a0ac90208e523944e8cc4b44a793d8d5.zip
fix matrix_io_delay() timing in quantum/matrix.c (#9603)
* fix matrix_io_delay() timing in quantum/matrix.c * Updated comments explaining the need for matrix_io_delay() in quantum/matrix.c * fix matrix_io_delay() timing in quantum/split_common/matrix.c * Update quantum/matrix.c Co-authored-by: Ryan <fauxpark@gmail.com> * Update quantum/split_common/matrix.c Co-authored-by: Ryan <fauxpark@gmail.com> * Update quantum/matrix.c Co-authored-by: Ryan <fauxpark@gmail.com> * Update quantum/split_common/matrix.c Co-authored-by: Ryan <fauxpark@gmail.com> * add waitOutputPinValid() and wait_cpuclock() into quantum/quantum.h and tmk_core/common/wait.h * add matrix_output_select_delay() and matrix_output_unselect_delay() * fix quantum/matrix_common.c, tmk_core/common/matrix.h * fix tmk_core/common/wait.h * fix quantum/quantum.h, tmk_core/common/wait.h * waitOutputPinValid() rename to waitInputPinDelay() in quantum/quantum.h. * waitOutputPinValid() rename to waitInputPinDelay() in quantum/matrix_common.c * update tmk_core/common/wait.h * update comment in quantum/matrix.c, quantum/split_common/matrix.c * update quantum/quantum.h: Make more margin in the GPIO_INPUT_PIN_DELAY default value. Co-authored-by: Ryan <fauxpark@gmail.com>
Diffstat (limited to 'quantum/quantum.h')
-rw-r--r--quantum/quantum.h29
1 files changed, 29 insertions, 0 deletions
diff --git a/quantum/quantum.h b/quantum/quantum.h
index 83694c832..d234e6ea0 100644
--- a/quantum/quantum.h
+++ b/quantum/quantum.h
@@ -210,6 +210,13 @@ typedef uint8_t pin_t;
210 210
211# define togglePin(pin) (PORTx_ADDRESS(pin) ^= _BV((pin)&0xF)) 211# define togglePin(pin) (PORTx_ADDRESS(pin) ^= _BV((pin)&0xF))
212 212
213/* The AVR series GPIOs have a one clock read delay for changes in the digital input signal.
214 * But here's more margin to make it two clocks. */
215# if !defined(GPIO_INPUT_PIN_DELAY)
216# define GPIO_INPUT_PIN_DELAY 2
217# endif
218# define waitInputPinDelay() wait_cpuclock(GPIO_INPUT_PIN_DELAY)
219
213#elif defined(PROTOCOL_CHIBIOS) 220#elif defined(PROTOCOL_CHIBIOS)
214typedef ioline_t pin_t; 221typedef ioline_t pin_t;
215 222
@@ -225,6 +232,28 @@ typedef ioline_t pin_t;
225# define readPin(pin) palReadLine(pin) 232# define readPin(pin) palReadLine(pin)
226 233
227# define togglePin(pin) palToggleLine(pin) 234# define togglePin(pin) palToggleLine(pin)
235
236#endif
237
238#if defined(__ARMEL__) || defined(__ARMEB__)
239/* For GPIOs on ARM-based MCUs, the input pins are sampled by the clock of the bus
240 * to which the GPIO is connected.
241 * The connected buses differ depending on the various series of MCUs.
242 * And since the instruction execution clock of the CPU and the bus clock of GPIO are different,
243 * there is a delay of several clocks to read the change of the input signal.
244 *
245 * Define this delay with the GPIO_INPUT_PIN_DELAY macro.
246 * If the GPIO_INPUT_PIN_DELAY macro is not defined, the following default values will be used.
247 * (A fairly large value of 0.25 microseconds is set.)
248 */
249# if !defined(GPIO_INPUT_PIN_DELAY)
250# if defined(STM32_SYSCLK)
251# define GPIO_INPUT_PIN_DELAY (STM32_SYSCLK/1000000L / 4)
252# elif defined(KINETIS_SYSCLK_FREQUENCY)
253# define GPIO_INPUT_PIN_DELAY (KINETIS_SYSCLK_FREQUENCY/1000000L / 4)
254# endif
255# endif
256# define waitInputPinDelay() wait_cpuclock(GPIO_INPUT_PIN_DELAY)
228#endif 257#endif
229 258
230// Atomic macro to help make GPIO and other controls atomic. 259// Atomic macro to help make GPIO and other controls atomic.