X-Git-Url: https://hackdaworld.org/gitweb/?p=my-code%2Farm.git;a=blobdiff_plain;f=betty%2Fbuttons.c;h=735befdf46cf3f17b1e7707b19f0bce9adc2d838;hp=15298a36e2772b9d0b573ea0a200f261d22aaf37;hb=HEAD;hpb=f67e07f664916d773bc0be3d3eada848fbaaf814 diff --git a/betty/buttons.c b/betty/buttons.c index 15298a3..735befd 100644 --- a/betty/buttons.c +++ b/betty/buttons.c @@ -7,55 +7,60 @@ #include "buttons.h" -void button_init(void) { +#define BUTTON_RESET \ + IOSET2=((1<<18)|(1<<19)|(1<<20)|(1<<21)|(1<<22)|(1<<23)|(1<<24)) - /* - * select as input the following pins - * - p0.30 : interrupt, wtf is the 'vw 3 p9'? - * - p0.28, p0.27, p3.21, p3.20, p0.22, p0.13 : column select +#define BUTTON_UNSET \ + IOCLR2=((1<<18)|(1<<19)|(1<<20)|(1<<21)|(1<<22)|(1<<23)|(1<<24)) + +#define COUNT_AND_CHECK cnt++; \ + if(cnt==BUTTON_MAX) \ + break + +void button_init(t_button *button) { + + /* + * input: + * - p0.30 : interrupt! wtf is the 'vw 3 p9'? a transistor? + * - p0.28, p0.27, p3.21, p3.20, p0.22, p0.13 : the columns * - * select as output + * output: * - p2.18-p2.24 : the rows */ - // gpio, as is: p3.20, p3.21 - PINSEL1&=~((1<<29)|(1<<28)); // p0.30 - PINSEL1&=~((1<<25)|(1<<24)); // p0.28 - PINSEL1&=~((1<<23)|(1<<22)); // p0.27 - PINSEL1&=~((1<<13)|(1<<12)); // p0.22 - PINSEL0&=~((1<<27)|(1<<26)); // p0.13 - // ctrl databus for p2.18 - p2.24 - PINSEL2&=(PINSEL2&(~((1<<5)|(1<<4))))|(1<<4); - // ctrl addr bus for p3.20, p3.21 - PINSEL2=(PINSEL2&(~((1<<27)|(1<<26)|(1<<25))))|(1<<27)|(1<<26); - // input - IODIR0&=~((1<<30)|(1<<28)|(1<<27)|(1<<22)|(1<<13)); - IODIR3&=~((1<<21)|(1<<20)); - // output + pull them high - IODIR2|=((1<<18)|(1<<19)|(1<<20)|(1<<21)|(1<<22)|(1<<23)|(1<<24)); - IOSET2=((1<<18)|(1<<19)|(1<<20)|(1<<21)|(1<<22)|(1<<23)|(1<<24)); + /* poll / interrupt mode */ + if(button->mode&BUTTON_INT) + BUTTON_UNSET; + else if(button->mode&BUTTON_POLL) + BUTTON_RESET; +} + +void button_set_retries(t_button *button,int retries) { + + button->retries=retries; } void button_select_row(u8 row) { - IOSET2=((1<<18)|(1<<19)|(1<<20)|(1<<21)|(1<<22)|(1<<23)|(1<<24)); + BUTTON_RESET; if(row>6) return; IOCLR2=(1<<(18+row)); } -u8 button_get_event(u64 *keys,int retries) { +u8 button_get_event(t_button *button) { u8 row; u8 offset; u8 cnt; u32 port0,port3; + u8 tries; - *keys=0; cnt=0; + tries=button->retries+1; - while(retries--) { - /* rest counter */ + while(tries--) { + /* rest offset counter */ offset=0; /* rows */ for(row=0;row<7;row++) { @@ -63,37 +68,42 @@ u8 button_get_event(u64 *keys,int retries) { button_select_row(row); /* scan the columns 6 */ port0=IOPIN0; - port3=IOPIN2; + port3=IOPIN3; if(!(port0&(1<<28))) { - *keys|=(1<<(offset+0)); - cnt+=1; + button->key[cnt]=offset+0; + COUNT_AND_CHECK; } if(!(port0&(1<<27))) { - *keys|=(1<<(offset+1)); - cnt+=1; + button->key[cnt]=offset+1; + COUNT_AND_CHECK; } if(!(port0&(1<<22))) { - *keys|=(1<<(offset+2)); - cnt+=1; + button->key[cnt]=offset+2; + COUNT_AND_CHECK; } if(!(port0&(1<<13))) { - *keys|=(1<<(offset+3)); - cnt+=1; + button->key[cnt]=offset+3; + COUNT_AND_CHECK; } if(!(port3&(1<<21))) { - *keys|=(1<<(offset+4)); - cnt+=1; + button->key[cnt]=offset+4; + COUNT_AND_CHECK; } if(!(port3&(1<<20))) { - *keys|=(1<<(offset+5)); - cnt+=1; + button->key[cnt]=offset+5; + COUNT_AND_CHECK; } offset+=6; } - if(*keys) + if(cnt) break; } + if(button->mode&BUTTON_INT) + BUTTON_UNSET; + else if(button->mode&BUTTON_POLL) + BUTTON_RESET; + return cnt; }