Incorrect PIT value inititalization?
Thomas Doerfler
Thomas.Doerfler at imd-systems.de
Tue Oct 19 17:56:27 UTC 2004
Hello leon,
I have hit this issue during my RTEMS class preparations. I have
two different types ob MBX boards here, some of them use a
4(!)MHz external crystal, some use a 32768Hz crystal. Some are
equipped with a 40MHz system clock oscillator, some with a
50MHz.
My first attempt also was, that the PIT will be fed from the
system clock input (the actual input frequency computed out of
the CPU clock definition and the PLL settings). But
unfortunately, on some boards the PIT simply does not count when
fed by such ahigh frequency. I think this was a known bug on
these chips.
So now I have a solution which can be parametrized rather
flexible.
If rtems_cpu_configuration_get_clicks_per_usec is 0, the PIT is
clocked with the EXTCLK signal (the freqeuncy of which is
determined by CPU clock definitions and PLL settings).
If rtems_cpu_configuration_get_clicks_per_usec is >0, the PIT is
clocked with the OSCCLK signal (as it was in the current code).
If rtems_cpu_configuration_get_clicks_per_usec is <0, the PIT is
clocked with the OSCCLK signal, assuming an external 32768Hz
clock. This third solution was needed, because the traditional
RTEMS timer clock definition "clocks_per_usec" is not suitable
to specify such a low frequency.
I am still not quite happy with this, because at least some of
the solutions will provide a somewhat strange timer tick.
Therefore I have not yet submitted the code.
Any comments?
wkr,
Thomas.
either uses the crystal attached to the OSCCLK, or
> Hello, all.
> We have some problem with the PIT initialization code for MPC860. As
> it
> resides in the common directory, we think that it is worth asking the
> question here.
> Our board has the 5MHz XTAL clock. The file
> /opt/rtems/rtems-src/c/src/lib/libcpu/powerpc/mpc8xx/clock/clock.c:72
>
> in function ClockOn the code that initializes the PIT value (see below)
> seems to be incorrect in case of a slower XTAL (not 50MHz as mbx860 has),
> yielding float values for clicks_per_usec.
> For example a 5MHz XTAL divided by 4 produces a 1.25MHz frequency, which
> means that clicks_per_usec = 1.25. When it is assigned to an unsigned32
> member it is truncated to 1, and the resulting value is only a rough
> estimate of the value actually desired.
>
> Original code:
> pit_value = (rtems_configuration_get_microseconds_per_tick() *
> rtems_cpu_configuration_get_clicks_per_usec()) - 1 ;
>
> We suggest the following modification:
>
> /* PIRTCLCK is XTAL / 4. XTAL is computed from the clock speed and
> PLPRCR. */
> unsigned long pitrtclk = (Cpu_table.clock_speed / ((m8xx.plprcr >> 20) +
> 1)) >> 2;
> pit_value = pitrtclk / 1000 * rtems_configuration_get_milliseconds_per_tick()
> - 1;
>
>
> Do MPC8xx gurus agree?
>
> Thanks
> Leon Pollak
--------------------------------------------
IMD Ingenieurbuero fuer Microcomputertechnik
Thomas Doerfler Herbststrasse 8
D-82178 Puchheim Germany
email: Thomas.Doerfler at imd-systems.de
PGP public key available at: http://www.imd-
systems.de/pgp_keys.htm
More information about the users
mailing list