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
This commit is contained in:
Andrew Ryabinin 2011-11-03 11:53:02 +00:00
parent 50211e2054
commit 2164aab902
19 changed files with 560 additions and 13 deletions

View file

@ -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

View file

@ -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);
}

View file

@ -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_ */

View file

@ -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;
}

View file

@ -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);
}

View file

@ -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;

View file

@ -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 */