From 22e7bf32b894acc1f9e2820e213f05a57bd4148c Mon Sep 17 00:00:00 2001 From: Mark Arigo Date: Fri, 27 Jun 2008 18:40:25 +0000 Subject: 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 --- firmware/target/arm/philips/hdd1630/adc-target.h | 39 +++ .../target/arm/philips/hdd1630/backlight-hdd1630.c | 49 ++++ .../target/arm/philips/hdd1630/backlight-target.h | 36 +++ .../target/arm/philips/hdd1630/button-hdd1630.c | 65 +++++ .../target/arm/philips/hdd1630/button-target.h | 53 ++++ firmware/target/arm/philips/hdd1630/lcd-hdd1630.c | 266 +++++++++++++++++++++ .../target/arm/philips/hdd1630/power-hdd1630.c | 58 +++++ .../target/arm/philips/hdd1630/powermgmt-hdd1630.c | 62 +++++ firmware/target/arm/usb-fw-pp502x.c | 5 + 9 files changed, 633 insertions(+) create mode 100644 firmware/target/arm/philips/hdd1630/adc-target.h create mode 100755 firmware/target/arm/philips/hdd1630/backlight-hdd1630.c create mode 100755 firmware/target/arm/philips/hdd1630/backlight-target.h create mode 100755 firmware/target/arm/philips/hdd1630/button-hdd1630.c create mode 100755 firmware/target/arm/philips/hdd1630/button-target.h create mode 100755 firmware/target/arm/philips/hdd1630/lcd-hdd1630.c create mode 100755 firmware/target/arm/philips/hdd1630/power-hdd1630.c create mode 100644 firmware/target/arm/philips/hdd1630/powermgmt-hdd1630.c (limited to 'firmware/target/arm') 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 +#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 +#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; -- cgit v1.2.3