diff --git a/firmware/SOURCES b/firmware/SOURCES index 7d8efbe272..6470528746 100644 --- a/firmware/SOURCES +++ b/firmware/SOURCES @@ -625,7 +625,7 @@ target/arm/wmcodec-pp.c target/arm/i2s-pp.c target/arm/ipod/adc-ipod.c target/arm/ipod/3g/backlight-3g.c -target/arm/ipod/3g/button-3g.c +target/arm/ipod/button-1g-3g.c target/arm/ipod/lcd-gray.c target/arm/ipod/power-ipod.c target/arm/usb-pp.c @@ -638,8 +638,8 @@ target/arm/ata-pp5002.c target/arm/wmcodec-pp.c target/arm/i2s-pp.c target/arm/ipod/adc-ipod.c -target/arm/ipod/3g/backlight-3g.c /* FIXME */ -target/arm/ipod/3g/button-3g.c /* FIXME */ +target/arm/ipod/1g2g/backlight-1g2g.c +target/arm/ipod/button-1g-3g.c target/arm/ipod/lcd-gray.c target/arm/ipod/power-ipod.c #endif /* SIMULATOR */ diff --git a/firmware/export/config-ipod1g2g.h b/firmware/export/config-ipod1g2g.h index 40b158407d..bfff2b22ef 100644 --- a/firmware/export/config-ipod1g2g.h +++ b/firmware/export/config-ipod1g2g.h @@ -38,7 +38,7 @@ /* LCD contrast */ #define MIN_CONTRAST_SETTING 5 #define MAX_CONTRAST_SETTING 63 -#define DEFAULT_CONTRAST_SETTING 40 /* Match boot contrast */ +#define DEFAULT_CONTRAST_SETTING 28 /* Match boot contrast */ #define CONFIG_KEYPAD IPOD_1G2G_PAD @@ -63,6 +63,9 @@ /* Define this for LCD backlight available */ #define HAVE_BACKLIGHT +/* Define this if the backlight unverts LCD appearance */ +#define HAVE_BACKLIGHT_INVERSION + #define BATTERY_CAPACITY_DEFAULT 630 /* default battery capacity */ #ifndef SIMULATOR diff --git a/firmware/target/arm/ipod/1g2g/backlight-1g2g.c b/firmware/target/arm/ipod/1g2g/backlight-1g2g.c new file mode 100644 index 0000000000..88d638f4e3 --- /dev/null +++ b/firmware/target/arm/ipod/1g2g/backlight-1g2g.c @@ -0,0 +1,34 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2002 by Linus Nielsen Feltzing + * + * 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 "system.h" +#include "backlight.h" +#include "lcd.h" + +void __backlight_on(void) +{ + outl(inl(0xc0001000) | 0x02, 0xc0001000); + lcd_set_backlight_inversion(true); +} + +void __backlight_off(void) +{ + outl(inl(0xc0001000) & ~0x02, 0xc0001000); + lcd_set_backlight_inversion(false); +} diff --git a/firmware/target/arm/ipod/3g/backlight-3g.c b/firmware/target/arm/ipod/3g/backlight-3g.c index b676e2473b..251c722dae 100644 --- a/firmware/target/arm/ipod/3g/backlight-3g.c +++ b/firmware/target/arm/ipod/3g/backlight-3g.c @@ -17,18 +17,7 @@ * ****************************************************************************/ #include "config.h" -#include -#include "cpu.h" -#include "kernel.h" -#include "thread.h" -#include "i2c.h" -#include "debug.h" -#include "rtc.h" -#include "usb.h" -#include "power.h" #include "system.h" -#include "button.h" -#include "timer.h" #include "backlight.h" inline void __backlight_on(void) diff --git a/firmware/target/arm/ipod/adc-ipod.c b/firmware/target/arm/ipod/adc-ipod.c index 493b98ef74..39463af30b 100644 --- a/firmware/target/arm/ipod/adc-ipod.c +++ b/firmware/target/arm/ipod/adc-ipod.c @@ -55,7 +55,7 @@ static unsigned short _adc_read(struct adc_struct *adc) } adc->data = value; return value; - } else + } else #endif { return adc->data; @@ -66,11 +66,19 @@ static unsigned short _adc_read(struct adc_struct *adc) unsigned short adc_scan(int channel) { struct adc_struct *adc = &adcdata[channel]; adc->timeout = 0; +#ifdef IPOD_1G2G + if (channel == ADC_UNREG_POWER) + return 681; /* FIXME fake 4.00V */ +#endif return _adc_read(adc); } /* Retrieve the ADC value, only does a scan periodically */ unsigned short adc_read(int channel) { +#ifdef IPOD_1G2G + if (channel == ADC_UNREG_POWER) + return 681; /* FIXME fake 4.00V */ +#endif return _adc_read(&adcdata[channel]); } diff --git a/firmware/target/arm/ipod/3g/button-3g.c b/firmware/target/arm/ipod/button-1g-3g.c similarity index 98% rename from firmware/target/arm/ipod/3g/button-3g.c rename to firmware/target/arm/ipod/button-1g-3g.c index aa26e30280..a546bea9b6 100644 --- a/firmware/target/arm/ipod/3g/button-3g.c +++ b/firmware/target/arm/ipod/button-1g-3g.c @@ -194,7 +194,11 @@ int button_read_device(void) bool button_hold(void) { - return (GPIOA_INPUT_VAL & 0x20)?false:true; +#ifdef IPOD_1G2G + return (GPIOA_INPUT_VAL & 0x20); +#else + return !(GPIOA_INPUT_VAL & 0x20); +#endif } bool headphones_inserted(void) diff --git a/firmware/target/arm/ipod/lcd-gray.c b/firmware/target/arm/ipod/lcd-gray.c index 0a3a4ae797..7a60eb6470 100644 --- a/firmware/target/arm/ipod/lcd-gray.c +++ b/firmware/target/arm/ipod/lcd-gray.c @@ -68,6 +68,12 @@ static inline bool timer_check(int clock_start, int usecs) #define R_RAM_ADDR_SET 0x11 #define R_RAM_DATA 0x12 +#ifdef HAVE_BACKLIGHT_INVERSION +/* The backlight makes the LCD appear negative on the 1st/2nd gen */ +static bool lcd_inverted = false; +static bool lcd_backlit = false; +#endif + /* needed for flip */ static int addr_offset; #if defined(IPOD_MINI) || defined(IPOD_MINI2G) @@ -146,7 +152,9 @@ void lcd_init_device(void) int lcd_default_contrast(void) { -#if defined(IPOD_MINI) || defined(IPOD_MINI2G) || defined(IPOD_3G) +#ifdef IPOD_1G2G + return 28; +#elif defined(IPOD_MINI) || defined(IPOD_MINI2G) || defined(IPOD_3G) return 42; #else return 35; @@ -162,6 +170,27 @@ void lcd_set_contrast(int val) lcd_cmd_and_data(R_CONTRAST_CONTROL, 0x400 | (val + 64)); } +#ifdef HAVE_BACKLIGHT_INVERSION +static void invert_display(void) +{ + if (lcd_inverted ^ lcd_backlit) + lcd_cmd_and_data(R_DISPLAY_CONTROL, 0x0023); + else + lcd_cmd_and_data(R_DISPLAY_CONTROL, 0x0009); +} + +void lcd_set_invert_display(bool yesno) +{ + lcd_inverted = yesno; + invert_display(); +} + +void lcd_set_backlight_inversion(bool yesno) +{ + lcd_backlit = yesno; + invert_display(); +} +#else void lcd_set_invert_display(bool yesno) { if (yesno) @@ -169,6 +198,7 @@ void lcd_set_invert_display(bool yesno) else lcd_cmd_and_data(R_DISPLAY_CONTROL, 0x0009); } +#endif /* turn the display upside down (call lcd_update() afterwards) */ void lcd_set_flip(bool yesno)