/* ======================================================== TWL互換側のI2Cレジスタ ======================================================== */ #include "incs.h" #include "jhl_defs.h" #include "led.h" #include "vreg_twl.h" #include "vreg_ctr.h" // ======================================================== #define TWL_REG_VER_INFO 0x35 #define NON_EXIST_REG 0xFF // ======================================================== u8 vreg_twl[_REG_TWL_INT_ADRS_ENDMARK]; extern bit twl_ver_read; extern bit cam_led_update; extern bit vol_changed_by_twl; /* ======================================================== 仮想レジスタの初期化 ======================================================== */ void vreg_twl_init( ) { vreg_twl[ REG_TWL_INT_ADRS_MODE ] = 0x03; vreg_twl[ REG_TWL_INT_ADRS_IRQ ] = 0; vreg_twl[ REG_TWL_INT_ADRS_CAM ] = 0; vreg_twl[ REG_TWL_INT_ADRS_TEMP0 ] = 0; } // ======================================================== // I2C仮想レジスタに書く・何かアクションする // 引数 adrs は内部アドレス //  存在しないアドレスにアクセスした場合、何もしません。 void vreg_twl_write( u8 adrs, u8 data ) { switch ( adrs ) { case ( REG_TWL_INT_ADRS_VOL ): { vol_changed_by_twl = true; vreg_twl[ REG_TWL_INT_ADRS_VOL ] = data; //renge_task_immed_add( tski_vol_update ); vol_polling = 3; break; } case ( REG_TWL_INT_ADRS_MODE ): vreg_twl[ REG_TWL_INT_ADRS_MODE ] = ( data & 0x83 ); // [8]vol32 [1:0]nand break; case ( REG_TWL_INT_ADRS_CAM ): vreg_twl[ REG_TWL_INT_ADRS_CAM ] = ( data & 0x03 ); if( ( data & 0x03 ) == TWL_CAMLED_BLINK ) { cam_led_update = true; // こうでないと一発消灯時に不具合があるため } tsk_led_cam(); break; case ( REG_TWL_INT_ADRS_TEMP0 ): vreg_twl[ REG_TWL_INT_ADRS_TEMP0 ] = 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 ){ // 10%以下で赤になる case( REG_TWL_INT_ADRS_POWER_INFO ): // レベルのセットは get_batt_left()内(処理が遅くて無理でした) return( vreg_twl[ REG_TWL_INT_ADRS_POWER_INFO ] | ( !PM_EXTDC_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 ); case( REG_TWL_INT_ADRS_VER_INFO ): // set_irq( VREG_C_IRQ2, REG_BIT_TWL_VER_READ ); // 速度的に無理なので twl_ver_read = true; return( TWL_REG_VER_INFO ); case( REG_TWL_ADRS_NON_EXIST ): return( 0x00 ); default: return( vreg_twl[ phy_adrs ] ); } } // ======================================================== // 外部から見える虫食いアドレスを、内部の連続アドレスに読み替える // 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_VOL ): return( REG_TWL_INT_ADRS_VOL ); case( REG_TWL_ADRS_CAM ): return( REG_TWL_INT_ADRS_CAM ); 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 ); } }