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>
This commit is contained in:
		
							parent
							
								
									017aa5988a
								
							
						
					
					
						commit
						302b35c2a0
					
				
					 6 changed files with 109 additions and 8 deletions
				
			
		| 
						 | 
				
			
			@ -55,6 +55,9 @@ matrix_row_t matrix_get_row(uint8_t row);
 | 
			
		|||
/* print matrix for debug */
 | 
			
		||||
void matrix_print(void);
 | 
			
		||||
/* delay between changing matrix pin state and reading values */
 | 
			
		||||
void matrix_output_select_delay(void);
 | 
			
		||||
void matrix_output_unselect_delay(void);
 | 
			
		||||
/* only for backwards compatibility. delay between changing matrix pin state and reading values */
 | 
			
		||||
void matrix_io_delay(void);
 | 
			
		||||
 | 
			
		||||
/* power control */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,10 +6,62 @@
 | 
			
		|||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(__ARMEL__) || defined(__ARMEB__)
 | 
			
		||||
#    ifndef __OPTIMIZE__
 | 
			
		||||
#        pragma message "Compiler optimizations disabled; wait_cpuclock() won't work as designed"
 | 
			
		||||
#    endif
 | 
			
		||||
 | 
			
		||||
#    define wait_cpuclock(x) wait_cpuclock_allnop(x)
 | 
			
		||||
 | 
			
		||||
#    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"
 | 
			
		||||
 | 
			
		||||
__attribute__((always_inline))
 | 
			
		||||
static inline void wait_cpuclock_allnop(unsigned int n) { /* n: 1..135 */
 | 
			
		||||
    /* The argument n must be a constant expression.
 | 
			
		||||
     * That way, compiler optimization will remove unnecessary code. */
 | 
			
		||||
    if (n < 1) { return; }
 | 
			
		||||
    if (n > 8) {
 | 
			
		||||
        unsigned int n8 = n/8;
 | 
			
		||||
        n = n - n8*8;
 | 
			
		||||
        switch (n8) {
 | 
			
		||||
        case 16: asm volatile (CLOCK_DELAY_NOP8::: "memory");
 | 
			
		||||
        case 15: asm volatile (CLOCK_DELAY_NOP8::: "memory");
 | 
			
		||||
        case 14: asm volatile (CLOCK_DELAY_NOP8::: "memory");
 | 
			
		||||
        case 13: asm volatile (CLOCK_DELAY_NOP8::: "memory");
 | 
			
		||||
        case 12: asm volatile (CLOCK_DELAY_NOP8::: "memory");
 | 
			
		||||
        case 11: asm volatile (CLOCK_DELAY_NOP8::: "memory");
 | 
			
		||||
        case 10: asm volatile (CLOCK_DELAY_NOP8::: "memory");
 | 
			
		||||
        case  9: asm volatile (CLOCK_DELAY_NOP8::: "memory");
 | 
			
		||||
        case  8: asm volatile (CLOCK_DELAY_NOP8::: "memory");
 | 
			
		||||
        case  7: asm volatile (CLOCK_DELAY_NOP8::: "memory");
 | 
			
		||||
        case  6: asm volatile (CLOCK_DELAY_NOP8::: "memory");
 | 
			
		||||
        case  5: asm volatile (CLOCK_DELAY_NOP8::: "memory");
 | 
			
		||||
        case  4: asm volatile (CLOCK_DELAY_NOP8::: "memory");
 | 
			
		||||
        case  3: asm volatile (CLOCK_DELAY_NOP8::: "memory");
 | 
			
		||||
        case  2: asm volatile (CLOCK_DELAY_NOP8::: "memory");
 | 
			
		||||
        case  1: asm volatile (CLOCK_DELAY_NOP8::: "memory");
 | 
			
		||||
        case  0: break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    switch (n) {
 | 
			
		||||
    case 8: asm volatile ("nop"::: "memory");
 | 
			
		||||
    case 7: asm volatile ("nop"::: "memory");
 | 
			
		||||
    case 6: asm volatile ("nop"::: "memory");
 | 
			
		||||
    case 5: asm volatile ("nop"::: "memory");
 | 
			
		||||
    case 4: asm volatile ("nop"::: "memory");
 | 
			
		||||
    case 3: asm volatile ("nop"::: "memory");
 | 
			
		||||
    case 2: asm volatile ("nop"::: "memory");
 | 
			
		||||
    case 1: asm volatile ("nop"::: "memory");
 | 
			
		||||
    case 0: break;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(__AVR__)
 | 
			
		||||
#    include <util/delay.h>
 | 
			
		||||
#    define wait_ms(ms) _delay_ms(ms)
 | 
			
		||||
#    define wait_us(us) _delay_us(us)
 | 
			
		||||
#    define wait_cpuclock(x) __builtin_avr_delay_cycles(x)
 | 
			
		||||
#elif defined PROTOCOL_CHIBIOS
 | 
			
		||||
#    include <ch.h>
 | 
			
		||||
#    define wait_ms(ms)                     \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue