One of the areas left incomplete in the Texas Instruments AM335x BSP when they ended Windows Embedded support was the whole power management and low power operation. TI turned over support to a third party, which will remain nameless, and from what I can gather not much work has been done since.

This is a shame as the AM335x processor, as used on the Beaglebone, has some fantastic low power features. In general, ARM processors have always had superior low power characteristics over the x86 family. This is do, in part, to the fine granularity ARM gives you over clock and power domain control as distributed within the chip itself. You have the ability to shut down different sections of the chip, or even run them at a reduced voltage. You also have the ability to slow down or cut off clocks to different internal peripherals within the part. All these can have a cumulative effect on lowering the current draw and thus the power consumed by the chip. These things become very important if you are doing a battery operated design where you need to squeeze every last bit of operating power from the storage battery.

The basics:

From basic electronics we get the equation:   P = I*E or Power is equal to Voltage times Current. From this is is easy to see how reducing the voltage can lower the power consumed. But why does the clock frequency matter? Well it is like this, the internal architecture and silicon physics state that transistor switching actually what draws most of the current. The faster the clocks the more switching goes on and thus more power is drawn from the source.

This leads to a commonly used power saving technique employed by most modern high end embedded processors, DVFS. DVFS stands for Digital Voltage and Frequency Scaling. What this means is we can “scale” the performance by controlling the voltage and frequency. We are basically trading off performance for longer battery life. On the AM335x we can set different “operating points” and dynamically switch between them as cpu load increases. On earlier incarnations of the OMAP BSPs from TI, in particular the AM37XX processors BSP, the DVFS was an integral part of the BSP and there were even “cpu load rules” you could enable to dynamically control loading.

As I stated earlier this feature is totally broken on the public AM335x BSP. Many of the power management chips defines (the TPS75217 pmic) are wrong and most of the functions just do not work. It is obvious most of these functions were ported from an earlier BSP, that used a different pmic, and were never tested or debugged.

I went through the code and cleaned up many of the functions and tested operation at these different operating modes:

1000Mhz MPU @ 1.325V,    CORE @ 1.1V (Nitro)
720Mhz  MPU @ 1.275V,    CORE @ 1.1V (Turbo)
600Mhz  MPU @ 1.200V,    CORE @ 1.1V (OPM120)
500Mhz  MPU @ 1.100V,    CORE @ 1.1V (OPM100)
275Mhz  MPU @ 0.950V,    CORE @ 1.1V (OPM50)

These are the most common operating modes for the Beaglebone Black but there are many others possible. You can see there are two different power domains shown: the MPU domain and the CORE domain.

I also ran some benchmark test with these results:

1000Mhz 13.848 MFLOPS
720Mhz   9.948 MFLOPS
600Mhz   8.263 MFLOPS
500Mhz   6.894 MFLOPS
275Mhz   3.768 MFLOPS

I was able to “flip” the operating mode on the fly and rerun the benchmark without resetting. The power readings differential from 1Ghz to 275Mhz was approximately 340mw and while this may not sound like a lot over one charge cycle it can extend battery life several hours. There is clearly a power vs. performance tradeoff shown.

Another area worth investigating is the whole Suspend/Resume operation. Again, there are interesting possibilities as the AM335x has several Deep Sleep and Suspend modes that drop standby power to almost nothing yet with still the ability to wake up on command, like touch screen or RTC alarm. The Am335x actually has a small co-processor, called a CM3 that aids in this task. Alas, this feature is also broken in the last TI BSP release. I will share my finding in a future blog posing. 

Community BSP at https://beaglebonebsp.codeplex.com/