X-Git-Url: https://hackdaworld.org/gitweb/?p=my-code%2Farm.git;a=blobdiff_plain;f=betty%2Fbuttons.c;fp=betty%2Fbuttons.c;h=9eb99b5ac5ed0016a32e9b9e16e82503e94dceb0;hp=15298a36e2772b9d0b573ea0a200f261d22aaf37;hb=98d1a9b9cbb24b2b182cf86ed2520d398959ec44;hpb=3e71335a4e10e6588b6541e8d26276ba9e5289d4 diff --git a/betty/buttons.c b/betty/buttons.c index 15298a3..9eb99b5 100644 --- a/betty/buttons.c +++ b/betty/buttons.c @@ -7,11 +7,11 @@ #include "buttons.h" -void button_init(void) { +void button_init(t_button *button) { /* * select as input the following pins - * - p0.30 : interrupt, wtf is the 'vw 3 p9'? + * - p0.30 : interrupt! wtf is the 'vw 3 p9'? * - p0.28, p0.27, p3.21, p3.20, p0.22, p0.13 : column select * * select as output @@ -24,38 +24,61 @@ void button_init(void) { 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) { + } + else if(button->mode&BUTTON_POLL) { + } } +void button_set_retries(t_button *button,int retries) { + + button->retries=retries; +} + +#define BUTTON_RESET \ + IOSET2=((1<<18)|(1<<19)|(1<<20)|(1<<21)|(1<<22)|(1<<23)|(1<<24)) + 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) { +#define COUNT_AND_CHECK cnt++; \ + if(cnt==BUTTON_MAX) \ + break + +u8 button_get_event(t_button *button) { u8 row; u8 offset; u8 cnt; u32 port0,port3; + u8 retries; - *keys=0; cnt=0; + retries=button->retries; while(retries--) { - /* rest counter */ + /* rest offset counter */ offset=0; /* rows */ for(row=0;row<7;row++) { @@ -63,37 +86,40 @@ 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; } + BUTTON_RESET; + button->cnt=cnt; + return cnt; }