Author: wmb Date: Tue May 31 01:23:49 2011 New Revision: 2234 URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2234
Log: OLPC XO-1.75 - fixed microphone test. It turns out that the ALC5631 codec doesn't like to have its ADC powered up before BCLK is present.
Modified: cpu/arm/olpc/1.75/alc5631.fth cpu/arm/olpc/1.75/sound.fth
Modified: cpu/arm/olpc/1.75/alc5631.fth ============================================================================== --- cpu/arm/olpc/1.75/alc5631.fth Fri May 27 04:16:25 2011 (r2233) +++ cpu/arm/olpc/1.75/alc5631.fth Tue May 31 01:23:49 2011 (r2234) @@ -1,17 +1,36 @@ \ See license at end of file purpose: Driver for Realtek ALC5631Q audio CODEC chip
+: adc-on ( -- ) h# 0c00 h# 3a codec-set ; +: adc-off ( -- ) h# 0c00 h# 3a codec-clr ; +: dac-on ( -- ) h# 0300 h# 3a codec-set ; +: dac-off ( -- ) h# 0300 h# 3a codec-clr ; + : codec-on ( -- ) - h# 8001 h# 34 codec! \ Slave mode, 16 bits, left justified - b# 1001.1111.1110.0000 h# 3a codec! \ All on - b# 1111.1100.0011.1100 h# 3b codec! \ All on except PLL + 0 0 codec! \ Reset + b# 1010.0000.0001.1101 h# 3c codec! \ All on except AX and MONO + d# 110 ms + b# 1110.0000.0001.1101 h# 3c codec! \ Fast VREF control + d# 100 ms + + h# 8021 h# 34 codec! \ Slave mode, 16 bits, left justified, left channel on LRCLK high + + h# 1010 h# 38 codec! \ Divisors; the values in this register don't seem to make much + \ difference unless you set the divisors to very high values. + + \ The ADC and DAC will be turned on as needed by adc-on and dac-on, after + \ the BCLK clock from the SoC is on. If you turn on the ADC when BCLK is + \ not clocking, the ADC often doesn't output any data. + b# 1001.0000.1110.0000 h# 3a codec! \ All on except ADC and DAC + b# 1111.1100.0011.1100 h# 3b codec! \ All on except PLL b# 1111.1100.0000.0000 h# 3e codec! \ AXI and MONO IN off + \ h# 8c00 h# 40 codec! \ Speaker Amp Auto Ratio GAIN, use HPFs - h# 8000 h# 40 codec! \ Speaker Amp Auto Ratio GAIN, no HPFs + h# 4e00 h# 40 codec! \ Speaker Amp Ratio GAIN is 1.44x, no HPFs h# 0000 h# 42 codec! \ Use MCLK, not PLL - b# 1110.1100.1001.0000 h# 52 codec! \ Protection on - h# 4000 h# 56 codec! \ Power on Cap-free block with de-pop +\ b# 1110.1100.1001.0000 h# 52 codec! \ Protection on + h# 8000 h# 56 codec! \ HP depop by register control ; : codec-off ( -- ) 0 h# 3a codec! \ All off @@ -82,7 +101,7 @@ ; d# 0 constant default-adc-gain \ 0 dB - range is -96.625 to +28.5 d# 0 constant default-dac-gain \ 0 dB - range is -96.625 to +28.5 -d# 44 constant default-mic-gain \ 44 dB - range is 0 to 50 dB +d# 52 constant default-mic-gain \ 52 dB - range is 0 to 52 dB d# 0 constant default-speaker-volume \ 0 dB - range is -46.5 to +12 d# -10 constant default-headphone-volume \ -10 dB - range is -46.5 to 0
@@ -131,6 +150,7 @@ false value external-mic? : mic-routing ( -- n ) mic1-single-ended mic2-single-ended + mic1-low-bias mic2-low-bias \ Works better than high bias adc-unmute-mic ; : db>mic-boost ( db -- code ) @@ -172,7 +192,9 @@ d# 48000 of h# 0000 h# 3072 endof ( default ) true abort" Unsupported audio sample rate" endcase ( reg62val2 reg60val ) - h# 60 codec! h# 62 codec! + \ XXX need to do something with register 38 + 2drop +\ h# 60 codec! h# 62 codec! ;
\ LICENSE_BEGIN
Modified: cpu/arm/olpc/1.75/sound.fth ============================================================================== --- cpu/arm/olpc/1.75/sound.fth Fri May 27 04:16:25 2011 (r2233) +++ cpu/arm/olpc/1.75/sound.fth Tue May 31 01:23:49 2011 (r2234) @@ -193,6 +193,15 @@ r> codec! ( ) ;
+[ifdef] cl2-a1 +fload ${BP}/cpu/arm/olpc/1.75/alc5624.fth \ Realtek ALC5624 CODEC +[else] +: headphones-inserted? ( -- flag ) d# 97 gpio-pin@ ; +: microphone-inserted? ( -- flag ) d# 96 gpio-pin@ ; + +fload ${BP}/cpu/arm/olpc/1.75/alc5631.fth \ Realtek ALC5631Q CODEC +[then] + d# 48000 value sample-rate
\ Longest time to wait for a buffer event - a little more @@ -284,6 +293,7 @@ copy-out start-out-ring enable-sspa-tx + dac-on out-len if copy-out then \ Prefill the second buffer install-playback-alarm true to playing? @@ -323,6 +333,7 @@ tuck to in-len to in-adr ( actual ) make-in-ring ( actual ) enable-sspa-rx ( actual ) + adc-on ( actual ) start-in-ring ( actual ) begin in-len while ( actual ) wait-in ( actual ) @@ -351,15 +362,6 @@ \ Page 1498 - The data transmit register is listed as RO. How can a transmit register be RO???? [then]
-[ifdef] cl2-a1 -fload ${BP}/cpu/arm/olpc/1.75/alc5624.fth \ Realtek ALC5624 CODEC -[else] -: headphones-inserted? ( -- flag ) d# 97 gpio-pin@ ; -: microphone-inserted? ( -- flag ) d# 96 gpio-pin@ ; - -fload ${BP}/cpu/arm/olpc/1.75/alc5631.fth \ Realtek ALC5631Q CODEC -[then] - : set-sample-rate ( rate -- ) dup to sample-rate dup set-ctlr-sample-rate
openfirmware@openfirmware.info