keychron_qmk_firmware/keyboards/handwired/symmetric70_proto/matrix_debug
Jeff Epler 9632360caa
Use a macro to compute the size of arrays at compile time (#18044)
* Add ARRAY_SIZE and CEILING utility macros

* Apply a coccinelle patch to use ARRAY_SIZE

* fix up some straggling items

* Fix 'make test:secure'

* Enhance ARRAY_SIZE macro to reject acting on pointers

The previous definition would not produce a diagnostic for
```
int *p;
size_t num_elem = ARRAY_SIZE(p)
```
but the new one will.

* explicitly get definition of ARRAY_SIZE

* Convert to ARRAY_SIZE when const is involved

The following spatch finds additional instances where the array is
const and the division is by the size of the type, not the size of
the first element:
```
@ rule5a using "empty.iso" @
type T;
const T[] E;
@@

- (sizeof(E)/sizeof(T))
+ ARRAY_SIZE(E)

@ rule6a using "empty.iso" @
type T;
const T[] E;
@@

- sizeof(E)/sizeof(T)
+ ARRAY_SIZE(E)
```

* New instances of ARRAY_SIZE added since initial spatch run

* Use `ARRAY_SIZE` in docs (found by grep)

* Manually use ARRAY_SIZE

hs_set is expected to be the same size as uint16_t, though it's made
of two 8-bit integers

* Just like char, sizeof(uint8_t) is guaranteed to be 1

This is at least true on any plausible system where qmk is actually used.

Per my understanding it's universally true, assuming that uint8_t exists:
https://stackoverflow.com/questions/48655310/can-i-assume-that-sizeofuint8-t-1

* Run qmk-format on core C files touched in this branch

Co-authored-by: Stefan Kerkmann <karlk90@pm.me>
2022-08-30 10:20:04 +02:00
..
gpio_extr.h
matrix.c
readme.md

Debug version matrix.c

This matrix.c is 0.13.19:quantum/matrix.c with the following additions:

  • Added the MATRIX_DEBUG_SCAN_{START/END} macro to measure the execution time of matrix_scan().
  • Added the MATRIX_DEBUG_DELAY_{START/END} macro to measure delay time.
  • Added the MATRIX_MUL_SELECT handling for symmetric70_proto.

Current performance

MCU delay type execution time
of
matrix_scan()
matrix scan rate
Pro Micro (16MHz) default 503us 1810 scans/sec
Pro Micro (16MHz) adaptive 383us 2320 scans/sec
Pro Micro (16MHz) fast adaptive 382us 2330 scans/sec
Proton C (72MHz) default 210us 4350 scans/sec
Proton C (72MHz) adaptive 76.4us 10600 scans/sec
Proton C (72MHz) fast adaptive 75.6us 10800 scans/sec

Compile

  • Set MATRIX_IO_DELAY value
    • make MTEST=mdelay0 handwired/symmetric70_proto/promicro/normal:default:flash
    • make MTEST=mdelay=1 handwired/symmetric70_proto/promicro/normal:default:flash
    • make MTEST=mdelay=2 handwired/symmetric70_proto/promicro/normal:default:flash
    • make MTEST=mdelay=3 handwired/symmetric70_proto/promicro/normal:default:flash
    • make MTEST=mdelay=4 handwired/symmetric70_proto/promicro/normal:default:flash
    • make MTEST=mdelay=5 handwired/symmetric70_proto/promicro/normal:default:flash
    • make MTEST=mdelay=10 handwired/symmetric70_proto/promicro/normal:default:flash
    • make MTEST=mdelay=20 handwired/symmetric70_proto/promicro/normal:default:flash
    • make MTEST=mdelay=30 handwired/symmetric70_proto/promicro/normal:default:flash
  • Measure the execution time of matrix_scan()
    • make MTEST=matrix_debug_scan[,<other options>..] handwired/symmetric70_proto/promicro/normal:default:flash
  • Measure delay time.
    • make MTEST=matrix_debug_delay[,<other options>..] handwired/symmetric70_proto/promicro/normal:default:flash
  • Change the behavior of delay
    • make MTEST=matrix_debug_delay,always_delay handwired/symmetric70_proto/promicro/normal:default:flash
    • make MTEST=matrix_debug_delay,adaptive_delay,mdelay0 handwired/symmetric70_proto/promicro/normal:default:flash
    • make MTEST=matrix_debug_delay,adaptive_delay_fast,mdelay0 handwired/symmetric70_proto/promicro/normal:default:flash

Measurement result

Pro Micro (ATmega32u4 16Mhz)

Default setting (show matrix_scan() time)

  • make MTEST=matrix_debug_scan handwired/symmetric70_proto/promicro/normal:default:flash
  • CH1: Row 0
  • CH2: Row 1
  • CH3: Row 4
  • CH4: matrix_scan()
  • Execution time of matrix_scan() 503us
  • Frequency of matrix scan 1.81kHz (551.0us)
    DS1Z_QuickPrint2

Always call matrix_output_unselect_delay() (show matrix_scan() time, default MATRIX_IO_DELAY)

  • make MTEST=matrix_debug_scan,always_delay handwired/symmetric70_proto/promicro/normal:default:flash
  • CH1: Row 0
  • CH2: Row 1
  • CH3: Row 4
  • CH4: matrix_scan()
  • Execution time of matrix_scan() 521us
  • Frequency of matrix scan 1.76kHz (568.5us)
    DS1Z_QuickPrint1

Adaptive delay (show matrix_scan() time, MATRIX_IO_DELAY = 0)

  • make MTEST=matrix_debug_scan,mdelay0,adaptive_delay handwired/symmetric70_proto/promicro/normal:default:flash
  • CH1: Row 0
  • CH2: Row 1
  • CH3: Row 4
  • CH4: matrix_scan()
  • Execution time of matrix_scan() 383us
  • Frequency of matrix scan 2.32kHz (431us)
    DS1Z_QuickPrint3

Adaptive delay (show delay time, MATRIX_IO_DELAY = 0)

  • make MTEST=matrix_debug_delay,mdelay0,adaptive_delay handwired/symmetric70_proto/promicro/normal:default:flash
Press R0C1, R1C1 key
  • CH1: Row 0
  • CH2: Row 1
  • CH3: Row 4
  • CH4: delay time
  • Delay time 68us
  • Frequency of matrix scan 1.77kHz (565us)
    DS1Z_QuickPrint55

Fast adaptive delay (show matrix_scan() time, MATRIX_IO_DELAY = 0)

  • make MTEST=matrix_debug_scan,mdelay0,adaptive_delay_fast handwired/symmetric70_proto/promicro/normal:default:flash
  • CH1: Row 0
  • CH2: Row 1
  • CH3: Row 4
  • CH4: matrix_scan()
  • Execution time of matrix_scan() 382us
  • Frequency of matrix scan 2.33kHz (428us)
    DS1Z_QuickPrint56

Fast adaptive delay (show delay time, MATRIX_IO_DELAY = 0)

  • make MTEST=matrix_debug_delay,mdelay0,adaptive_delay_fast handwired/symmetric70_proto/promicro/normal:default:flash
Press R0C1, R1C1 key
  • CH1: Row 0
  • CH2: Row 1
  • CH3: Row 4
  • CH4: delay time
  • Delay time 11us
  • Frequency of matrix scan 2.21kHz (452us)
    DS1Z_QuickPrint57

Proton C (STM32F303 72MHz)

Default setting (show matrix_scan() time)

  • make MTEST=matrix_debug_scan handwired/symmetric70_proto/proton_c/normal:default:flash
  • CH1: Row 0
  • CH2: Row 1
  • CH3: Row 4
  • CH4: matrix_scan()
  • Execution time of matrix_scan() 210us
  • Frequency of matrix scan 4.35kHz (230.0us)
    DS1Z_QuickPrint16

Always call matrix_output_unselect_delay() (show matrix_scan() time, default MATRIX_IO_DELAY)

  • make MTEST=matrix_debug_scan,always_delay handwired/symmetric70_proto/proton_c/normal:default:flash
  • CH1: Row 0
  • CH2: Row 1
  • CH3: Row 4
  • CH4: matrix_scan()
  • Execution time of matrix_scan() 242us
  • Frequency of matrix scan 3.85kHz (260.0us)
    DS1Z_QuickPrint17

Adaptive delay (show matrix_scan() time, MATRIX_IO_DELAY = 0)

  • make MTEST=matrix_debug_scan,mdelay0,adaptive_delay handwired/symmetric70_proto/proton_c/normal:default:flash
  • CH1: Row 0
  • CH2: Row 1
  • CH3: Row 4
  • CH4: matrix_scan()
  • Execution time of matrix_scan() 76.4us
  • Frequency of matrix scan 10.6kHz (94.4us)
    DS1Z_QuickPrint18

Adaptive delay (show delay time, MATRIX_IO_DELAY = 0)

  • make MTEST=matrix_debug_delay,mdelay0,adaptive_delay handwired/symmetric70_proto/proton_c/normal:default:flash
Press R0C1, R1C1 key
  • CH1: Row 0
  • CH2: Row 1
  • CH3: Row 4
  • CH4: delay time
  • Delay time 7.6us
  • Frequency of matrix scan 9.47kHz (105.6us)
    DS1Z_QuickPrint58
Connect a 500pF capacitor between C2 line and GND, Press R0C2, R1C2, R2C2, R3C2, R4C2 keys
  • CH1: Row 0
  • CH2: Row 1
  • CH3: Col 2
  • CH4: delay time
  • Delay time 12us + alpha
  • Frequency of matrix scan 5.45kHz (183us)
  • Threshold Voltage 1.9V
    DS1Z_QuickPrint59
Connect a 1000pF capacitor between C2 line and GND, Press R0C2, R1C2, R2C2, R3C2, R4C2 keys
  • CH1: Row 0
  • CH2: Row 1
  • CH3: Col 2
  • CH4: delay time
  • Delay time 20us + alpha
  • Frequency of matrix scan 4.48kHz (223us)
  • Threshold Voltage 1.9V
    DS1Z_QuickPrint60

Fast adaptive delay (show matrix_scan() time, MATRIX_IO_DELAY = 0)

  • make MTEST=matrix_debug_scan,mdelay0,adaptive_delay_fast handwired/symmetric70_proto/proton_c/normal:default:flash
  • CH1: Row 0
  • CH2: Row 1
  • CH3: Row 4
  • CH4: matrix_scan()
  • Execution time of matrix_scan() 75.6us
  • Frequency of matrix scan 10.8kHz (92.2us)
    DS1Z_QuickPrint62

Fast adaptive delay (show delay time, MATRIX_IO_DELAY = 0)

  • make MTEST=matrix_debug_delay,mdelay0,adaptive_delay_fast handwired/symmetric70_proto/proton_c/normal:default:flash
Press R0C1, R1C1 key
  • CH1: Row 0
  • CH2: Row 1
  • CH3: Row 4
  • CH4: delay time
  • Delay time 1.6us
  • Frequency of matrix scan 10.6kHz (94.4us)
    DS1Z_QuickPrint63 DS1Z_QuickPrint64
Connect a 500pF capacitor between C2 line and GND, Press R0C2, R1C2, R2C2, R3C2, R4C2 keys
  • CH1: Row 0
  • CH2: Row 1
  • CH3: Col 2
  • CH4: delay time
  • Delay time 13.2us
  • Frequency of matrix scan 6.58kHz (152.6us)
  • Threshold Voltage 1.9V
    DS1Z_QuickPrint65
Connect a 1000pF capacitor between C2 line and GND, Press R0C2, R1C2, R2C2, R3C2, R4C2 keys
  • CH1: Row 0
  • CH2: Row 1
  • CH3: Col 2
  • CH4: delay time
  • Delay time 20us
  • Frequency of matrix scan 5.30kHz (188.8us)
  • Threshold Voltage 1.9V
    DS1Z_QuickPrint66