/* ======================================================== CTR MCU I2Cレジスタ ====================================================== */ #include "incs.h" #include "vreg_ctr.h" #include "rtc.h" #include "led.h" #include "accero.h" #include "pm.h" // ******************************************************** u8 vreg_ctr[VREG_C_ENDMARK_]; bit irq_readed; // AAA型のため。 // ******************************************************** // 非ゼロの初期値の指定が必要なアドレス void vreg_ctr_init( ) { vreg_ctr[VREG_C_LED_BRIGHT] = 0xFF; #ifdef _debug_ // vreg_ctr[ VREG_C_LED_TUNE ] = 0x02; #endif vreg_ctr[VREG_C_MCU_VER_MAJOR] = MCU_VER_MAJOR; #ifdef _MODEL_WM0_ vreg_ctr[VREG_C_MCU_VER_MAJOR] += 0x20; #endif #ifdef _MODEL_TS0_ vreg_ctr[VREG_C_MCU_VER_MAJOR] += 0x10; #endif vreg_ctr[VREG_C_MCU_VER_MINOR] = MCU_VER_MINOR; vreg_ctr[VREG_C_VCOM_T] = 92; vreg_ctr[VREG_C_VCOM_B] = 95; } // ******************************************************** // I2C仮想レジスタに書きます。 // 引数 adrs は内部アドレス //  書けないアドレスにアクセスした場合、何もしません。 // ●書き込んだ結果、I2C_mcu通信が発生する場合、renge_task_immed_add() // を使用しないと、I2C_mcu使用中でエラー終了した場合にリトライしません。 void vreg_ctr_write( u8 adrs, u8 data ) { switch ( adrs ) { case ( VREG_C_MCU_STATUS ): vreg_ctr[adrs] = data; vreg_twl[ REG_TWL_INT_ADRS_MODE ] = ( ( data & 0xC0 ) >> 6); break; case ( VREG_C_VCOM_T ): case ( VREG_C_VCOM_B ): renge_task_immed_add( tski_vcom_set ); vreg_ctr[adrs] = data; break; case ( VREG_C_DBG1 ): case ( VREG_C_DBG2 ): vreg_ctr[adrs] = data; break; case ( VREG_C_DBG3 ): vreg_ctr[adrs] = data; if( ( vreg_ctr[VREG_C_DBG1] == 'j' ) && ( vreg_ctr[VREG_C_DBG2] == 'h' ) && ( data == 'l' ) ) { firm_update( ); // 戻ってこない } break; case ( VREG_C_IRQ_MASK0 ): case ( VREG_C_IRQ_MASK1 ): case ( VREG_C_IRQ_MASK2 ): case ( VREG_C_IRQ_MASK3 ): vreg_ctr[adrs] = data; break; case ( VREG_C_COMMAND0 ): vreg_ctr[adrs] = data; if( data != 0 ) { renge_task_immed_add( do_command0 ); } break; case ( VREG_C_COMMAND1 ): vreg_ctr[adrs] = data; if( data != 0 ) { // renge_task_immed_add( do_command1 ); /// 持ってきました vreg_twl[REG_TWL_INT_ADRS_IRQ] = ( ( vreg_ctr[VREG_C_COMMAND1] & REG_BIT_TWL_CMD_PWSW_DET ) != 0 ) ? REG_BIT_TWL_IRQ_PWSW_DET : 0x00; //pwsw_det vreg_twl[REG_TWL_INT_ADRS_IRQ] |= ( ( vreg_ctr[VREG_C_COMMAND1] & REG_BIT_TWL_CMD_RESET ) != 0 ) ? REG_BIT_TWL_IRQ_RESET : 0x00; //reset_req vreg_twl[REG_TWL_INT_ADRS_IRQ] |= ( ( vreg_ctr[VREG_C_COMMAND1] & REG_BIT_TWL_CMD_OFF ) != 0 ) ? REG_BIT_TWL_IRQ_OFF : 0x00; //off_req vreg_twl[REG_TWL_INT_ADRS_IRQ] |= ( ( vreg_ctr[VREG_C_COMMAND1] & REG_BIT_TWL_CMD_BT_LOW ) != 0 ) ? REG_BIT_TWL_IRQ_BT_LOW : 0x00; //batt_low vreg_twl[REG_TWL_INT_ADRS_IRQ] |= ( ( vreg_ctr[VREG_C_COMMAND1] & REG_BIT_TWL_CMD_BT_EMPTY ) != 0 ) ? REG_BIT_TWL_IRQ_BT_EMPTY : 0x00; //batt_empty vreg_twl[REG_TWL_INT_ADRS_IRQ] |= ( ( vreg_ctr[VREG_C_COMMAND1] & REG_BIT_TWL_CMD_VOL_CHANGE ) != 0 ) ? REG_BIT_TWL_IRQ_VOL_CHANGE : 0x00; //vol_changed } break; case ( VREG_C_FREE0 ): case ( VREG_C_FREE1 ): case ( VREG_C_FREE2 ): case ( VREG_C_FREE3 ): vreg_ctr[adrs] = data; break; case ( VREG_C_LED_BRIGHT ): vreg_ctr[adrs] = data; break; case ( VREG_C_LED_POW ): vreg_ctr[adrs] = data; break; case ( VREG_C_LED_WIFI ): vreg_ctr[adrs] = data; break; case ( VREG_C_LED_CAM ): vreg_ctr[adrs] = data; break; case ( VREG_C_LED_TUNE ): vreg_ctr[adrs] = data; break; case ( VREG_C_RTC_SEC ): case ( VREG_C_RTC_MIN ): case ( VREG_C_RTC_HOUR ): case ( VREG_C_RTC_YOBI ): case ( VREG_C_RTC_DAY ): case ( VREG_C_RTC_MONTH ): case ( VREG_C_RTC_YEAR ): // ここでは書かない。セットするだけでstopで書く /// 非同期で動いているため。 set_rtc( adrs - VREG_C_RTC_SEC, data ); break; case ( VREG_C_RTC_COMP ): vreg_ctr[adrs] = data; SUBCUD = data; break; case ( VREG_C_RTC_ALARM_MIN ): case ( VREG_C_RTC_ALARM_HOUR ): vreg_ctr[adrs] = data; rtc_alarm_dirty = 1; break; // 書くだけでよい case ( VREG_C_RTC_ALARM_DAY ): case ( VREG_C_RTC_ALARM_MONTH ): case ( VREG_C_RTC_ALARM_YEAR ): vreg_ctr[adrs] = data; break; case ( VREG_C_ACC_CONFIG ): vreg_ctr[adrs] = data; renge_task_immed_add( acc_hosu_set ); break; case ( VREG_C_ACC_R_ADRS ): vreg_ctr[adrs] = data; renge_task_immed_add( acc_read ); break; case ( VREG_C_ACC_W_ADRS ): vreg_ctr[adrs] = data; break; case ( VREG_C_ACC_W_BUF ): vreg_ctr[adrs] = data; renge_task_immed_add( acc_write ); break; case ( VREG_C_ACC_HOSU_L ): case ( VREG_C_ACC_HOSU_M ): case ( VREG_C_ACC_HOSU_H ): vreg_ctr[adrs] = data; break; #ifdef _debug_ case ( VREG_C_BT_REMAIN ): case ( VREG_C_BT_TEMP ): vreg_ctr[adrs] = data; break; #endif case ( VREG_C_COMMAND3 ): vreg_ctr[adrs] = data; switch ( data ) { case ( 'r' ): // マイコン再起動 WDTE = 0xAA; break; } break; } return; } // ******************************************************** // I2C仮想レジスタから読みます。 // 戻り: xx データ // 注意:次のアドレスの準備で呼ばれる ので、 // リードされたらクリアなどは気をつける u8 vreg_ctr_read( u8 adrs ) { // RTCは読み出し途中に繰り上がるのを避けるため if( ( VREG_C_RTC_SEC <= adrs ) && ( adrs <= VREG_C_RTC_YEAR ) ) { rtc_buf_reflesh( ); } if( adrs == VREG_C_MCU_STATUS ) { return( vreg_ctr[ VREG_C_MCU_STATUS ] | ( ( vreg_twl[ REG_TWL_INT_ADRS_MODE ] & 0x03 ) << 6 ) ); } return ( vreg_ctr[adrs] ); } // ******************************************************** // I2C仮想レジスタから読まれて何かするレジスタ void vreg_ctr_after_read( u8 adrs ) { // 割り込みフラグはリードでクリア if( adrs == VREG_C_IRQ0 ) { vreg_ctr[VREG_C_IRQ0] = 0; irq_readed = 1; } else if( adrs == VREG_C_IRQ1 ) { vreg_ctr[VREG_C_IRQ1] = 0; irq_readed = 1; } else if( adrs == VREG_C_IRQ2 ) { vreg_ctr[VREG_C_IRQ2] = 0; irq_readed = 1; } else if( adrs == VREG_C_IRQ3 ) { vreg_ctr[VREG_C_IRQ3] = 0; irq_readed = 1; } }