
On Thu, Jul 10, 2008 at 12:46:42AM +0200, Wolfgang Denk wrote:
In message 4873845B.3020808@tqs.de you wrote:
The TQMA31, as well as the mx32ads use the General Purpose Timer 1, which is feeded by a 32768 clock (possibly imx31_litekit and imx31_phycore with 32000 Hz? I don't know.). The prescale divider can only be an integer. 32768/1000 = non-integer.
I think other architectures hav / had similar issues. See for example the MIPS fixes that were added some time ago.
Currently, I see only one way to solve this:
- Patch the common file cpu/arm1136/mx31/interrupts.c, function
interrupt_init(), so that the prescaler divides by 33. Alternatively, also make the divider a board specific define. 2. Patch all mx31 board config header files with CFG_HZ 1000. 3. All mx31 boards have to be tested.
Sounds like a plan.
And while we are at the timers: The udelay function is the next problem: udelay cannot go below 1/(32768 Hz) = 30.5 micros The current function inserts a theoretical nop if the requested usec value is below 1000. Therefore, IMHO, this timer is relatively imprecise, because the resulting delay is below 1 microsecond. IMHO, this all because of that slow input clock.
How is this handled in Linux? I don't think they would let this go through?
Linux uses the high frequency timer, or better said, the same timer with a high frequency input source.
Regards, Sascha