#include "incs.h" // レジスタマップは user_define.h 参照 u8 vregs[REG_INT_ADRS_TIME_PWSW_THRESHOLD+1]; extern u8 battLvl; // もっといい方法がある気がする。 // 直接書くのは良くない気がする // タスクのインターバル用カウンタ。レジスタ変更通知で強制起動用 extern u8 tsk_interval_cnt_adc; extern u8 tsk_interval_cnt_power_led; extern u8 tsk_interval_cnt_wifi_led; extern bit rsv_set_vol; extern bit rsv_set_BL; extern bit rsv_set_PMIC_VRSET; extern bit rsv_set_batt_th; extern bit rsv_set_camLED; extern bit rsv_set_powLED; extern bit adc_calib_mode; extern bit self_prog_mode; //******************************************************************************* // I2C仮想レジスタに書きます。 // 引数 adrs は内部アドレス //  存在しないアドレスにアクセスした場合、何もしません。 void vregs_write( u8 adrs, u8 data ){ if( REG_INT_ADRS_TIME_PWSW_THRESHOLD < adrs ){ // アドレス範囲外 return; }else if( REG_INT_ADRS_TEMP0 <= adrs ){ // 70 - 77 vregs[ adrs ] = data; /* // マジックナンバーチェック // 呼び出し元で解決に変更。 if( adrs == REG_INT_ADRS_TEMP7 ){ if( data == 0x4A ){ self_prog_mode = 1; // 自己書き換えもーど } } */ return; }else if( REG_INT_ADRS_WIFI <= adrs ){ // 40 - switch( adrs ){ case( REG_INT_ADRS_WIFI ): vregs[ REG_INT_ADRS_WIFI ] = data; if( ( data & 0x10 ) == 0 ){ n_wifi_reset_ast; }else{ n_wifi_reset_ngt; } break; case( REG_INT_ADRS_CAM ): vregs[ REG_INT_ADRS_CAM ] = data; rsv_set_camLED = 1; break; case( REG_INT_ADRS_VOL ): vregs[ REG_INT_ADRS_VOL ] = data & 0x1F; rsv_set_vol = 1; break; case( REG_INT_ADRS_BL ): vregs[ REG_INT_ADRS_BL ] = data; rsv_set_BL = 1; break; case( REG_INT_ADRS_ADC_CALIB ): vregs[ REG_INT_ADRS_ADC_CALIB ] = data; if( ( data & 0x01 ) == 1 ) adc_calib_mode = 1; break; case( REG_INT_ADRS_POWER_LED ): vregs[ REG_INT_ADRS_POWER_LED ] = data; rsv_set_powLED = 1; break; } return; }else{ switch( adrs ){ // 0 - case( REG_INT_ADRS_COMMAND ): vregs[ REG_INT_ADRS_COMMAND ] = data; // 将来的にはここからさらにPMICにコマンド break; case( REG_INT_ADRS_POWER_SAVE ): vregs[ REG_INT_ADRS_POWER_SAVE ] = data; break; case( REG_INT_ADRS_MODE ): vregs[ REG_INT_ADRS_MODE ] = data; rsv_set_PMIC_VRSET = 1; rsv_set_batt_th = 1; break; } return; } } //******************************************************************************* // I2C仮想レジスタから読みます。 // 引数 adrs 外から見たときの、アドレス // 戻り xx データ //  存在しないアドレスにアクセスした場合、戻り値は0x5A u8 vregs_read( u8 phy_adrs ){ static u8 dat; dat = vregs[ phy_adrs ]; switch( phy_adrs ){ case( REG_INT_ADRS_IRQ ): vregs[ REG_INT_ADRS_IRQ ] = 0; break; case( REG_INT_ADRS_POWER_INFO ): if( n_ac_supp == 0 ){ // 必要なとき合成。”刺さっていればゼロ” dat |= 0x80; } break; case( 0xFF ): dat = ( 0x5A ); break; } return( dat ); } //******************************************************************************* // 外部から見える虫食いアドレスを、内部の連続アドレスに読み替える // 0xFFは存在しないアドレス。 u8 adrs_table_ext2int( u8 img ){ static u8 adrsH, adrsL; adrsH = ( img & 0xF0 ); adrsL = ( img & 0x0F ); if( adrsH > 0x80 ){ return( 0xFF ); } if( adrsH == 0x50 ){ return( 0xFF ); } if( adrsH <= 0x30 ){ // 0x00 - 0x3F if( adrsH <= 0x10 ){ // 0x00 - 0x1F if( adrsH == 0x10 ){ // 0x1* if( adrsL <= ( REG_ADRS_MODE & 0x0F ) ){ return( REG_INT_ADRS_IRQ + adrsL ); } }else{ // 0x0* if( adrsL <= ( REG_ADRS_BATT_INFO & 0x0F ) ){ return( REG_INT_ADRS_VER_INFO + adrsL ); } } }else{ // 0x20 - 0x3F if( adrsH == 0x20 ){ // 0x2? if( adrsL <= ( REG_ADRS_POWER_SAVE & 0x0F ) ){ return( REG_INT_ADRS_POWER_INFO + adrsL ); } }else{ // 0x3* if( adrsL <= ( REG_ADRS_CAM & 0x0F ) ){ return( REG_INT_ADRS_WIFI + adrsL ); } } } }else{ if( adrsH <= 0x60 ){ if( adrsH == 0x60 ){ if( adrsL <= ( REG_ADRS_POWER_LED & 0x0F ) ){ return( REG_INT_ADRS_ADC_CALIB + adrsL ); } }else{ // 40台 if( adrsL <= ( REG_ADRS_BL & 0x0F ) ){ return( REG_INT_ADRS_VOL + adrsL ); } } }else{ if( adrsH == 0x70 ){ if( adrsL <= ( REG_ADRS_TEMP7 & 0x0F ) ){ return( REG_INT_ADRS_TEMP0 + adrsL ); } }else{ // 80台 if( adrsL <= ( REG_ADRS_TIME_PWSW_THRESHOLD & 0x0F ) ){ return( REG_INT_ADRS_TIME_PWSW_DELAY + adrsL ); } } } } return( 0xFF ); }