Thread Tools
Posts: 1,463 | Thanked: 1,916 times | Joined on Feb 2008 @ Edmonton, AB
Also works on n950, nitdroid and open kernel (with aegis fixed origin) too

WARNING: Killed 2 N9s so far
1300mhz+ is very dangerous over a long time.

First, install inception from here. You don't need opensh or aegisctl anymore.

Download these two files:

Kernel Modules 1.5.4 (changelog)

User Interface 1.2.7 (changelog)

Install in this order!
(change to the directory you saved the files)
/usr/sbin/incept opptimizer_1.5.4_armel.deb
/usr/sbin/incept opptimizer-ui_1.2.7_armel.deb

Load OppUI from the menu.


This is the status screen. It will refresh automatically when you change anything, start the app, minimize and restore the app, or you can hit the refresh button if you feel the need. All data is coming from the sysfs entry (/proc/opptimizer) created by the kernel module. When this screen refreshes, if it can't find the sysfs entries, it will run the kernel module loader, wait, and refresh again. If it still doesn't work, you will see some error message here instead.

This is the settings screen. Here you can adjust the voltage, frequency, and apply your changes by clicking the red button. Frequency and Voltage labels will turn red if you are adjusting them into unsafe ranges. If you disable "Custom voltage", the voltage will be reset to whatever the kernel module thinks the default is (see raw output on previous screen). If you disable "SmartReflex", the default voltages are all increased slightly, and you will experience degraded battery life. There should be no reason to disable this, but I give you the option in case I am wrong. "Test iterations" is the number of times to verify the settings by running a CPU intensive calculation (it's drawing a mandelbrot in /dev/null). 1000 will take about 5 seconds and 16000 will take about 15 minutes. Of course, you can set it to 0 to skip the testing. When the testing is done, it will show how many seconds it took right below this, so you can use it as a benchmark, if you want. The test runs in a separate thread at normal priority.

If you attempt to apply unsafe changes, you will get an additional confirmation screen. I find this useful for when I show this app to people that like to push buttons without understanding the consequences.

This is what you see while it's running the test. Keep in mind that if you click "Stop test", the settings are still applied, but not saved. The progress is very fast at first, and then slows down due to the testing algorithm. The phone is still usable during the test, but I don't suggest it because it is likely to reboot and corrupt whatever files are open. When it's done the test, it verifies the md5 of the output file against what it expects, so if the cpu is unstable it *might* be able to warn you before it crashes. Nobody reported this feature is working yet so I don't know...

Known Issues
  • Apply on Startup takes a minute or two
  • Bug somewhere causes phone to reset when downclocking (occasionally)
  • Undervolting is impossible at this time
  • Cpufreq stats table not updated
  • Very high voltages or frequencies are slow, probably the chip throttles itself when too hot
  • Default voltage is correctly detected but when custom voltage is disabled you actually get a slightly increased voltage.


Here is some documentation from the kernel to help understand the 'raw output':

from smartreflex-class1p5c.c
* omap_volt_data - Omap voltage specific data.
* @u_volt_nominal : The possible voltage value in uVolts
* @u_volt_dyn_nominal : The run time optimized nominal voltage for device.
* this dynamic nominal is the nominal voltage
* specialized for that device at that time.
* @u_volt_dyn_margin : margin to add on top of calib voltage for this opp
* @u_volt_calib : Calibrated voltage for this opp
* @sr_nvalue : Smartreflex N target value at voltage <voltage>
* @sr_errminlimit : Error min limit value for smartreflex. This value
* differs at differnet opp and thus is linked
* with voltage.
* @vp_errorgain : Error gain value for the voltage processor. This
* field also differs according to the voltage/opp.

from voltage.c
* voltscale_adaptive_body_bias - controls ABB ldo during voltage scaling
* @enable: enable/disable abb
* Adaptive Body-Bias is a technique in all OMAP silicon that uses the 45nm
* process. ABB can boost voltage in high OPPs for silicon with weak
* characteristics (forward Body-Bias) as well as lower voltage in low OPPs
* for silicon with strong characteristics (Reverse Body-Bias).
* Only Foward Body-Bias for operating at high OPPs is implemented below, per
* recommendations from silicon team.
* Reverse Body-Bias for saving power in active cases and sleep cases is not
* yet implemented.
* OMAP4 hardward also supports ABB ldo, but no recommendations have been made
* to implement it yet.

So, which one is the real voltage? u_volt_calib is the real one, but if it is blank, it will use u_volt_dyn_nominal instead. If that one is blank too, u_volt_nominal is used. u_volt_dyn_nominal is calculated and stored by the formula u_volt_calib + u_volt_dyn_margin. Every time you recalibrate smartreflex it starts from that value and goes down to where it detects problems. If you disable smartreflex the u_volt_calib is blank so it uses the dyn_nominal + 50k. If you use a custom voltage and the opptimizer module, it will set both the u_volt_calib and u_volt_dyn_nominal to the requested value, so it will run at the voltage you requested even if smartreflex is disabled. It also sets the dyn_margin to 0 and sr_errminlimit to a lower value to try and stop smartreflex from further adjusting the values. Then it requests smartreflex to recalibrate so if there is a problem it will happen now instead of 24 hours later. The value "omap_voltageprocessor_get_voltage" in the opptimizer raw output can be used to confirm what voltage it settled on as this is pulled directly from the voltage controller. If it doesn't match what you selected please let me know.

To disable/uninstall either hold the power button for 10 seconds or type:
/sbin/rmmod opptimizer

The kernel modules are NOT reloaded until you start the UI.

The total amount of time I've spent on this so far is around 120 hours, there is a lot of research, testing, packaging, and other stuff to do besides just writing the code. It's all free and open source, but if you have a few spare dollars you don't mind sharing with me, it is appreciated. You can use the following service to do this: PayPal
In return, I will send you any new versions to test (if you want) and I will pay special attention to any bug reports or feature requests you submit.

This project wouldn't be possible without the work of others that some parts are based upon. A special thanks goes to Tiago Sousa (for the concept), Skrilax_CZ (for Symsearch), @tekahuna (for the original OPPtimizer), itsnotabigtruck (for inception, writing the loader, and answering about 200 of my stupid questions). Please consider donating to itsnotabigtruck if you haven't already. He can use the incentive to keep our phone properly under our control. Thanks to wook (from for the icon.

Module source is here:

UI source is here:

Last edited by Creamy Goodness; 2013-09-21 at 21:37.

The Following 124 Users Say Thank You to Creamy Goodness For This Useful Post:
-Tyler-, accountvip, afaq, ajalkane, Alfred, AlMehdi, AMD, anapospastos, AndyNokia232, anidel, Arsenalter, Artyom, automagic68, banong, behrooz, besttt, Bundyo, cckwes, celebrant, CepiPerez, ceroberts75, Ch.Saqib, chemical1der, daniscott, deryl, Dousan, Dragoss91, draxcp6, e-yes, eerde, eMiL, et3rnal, ezameht, F2thaK, Fallenzone, Faz, Flapzapninja, Garp, godofwar424, Hacker, HanzBlix, Helmuth, hotnikkelz, hrbani, HtheB, ibrakalifa, imaginaryenemy, Iryus, itsnotabigtruck, jaeezzy, jakiman, jalyst, jecargo22, jhwan, jklubi, jleholeho, Jordi, jule, Kallela, kanser, kebbana, keptn, kfahoo, knobtviker, known, koe, late88, macesn, MaddogG, Maemomd, Maj3stic, Makeclick, Manatus, mariusmssj, MAX9, MeeNu, MFaroTusino, mike_shenoda, Mikkosssss, mingfan, Ministeri, mooglez, MrBlueSky, mwrf, N9WB, nicodonte, Nosph3ratu, OVK, peterleinchen, Pl4ub, Prestige, qole, rcolistete, ruplee76, Salmi, santiagopim, shanttu, sifo, soleil, sony123, Soppa, Sourav.dubey, spectrax0x, stooobs, superjunior, thanyapat, thedead1440, thengkhai, TheRAJN9, tioubxancur, tissot, TMavica, torcida, trayhoper, ttt0600, turbovomit, wook_sf, Wowfunhappy, zapotek, Zelig, ZogG, _Routser
ibrakalifa's Avatar
Posts: 1,540 | Thanked: 1,037 times | Joined on Dec 2011 @ Everywhere
omg next part is cssu for n9 please,

thx so much

The Following User Says Thank You to ibrakalifa For This Useful Post:
Posts: 1,463 | Thanked: 1,916 times | Joined on Feb 2008 @ Edmonton, AB
next part is voltage control i hope...

The Following 13 Users Say Thank You to Creamy Goodness For This Useful Post:
Posts: 1,064 | Thanked: 2,371 times | Joined on Jan 2012 @ Finland
and you are aware that your attachements symsearch.ko is 0 bytes size?

But apart from that if you compile it yourself from sources it does seem work (although a bit different approach that I had).

[ 606.995483] symsearch: found kallsyms_lookup_name on 0xb008e490.
[ 621.736511] opptimizer.ko - The OPP Management API
[ 621.736541] for source
[ 621.736572] This module uses SYMSEARCH by Skrilax_CZ
[ 621.736572] Made possible by Jeffrey Kawika Patricio and Tiago Sousa
[ 621.736602] 0.1-alpha3
[ 621.736633] Created by Lance Colton <>

RM696-07-1_PR_001:/# cat /proc/opptimizer
opp rate: 1100000000
freq table [0]: 1100000
policy->max: 1100000
cpuinfo.max_freq: 1100000
user_policy.max: 1100000
RM696-07-1_PR_001:/# cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq

Last edited by rainisto; 2012-03-31 at 10:37.

The Following 2 Users Say Thank You to rainisto For This Useful Post:
Posts: 1,427 | Thanked: 2,077 times | Joined on Aug 2009 @ Sydney
Amazing. Awesome work Creamy Goodness!!

Just curious, what have you tried up to stable? 1.2, 1.3GHz?
Also, is there a way to confirm what frequency you are really running at?
I guess we can use conky?

The Following User Says Thank You to jakiman For This Useful Post:
Moderator | Posts: 6,210 | Thanked: 6,363 times | Joined on Nov 2011
^ did you enter into opensh after devel-su. i did that and the error didnt appear again.

The Following User Says Thank You to thedead1440 For This Useful Post:
Posts: 245 | Thanked: 905 times | Joined on Feb 2012
Originally Posted by F2thaK View Post
Just tried as root, same error? WTF
Not root - you need to run opensh like it says in the OP. If that fails, do accli -I from opensh and paste the output (edit out your IMEI!).

The Following User Says Thank You to itsnotabigtruck For This Useful Post:
Posts: 1,548 | Thanked: 1,142 times | Joined on Dec 2010
ill do this when phone gets too slow, but atm it's fast enough, nice work though

The Following User Says Thank You to m4r0v3r For This Useful Post:
Posts: 1,463 | Thanked: 1,916 times | Joined on Feb 2008 @ Edmonton, AB
oops I am not sure how the 2nd module was 0 bytes but fixed it now
Posts: 1,463 | Thanked: 1,916 times | Joined on Feb 2008 @ Edmonton, AB
Originally Posted by m4r0v3r View Post
ill do this when phone gets too slow, but atm it's fast enough, nice work though
I don't blame you, but things will be more interesting if we can undervolt the phone. Increased battery life is always good

Originally Posted by jakiman View Post
Amazing. Awesome work Creamy Goodness!!

Just curious, what have you tried up to stable? 1.2, 1.3GHz?
Also, is there a way to confirm what frequency you are really running at?
I guess we can use conky?
I think mine rebooted when I tried 1.2Ghz, but who knows, maybe I put too many zeroes or something. It's not surprising though, after a big frequency bump you need more voltage too...

I suggest conky to verify the changes

Last edited by Creamy Goodness; 2012-03-31 at 16:27.

The Following 2 Users Say Thank You to Creamy Goodness For This Useful Post:

Thread Tools

Forum Jump

All times are GMT. The time now is 04:27.