Author: wmb Date: Wed Jun 1 04:33:57 2011 New Revision: 2237 URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2237
Log: OLPC trac #10886 - Simultaneous output and input is working for XO-1.75 - a prerequisite for the correlation-based selftest.
Modified: cpu/arm/olpc/1.75/sound.fth
Modified: cpu/arm/olpc/1.75/sound.fth ============================================================================== --- cpu/arm/olpc/1.75/sound.fth Tue May 31 21:39:42 2011 (r2236) +++ cpu/arm/olpc/1.75/sound.fth Wed Jun 1 04:33:57 2011 (r2237) @@ -34,7 +34,7 @@
h# d405.0024 l@ h# 20 or h# d405.0024 l! \ Enable 12S clock out to SSPA1
- h# 10800 38 sspa! + h# 10800 h# 38 sspa!
[ifdef] 24mhz \ Bits 14:9 set the divisor from SYSCLK to BITCLK. The setting below @@ -46,7 +46,11 @@ [then] ;
+: reset-rx ( -- ) h# 8000.0002 h# 0c sspa! ; + : setup-sspa-rx ( -- ) + reset-rx + h# 8000.0000 \ Dual phase (stereo) 0 d# 24 lshift or \ 1 word in phase 2 2 d# 21 lshift or \ 16 bit word in phase 2 @@ -60,7 +64,8 @@
h# 8000.0000 \ Enable writes d# 15 d# 20 lshift or \ Frame sync width - 1 d# 18 lshift or \ Internal clock - master configuration +\ We choose the master/slave configuration later, in enable-sspa-tx + 0 d# 18 lshift or \ Internal clock - master configuration 0 d# 17 lshift or \ Sample on rising edge of clock 0 d# 16 lshift or \ Active high frame sync d# 31 d# 4 lshift or \ Frame sync period @@ -69,11 +74,15 @@
h# 10 h# 10 sspa! \ Rx FIFO limit ; -: enable-sspa-rx ( -- ) h# 0c sspa@ h# 8004.0001 or h# 0c sspa! ; -: disable-sspa-rx ( -- ) h# 0c sspa@ h# 8000.0040 or h# 4.0001 invert and h# 0c sspa! ; +: master-rx ( -- ) h# 0c sspa@ h# 8004.0001 or h# 0c sspa! ; \ Master, on +: slave-rx ( -- ) h# 0c sspa@ h# 8000.0001 or h# 0c sspa! ; \ Slave, on +: disable-sspa-rx ( -- ) h# 0c sspa@ h# 8000.0004 or h# 4.0001 invert and h# 0c sspa! ;
+: reset-tx ( -- ) h# 8000.0002 h# 8c sspa! ;
: setup-sspa-tx ( -- ) + reset-tx + h# 8000.0000 \ Dual phase (stereo) 0 d# 24 lshift or \ 1 word in phase 2 2 d# 21 lshift or \ 16 bit word in phase 2 @@ -88,8 +97,8 @@
h# 8000.0000 \ Enable writes d# 15 d# 20 lshift or \ Frame sync width - 1 d# 18 lshift or \ Internal clock - master configuration -\ 0 d# 18 lshift or \ External clock - slave configuration (Rx is master) +\ We choose the master/slave configuration later, in master-tx + 0 d# 18 lshift or \ External clock - slave configuration (Rx is master) 0 d# 17 lshift or \ Sample on rising edge of clock 0 d# 16 lshift or \ Active high frame sync d# 31 d# 4 lshift or \ Frame sync period @@ -98,8 +107,9 @@
h# 10 h# 90 sspa! \ Tx FIFO limit ; -: enable-sspa-tx ( -- ) h# 8c sspa@ h# 8004.0001 or h# 8c sspa! ; -: disable-sspa-tx ( -- ) h# 8c sspa@ h# 8000.0040 or h# 4.0001 invert and h# 8c sspa! ; +: master-tx ( -- ) h# 8c sspa@ h# 8004.0001 or h# 8c sspa! ; \ Master, on +: slave-tx ( -- ) h# 8c sspa@ h# 8000.0001 or h# 8c sspa! ; \ Slave, on +: disable-sspa-tx ( -- ) h# 8c sspa@ h# 8000.0004 or h# 4.0001 invert and h# 8c sspa! ;
h# e000.0000 constant audio-sram h# fc0 constant /audio-buf @@ -232,7 +242,7 @@ : dma-alloc ( len -- adr ) " dma-alloc" $call-parent ; : dma-free ( adr len -- ) " dma-free" $call-parent ;
-: open-in ( -- ) setup-sspa-rx ; +: open-in ( -- ) ; : close-in ( -- ) ; : open-out ( -- ) setup-sspa-tx ; : close-out ( -- ) ; @@ -266,14 +276,25 @@ false to playing? ;
+: out-ready? ( -- flag ) + h# a0 adma@ 1 and 0<> + dup if 0 h# a0 adma! then +; +: out-dma-done? ( -- flag ) h# 40 adma@ h# 4000 and 0= ; + : ?end-playing ( -- ) - h# a0 adma@ 1 and 0= if exit then - 0 h# a0 adma! - out-len if copy-out then - h# 40 adma@ h# 4000 and 0= if - stop-out + out-ready? if + out-len if copy-out then + out-dma-done? if stop-out then then ; + +: set-out-in-mic ( -- ) + h# 80 h# 12 codec! \ Mute right channel + h# 00 h# 16 codec! \ Full digital gain + h# 6688 h# 22 codec! \ No mic boost, low bias +; + : playback-continue-alarm ( -- ) playing? if ?end-playing @@ -291,10 +312,10 @@ to out-adr ( ) make-out-ring copy-out + out-len if copy-out then \ Prefill the second buffer start-out-ring - enable-sspa-tx + master-tx dac-on - out-len if copy-out then \ Prefill the second buffer install-playback-alarm true to playing? ; @@ -323,18 +344,23 @@
: write ( adr len -- actual ) open-out audio-out ;
+: in-ready? ( -- flag ) + h# a4 adma@ 1 and 0<> + dup if 0 h# a4 adma! then +; : wait-in ( -- ) buf-timeout 0 do - 1 ms h# a4 adma@ 1 and ?leave + 1 ms in-ready? ?leave loop - 0 h# a4 adma! ; + : audio-in ( adr len -- actual ) tuck to in-len to in-adr ( actual ) + setup-sspa-rx ( actual ) make-in-ring ( actual ) - enable-sspa-rx ( actual ) - adc-on ( actual ) start-in-ring ( actual ) + master-rx ( actual ) + adc-on ( actual ) begin in-len while ( actual ) wait-in ( actual ) copy-in ( actual ) @@ -343,6 +369,51 @@ ; : read ( adr len -- actual ) open-in audio-in ;
+: out-in ( out-adr out-len in-adr in-len -- ) + to in-len to in-adr ( out-adr out-len ) + to out-len to out-adr ( ) + + setup-sspa-tx ( ) + setup-sspa-rx ( ) + + make-in-ring ( ) + make-out-ring ( ) + copy-out ( ) \ Prefill the first Tx buffer + out-len if copy-out then ( ) \ Prefill the second Tx buffer + + start-in-ring ( ) + start-out-ring ( ) + + master-rx ( ) \ Now the clock is on + slave-tx ( ) + + adc-on ( ) + dac-on ( ) + + true to playing? + + begin in-len playing? or while ( ) + in-ready? if copy-in then ( ) + playing? if ?end-playing then ( ) + repeat ( ) + disable-sspa-rx ( ) + disable-sspa-tx ( ) + + dac-off adc-off ( ) +; + +0 [if] \ Interactive test words for out-in +h# 20000 constant tlen +: xb load-base 1meg + ; +: ob load-base ; +: sb load-base 1meg 2* + ; +: px xb tlen write drop ; +: po ob tlen write drop ; +: ps sb tlen write drop ; +: shiftit xb 1+ sb tlen move ; +: oi ob tlen xb tlen out-in ; +[then] + : wait-sound ( -- ) lock[ begin playing? while d# 10 ms ?end-playing repeat
openfirmware@openfirmware.info