summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Arigo <markarigo@gmail.com>2008-06-27 18:40:25 +0000
committerMark Arigo <markarigo@gmail.com>2008-06-27 18:40:25 +0000
commit22e7bf32b894acc1f9e2820e213f05a57bd4148c (patch)
treecdecc7a9f0db0b41d7ac55680c2b3b2212ab4dda
parent78337961b72b76c410075a0d5fe6c3cf1269b5e8 (diff)
downloadrockbox-22e7bf32b894acc1f9e2820e213f05a57bd4148c.tar.gz
rockbox-22e7bf32b894acc1f9e2820e213f05a57bd4148c.tar.bz2
rockbox-22e7bf32b894acc1f9e2820e213f05a57bd4148c.zip
My Devcon 2008 contribution: port for Philips GoGear HDD1630 (PP5022-based). Current status is that the bootloader works to load Rockbox, but dual boot does not work: it freezes after decrypting the OF. When Rockbox boots, it freezes somewhere between showing the logo and the main menu. And there's no driver for the touchpad. So lots of work left.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17809 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/SOURCES2
-rw-r--r--apps/debug_menu.c3
-rwxr-xr-xapps/keymaps/keymap-hdd1630.c315
-rw-r--r--bootloader/SOURCES3
-rw-r--r--bootloader/main-pp.c4
-rw-r--r--firmware/SOURCES16
-rwxr-xr-xfirmware/export/config-hdd1630.h189
-rw-r--r--firmware/export/config.h4
-rw-r--r--firmware/export/usb.h3
-rw-r--r--firmware/target/arm/philips/hdd1630/adc-target.h39
-rwxr-xr-xfirmware/target/arm/philips/hdd1630/backlight-hdd1630.c49
-rwxr-xr-xfirmware/target/arm/philips/hdd1630/backlight-target.h36
-rwxr-xr-xfirmware/target/arm/philips/hdd1630/button-hdd1630.c65
-rwxr-xr-xfirmware/target/arm/philips/hdd1630/button-target.h53
-rwxr-xr-xfirmware/target/arm/philips/hdd1630/lcd-hdd1630.c266
-rwxr-xr-xfirmware/target/arm/philips/hdd1630/power-hdd1630.c58
-rw-r--r--firmware/target/arm/philips/hdd1630/powermgmt-hdd1630.c62
-rw-r--r--firmware/target/arm/usb-fw-pp502x.c5
-rwxr-xr-xtools/configure26
-rw-r--r--tools/scramble.c4
20 files changed, 1198 insertions, 4 deletions
diff --git a/apps/SOURCES b/apps/SOURCES
index 1da74e1b2a..01d31210e6 100644
--- a/apps/SOURCES
+++ b/apps/SOURCES
@@ -193,4 +193,6 @@ keymaps/keymap-creativezvm.c
keymaps/keymap-creativezv.c
#elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
keymaps/keymap-sa9200.c
+#elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
+keymaps/keymap-hdd1630.c
#endif
diff --git a/apps/debug_menu.c b/apps/debug_menu.c
index ab3075afc1..f87d41d53c 100644
--- a/apps/debug_menu.c
+++ b/apps/debug_menu.c
@@ -1013,7 +1013,8 @@ static bool dbg_spdif(void)
# define DEBUG_CANCEL BUTTON_LEFT
/* This is temporary until the SA9200 touchpad works */
-#elif (CONFIG_KEYPAD == PHILIPS_SA9200_PAD)
+#elif (CONFIG_KEYPAD == PHILIPS_SA9200_PAD) || \
+ (CONFIG_KEYPAD == PHILIPS_HDD1630_PAD)
# define DEBUG_CANCEL BUTTON_POWER
#endif /* key definitions */
diff --git a/apps/keymaps/keymap-hdd1630.c b/apps/keymaps/keymap-hdd1630.c
new file mode 100755
index 0000000000..9363eba735
--- /dev/null
+++ b/apps/keymaps/keymap-hdd1630.c
@@ -0,0 +1,315 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2008 Mark Arigo
+ *
+ * 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.
+ *
+ ****************************************************************************/
+
+/* Button Code Definitions for the toshiba gigabeat target */
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "config.h"
+#include "action.h"
+#include "button.h"
+#include "settings.h"
+
+/*
+ * The format of the list is as follows
+ * { Action Code, Button code, Prereq button code }
+ * if there's no need to check the previous button's value, use BUTTON_NONE
+ * Insert LAST_ITEM_IN_LIST at the end of each mapping
+ */
+
+/* CONTEXT_CUSTOM's used in this file...
+
+CONTEXT_CUSTOM|CONTEXT_TREE = the standard list/tree defines (without directions)
+CONTEXT_CUSTOM|CONTEXT_SETTINGS = the direction keys for the eq/col picker screens
+ i.e where up/down is inc/dec
+ CONTEXT_SETTINGS = up/down is prev/next, l/r is inc/dec
+
+*/
+
+
+static const struct button_mapping button_context_standard[] = {
+ { ACTION_STD_PREV, BUTTON_UP, BUTTON_NONE },
+ { ACTION_STD_PREVREPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_STD_NEXT, BUTTON_DOWN, BUTTON_NONE },
+ { ACTION_STD_NEXTREPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
+
+ { ACTION_STD_CANCEL, BUTTON_LEFT, BUTTON_NONE },
+ { ACTION_STD_CANCEL, BUTTON_POWER, BUTTON_NONE },
+
+ { ACTION_STD_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT,BUTTON_SELECT },
+
+ { ACTION_STD_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
+ { ACTION_STD_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
+
+ { ACTION_STD_OK, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT },
+ { ACTION_STD_OK, BUTTON_RIGHT, BUTTON_NONE },
+
+ LAST_ITEM_IN_LIST
+}; /* button_context_standard */
+
+
+static const struct button_mapping button_context_wps[] = {
+ { ACTION_WPS_PLAY, BUTTON_VIEW|BUTTON_REL, BUTTON_VIEW },
+ { ACTION_WPS_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
+
+ { ACTION_WPS_SKIPNEXT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
+ { ACTION_WPS_SKIPPREV, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
+
+ { ACTION_WPS_SEEKBACK, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_WPS_SEEKFWD, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_WPS_STOPSEEK, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT|BUTTON_REPEAT },
+ { ACTION_WPS_STOPSEEK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT|BUTTON_REPEAT },
+
+ { ACTION_WPS_ABSETB_NEXTDIR, BUTTON_VIEW|BUTTON_RIGHT, BUTTON_NONE },
+ { ACTION_WPS_ABSETA_PREVDIR, BUTTON_VIEW|BUTTON_LEFT, BUTTON_NONE },
+ { ACTION_WPS_ABRESET, BUTTON_VIEW|BUTTON_SELECT, BUTTON_NONE },
+
+ { ACTION_WPS_VOLDOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_WPS_VOLDOWN, BUTTON_DOWN, BUTTON_NONE },
+ { ACTION_WPS_VOLDOWN, BUTTON_VOL_DOWN, BUTTON_NONE },
+ { ACTION_WPS_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_WPS_VOLUP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_WPS_VOLUP, BUTTON_UP, BUTTON_NONE },
+ { ACTION_WPS_VOLUP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_WPS_VOLUP, BUTTON_VOL_UP, BUTTON_NONE },
+
+ { ACTION_WPS_PITCHSCREEN, BUTTON_VIEW|BUTTON_UP, BUTTON_VIEW },
+ { ACTION_WPS_PITCHSCREEN, BUTTON_VIEW|BUTTON_DOWN, BUTTON_VIEW },
+
+ { ACTION_WPS_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
+ { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
+ { ACTION_WPS_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT },
+
+ { ACTION_WPS_ID3SCREEN, BUTTON_VIEW|BUTTON_MENU, BUTTON_NONE },
+ { ACTION_WPS_BROWSE, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT },
+
+ LAST_ITEM_IN_LIST
+}; /* button_context_wps */
+
+static const struct button_mapping button_context_list[] = {
+ { ACTION_LISTTREE_PGUP, BUTTON_VIEW|BUTTON_UP, BUTTON_VIEW },
+ { ACTION_LISTTREE_PGUP, BUTTON_UP|BUTTON_REL, BUTTON_VIEW|BUTTON_UP },
+ { ACTION_LISTTREE_PGUP, BUTTON_VIEW|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_LISTTREE_PGDOWN, BUTTON_VIEW|BUTTON_DOWN, BUTTON_VIEW },
+ { ACTION_LISTTREE_PGDOWN, BUTTON_DOWN|BUTTON_REL, BUTTON_VIEW|BUTTON_DOWN },
+ { ACTION_LISTTREE_PGDOWN, BUTTON_VIEW|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
+#ifdef HAVE_VOLUME_IN_LIST
+ { ACTION_LIST_VOLUP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_LIST_VOLUP, BUTTON_VOL_UP, BUTTON_NONE },
+ { ACTION_LIST_VOLDOWN, BUTTON_VOL_DOWN, BUTTON_NONE },
+ { ACTION_LIST_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
+#endif
+
+ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
+}; /* button_context_list */
+
+static const struct button_mapping button_context_tree[] = {
+ { ACTION_TREE_WPS, BUTTON_VIEW|BUTTON_REL, BUTTON_VIEW },
+ { ACTION_TREE_STOP, BUTTON_POWER, BUTTON_NONE },
+ { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
+ { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REPEAT, BUTTON_NONE },
+
+ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST)
+}; /* button_context_tree */
+
+static const struct button_mapping button_context_listtree_scroll_with_combo[] = {
+ { ACTION_NONE, BUTTON_VIEW, BUTTON_NONE },
+ { ACTION_TREE_PGLEFT, BUTTON_VIEW|BUTTON_LEFT, BUTTON_VIEW },
+ { ACTION_TREE_PGLEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_VIEW|BUTTON_LEFT },
+ { ACTION_TREE_PGLEFT, BUTTON_VIEW|BUTTON_LEFT, BUTTON_LEFT|BUTTON_REL },
+ { ACTION_TREE_ROOT_INIT, BUTTON_VIEW|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_VIEW|BUTTON_LEFT },
+ { ACTION_TREE_PGLEFT, BUTTON_VIEW|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_TREE_PGRIGHT, BUTTON_VIEW|BUTTON_RIGHT, BUTTON_VIEW },
+ { ACTION_TREE_PGRIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_VIEW|BUTTON_RIGHT },
+ { ACTION_TREE_PGRIGHT, BUTTON_VIEW|BUTTON_RIGHT, BUTTON_RIGHT|BUTTON_REL },
+ { ACTION_TREE_PGRIGHT, BUTTON_VIEW|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
+ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_TREE),
+};
+
+static const struct button_mapping button_context_listtree_scroll_without_combo[] = {
+ { ACTION_NONE, BUTTON_LEFT, BUTTON_NONE },
+ { ACTION_STD_CANCEL, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
+ { ACTION_TREE_ROOT_INIT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
+ { ACTION_TREE_PGLEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_TREE_PGLEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT|BUTTON_REPEAT },
+ { ACTION_NONE, BUTTON_RIGHT, BUTTON_NONE },
+ { ACTION_STD_OK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
+ { ACTION_TREE_PGRIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_TREE_PGRIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT|BUTTON_REPEAT },
+ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_TREE),
+};
+
+static const struct button_mapping button_context_settings[] = {
+ { ACTION_SETTINGS_INC, BUTTON_UP, BUTTON_NONE },
+ { ACTION_SETTINGS_INCREPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_SETTINGS_DEC, BUTTON_DOWN, BUTTON_NONE },
+ { ACTION_SETTINGS_DECREPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_STD_PREV, BUTTON_LEFT, BUTTON_NONE },
+ { ACTION_STD_PREVREPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_STD_NEXT, BUTTON_RIGHT, BUTTON_NONE },
+ { ACTION_STD_NEXTREPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_SETTINGS_RESET, BUTTON_VIEW, BUTTON_NONE },
+
+ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
+}; /* button_context_settings */
+
+static const struct button_mapping button_context_settings_right_is_inc[] = {
+ { ACTION_SETTINGS_INC, BUTTON_RIGHT, BUTTON_NONE },
+ { ACTION_SETTINGS_INCREPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_SETTINGS_DEC, BUTTON_LEFT, BUTTON_NONE },
+ { ACTION_SETTINGS_DECREPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_STD_PREV, BUTTON_UP, BUTTON_NONE },
+ { ACTION_STD_PREVREPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_STD_NEXT, BUTTON_DOWN, BUTTON_NONE },
+ { ACTION_STD_NEXTREPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_SETTINGS_RESET, BUTTON_VIEW, BUTTON_NONE },
+
+ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
+}; /* button_context_settingsgraphical */
+
+static const struct button_mapping button_context_yesno[] = {
+ { ACTION_YESNO_ACCEPT, BUTTON_SELECT, BUTTON_NONE },
+ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
+}; /* button_context_settings_yesno */
+
+static const struct button_mapping button_context_colorchooser[] = {
+ { ACTION_STD_OK, BUTTON_VIEW|BUTTON_REL, BUTTON_NONE },
+ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_SETTINGS),
+}; /* button_context_colorchooser */
+
+static const struct button_mapping button_context_eq[] = {
+ { ACTION_STD_OK, BUTTON_SELECT|BUTTON_REL, BUTTON_NONE },
+ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_SETTINGS),
+}; /* button_context_eq */
+
+/** Bookmark Screen **/
+static const struct button_mapping button_context_bmark[] = {
+ { ACTION_BMS_DELETE, BUTTON_VIEW, BUTTON_NONE },
+
+ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST),
+}; /* button_context_bmark */
+
+static const struct button_mapping button_context_time[] = {
+ { ACTION_STD_CANCEL, BUTTON_POWER, BUTTON_NONE },
+ { ACTION_STD_OK, BUTTON_VIEW, BUTTON_NONE },
+ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS),
+}; /* button_context_time */
+
+static const struct button_mapping button_context_quickscreen[] = {
+ { ACTION_QS_DOWNINV, BUTTON_UP, BUTTON_NONE },
+ { ACTION_QS_DOWNINV, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_QS_DOWN, BUTTON_DOWN, BUTTON_NONE },
+ { ACTION_QS_DOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_QS_LEFT, BUTTON_LEFT, BUTTON_NONE },
+ { ACTION_QS_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_QS_RIGHT, BUTTON_RIGHT, BUTTON_NONE },
+ { ACTION_QS_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_STD_CANCEL, BUTTON_MENU, BUTTON_NONE },
+
+ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
+}; /* button_context_quickscreen */
+
+static const struct button_mapping button_context_pitchscreen[] = {
+ { ACTION_PS_INC_SMALL, BUTTON_UP, BUTTON_NONE },
+ { ACTION_PS_INC_BIG, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_PS_DEC_SMALL, BUTTON_DOWN, BUTTON_NONE },
+ { ACTION_PS_DEC_BIG, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_PS_NUDGE_LEFT, BUTTON_LEFT, BUTTON_NONE },
+ { ACTION_PS_NUDGE_LEFTOFF, BUTTON_LEFT|BUTTON_REL, BUTTON_NONE },
+ { ACTION_PS_NUDGE_RIGHT, BUTTON_RIGHT, BUTTON_NONE },
+ { ACTION_PS_NUDGE_RIGHTOFF, BUTTON_RIGHT|BUTTON_REL, BUTTON_NONE },
+ { ACTION_PS_TOGGLE_MODE, BUTTON_MENU, BUTTON_NONE },
+ { ACTION_PS_RESET, BUTTON_VIEW, BUTTON_NONE },
+ { ACTION_PS_EXIT, BUTTON_POWER, BUTTON_NONE },
+
+ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
+}; /* button_context_pitchcreen */
+
+static const struct button_mapping button_context_keyboard[] = {
+ { ACTION_KBD_LEFT, BUTTON_LEFT, BUTTON_NONE },
+ { ACTION_KBD_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_KBD_RIGHT, BUTTON_RIGHT, BUTTON_NONE },
+ { ACTION_KBD_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_KBD_CURSOR_LEFT, BUTTON_VIEW|BUTTON_LEFT, BUTTON_NONE },
+ { ACTION_KBD_CURSOR_LEFT, BUTTON_VIEW|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_KBD_CURSOR_RIGHT, BUTTON_VIEW|BUTTON_RIGHT, BUTTON_NONE },
+ { ACTION_KBD_CURSOR_RIGHT, BUTTON_VIEW|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_KBD_SELECT, BUTTON_SELECT, BUTTON_NONE },
+ { ACTION_KBD_PAGE_FLIP, BUTTON_VIEW|BUTTON_MENU, BUTTON_NONE },
+ { ACTION_KBD_DONE, BUTTON_VIEW|BUTTON_REL, BUTTON_VIEW },
+ { ACTION_KBD_ABORT, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
+ { ACTION_KBD_BACKSPACE, BUTTON_MENU, BUTTON_NONE },
+ { ACTION_KBD_BACKSPACE, BUTTON_MENU|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_KBD_UP, BUTTON_UP, BUTTON_NONE },
+ { ACTION_KBD_UP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_KBD_DOWN, BUTTON_DOWN, BUTTON_NONE },
+ { ACTION_KBD_DOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_KBD_MORSE_INPUT, BUTTON_VIEW|BUTTON_POWER, BUTTON_NONE },
+ { ACTION_KBD_MORSE_SELECT, BUTTON_SELECT|BUTTON_REL, BUTTON_NONE },
+
+ LAST_ITEM_IN_LIST
+}; /* button_context_keyboard */
+
+const struct button_mapping* get_context_mapping(int context)
+{
+ switch (context)
+ {
+ case CONTEXT_STD:
+ return button_context_standard;
+ case CONTEXT_WPS:
+ return button_context_wps;
+
+ case CONTEXT_LIST:
+ return button_context_list;
+ case CONTEXT_MAINMENU:
+ case CONTEXT_TREE:
+ if (global_settings.hold_lr_for_scroll_in_list)
+ return button_context_listtree_scroll_without_combo;
+ else
+ return button_context_listtree_scroll_with_combo;
+ case CONTEXT_CUSTOM|CONTEXT_TREE:
+ return button_context_tree;
+
+ case CONTEXT_SETTINGS:
+ return button_context_settings;
+ case CONTEXT_CUSTOM|CONTEXT_SETTINGS:
+ return button_context_settings_right_is_inc;
+
+ case CONTEXT_SETTINGS_COLOURCHOOSER:
+ return button_context_colorchooser;
+ case CONTEXT_SETTINGS_EQ:
+ return button_context_eq;
+
+ case CONTEXT_SETTINGS_TIME:
+ return button_context_time;
+
+ case CONTEXT_YESNOSCREEN:
+ return button_context_yesno;
+ case CONTEXT_BOOKMARKSCREEN:
+ return button_context_bmark;
+ case CONTEXT_QUICKSCREEN:
+ return button_context_quickscreen;
+ case CONTEXT_PITCHSCREEN:
+ return button_context_pitchscreen;
+ case CONTEXT_KEYBOARD:
+ return button_context_keyboard;
+ }
+ return button_context_standard;
+}
diff --git a/bootloader/SOURCES b/bootloader/SOURCES
index c38b8ade1f..37011dd700 100644
--- a/bootloader/SOURCES
+++ b/bootloader/SOURCES
@@ -9,7 +9,8 @@ gigabeat-s.c
../firmware/target/arm/imx31/gigabeat-s/mmu-imx31.c
#elif defined(IRIVER_H10) || defined(IRIVER_H10_5GB) || \
defined(SANSA_E200) || defined(SANSA_C200) || \
- defined(MROBE_100) || defined(PHILIPS_SA9200)
+ defined(MROBE_100) || defined(PHILIPS_SA9200) || \
+ defined(PHILIPS_HDD1630)
#ifdef E200R_INSTALLER
main-e200r-installer.c
#else
diff --git a/bootloader/main-pp.c b/bootloader/main-pp.c
index 076900555e..9d69ed4932 100644
--- a/bootloader/main-pp.c
+++ b/bootloader/main-pp.c
@@ -61,6 +61,10 @@ extern int show_logo(void);
#elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
#define BOOTLOADER_BOOT_OF BUTTON_VOL_UP
+
+#elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
+#define BOOTLOADER_BOOT_OF BUTTON_MENU
+
#endif
/* Maximum allowed firmware image size. 10MB is more than enough */
diff --git a/firmware/SOURCES b/firmware/SOURCES
index 2e2559477f..4dca1c1563 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -481,6 +481,22 @@ target/arm/i2s-pp.c
#endif /* SIMULATOR */
#endif /* PHILIPS_SA9200 */
+#ifdef PHILIPS_HDD1630
+#ifndef SIMULATOR
+target/arm/ata-as-arm.S
+target/arm/ata-pp5020.c
+target/arm/wmcodec-pp.c
+target/arm/i2s-pp.c
+target/arm/adc-pp5020.c
+target/arm/philips/hdd1630/backlight-hdd1630.c
+target/arm/philips/hdd1630/button-hdd1630.c
+target/arm/philips/hdd1630/lcd-hdd1630.c
+target/arm/philips/hdd1630/power-hdd1630.c
+target/arm/philips/hdd1630/powermgmt-hdd1630.c
+target/arm/usb-fw-pp502x.c
+#endif /* SIMULATOR */
+#endif /* PHILIPS_HDD1630 */
+
#ifdef IAUDIO_X5
#ifndef SIMULATOR
target/coldfire/ata-as-coldfire.S
diff --git a/firmware/export/config-hdd1630.h b/firmware/export/config-hdd1630.h
new file mode 100755
index 0000000000..19ca190a57
--- /dev/null
+++ b/firmware/export/config-hdd1630.h
@@ -0,0 +1,189 @@
+/*
+ * This config file is for the iriver H10 20Gb
+ */
+
+#define TARGET_TREE /* this target is using the target tree system */
+
+/* For Rolo and boot loader */
+#define MODEL_NUMBER 31
+#define MODEL_NAME "Philips GoGear HDD1630"
+
+/* define this if you use an ATA controller */
+#define HAVE_ATA
+
+/* define this if you have recording possibility */
+/* #define HAVE_RECORDING */
+
+/* Define bitmask of input sources - recordable bitmask can be defined
+ explicitly if different */
+#define INPUT_SRC_CAPS (SRC_CAP_MIC | SRC_CAP_LINEIN | SRC_CAP_FMRADIO)
+
+/* define the bitmask of hardware sample rates */
+#define HW_SAMPR_CAPS (SAMPR_CAP_44)
+
+/* define the bitmask of recording sample rates */
+#define REC_SAMPR_CAPS (SAMPR_CAP_44)
+
+/* define this if you have a bitmap LCD display */
+#define HAVE_LCD_BITMAP
+
+/* define this if you have a colour LCD */
+#define HAVE_LCD_COLOR
+
+/* define this if you want album art for this target */
+#define HAVE_ALBUMART
+
+/* define this if you have access to the quickscreen */
+#define HAVE_QUICKSCREEN
+
+/* define this if you have access to the pitchscreen */
+#define HAVE_PITCHSCREEN
+
+/* define this if you would like tagcache to build on this target */
+#define HAVE_TAGCACHE
+
+/* LCD dimensions */
+#define LCD_WIDTH 128
+#define LCD_HEIGHT 128
+#define LCD_DEPTH 16 /* 65536 colours */
+#define LCD_PIXELFORMAT RGB565SWAPPED /* rgb565 byte-swapped */
+
+#ifndef BOOTLOADER
+/* Define this if your LCD can be enabled/disabled */
+/* #define HAVE_LCD_ENABLE */
+
+/* Define this if your LCD can be put to sleep. HAVE_LCD_ENABLE
+ * should be defined as well.
+ * We can currently put the lcd to sleep but it won't wake up properly */
+/* #define HAVE_LCD_SLEEP */
+/* #define HAVE_LCD_SLEEP_SETTING */
+#endif
+
+/* define this if you can flip your LCD */
+/* #define HAVE_LCD_FLIP */
+
+/* define this if you can invert the colours on your LCD */
+/* #define HAVE_LCD_INVERT */
+
+/* #define IRAM_LCDFRAMEBUFFER IDATA_ATTR *//* put the lcd frame buffer in IRAM */
+
+#define CONFIG_KEYPAD PHILIPS_HDD1630_PAD
+
+/* Define this if you do software codec */
+#define CONFIG_CODEC SWCODEC
+
+/* define this if you have a real-time clock */
+#ifndef BOOTLOADER
+/* #define CONFIG_RTC RTC_E8564 */
+/* #define HAVE_RTC_ALARM */
+#endif
+
+/* Define this if you have a software controlled poweroff */
+/* #define HAVE_SW_POWEROFF */
+
+/* The number of bytes reserved for loadable codecs */
+#define CODEC_SIZE 0x80000
+
+/* The number of bytes reserved for loadable plugins */
+#define PLUGIN_BUFFER_SIZE 0x80000
+
+/* Define this if you have the WM8731 audio codec */
+#define HAVE_WM8731
+
+/* WM8731 has no tone controls, so we use the software ones */
+#define HAVE_SW_TONE_CONTROLS
+
+#define AB_REPEAT_ENABLE 1
+
+/* FM Tuner */
+/* #define CONFIG_TUNER TEA5767 */
+/* #define CONFIG_TUNER_XTAL 32768 */
+
+/* Define this for LCD backlight available */
+#define HAVE_BACKLIGHT
+/* #define HAVE_BACKLIGHT_BRIGHTNESS */
+
+/* Main LCD backlight brightness range and defaults */
+#define MIN_BRIGHTNESS_SETTING 1
+#define MAX_BRIGHTNESS_SETTING 12
+#define DEFAULT_BRIGHTNESS_SETTING 6
+
+/* define this if you have a light associated with the buttons */
+/* #define HAVE_BUTTON_LIGHT */
+
+#define AB_REPEAT_ENABLE 1
+
+#define BATTERY_CAPACITY_DEFAULT 1550 /* default battery capacity */
+#define BATTERY_CAPACITY_MIN 1500 /* min. capacity selectable */
+#define BATTERY_CAPACITY_MAX 3200 /* max. capacity selectable */
+#define BATTERY_CAPACITY_INC 50 /* capacity increment */
+#define BATTERY_TYPES_COUNT 1 /* only one type */
+
+/* Hardware controlled charging */
+/* #define CONFIG_CHARGING CHARGING_SIMPLE */
+
+/* define this if the unit can be powered or charged via USB */
+#define HAVE_USB_POWER
+
+#ifndef SIMULATOR
+
+/* Define this if you have a PortalPlayer PP5020 */
+#define CONFIG_CPU PP5022
+
+/* Define this if you want to use the PP5020 i2c interface */
+#define CONFIG_I2C I2C_PP5020
+
+/* define this if the hardware can be powered off while charging */
+#define HAVE_POWEROFF_WHILE_CHARGING
+
+/* The start address index for ROM builds */
+#define ROM_START 0x00000000
+
+/* The size of the flash ROM */
+#define FLASH_SIZE 0x100000
+
+/* Define this to the CPU frequency */
+#define CPU_FREQ 75000000
+
+/* Type of LCD */
+#define CONFIG_LCD LCD_HDD1630
+
+/* Define this if your LCD can set contrast */
+#define HAVE_LCD_CONTRAST
+
+#define MIN_CONTRAST_SETTING 0
+#define MAX_CONTRAST_SETTING 30
+#define DEFAULT_CONTRAST_SETTING 14 /* Match boot contrast */
+
+/* We're able to shut off power to the HDD */
+/* #define HAVE_ATA_POWER_OFF */
+
+/* Offset ( in the firmware file's header ) to the file CRC and data. These are
+ only used when loading the old format rockbox.e200 file */
+#define FIRMWARE_OFFSET_FILE_CRC 0x0
+#define FIRMWARE_OFFSET_FILE_DATA 0x8
+
+/* #define USB_IPODSTYLE */
+
+/* USB On-the-go */
+#define CONFIG_USBOTG USBOTG_ARC
+
+/* enable these for the experimental usb stack */
+#define HAVE_USBSTACK
+#define USB_VENDOR_ID 0x0471
+#define USB_PRODUCT_ID 0x014C
+
+/* Virtual LED (icon) */
+#define CONFIG_LED LED_VIRTUAL
+
+/* Define this if you have adjustable CPU frequency */
+#define HAVE_ADJUSTABLE_CPU_FREQ
+
+#define MI4_FORMAT
+#define BOOTFILE_EXT "mi4"
+#define BOOTFILE "rockbox." BOOTFILE_EXT
+#define BOOTDIR "/.rockbox"
+
+#define ICODE_ATTR_TREMOR_NOT_MDCT
+
+#endif
diff --git a/firmware/export/config.h b/firmware/export/config.h
index 34d0bf27c6..1a6e5d6894 100644
--- a/firmware/export/config.h
+++ b/firmware/export/config.h
@@ -85,6 +85,7 @@
#define CREATIVEZV_PAD 26
#define PHILIPS_SA9200_PAD 27
#define SANSA_C100_PAD 28
+#define PHILIPS_HDD1630_PAD 29
/* CONFIG_REMOTE_KEYPAD */
#define H100_REMOTE 1
@@ -125,6 +126,7 @@
#define LCD_COWOND2 24 /* as used by Cowon D2 - LTV250QV, TCC7801 driver */
#define LCD_SA9200 25 /* as used by the Philips SA9200 */
#define LCD_S6B33B2 26 /* as used by the Sansa c100 */
+#define LCD_HDD1630 27 /* as used by the Philips HDD1630 */
/* LCD_PIXELFORMAT */
#define HORIZONTAL_PACKING 1
@@ -265,6 +267,8 @@
#include "config-creativezv.h"
#elif defined(PHILIPS_SA9200)
#include "config-sa9200.h"
+#elif defined(PHILIPS_HDD1630)
+#include "config-hdd1630.h"
#elif defined(SANSA_C100)
#include "config-c100.h"
#else
diff --git a/firmware/export/usb.h b/firmware/export/usb.h
index 0590f702c5..05ea84148a 100644
--- a/firmware/export/usb.h
+++ b/firmware/export/usb.h
@@ -64,6 +64,9 @@ enum {
(CONFIG_KEYPAD == PHILIPS_SA9200_PAD)
#define USBPOWER_BUTTON BUTTON_SELECT
#define USBPOWER_BTN_IGNORE BUTTON_POWER
+#elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
+#define USBPOWER_BUTTON BUTTON_PLAYLIST
+#define USBPOWER_BTN_IGNORE BUTTON_POWER
#endif
#endif /* HAVE_USB_POWER */
diff --git a/firmware/target/arm/philips/hdd1630/adc-target.h b/firmware/target/arm/philips/hdd1630/adc-target.h
new file mode 100644
index 0000000000..95b911783b
--- /dev/null
+++ b/firmware/target/arm/philips/hdd1630/adc-target.h
@@ -0,0 +1,39 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2006 by Barry Wardell
+ *
+ * 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.
+ *
+ ****************************************************************************/
+#ifndef _ADC_TARGET_H_
+#define _ADC_TARGET_H_
+
+#define ADC_ADDR (*(volatile unsigned long*)(0x7000ad00))
+#define ADC_STATUS (*(volatile unsigned long*)(0x7000ad04))
+#define ADC_DATA_1 (*(volatile unsigned long*)(0x7000ad20))
+#define ADC_DATA_2 (*(volatile unsigned long*)(0x7000ad24))
+#define ADC_INIT (*(volatile unsigned long*)(0x7000ad2c))
+
+#define NUM_ADC_CHANNELS 4
+
+#define ADC_BATTERY 0
+#define ADC_UNKNOWN_1 1
+#define ADC_UNKNOWN_2 2
+#define ADC_UNKNOWN_3 3
+#define ADC_UNREG_POWER ADC_BATTERY /* For compatibility */
+
+/* Force a scan now */
+unsigned short adc_scan(int channel);
+
+#endif
diff --git a/firmware/target/arm/philips/hdd1630/backlight-hdd1630.c b/firmware/target/arm/philips/hdd1630/backlight-hdd1630.c
new file mode 100755
index 0000000000..22d31976aa
--- /dev/null
+++ b/firmware/target/arm/philips/hdd1630/backlight-hdd1630.c
@@ -0,0 +1,49 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2008 by Mark Arigo
+ *
+ * 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 "backlight-target.h"
+#include "system.h"
+#include "lcd.h"
+#include "backlight.h"
+
+#ifdef HAVE_BACKLIGHT_BRIGHTNESS
+static unsigned short backlight_brightness = DEFAULT_BRIGHTNESS_SETTING;
+
+void _backlight_set_brightness(int brightness)
+{
+}
+#endif
+
+void _backlight_on(void)
+{
+}
+
+void _backlight_off(void)
+{
+}
+
+#ifdef HAVE_BUTTON_LIGHT
+void _buttonlight_on(void)
+{
+}
+
+void _buttonlight_off(void)
+{
+}
+#endif
diff --git a/firmware/target/arm/philips/hdd1630/backlight-target.h b/firmware/target/arm/philips/hdd1630/backlight-target.h
new file mode 100755
index 0000000000..3cfd085761
--- /dev/null
+++ b/firmware/target/arm/philips/hdd1630/backlight-target.h
@@ -0,0 +1,36 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2008 by Mark Arigo
+ *
+ * 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.
+ *
+ ****************************************************************************/
+#ifndef BACKLIGHT_TARGET_H
+#define BACKLIGHT_TARGET_H
+
+#define _backlight_init() true
+void _backlight_on(void);
+void _backlight_off(void);
+int __backlight_is_on(void);
+
+#ifdef HAVE_BACKLIGHT_BRIGHTNESS
+void _backlight_set_brightness(int brightness);
+#endif
+
+#ifdef HAVE_BUTTON_LIGHT
+void _buttonlight_on(void);
+void _buttonlight_off(void);
+#endif
+
+#endif
diff --git a/firmware/target/arm/philips/hdd1630/button-hdd1630.c b/firmware/target/arm/philips/hdd1630/button-hdd1630.c
new file mode 100755
index 0000000000..ac478065bc
--- /dev/null
+++ b/firmware/target/arm/philips/hdd1630/button-hdd1630.c
@@ -0,0 +1,65 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2008 by Mark Arigo
+ *
+ * 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 "system.h"
+#include "button.h"
+#include "backlight.h"
+
+void button_init_device(void)
+{
+ /* TODO...for now, hardware initialisation is done by the bootloader */
+}
+
+bool button_hold(void)
+{
+ return !(GPIOJ_INPUT_VAL & 0x8);
+}
+
+/*
+ * Get button pressed from hardware
+ */
+int button_read_device(void)
+{
+ int btn = BUTTON_NONE;
+ static bool hold_button = false;
+ bool hold_button_old;
+
+ /* Hold */
+ hold_button_old = hold_button;
+ hold_button = button_hold();
+
+ /* device buttons */
+ if (!hold_button)
+ {
+ if (!(GPIOA_INPUT_VAL & 0x01)) btn |= BUTTON_MENU;
+ if (!(GPIOA_INPUT_VAL & 0x02)) btn |= BUTTON_VOL_UP;
+ if (!(GPIOA_INPUT_VAL & 0x04)) btn |= BUTTON_VOL_DOWN;
+ if (!(GPIOA_INPUT_VAL & 0x08)) btn |= BUTTON_VIEW;
+
+ if (!(GPIOD_INPUT_VAL & 0x20)) btn |= BUTTON_PLAYLIST;
+ if (!(GPIOD_INPUT_VAL & 0x40)) btn |= BUTTON_POWER;
+ }
+
+ return btn;
+}
+
+bool headphones_inserted(void)
+{
+ return true;
+}
diff --git a/firmware/target/arm/philips/hdd1630/button-target.h b/firmware/target/arm/philips/hdd1630/button-target.h
new file mode 100755
index 0000000000..92c584463f
--- /dev/null
+++ b/firmware/target/arm/philips/hdd1630/button-target.h
@@ -0,0 +1,53 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2008 by Mark Arigo
+ *
+ * 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.
+ *
+ ****************************************************************************/
+
+#ifndef _BUTTON_TARGET_H_
+#define _BUTTON_TARGET_H_
+
+#include <stdbool.h>
+#include "config.h"
+
+#define HAS_BUTTON_HOLD
+
+bool button_hold(void);
+void button_init_device(void);
+int button_read_device(void);
+
+/* Main unit's buttons */
+#define BUTTON_POWER 0x00000001
+#define BUTTON_PLAYLIST 0x00000002
+#define BUTTON_MENU 0x00000004
+#define BUTTON_VIEW 0x00000008
+#define BUTTON_VOL_UP 0x00000010
+#define BUTTON_VOL_DOWN 0x00000020
+#define BUTTON_SELECT 0x00000040
+#define BUTTON_LEFT 0x00000080
+#define BUTTON_RIGHT 0x00000100
+#define BUTTON_UP 0x00000200
+#define BUTTON_DOWN 0x00000400
+
+#define BUTTON_MAIN 0x00000fff
+
+/* No Remote control */
+#define BUTTON_REMOTE 0
+
+#define POWEROFF_BUTTON BUTTON_POWER
+#define POWEROFF_COUNT 10
+
+#endif /* _BUTTON_TARGET_H_ */
diff --git a/firmware/target/arm/philips/hdd1630/lcd-hdd1630.c b/firmware/target/arm/philips/hdd1630/lcd-hdd1630.c
new file mode 100755
index 0000000000..5e6d3ace42
--- /dev/null
+++ b/firmware/target/arm/philips/hdd1630/lcd-hdd1630.c
@@ -0,0 +1,266 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2008 by Mark Arigo
+ *
+ * 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 "lcd.h"
+#include "kernel.h"
+#include "system.h"
+
+/* Display status */
+static unsigned lcd_yuv_options SHAREDBSS_ATTR = 0;
+
+/* wait for LCD */
+static inline void lcd_wait_write(void)
+{
+ int i = 0;
+ while (LCD2_PORT & LCD2_BUSY_MASK)
+ {
+ if (i < 2000)
+ i++;
+ else
+ LCD2_PORT &= ~LCD2_BUSY_MASK;
+ }
+}
+
+/* send LCD data */
+static void lcd_send_data(unsigned data)
+{
+ lcd_wait_write();
+ LCD2_PORT = LCD2_DATA_MASK | (data & 0xff);
+}
+
+/* send LCD command */
+static void lcd_send_cmd(unsigned cmd)
+{
+ lcd_wait_write();
+ LCD2_PORT = LCD2_CMD_MASK | (cmd & 0xff);
+ lcd_wait_write();
+}
+
+static inline void lcd_send_pixel(unsigned pixel)
+{
+ lcd_send_data(pixel >> 8);
+ lcd_send_data(pixel);
+}
+
+void lcd_init_device(void)
+{
+#if 0
+ /* this sequence from the OF bootloader */
+
+ DEV_EN2 |= 0x2000;
+ outl(inl(0x70000014) & ~0xf000000, 0x70000014);
+ outl(inl(0x70000014) | 0xa000000, 0x70000014);
+ DEV_INIT1 &= 0xc000;
+ DEV_INIT1 |= 0x8000;
+ MLCD_SCLK_DIV &= ~0x800;
+ CLCD_CLOCK_SRC |= 0xc0000000;
+ DEV_INIT2 &= ~0x400;
+ outl(inl(0x7000002c) | ((1<<4)<<24), 0x7000002c);
+ DEV_INIT2 &= ~((1<<4)<<24);
+ udelay(10000);
+
+ DEV_INIT2 |= ((1<<4)<<24);
+ outl(0x220, 0x70008a00);
+ outl(0x1f00, 0x70008a04);
+ LCD2_BLOCK_CTRL = 0x10008080;
+ LCD2_BLOCK_CONFIG = 0xF00000;
+
+ GPIOJ_ENABLE |= 0x4;
+ GPIOJ_OUTPUT_VAL |= 0x4;
+ GPIOJ_OUTPUT_EN |= 0x4;
+
+ lcd_send_cmd(0x1);
+ udelay(10000);
+
+ lcd_send_cmd(0x25);
+ lcd_send_data(0x3f);
+
+ lcd_send_cmd(0x11);
+ udelay(120000);
+
+ lcd_send_cmd(0x20);
+ lcd_send_cmd(0x38);
+ lcd_send_cmd(0x13);
+
+ lcd_send_cmd(0xb4);
+ lcd_send_data(0x2);
+ lcd_send_data(0x6);
+ lcd_send_data(0x8);
+ lcd_send_data(0xd);
+
+ lcd_send_cmd(0xb5);
+ lcd_send_data(0x2);
+ lcd_send_data(0x6);
+ lcd_send_data(0x8);
+ lcd_send_data(0xd);
+
+ lcd_send_cmd(0xb6);
+ lcd_send_data(0x19);
+ lcd_send_data(0x23);
+ lcd_send_data(0x2d);
+
+ lcd_send_cmd(0xb7);
+ lcd_send_data(0x5);
+
+ lcd_send_cmd(0xba);
+ lcd_send_data(0x7);
+ lcd_send_data(0x18);
+
+ lcd_send_cmd(0x36);
+ lcd_send_data(0);
+
+ lcd_send_cmd(0x3a);
+ lcd_send_data(0x5);
+
+ lcd_send_cmd(0x2d);
+ lcd_send_data(0x1);
+ lcd_send_data(0x2);
+ lcd_send_data(0x3);
+ lcd_send_data(0x4);
+ lcd_send_data(0x5);
+ lcd_send_data(0x6);
+ lcd_send_data(0x7);
+ lcd_send_data(0x8);
+ lcd_send_data(0x9);
+ lcd_send_data(0xa);
+ lcd_send_data(0xb);
+ lcd_send_data(0xc);
+ lcd_send_data(0xd);
+ lcd_send_data(0xe);
+ lcd_send_data(0xf);
+ lcd_send_data(0x10);
+ lcd_send_data(0x11);
+ lcd_send_data(0x12);
+ lcd_send_data(0x13);
+ lcd_send_data(0x14);
+ lcd_send_data(0x15);
+ lcd_send_data(0x16);
+ lcd_send_data(0x17);
+ lcd_send_data(0x18);
+ lcd_send_data(0x19);
+ lcd_send_data(0x1a);
+ lcd_send_data(0x1b);
+ lcd_send_data(0x1c);
+ lcd_send_data(0x1d);
+ lcd_send_data(0x1e);
+ lcd_send_data(0x1f);
+ lcd_send_data(0x20);
+ lcd_send_data(0x21);
+ lcd_send_data(0x22);
+ lcd_send_data(0x23);
+ lcd_send_data(0x24);
+ lcd_send_data(0x25);
+ lcd_send_data(0x26);
+ lcd_send_data(0x27);
+ lcd_send_data(0x28);
+ lcd_send_data(0x29);
+ lcd_send_data(0x2a);
+ lcd_send_data(0x2b);
+ lcd_send_data(0x2c);
+ lcd_send_data(0x2d);
+ lcd_send_data(0x2e);
+ lcd_send_data(0x2f);
+ lcd_send_data(0x30);
+
+ lcd_send_cmd(0x29);
+#endif
+}
+
+/*** hardware configuration ***/
+int lcd_default_contrast(void)
+{
+ return DEFAULT_CONTRAST_SETTING;
+}
+
+void lcd_set_contrast(int val)
+{
+ (void)val;
+}
+
+void lcd_set_invert_display(bool yesno)
+{
+ (void)yesno;
+}
+
+/* turn the display upside down (call lcd_update() afterwards) */
+void lcd_set_flip(bool yesno)
+{
+ (void)yesno;
+}
+
+void lcd_yuv_set_options(unsigned options)
+{
+ lcd_yuv_options = options;
+}
+
+/* Performance function to blit a YUV bitmap directly to the LCD */
+void lcd_blit_yuv(unsigned char * const src[3],
+ int src_x, int src_y, int stride,
+ int x, int y, int width, int height)
+{
+ (void)src;
+ (void)src_x;
+ (void)src_y;
+ (void)stride;
+ (void)x;
+ (void)y;
+ (void)width;
+ (void)height;
+}
+
+/* Update the display.
+ This must be called after all other LCD functions that change the display. */
+void lcd_update(void)
+{
+ lcd_update_rect(0, 0, LCD_WIDTH, LCD_HEIGHT);
+}
+
+/* Update a fraction of the display. */
+void lcd_update_rect(int x, int y, int width, int height)
+{
+ const fb_data *addr;
+
+ if (x + width >= LCD_WIDTH)
+ width = LCD_WIDTH - x;
+ if (y + height >= LCD_HEIGHT)
+ height = LCD_HEIGHT - y;
+
+ if ((width <= 0) || (height <= 0))
+ return; /* Nothing left to do. */
+
+ addr = &lcd_framebuffer[y][x];
+
+ lcd_send_cmd(0x2a);
+ lcd_send_data(x);
+ lcd_send_data(x + width - 1);
+
+ lcd_send_cmd(0x2b);
+ lcd_send_data(y);
+ lcd_send_data(y + height - 1);
+
+ lcd_send_cmd(0x2c);
+ do {
+ int w = width;
+ do {
+ lcd_send_pixel(*addr++);
+ } while (--w > 0);
+ addr += LCD_WIDTH - width;
+ } while (--height > 0);
+}
diff --git a/firmware/target/arm/philips/hdd1630/power-hdd1630.c b/firmware/target/arm/philips/hdd1630/power-hdd1630.c
new file mode 100755
index 0000000000..6d3686ff4a
--- /dev/null
+++ b/firmware/target/arm/philips/hdd1630/power-hdd1630.c
@@ -0,0 +1,58 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2008 by Mark Arigo
+ *
+ * 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 <stdbool.h>
+#include "adc.h"
+#include "kernel.h"
+#include "system.h"
+#include "power.h"
+#include "logf.h"
+#include "usb.h"
+
+#if CONFIG_CHARGING == CHARGING_CONTROL
+bool charger_enabled;
+#endif
+
+void power_init(void)
+{
+}
+
+bool charger_inserted(void)
+{
+ return false ;
+}
+
+void ide_power_enable(bool on)
+{
+ (void)on;
+ /* We do nothing */
+}
+
+
+bool ide_powered(void)
+{
+ /* pretend we are always powered - we don't turn it off */
+ return true;
+}
+
+void power_off(void)
+{
+}
diff --git a/firmware/target/arm/philips/hdd1630/powermgmt-hdd1630.c b/firmware/target/arm/philips/hdd1630/powermgmt-hdd1630.c
new file mode 100644
index 0000000000..71781182fa
--- /dev/null
+++ b/firmware/target/arm/philips/hdd1630/powermgmt-hdd1630.c
@@ -0,0 +1,62 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 by Heikki Hannikainen, Uwe Freese
+ * Revisions copyright (C) 2005 by Gerald Van Baren
+ *
+ * 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 "adc.h"
+#include "powermgmt.h"
+
+const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] =
+{
+ 3450
+};
+
+const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] =
+{
+ 3400
+};
+
+/* voltages (millivolt) of 0%, 10%, ... 100% when charging disabled */
+const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] =
+{
+ { 3480, 3550, 3590, 3610, 3630, 3650, 3700, 3760, 3800, 3910, 3990 },
+};
+
+#if CONFIG_CHARGING
+/* voltages (millivolt) of 0%, 10%, ... 100% when charging enabled */
+const unsigned short percent_to_volt_charge[11] =
+{
+ 3480, 3550, 3590, 3610, 3630, 3650, 3700, 3760, 3800, 3910, 3990
+};
+#endif /* CONFIG_CHARGING */
+
+#define BATTERY_SCALE_FACTOR 6003
+/* full-scale ADC readout (2^10) in millivolt */
+
+/* adc readout
+ * max with charger connected: 690
+ * max fully charged: 682
+ * min just before shutdown: 570
+ */
+
+/* Returns battery voltage from ADC [millivolts] */
+unsigned int battery_adc_voltage(void)
+{
+ return (adc_read(ADC_UNREG_POWER) * BATTERY_SCALE_FACTOR) >> 10;
+}
diff --git a/firmware/target/arm/usb-fw-pp502x.c b/firmware/target/arm/usb-fw-pp502x.c
index eae78886f4..7ea5641007 100644
--- a/firmware/target/arm/usb-fw-pp502x.c
+++ b/firmware/target/arm/usb-fw-pp502x.c
@@ -126,6 +126,11 @@ static bool usb_pin_detect(void)
/* GPIO F bit 7 is usb detect */
if (!(GPIOF_INPUT_VAL & 0x80))
retval = true;
+
+#elif defined(PHILIPS_HDD1630)
+ /* GPIO E bit 2 is usb detect */
+ if (GPIOE_INPUT_VAL & 0x4)
+ retval = true;
#endif
return retval;
diff --git a/tools/configure b/tools/configure
index b2c1b7ed18..3d9afdbfda 100755
--- a/tools/configure
+++ b/tools/configure
@@ -679,7 +679,7 @@ cat <<EOF
==Creative== ==Philips==
90) Zen Vision:M 30GB 100) GoGear SA9200
- 91) Zen Vision:M 60GB
+ 91) Zen Vision:M 60GB 101) GoGear HDD1630
92) Zen Vision
EOF
@@ -1696,6 +1696,30 @@ fi
t_model="sa9200"
;;
+ 101|hdd1630)
+ target_id=43
+ modelname="hdd1630"
+ target="-DPHILIPS_HDD1630"
+ memory=32 # supposedly
+ arm7tdmicc
+ tool="$rootdir/tools/scramble -mi4v3 -model=1630 -type=RBOS"
+ bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
+ bmp2rb_native="$rootdir/tools/bmp2rb -f 4"
+ output="rockbox.mi4"
+ appextra="recorder:gui"
+ plugins=""
+ swcodec="yes"
+ boottool="$rootdir/tools/scramble -mi4v3 -model=1630 -type=RBBL"
+ bootoutput="FWImage.ebn"
+ # toolset is the tools within the tools directory that we build for
+ # this particular target.
+ toolset="$genericbitmaptools scramble"
+ # architecture, manufacturer and model for the target-tree build
+ t_cpu="arm"
+ t_manufacturer="philips"
+ t_model="hdd1630"
+ ;;
+
*)
echo "Please select a supported target platform!"
exit
diff --git a/tools/scramble.c b/tools/scramble.c
index 5263809e41..8fd4ca98f4 100644
--- a/tools/scramble.c
+++ b/tools/scramble.c
@@ -120,7 +120,7 @@ void usage(void)
"\t (X values: h100, h120, h140, h300, ipco, nano, ipvd, mn2g\n"
"\t ip3g, ip4g, mini, iax5, iam5, iam3, h10, h10_5gb,\n"
"\t tpj2, c200, e200, giga, gigs, m100, m500, d2,\n");
- printf("\t 9200)\n");
+ printf("\t 9200, 1630)\n");
printf("\nNo option results in Archos standard player/recorder format.\n");
exit(1);
@@ -274,6 +274,8 @@ int main (int argc, char** argv)
modelnum = 25;
else if(!strcmp(&argv[1][5], "9200")) /* Philips SA9200 */
modelnum = 26;
+ else if(!strcmp(&argv[1][5], "1630")) /* Philips HDD1630 */
+ modelnum = 31;
else {
fprintf(stderr, "unsupported model: %s\n", &argv[1][5]);
return 2;