From 31c569252ded9408ccb17a63798afd765b699b25 Mon Sep 17 00:00:00 2001 From: yutaka Date: Thu, 28 Jun 2007 10:20:11 +0000 Subject: [PATCH] add to support 48/32kHz switching. add several Get functions git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/twl_wrapsdk/trunk@144 4ee2a332-4b2b-5046-8439-1ba90f034370 --- build/libraries/cdc/ARM7/src/cdc_api.c | 57 ++++++++++++------ build/libraries/snd/ARM7/snd_i2s.c | 79 ++++++++++++++++++++----- build/tests/snd/channel/ARM7/src/main.c | 8 ++- include/twl/cdc/ARM7/cdc_api.h | 19 ++---- include/twl/snd/ARM7/i2s.h | 6 +- 5 files changed, 116 insertions(+), 53 deletions(-) diff --git a/build/libraries/cdc/ARM7/src/cdc_api.c b/build/libraries/cdc/ARM7/src/cdc_api.c index 3b3af9b..9e9b77a 100644 --- a/build/libraries/cdc/ARM7/src/cdc_api.c +++ b/build/libraries/cdc/ARM7/src/cdc_api.c @@ -78,23 +78,23 @@ void CDC_Init( void ) #ifdef MEASUREMENT_BY_TICK tick_cdcInit_tail =OS_GetTick(); - OS_TPrintf("cdcInit = %llu, %6d\n", tick_cdcInit_head, + OS_TPrintf("CDC_Init = %llu, %6d\n", tick_cdcInit_head, OS_TICK_TO_USEC(tick_cdcInit_head)); - OS_TPrintf("cdcPowerUpPLL = %llu, %6d\n", tick_cdcPowerUpPLL_head, + OS_TPrintf("CDC_PowerUpPLL = %llu, %6d\n", tick_cdcPowerUpPLL_head, OS_TICK_TO_USEC(tick_cdcPowerUpPLL_head)); - OS_TPrintf("cdcInitSound = %llu, %6d\n", tick_cdcInitSound_head, + OS_TPrintf("CDC_InitSound = %llu, %6d\n", tick_cdcInitSound_head, OS_TICK_TO_USEC(tick_cdcInitSound_head)); - OS_TPrintf("cdcPowerUpDAC = %llu, %6d\n", tick_cdcPowerUpDAC_head, + OS_TPrintf("CDC_PowerUpDAC = %llu, %6d\n", tick_cdcPowerUpDAC_head, OS_TICK_TO_USEC(tick_cdcPowerUpDAC_head)); - OS_TPrintf("cdcSetupDAC = %llu, %6d\n", tick_cdcSetupDAC_head, + OS_TPrintf("CDC_SetupDAC = %llu, %6d\n", tick_cdcSetupDAC_head, OS_TICK_TO_USEC(tick_cdcSetupDAC_head)); - OS_TPrintf("cdcEnableHeadphoneDriver = %llu, %6d\n", tick_cdcEnableHeadphoneDriver_head, + OS_TPrintf("CDC_EnableHeadphoneDriver = %llu, %6d\n", tick_cdcEnableHeadphoneDriver_head, OS_TICK_TO_USEC(tick_cdcEnableHeadphoneDriver_head)); - OS_TPrintf("cdcEnableSpeakerDriver = %llu, %6d\n", tick_cdcEnableSpeakerDriver_head, + OS_TPrintf("CDC_EnableSpeakerDriver = %llu, %6d\n", tick_cdcEnableSpeakerDriver_head, OS_TICK_TO_USEC(tick_cdcEnableSpeakerDriver_head)); - OS_TPrintf("cdcUnmuteDAC = %llu, %6d\n", tick_cdcUnmuteDAC_head, + OS_TPrintf("CDC_UnmuteDAC = %llu, %6d\n", tick_cdcUnmuteDAC_head, OS_TICK_TO_USEC(tick_cdcUnmuteDAC_head)); - OS_TPrintf("cdcInit tail = %llu, %6d\n", tick_cdcInit_tail, + OS_TPrintf("CDC_Init tail = %llu, %6d\n", tick_cdcInit_tail, OS_TICK_TO_USEC(tick_cdcInit_tail)); #endif } @@ -396,15 +396,12 @@ void CDC_GetInputPinControl( BOOL *enable_vcnt5, BOOL *enable_sphp, BOOL *enable *---------------------------------------------------------------------------*/ static void CDCi_PowerUpPLL( void ) { - // IOP からの MCLK を check / enable - // page 0, reg 5 で P=2,R=1,PLL on 設定 CDC_ChangePage( 0 ); - CDC_WriteI2cRegister( REG_CDC0_PLL_P_R_ADDR, - CDC0_PLL_P_R_PWR | (2 << CDC0_PLL_P_R_DIV_SHIFT) | + 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) ); -// ADC / DAC のパワーアップ時が問題? -// dly_tsk( 15 ); } /*---------------------------------------------------------------------------* @@ -421,11 +418,35 @@ static void CDCi_PowerDownPLL( void ) // page 0, reg 5 で PLL off 設定 CDC_ChangePage( 0 ); CDC_WriteI2cRegister( REG_CDC0_PLL_P_R_ADDR, 0 ); -// dly_tsk( 15 ); - - // IOP からの MCLK を check / disable } +/*---------------------------------------------------------------------------* + Name: CDC_SetParamPLL + + Description: setup PLL parameter of the CODEC + + Arguments: is48kHz : set 48 kHz if TRUE. set 32kHz if FALSE. + + Returns: None + *---------------------------------------------------------------------------*/ +// パラメータをいきなり変更しても問題ないか要確認 +// Codec Off状態で変更すべき? + +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 diff --git a/build/libraries/snd/ARM7/snd_i2s.c b/build/libraries/snd/ARM7/snd_i2s.c index 30e1a37..00af7c5 100644 --- a/build/libraries/snd/ARM7/snd_i2s.c +++ b/build/libraries/snd/ARM7/snd_i2s.c @@ -41,23 +41,24 @@ static void SNDi_I2SInit(void) if (isInitialized == FALSE) { isInitialized = TRUE; + reg_SND_POWCNT |= REG_SND_POWCNT_SPE_MASK; - reg_CFG_TWL_EX |= REG_CFG_TWL_EX_I2S_MASK; - if (reg_CFG_TWL_EX & REG_CFG_TWL_EX_I2S_MASK) - { - isTwl = TRUE; - // 32KHz -// reg_SND_I2SCNT |= REG_SND_I2SCNT_MIX_RATIO_MASK; -// reg_SND_I2SCNT &= ~(REG_SND_I2SCNT_MUTE_MASK | REG_SND_I2SCNT_CODEC_SMP_MASK); - // 48KHz - reg_SND_I2SCNT |= REG_SND_I2SCNT_MIX_RATIO_MASK | REG_SND_I2SCNT_CODEC_SMP_MASK; - reg_SND_I2SCNT &= ~(REG_SND_I2SCNT_MUTE_MASK); - } + if ((reg_CFG_CLK & REG_CFG_CLK_SND_MASK) == 0) { // initialize codec with enabling I2S CDC_Init(); } + + reg_CFG_TWL_EX |= REG_CFG_TWL_EX_I2S_MASK; + if (reg_CFG_TWL_EX & REG_CFG_TWL_EX_I2S_MASK) + { + isTwl = TRUE; + // Set default values + SND_I2SSetSamplingRatio(TRUE); + SND_I2SSetMixingRatio(8); + SND_I2SMute(FALSE); + } } } @@ -172,6 +173,20 @@ void SND_I2SMute(BOOL isMute) } } +/*---------------------------------------------------------------------------* + Name: SND_I2SIsMute + + Description: Get mute status + + Arguments: None + + Returns: TRUE if mute + *---------------------------------------------------------------------------*/ +BOOL SND_I2SIsMute(void) +{ + return (BOOL)((reg_SND_I2SCNT & REG_SND_I2SCNT_MUTE_MASK) >> REG_SND_I2SCNT_MUTE_SHIFT); +} + /*---------------------------------------------------------------------------* Name: SND_I2SSetMixingRatio @@ -190,25 +205,42 @@ void SND_I2SSetMixingRatio(int nitroRatio) if (nitroRatio >= 0 && nitroRatio <= 8) { reg_SND_I2SCNT &= ~REG_SND_I2SCNT_MIX_RATIO_MASK; - reg_SND_I2SCNT = (u8)((reg_SND_I2SCNT & ~REG_SND_I2SCNT_MIX_RATIO_MASK) | nitroRatio); + reg_SND_I2SCNT = (u8)((reg_SND_I2SCNT & ~REG_SND_I2SCNT_MIX_RATIO_MASK) | (nitroRatio << REG_SND_I2SCNT_MIX_RATIO_SHIFT)); } } } +/*---------------------------------------------------------------------------* + Name: SND_I2SGetMixingRatio + + Description: Set mixing ratio + + Arguments: None + + Returns: NITRO : DSP ratio. (0-8) + if 8, nitro sound is all. + if 0, DSP sound is all. + *---------------------------------------------------------------------------*/ +int SND_I2SGetMixingRatio(void) +{ + return (reg_SND_I2SCNT & REG_SND_I2SCNT_MIX_RATIO_MASK) >> REG_SND_I2SCNT_MIX_RATIO_SHIFT; +} + /*---------------------------------------------------------------------------* Name: SND_I2SSetSamplingRatio - Description: Set I2S sampling ratio + Description: Set I2S sampling ratio. + It can be called while I2S is disabled. - Arguments: is47kHz : set 48 kHz if TRUE. set 32kHz if FALSE. + Arguments: is48kHz : set 48 kHz if TRUE. set 32kHz if FALSE. Returns: None *---------------------------------------------------------------------------*/ -void SND_I2SSetSamplingRatio(BOOL is47kHz) +void SND_I2SSetSamplingRatio(BOOL is48kHz) { if (isTwl) { - if (is47kHz) + if (is48kHz) { reg_SND_I2SCNT |= REG_SND_I2SCNT_CODEC_SMP_MASK; } @@ -216,7 +248,22 @@ void SND_I2SSetSamplingRatio(BOOL is47kHz) { reg_SND_I2SCNT &= ~REG_SND_I2SCNT_CODEC_SMP_MASK; } + CDC_SetParamPLL(is48kHz); } } +/*---------------------------------------------------------------------------* + Name: SND_I2SIsSamplingRatio48kHz + + Description: Get I2S sampling ratio. + + Arguments: None + + Returns: TRUE if 48 kHz. otherwise FALSE + *---------------------------------------------------------------------------*/ +BOOL SND_I2SIsSamplingRatio48kHz(void) +{ + return (BOOL)((reg_SND_I2SCNT & REG_SND_I2SCNT_CODEC_SMP_MASK) >> REG_SND_I2SCNT_CODEC_SMP_SHIFT); +} + /*====== End of snd_i2s.c ======*/ diff --git a/build/tests/snd/channel/ARM7/src/main.c b/build/tests/snd/channel/ARM7/src/main.c index b158d16..a5451b5 100644 --- a/build/tests/snd/channel/ARM7/src/main.c +++ b/build/tests/snd/channel/ARM7/src/main.c @@ -15,6 +15,8 @@ *---------------------------------------------------------------------------*/ #include +#include // for DS mode +#include /*---------------------------------------------------------------------------* 定数定義 @@ -29,7 +31,7 @@ *---------------------------------------------------------------------------*/ static OSHeapHandle InitializeAllocateSystem(void); static void VBlankIntr(void); -#include // for DS-mode + /*---------------------------------------------------------------------------* Name: TwlSpMain @@ -59,9 +61,9 @@ void TwlSpMain(void) #if 0 // DS mode SND_Disable(); - reg_SND_I2SCNT &= ~REG_SND_I2SCNT_CODEC_SMP_MASK; // 32kHz - SND_Enable(); + SND_I2SSetSamplingRatio(FALSE); // 32kHz CDC_GoDsMode(); + SND_Enable(); #endif // reg_CFG_DS_MDFY |= REG_CFG_DS_MDFY_SND_MASK; // SOUND回路バグ修正 (default: off) diff --git a/include/twl/cdc/ARM7/cdc_api.h b/include/twl/cdc/ARM7/cdc_api.h index ac59b41..8d595e7 100644 --- a/include/twl/cdc/ARM7/cdc_api.h +++ b/include/twl/cdc/ARM7/cdc_api.h @@ -152,26 +152,15 @@ void CDC_SetInputPinControl( BOOL enable_vcnt5, BOOL enable_sphp, BOOL enable void CDC_GetInputPinControl( BOOL *enable_vcnt5, BOOL *enable_sphp, BOOL *enable_pmoff ); /*---------------------------------------------------------------------------* - Name: i_cdcPowerUpPLL + Name: CDC_SetParamPLL - Description: power up Internal PLL of the CODEC + Description: setup PLL parameter of the CODEC - Arguments: None + Arguments: is48kHz : set 48 kHz if TRUE. set 32kHz if FALSE. Returns: None *---------------------------------------------------------------------------*/ -void i_cdcPowerUpPLL( void ); - -/*---------------------------------------------------------------------------* - Name: i_cdcPowerDownPLL - - Description: power down Internal PLL of the CODEC - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -void i_cdcPowerDownPLL( void ); +void CDC_SetParamPLL( BOOL is48kHz ); /*---------------------------------------------------------------------------* Name: CDC_PowerUpDAC diff --git a/include/twl/snd/ARM7/i2s.h b/include/twl/snd/ARM7/i2s.h index cb281f8..25c4269 100644 --- a/include/twl/snd/ARM7/i2s.h +++ b/include/twl/snd/ARM7/i2s.h @@ -45,9 +45,13 @@ void SND_I2SBeginSleep(void); void SND_I2SEndSleep(void); void SND_I2SMute(BOOL isMute); +BOOL SND_I2SIsMute(void); void SND_I2SSetMixingRatio(int nitroRatio); -void SND_I2SSetSamplingRatio(BOOL is47kHz); +int SND_I2SGetMixingRatio(void); + +void SND_I2SSetSamplingRatio(BOOL is48kHz); +BOOL SND_I2SIsSamplingRatio48kHz( void ); #endif /* SDK_ARM7 */