Hello every-one!
The blog has been pretty passive, time to change it with a new overclocking tutorial.
This time I have a Wandboard in my hand. Wand board is a really nice opensource ARM cortex A9 SOM development board, with a i.mx 6 SOC and 1 GB RAM. My version is equipped with a duallite module @ 1000Mhz.
Somthing that I really like is overclocking and pushing the barriers, so here is how you do it!
This soc has speed fuses that tells the kernel which clock frequency the cpu shall have. It is possible change this fuses, but this is inverversible, so we do it by modifying the kernel instead.
By looking into /arch/arm/mach-mx6/cpu_op-mx6 in the kernel, we find the frequency-tables. at the bottom we find the function: void mx6_cpu_op_init(void)
By removing the check of the fuse bit and manually set the freqency we are on our way.
Make it look somthing like this:
void mx6_cpu_op_init(void) { arm_max_freq = CPU_AT_1_2GHz; printk(KERN_INFO "arm_max_freq=%sn", (arm_max_freq == CPU_AT_1_2GHz) ? "1.2GHz" : ((arm_max_freq == CPU_AT_1GHz) ? "1GHz" : "800MHz")); get_cpu_op = mx6_get_cpu_op; set_num_cpu_op = mx6_set_num_cpu_op; get_dvfs_core_op = mx6_get_dvfs_core_table; }
For now I had some instability issues. It seemed that the powersupply and LDO-voltage was dropping too much so I had to turn the LDO off. By turning this of it made some different in temperature thought, about 2-3 degrees warmer.
In the same folder you have the file mx6_anatop_regulator.c. This file holds the LDO-regulator functions and the one we want to disable is the set_voltage() function.
So by making this function empty, the set_voltage() does not change the voltage.
Make it look somthing like this:
static int set_voltage(struct anatop_regulator *sreg, int uv) { return 0; }
Then make the new kernel and dd it to the flashmemory, be careful which disk you are writing too.
sudo make CROSS_COMPILE="arm-linux-gnueabi-" ARCH="arm" -j4 uImage sudo dd if=arch/arm/boot/uImage of=/dev/DISK bs=1M seek=1 sync
Okay, we are almost there. Now the voltages are too low at default values from u-boot. This will not work. We have to turn the voltage to the maximum by disabling the voltage-regulation. We do this by set the Digital Regulator Core Register (PMU_REG_CORE).
You find this register documented in the reference manual at page 4493-4495.
By setting the REG0_TARG REG1_TARG REG2_TARG to 11111 == Power FET switched full on. No regulation.
We do this by modifying the u-boot/board/wandboard/wandboard.c
Make it look somthing like this.
int board_init(void) { /* address of boot parameters */ gd->bd->bi_boot_params = PHYS_SDRAM + 0x100; int reg; reg = 0x7C3E1F; writel(reg, ANATOP_BASE_ADDR + HW_ANADIG_REG_CORE); return 0; }
I had some problem with the bootlogo locking up my system in the beginning, so I disabled this by editing u-boot/include/configs/wandboard.h
and commented out the code below.
/* Framebuffer and LCD */ /*#define CONFIG_CMD_HDMIDETECT #define CONFIG_VIDEO #define CONFIG_VIDEO_IPUV3 #define CONFIG_CFB_CONSOLE #define CONFIG_VGA_AS_SINGLE_DEVICE #define CONFIG_SYS_CONSOLE_IS_IN_ENV #define CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE #define CONFIG_VIDEO_BMP_RLE8 #define CONFIG_BMP_24BPP #if defined(CONFIG_BMP_24BPP) #define CONFIG_BPP_BYTES 4 #elif defined(CONFIG_BMP_8BPP) #define CONFIG_BPP_BYTES 1 #endif #define CONFIG_VIDEO_XRES 720 #define CONFIG_VIDEO_YRES 480 #define CONFIG_SYS_VIDEO_LOGO_MAX_SIZE (CONFIG_VIDEO_XRES * CONFIG_VIDEO_YRES * CONFIG_BPP_BYTES + 1024+ 100) #define CONFIG_VIDEO_BMP_GZIP #define CONFIG_SPLASH_SCREEN #define CONFIG_SPLASH_IS_IN_MMC #define CONFIG_CMD_BMP #define CONFIG_VIDEO_LOGO #define CONFIG_IPUV3_CLK 260000000 #define CONFIG_SYS_DCACHE_OFF */
Now compile the bootloader:
sudo make CROSS_COMPILE="arm-linux-gnueabi-" ARCH="arm" wandboard_dl -j4 sudo dd if=u-boot.imx of=/dev/sdc bs=1k seek=1
Pooowoowooww! So now we are there. I was able to boot it stable at 1200Mhz. Whoho! 🙂
Here we have some benchmark results:
Wandboard@1000Mhz
RAM size: 834 MB, # CPU hardware threads: 2 RAM usage: 425 MB, # Benchmark threads: 2 Dict Compressing | Decompressing Speed Usage R/U Rating | Speed Usage R/U Rating KB/s % MIPS MIPS | KB/s % MIPS MIPS 22: 564 141 389 548 | 12812 200 578 1156 23: 560 143 398 570 | 12698 200 582 1162
Wandboard@1200Mhz
RAM size: 834 MB, # CPU hardware threads: 2 RAM usage: 425 MB, # Benchmark threads: 2 Dict Compressing | Decompressing Speed Usage R/U Rating | Speed Usage R/U Rating KB/s % MIPS MIPS | KB/s % MIPS MIPS 22: 819 147 543 797 | 19548 200 883 1765 23: 829 150 561 845 | 19365 200 887 1773
You find the kernel-source at http://www.wandboard.org
And the reference manual at Freescales website
Remember that you do this at your own risk. I cant guarantee that it wont damage anything.
Enjoy, feel free to ask questions and comments… and remember to have fun 😀
Peace!