summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack Halpin <jack.halpin@gmail.com>2010-02-15 19:29:47 +0000
committerJack Halpin <jack.halpin@gmail.com>2010-02-15 19:29:47 +0000
commit3a60a6aa23fd441b6405b424cf311c1d765584cc (patch)
treeeda7a07aea05a84fa1786188b8657768f8670c06
parent51a8be1a0f11d329af99bf9c33a61af11d7a43ed (diff)
downloadrockbox-3a60a6aa23fd441b6405b424cf311c1d765584cc.zip
rockbox-3a60a6aa23fd441b6405b424cf311c1d765584cc.tar.gz
rockbox-3a60a6aa23fd441b6405b424cf311c1d765584cc.tar.bz2
rockbox-3a60a6aa23fd441b6405b424cf311c1d765584cc.tar.xz
Sansa Clip+: Implement button driver.
Initial button driver for clip+. I've followed the steps the OF uses to read the buttons. There is no hold button on the clip+ so for now calling button_hold() siply returns false. The OF actually sets an additional flag for the 2nd read from D6 and not BUTTON_POWER as I have done here. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@24669 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/target/arm/as3525/sansa-clipplus/button-clip.c74
1 files changed, 73 insertions, 1 deletions
diff --git a/firmware/target/arm/as3525/sansa-clipplus/button-clip.c b/firmware/target/arm/as3525/sansa-clipplus/button-clip.c
index 52917cc..9365c4a 100644
--- a/firmware/target/arm/as3525/sansa-clipplus/button-clip.c
+++ b/firmware/target/arm/as3525/sansa-clipplus/button-clip.c
@@ -27,7 +27,79 @@ void button_init_device(void)
{
}
+bool button_hold(void)
+{
+ /* TODO OF uses long home(A1) press. Just return false for now */
+ return false;
+}
+
int button_read_device(void)
{
- return 0;
+ static int buttons = 0;
+
+ /* Set pins to input for reading buttons */
+ GPIOC_DIR = 0; /* All C pins input */
+ GPIOA_DIR &= ~(1<<1|1<<6|1<<7); /* Pins A1,A6,A7 input */
+ /* OF does not set D6 to input */
+
+ /* TODO No hold button Hold toggled by long home(A1) press in OF */
+ if(button_hold())
+ {
+ return 0;
+ }
+ /* Buttons do not appear to need reset */
+ /* D6 needs special handling though */
+
+ GPIOB_DIR |= (1<<0); /* Pin B0 set output */
+ GPIOB_PIN(0) = 1; /* set B0 */
+
+ int delay = 500;
+ do {
+ asm volatile("nop\n");
+ } while (delay--);
+
+ if GPIOD_PIN(6) /* read D6 */
+ buttons |= BUTTON_POWER;
+
+ GPIOB_PIN(0) = 0; /* unset B0 */
+
+ delay = 240;
+ do {
+ asm volatile("nop\n");
+ } while (delay--);
+
+ if GPIOA_PIN(1)
+ buttons |= BUTTON_HOME;
+ if GPIOA_PIN(6)
+ buttons |= BUTTON_VOL_DOWN;
+ if GPIOA_PIN(7)
+ buttons |= BUTTON_VOL_UP;
+ if GPIOC_PIN(2)
+ buttons |= BUTTON_UP;
+ if GPIOC_PIN(3)
+ buttons |= BUTTON_LEFT;
+ if GPIOC_PIN(4)
+ buttons |= BUTTON_SELECT;
+ if GPIOC_PIN(5)
+ buttons |= BUTTON_RIGHT;
+ if GPIOC_PIN(1)
+ buttons |= BUTTON_DOWN;
+
+ /* TODO figure out why OF does this */
+ if (buttons & BUTTON_POWER)
+ {
+ GPIOB_DIR |= (1<<6); /* Pin B6 output */
+
+ delay = 8;
+ do {
+ asm volatile("nop\n");
+ } while (delay--);
+
+ if GPIOD_PIN(6)
+ buttons |= BUTTON_POWER; /* OF sets a different flag than PWR */
+ }
+
+ return buttons;
}
+
+