mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-12-09 13:15:18 -05:00
FS#4770 - Add USB charging for the H300 series
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12169 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
73ee2379c5
commit
338d94f466
13 changed files with 167 additions and 5 deletions
|
|
@ -78,6 +78,9 @@
|
||||||
#include "spdif.h"
|
#include "spdif.h"
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef IRIVER_H300_SERIES
|
||||||
|
#include "pcf50606.h" /* for pcf50606_read */
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef IAUDIO_X5
|
#ifdef IAUDIO_X5
|
||||||
#include "lcd-remote-target.h"
|
#include "lcd-remote-target.h"
|
||||||
|
|
@ -1059,6 +1062,16 @@ bool dbg_ports(void)
|
||||||
lcd_puts(0, line++, buf);
|
lcd_puts(0, line++, buf);
|
||||||
snprintf(buf, sizeof(buf), "GPIO1_ENABLE: %08x", gpio1_enable);
|
snprintf(buf, sizeof(buf), "GPIO1_ENABLE: %08x", gpio1_enable);
|
||||||
lcd_puts(0, line++, buf);
|
lcd_puts(0, line++, buf);
|
||||||
|
#if defined(IRIVER_H300_SERIES)
|
||||||
|
snprintf(buf, sizeof(buf), "GPOOD0: %08x", (unsigned int)pcf50606_read(0x37));
|
||||||
|
lcd_puts(0, line++, buf);
|
||||||
|
snprintf(buf, sizeof(buf), "GPOOD1: %08x", (unsigned int)pcf50606_read(0x38));
|
||||||
|
lcd_puts(0, line++, buf);
|
||||||
|
snprintf(buf, sizeof(buf), "GPOOD2: %08x", (unsigned int)pcf50606_read(0x39));
|
||||||
|
lcd_puts(0, line++, buf);
|
||||||
|
snprintf(buf, sizeof(buf), "GPOOD3: %08x", (unsigned int)pcf50606_read(0x3A));
|
||||||
|
lcd_puts(0, line++, buf);
|
||||||
|
#endif
|
||||||
|
|
||||||
adc_buttons = adc_read(ADC_BUTTONS);
|
adc_buttons = adc_read(ADC_BUTTONS);
|
||||||
adc_remote = adc_read(ADC_REMOTE);
|
adc_remote = adc_read(ADC_REMOTE);
|
||||||
|
|
@ -1422,6 +1435,14 @@ static bool view_battery(void)
|
||||||
snprintf(buf, 30, "long delta: %d", long_delta);
|
snprintf(buf, 30, "long delta: %d", long_delta);
|
||||||
lcd_puts(0, 6, buf);
|
lcd_puts(0, 6, buf);
|
||||||
lcd_puts(0, 7, power_message);
|
lcd_puts(0, 7, power_message);
|
||||||
|
snprintf(buf, 30, "USB Inserted: %s",
|
||||||
|
usb_inserted() ? "yes" : "no");
|
||||||
|
lcd_puts(0, 8, buf);
|
||||||
|
#if defined IRIVER_H300_SERIES
|
||||||
|
snprintf(buf, 30, "USB Charging Enabled: %s",
|
||||||
|
usb_charging_enabled() ? "yes" : "no");
|
||||||
|
lcd_puts(0, 9, buf);
|
||||||
|
#endif
|
||||||
#else /* CONFIG_CHARGING != CHARGING_CONTROL */
|
#else /* CONFIG_CHARGING != CHARGING_CONTROL */
|
||||||
#if defined IPOD_NANO || defined IPOD_VIDEO
|
#if defined IPOD_NANO || defined IPOD_VIDEO
|
||||||
int usb_pwr = (GPIOL_INPUT_VAL & 0x10)?true:false;
|
int usb_pwr = (GPIOL_INPUT_VAL & 0x10)?true:false;
|
||||||
|
|
|
||||||
|
|
@ -143,7 +143,7 @@ void gui_statusbar_draw(struct gui_statusbar * bar, bool force_redraw)
|
||||||
|
|
||||||
bar->info.battlevel = battery_level();
|
bar->info.battlevel = battery_level();
|
||||||
#ifdef HAVE_USB_POWER
|
#ifdef HAVE_USB_POWER
|
||||||
bar->info.usb_power = usb_powered();
|
bar->info.usb_inserted = usb_inserted();
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_CHARGING
|
#ifdef CONFIG_CHARGING
|
||||||
bar->info.inserted = (charger_input_state == CHARGER);
|
bar->info.inserted = (charger_input_state == CHARGER);
|
||||||
|
|
@ -238,7 +238,7 @@ void gui_statusbar_draw(struct gui_statusbar * bar, bool force_redraw)
|
||||||
gui_statusbar_icon_battery(display, bar->info.battlevel,
|
gui_statusbar_icon_battery(display, bar->info.battlevel,
|
||||||
bar->info.batt_charge_step);
|
bar->info.batt_charge_step);
|
||||||
#ifdef HAVE_USB_POWER
|
#ifdef HAVE_USB_POWER
|
||||||
if (bar->info.usb_power)
|
if (bar->info.usb_inserted)
|
||||||
display->mono_bitmap(bitmap_icons_7x8[Icon_USBPlug],
|
display->mono_bitmap(bitmap_icons_7x8[Icon_USBPlug],
|
||||||
STATUSBAR_PLUG_X_POS,
|
STATUSBAR_PLUG_X_POS,
|
||||||
STATUSBAR_Y_POS, STATUSBAR_PLUG_WIDTH,
|
STATUSBAR_Y_POS, STATUSBAR_PLUG_WIDTH,
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ struct status_info {
|
||||||
bool inserted;
|
bool inserted;
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_USB_POWER
|
#ifdef HAVE_USB_POWER
|
||||||
bool usb_power;
|
bool usb_inserted;
|
||||||
#endif
|
#endif
|
||||||
bool battery_state;
|
bool battery_state;
|
||||||
bool shuffle;
|
bool shuffle;
|
||||||
|
|
|
||||||
|
|
@ -3569,6 +3569,20 @@
|
||||||
*: "Batterieanzeige"
|
*: "Batterieanzeige"
|
||||||
</voice>
|
</voice>
|
||||||
</phrase>
|
</phrase>
|
||||||
|
<phrase>
|
||||||
|
id: LANG_USB_CHARGING
|
||||||
|
desc: in Battery menu
|
||||||
|
user:
|
||||||
|
<source>
|
||||||
|
*: "Charge During USB Connection"
|
||||||
|
</source>
|
||||||
|
<dest>
|
||||||
|
*: "Laden bei USB-Verbindung"
|
||||||
|
</dest>
|
||||||
|
<voice>
|
||||||
|
*: "Laden bei U S B Verbindung"
|
||||||
|
</voice>
|
||||||
|
</phrase>
|
||||||
<phrase>
|
<phrase>
|
||||||
id: LANG_DISPLAY_GRAPHIC
|
id: LANG_DISPLAY_GRAPHIC
|
||||||
desc: Label for type of icon display
|
desc: Label for type of icon display
|
||||||
|
|
|
||||||
|
|
@ -3610,6 +3610,20 @@
|
||||||
*: "Battery Display"
|
*: "Battery Display"
|
||||||
</voice>
|
</voice>
|
||||||
</phrase>
|
</phrase>
|
||||||
|
<phrase>
|
||||||
|
id: LANG_USB_CHARGING
|
||||||
|
desc: in Battery menu
|
||||||
|
user:
|
||||||
|
<source>
|
||||||
|
*: "Charge During USB Connection"
|
||||||
|
</source>
|
||||||
|
<dest>
|
||||||
|
*: "Charge During USB Connection"
|
||||||
|
</dest>
|
||||||
|
<voice>
|
||||||
|
*: "Charge During U S B Connection"
|
||||||
|
</voice>
|
||||||
|
</phrase>
|
||||||
<phrase>
|
<phrase>
|
||||||
id: LANG_DISPLAY_GRAPHIC
|
id: LANG_DISPLAY_GRAPHIC
|
||||||
desc: Label for type of icon display
|
desc: Label for type of icon display
|
||||||
|
|
|
||||||
|
|
@ -611,6 +611,12 @@ struct user_settings
|
||||||
unsigned char kbd_file[MAX_FILENAME+1]; /* last keyboard */
|
unsigned char kbd_file[MAX_FILENAME+1]; /* last keyboard */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_USB_POWER
|
||||||
|
#ifdef CONFIG_CHARGING
|
||||||
|
bool usb_charging;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_WM8758
|
#ifdef HAVE_WM8758
|
||||||
bool eq_hw_enabled; /* Enable hardware equalizer */
|
bool eq_hw_enabled; /* Enable hardware equalizer */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -690,7 +690,11 @@ const struct settings_list settings[] = {
|
||||||
#ifdef HAVE_LCD_BITMAP
|
#ifdef HAVE_LCD_BITMAP
|
||||||
FILENAME_SETTING(0,kbd_file,"kbd","",ROCKBOX_DIR "/",".kbd",MAX_FILENAME+1),
|
FILENAME_SETTING(0,kbd_file,"kbd","",ROCKBOX_DIR "/",".kbd",MAX_FILENAME+1),
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_USB_POWER
|
||||||
|
#ifdef CONFIG_CHARGING
|
||||||
|
OFFON_SETTING(0,usb_charging,LANG_USB_CHARGING,false,"usb charging",NULL),
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
const int nb_settings = sizeof(settings)/sizeof(*settings);
|
const int nb_settings = sizeof(settings)/sizeof(*settings);
|
||||||
|
|
|
||||||
|
|
@ -405,6 +405,12 @@ static bool clear_main_backdrop(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_USB_POWER
|
||||||
|
#ifdef CONFIG_CHARGING
|
||||||
|
#include "usb.h"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_LCD_COLOR
|
#ifdef HAVE_LCD_COLOR
|
||||||
/**
|
/**
|
||||||
* Menu for fore/back colors
|
* Menu for fore/back colors
|
||||||
|
|
@ -444,6 +450,22 @@ static bool reset_color(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_USB_POWER
|
||||||
|
#ifdef CONFIG_CHARGING
|
||||||
|
/**
|
||||||
|
* Menu to switch the USB charging on or off
|
||||||
|
*/
|
||||||
|
static bool usb_charging(void)
|
||||||
|
{
|
||||||
|
bool rc = set_bool(str(LANG_USB_CHARGING),
|
||||||
|
&global_settings.usb_charging);
|
||||||
|
/* if (usb_charging_enabled() != global_settings.usb_charging) */
|
||||||
|
usb_charging_enable(global_settings.usb_charging);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Menu to configure the battery display on status bar
|
* Menu to configure the battery display on status bar
|
||||||
*/
|
*/
|
||||||
|
|
@ -2083,6 +2105,11 @@ static bool battery_settings_menu(void)
|
||||||
#if BATTERY_TYPES_COUNT > 1
|
#if BATTERY_TYPES_COUNT > 1
|
||||||
{ ID2P(LANG_BATTERY_TYPE), battery_type },
|
{ ID2P(LANG_BATTERY_TYPE), battery_type },
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_USB_POWER
|
||||||
|
#ifdef CONFIG_CHARGING
|
||||||
|
{ ID2P(LANG_USB_CHARGING), usb_charging },
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
{ "Dummy", NULL }, /* to have an entry at all, in the simulator */
|
{ "Dummy", NULL }, /* to have an entry at all, in the simulator */
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,8 @@ int pcf50606_write_multiple(int address, const unsigned char* buf, int count);
|
||||||
int pcf50606_write(int address, unsigned char val);
|
int pcf50606_write(int address, unsigned char val);
|
||||||
int pcf50606_read_multiple(int address, unsigned char* buf, int count);
|
int pcf50606_read_multiple(int address, unsigned char* buf, int count);
|
||||||
int pcf50606_read(int address);
|
int pcf50606_read(int address);
|
||||||
|
void pcf50606_set_usb_charging(bool on);
|
||||||
|
bool pcf50606_usb_charging_enabled(void);
|
||||||
|
|
||||||
/* internal low level calls used by the eeprom driver for h300 */
|
/* internal low level calls used by the eeprom driver for h300 */
|
||||||
void pcf50606_i2c_init(void);
|
void pcf50606_i2c_init(void);
|
||||||
|
|
@ -32,8 +34,11 @@ void pcf50606_i2c_start(void);
|
||||||
void pcf50606_i2c_stop(void);
|
void pcf50606_i2c_stop(void);
|
||||||
void pcf50606_i2c_ack(bool ack);
|
void pcf50606_i2c_ack(bool ack);
|
||||||
bool pcf50606_i2c_getack(void);
|
bool pcf50606_i2c_getack(void);
|
||||||
|
#if defined(IRIVER_H300_SERIES)
|
||||||
|
/* USB charging support */
|
||||||
void pcf50606_i2c_outb(unsigned char byte);
|
void pcf50606_i2c_outb(unsigned char byte);
|
||||||
unsigned char pcf50606_i2c_inb(bool ack);
|
unsigned char pcf50606_i2c_inb(bool ack);
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(IAUDIO_X5) && !defined(SIMULATOR)
|
#if defined(IAUDIO_X5) && !defined(SIMULATOR)
|
||||||
void pcf50606_reset_timeout(void);
|
void pcf50606_reset_timeout(void);
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,10 @@ bool usb_inserted(void); /* return the official value, what's been reported to t
|
||||||
bool usb_detect(void); /* return the raw hardware value */
|
bool usb_detect(void); /* return the raw hardware value */
|
||||||
#ifdef HAVE_USB_POWER
|
#ifdef HAVE_USB_POWER
|
||||||
bool usb_powered(void);
|
bool usb_powered(void);
|
||||||
|
#ifdef CONFIG_CHARGING
|
||||||
|
bool usb_charging_enable(bool on);
|
||||||
|
bool usb_charging_enabled(void);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -759,8 +759,11 @@ static void power_thread_sleep(int ticks)
|
||||||
* transition to the appropriate steady state charger on/off state.
|
* transition to the appropriate steady state charger on/off state.
|
||||||
*/
|
*/
|
||||||
if(charger_inserted()
|
if(charger_inserted()
|
||||||
#ifdef HAVE_USB_POWER
|
#ifdef HAVE_USB_POWER /* USB powered or USB inserted both provide power */
|
||||||
|| usb_powered()
|
|| usb_powered()
|
||||||
|
#ifdef CONFIG_CHARGING
|
||||||
|
|| (usb_inserted() && usb_charging_enabled())
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
) {
|
) {
|
||||||
switch(charger_input_state) {
|
switch(charger_input_state) {
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,9 @@
|
||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
#include "pcf50606.h"
|
#include "pcf50606.h"
|
||||||
#include "button-target.h"
|
#include "button-target.h"
|
||||||
|
#include "logf.h"
|
||||||
|
|
||||||
|
static bool usb_ch_enabled = false;
|
||||||
|
|
||||||
/* These voltages were determined by measuring the output of the PCF50606
|
/* These voltages were determined by measuring the output of the PCF50606
|
||||||
on a running H300, and verified by disassembling the original firmware */
|
on a running H300, and verified by disassembling the original firmware */
|
||||||
|
|
@ -70,6 +73,27 @@ static inline void enable_pmu_interrupts(void)
|
||||||
or_l(0x03000000, &INTPRI5); /* INT38 - Priority 3 */
|
or_l(0x03000000, &INTPRI5); /* INT38 - Priority 3 */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* enables/disables USB charging
|
||||||
|
* ATTENTION: make sure to set the irq level
|
||||||
|
* to highest before calling this function! */
|
||||||
|
void pcf50606_set_usb_charging(bool on)
|
||||||
|
{
|
||||||
|
if (on)
|
||||||
|
pcf50606_write(0x39, 0x00); /* Set GPOOD2 to High-Z for USB Charge Enable */
|
||||||
|
else
|
||||||
|
pcf50606_write(0x39, 0x07); /* Set GPOOD2 to pulled down to disable USB charging */
|
||||||
|
|
||||||
|
usb_ch_enabled = on;
|
||||||
|
|
||||||
|
logf("pcf50606_set_usb_charging(%s)\n", on ? "on" : "off" );
|
||||||
|
}
|
||||||
|
|
||||||
|
bool pcf50606_usb_charging_enabled(void)
|
||||||
|
{
|
||||||
|
/* TODO: read the state of the GPOOD2 register... */
|
||||||
|
return usb_ch_enabled;
|
||||||
|
}
|
||||||
|
|
||||||
void pcf50606_init(void)
|
void pcf50606_init(void)
|
||||||
{
|
{
|
||||||
pcf50606_i2c_init();
|
pcf50606_i2c_init();
|
||||||
|
|
@ -82,6 +106,8 @@ void pcf50606_init(void)
|
||||||
pcf50606_write(0x09, 0x05); /* USB and ON key debounce: 14ms */
|
pcf50606_write(0x09, 0x05); /* USB and ON key debounce: 14ms */
|
||||||
pcf50606_write(0x29, 0x1C); /* Disable the unused MBC module */
|
pcf50606_write(0x29, 0x1C); /* Disable the unused MBC module */
|
||||||
|
|
||||||
|
pcf50606_set_usb_charging(false); /* Disable USB charging atm. */
|
||||||
|
|
||||||
pcf50606_write(0x35, 0x13); /* Backlight PWM = 512Hz 50/50 */
|
pcf50606_write(0x35, 0x13); /* Backlight PWM = 512Hz 50/50 */
|
||||||
pcf50606_write(0x3a, 0x3b); /* PWM output on GPOOD1 */
|
pcf50606_write(0x3a, 0x3b); /* PWM output on GPOOD1 */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,10 @@
|
||||||
#ifdef TARGET_TREE
|
#ifdef TARGET_TREE
|
||||||
#include "usb-target.h"
|
#include "usb-target.h"
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef IRIVER_H300_SERIES
|
||||||
|
#include "pcf50606.h" /* for pcf50606_usb_charging_... */
|
||||||
|
#endif
|
||||||
|
#include "logf.h"
|
||||||
|
|
||||||
extern void dbg_ports(void); /* NASTY! defined in apps/ */
|
extern void dbg_ports(void); /* NASTY! defined in apps/ */
|
||||||
|
|
||||||
|
|
@ -487,6 +491,40 @@ bool usb_powered(void)
|
||||||
{
|
{
|
||||||
return usb_state == USB_POWERED;
|
return usb_state == USB_POWERED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_CHARGING
|
||||||
|
bool usb_charging_enable(bool on)
|
||||||
|
{
|
||||||
|
bool rc = false;
|
||||||
|
#ifdef IRIVER_H300_SERIES
|
||||||
|
int irqlevel;
|
||||||
|
logf("usb_charging_enable(%s)\n", on ? "on" : "off" );
|
||||||
|
irqlevel = set_irq_level(HIGHEST_IRQ_LEVEL);
|
||||||
|
pcf50606_set_usb_charging(on);
|
||||||
|
rc = on;
|
||||||
|
(void)set_irq_level(irqlevel);
|
||||||
|
#else
|
||||||
|
/* TODO: implement it for other targets... */
|
||||||
|
(void)on;
|
||||||
|
#endif
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool usb_charging_enabled(void)
|
||||||
|
{
|
||||||
|
bool rc = false;
|
||||||
|
#ifdef IRIVER_H300_SERIES
|
||||||
|
/* TODO: read the state of the GPOOD2 register...
|
||||||
|
* (this also means to set the irq level here) */
|
||||||
|
rc = pcf50606_usb_charging_enabled();
|
||||||
|
#else
|
||||||
|
/* TODO: implement it for other targets... */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
logf("usb_charging_enabled: %s\n", rc ? "true" : "false" );
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue