From 2164aab9020bb37ec71a24461c4c42bc4e2eb2d3 Mon Sep 17 00:00:00 2001 From: Andrew Ryabinin Date: Thu, 3 Nov 2011 11:53:02 +0000 Subject: [PATCH] Added HiFiMAN HM-801 target. FS#12355. This also renames tda1543.{ch} used by HM-60x to dummy_codec.{ch} as it works for PCM1704 used by HM-801. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30891 a1c6a512-1295-4272-9138-f99709370657 --- apps/SOURCES | 2 + apps/keymaps/keymap-hm801.c | 108 +++++++++++++++++++++ bootloader/SOURCES | 2 +- firmware/SOURCES | 15 ++- .../drivers/audio/{tda1543.c => dummy_codec.c} | 0 firmware/export/audiohw.h | 4 +- firmware/export/config.h | 3 + firmware/export/config/hifimanhm60x.h | 2 +- .../config/{hifimanhm60x.h => hifimanhm801.h} | 28 ++---- firmware/export/{tda1543.h => dummy_codec.h} | 6 +- firmware/target/arm/rk27xx/debug-target.h | 2 +- firmware/target/arm/rk27xx/hm801/button-hm801.c | 68 +++++++++++++ .../{debug-target.h => hm801/button-target.h} | 34 ++++--- .../rk27xx/{debug-target.h => hm801/power-hm801.c} | 38 +++++--- firmware/target/arm/rk27xx/hm801/powermgmt-hm801.c | 60 ++++++++++++ .../rk27xx/{hm60x/lcd-hm60x.c => lcd-hifiman.c} | 0 firmware/target/arm/rk27xx/lcdif-rk27xx.c | 2 +- firmware/target/arm/rk27xx/sd-rk27xx.c | 8 +- tools/configure | 24 +++++ 19 files changed, 348 insertions(+), 58 deletions(-) create mode 100644 apps/keymaps/keymap-hm801.c rename firmware/drivers/audio/{tda1543.c => dummy_codec.c} (100%) copy firmware/export/config/{hifimanhm60x.h => hifimanhm801.h} (84%) rename firmware/export/{tda1543.h => dummy_codec.h} (92%) create mode 100644 firmware/target/arm/rk27xx/hm801/button-hm801.c copy firmware/target/arm/rk27xx/{debug-target.h => hm801/button-target.h} (61%) copy firmware/target/arm/rk27xx/{debug-target.h => hm801/power-hm801.c} (64%) create mode 100644 firmware/target/arm/rk27xx/hm801/powermgmt-hm801.c rename firmware/target/arm/rk27xx/{hm60x/lcd-hm60x.c => lcd-hifiman.c} (100%) diff --git a/apps/SOURCES b/apps/SOURCES index 78a1bfeb5d..0734d3475a 100644 --- a/apps/SOURCES +++ b/apps/SOURCES @@ -327,5 +327,7 @@ keymaps/keymap-fuzeplus.c keymaps/keymap-rk27xx-generic.c #elif CONFIG_KEYPAD == HM60X_PAD keymaps/keymap-hm60x.c +#elif CONFIG_KEYPAD == HM801_PAD +keymaps/keymap-hm801.c #endif diff --git a/apps/keymaps/keymap-hm801.c b/apps/keymaps/keymap-hm801.c new file mode 100644 index 0000000000..78221e5fee --- /dev/null +++ b/apps/keymaps/keymap-hm801.c @@ -0,0 +1,108 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2011 Andrew Ryabinin + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +/* Button Code Definitions for HiFiMAN HM-801 reference design target */ + +#include "config.h" +#include "action.h" +#include "button.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 + */ +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_CONTEXT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY }, + { ACTION_STD_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT }, + { ACTION_STD_CANCEL, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_STD_OK, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, + { ACTION_STD_OK, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT }, + { ACTION_STD_MENU, BUTTON_RIGHT, BUTTON_NONE }, + + LAST_ITEM_IN_LIST +}; /* button_context_standard */ + +static const struct button_mapping button_context_wps[] = { + { ACTION_WPS_PLAY, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT}, + { ACTION_WPS_STOP, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT}, + { ACTION_WPS_SKIPPREV, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT }, + { ACTION_WPS_SEEKBACK, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_WPS_STOPSEEK, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT|BUTTON_REPEAT }, + { ACTION_WPS_SKIPNEXT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT}, + { ACTION_WPS_SEEKFWD, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_WPS_STOPSEEK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT|BUTTON_REPEAT }, + + { ACTION_WPS_PLAY, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, + { ACTION_WPS_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY }, + { ACTION_WPS_SKIPPREV, BUTTON_PREV|BUTTON_REL, BUTTON_PREV }, + { ACTION_WPS_SEEKBACK, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_WPS_STOPSEEK, BUTTON_PREV|BUTTON_REL, BUTTON_PREV|BUTTON_REPEAT }, + { ACTION_WPS_SKIPNEXT, BUTTON_NEXT|BUTTON_REL, BUTTON_NEXT }, + { ACTION_WPS_SEEKFWD, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_WPS_STOPSEEK, BUTTON_NEXT|BUTTON_REL, BUTTON_NEXT|BUTTON_REPEAT }, + + { ACTION_WPS_BROWSE, BUTTON_UP|BUTTON_REL, BUTTON_UP }, + { ACTION_WPS_CONTEXT, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP }, + { ACTION_WPS_MENU, BUTTON_DOWN|BUTTON_REL, BUTTON_DOWN }, + { ACTION_WPS_QUICKSCREEN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN }, + + LAST_ITEM_IN_LIST +}; /* button_context_wps */ + +static const struct button_mapping button_context_yesnoscreen[] = { + { ACTION_YESNO_ACCEPT, BUTTON_SELECT, BUTTON_NONE }, + { ACTION_YESNO_ACCEPT, BUTTON_PLAY, BUTTON_NONE }, + LAST_ITEM_IN_LIST +}; /* button_context_settings_yesnoscreen */ + + + + +/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */ +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_YESNOSCREEN: + return button_context_yesnoscreen; + + case CONTEXT_TREE: + case CONTEXT_LIST: + case CONTEXT_MAINMENU: + + case CONTEXT_SETTINGS: + case CONTEXT_SETTINGS|CONTEXT_REMOTE: + default: + return button_context_standard; + } + return button_context_standard; +} diff --git a/bootloader/SOURCES b/bootloader/SOURCES index d1d659837d..1725939fa3 100644 --- a/bootloader/SOURCES +++ b/bootloader/SOURCES @@ -67,7 +67,7 @@ main-pp.c show_logo.c #elif defined(MPIO_HD200) || defined(MPIO_HD300) mpio_hd200_hd300.c -#elif defined(RK27_GENERIC) || defined(HM60X) +#elif defined(RK27_GENERIC) || defined(HM60X) || defined(HM801) rk27xx.c show_logo.c #endif diff --git a/firmware/SOURCES b/firmware/SOURCES index b729a9b064..e7d882082c 100644 --- a/firmware/SOURCES +++ b/firmware/SOURCES @@ -355,8 +355,8 @@ drivers/audio/uda1341.c drivers/audio/cs42l55.c #elif defined (HAVE_RK27XX_CODEC) drivers/audio/rk27xx_codec.c -#elif defined (HAVE_TDA1543) -drivers/audio/tda1543.c +#elif defined (HAVE_DUMMY_CODEC) +drivers/audio/dummy_codec.c #endif /* defined(HAVE_*) */ #elif defined(HAVE_SDL_AUDIO) drivers/audio/sdl.c @@ -1925,6 +1925,15 @@ thread.c target/arm/rk27xx/hm60x/button-hm60x.c target/arm/rk27xx/hm60x/powermgmt-hm60x.c target/arm/rk27xx/hm60x/power-hm60x.c -target/arm/rk27xx/hm60x/lcd-hm60x.c +target/arm/rk27xx/lcd-hifiman.c +#endif +#endif + +#ifndef SIMULATOR +#if defined(HM801) +target/arm/rk27xx/hm801/button-hm801.c +target/arm/rk27xx/hm801/powermgmt-hm801.c +target/arm/rk27xx/hm801/power-hm801.c +target/arm/rk27xx/lcd-hifiman.c #endif #endif diff --git a/firmware/drivers/audio/tda1543.c b/firmware/drivers/audio/dummy_codec.c similarity index 100% rename from firmware/drivers/audio/tda1543.c rename to firmware/drivers/audio/dummy_codec.c diff --git a/firmware/export/audiohw.h b/firmware/export/audiohw.h index e40ee6ee79..6bf4d71810 100644 --- a/firmware/export/audiohw.h +++ b/firmware/export/audiohw.h @@ -74,8 +74,8 @@ #include "cs42l55.h" #elif defined(HAVE_IMX233_CODEC) #include "imx233-codec.h" -#elif defined(HAVE_TDA1543) -#include "tda1543.h" +#elif defined(HAVE_DUMMY_CODEC) +#include "dummy_codec.h" #endif #if (CONFIG_PLATFORM & PLATFORM_HOSTED) /* #include gives errors in other code areas, diff --git a/firmware/export/config.h b/firmware/export/config.h index 0d0617bb13..65c27ce5e0 100644 --- a/firmware/export/config.h +++ b/firmware/export/config.h @@ -141,6 +141,7 @@ #define SANSA_FUZEPLUS_PAD 48 #define RK27XX_GENERIC_PAD 49 #define HM60X_PAD 50 +#define HM801_PAD 51 /* CONFIG_REMOTE_KEYPAD */ #define H100_REMOTE 1 @@ -463,6 +464,8 @@ Lyre prototype 1 */ #include "config/rk27generic.h" #elif defined(HM60X) #include "config/hifimanhm60x.h" +#elif defined(HM801) +#include "config/hifimanhm801.h" #elif defined(SDLAPP) #include "config/sdlapp.h" #elif defined(ANDROID) diff --git a/firmware/export/config/hifimanhm60x.h b/firmware/export/config/hifimanhm60x.h index 88af364bc9..6ac43803f3 100644 --- a/firmware/export/config/hifimanhm60x.h +++ b/firmware/export/config/hifimanhm60x.h @@ -17,7 +17,7 @@ SAMPR_CAP_32 | SAMPR_CAP_24 | SAMPR_CAP_22 | \ SAMPR_CAP_16 | SAMPR_CAP_12 | SAMPR_CAP_11 | SAMPR_CAP_8) -#define HAVE_TDA1543 +#define HAVE_DUMMY_CODEC #define CODEC_SLAVE /* define this if you have a bitmap LCD display */ #define HAVE_LCD_BITMAP diff --git a/firmware/export/config/hifimanhm60x.h b/firmware/export/config/hifimanhm801.h similarity index 84% copy from firmware/export/config/hifimanhm60x.h copy to firmware/export/config/hifimanhm801.h index 88af364bc9..d0e805d7c6 100644 --- a/firmware/export/config/hifimanhm60x.h +++ b/firmware/export/config/hifimanhm801.h @@ -4,20 +4,17 @@ #define TARGET_TREE /* this target is using the target tree system */ /* For Rolo and boot loader */ -#define MODEL_NUMBER 79 +#define MODEL_NUMBER 80 -#define MODEL_NAME "HiFiMAN HM-60x" +#define MODEL_NAME "HiFiMAN HM-801" -/* Define bitmask of input sources - recordable bitmask can be defined - explicitly if different */ -/* #define INPUT_SRC_CAPS (SRC_CAP_MIC | SRC_CAP_FM) */ /* define the bitmask of hardware sample rates */ #define HW_SAMPR_CAPS (SAMPR_CAP_96 | SAMPR_CAP_48 | SAMPR_CAP_44 | \ SAMPR_CAP_32 | SAMPR_CAP_24 | SAMPR_CAP_22 | \ SAMPR_CAP_16 | SAMPR_CAP_12 | SAMPR_CAP_11 | SAMPR_CAP_8) -#define HAVE_TDA1543 +#define HAVE_DUMMY_CODEC #define CODEC_SLAVE /* define this if you have a bitmap LCD display */ #define HAVE_LCD_BITMAP @@ -85,7 +82,7 @@ /* TODO: #define HAVE_LCD_SLEEP_SETTING */ #endif -#define CONFIG_KEYPAD HM60X_PAD +#define CONFIG_KEYPAD HM801_PAD /* Define this to enable morse code input */ #define HAVE_MORSE_INPUT @@ -93,17 +90,8 @@ /* Define this if you do software codec */ #define CONFIG_CODEC SWCODEC -/* define this if you have a real-time clock */ -/* #define CONFIG_RTC RTC_NANO2G */ - -/* Define if the device can wake from an RTC alarm */ -/* #define HAVE_RTC_ALARM */ - #define CONFIG_LCD LCD_HX8340B -/* Define the type of audio codec */ -/*#define HAVE_RK27XX_CODEC */ - /* #define HAVE_PCM_DMA_ADDRESS */ /* Define this for LCD backlight available */ @@ -124,10 +112,10 @@ #define PLUGIN_BUFFER_SIZE 0x80000 /* TODO: Figure out real values */ -#define BATTERY_CAPACITY_DEFAULT 600 /* default battery capacity */ -#define BATTERY_CAPACITY_MIN 300 /* min. capacity selectable */ -#define BATTERY_CAPACITY_MAX 600 /* max. capacity selectable */ -#define BATTERY_CAPACITY_INC 10 /* capacity increment */ +#define BATTERY_CAPACITY_DEFAULT 4000 /* default battery capacity */ +#define BATTERY_CAPACITY_MIN 3000 /* min. capacity selectable */ +#define BATTERY_CAPACITY_MAX 4100 /* max. capacity selectable */ +#define BATTERY_CAPACITY_INC 50 /* capacity increment */ #define BATTERY_TYPES_COUNT 1 /* only one type */ /* Hardware controlled charging with monitoring */ diff --git a/firmware/export/tda1543.h b/firmware/export/dummy_codec.h similarity index 92% rename from firmware/export/tda1543.h rename to firmware/export/dummy_codec.h index 6561f0823a..b85ec8fb0e 100644 --- a/firmware/export/tda1543.h +++ b/firmware/export/dummy_codec.h @@ -19,11 +19,11 @@ * KIND, either express or implied. * ****************************************************************************/ -#ifndef __TDA1543_H_ -#define __TDA1543_H_ +#ifndef __DUMMY_CODEC_H_ +#define __DUMMY_CODEC_H_ #define VOLUME_MIN -1 #define VOLUME_MAX 0 -#endif /* __TDA1543_H_ */ +#endif /* __DUMMY_CODEC_H_ */ diff --git a/firmware/target/arm/rk27xx/debug-target.h b/firmware/target/arm/rk27xx/debug-target.h index c083b9282a..fb4abaeed7 100644 --- a/firmware/target/arm/rk27xx/debug-target.h +++ b/firmware/target/arm/rk27xx/debug-target.h @@ -26,7 +26,7 @@ #ifdef RK27_GENERIC #define DEBUG_CANCEL BUTTON_VOL -#elif defined(HM60X) +#elif defined(HM60X) || defined(HM801) #define DEBUG_CANCEL BUTTON_LEFT #endif diff --git a/firmware/target/arm/rk27xx/hm801/button-hm801.c b/firmware/target/arm/rk27xx/hm801/button-hm801.c new file mode 100644 index 0000000000..8e3d46bf0d --- /dev/null +++ b/firmware/target/arm/rk27xx/hm801/button-hm801.c @@ -0,0 +1,68 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2011 Andrew Ryabinin + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include "config.h" +#include "system.h" +#include "button.h" +#include "adc.h" + +void button_init_device(void) { + /* setup button gpio as input */ + GPIO_PCCON &= ~(POWEROFF_BUTTON); +} + +int button_read_device(void) { + int adc_val = adc_read(ADC_BUTTONS); + int button = 0; + + if (adc_val < 480) { /* middle */ + if (adc_val < 200) { /* 200 - 0 */ + if (adc_val < 30) { + button = BUTTON_UP; + } else { + button = BUTTON_RIGHT; /* 30 - 200 */ + } + } else { /* 200 - 480 */ + if (adc_val < 370) { + button = BUTTON_SELECT; + } else { + button = BUTTON_DOWN; + } + } + } else { /* > 480 */ + if (adc_val < 690) { /* 480 - 690 */ + if (adc_val < 580) { + button = BUTTON_LEFT; + } else { + button = BUTTON_NEXT; + } + } else { /* > 680 */ + if (adc_val < 840) { + button = BUTTON_PREV; + } else { + if (adc_val < 920) { + button = BUTTON_PLAY; + } + } + } + } + return button | (GPIO_PCDR & POWEROFF_BUTTON); +} diff --git a/firmware/target/arm/rk27xx/debug-target.h b/firmware/target/arm/rk27xx/hm801/button-target.h similarity index 61% copy from firmware/target/arm/rk27xx/debug-target.h copy to firmware/target/arm/rk27xx/hm801/button-target.h index c083b9282a..4af054b07c 100644 --- a/firmware/target/arm/rk27xx/debug-target.h +++ b/firmware/target/arm/rk27xx/hm801/button-target.h @@ -7,7 +7,7 @@ * \/ \/ \/ \/ \/ * $Id$ * - * Copyright (C) 2007 by Karl Kurbjun + * Copyright (C) 2011 Andrew Ryabinin * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -18,20 +18,30 @@ * KIND, either express or implied. * ****************************************************************************/ - -#ifndef _DEBUG_TARGET_H_ -#define _DEBUG_TARGET_H_ +#ifndef _BUTTON_TARGET_H_ +#define _BUTTON_TARGET_H_ #include +#include "config.h" + +void button_init_device(void); +int button_read_device(void); + + +#define BUTTON_UP 0x00000001 +#define BUTTON_DOWN 0x00000004 +#define BUTTON_LEFT 0x00000008 +#define BUTTON_RIGHT 0x00000010 +#define BUTTON_SELECT 0x00000020 +#define BUTTON_NEXT 0x00000040 +#define BUTTON_PREV 0x00000080 +#define BUTTON_PLAY 0x00000100 + -#ifdef RK27_GENERIC -#define DEBUG_CANCEL BUTTON_VOL -#elif defined(HM60X) -#define DEBUG_CANCEL BUTTON_LEFT -#endif +#define BUTTON_REMOTE 0 -bool dbg_hw_info(void); -bool dbg_ports(void); -#endif /* _DEBUG_TARGET_H_ */ +#define POWEROFF_BUTTON 0x02 +#define POWEROFF_COUNT 30 +#endif /* _BUTTON_TARGET_H_ */ diff --git a/firmware/target/arm/rk27xx/debug-target.h b/firmware/target/arm/rk27xx/hm801/power-hm801.c similarity index 64% copy from firmware/target/arm/rk27xx/debug-target.h copy to firmware/target/arm/rk27xx/hm801/power-hm801.c index c083b9282a..18a0566a78 100644 --- a/firmware/target/arm/rk27xx/debug-target.h +++ b/firmware/target/arm/rk27xx/hm801/power-hm801.c @@ -7,7 +7,7 @@ * \/ \/ \/ \/ \/ * $Id$ * - * Copyright (C) 2007 by Karl Kurbjun + * Copyright © 2009 Bertrik Sikken * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -18,20 +18,32 @@ * KIND, either express or implied. * ****************************************************************************/ - -#ifndef _DEBUG_TARGET_H_ -#define _DEBUG_TARGET_H_ - #include +#include "config.h" +#include "inttypes.h" +#include "power.h" +#include "panic.h" +#include "system.h" +#include "usb_core.h" /* for usb_charging_maxcurrent_change */ -#ifdef RK27_GENERIC -#define DEBUG_CANCEL BUTTON_VOL -#elif defined(HM60X) -#define DEBUG_CANCEL BUTTON_LEFT -#endif +void power_off(void) +{ + GPIO_PCDR &= ~(1<<0); + while(1); +} -bool dbg_hw_info(void); -bool dbg_ports(void); +void power_init(void) +{ + GPIO_PCDR |= (1<<0); + GPIO_PCCON |= (1<<0); +} -#endif /* _DEBUG_TARGET_H_ */ +unsigned int power_input_status(void) +{ + return (usb_detect() == USB_INSERTED) ? POWER_INPUT_MAIN_CHARGER : POWER_INPUT_NONE; +} +bool charging_state(void) +{ + return true; +} diff --git a/firmware/target/arm/rk27xx/hm801/powermgmt-hm801.c b/firmware/target/arm/rk27xx/hm801/powermgmt-hm801.c new file mode 100644 index 0000000000..a815d893b2 --- /dev/null +++ b/firmware/target/arm/rk27xx/hm801/powermgmt-hm801.c @@ -0,0 +1,60 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright © 2011 Andrew Ryabinin + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * 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 "adc-target.h" +#include "powermgmt.h" + +/* Battery voltage calculation and discharge/charge curves for the HiFiMAN HM-801. + + I don't know how to calculate battery voltage, so all values represented here is just + values from adc battery channel, not millivolts. + Discharge and charge curves have not been calibrated yet. +*/ + +const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] = +{ + /* OF power off device when this value reached */ + 430 +}; + +const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] = +{ + 425 +}; + +/* adc values of 0%, 10%, ... 100% when charging disabled */ +const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] = +{ + /* TODO: simple uncalibrated curve */ + { 425, 430, 440, 450, 460, 470, 480, 490, 500, 510, 520 } +}; + +/* adc values of 0%, 10%, ... 100% when charging enabled */ +const unsigned short percent_to_volt_charge[11] = + /* TODO: simple uncalibrated curve */ + { 425, 430, 440, 450, 460, 470, 480, 490, 500, 510, 520 }; + +unsigned int battery_adc_voltage(void) +{ + return adc_read(ADC_BATTERY); +} diff --git a/firmware/target/arm/rk27xx/hm60x/lcd-hm60x.c b/firmware/target/arm/rk27xx/lcd-hifiman.c similarity index 100% rename from firmware/target/arm/rk27xx/hm60x/lcd-hm60x.c rename to firmware/target/arm/rk27xx/lcd-hifiman.c diff --git a/firmware/target/arm/rk27xx/lcdif-rk27xx.c b/firmware/target/arm/rk27xx/lcdif-rk27xx.c index aeee63ee7e..a5e18b0800 100644 --- a/firmware/target/arm/rk27xx/lcdif-rk27xx.c +++ b/firmware/target/arm/rk27xx/lcdif-rk27xx.c @@ -37,7 +37,7 @@ unsigned int lcd_data_transform(unsigned int data) /* g = ((data & 0x00000300) >> 2) | ((data & 0x000000e0) >> 3); */ g = ((data & 0x00000300) << 6) | ((data & 0x000000e0) << 5); b = (data & 0x00000001f) << 3; -#elif defined(HM60X) +#elif defined(HM60X) || defined(HM801) /* 16 bit interface */ r = (data & 0x0000f800) << 8; g = (data & 0x000007e0) << 5; diff --git a/firmware/target/arm/rk27xx/sd-rk27xx.c b/firmware/target/arm/rk27xx/sd-rk27xx.c index 1742852c16..f3081d2d7d 100644 --- a/firmware/target/arm/rk27xx/sd-rk27xx.c +++ b/firmware/target/arm/rk27xx/sd-rk27xx.c @@ -126,10 +126,16 @@ static void mmu_buff_reset(void) MMU_CTRL |= MMU_BUFII_RESET | MMU_BUFI_RESET; } -/* My generic device uses PC7 pin, active low */ static inline bool card_detect_target(void) { +#if defined(RK27_GENERIC) +/* My generic device uses PC7 pin, active low */ return !(GPIO_PCDR & 0x80); +#elif defined(HM60X) || defined(HM801) + return !(GPIO_PFDR & (1<<2)); +#else +#error "Unknown target" +#endif } /* Send command to the SD card. Command finish is signaled in ISR */ diff --git a/tools/configure b/tools/configure index 5b84f8774e..42cd2f8b07 100755 --- a/tools/configure +++ b/tools/configure @@ -1292,6 +1292,7 @@ cat <