* Migrate `LAYOUTS` to data driven, 0-9
* Migrate `LAYOUTS` to data driven, A
* Migrate `LAYOUTS` to data driven, B
* Migrate `LAYOUTS` to data driven, C
* Migrate `LAYOUTS` to data driven, D
* Migrate `LAYOUTS` to data driven, E
* Migrate `LAYOUTS` to data driven, F
* Migrate `LAYOUTS` to data driven, G
* Migrate `LAYOUTS` to data driven, H
* Migrate `LAYOUTS` to data driven, handwired
* Migrate `LAYOUTS` to data driven, I
* Migrate `LAYOUTS` to data driven, J
* Migrate `LAYOUTS` to data driven, K
* Migrate `LAYOUTS` to data driven, L
* Migrate `LAYOUTS` to data driven, M
* Migrate `LAYOUTS` to data driven, N
* Migrate `LAYOUTS` to data driven, O
* Migrate `LAYOUTS` to data driven, P
* Migrate `LAYOUTS` to data driven, Q
* Migrate `LAYOUTS` to data driven, R
* Migrate `LAYOUTS` to data driven, S
* Migrate `LAYOUTS` to data driven, T
* Migrate `LAYOUTS` to data driven, U
* Migrate `LAYOUTS` to data driven, V
* Migrate `LAYOUTS` to data driven, W
* Migrate `LAYOUTS` to data driven, X
* Migrate `LAYOUTS` to data driven, Y
* Migrate `LAYOUTS` to data driven, Z
* Use polled waiting on platforms that support it
Due to context switching overhead waiting a very short amount of time on
a sleeping thread is often not accurate and in fact not usable for timing
critical usage i.e. in a driver. Thus we use polled waiting for ranges
in the us range on platforms that support it instead. The fallback is
the thread sleeping mechanism.
This includes:
* ARM platforms with CYCCNT register (ARMv7, ARMv8) this is
incremented at CPU clock frequency
* GD32VF103 RISC-V port with CSR_MCYCLE register this is incremented at
CPU clock frequency
* RP2040 ARMv6 port which uses the integrated timer peripheral which is
incremented with a fixed 1MHz frequency
* Use wait_us() instead of chSysPolledDelayX
...as it is powered by busy waiting now.
* Add chibios waiting methods test bench
The old custom matrix code for Preonic rev3 was relying on the
`matrix_col_t` type, because the code actually reads the row pins and
assembles the state for whole columns, and then transposes the matrix in
the custom debouncing code. Restore that type (which is no longer
defined by the core QMK code) to make the custom matrix code work
properly (when `matrix_row_t` was used instead of `matrix_col_t`, the
state of two electrical rows was lost, and those electrical rows
corresponded to the bottom physical row, which did not work).