Why is it so slow?

Go To Last Post
9 posts / 0 new
Author
Message
#1
  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Hello,

If you posses EVK1101, please run my code, and check, what frequency you may observe at PA03.

#include 
#include "intc.h"
#include "compiler.h"
#include "board.h"
#include "pm.h"
#include "gpio.h"
#include "tc.h"

#define FPBA    FOSC0    // 12000000
#define TC_CHANNEL    0

volatile avr32_gpio_port_t *gpio_port_A = &AVR32_GPIO.port[0];

#define SET_PORTA_PIN_AS_OUTPUT(pin) { \
    gpio_port_A->oders = (1 << ((pin) & 0x1F)); \
    gpio_port_A->gpers = (1 << ((pin) & 0x1F)); \
}


// set uC to 66MHz
void localStartPLL(void)
{
	volatile avr32_pm_t *pm = &AVR32_PM;

	// Switch the main clock to OSC0
	pm_switch_to_osc0(pm, FOSC0, OSC0_STARTUP);

	// Setup PLL0 on OSC0, mul=10 ,no divisor, lockcount=16, ie. 12Mhzx16 = 192MHz output
	pm_pll_setup(pm, // volatile avr32_pm_t *pm
			      0, // unsigned int pll
			     10, // unsigned int mul
			      1, // unsigned int div, Sel Osc0/PLL0 or Osc1/Pll1
			      0, // unsigned int osc
			     16); // unsigned int lockcount

	pm_pll_set_option(pm,  // volatile avr32_pm_t *pm
                       0,  // unsigned int pll
                       1,  // unsigned int  pll_freq
                       1,  // unsigned int  pll_div2
                       0); // unsigned int  pll_wbwdisable

	// Enable PLL0
	pm_pll_enable(pm, 0);

	// Wait for PLL0 locked
	pm_wait_for_pll0_locked(pm) ;

	pm_cksel(pm, 1, 0, 0, 0, 0, 0);

	// switch to clock
	pm_switch_to_clock(pm, AVR32_PM_MCCTRL_MCSEL_PLL0);
}

/*! \brief Main function. Execution starts here.
 */
int main(void)
{
    localStartPLL();

    SET_PORTA_PIN_AS_OUTPUT(AVR32_PIN_PA03);

    while(1) {
	  gpio_port_A->ovrt  = 1 << (AVR32_PIN_PA03 & 0x1F); // Toggle the I/O line.
    }
}

If I am right (correctly read from oscilloscope), PA03 is toggled 5 000 000 times per second. The uC set on EVK1101 is UC3B0256 and the oscillator is 12MHz. In localStartPLL() I set uC frequency to 66MHz (i know, that it is 6MHz faster than max frequency which is 60MHz for this uC, but I do need extra power).

The main loop in assembler is:

gpio_port_A->ovrt = 1 << (AVR32_PIN_PA03 & 0x1F); // Toggle the I/O line.
0x800020c4 : lddpc r8,0x800020d4
0x800020c6 : ld.w r9,r8[0x0]
0x800020c8 : mov r8,8
0x800020ca : st.w r9[92],r8
}
0x800020ce : rjmp 0x800020c4

When each machine command is one uC cycle, then we should have 5 cycles for each loop run. So, 66MHz divided by 5 is 13 200 000, which is 2.64 times faster than I may observe on oscilloscope (5 000 000).
Why is that?

Regards

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Bus arbitration?

Use the CPU local bus for single cycle access to the GPIO registers.

Hans-Christian

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

hce wrote:
Bus arbitration?

Yes, indeed.

I have modified my code to this:

#include 
#include "intc.h"
#include "compiler.h"
#include "board.h"
#include "pm.h"
#include "gpio.h"
#include "tc.h"

#define FPBA    FOSC0    // 12000000
#define TC_CHANNEL    0


