/****************************************************************************** ソフトウェアI2C通信 de JHL 藤田@開技 '07 Aug, '07 Dec !!注意!! ・読み出し&書き込みを行うと (vol inc/dec) およそ1msかかります。 ・クロックのデューティーなどを要求しないでください。 ・割り込み禁止にしてないのでタイミングによっては割り込みが入ります。 ・波形の対称性など気にしていません。最速でパタパタしますが、もともと遅いです。 ・ウェイトコンディションをとりあえず気にしません。 *******************************************************************************/ #include "macrodriver.h" #include "user_define.h" #include "SW_I2C.h" #include "DCP.h" #include "vreg.h" extern unsigned char vregs[]; /****************************************************************************** ここに書いちゃうけど、音量レベルから、DCPへのスケーリング ******************************************************************************/ #define VOL_INDEXES 32 #define VOL_MAX ( VOL_INDEXES - 1 ) #define VOL_INDEXES_MASK VOL_MAX static unsigned char const vol_table[VOL_INDEXES] = { 0, 40, 51, 57, 64, 70, 76, 82, 86, 90, 95, 100, 106, 111, 116, 121, 126, 131, 137, 143, 148, 153, 157, 161, 165, 168, 171, 174, 177, 180, 183, 186 }; /****************************************************************************** 逆スケーリング。 エラーや寿命で音量maxを超えてたときなどはデフォルト値?にする。 ******************************************************************************/ static unsigned char vol_2_raw( unsigned char rawVol ){ u8 i; for( i = 0; i != VOL_INDEXES; i++ ){ if( rawVol == vol_table[ i ] ){ return i; } } return( VOL_INDEXES - 9 ); // デフォルト?値 } /****************************************************************************** 前回の値を読み出す必要がある関係上、呼ぶの必須です。 ******************************************************************************/ void dcp_vol_read(){ vregs[ REG_INT_ADRS_VOL ] = vol_2_raw( iic2m_read_byte( IIC_SLV_ADDR_DCP, 0 ) ); } // 注:8段/32段のフラグは記憶しません。 // ボリュームスイッチを押したら&リピートが利く度に(× を変えた時。MAXとかでも。) // VolChange割り込みかける。 #define VOL_CHANGE_IRQ \ { \ vregs[ REG_INT_ADRS_IRQ ] |= 0x40; \ if( is_TWL ){ \ n_irq_ast; \ n_irq_ngt; \ } \ } /****************************************************************************** ボリューム1チック上げる ******************************************************************************/ void vol_inc(){ VOL_CHANGE_IRQ; if( vregs[REG_INT_ADRS_VOL] != VOL_MAX ){ if( !volSteps32 ){ if( vregs[REG_INT_ADRS_VOL] <= 1 ){ vregs[REG_INT_ADRS_VOL] += 2; }else if( vregs[REG_INT_ADRS_VOL] <= 4 ){ vregs[REG_INT_ADRS_VOL] += 4; }else{ vregs[REG_INT_ADRS_VOL] += 5; } }else{ vregs[REG_INT_ADRS_VOL] += 1; // 32段階 } if( vregs[REG_INT_ADRS_VOL] > VOL_MAX ){ vregs[REG_INT_ADRS_VOL] = VOL_MAX; } dcp_vol_set(); } } /****************************************************************************** ボリューム1チック下げる ******************************************************************************/ void vol_dec(){ VOL_CHANGE_IRQ; if( vregs[REG_INT_ADRS_VOL] != 0 ){ if( !volSteps32 ){ if( vregs[REG_INT_ADRS_VOL] >= 11 ){ vregs[REG_INT_ADRS_VOL] -= 5; }else if( vregs[REG_INT_ADRS_VOL] >= 6 ){ // 6 - 8 -> [1], 9 - 10 -> [3] vregs[REG_INT_ADRS_VOL] -= 4; }else if( vregs[REG_INT_ADRS_VOL] == 5 ){ // 5 -> [1] vregs[REG_INT_ADRS_VOL] -= 3; }else{ // 1 - 4 -> [0] vregs[REG_INT_ADRS_VOL] -= 4; } }else{ vregs[REG_INT_ADRS_VOL] -= 1; // 32段階 } if( vregs[REG_INT_ADRS_VOL] > 127 ){ vregs[REG_INT_ADRS_VOL] = 0; } dcp_vol_set(); } } /****************************************************************************** DCP操作API unsigned char vol にする。 volがすごいことになってても感知せず。 volには0(mute)〜31(max)を引く(?)。 ******************************************************************************/ void dcp_vol_set(){ u8 temp; temp = vol_table[ ( vregs[ REG_INT_ADRS_VOL ] & VOL_INDEXES_MASK ) ]; iic2m_write_data( IIC_SLV_ADDR_DCP, 0, temp ); }