1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2002 by Alan Korr
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
29 long cpu_frequency SHAREDBSS_ATTR
= CPU_FREQ
;
32 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
33 static int boost_counter SHAREDBSS_ATTR
= 0;
34 static bool cpu_idle SHAREDBSS_ATTR
= false;
36 static struct corelock boostctrl_cl SHAREDBSS_ATTR
;
37 void cpu_boost_init(void)
39 corelock_init(&boostctrl_cl
);
43 int get_cpu_boost_counter(void)
47 #ifdef CPU_BOOST_LOGGING
48 #define MAX_BOOST_LOG 64
49 static char cpu_boost_calls
[MAX_BOOST_LOG
][MAX_PATH
];
50 static int cpu_boost_first
= 0;
51 static int cpu_boost_calls_count
= 0;
52 static int cpu_boost_track_message
= 0;
53 int cpu_boost_log_getcount(void)
55 return cpu_boost_calls_count
;
57 char * cpu_boost_log_getlog_first(void)
60 corelock_lock(&boostctrl_cl
);
64 if (cpu_boost_calls_count
)
66 cpu_boost_track_message
= 1;
67 first
= cpu_boost_calls
[cpu_boost_first
];
70 corelock_unlock(&boostctrl_cl
);
74 char * cpu_boost_log_getlog_next(void)
79 corelock_lock(&boostctrl_cl
);
81 message
= (cpu_boost_track_message
+cpu_boost_first
)%MAX_BOOST_LOG
;
84 if (cpu_boost_track_message
< cpu_boost_calls_count
)
86 cpu_boost_track_message
++;
87 next
= cpu_boost_calls
[message
];
90 corelock_unlock(&boostctrl_cl
);
94 void cpu_boost_(bool on_off
, char* location
, int line
)
96 corelock_lock(&boostctrl_cl
);
98 if (cpu_boost_calls_count
== MAX_BOOST_LOG
)
100 cpu_boost_first
= (cpu_boost_first
+1)%MAX_BOOST_LOG
;
101 cpu_boost_calls_count
--;
102 if (cpu_boost_calls_count
< 0)
103 cpu_boost_calls_count
= 0;
105 if (cpu_boost_calls_count
< MAX_BOOST_LOG
)
107 int message
= (cpu_boost_first
+cpu_boost_calls_count
)%MAX_BOOST_LOG
;
108 snprintf(cpu_boost_calls
[message
], MAX_PATH
,
109 "%c %s:%d",on_off
==true?'B':'U',location
,line
);
110 cpu_boost_calls_count
++;
113 void cpu_boost(bool on_off
)
115 corelock_lock(&boostctrl_cl
);
116 #endif /* CPU_BOOST_LOGGING */
119 /* Boost the frequency if not already boosted */
120 if(++boost_counter
== 1)
121 set_cpu_frequency(CPUFREQ_MAX
);
125 /* Lower the frequency if the counter reaches 0 */
126 if(--boost_counter
<= 0)
129 set_cpu_frequency(CPUFREQ_DEFAULT
);
131 set_cpu_frequency(CPUFREQ_NORMAL
);
134 if (boost_counter
< 0)
141 corelock_unlock(&boostctrl_cl
);
144 void cpu_idle_mode(bool on_off
)
146 corelock_lock(&boostctrl_cl
);
150 /* We need to adjust the frequency immediately if the CPU
152 if(boost_counter
== 0)
155 set_cpu_frequency(CPUFREQ_DEFAULT
);
157 set_cpu_frequency(CPUFREQ_NORMAL
);
160 corelock_unlock(&boostctrl_cl
);
162 #endif /* HAVE_ADJUSTABLE_CPU_FREQ */
165 #ifdef HAVE_FLASHED_ROCKBOX
166 static bool detect_flash_header(uint8_t *addr
)
169 int oldmode
= system_memory_guard(MEMGUARD_NONE
);
171 struct flash_header hdr
;
172 memcpy(&hdr
, addr
, sizeof(struct flash_header
));
174 system_memory_guard(oldmode
);
176 return hdr
.magic
== FLASH_MAGIC
;
180 bool detect_flashed_romimage(void)
182 #ifdef HAVE_FLASHED_ROCKBOX
183 return detect_flash_header((uint8_t *)FLASH_ROMIMAGE_ENTRY
);
186 #endif /* HAVE_FLASHED_ROCKBOX */
189 bool detect_flashed_ramimage(void)
191 #ifdef HAVE_FLASHED_ROCKBOX
192 return detect_flash_header((uint8_t *)FLASH_RAMIMAGE_ENTRY
);
195 #endif /* HAVE_FLASHED_ROCKBOX */
198 bool detect_original_firmware(void)
200 return !(detect_flashed_ramimage() || detect_flashed_romimage());