mirror of
https://github.com/rvtr/twl_wrapsdk.git
synced 2025-10-31 06:11:10 -04:00
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/twl_wrapsdk/trunk@279 4ee2a332-4b2b-5046-8439-1ba90f034370
757 lines
25 KiB
C
757 lines
25 KiB
C
/*---------------------------------------------------------------------------*
|
||
Project: TwlSDK - libraties - CDC_
|
||
File: CDC__api.c
|
||
|
||
Copyright 2006 Nintendo. All rights reserved.
|
||
|
||
These coded instructions, statements, and computer programs contain
|
||
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||
Company Ltd., and are protected by Federal copyright law. They may
|
||
not be disclosed to third parties or copied or duplicated in any form,
|
||
in whole or in part, without the prior written consent of Nintendo.
|
||
|
||
$Log: $
|
||
$NoKeywords: $
|
||
*---------------------------------------------------------------------------*/
|
||
#include <twl.h>
|
||
#include <twl/cdc.h>
|
||
|
||
#include "pm_pmic.h"
|
||
|
||
BOOL isADCOn = FALSE;
|
||
BOOL isDACOn = FALSE;
|
||
|
||
#define CDC_PLL_STABLE_WAIT_TIME 18
|
||
#define CDC_SCAN_MODE_TIMER_CLOCK_DIVIDER_VALUE 24
|
||
|
||
static void CDCi_PowerUpPLL( void );
|
||
static void CDCi_PowerDownPLL( void );
|
||
|
||
//================================================================================
|
||
// INIT APIs
|
||
//================================================================================
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDC_Init
|
||
|
||
Description: initialize codec
|
||
|
||
Arguments: None
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
void CDC_Init( void )
|
||
{
|
||
reg_CFG_CLK |= REG_CFG_CLK_SND_MASK;
|
||
|
||
CDC_Reset();
|
||
|
||
cdcRevisionID = CDC_GetRevisionId();
|
||
|
||
CDCi_PowerUpPLL();
|
||
|
||
CDC_InitSound();
|
||
|
||
CDC_SetScanModeTimerClockDivider( CDC_SCAN_MODE_TIMER_CLOCK_DIVIDER_VALUE );
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDC_Reset
|
||
|
||
Description: codec SW reset
|
||
|
||
Arguments: None
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
void CDC_Reset( void )
|
||
{
|
||
CDC_ChangePage( 0 );
|
||
CDC_WriteI2cRegister( REG_CDC0_RST_ADDR, CDC0_RST_E );
|
||
CDC_SetInputPinControl( TRUE, TRUE, TRUE ); // enable VCNT5,SP#HP,PMOFF pin
|
||
OS_Sleep(1);
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDC_InitSound
|
||
|
||
Description: initialize output sound(speaker/headphone) logic
|
||
|
||
Arguments: None
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
void CDC_InitSound( void )
|
||
{
|
||
#if 1 // <20><><EFBFBD>̃R<CC83>[<5B>h<EFBFBD>͖{<7B><><EFBFBD>AcdcInitSound<6E>Ăяo<D18F><6F><EFBFBD><EFBFBD><EFBFBD>[<5B>`<60><><EFBFBD><EFBFBD><EFBFBD>L<EFBFBD>q<EFBFBD><71><EFBFBD>ׂ<EFBFBD><D782>R<EFBFBD>[<5B>h<EFBFBD>B
|
||
// Enable I2S
|
||
reg_SND_I2SCNT |= REG_SND_I2SCNT_E_MASK;
|
||
#endif
|
||
|
||
// setup High Pass Filter of 9.26Hz cutoff freq.
|
||
CDC_Init1stOrderFilter( cdc1stCoef_HPF_9_26Hz,
|
||
CDC_FILTER_1ST_IIR_LDAC | CDC_FILTER_1ST_IIR_RDAC );
|
||
|
||
// default, DACs are muted.
|
||
// CDC_MuteDAC();
|
||
|
||
// Setup DAC, Speaker Driver, Headphone Driver
|
||
CDC_PowerUpDAC();
|
||
|
||
CDC_SetupDAC( CDC_HP_DRV_PWON_TM_DEFAULT,
|
||
CDC_HP_DRV_RAMPUP_TM_DEFAULT,
|
||
CDC_HPSP_DRV_RAMPDWN_TM_DEFAULT );
|
||
|
||
CDC_EnableHeadphoneDriver(); // enable headphone driver
|
||
|
||
CDC_EnableSpeakerDriver(); // enable speaker driver
|
||
|
||
CDC_UnmuteDAC();
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDC_InitMic
|
||
|
||
Description: initialize microphone logic
|
||
|
||
Arguments: None
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
void CDC_InitMic( void )
|
||
{
|
||
// setup Mic Bias
|
||
CDC_ChangePage( 1 );
|
||
CDC_WriteI2cRegister( REG_CDC1_MIC_BIAS_ADDR, CDC1_MIC_BIAS_2_5V );
|
||
|
||
#if 1 // <20><><EFBFBD>̃R<CC83>[<5B>h<EFBFBD>͖{<7B><><EFBFBD>AcdcInitSound<6E>Ăяo<D18F><6F><EFBFBD><EFBFBD><EFBFBD>[<5B>`<60><><EFBFBD><EFBFBD><EFBFBD>L<EFBFBD>q<EFBFBD><71><EFBFBD>ׂ<EFBFBD><D782>R<EFBFBD>[<5B>h<EFBFBD>B
|
||
// Enable I2S
|
||
reg_SND_I2SCNT |= REG_SND_I2SCNT_E_MASK;
|
||
#endif
|
||
|
||
// setup High Pass Filter of 9.26Hz cutoff freq.
|
||
CDC_Init1stOrderFilter( cdc1stCoef_HPF_9_26Hz, CDC_FILTER_1ST_IIR_ADC );
|
||
|
||
// Setup ADC
|
||
CDC_PowerUpADC();
|
||
CDC_UnmuteADC();
|
||
|
||
CDC_EnableAGC( CDC0_AGC_CTL1_DEFAULT_GAIN );
|
||
}
|
||
|
||
|
||
//================================================================================
|
||
// Query APIs
|
||
//================================================================================
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDC_IsTwlMode
|
||
|
||
Description: check CTR-mode (True) or DS-mode (False)
|
||
|
||
Arguments: None
|
||
|
||
Returns: TRUE : CTR-mode, FALSE : DS-mode
|
||
*---------------------------------------------------------------------------*/
|
||
BOOL CDC_IsTwlMode( void )
|
||
{
|
||
return cdcIsTwlMode;
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDC_GetVendorId
|
||
|
||
Description: get Vendor ID
|
||
|
||
Arguments: None
|
||
|
||
Returns: u8 Vendor ID
|
||
*---------------------------------------------------------------------------*/
|
||
u8 CDC_GetVendorId( void )
|
||
{
|
||
CDC_ChangePage( 0 );
|
||
return CDC_ReadI2cRegister( REG_CDC0_VEND_ID_ADDR );
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDC_GetRevisionId
|
||
|
||
Description: get Revision ID
|
||
|
||
Arguments: None
|
||
|
||
Returns: u8 Revision ID (3-bit value)
|
||
*---------------------------------------------------------------------------*/
|
||
u8 CDC_GetRevisionId( void )
|
||
{
|
||
CDC_ChangePage( 0 );
|
||
return (u8)(( CDC_ReadI2cRegister( REG_CDC0_REV_ID_ADDR ) & CDC0_REV_ID_MASK ) >> CDC0_REV_ID_SHIFT);
|
||
}
|
||
|
||
//================================================================================
|
||
// State Transition APIs
|
||
//================================================================================
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDC_GoDsMode
|
||
|
||
Description: transit from CTR-mode to DS-mode
|
||
(never come back to CTR-mode without HW Reset)
|
||
|
||
Arguments: None
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
void CDC_GoDsMode( void )
|
||
{
|
||
CDC_ChangePage( 0 );
|
||
|
||
//#ifdef CDC_REVISION_A
|
||
|
||
// CODEC-IC bug workaround
|
||
CDC_PowerUpADC();
|
||
CDC_UnmuteADC();
|
||
|
||
//#endif // CDC_REVISION_A
|
||
|
||
///////////////// <20><><EFBFBD>N<D68C>̗v<CC97>]<5D>ɂ<EFBFBD><C982><EFBFBD>+7dB<64>ݒ<EFBFBD><DD92><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>i<EFBFBD>]<5D><><EFBFBD><EFBFBD>2.5<EFBFBD>{<7B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>j
|
||
CDC_WriteI2cRegister( REG_CDC0_DIG_VOL_L_ADDR, 14 );
|
||
CDC_WriteI2cRegister( REG_CDC0_DIG_VOL_R_ADDR, 14 );
|
||
/////////////////
|
||
|
||
// <20>}<7D>C<EFBFBD>N<EFBFBD>o<EFBFBD>C<EFBFBD>A<EFBFBD>X<EFBFBD><58><EFBFBD>ݒ肵<DD92>Ă<EFBFBD><C482><EFBFBD><EFBFBD>K<EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BDS<44><53><EFBFBD>[<5B>h<EFBFBD>ɓ<EFBFBD><C993><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD>
|
||
// <20><><EFBFBD>̐ݒ<CC90><DD92><EFBFBD><EFBFBD>s<EFBFBD><73><EFBFBD><EFBFBD><EFBFBD>i<EFBFBD><69><EFBFBD>Ȃ<EFBFBD><C882>B
|
||
CDC_ChangePage( 1 );
|
||
CDC_WriteI2cRegister( REG_CDC1_MIC_BIAS_ADDR, CDC1_MIC_BIAS_2_5V );
|
||
|
||
// PGA <20>ݒ<EFBFBD><DD92><EFBFBD><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD>i18.8k <20>ݒ<EFBFBD><DD92><EFBFBD>DS<44>Ɠ<EFBFBD><C693><EFBFBD><EFBFBD>̃Q<CC83>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>j
|
||
CDC_WriteI2cRegister( REG_CDC1_MIC_PGA_P_ADDR, 1 << CDC1_MIC_PGA_P_I_SHIFT);
|
||
CDC_WriteI2cRegister( REG_CDC1_MIC_PGA_M_ADDR, 1 << CDC1_MIC_PGA_M_I_SHIFT);
|
||
|
||
|
||
// PLL <20>ݒ<EFBFBD><DD92><EFBFBD> DS <20>p<EFBFBD>ɕύX
|
||
CDC_WriteI2cRegister( REG_CDC0_PLL_J_ADDR, 21 );
|
||
CDC_WriteI2cRegister( REG_CDC0_NDAC_DIV_ADDR, CDC0_NDAC_DIV_PWR | 7 );
|
||
CDC_WriteI2cRegister( REG_CDC0_NADC_DIV_ADDR, CDC0_NADC_DIV_PWR | 7 );
|
||
|
||
CDC_ChangePage( 3 );
|
||
|
||
// READREADY <20>[<5B>q<EFBFBD><71><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TSC2046-PENINTERRUPT <20>ɕύX
|
||
CDC_WriteI2cRegister( REG_CDC3_TP_CONV_MODE_ADDR, 0 );
|
||
|
||
CDC_ChangePage( 255 );
|
||
|
||
// enable DS-Mode (via reg5 : current page=255)
|
||
//
|
||
// DS-mode default
|
||
// Master Sound Power OFF, MicBias OFF, MicPGA x40 times
|
||
CDC_WriteI2cRegister( REG_CDC255_BKCMPT_MODE_ADDR, CDC255_BKCMPT_MODE_DS );
|
||
|
||
//-------------------------------------------------------------------------
|
||
// !! from now on, I2C cannot be used. Only DS-type PCSN,TCSN SPI can work.
|
||
//-------------------------------------------------------------------------
|
||
|
||
{
|
||
// MicBias powered up
|
||
// In Rev-A, MicBias must be powered up before enabling Master Sound Power
|
||
CDC_DsmodeSetSpiFlags( REG_CDC255_DS_MIC_CTL_ADDR, CDC255_DS_MIC_CTL_BIAS_PWR );
|
||
|
||
// enable Master Sound Power (via reg0 : current page=255)
|
||
//
|
||
// note: In Rev-A, if Master Sound Power is off, touch-panel logic does
|
||
// not work.
|
||
//
|
||
// CODEC PCSN is connected to IO-board Analog Key CS.
|
||
// CODEC PCSN is associated with TouchPanel now (for revision A).
|
||
//
|
||
CDC_DsmodeSetSpiFlags( REG_CDC255_AUD_CTL_ADDR, CDC255_AUD_CTL_PWR );
|
||
}
|
||
|
||
// change CODEC status variable
|
||
cdcIsTwlMode = FALSE;
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDC_SetInputPinControl
|
||
|
||
Description: set if input pin control enabled or not.
|
||
Usually, PMOFF should not be disabled.
|
||
|
||
Arguments: BOOL enable_vcnt5 : set TRUE to enable VCNT5(LCD backlight) pin
|
||
BOOL enable_sphp : set TRUE to enable SP#HP switching pin
|
||
BOOL enable_pmoff : set TRUE to enable PMOFF pin
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
void CDC_SetInputPinControl( BOOL enable_vcnt5, BOOL enable_sphp, BOOL enable_pmoff )
|
||
{
|
||
u8 work = 0;
|
||
|
||
CDC_ChangePage( 0 );
|
||
|
||
if (enable_vcnt5) work = CDC0_PIN_CTL1_VCNT5_E;
|
||
if (enable_sphp) work |= CDC0_PIN_CTL1_SPHP_E;
|
||
CDC_WriteI2cRegister( REG_CDC0_PIN_CTL1_ADDR, work );
|
||
|
||
work = 0;
|
||
if (enable_pmoff) work = CDC0_PIN_CTL2_PMOFF_E;
|
||
CDC_WriteI2cRegister( REG_CDC0_PIN_CTL2_ADDR, work );
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDC_GetInputPinControl
|
||
|
||
Description: get if input pin control enabled or not.
|
||
|
||
Arguments: BOOL *enable_vcnt5 : get TRUE if VCNT5(LCD backlight) pin is enabled
|
||
BOOL *enable_sphp : get TRUE if SP#HP switching pin is enabled
|
||
BOOL *enable_pmoff : get TRUE if PMOFF pin is enabled
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
void CDC_GetInputPinControl( BOOL *enable_vcnt5, BOOL *enable_sphp, BOOL *enable_pmoff )
|
||
{
|
||
u8 work;
|
||
|
||
*enable_vcnt5 = FALSE;
|
||
*enable_sphp = FALSE;
|
||
*enable_pmoff = FALSE;
|
||
|
||
CDC_ChangePage( 0 );
|
||
|
||
work = CDC_ReadI2cRegister( REG_CDC0_PIN_CTL1_ADDR );
|
||
if ((work & CDC0_PIN_CTL1_VCNT5_MASK) == CDC0_PIN_CTL1_VCNT5_E)
|
||
*enable_vcnt5 = TRUE;
|
||
if ((work & CDC0_PIN_CTL1_SPHP_MASK) == CDC0_PIN_CTL1_SPHP_E)
|
||
*enable_sphp = TRUE;
|
||
|
||
work = CDC_ReadI2cRegister( REG_CDC0_PIN_CTL2_ADDR );
|
||
if ((work & CDC0_PIN_CTL2_PMOFF_MASK) == CDC0_PIN_CTL2_PMOFF_E)
|
||
*enable_pmoff = TRUE;
|
||
}
|
||
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDCi_PowerUpPLL
|
||
|
||
Description: power up Internal PLL of the CODEC
|
||
|
||
Arguments: None
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
static void CDCi_PowerUpPLL( void )
|
||
{
|
||
// page 0, reg 5 <20><> P=2,R=1,PLL on <20>ݒ<EFBFBD>
|
||
CDC_ChangePage( 0 );
|
||
CDC_WriteI2cRegister( REG_CDC0_PLL_P_R_ADDR,
|
||
CDC0_PLL_P_R_PWR |
|
||
(2 << CDC0_PLL_P_R_DIV_SHIFT) |
|
||
(1 << CDC0_PLL_P_R_MUL_SHIFT) );
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDCi_PowerDownPLL
|
||
|
||
Description: power down Internal PLL of the CODEC
|
||
|
||
Arguments: None
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
static void CDCi_PowerDownPLL( void )
|
||
{
|
||
// page 0, reg 5 <20><> PLL off <20>ݒ<EFBFBD>
|
||
CDC_ChangePage( 0 );
|
||
CDC_WriteI2cRegister( REG_CDC0_PLL_P_R_ADDR, 0 );
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDC_SetParamPLL
|
||
|
||
Description: setup PLL parameter of the CODEC
|
||
|
||
Arguments: is48kHz : set 48 kHz if TRUE. set 32kHz if FALSE.
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
// <20>p<EFBFBD><70><EFBFBD><EFBFBD><EFBFBD>[<5B>^<5E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>ύX<CF8D><58><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882><EFBFBD><EFBFBD>v<EFBFBD>m<EFBFBD>F
|
||
// Codec Off<66><66><EFBFBD>ԂŕύX<CF8D><58><EFBFBD>ׂ<EFBFBD><D782>H
|
||
|
||
void CDC_SetParamPLL( BOOL is48kHz )
|
||
{
|
||
if (is48kHz)
|
||
{
|
||
CDC_WriteI2cRegister( REG_CDC0_PLL_J_ADDR, 15 );
|
||
CDC_WriteI2cRegister( REG_CDC0_NDAC_DIV_ADDR, CDC0_NDAC_DIV_PWR | 5 );
|
||
CDC_WriteI2cRegister( REG_CDC0_NADC_DIV_ADDR, CDC0_NADC_DIV_PWR | 5 );
|
||
}
|
||
else
|
||
{
|
||
CDC_WriteI2cRegister( REG_CDC0_PLL_J_ADDR, 21 );
|
||
CDC_WriteI2cRegister( REG_CDC0_NDAC_DIV_ADDR, CDC0_NDAC_DIV_PWR | 7 );
|
||
CDC_WriteI2cRegister( REG_CDC0_NADC_DIV_ADDR, CDC0_NADC_DIV_PWR | 7 );
|
||
}
|
||
}
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDC_PowerUpDAC
|
||
|
||
Description: power up (both Left,Right channel of the) DAC of the CODEC
|
||
|
||
Arguments: None
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
void CDC_PowerUpDAC( void )
|
||
{
|
||
// page 0, reg 63 <20><> Left/Right DAC On, datapath is straght-forward setting.
|
||
CDC_ChangePage( 0 );
|
||
CDC_WriteI2cRegister( REG_CDC0_DIG_PATH_ADDR,
|
||
CDC0_DIG_PATH_CH_PWR_L | (1 << CDC0_DIG_PATH_L_SHIFT) |
|
||
CDC0_DIG_PATH_CH_PWR_R | (1 << CDC0_DIG_PATH_R_SHIFT) );
|
||
|
||
// PLL <20><> ADC, DAC <20><><EFBFBD>N<EFBFBD><4E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682>ɓ<EFBFBD><C993><EFBFBD><EFBFBD>o<EFBFBD><6F><EFBFBD>炵<EFBFBD><E782B5><EFBFBD>̂ŁA<C581><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PLL <20><><EFBFBD><EFBFBD><EFBFBD>̂<EFBFBD><CC82>߂̃E<CC83>F<EFBFBD>C<EFBFBD>g<EFBFBD><67><EFBFBD>K<EFBFBD>v
|
||
if ((!isADCOn) && (!isDACOn))
|
||
OS_Sleep( CDC_PLL_STABLE_WAIT_TIME );
|
||
|
||
isDACOn = TRUE;
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDC_PowerDownDAC
|
||
|
||
Description: power down (both Left,Right channel of the) DAC of the CODEC
|
||
|
||
Arguments: None
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
void CDC_PowerDownDAC( void )
|
||
{
|
||
// page 0, reg 63 <20><> Left/Right DAC Off
|
||
CDC_ChangePage( 0 );
|
||
CDC_WriteI2cRegister( REG_CDC0_DIG_PATH_ADDR, 0 );
|
||
|
||
isDACOn = FALSE;
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDC_SetupDAC
|
||
|
||
Description: setup DAC depop value of the CODEC
|
||
|
||
Arguments: int hp_pwon_tm : Headphone Power-on time
|
||
int hp_rmpup_tm : Headphone Ramp-up step time
|
||
int sphp_rmpdn_tm : Speaker/Headphonw Ramp-down step time
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
void CDC_SetupDAC( int hp_pwon_tm, int hp_rmpup_tm, int sphp_rmpdn_tm )
|
||
{
|
||
// page 1, reg 33--35
|
||
CDC_ChangePage( 1 );
|
||
CDC_WriteI2cRegister( REG_CDC1_HP_DRV_TM_ADDR, (u8)(hp_pwon_tm | hp_rmpup_tm) );
|
||
CDC_WriteI2cRegister( REG_CDC1_HPSP_RAMPDWN_ADDR, (u8)sphp_rmpdn_tm );
|
||
CDC_WriteI2cRegister( REG_CDC1_DAC_OUTPUT_ADDR, CDC1_DAC_OUTPUT_E_R | CDC1_DAC_OUTPUT_E_L );
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDC_EnableHeadphoneDriver
|
||
|
||
Description: enable Headphone Driver (HP Driver On)
|
||
|
||
Arguments: None
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
void CDC_EnableHeadphoneDriver( void )
|
||
{
|
||
// page 1, reg 36--41
|
||
CDC_ChangePage( 1 );
|
||
|
||
// Mute Analog Volume
|
||
CDC_WriteI2cRegister( REG_CDC1_HP_ANGVOL_L_ADDR, CDC1_ANGVOL_E | CDC1_ANGVOL_GAIN_MUTE );
|
||
CDC_WriteI2cRegister( REG_CDC1_HP_ANGVOL_R_ADDR, CDC1_ANGVOL_E | CDC1_ANGVOL_GAIN_MUTE );
|
||
|
||
// Power Up Headphone Driver, with short-circuit protection
|
||
CDC_WriteI2cRegister( REG_CDC1_HP_DRV_ADDR, CDC1_HP_DRV_PWR_L | CDC1_HP_DRV_PWR_R |
|
||
CDC1_HP_CMN_MODE_VOL_1_65V | CDC1_HP_DRV_SHTC_PROTECT_E );
|
||
|
||
// Un-mute Headphone
|
||
CDC_WriteI2cRegister( REG_CDC1_HP_DRV_L_ADDR, CDC1_HP_DRV_PDN_TRISTATE | CDC1_HP_DRV_MUTEN );
|
||
CDC_WriteI2cRegister( REG_CDC1_HP_DRV_R_ADDR, CDC1_HP_DRV_PDN_TRISTATE | CDC1_HP_DRV_MUTEN );
|
||
|
||
// Un-mute Analog Volume
|
||
CDC_WriteI2cRegister( REG_CDC1_HP_ANGVOL_L_ADDR, CDC1_ANGVOL_E | CDC1_ANGVOL_GAIN_MAX );
|
||
CDC_WriteI2cRegister( REG_CDC1_HP_ANGVOL_R_ADDR, CDC1_ANGVOL_E | CDC1_ANGVOL_GAIN_MAX );
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDC_DisableHeadphoneDriver
|
||
|
||
Description: disable Headphone Driver (HP Driver Off)
|
||
|
||
Arguments: None
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
void CDC_DisableHeadphoneDriver( void )
|
||
{
|
||
// page 1, reg 36--37,31
|
||
CDC_ChangePage( 1 );
|
||
|
||
// Mute Analog Volume
|
||
CDC_WriteI2cRegister( REG_CDC1_HP_ANGVOL_L_ADDR, CDC1_ANGVOL_E | CDC1_ANGVOL_GAIN_MUTE );
|
||
CDC_WriteI2cRegister( REG_CDC1_HP_ANGVOL_R_ADDR, CDC1_ANGVOL_E | CDC1_ANGVOL_GAIN_MUTE );
|
||
|
||
// Power Down Headphone Driver, with short-circuit protection
|
||
CDC_WriteI2cRegister( REG_CDC1_HP_DRV_ADDR, CDC1_HP_DRV_SHTC_PROTECT_E );
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDC_EnableSpeakerDriver
|
||
|
||
Description: enable Speaker Driver (SP Driver On)
|
||
|
||
Arguments: None
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
void CDC_EnableSpeakerDriver( void )
|
||
{
|
||
// page 1, reg 38-39,32,42-43
|
||
CDC_ChangePage( 1 );
|
||
|
||
// Mute Analog Volume
|
||
CDC_WriteI2cRegister( REG_CDC1_SP_ANGVOL_L_ADDR, CDC1_ANGVOL_E | CDC1_ANGVOL_GAIN_MUTE );
|
||
CDC_WriteI2cRegister( REG_CDC1_SP_ANGVOL_R_ADDR, CDC1_ANGVOL_E | CDC1_ANGVOL_GAIN_MUTE );
|
||
|
||
// Power Up Speaker Driver, with short-circuit protection
|
||
CDC_WriteI2cRegister( REG_CDC1_SP_DRV_ADDR, CDC1_SP_DRV_PWR_L | CDC1_SP_DRV_PWR_R |
|
||
CDC1_SP_DRV_SHTC_PROTECT_E );
|
||
|
||
// Un-mute Speaker
|
||
CDC_WriteI2cRegister( REG_CDC1_SP_DRV_L_ADDR, CDC1_SP_DRV_MUTEN | CDC1_SP_DRV_GAIN_0DB );
|
||
CDC_WriteI2cRegister( REG_CDC1_SP_DRV_R_ADDR, CDC1_SP_DRV_MUTEN | CDC1_SP_DRV_GAIN_0DB );
|
||
|
||
// Un-mute Analog Volume
|
||
CDC_WriteI2cRegister( REG_CDC1_SP_ANGVOL_L_ADDR, CDC1_ANGVOL_E | CDC1_ANGVOL_GAIN_MAX );
|
||
CDC_WriteI2cRegister( REG_CDC1_SP_ANGVOL_R_ADDR, CDC1_ANGVOL_E | CDC1_ANGVOL_GAIN_MAX );
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDC_DisableSpeakerDriver
|
||
|
||
Description: disable Speaker Driver (SP Driver Off)
|
||
|
||
Arguments: None
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
void CDC_DisableSpeakerDriver( void )
|
||
{
|
||
// page 1, reg 38-39,32
|
||
CDC_ChangePage( 1 );
|
||
|
||
// Mute Analog Volume
|
||
CDC_WriteI2cRegister( REG_CDC1_SP_ANGVOL_L_ADDR, CDC1_ANGVOL_E | CDC1_ANGVOL_GAIN_MUTE );
|
||
CDC_WriteI2cRegister( REG_CDC1_SP_ANGVOL_R_ADDR, CDC1_ANGVOL_E | CDC1_ANGVOL_GAIN_MUTE );
|
||
|
||
// Power Down Speaker Driver, with short-circuit protection
|
||
CDC_WriteI2cRegister( REG_CDC1_SP_DRV_ADDR, CDC1_SP_DRV_SHTC_PROTECT_E );
|
||
}
|
||
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDC_UnmuteDAC
|
||
|
||
Description: Un-mute DAC of the CODEC
|
||
|
||
Arguments: None
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
void CDC_UnmuteDAC( void )
|
||
{
|
||
// page 0, reg 64 <20><> Un-mute
|
||
CDC_ChangePage( 0 );
|
||
CDC_WriteI2cRegister( REG_CDC0_DIG_VOL_M_ADDR, 0 );
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDC_MuteDAC
|
||
|
||
Description: Mute DAC of the CODEC
|
||
|
||
Arguments: None
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
void CDC_MuteDAC( void )
|
||
{
|
||
// page 0, reg 64 <20><> Mute
|
||
CDC_ChangePage( 0 );
|
||
CDC_WriteI2cRegister( REG_CDC0_DIG_VOL_M_ADDR, CDC0_DIG_VOL_M_MUTE_L | CDC0_DIG_VOL_M_MUTE_R );
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDC_PowerUpADC
|
||
|
||
Description: power up ADC of the CODEC
|
||
|
||
Arguments: None
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
void CDC_PowerUpADC( void )
|
||
{
|
||
// page 0, reg 81 <20><> Power Up
|
||
CDC_ChangePage( 0 );
|
||
CDC_WriteI2cRegister( REG_CDC0_ADC_PWR_STEP_ADDR, CDC0_ADC_PWR_STEP_PWRUP );
|
||
|
||
// PLL <20><> ADC, DAC <20><><EFBFBD>N<EFBFBD><4E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682>ɓ<EFBFBD><C993><EFBFBD><EFBFBD>o<EFBFBD><6F><EFBFBD>炵<EFBFBD><E782B5><EFBFBD>̂ŁA<C581><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PLL <20><><EFBFBD><EFBFBD><EFBFBD>̂<EFBFBD><CC82>߂̃E<CC83>F<EFBFBD>C<EFBFBD>g<EFBFBD><67><EFBFBD>K<EFBFBD>v
|
||
if ((!isADCOn) && (!isDACOn))
|
||
OS_Sleep( CDC_PLL_STABLE_WAIT_TIME );
|
||
|
||
isADCOn = TRUE;
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDC_PowerDownADC
|
||
|
||
Description: power down ADC of the CODEC
|
||
|
||
Arguments: None
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
void CDC_PowerDownADC( void )
|
||
{
|
||
// page 0, reg 81 <20><> Power Down
|
||
CDC_ChangePage( 0 );
|
||
CDC_WriteI2cRegister( REG_CDC0_ADC_PWR_STEP_ADDR, CDC0_ADC_PWR_STEP_PWRDN );
|
||
|
||
isADCOn = FALSE;
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDC_UnmuteADC
|
||
|
||
Description: Un-mute ADC of the CODEC
|
||
|
||
Arguments: None
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
void CDC_UnmuteADC( void )
|
||
{
|
||
// page 0, reg 82 <20><> Un-mute
|
||
CDC_ChangePage( 0 );
|
||
CDC_WriteI2cRegister( REG_CDC0_ADC_MUTE_ADDR, CDC0_ADC_MUTE_D );
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDC_MuteADC
|
||
|
||
Description: Mute ADC of the CODEC
|
||
|
||
Arguments: None
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
void CDC_MuteADC( void )
|
||
{
|
||
// page 0, reg 82 <20><> Mute
|
||
CDC_ChangePage( 0 );
|
||
CDC_WriteI2cRegister( REG_CDC0_ADC_MUTE_ADDR, CDC0_ADC_MUTE_E );
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDC_EnableAGC
|
||
|
||
Description: Enable AGC of the CODEC
|
||
|
||
Arguments: int target_gain : AGC Target Gain
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
void CDC_EnableAGC( int target_gain )
|
||
{
|
||
// page 0, reg 86 <20><> Enable
|
||
CDC_ChangePage( 0 );
|
||
CDC_WriteI2cRegister( REG_CDC0_AGC_CTL1_ADDR, (u8)(CDC0_AGC_CTL1_E | target_gain) );
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDC_DisableAGC
|
||
|
||
Description: Disable AGC of the CODEC
|
||
|
||
Arguments: None
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
void CDC_DisableAGC( void )
|
||
{
|
||
// page 0, reg 86 <20><> Disable
|
||
CDC_ChangePage( 0 );
|
||
CDC_WriteI2cRegister( REG_CDC0_AGC_CTL1_ADDR, CDC0_AGC_CTL1_D );
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDC_Init1stOrderFilter
|
||
|
||
Description: initialize 1st order filter coeffient
|
||
|
||
Arguments: u8 *coef : 1st order coefficient (6 bytes)
|
||
int filter_target : target filter to be setup
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
void CDC_Init1stOrderFilter( u8 *coef, int filter_target )
|
||
{
|
||
if (filter_target & CDC_FILTER_1ST_IIR_ADC)
|
||
{
|
||
CDC_ChangePage( 4 );
|
||
CDC_WriteI2cRegisters( REG_CDC4_ADC_C4_MSB_ADDR, coef, 6 );
|
||
}
|
||
if (filter_target & CDC_FILTER_1ST_IIR_LDAC)
|
||
{
|
||
CDC_ChangePage( 9 );
|
||
CDC_WriteI2cRegisters( REG_CDC9_DAC_C65_MSB_ADDR, coef, 6 );
|
||
}
|
||
if (filter_target & CDC_FILTER_1ST_IIR_RDAC)
|
||
{
|
||
CDC_ChangePage( 9 );
|
||
CDC_WriteI2cRegisters( REG_CDC9_DAC_C68_MSB_ADDR, coef, 6 );
|
||
}
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: CDC_SetScanModeTimerClockDivider
|
||
|
||
Description: <20>X<EFBFBD>L<EFBFBD><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[<5B>h<EFBFBD>̃N<CC83><4E><EFBFBD>b<EFBFBD>N<EFBFBD>f<EFBFBD>B<EFBFBD>o<EFBFBD>C<EFBFBD>_<EFBFBD>[<5B><><EFBFBD>ݒ肵<DD92>܂<EFBFBD><DC82>B
|
||
ARM7<4D><37><EFBFBD>狟<EFBFBD><E78B9F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MCLK<4C>i12.19MHz<EFBFBD>j<EFBFBD>̓f<EFBFBD>B<EFBFBD>o<EFBFBD>C<EFBFBD>_<EFBFBD>[<5B>̒l<CC92><6C>
|
||
<EFBFBD>@<40>@<40>@<40>@<40>@<40>@<40>@<40>@<40><><EFBFBD><EFBFBD><EFBFBD>ĕ<EFBFBD><C495><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><DC82>B
|
||
|
||
<EFBFBD>@<40>@<40>@<40>@<40>@<40>@<40>@<40>@<40><><EFBFBD>ʂƂ<CA82><C682>āA<C481>f<EFBFBD>B<EFBFBD>o<EFBFBD>C<EFBFBD>_<EFBFBD>[<5B>̒l<CC92>ɔ<EFBFBD><C994>Ⴕ<EFBFBD><E182B5>
|
||
<EFBFBD>@<40>@<40>@<40>@<40>@<40>@<40>@<40>@<40>E<EFBFBD>C<EFBFBD><43><EFBFBD>^<5E>[<5B>o<EFBFBD><6F><EFBFBD>^<5E>C<EFBFBD>}<7D>[
|
||
<EFBFBD>@<40>@<40>@<40>@<40>@<40>@<40>@<40>@<40>E<EFBFBD>f<EFBFBD>o<EFBFBD>E<EFBFBD><45><EFBFBD>X<EFBFBD>^<5E>C<EFBFBD>}<7D>[
|
||
<EFBFBD>@<40>@<40>@<40>@<40>@<40>@<40>@<40>@<40>̎<EFBFBD><CC8E>Ԃ<EFBFBD><D482>X<EFBFBD>P<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><DC82>B
|
||
|
||
<20><><EFBFBD>{<7B>I<EFBFBD>ɂ<EFBFBD> 24 <20>Œ<EFBFBD><C592>Ƃ<EFBFBD><C682>܂<EFBFBD><DC82>B
|
||
|
||
MCLK = 12.19MHz
|
||
divider = 24
|
||
interval time = 16ms 2ms 4ms 6ms 8ms 10ms 12ms 14ms
|
||
de-bounce time = 0us 16us 32us 64us 128us 256us 512us 1024us
|
||
|
||
Arguments: value :
|
||
|
||
Returns: None
|
||
*---------------------------------------------------------------------------*/
|
||
void CDC_SetScanModeTimerClockDivider( u8 value )
|
||
{
|
||
SDK_ASSERT( value < 128);
|
||
CDC_ChangePage( 3 );
|
||
CDC_WriteI2cRegister( REG_CDC3_TP_DELAY_CLK_ADDR, value );
|
||
}
|
||
|