2 * buttons.c - button api
4 * author: hackbard@hackdaworld.org
10 void button_init(t_button *button) {
13 * select as input the following pins
14 * - p0.30 : interrupt! wtf is the 'vw 3 p9'?
15 * - p0.28, p0.27, p3.21, p3.20, p0.22, p0.13 : column select
18 * - p2.18-p2.24 : the rows
21 // gpio, as is: p3.20, p3.21
22 PINSEL1&=~((1<<29)|(1<<28)); // p0.30
23 PINSEL1&=~((1<<25)|(1<<24)); // p0.28
24 PINSEL1&=~((1<<23)|(1<<22)); // p0.27
25 PINSEL1&=~((1<<13)|(1<<12)); // p0.22
26 PINSEL0&=~((1<<27)|(1<<26)); // p0.13
28 // ctrl databus for p2.18 - p2.24
29 PINSEL2=(PINSEL2&P2MASK&~((1<<5)|(1<<4)))|(1<<4);
31 // ctrl addr bus for p3.20, p3.21
32 PINSEL2=(PINSEL2&P2MASK&~((1<<27)|(1<<26)|(1<<25)))|(1<<27)|(1<<26);
35 IODIR0&=~((1<<30)|(1<<28)|(1<<27)|(1<<22)|(1<<13));
36 IODIR3&=~((1<<21)|(1<<20));
38 // output + pull them high
39 IODIR2|=((1<<18)|(1<<19)|(1<<20)|(1<<21)|(1<<22)|(1<<23)|(1<<24));
40 IOSET2=((1<<18)|(1<<19)|(1<<20)|(1<<21)|(1<<22)|(1<<23)|(1<<24));
42 /* poll / interrupt mode */
43 if(button->mode&BUTTON_INT) {
45 else if(button->mode&BUTTON_POLL) {
49 void button_set_retries(t_button *button,int retries) {
51 button->retries=retries;
54 #define BUTTON_RESET \
55 IOSET2=((1<<18)|(1<<19)|(1<<20)|(1<<21)|(1<<22)|(1<<23)|(1<<24))
57 void button_select_row(u8 row) {
65 #define COUNT_AND_CHECK cnt++; \
69 u8 button_get_event(t_button *button) {
78 retries=button->retries;
81 /* rest offset counter */
84 for(row=0;row<7;row++) {
86 button_select_row(row);
87 /* scan the columns 6 */
90 if(!(port0&(1<<28))) {
91 button->key[cnt]=offset+0;
94 if(!(port0&(1<<27))) {
95 button->key[cnt]=offset+1;
98 if(!(port0&(1<<22))) {
99 button->key[cnt]=offset+2;
102 if(!(port0&(1<<13))) {
103 button->key[cnt]=offset+3;
106 if(!(port3&(1<<21))) {
107 button->key[cnt]=offset+4;
110 if(!(port3&(1<<20))) {
111 button->key[cnt]=offset+5;