Author: pgf
Date: Thu Nov 15 15:51:28 2012
New Revision: 3429
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/3429
Log:
fix typo in disabling of static branch prediction
Modified:
cpu/arm/mmp2/initmmu.fth
Modified: cpu/arm/mmp2/initmmu.fth
==============================================================================
--- cpu/arm/mmp2/initmmu.fth Wed Nov 14 22:54:24 2012 (r3428)
+++ cpu/arm/mmp2/initmmu.fth Thu Nov 15 15:51:28 2012 (r3429)
@@ -92,9 +92,9 @@
\ but we found this workaround in the qseven Linux kernel source.
\ It fixes a problem we were seeing with Python (trac #12164) so
\ I am including it in OFW just in case.
- mcr p15,1,r0,cr15,cr1,1 \ Workaround for PJ4B Errata 6409
+ mrc p15,1,r0,cr15,cr1,1 \ Workaround for PJ4B Errata 6409
bic r0,r0,#0x04 \ Disable static branch prediction
- mrc p15,1,r0,cr15,cr1,1
+ mcr p15,1,r0,cr15,cr1,1
[then]
mrc p15,0,r0,cr1,cr0,0 \ Read control register
Author: wmb
Date: Wed Nov 14 08:47:41 2012
New Revision: 3426
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/3426
Log:
OLPC ARM MMP3 - turn off static branch prediction because it causes erratic results.
Modified:
cpu/arm/mmp2/initmmu.fth
Modified: cpu/arm/mmp2/initmmu.fth
==============================================================================
--- cpu/arm/mmp2/initmmu.fth Wed Nov 14 08:41:30 2012 (r3425)
+++ cpu/arm/mmp2/initmmu.fth Wed Nov 14 08:47:41 2012 (r3426)
@@ -87,6 +87,16 @@
mcr p15, 0, r0, cr7, cr5, 6 \ Flush branch target cache
+[ifdef] mmp3
+ \ This erratum is not listed in PJ4B-MP.ARMv7-ErrataRev-18.pdf
+ \ but we found this workaround in the qseven Linux kernel source.
+ \ It fixes a problem we were seeing with Python (trac #12164) so
+ \ I am including it in OFW just in case.
+ mcr p15,1,r0,cr15,cr1,1 \ Workaround for PJ4B Errata 6409
+ bic r0,r0,#0x04 \ Disable static branch prediction
+ mrc p15,1,r0,cr15,cr1,1
+[then]
+
mrc p15,0,r0,cr1,cr0,0 \ Read control register
orr r0,r0,#0x1000 \ ICache on
orr r0,r0,#0x0800 \ Branch prediction on
Author: wmb
Date: Wed Nov 14 08:11:21 2012
New Revision: 3423
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/3423
Log:
OLPC ARM - accelerometer selftest
a) reduced the min-y value to prevent test fallout
b) Eliminated the not1g? test because it was failing sometimes.
The selftest is now almost worthless because the vendor-recommended
acceptance range encompasses pretty much the entire number range.
I guess what is being tested is whether the value changes at all
(in the right direction) when you invoke the built-in-test feature.
Modified:
cpu/arm/olpc/accelerometer.fth
Modified: cpu/arm/olpc/accelerometer.fth
==============================================================================
--- cpu/arm/olpc/accelerometer.fth Wed Nov 14 04:06:40 2012 (r3422)
+++ cpu/arm/olpc/accelerometer.fth Wed Nov 14 08:11:21 2012 (r3423)
@@ -76,7 +76,7 @@
\ The numbers are in units of "1LSB = 1mg", 1000 unit = 1 gravity.
d# 80 value min-x
-d# 80 value min-y
+d# 20 value min-y
d# 80 value min-z
d# 1700 value max-x
d# 1700 value max-y
@@ -132,12 +132,14 @@
delay ( )
average-acceleration@ ( x y z )
+[ifdef] notyet
\ Check that the magnitude of the acceleration vector is about 1 G
3dup not1g? if ( x y z )
3drop ( )
." Acceleration is not 1 gravity" cr ( )
true exit ( -- error? )
then ( x y z )
+[then]
\ Use the device's selftest function to force a change in one direction
h# 0a ctl4! ( x y z ) \ High res, Selftest mode 0
@@ -177,7 +179,7 @@
\ The attempt to talk at the old address failed, so we assume the new chip
\ Support for new LIS3DHTR chip
d# 400,000 to bus-speed
- d# 80 to min-x d# 80 to min-y d# 80 to min-z
+ d# 80 to min-x d# 20 to min-y d# 80 to min-z
d# 1700 to max-x d# 1700 to max-y d# 1400 to max-z
h# 19 1 reg
['] lis3dhtr-selftest to lis-selftest
Author: wmb
Date: Wed Nov 14 00:10:08 2012
New Revision: 3421
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/3421
Log:
OLPC ARM - accelerometer selftest - manufacturing was seeing a small false-negative
fallout from the accelerometer test. This change attempts to address it by:
a) Changing the scale factor for acceleration components to 1000 units = 1 gravity, per the datasheet definition of "LSB"
b) Changing the averaging from 64 samples to 5 samples, per the vendor's recommendation
c) Changing the test limits to the vendor's recommended limits (in the new units)
d) Fixing a bug in which the first test invocation often failed, due to the sensor initially being in low-resolution mode (so the granularity of the initial average was too coarse).
e) Adding a gain test to check that the magnitude of the acceleration vector is about 1 gravity.
f) Refactoring the test slightly so that "accelerometer-off" is paired more cleanly with "accelerometer-on" (inside close and open) instead of being all over the place.
Modified:
cpu/arm/olpc/accelerometer.fth
cpu/arm/olpc/roller.fth
Modified: cpu/arm/olpc/accelerometer.fth
==============================================================================
--- cpu/arm/olpc/accelerometer.fth Thu Nov 8 08:43:41 2012 (r3420)
+++ cpu/arm/olpc/accelerometer.fth Wed Nov 14 00:10:08 2012 (r3421)
@@ -4,6 +4,8 @@
" accelerometer" name
" lis3lv02d" +compatible
+true value hi-res?
+
\ reg is set dynamically by probing to find which chip is present
\ This is for the stand-alone accelerometers LIS3DHTR and LIS33DETR
@@ -13,17 +15,23 @@
: acc-reg! ( b reg# -- ) " reg-b!" $call-parent ;
: ctl1! ( b -- ) h# 20 acc-reg! ;
: ctl4! ( b -- ) h# 23 acc-reg! ;
-: accelerometer-on ( -- ) h# 47 ctl1! ;
+: ctl4@ ( -- b ) h# 23 acc-reg@ ;
+: accelerometer-on ( -- )
+ h# 47 ctl1!
+ hi-res? if 8 ctl4! then \ High resolution mode
+;
: accelerometer-off ( -- ) h# 07 ctl1! ; \ should this be 00?
: wext ( b -- n ) dup h# 8000 and if h# ffff0000 or then ;
+
+\ The scale factor for an acceleration component is 1 gravity = 1000 units.
: acceleration@ ( -- x y z )
begin h# 27 acc-reg@ h# 08 and until \ wait for data available
h# 0a8 1 6 " bytes-out-in" $call-parent ( xl xh yl yh zl zh )
- bwjoin wext 5 >>a ( xl xh yl yh z )
+ bwjoin wext 4 >>a ( xl xh yl yh z )
>r ( xl xh yl yh r: z )
- bwjoin wext 5 >>a ( xl xh y r: z )
+ bwjoin wext 4 >>a ( xl xh y r: z )
>r ( xl xh r: z y )
- bwjoin wext 5 >>a ( x r: z y )
+ bwjoin wext 4 >>a ( x r: z y )
r> r> ( x y z )
;
@@ -39,15 +47,17 @@
rot r> - ( z1 x3 y3 r: z2 )
rot r> - ( x3 y3 z3 )
;
+
\ Averaging a lot of samples reduces the effect of vibration
+\ The vendor recommends averaging 5 samples for selftest.
: average-acceleration@ ( -- x y z )
acceleration@ ( x y z )
- d# 64 0 do
+ d# 4 0 do
acceleration@ t+ ( x' y' z' )
- loop
- rot 6 >>a
- rot 6 >>a
- rot 6 >>a
+ loop ( xsum ysum zsum )
+ rot 5 / ( ysum zsum x )
+ rot 5 / ( zsum x y )
+ rot 5 / ( x y z )
;
: delay ( -- ) d# 30 ms ;
@@ -61,20 +71,16 @@
accelerometer-off
;
-\ The datasheet says the selftest change range is 3 to 32, but we
-\ give a little headroom on the high end to allow for external
-\ vibration. Typical is supposed to be 19.
-\ Empirically, measured maximums were:
-\ - Mitch's unit, 32
-\ - James' A3, 41 (on rubber mat on bare ground)
-\ - James' A2, 39
-
-d# 50 value min-x
-d# 50 value min-y
-d# 150 value min-z
-d# 150 value max-x
-d# 150 value max-y
-d# 450 value max-z
+\ The vendor recommends the following min/max values for LIS3DHTR selftest:
+\ X:80..1700 Y:80..1700 Z:80..1400.
+\ The numbers are in units of "1LSB = 1mg", 1000 unit = 1 gravity.
+
+d# 80 value min-x
+d# 80 value min-y
+d# 80 value min-z
+d# 1700 value max-x
+d# 1700 value max-y
+d# 1400 value max-z
: range? ( delta max-delta -- error? ) between 0= ;
: error? ( dx dy dz -- error? )
@@ -84,6 +90,20 @@
false
;
+\ Lower and upper test limits for the magnitude squared of the acceleration
+\ vector when the device is stationary. The scaling is 1000 units = 1 gravity.
+
+d# 900 dup * constant gsq-min \ 0.9 gravity squared
+d# 1100 dup * constant gsq-max \ 1.1 gravity squared
+
+: xyz>mag-sq ( z y z -- magnitude-squared )
+ dup * swap dup * + swap dup * +
+;
+: not1g? ( x y z -- error? )
+ xyz>mag-sq ( magnitude**2 )
+ gsq-min gsq-max between 0=
+;
+
: lis33de-selftest ( -- error? )
\ Use the device's selftest function to force a change in one direction
delay ( )
@@ -95,7 +115,7 @@
\ because we subtract the new measurement from the old.
rot negate -rot ( dx' dy dz )
negate ( dx dy dz' )
- error? if accelerometer-off true exit then
+ error? if true exit then
\ Use the device's selftest function to force a change in the opposite direction
accelerometer-on delay ( ) \ Back to normal - STM and STP both off
@@ -106,19 +126,26 @@
\ STP applies negative bias to X and Z, but our deltas are inverted
\ because we subtract the new measurement from the old.
swap negate swap ( dx dy' dz )
- error? if accelerometer-off true exit then
- false
+ error?
;
: lis3dhtr-selftest ( -- error? )
- \ Use the device's selftest function to force a change in one direction
delay ( )
average-acceleration@ ( x y z )
+
+ \ Check that the magnitude of the acceleration vector is about 1 G
+ 3dup not1g? if ( x y z )
+ 3drop ( )
+ ." Acceleration is not 1 gravity" cr ( )
+ true exit ( -- error? )
+ then ( x y z )
+
+ \ Use the device's selftest function to force a change in one direction
h# 0a ctl4! ( x y z ) \ High res, Selftest mode 0
delay
average-acceleration@ t- ( dx dy dz )
rot negate rot negate rot negate
h# 08 ctl4! ( x y z ) \ High res, Normal mode
- error? if accelerometer-off true exit then
+ error? if true exit then
\ Use the device's selftest function to force a change in the opposite direction
accelerometer-on delay ( ) \ Back to normal - STM and STP both off
@@ -127,19 +154,20 @@
delay
average-acceleration@ t- ( dx dy dz )
h# 08 ctl4! ( x y z ) \ High res, Normal mode
- error? if accelerometer-off true exit then
-
- accelerometer-off
- false
+ error?
;
defer lis-selftest
: selftest ( -- error? )
open 0= if true exit then
- final-test? if accelerometer-off false exit then
+ final-test? if
+ false
+ else
+ ." Don't move!" cr
+ lis-selftest
+ then
- ." Don't move!" cr
- lis-selftest
+ close
;
: probe ( -- )
@@ -149,19 +177,21 @@
\ The attempt to talk at the old address failed, so we assume the new chip
\ Support for new LIS3DHTR chip
d# 400,000 to bus-speed
- d# 50 to min-x d# 50 to min-y d# 50 to min-z
- d# 150 to max-x d# 150 to max-y d# 450 to max-z
+ d# 80 to min-x d# 80 to min-y d# 80 to min-z
+ d# 1700 to max-x d# 1700 to max-y d# 1400 to max-z
h# 19 1 reg
['] lis3dhtr-selftest to lis-selftest
+ true to hi-res?
else
accelerometer-off
\ Something responded to the old address, so we assume it's the old chip
\ Support for old LIS33DE chip
d# 25,000 to bus-speed
- d# 20 to min-x d# 20 to min-y d# 20 to min-z
- d# 400 to max-x d# 400 to max-y d# 400 to max-z
+ d# 40 to min-x d# 40 to min-y d# 40 to min-z
+ d# 800 to max-x d# 800 to max-y d# 800 to max-z
h# 1d 1 reg
['] lis33de-selftest to lis-selftest
+ false to hi-res?
then
;
Modified: cpu/arm/olpc/roller.fth
==============================================================================
--- cpu/arm/olpc/roller.fth Thu Nov 8 08:43:41 2012 (r3420)
+++ cpu/arm/olpc/roller.fth Wed Nov 14 00:10:08 2012 (r3421)
@@ -75,7 +75,7 @@
d# 19 d# 20 a/b>fraction value damping
-d# 1 d# 80 a/b>fraction value acc-scale
+d# 1 d# 160 a/b>fraction value acc-scale
d# 20 constant ball-radius
d# 40 constant ball-diameter