Button driver for Logik DAX, plus some changes to the debug info displayed in the bootloader build.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15396 a1c6a512-1295-4272-9138-f99709370657
diff --git a/bootloader/telechips.c b/bootloader/telechips.c
index c1dcda0..83dad70 100644
--- a/bootloader/telechips.c
+++ b/bootloader/telechips.c
@@ -32,6 +32,7 @@
 #include "fat.h"
 #include "disk.h"
 #include "font.h"
+#include "button.h"
 #include "adc.h"
 #include "adc-target.h"
 #include "backlight-target.h"
@@ -46,8 +47,10 @@
 
 void* main(void)
 {
-    unsigned short button;
-    int gpioa;
+    int button;
+    int power_count = 0;
+    int count = 0;
+    bool do_power_off = false;
 
     system_init();
     adc_init();
@@ -56,17 +59,36 @@
 
     __backlight_on();
 
-    while(1) {
+    while(!do_power_off) {
         line = 0;
         printf("Hello World!");
 
-        gpioa = GPIOA;
-        printf("GPIOA: 0x%08x",gpioa);
+        button = button_read_device();
 
-        button = adc_read(ADC_BUTTONS);
-        printf("ADC[0]: 0x%04x",button);
+        /* Power-off if POWER button has been held for a long time
+           This loop is currently running at about 100 iterations/second
+         */
+        if (button & BUTTON_POWERPLAY) {
+            power_count++;
+            if (power_count > 200)
+               do_power_off = true;
+        } else {
+            power_count = 0;
+        }
+
+        printf("Btn: 0x%08x",button);
+
+        count++;
+        printf("Count: %d",count);
     }
 
+    lcd_clear_display();
+    line = 0;
+    printf("POWER-OFF");
+
+    /* TODO: Power-off */
+    while(1);
+
     return 0;
 }
 
diff --git a/firmware/SOURCES b/firmware/SOURCES
index 5061ac7..94b9897 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -821,6 +821,7 @@
 target/arm/tcc77x/adc-tcc77x.c
 target/arm/tcc77x/ata-nand-tcc77x.c
 target/arm/tcc77x/system-tcc77x.c
+target/arm/tcc77x/logikdax/button-logikdax.c
 target/arm/tcc77x/logikdax/lcd-logikdax.c
 target/arm/tcc77x/logikdax/power-logikdax.c
 #endif /* SIMULATOR */
diff --git a/firmware/export/config-logikdax.h b/firmware/export/config-logikdax.h
index 384dac4..8c6509c 100644
--- a/firmware/export/config-logikdax.h
+++ b/firmware/export/config-logikdax.h
@@ -49,6 +49,9 @@
 /* define this if you have RTC RAM available for settings */
 //#define HAVE_RTC_RAM
 
+/* Define this if you have a software controlled poweroff */
+#define HAVE_SW_POWEROFF
+
 /* The number of bytes reserved for loadable plugins */
 #define PLUGIN_BUFFER_SIZE 0x8000
 
diff --git a/firmware/target/arm/tcc77x/logikdax/button-logikdax.c b/firmware/target/arm/tcc77x/logikdax/button-logikdax.c
new file mode 100644
index 0000000..8e4279b
--- /dev/null
+++ b/firmware/target/arm/tcc77x/logikdax/button-logikdax.c
@@ -0,0 +1,98 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2007 by Dave Chapman
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#include "config.h"
+#include "cpu.h"
+#include "button.h"
+#include "adc.h"
+
+/* 
+
+Results of button testing:
+
+HOLD:  GPIOA & 0x0002 (0=pressed, 0x0002 = released)
+POWER: GPIOA & 0x8000 (0=pressed, 0x8000 = released)
+
+ADC[0]: (approx values)
+
+RIGHT - 0x37
+LEFT  - 0x7f
+JOYSTICK PRESS - 0xc7
+UP             - 0x11e
+DOWN           - 0x184
+MODE           - 0x1f0/0x1ff
+PRESET         - 0x268/0x269
+REC            - 0x2dd
+
+Values of ADC[0] tested in OF disassembly: 0x50, 0x96, 0xdc, 0x208, 0x384
+
+*/
+
+void button_init_device(void)
+{
+    /* Nothing to do */
+}
+
+int button_read_device(void)
+{
+    int btn = BUTTON_NONE;
+    int adc;
+ 
+    adc = adc_read(ADC_BUTTONS);
+
+    if (adc < 0x384) {
+        if (adc < 0x140) {
+            if (adc < 0x96) {
+                if (adc < 0x50) {
+                    btn |= BUTTON_RIGHT;      /* 0x00..0x4f */
+                } else {
+                    btn |= BUTTON_LEFT;       /* 0x50..0x95 */
+                }
+            } else {
+                if (adc < 0xe0) {
+                    btn |= BUTTON_SELECT;     /* 0x96..0xdf */
+                } else {
+                    btn |= BUTTON_UP;         /* 0xe0..0x13f */
+                }
+            }
+        } else {
+            if (adc < 0x208) {
+                if (adc < 0x1b0) {
+                    btn |= BUTTON_DOWN;       /* 0x140..0x1af */
+                } else {
+                    btn |= BUTTON_MODE;       /* 0x1b0..0x207 */
+                }
+            } else {
+                if (adc < 0x290) {
+                    btn |= BUTTON_PRESET;     /* 0x208..0x28f */
+                } else {
+                    btn |= BUTTON_REC;        /* 0x290..0x383 */
+                }
+            }
+        }
+    }
+
+    if (!(GPIOA & 0x2))
+        btn |= BUTTON_HOLD;
+
+    if (!(GPIOA & 0x8000))
+        btn |= BUTTON_POWERPLAY;
+
+    return btn;
+}
diff --git a/firmware/target/arm/tcc77x/logikdax/button-target.h b/firmware/target/arm/tcc77x/logikdax/button-target.h
index 2925a42..46997fc 100644
--- a/firmware/target/arm/tcc77x/logikdax/button-target.h
+++ b/firmware/target/arm/tcc77x/logikdax/button-target.h
@@ -23,29 +23,6 @@
 #include <stdbool.h>
 #include "config.h"
 
-/* 
-
-Results of button testing:
-
-HOLD:  GPIOA & 0x0002 (0=pressed, 0x0002 = released)
-POWER: GPIOA & 0x8000 (0=pressed, 0x8000 = released)
-
-ADC[0]: (approx values)
-
-RIGHT - 0x37
-LEFT  - 0x7f
-JOYSTICK PRESS - 0xc7
-UP             - 0x11e
-DOWN           - 0x184
-MODE           - 0x1f0/0x1ff
-PRESET         - 0x268/0x269
-TIMESHIFT      - 0x2dd
-
-Values of ADC[0] tested in OF disassembly: 0x50, 0x96, 0xdc, 0x208, 0x384
-
-*/
-
-
 void button_init_device(void);
 int button_read_device(void);
 
@@ -66,5 +43,9 @@
                     |BUTTON_RIGHT|BUTTON_UP|BUTTON_DOWN|BUTTON_SELECT)
 
 #define BUTTON_REMOTE 0
+
+/* Software power-off */
+#define POWEROFF_BUTTON BUTTON_POWERPLAY
+#define POWEROFF_COUNT 40
                 
 #endif /* _BUTTON_TARGET_H_ */