/* ======================================================== TWL互換側のI2Cレジスタ ======================================================== */ #include "incs.h" #include "jhl_defs.h" #include "vreg_twl.h" #include "vreg_ctr.h" #include "renge\renge_task_intval.h" // ======================================================== #define TWL_REG_VER_INFO 0x35 #define NON_EXIST_REG 0xFF // ======================================================== u8 vreg_twl[_REG_TWL_INT_ADRS_ENDMARK]; /* ======================================================== 仮想レジスタの初期化 ======================================================== */ void vreg_twl_init( ) { vreg_twl[ REG_TWL_INT_ADRS_MODE ] = 0x03; } // ======================================================== // I2C仮想レジスタに書く・何かアクションする // 引数 adrs は内部アドレス //  存在しないアドレスにアクセスした場合、何もしません。 void vreg_twl_write( u8 adrs, u8 data ) { switch ( adrs ) { case ( REG_TWL_INT_ADRS_VOL ): { set_irq( VREG_C_IRQ2, REG_BIT_TWL_SNDVOL_CHANGE ); break; } case ( REG_TWL_INT_ADRS_MODE ): vreg_twl[adrs] = ( data & 0x03 ); break; case ( REG_TWL_INT_ADRS_CAM ): vreg_twl[adrs] = ( data & 0x03 ); tsk_led_cam(); // todo 大丈夫? break; case ( REG_TWL_INT_ADRS_TEMP0 ): vreg_twl[adrs] = data; break; case ( REG_TWL_INT_ADRS_COMMAND ): /* if( data <= 2 ){ if( ( data & REG_BIT_TWL_OFF_REQ ) != 0 ) { set_irq( VREG_C_IRQ2, REG_BIT_TWL_OFF_REQ ); // OFFも実装していたらしい。 break; } else if( ( data & REG_BIT_TWL_RESET_REQ ) != 0 ) { set_irq( VREG_C_IRQ2, REG_BIT_TWL_RESET_REQ ); //リセットしかない。他のは、SPIから来ます。 break; } } */ if( data == REG_BIT_TWL_RESET_REQ ) { set_irq( VREG_C_IRQ2, REG_BIT_TWL_RESET_REQ ); //リセットしかない。他のは、SPIから来ます。 break; } } return; } // ======================================================== // I2C仮想レジスタから読みます。 // 引数 adrs 外から見たときの、アドレス // 戻り xx データ //  存在しないアドレスにアクセスした場合、戻り値は0x5A u8 vreg_twl_read( u8 phy_adrs ) { u8 temp; switch( phy_adrs ){ case( REG_TWL_INT_ADRS_VER_INFO ): return( TWL_REG_VER_INFO ); case( REG_TWL_INT_ADRS_POWER_INFO ): if( vreg_ctr[ VREG_C_BT_REMAIN ] > 90 ){ vreg_twl[ REG_TWL_INT_ADRS_POWER_INFO ] = 0x0F; }else if( vreg_ctr[ VREG_C_BT_REMAIN ] > 75 ){ vreg_twl[ REG_TWL_INT_ADRS_POWER_INFO ] = 0x0B; }else if( vreg_ctr[ VREG_C_BT_REMAIN ] > 50 ){ vreg_twl[ REG_TWL_INT_ADRS_POWER_INFO ] = 0x07; }else if( vreg_ctr[ VREG_C_BT_REMAIN ] > 25 ){ vreg_twl[ REG_TWL_INT_ADRS_POWER_INFO ] = 0x03; }else if( vreg_ctr[ VREG_C_BT_REMAIN ] > 5 ){ vreg_twl[ REG_TWL_INT_ADRS_POWER_INFO ] = 0x01; }else{ vreg_twl[ REG_TWL_INT_ADRS_POWER_INFO ] = 0x00; } return( vreg_twl[ REG_TWL_INT_ADRS_POWER_INFO ] | ( !BT_CHG_n ? 0x80: 0x00 ) ); // アダプタbit case( REG_TWL_INT_ADRS_IRQ ): temp = vreg_twl[ REG_TWL_INT_ADRS_IRQ ]; vreg_twl[ REG_TWL_INT_ADRS_IRQ ]= 0; return( temp ); default: return( vreg_twl[ phy_adrs ] ); case( REG_TWL_ADRS_NON_EXIST ): return( 0x00 ); } } // ======================================================== // 外部から見える虫食いアドレスを、内部の連続アドレスに読み替える // 0xFFは存在しないアドレス。 u8 adrs_table_twl_ext2int( u8 img ) { switch( img ){ case( REG_TWL_ADRS_IRQ ): return( REG_TWL_INT_ADRS_IRQ ); case( REG_TWL_ADRS_COMMAND ): return( REG_TWL_INT_ADRS_COMMAND ); case( REG_TWL_ADRS_POWER_INFO ): return( REG_TWL_INT_ADRS_POWER_INFO ); case( REG_TWL_ADRS_CAM ): return( REG_TWL_INT_ADRS_CAM ); case( REG_TWL_ADRS_VOL ): return( REG_TWL_INT_ADRS_VOL ); case( REG_TWL_ADRS_TEMP0 ): return( REG_TWL_INT_ADRS_TEMP0 ); case( REG_TWL_ADRS_VER_INFO ): return( REG_TWL_INT_ADRS_VER_INFO ); case( REG_TWL_ADRS_MODE ): return( REG_TWL_INT_ADRS_MODE ); default: return( REG_TWL_ADRS_NON_EXIST ); // 0が読めればよい、書けなくて良い // case( REG_TWL_ADRS_WIFI ): return( REG_TWL_INT_ADRS_WIFI ); } }