From 2164aab9020bb37ec71a24461c4c42bc4e2eb2d3 Mon Sep 17 00:00:00 2001 From: Andrew Ryabinin Date: Thu, 3 Nov 2011 11:53:02 +0000 Subject: 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 --- firmware/target/arm/rk27xx/debug-target.h | 2 +- firmware/target/arm/rk27xx/hm60x/lcd-hm60x.c | 148 --------------------- firmware/target/arm/rk27xx/hm801/button-hm801.c | 68 ++++++++++ firmware/target/arm/rk27xx/hm801/button-target.h | 47 +++++++ firmware/target/arm/rk27xx/hm801/power-hm801.c | 49 +++++++ firmware/target/arm/rk27xx/hm801/powermgmt-hm801.c | 60 +++++++++ firmware/target/arm/rk27xx/lcd-hifiman.c | 148 +++++++++++++++++++++ firmware/target/arm/rk27xx/lcdif-rk27xx.c | 2 +- firmware/target/arm/rk27xx/sd-rk27xx.c | 8 +- 9 files changed, 381 insertions(+), 151 deletions(-) delete mode 100644 firmware/target/arm/rk27xx/hm60x/lcd-hm60x.c create mode 100644 firmware/target/arm/rk27xx/hm801/button-hm801.c create mode 100644 firmware/target/arm/rk27xx/hm801/button-target.h create mode 100644 firmware/target/arm/rk27xx/hm801/power-hm801.c create mode 100644 firmware/target/arm/rk27xx/hm801/powermgmt-hm801.c create mode 100644 firmware/target/arm/rk27xx/lcd-hifiman.c (limited to 'firmware/target') 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/hm60x/lcd-hm60x.c b/firmware/target/arm/rk27xx/hm60x/lcd-hm60x.c deleted file mode 100644 index 932154da8d..0000000000 --- a/firmware/target/arm/rk27xx/hm60x/lcd-hm60x.c +++ /dev/null @@ -1,148 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * 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 "kernel.h" -#include "lcd.h" -#include "system.h" -#include "cpu.h" -#include "lcdif-rk27xx.h" - - -/* TODO */ -static void lcd_sleep(unsigned int sleep) -{ - (void)sleep; -} - -void lcd_display_init() -{ - unsigned int x, y; - - /* Driving ability setting */ - lcd_write_reg(0x60, 0x00); - lcd_write_reg(0x61, 0x06); - lcd_write_reg(0x62, 0x00); - lcd_write_reg(0x63, 0xC8); - - /* Gamma 2.2 Setting */ - lcd_write_reg(0x40, 0x00); - lcd_write_reg(0x41, 0x40); - lcd_write_reg(0x42, 0x45); - lcd_write_reg(0x43, 0x01); - lcd_write_reg(0x44, 0x60); - lcd_write_reg(0x45, 0x05); - lcd_write_reg(0x46, 0x0C); - lcd_write_reg(0x47, 0xD1); - lcd_write_reg(0x48, 0x05); - - lcd_write_reg(0x50, 0x75); - lcd_write_reg(0x51, 0x01); - lcd_write_reg(0x52, 0x67); - lcd_write_reg(0x53, 0x14); - lcd_write_reg(0x54, 0xF2); - lcd_write_reg(0x55, 0x07); - lcd_write_reg(0x56, 0x03); - lcd_write_reg(0x57, 0x49); - - /* Power voltage setting */ - lcd_write_reg(0x1F, 0x03); - lcd_write_reg(0x20, 0x00); - lcd_write_reg(0x24, 0x28); - lcd_write_reg(0x25, 0x45); - - lcd_write_reg(0x23, 0x2F); - - /* Power on setting */ - lcd_write_reg(0x18, 0x44); - lcd_write_reg(0x21, 0x01); - lcd_write_reg(0x01, 0x00); - lcd_write_reg(0x1C, 0x03); - lcd_write_reg(0x19, 0x06); - udelay(5); - - /* Display on setting */ - lcd_write_reg(0x26, 0x84); - udelay(40); - lcd_write_reg(0x26, 0xB8); - udelay(40); - lcd_write_reg(0x26, 0xBC); - udelay(40); - - /* Memmory access setting */ - lcd_write_reg(0x16, 0x48); - /* Setup 16bit mode */ - lcd_write_reg(0x17, 0x05); - - /* Set GRAM area */ - lcd_write_reg(0x02, 0x00); - lcd_write_reg(0x03, 0x00); - lcd_write_reg(0x04, 0x00); - lcd_write_reg(0x05, LCD_HEIGHT - 1); - lcd_write_reg(0x06, 0x00); - lcd_write_reg(0x07, 0x00); - lcd_write_reg(0x08, 0x00); - lcd_write_reg(0x09, LCD_WIDTH - 1); - - /* Start GRAM write */ - lcd_cmd(0x22); - - for (x=0; x ) \___| < | \_\ ( <_> > < < + * 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 0000000000..4af054b07c --- /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 +#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 0000000000..18a0566a78 --- /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 +#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 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/lcd-hifiman.c b/firmware/target/arm/rk27xx/lcd-hifiman.c new file mode 100644 index 0000000000..932154da8d --- /dev/null +++ b/firmware/target/arm/rk27xx/lcd-hifiman.c @@ -0,0 +1,148 @@ +/*************************************************************************** + * __________ __ ___. + * 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 "kernel.h" +#include "lcd.h" +#include "system.h" +#include "cpu.h" +#include "lcdif-rk27xx.h" + + +/* TODO */ +static void lcd_sleep(unsigned int sleep) +{ + (void)sleep; +} + +void lcd_display_init() +{ + unsigned int x, y; + + /* Driving ability setting */ + lcd_write_reg(0x60, 0x00); + lcd_write_reg(0x61, 0x06); + lcd_write_reg(0x62, 0x00); + lcd_write_reg(0x63, 0xC8); + + /* Gamma 2.2 Setting */ + lcd_write_reg(0x40, 0x00); + lcd_write_reg(0x41, 0x40); + lcd_write_reg(0x42, 0x45); + lcd_write_reg(0x43, 0x01); + lcd_write_reg(0x44, 0x60); + lcd_write_reg(0x45, 0x05); + lcd_write_reg(0x46, 0x0C); + lcd_write_reg(0x47, 0xD1); + lcd_write_reg(0x48, 0x05); + + lcd_write_reg(0x50, 0x75); + lcd_write_reg(0x51, 0x01); + lcd_write_reg(0x52, 0x67); + lcd_write_reg(0x53, 0x14); + lcd_write_reg(0x54, 0xF2); + lcd_write_reg(0x55, 0x07); + lcd_write_reg(0x56, 0x03); + lcd_write_reg(0x57, 0x49); + + /* Power voltage setting */ + lcd_write_reg(0x1F, 0x03); + lcd_write_reg(0x20, 0x00); + lcd_write_reg(0x24, 0x28); + lcd_write_reg(0x25, 0x45); + + lcd_write_reg(0x23, 0x2F); + + /* Power on setting */ + lcd_write_reg(0x18, 0x44); + lcd_write_reg(0x21, 0x01); + lcd_write_reg(0x01, 0x00); + lcd_write_reg(0x1C, 0x03); + lcd_write_reg(0x19, 0x06); + udelay(5); + + /* Display on setting */ + lcd_write_reg(0x26, 0x84); + udelay(40); + lcd_write_reg(0x26, 0xB8); + udelay(40); + lcd_write_reg(0x26, 0xBC); + udelay(40); + + /* Memmory access setting */ + lcd_write_reg(0x16, 0x48); + /* Setup 16bit mode */ + lcd_write_reg(0x17, 0x05); + + /* Set GRAM area */ + lcd_write_reg(0x02, 0x00); + lcd_write_reg(0x03, 0x00); + lcd_write_reg(0x04, 0x00); + lcd_write_reg(0x05, LCD_HEIGHT - 1); + lcd_write_reg(0x06, 0x00); + lcd_write_reg(0x07, 0x00); + lcd_write_reg(0x08, 0x00); + lcd_write_reg(0x09, LCD_WIDTH - 1); + + /* Start GRAM write */ + lcd_cmd(0x22); + + for (x=0; x> 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 */ -- cgit v1.2.3