diff options
| author | Andrew Ryabinin <ryabinin.a.a@gmail.com> | 2011-11-03 11:53:02 +0000 |
|---|---|---|
| committer | Andrew Ryabinin <ryabinin.a.a@gmail.com> | 2011-11-03 11:53:02 +0000 |
| commit | 2164aab9020bb37ec71a24461c4c42bc4e2eb2d3 (patch) | |
| tree | dbf138f0f8d84789b335e6059508176a71fe0cde /firmware | |
| parent | 50211e20548bf3a5f7781489269a297cad58713e (diff) | |
| download | rockbox-2164aab9020bb37ec71a24461c4c42bc4e2eb2d3.zip rockbox-2164aab9020bb37ec71a24461c4c42bc4e2eb2d3.tar.gz rockbox-2164aab9020bb37ec71a24461c4c42bc4e2eb2d3.tar.bz2 rockbox-2164aab9020bb37ec71a24461c4c42bc4e2eb2d3.tar.xz | |
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
Diffstat (limited to 'firmware')
| -rw-r--r-- | firmware/SOURCES | 15 | ||||
| -rw-r--r-- | firmware/drivers/audio/dummy_codec.c (renamed from firmware/drivers/audio/tda1543.c) | 0 | ||||
| -rw-r--r-- | firmware/export/audiohw.h | 4 | ||||
| -rw-r--r-- | firmware/export/config.h | 3 | ||||
| -rw-r--r-- | firmware/export/config/hifimanhm60x.h | 2 | ||||
| -rw-r--r-- | firmware/export/config/hifimanhm801.h | 171 | ||||
| -rw-r--r-- | firmware/export/dummy_codec.h (renamed from firmware/export/tda1543.h) | 6 | ||||
| -rw-r--r-- | firmware/target/arm/rk27xx/debug-target.h | 2 | ||||
| -rw-r--r-- | firmware/target/arm/rk27xx/hm801/button-hm801.c | 68 | ||||
| -rw-r--r-- | firmware/target/arm/rk27xx/hm801/button-target.h | 47 | ||||
| -rw-r--r-- | firmware/target/arm/rk27xx/hm801/power-hm801.c | 49 | ||||
| -rw-r--r-- | firmware/target/arm/rk27xx/hm801/powermgmt-hm801.c | 60 | ||||
| -rw-r--r-- | firmware/target/arm/rk27xx/lcd-hifiman.c (renamed from firmware/target/arm/rk27xx/hm60x/lcd-hm60x.c) | 0 | ||||
| -rw-r--r-- | firmware/target/arm/rk27xx/lcdif-rk27xx.c | 2 | ||||
| -rw-r--r-- | firmware/target/arm/rk27xx/sd-rk27xx.c | 8 |
15 files changed, 425 insertions, 12 deletions
diff --git a/firmware/SOURCES b/firmware/SOURCES index b729a9b..e7d8820 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 index ca51d95..ca51d95 100644 --- a/firmware/drivers/audio/tda1543.c +++ b/firmware/drivers/audio/dummy_codec.c diff --git a/firmware/export/audiohw.h b/firmware/export/audiohw.h index e40ee6e..6bf4d71 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 <SDL_audio.h> gives errors in other code areas, diff --git a/firmware/export/config.h b/firmware/export/config.h index 0d0617b..65c27ce 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 88af364..6ac4380 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/hifimanhm801.h b/firmware/export/config/hifimanhm801.h new file mode 100644 index 0000000..d0e805d --- /dev/null +++ b/firmware/export/config/hifimanhm801.h @@ -0,0 +1,171 @@ +/* + * This config file is for HiFiMAN HM-60x reference design + */ +#define TARGET_TREE /* this target is using the target tree system */ + +/* For Rolo and boot loader */ +#define MODEL_NUMBER 80 + +#define MODEL_NAME "HiFiMAN HM-801" + + +/* 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_DUMMY_CODEC +#define CODEC_SLAVE +/* define this if you have a bitmap LCD display */ +#define HAVE_LCD_BITMAP + +/* define this if you can flip your LCD */ +/* #define HAVE_LCD_FLIP */ + +/* 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 to enable bitmap scaling */ +#define HAVE_BMP_SCALING + +/* define this to enable JPEG decoding */ +#define HAVE_JPEG + +/* define this if you can invert the colours on your LCD */ +/* #define HAVE_LCD_INVERT */ + +/* 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 + +/* define this if you have a flash memory storage */ +#define HAVE_FLASH_STORAGE + +#define CONFIG_STORAGE (STORAGE_SD | STORAGE_NAND) + +#define CONFIG_NAND NAND_RK27XX +#define HAVE_SW_TONE_CONTROLS + +/* commented for now */ +/* #define HAVE_HOTSWAP */ + +#define NUM_DRIVES 2 +#define SECTOR_SIZE 512 + +/* for small(ish) SD cards */ +#define HAVE_FAT16SUPPORT + +/* LCD dimensions */ +#define LCD_WIDTH 220 +#define LCD_HEIGHT 176 +#define LCD_DEPTH 16 /* pseudo 262.144 colors */ +#define LCD_PIXELFORMAT RGB565 /* rgb565 */ + +/* Define this if the LCD can shut down */ +/* #define HAVE_LCD_SHUTDOWN */ + +/* 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. */ +#ifndef BOOTLOADER +/* TODO: #define HAVE_LCD_SLEEP */ +/* TODO: #define HAVE_LCD_SLEEP_SETTING */ +#endif + +#define CONFIG_KEYPAD HM801_PAD + +/* Define this to enable morse code input */ +#define HAVE_MORSE_INPUT + +/* Define this if you do software codec */ +#define CONFIG_CODEC SWCODEC + +#define CONFIG_LCD LCD_HX8340B + +/* #define HAVE_PCM_DMA_ADDRESS */ + +/* Define this for LCD backlight available */ +#define HAVE_BACKLIGHT +#define HAVE_BACKLIGHT_BRIGHTNESS +#define MIN_BRIGHTNESS_SETTING 0 +#define MAX_BRIGHTNESS_SETTING 31 +#define DEFAULT_BRIGHTNESS_SETTING 20 +#define CONFIG_BACKLIGHT_FADING BACKLIGHT_FADING_SW_HW_REG + +/* Define this if you have a software controlled poweroff */ +#define HAVE_SW_POWEROFF + +/* The number of bytes reserved for loadable codecs */ +#define CODEC_SIZE 0x100000 + +/* The number of bytes reserved for loadable plugins */ +#define PLUGIN_BUFFER_SIZE 0x80000 + +/* TODO: Figure out real values */ +#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 */ +#define CONFIG_CHARGING CHARGING_MONITOR + +/* define current usage levels */ +/* TODO: #define CURRENT_NORMAL + * TODO: #define CURRENT_BACKLIGHT 23 + */ + +/* define this if the unit can be powered or charged via USB */ +#define HAVE_USB_POWER + +/* USB On-the-go */ +#define CONFIG_USBOTG USBOTG_RK27XX + +/* enable these for the experimental usb stack */ +#define HAVE_USBSTACK + +#define USE_ROCKBOX_USB +#define USB_VENDOR_ID 0x071b +#define USB_PRODUCT_ID 0x3202 +#define HAVE_BOOTLOADER_USB_MODE + +/* Define this if your LCD can set contrast */ +/* #define HAVE_LCD_CONTRAST */ + +/* The exact type of CPU */ +#define CONFIG_CPU RK27XX + +/* I2C interface */ +#define CONFIG_I2C I2C_RK27XX + +/* Define this to the CPU frequency */ +#define CPU_FREQ 200000000 + +/* define this if the hardware can be powered off while charging */ +/* #define HAVE_POWEROFF_WHILE_CHARGING */ + +/* Offset ( in the firmware file's header ) to the file CRC */ +#define FIRMWARE_OFFSET_FILE_CRC 0 + +/* Offset ( in the firmware file's header ) to the real data */ +#define FIRMWARE_OFFSET_FILE_DATA 8 + +#define STORAGE_NEEDS_ALIGN + +/* Define this if you have adjustable CPU frequency */ +/* #define HAVE_ADJUSTABLE_CPU_FREQ */ + +#define BOOTFILE_EXT "rk27" +#define BOOTFILE "rockbox." BOOTFILE_EXT +#define BOOTDIR "/.rockbox" diff --git a/firmware/export/tda1543.h b/firmware/export/dummy_codec.h index 6561f08..b85ec8f 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 c083b92..fb4abae 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 0000000..8e3d46b --- /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/hm801/button-target.h b/firmware/target/arm/rk27xx/hm801/button-target.h new file mode 100644 index 0000000..4af054b --- /dev/null +++ b/firmware/target/arm/rk27xx/hm801/button-target.h @@ -0,0 +1,47 @@ +/*************************************************************************** + * __________ __ ___. + * 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. + * + ****************************************************************************/ +#ifndef _BUTTON_TARGET_H_ +#define _BUTTON_TARGET_H_ + +#include <stdbool.h> +#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 + + +#define BUTTON_REMOTE 0 + + +#define POWEROFF_BUTTON 0x02 +#define POWEROFF_COUNT 30 + +#endif /* _BUTTON_TARGET_H_ */ diff --git a/firmware/target/arm/rk27xx/hm801/power-hm801.c b/firmware/target/arm/rk27xx/hm801/power-hm801.c new file mode 100644 index 0000000..18a0566 --- /dev/null +++ b/firmware/target/arm/rk27xx/hm801/power-hm801.c @@ -0,0 +1,49 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * 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 + * 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 <stdbool.h> +#include "config.h" +#include "inttypes.h" +#include "power.h" +#include "panic.h" +#include "system.h" +#include "usb_core.h" /* for usb_charging_maxcurrent_change */ + +void power_off(void) +{ + GPIO_PCDR &= ~(1<<0); + while(1); +} + +void power_init(void) +{ + GPIO_PCDR |= (1<<0); + GPIO_PCCON |= (1<<0); +} + +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 0000000..a815d89 --- /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 index 932154d..932154d 100644 --- a/firmware/target/arm/rk27xx/hm60x/lcd-hm60x.c +++ b/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 aeee63e..a5e18b0 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 1742852..f3081d2 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 */ |