void localStartPLL(void)
{
	  pm_switch_to_osc0(&AVR32_PM, FOSC0, OSC0_STARTUP);
	  pm_pll_setup(&AVR32_PM, 0,  // pll.
	               10,  // mul.
	               1,   // div.
	               0,   // osc.
	               16); // lockcount.
	  pm_pll_set_option(&AVR32_PM, 0, // pll.
	                    1,  // pll_freq.
	                    1,  // pll_div2.
	                    0); // pll_wbwdisable.
	  pm_pll_enable(&AVR32_PM, 0);
	  pm_wait_for_pll0_locked(&AVR32_PM);
	  pm_gc_setup(&AVR32_PM, 0,1,0,0,0);
	  pm_gc_enable(&AVR32_PM, 0);
	  pm_cksel(&AVR32_PM,
	           1,   // pbadiv.
	           0,   // pbasel.
	           1,   // pbbdiv.
	           0,   // pbbsel.
	           0,   // hsbdiv.
	           0);  // hsbsel.

      //flashc_set_wait_state(1);
	  pm_switch_to_clock(&AVR32_PM, AVR32_PM_MCCTRL_MCSEL_PLL0);
}

int main(void)
{
  localStartPLL();

  gpio_local_init();

  gpio_local_enable_pin_output_driver(AVR32_PIN_PA03);

  while(1){
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
	  AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F);
  }
}

I used many AVR32_GPIO_LOCAL.port[... to aim max number of pin toggles per second (rjmp takes processor time, so...).

In assembler:

0x800020bc 
: pushm lr localStartPLL(); 0x800020be : mcall 0x80002250 AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F); 0x800020de : mov r9,0 0x800020e0 : orh r9,0x4000 0x800020e4 : mov r8,8 0x800020e6 : st.w r9[92],r8 AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F); 0x800020ea : st.w r9[92],r8 AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F); 0x800020ee : st.w r9[92],r8 AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F); 0x800020f2 : st.w r9[92],r8 AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F); 0x800020f6 : st.w r9[92],r8 AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F); 0x800020fa : st.w r9[92],r8 AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> ... 0x80002242 : st.w r9[92],r8 AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F); 0x80002246 : st.w r9[92],r8 AVR32_GPIO_LOCAL.port[AVR32_PIN_PA03 >> 5].ovrt = 1 << (AVR32_PIN_PA03 & 0x1F); 0x8000224a : st.w r9[92],r8 0x8000224e : rjmp 0x800020de

So, each PA03 toggle is just one command.

With use of my father's old Russian analog oscilloscope (max. 20MHz) I measured that the frequency at PA03 is about 50MHz. Since uC is set to 66MHz, 50MHz seems to be not as much as it could be. Do you have idea why?
Maybe my oscilloscope does not tell truth. If somebody possess better oscilloscope and could check the frequency at PA03, I would be very glad.

Regards.

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Isn't one toggle half a period?

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

You can not measure a signal with higher speed than 10 MHz with a 20 MHz bandwidth oscilloscope ;) With the CPU local bus you should be able to switch at the same speed as the core is running on, give you do nothing else.

Hans-Christian

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Hello,
if you want to check out how many cycles you need to toggle the port it doesn't need to run at 66MHz. Use your 12MHz oscillator or even a part of it and you can use your oscilloscope again.
You can also use the CPU cycle counter from within the AVR32. Get the counter at the beginning and at the end. Build the difference and you know the number of cycles for your piece of program.

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

hce wrote:
You can not measure a signal with higher speed than 10 MHz with a 20 MHz bandwidth oscilloscope ;)

Of course You are right, when we are talking about proper picture of input signal on oscilloscope's screen. But, it is not truth when we are talking about measurement of frequency. 20MHz is connected to (I am not an electrician, so I do not know how to name it professionally) "stepness of amplitude". Such oscilloscope can measure frequencies far higher than 20MHz but vertical lines in input signal look like sinusoidal on the oscilloscope's screen. So, picture is distorted, but it is steel possible to measure frequency.
Nevermind, I will borrow 100MHz digital oscilloscope in this working week and check PA03 toggling frequency myself. But, if somebody posses such oscilloscope and EVK1101 and could check PA03 frequency for me, I would be very glad -- now I've stopped with my work because of impossibility to check real toggling frequency :(

Last Edited: Sat. Aug 22, 2009 - 09:05 PM
  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Heihopp wrote:
Isn't one toggle half a period?

It depends what we are talking about :) I measured frequency of vertical lines which are between toggling from high to low and from low to high.

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Using the gpio local bus, the PBA frequency needs to be = to CPU/HSB frequency (=PBB freq). Check your pm_cksel() function.

-sma