I've been working on an OS-less project (I couldn't stand the idea of using GDB - I have a much better debugger, and I needed very fast data abort and interrupt response) and been tackling the audio output side. I managed to get a waveform out at 44.1khz. It took me a while. However, the audio is clipped and I'm not sure why. It seems only the +ve side of the waveform gets clipped. The -ve side looks fine. I'm feeding in a sine wave (at 440hz) and the output looks totally consistent with the waveform except for the +ve side. It seems to be clipped at the 0v level.
I've tried fiddling with various level adjustments. I've changed fields such at ATX?1PGA, ARX?2PGA, ARX?2_APGA_GAIN, HSGAIN to no avail.
The audio is being DMAd to the TPS chip. When I dump the audio data out to a binary file it looks like a perfectly fine clean sinewave. It's 16 bit signed stereo PCM output.
Can anyone give a pointer to what may be going wrong? it's the last stage of the audio output I need to get working. I'm using the headset (AUDIO2) port.
Here's the TPS65950 configuration:
{0x49, REG_CODEC_MODE , 0x00}, // 0x01 - Disable for configuration
{0x49, REG_OPTION , OPTION_ARXL2_EN|OPTION_ARXR2_EN}, // 0x02 - Just audio out enabled
{0x49, REG_UNKNOWN , 0x00}, // 0x03
{0x49, REG_MICBIAS_CTL , 0x00}, // 0x04
{0x49, REG_ANAMICL , 0x00}, // 0x05
{0x49, REG_ANAMICR , 0x00}, // 0x06
{0x49, REG_AVADC_CTL , 0x00}, // 0x07
{0x49, REG_ADCMICSEL , 0x00}, // 0x08
{0x49, REG_DIGMIXING , 0x00}, // 0x09
{0x49, REG_ATXL1PGA , ATX_GAIN_0dB}, // 0x0a
{0x49, REG_ATXR1PGA , ATX_GAIN_0dB}, // 0x0b
{0x49, REG_AVTXL2PGA , 0x00}, // 0x0c
{0x49, REG_AVTXR2PGA , 0x00}, // 0x0d
{0x49, REG_AUDIO_IF , AUDIO_IF_AIF_EN|AUDIO_IF_DATA_WIDTH_16S16W}, // 0x0e
{0x49, REG_VOICE_IF , 0x00}, // 0x0f
{0x49, REG_ARXR1PGA , ARX_FGAIN_MUTE}, // 0x10
{0x49, REG_ARXL1PGA , ARX_FGAIN_MUTE}, // 0x11
{0x49, REG_ARXR2PGA , ARX_CGAIN_0dB|ARX_FGAIN_0dB}, // 0x12
{0x49, REG_ARXL2PGA , ARX_CGAIN_0dB|ARX_FGAIN_0dB}, // 0x13
{0x49, REG_VRXPGA , 0x00}, // 0x14
{0x49, REG_VSTPGA , 0x00}, // 0x15
{0x49, REG_VRX2ARXPGA , 0x00}, // 0x16
{0x49, REG_AVDAC_CTL , AVDAC_ADCR2_EN|AVDAC_ADCL2_EN}, // 0x17
{0x49, REG_ARX2VTXPGA , 0x00}, // 0x18
{0x49, REG_ARXL1_APGA_CTL , 0x00}, // 0x19
{0x49, REG_ARXR1_APGA_CTL , 0x00}, // 0x1a
{0x49, REG_ARXL2_APGA_CTL , ARX_APGA_GAIN_SET_NEG_6dB|ARX_APGA_DA_EN|ARX_APGA_PDZ}, // 0x1b
{0x49, REG_ARXR2_APGA_CTL , ARX_APGA_GAIN_SET_NEG_6dB|ARX_APGA_DA_EN|ARX_APGA_PDZ}, // 0x1c
{0x49, REG_ATX2ARXPGA , 0x00}, // 0x1d
{0x49, REG_BT_IF , 0x00}, // 0x1e
{0x49, REG_BTPGA , 0x00}, // 0x1f
{0x49, REG_BTSTPGA , 0x00}, // 0x20
{0x49, REG_EAR_CTL , 0x00}, // 0x21
{0x49, REG_HS_SEL , HS_SEL_HSOL_AL2_EN|HS_SEL_HSOR_AR2_EN}, // 0x22
{0x49, REG_HS_GAIN_SET , HS_GAIN_SET_HSL_GAIN_0dB|HS_GAIN_SET_HSR_GAIN_0dB}, // 0x23
{0x49, REG_HS_POPN_SET , 0x00}, // 0x24
{0x49, REG_PREDL_CTL , 0x00}, // 0x25
{0x49, REG_PREDR_CTL , 0x00}, // 0x26
{0x49, REG_PRECKL_CTL , 0x00}, // 0x27
{0x49, REG_PRECKR_CTL , 0x00}, // 0x28
{0x49, REG_HFL_CTL , 0x00}, // 0x29
{0x49, REG_HFR_CTL , 0x00}, // 0x2a
{0x49, REG_ALC_CTL , 0x00}, // 0x2b
{0x49, REG_ALC_SET1 , 0x00}, // 0x2c
{0x49, REG_ALC_SET2 , 0x00}, // 0x2d
{0x49, REG_BOOST_CTL , 0x00}, // 0x2e
{0x49, REG_SOFTVOL_CTL , 0x00}, // 0x2f
{0x49, REG_DTMF_FREQSEL , 0x00}, // 0x30
{0x49, REG_DTMF_TONEXT1H , 0x00}, // 0x31
{0x49, REG_DTMF_TONEXT1L , 0x00}, // 0x32
{0x49, REG_DTMF_TONEXT2H , 0x00}, // 0x33
{0x49, REG_DTMF_TONEXT2L , 0x00}, // 0x34
{0x49, REG_DTMF_TONOFF , 0x00}, // 0x35
{0x49, REG_DTMF_WANONOFF , 0x00}, // 0x36
{0x49, REG_I2S_RX_SCRAMBLE_H , 0x00}, // 0x37
{0x49, REG_I2S_RX_SCRAMBLE_M , 0x00}, // 0x38
{0x49, REG_I2S_RX_SCRAMBLE_L , 0x00}, // 0x39
{0x49, REG_APLL_CTL , APLL_CTL_APLL_EN|APLL_CTL_INFREQ_26Mhz}, // 0x3a
{0x49, REG_DTMF_CTL , 0x00}, // 0x3b
{0x49, REG_DTMF_PGA_CTL2 , 0x00}, // 0x3c
{0x49, REG_DTMF_PGA_CTL1 , 0x00}, // 0x3d
{0x49, REG_MISC_SET_1 , 0x00}, // 0x3e
{0x49, REG_PCMBTMUX , 0x00}, // 0x3f
{0x49, REG_UNUSED_0 , 0x00}, // 0x40
{0x49, REG_UNUSED_1 , 0x00}, // 0x41
{0x49, REG_UNUSED_2 , 0x00}, // 0x42
{0x49, REG_RX_PATH_SEL , 0x00}, // 0x43
{0x49, REG_VDL_APGA_CTL , 0x00}, // 0x44
{0x49, REG_VIBRA_CTL , 0x00}, // 0x45
{0x49, REG_VIBRA_SET , 0x00}, // 0x46
{0x49, REG_VIBRA_PWM_SET , 0x00}, // 0x47
{0x49, REG_ANAMIC_GAIN , 0x00}, // 0x48
{0x49, REG_MISC_SET_2 , 0x00}, // 0x49
{0x49, REG_CODEC_MODE , CODEC_MODE_APLL_RATE_44100|CODEC_MODE_CODECPDZ}, // 0x01 -- Must be done last when init complete
{0xff, 0xff, 0xff},