summaryrefslogtreecommitdiffstats
path: root/firmware
diff options
context:
space:
mode:
authorJean-Philippe Bernardy <jeanphilippe.bernardy@gmail.com>2005-03-03 16:29:02 +0000
committerJean-Philippe Bernardy <jeanphilippe.bernardy@gmail.com>2005-03-03 16:29:02 +0000
commit708e357a6351045f450be4ad28823463be161b6d (patch)
tree13534ad681c66cf3c5b4320356551a253d908416 /firmware
parentabacb23796f979d3c3e2398bd6fba326cb09436d (diff)
downloadrockbox-708e357a6351045f450be4ad28823463be161b6d.tar.gz
rockbox-708e357a6351045f450be4ad28823463be161b6d.zip
gmini: variable CPU frequency
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6118 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
-rw-r--r--firmware/export/system.h18
-rw-r--r--firmware/system.c88
2 files changed, 70 insertions, 36 deletions
diff --git a/firmware/export/system.h b/firmware/export/system.h
index 442072ba51..546df13082 100644
--- a/firmware/export/system.h
+++ b/firmware/export/system.h
@@ -31,9 +31,12 @@ extern long cpu_frequency;
#ifdef HAVE_ADJUSTABLE_CPU_FREQ
#define FREQ cpu_frequency
+void set_cpu_frequency(long frequency);
+void cpu_boost(bool on_off);
#else
#define FREQ CPU_FREQ
#endif
+
#define BAUDRATE 9600
#ifndef NULL
@@ -199,9 +202,6 @@ static inline void invalidate_icache(void)
#define CPUFREQ_NORMAL 47980800
#define CPUFREQ_MAX 95961600
-void set_cpu_frequency(long frequency);
-void cpu_boost(bool on_off);
-
#elif CONFIG_CPU == TCC730
extern int smsc_version(void);
@@ -254,6 +254,18 @@ static inline unsigned long SWAB32(unsigned long value)
return (lo << 16) | hi;
}
+/* Archos uses:
+
+22MHz: busy wait on dma
+32MHz: normal
+80Mhz: heavy load
+
+*/
+
+#define CPUFREQ_DEFAULT CPU_FREQ
+#define CPUFREQ_NORMAL (32000000)
+#define CPUFREQ_MAX (80000000)
+
#define invalidate_icache()
#endif
diff --git a/firmware/system.c b/firmware/system.c
index a457a135b9..9fbce9e4b9 100644
--- a/firmware/system.c
+++ b/firmware/system.c
@@ -28,13 +28,43 @@
long cpu_frequency = CPU_FREQ;
#endif
+#ifdef HAVE_ADJUSTABLE_CPU_FREQ
+void cpu_boost(bool on_off)
+{
+ static int counter = 0;
+ if(on_off)
+ {
+ /* Boost the frequency if not already boosted */
+ if(counter++ == 0)
+ {
+ set_cpu_frequency(CPUFREQ_MAX);
+ }
+ }
+ else
+ {
+ /* Lower the frequency if the counter reaches 0 */
+ if(--counter == 0)
+ {
+ set_cpu_frequency(CPUFREQ_NORMAL);
+ }
+
+ /* Safety measure */
+ if(counter < 0)
+ counter = 0;
+ }
+}
+#endif
+
#if CONFIG_CPU == TCC730
void* volatile interrupt_vector[16] __attribute__ ((section(".idata")));
-void ddma_wait_idle(void) __attribute__ ((section (".icode")));
-void ddma_wait_idle(void)
+static void ddma_wait_idle(void) __attribute__ ((section (".icode")));
+static void ddma_wait_idle(void)
{
+ /* TODO: power saving trick: set the CPU freq to 22MHz
+ while doing the busy wait after a disk dma access.
+ (Used by Archos) */
do {
} while ((DDMACOM & 3) != 0);
}
@@ -90,7 +120,7 @@ extern int icodecopy;
extern int icodesize;
extern int icodestart;
-/* change the CPU frequency */
+/* change the a PLL frequency */
void set_pll_freq(int pll_index, long freq_out) {
volatile unsigned int* plldata;
volatile unsigned char* pllcon;
@@ -127,7 +157,7 @@ int smsc_version(void) {
void smsc_delay() {
int i;
/* FIXME: tune the delay.
- !!! Delay should depend on CPU speed !!!
+ Delay doesn't depend on CPU speed in Archos' firmware.
*/
for (i = 0; i < 100; i++) {
@@ -162,6 +192,24 @@ static void extra_init(void) {
}
}
+void set_cpu_frequency(long frequency) {
+ /* Enable SDRAM refresh, at least 15MHz */
+ if (frequency < cpu_frequency)
+ MIUDCNT = 0x800 | (frequency * 15/1000000L - 1);
+
+ set_pll_freq(0, frequency);
+ PLL0CON |= 0x4; /* use as CPU clock */
+
+ cpu_frequency = frequency;
+ /* wait states and such not changed by Archos. (!?) */
+
+ /* Enable SDRAM refresh, 15MHz. */
+ MIUDCNT = 0x800 | (frequency * 15/1000000L - 1);
+
+ tick_start(1000/HZ);
+ /* TODO: when uart is done; sync uart freq */
+}
+
/* called by crt0 */
void system_init(void)
{
@@ -189,12 +237,8 @@ void system_init(void)
/* PLL0 (cpu osc. frequency) */
-
-#if 0
- set_pll_freq(0, CPU_FREQ);
- PLL0CON |= 0x4; /* use as CPU clock */
+ /* set_cpu_frequency(CPU_FREQ); */
-#endif
/*******************
* configure S(D)RAM
@@ -237,6 +281,8 @@ void system_init(void)
extra_init();
}
+
+
#elif CONFIG_CPU == MCF5249
#define default_interrupt(name) \
@@ -478,30 +524,6 @@ void set_cpu_frequency(long frequency)
}
}
-void cpu_boost(bool on_off)
-{
- static int counter = 0;
- if(on_off)
- {
- /* Boost the frequency if not already boosted */
- if(counter++ == 0)
- {
- set_cpu_frequency(CPUFREQ_MAX);
- }
- }
- else
- {
- /* Lower the frequency if the counter reaches 0 */
- if(--counter == 0)
- {
- set_cpu_frequency(CPUFREQ_NORMAL);
- }
-
- /* Safety measure */
- if(counter < 0)
- counter = 0;
- }
-}
#elif CONFIG_CPU == SH7034
#include "led.h"