Improve clock setting

pull/259/head
IanSB 2021-12-05 05:07:00 +00:00
rodzic ba6c2bde11
commit 52ab7b60ef
3 zmienionych plików z 48 dodań i 42 usunięć

Wyświetl plik

@ -63,30 +63,39 @@ void set_clock_rate(int clk_id, unsigned int value) {
RPI_PropertyProcess();
}
void set_clock_rates(unsigned int cpu, unsigned int core, unsigned int sdram) {
static unsigned int old_core = -1;
void set_clock_rate_cpu(unsigned int cpu) {
static unsigned int old_cpu = -1;
if (cpu != old_cpu) {
RPI_PropertyInit();
RPI_PropertyAddTag(TAG_SET_CLOCK_RATE, ARM_CLK_ID, cpu, 1);
RPI_PropertyProcess();
calculate_cpu_timings();
old_cpu = cpu;
}
}
void set_clock_rate_core(unsigned int core) {
static unsigned int old_core = -1;
if (core != old_core) {
delay_in_arm_cycles_cpu_adjust(50000000);
}
RPI_PropertyInit();
RPI_PropertyAddTag(TAG_SET_CLOCK_RATE, ARM_CLK_ID, cpu, 1);
RPI_PropertyAddTag(TAG_SET_CLOCK_RATE, CORE_CLK_ID, core, 0);
RPI_PropertyAddTag(TAG_SET_CLOCK_RATE, SDRAM_CLK_ID, sdram, 0);
RPI_PropertyProcess();
if (core != old_core) {
RPI_PropertyInit();
RPI_PropertyAddTag(TAG_SET_CLOCK_RATE, CORE_CLK_ID, core, 0);
RPI_PropertyProcess();
#ifndef RPI4
RPI_AuxMiniUartFlush();
RPI_AuxMiniUartInit(115200, 8);
#endif
old_core = core;
}
}
if (cpu != old_cpu) {
calculate_cpu_timings();
old_cpu = cpu;
void set_clock_rate_sdram(unsigned int sdram) {
static unsigned int old_sdram = -1;
if (sdram != old_sdram) {
RPI_PropertyInit();
RPI_PropertyAddTag(TAG_SET_CLOCK_RATE, SDRAM_CLK_ID, sdram, 0);
RPI_PropertyProcess();
old_sdram = sdram;
}
}

Wyświetl plik

@ -23,8 +23,9 @@ extern char *get_info_string();
extern unsigned int get_clock_rate(int clk_id);
extern void set_clock_rate(int clk_id, unsigned int value);
extern void set_clock_rates(unsigned int cpu, unsigned int core, unsigned int sdram);
extern void set_clock_rate_cpu(unsigned int cpu);
extern void set_clock_rate_core(unsigned int core);
extern void set_clock_rate_sdram(unsigned int sdram);
int get_revision();
extern float get_temp();

Wyświetl plik

@ -1210,29 +1210,6 @@ static int get_feature(int num) {
return -1;
}
static void set_clocks(){
int auto_cpu = 0;
int auto_core = 0;
if (auto_overclock)
{
if (cpu_clock == 700) {
auto_cpu = 200; //overclock to 900
}
if (core_clock == 250) {
auto_core = 150; //overclock to 400
}
}
#ifdef RPI4
if (core_overclock > 100) { //pi 4 core is already 500 Mhz (all others 400Mhz) so don't overclock unless overclock >100Mhz
set_clock_rates((cpu_clock + auto_cpu + cpu_overclock) * 1000000, (core_clock + auto_core + core_overclock - 100) * 1000000, (sdram_clock + sdram_overclock) * 1000000);
} else {
set_clock_rates((cpu_clock + auto_cpu + cpu_overclock) * 1000000, (core_clock + auto_core) * 1000000, (sdram_clock + sdram_overclock) * 1000000);
}
#else
set_clock_rates((cpu_clock + auto_cpu + cpu_overclock) * 1000000, (core_clock + auto_core + core_overclock) * 1000000, (sdram_clock + sdram_overclock) * 1000000);
#endif
}
static void set_feature(int num, int value) {
if (value < features[num].min) {
value = features[num].min;
@ -1411,15 +1388,31 @@ static void set_feature(int num, int value) {
break;
case F_OCLOCK_CPU:
cpu_overclock = value;
set_clocks();
if (auto_overclock && cpu_clock == 700) {
set_clock_rate_cpu((cpu_clock + cpu_overclock + 200) * 1000000); //overclock to 900
} else {
set_clock_rate_cpu((cpu_clock + cpu_overclock) * 1000000);
}
break;
case F_OCLOCK_CORE:
core_overclock = value;
set_clocks();
#ifdef RPI4
if (core_overclock > 100) { //pi 4 core is already 500 Mhz (all others 400Mhz) so don't overclock unless overclock >100Mhz
set_clock_rate_core((core_clock + core_overclock - 100) * 1000000);
} else {
set_clock_rate_core(core_clock * 1000000);
}
#else
if (auto_overclock && core_clock == 250) {
set_clock_rate_core((core_clock + core_overclock + 150) * 1000000);
} else {
set_clock_rate_core((core_clock + core_overclock) * 1000000);
}
#endif
break;
case F_OCLOCK_SDRAM:
sdram_overclock = value;
set_clocks();
set_clock_rate_sdram((sdram_clock + sdram_overclock) * 1000000);
break;
case F_RSTATUS:
set_res_status(value);
@ -5700,8 +5693,11 @@ void osd_init() {
}
cpu_clock = get_clock_rate(ARM_CLK_ID)/1000000;
set_clock_rate_cpu(cpu_clock * 1000000); //sets the old value
core_clock = get_clock_rate(CORE_CLK_ID)/1000000;
set_clock_rate_core(core_clock * 1000000);
sdram_clock = get_clock_rate(SDRAM_CLK_ID)/1000000;
set_clock_rate_sdram(sdram_clock * 1000000);
generate_palettes();
features[F_PALETTE].max = create_and_scan_palettes(palette_names, palette_array) - 1;