projects
/
my-code
/
arm.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
added some functions usually served by libc
[my-code/arm.git]
/
betty
/
buttons.c
diff --git
a/betty/buttons.c
b/betty/buttons.c
index
ba76f8d
..
21efe01
100644
(file)
--- a/
betty/buttons.c
+++ b/
betty/buttons.c
@@
-7,11
+7,11
@@
#include "buttons.h"
#include "buttons.h"
-void button_init(
void
) {
+void button_init(
t_button *button
) {
/*
* select as input the following pins
/*
* 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
* - p0.28, p0.27, p3.21, p3.20, p0.22, p0.13 : column select
*
* select as output
@@
-24,36
+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
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
// ctrl databus for p2.18 - p2.24
- PINSEL2&=(PINSEL2&(~((1<<5)|(1<<4))))|(1<<4);
+ PINSEL2=(PINSEL2&P2MASK&~((1<<5)|(1<<4)))|(1<<4);
+
+ // ctrl addr bus for p3.20, p3.21
+ PINSEL2=(PINSEL2&P2MASK&~((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));
// 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));
// 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) {
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));
}
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 row;
u8 offset;
u8 cnt;
u32 port0,port3;
+ u8 retries;
- *keys=0;
cnt=0;
cnt=0;
+ retries=button->retries;
while(retries--) {
while(retries--) {
- /* rest counter */
+ /* rest
offset
counter */
offset=0;
/* rows */
for(row=0;row<7;row++) {
offset=0;
/* rows */
for(row=0;row<7;row++) {
@@
-61,37
+86,40
@@
u8 button_get_event(u64 *keys,int retries) {
button_select_row(row);
/* scan the columns 6 */
port0=IOPIN0;
button_select_row(row);
/* scan the columns 6 */
port0=IOPIN0;
- port3=IOPIN
2
;
+ port3=IOPIN
3
;
if(!(port0&(1<<28))) {
if(!(port0&(1<<28))) {
-
*keys|=(1<<(offset+0))
;
-
cnt+=1
;
+
button->key[cnt]=offset+0
;
+
COUNT_AND_CHECK
;
}
if(!(port0&(1<<27))) {
}
if(!(port0&(1<<27))) {
-
*keys|=(1<<(offset+1))
;
-
cnt+=1
;
+
button->key[cnt]=offset+1
;
+
COUNT_AND_CHECK
;
}
if(!(port0&(1<<22))) {
}
if(!(port0&(1<<22))) {
-
*keys|=(1<<(offset+2))
;
-
cnt+=1
;
+
button->key[cnt]=offset+2
;
+
COUNT_AND_CHECK
;
}
if(!(port0&(1<<13))) {
}
if(!(port0&(1<<13))) {
-
*keys|=(1<<(offset+3))
;
-
cnt+=1
;
+
button->key[cnt]=offset+3
;
+
COUNT_AND_CHECK
;
}
if(!(port3&(1<<21))) {
}
if(!(port3&(1<<21))) {
-
*keys|=(1<<(offset+4))
;
-
cnt+=1
;
+
button->key[cnt]=offset+4
;
+
COUNT_AND_CHECK
;
}
if(!(port3&(1<<20))) {
}
if(!(port3&(1<<20))) {
-
*keys|=(1<<(offset+5))
;
-
cnt+=1
;
+
button->key[cnt]=offset+5
;
+
COUNT_AND_CHECK
;
}
offset+=6;
}
}
offset+=6;
}
- if(
*keys
)
+ if(
cnt
)
break;
}
break;
}
+ BUTTON_RESET;
+ button->cnt=cnt;
+
return cnt;
}
return cnt;
}