main.c
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <time.h>
static uint32_t get_clk(int target)
{
int c0 = 0;
int v0 = 0;
for (c0 = 1; c0<=32; c0++) {
v0 = (24 * c0 * 4) / 2;
if (v0 > target) {
printf("new clock %dMHz\n", v0);
return c0 - 1;
}
}
printf("new clock 1008MHz\n");
return 20;
}
int main(int argc, char* argv[])
{
uint32_t clk = 0;
if (argc != 2) {
printf("usage: %s [500-2000]\n", argv[0]);
return -1;
}
clk = get_clk(atoi(argv[1]));
int fd = open("/dev/mem", O_RDWR);
if(fd < 0){
printf("failed to open /dev/mem\n");
return -1;
}
uint32_t *mem = mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x01c20000);
// 0x90001431
// M = 1
// K = 3
// N = 20
// CPU = (24MHz * 21 * 4) / 2 = 1008MHz
printf("Old: CPU Register 0x%x\n", *mem);
*mem = (1 << 31) | (clk << 8) | (3 << 4) | 1;
printf("New: CPU Register 0x%x\n", *mem);
munmap(mem, 4096);
close(fd);
return 0;
}