void kbd_scan() { int b, i; for (b = 0; b < data.nbanks; b++) { int bank = data.banks[b]; gpio_clear(bank); delay(100); for (i = 0; i < data.ninputs; i++) { int input = data.inputs[i]; int key = b * data.ninputs + i; int byte = key / 32; int bit = key % 32; unsigned int state = data.keystates[byte] & (1 << bit); if (gpio_level(input) == 0) { if (!state) { data.onevent(KEY_DOWN, key); data.keystates[byte] |= (1 << bit); } } else { if (state) { data.onevent(KEY_UP, key); data.keystates[byte] &= ~(1 << bit); } } } gpio_set(bank); } }
void startc ( void ) { gpio_fsel(gpio47, GPIO_FN_OUTPUT); gpio_fsel(gpio23, GPIO_FN_OUTPUT); gpio_fsel(gpio24, GPIO_FN_INPUT); while(1) { gpio_set(gpio47); enum { HIGH = 1 }; if (gpio_level(gpio24) == HIGH) { gpio_set(gpio23); } else { gpio_clear(gpio23); } for (volatile int busy=0; busy<0x400000; busy++); gpio_clear(gpio47); for (volatile int busy=0; busy<0x400000; busy++); } }