Author: wmb Date: 2009-07-24 21:38:21 +0200 (Fri, 24 Jul 2009) New Revision: 1251
Added: cpu/x86/pc/olpc/via/sound.fth Modified: cpu/x86/pc/olpc/via/fw.bth dev/hdaudio/conexant.fth dev/hdaudio/core.fth Log: Via audio - added completion alarm to stop startup sound.
Modified: cpu/x86/pc/olpc/via/fw.bth =================================================================== --- cpu/x86/pc/olpc/via/fw.bth 2009-07-24 19:36:19 UTC (rev 1250) +++ cpu/x86/pc/olpc/via/fw.bth 2009-07-24 19:38:21 UTC (rev 1251) @@ -347,6 +347,7 @@
fload ${BP}/cpu/x86/pc/olpc/setwp.fth fload ${BP}/cpu/x86/pc/olpc/sound.fth +fload ${BP}/cpu/x86/pc/olpc/via/sound.fth fload ${BP}/cpu/x86/pc/olpc/security.fth fload ${BP}/ofw/gui/ofpong.fth fload ${BP}/cpu/x86/pc/olpc/life.fth
Added: cpu/x86/pc/olpc/via/sound.fth =================================================================== --- cpu/x86/pc/olpc/via/sound.fth (rev 0) +++ cpu/x86/pc/olpc/via/sound.fth 2009-07-24 19:38:21 UTC (rev 1251) @@ -0,0 +1,8 @@ +: audio-quiet ( -- ) + [ ' go-hook behavior compile, ] \ Chain to old behavior + audio-ih if + audio-ih close-dev + 0 to audio-ih + then +; +' audio-quiet to go-hook
Modified: dev/hdaudio/conexant.fth =================================================================== --- dev/hdaudio/conexant.fth 2009-07-24 19:36:19 UTC (rev 1250) +++ dev/hdaudio/conexant.fth 2009-07-24 19:38:21 UTC (rev 1251) @@ -20,17 +20,6 @@ h# 10 to node h# 3a03e cmd h# 3903e cmd ;
-: cx2058x-open ( -- ) - h# 10 to dac - h# 14 to adc - power-on-all - volume-on-all -; - -: cx2058x-close ( -- ) - 1 to node ( function group) power-off -; - h# 1a value mic-in \ Port B h# 1b value mic \ Port C h# 17 value mux \ mux between the two @@ -54,13 +43,109 @@ ; : cx2058x-disable-playback ( -- ) ;
-: cx2058x-init ( -- ) +: 1/8" ( u -- u ) h# 10000 or ; +: green ( u -- u ) h# 4000 or ; +: pink ( u -- u ) h# 9000 or ; +: hp-out ( u -- u ) h# 200000 or ; +: spdiff-out ( u -- u ) h# 400000 or ; +: mic-in ( u -- u ) h# a00000 or ; +: line-in ( u -- u ) h# 800000 or ; +: line-out ( u -- u ) ; +: speaker ( u -- u ) h# 100000 or ; +: left ( u -- u ) h# 3000000 or ; +: front ( u -- u ) h# 2000000 or ; +: internal ( u -- u ) h# 10000000 or ; +: jack ( u -- u ) h# 00000000 or ; +: unused ( u -- u ) h# 40000000 or ; +: builtin ( u -- u ) h# 80000000 or ; + +: config( ( node -- null-config-default ) to node 0 ; + +: )config ( config-default -- ) + \ set the high 24 bits of the config-default value + \ the low 8 bits (default association, sequence) are preserved + 8 rshift dup h# ff and 71d00 or cmd + 8 rshift dup h# ff and 71e00 or cmd + 8 rshift h# ff and 71f00 or cmd +; + +: port-a ( -- u ) 19 config( 1/8" green left hp-out jack )config ; +: port-b ( -- u ) 1a config( 1/8" pink left mic-in jack )config ; +: port-c ( -- u ) 1b config( builtin front mic-in )config ; +: port-d ( -- u ) 1c config( unused line-out )config ; +: port-e ( -- u ) 1d config( unused line-out )config ; +: port-f ( -- u ) 1e config( 1/8" pink left line-in jack )config ; +: port-g ( -- u ) 1f config( builtin front speaker )config ; +: port-h ( -- u ) 20 config( unused spdiff-out )config ; +: port-i ( -- u ) 22 config( unused spdiff-out )config ; +: port-j ( -- u ) 23 config( unused mic-in )config ; + +: config-default ( -- u ) f1c00 cmd? ; + +: setup-config-default ( -- ) + port-a port-b port-c port-d port-e port-f port-g port-h port-i port-j +; + +: vendor-settings ( -- ) + h# 25 to node + h# 290a8 cmd \ high-pass filter, semi-manual mode, 600Hz cutoff + h# 34001 cmd \ speaker power 1 dB gain + h# 38001 cmd \ over-current / short-circuit protection, 2.6A threshold + h# 39019 cmd \ temperature protection at 130C + h# 42011 cmd \ over-temperature shutdown of class-D +; + +\ check (expect) that cmd yields value +: check-cmd ( value cmd -- ) + dup . ." cmd? => " + cmd? ( value actual ) + push-hex dup 0 <# # # # #> type pop-base ( value actual ) + over = if ( value ) + ." (ok)" drop + else + ." but expected " . + then + cr +; + +: over-temperature? ( -- ? ) h# c3000 cmd? 4 and 0<> ; + +\ Test word to make sure the right settings are configured +: .vendor-settings ( -- ) + h# 25 to node + h# 0a8 h# a9000 check-cmd + h# 001 h# b4000 check-cmd + h# 001 h# b8000 check-cmd + h# 019 h# b9000 check-cmd + h# 011 h# c2000 check-cmd + over-temperature? if + ." over temperature!" + else + ." temperature is within bounds + then +; + +: cx2058x-open ( -- ) + h# 10 to dac + h# 14 to adc + power-on-all + volume-on-all + vendor-settings + setup-config-default +; + +: cx2058x-close ( -- ) + 1 to node ( function group) power-off +; + +: cx2058x-init ( -- ) ['] cx2058x-open to open-codec ['] cx2058x-close to close-codec ['] cx2058x-enable-recording to enable-codec-recording ['] cx2058x-disable-recording to disable-codec-recording ['] cx2058x-enable-playback to enable-codec-playback ['] cx2058x-enable-playback to disable-codec-playback +\ setup-config-default ;
\ LICENSE_BEGIN
Modified: dev/hdaudio/core.fth =================================================================== --- dev/hdaudio/core.fth 2009-07-24 19:36:19 UTC (rev 1250) +++ dev/hdaudio/core.fth 2009-07-24 19:38:21 UTC (rev 1251) @@ -108,7 +108,7 @@
\ Stream descriptor register interface. \ There are multiple stream descriptors, each with their own register set. -0 constant sd# +0 instance value sd# : sd+ ( offset -- adr ) sd# h# 20 * + au + ;
: sdctl h# 80 sd+ ; @@ -214,9 +214,17 @@ : deassert-stream-reset ( -- ) 0 sdctl rb! begin sdctl rb@ 1 and 0 = until ;
: reset-stream ( -- ) assert-stream-reset deassert-stream-reset ; -: stop-stream ( -- ) 0 sdctl rb! begin sdctl rb@ 2 and 0= until ; : start-stream ( -- ) 2 sdctl rb! begin sdctl rb@ 2 and 0<> until ; +: stop-stream ( -- ) + 0 sdctl rb! begin sdctl rb@ 2 and 0= until + 4 sdsts rb! \ clear completion flag +;
+defer playback-alarm + +: install-playback-alarm ( -- ) ['] playback-alarm d# 20 alarm ; +: uninstall-playback-alarm ( -- ) ['] playback-alarm d# 0 alarm ; + \ \ Device open and close
: restart-controller ( -- ) reset start 1 ms ( 250us wait required ) ; @@ -225,7 +233,7 @@ : close-controller ( -- ) reset unmap-regs ;
: open ( -- flag ) init-controller init-codec true ; -: close ( -- ) close-codec close-controller ; +: close ( -- ) uninstall-playback-alarm close-codec close-controller ;
d# 48.000 value sample-rate
@@ -233,7 +241,7 @@
: set-sample-rate ( Hz -- ) dup to sample-rate ( Hz ) - dup low-rate? if ( Hz ) + dup low-rate? if ( Hz ) 48kHz d# 48.000 swap / to scale-factor else ( Hz ) 1 to scale-factor @@ -267,7 +275,7 @@
0 value pad-buffer 0 value pad-buffer-phys -d# 2048 value /pad-buffer +d# 8092 value /pad-buffer
: alloc-pad-buffer ( -- ) /pad-buffer dma-alloc to pad-buffer @@ -329,7 +337,7 @@ /sound-buffer /pad-buffer + sdcbl rl! \ bytes of stream data h# 440000 sdctl rl! \ stream 4 1 sdlvi rw! \ two buffers - 1c sdsts c! \ clear status flags + 1c sdsts rb! \ clear status flags bdl-phys sdbdpl rl! 0 sdbdpu rl! stream-format sdfmt rw! @@ -401,7 +409,7 @@ : open-out ( -- ) 4 to sd# 48kHz - upsampling? if scale-factor upsample then ( adr len ) + upsampling? if scale-factor upsample then ( adr len ) ;
: audio-out ( adr len -- actual ) @@ -415,7 +423,7 @@
: release-sound-buffer ( -- ) sound-buffer sound-buffer-phys /sound-buffer dma-map-out - upsampling? if sound-buffer /sound-buffer dma-free then + upsampling? if sound-buffer /sound-buffer dma-free then ;
: write-done ( -- ) @@ -426,13 +434,21 @@ ;
: write ( adr len -- actual ) - open-out audio-out + open-out audio-out install-playback-alarm ;
-\ XXX remove when write is fixed to set up a completion handler -: wait-sound ( -- ) write-done ; - +\ Alarm handle to stop the stream when the content has been played. +: playback-completed-alarm ( -- ) + sd# ( sd# ) + 4 to sd# ( sd# ) + stream-done? if write-done then ( sd# ) + to sd# ( ) +;
+' playback-completed-alarm is playback-alarm + +: wait-sound ( -- ) ; \ sound stops with asynchronous alarm handler + : set-volume ( dB -- ) dac to node step# output-gain ;
\ \ Recording @@ -484,6 +500,7 @@ : in-gain-steps ( -- n ) in-amp-caps 8 rshift h# 7f and 1+ ; : set-record-gain ( dB -- ) drop ( hardcoded for now ) adc to node h# 40 input-gain ;
+ \ LICENSE_BEGIN \ Copyright (c) 2009 Luke Gorrie luke@bup.co.nz \
openfirmware@openfirmware.info