Some simplifications
This commit is contained in:
parent
2e1b7444e2
commit
d72fca14fc
1 changed files with 55 additions and 37 deletions
88
ardkbd.c
88
ardkbd.c
|
@ -36,41 +36,58 @@ static inline bool kbd_clock() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline void kbd_clock_down() {
|
||||||
|
DDRC |= 0x02;
|
||||||
|
PORTC &= ~0x02;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void kbd_clock_in() {
|
||||||
|
DDRC &= ~0x02;
|
||||||
|
PORTC |= 0x02;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void kbd_data_set(bool state) {
|
||||||
|
if (state)
|
||||||
|
PORTC |= 0x01;
|
||||||
|
else
|
||||||
|
PORTC &= ~0x01;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void kbd_data_out() {
|
||||||
|
DDRC |= 0x01;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void kbd_data_in() {
|
||||||
|
DDRC &= ~0x01;
|
||||||
|
PORTC |= 0x01;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline void kbd_wait() {
|
||||||
|
while (kbd_state) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
ISR(PCINT1_vect) {
|
ISR(PCINT1_vect) {
|
||||||
if (kbd_clock())
|
if (kbd_clock())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (kbd_state < 0) {
|
if (kbd_state < 0) {
|
||||||
if (kbd_state >= -8) {
|
if (kbd_state >= -8) {
|
||||||
if (kbd_output & (1 << (-1-kbd_state)))
|
kbd_data_set(kbd_output & _BV(-1-kbd_state));
|
||||||
PORTC |= 0x01;
|
|
||||||
else
|
|
||||||
PORTC &= ~0x01;
|
|
||||||
|
|
||||||
kbd_state--;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
else if (kbd_state == -9) {
|
||||||
if (kbd_state == -9) {
|
kbd_data_set(!(__builtin_popcount(kbd_output) & 1));
|
||||||
if ((__builtin_popcount(kbd_output) & 1) == 0)
|
|
||||||
PORTC |= 0x01;
|
|
||||||
else
|
|
||||||
PORTC &= ~0x01;
|
|
||||||
|
|
||||||
kbd_state--;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
else if (kbd_state == -10) {
|
||||||
if (kbd_state == -10) {
|
kbd_data_in();
|
||||||
kbd_state--;
|
|
||||||
|
|
||||||
DDRC &= ~0x01;
|
|
||||||
PORTC |= 0x01;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
kbd_state = 0;
|
kbd_state = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
kbd_state--;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,7 +103,8 @@ ISR(PCINT1_vect) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (kbd_state <= 8) {
|
if (kbd_state <= 8) {
|
||||||
kbd_input |= (data << (kbd_state-1));
|
if (data)
|
||||||
|
kbd_input |= _BV(kbd_state-1);
|
||||||
kbd_state++;
|
kbd_state++;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -139,26 +157,26 @@ ISR(PCINT1_vect) {
|
||||||
|
|
||||||
|
|
||||||
void kbd_send(uint8_t command) {
|
void kbd_send(uint8_t command) {
|
||||||
while (kbd_state) {} /* wait for idle */
|
kbd_wait();
|
||||||
|
|
||||||
DDRC |= 0x02;
|
kbd_clock_down();
|
||||||
PORTC &= ~0x02;
|
|
||||||
_delay_us(100);
|
_delay_us(100);
|
||||||
|
|
||||||
DDRC |= 0x01;
|
kbd_data_out();
|
||||||
PORTC &= ~0x01;
|
kbd_data_set(false);
|
||||||
_delay_us(10);
|
_delay_us(10);
|
||||||
|
|
||||||
DDRC &= ~0x02;
|
kbd_clock_in();
|
||||||
PORTC |= 0x02;
|
|
||||||
|
|
||||||
kbd_output = command;
|
kbd_output = command;
|
||||||
kbd_state = -1;
|
kbd_state = -1;
|
||||||
|
|
||||||
/* wait for idle */
|
kbd_wait();
|
||||||
while (kbd_state) {}
|
|
||||||
|
/* wait for ack */
|
||||||
while (!kbd_state) {}
|
while (!kbd_state) {}
|
||||||
while (kbd_state) {}
|
|
||||||
|
kbd_wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Reference in a new issue