#pragma SFR #pragma NOP #pragma HALT #pragma STOP #include "incs.h" #include "renge.h" #include "pm.h" extern u8 boot_ura; /* ======================================================== WiFi 関係 ・WL_TX,RX ・LED_wifi ・32kHz ======================================================== */ task_interval tsk_wifi(){ return 10; } /* ======================================================== 他のところでケアされていない部分 ======================================================== */ task_interval tsk_misc_stat(){ static u8 state_old; // ステータス変化検出→割り込み の為 SHELL_CLOSE_P = 1; set_bit( EXT_OPT_DET, vreg_ctr[ VREG_C_STATUS0 ], REG_BIT_EXT_OPT_LOCK ); set_bit( SHELL_CLOSE, vreg_ctr[ VREG_C_STATUS0 ], REG_BIT_SHELL_CLOSE ); SHELL_CLOSE_P = 0; // ステータスレジスタ関係 → 割り込み // if(( vreg_ctr[ VREG_C_STATUS0 ] ^ state_old ) != 0 ){ vreg_ctr[ VREG_C_IRQ1 ] |= REG_BIT_STAT_CHANGE; switch( system_status.pwr_state ){ case ON_TRIG: break; case ON: if( ( vreg_ctr[ VREG_C_IRQ_MASK1 ] & REG_BIT_STAT_CHANGE ) != 0 ){ IRQ0_ast; } break; case SLEEP_TRIG: case SLEEP: if( (( state_old & REG_BIT_SHELL_CLOSE ) != 0 ) && ( !SHELL_CLOSE ) ){ // 蓋開けた のみ通知 if( ( vreg_ctr[ VREG_C_IRQ_MASK1 ] & REG_BIT_STAT_CHANGE ) != 0 ){ IRQ0_ast; } } break; case OFF_TRIG: case OFF: default: break; } } state_old = vreg_ctr[ VREG_C_STATUS0 ]; return( 100 ); } /* ======================================================== ======================================================== */ task_interval tsk_debug(){ u8 temp; static u8 count = 0; if( count == 0 ){ // LED_WIFI_2 ^= 1; } /* temp = iic_mcu_read_a_byte( IIC_SLA_8LEDS, IIC_8LEDS_REG_DO ); count += 1; iic_mcu_write_a_byte( IIC_SLA_8LEDS, IIC_8LEDS_REG_DO, count ); iic_mcu_write_a_byte( IIC_SLA_DBG_MONITOR, 3, count ); return 0; */ return 255; } task_interval tsk_debug2(){ if(( system_status.pwr_state != OFF ) && ( system_status.pwr_state != ON_TRIG )){ // iic_mcu_write_a_byte( IIC_SLA_DBG_MONITOR, 3, vreg_ctr[ VREG_C_IRQ0 ] ); // iic_mcu_write_a_byte( IIC_SLA_DBG_MONITOR, 2, vreg_ctr[ VREG_C_IRQ1 ] ); // iic_mcu_write_a_byte( IIC_SLA_DBG_MONITOR, 1, boot_ura ); // iic_mcu_write_a_byte( IIC_SLA_DBG_MONITOR, 1, vreg_ctr[ VREG_C_SND_VOL ] ); // iic_mcu_write_a_byte( IIC_SLA_DBG_MONITOR, 1, vreg_ctr[ VREG_TUNE ] ); // iic_mcu_write_a_byte( IIC_SLA_DBG_MONITOR, 0, vreg_ctr[ VREG_C_ACC_ZH ] ); iic_mcu_write_a_byte( IIC_SLA_DBG_MONITOR, 3, vreg_ctr[ VREG_C_TUNE ] ); iic_mcu_write_a_byte( IIC_SLA_DBG_MONITOR, 2, vreg_ctr[ VREG_C_SND_VOL ] ); iic_mcu_write_a_byte( IIC_SLA_DBG_MONITOR, 1, vreg_ctr[ VREG_C_STATUS0 ] ); iic_mcu_write_a_byte( IIC_SLA_DBG_MONITOR, 0, vreg_ctr[ VREG_C_ACC_ZH ] ); } return( 20/2 ); } #if 0 /* ======================================================== タスクひな形 ======================================================== */ task_interval tsk_hina(){ switch( system_status.pwr_state ){ case OFF: case ON_TRIG: case ON: case SLEEP_TRIG: case SLEEP: case OFF_TRIG: default: } return( 次の起動までのシステムtick数 ); // 毎 tic 呼ばれることになります } // ポインタで何かもらうのは危険な気がしてきた /* このように使う renge_task_immed_add( タスク関数へのポインタ ); */ task_status_immed tsk_imm_hina( u8* arg ){ return( ERR_FINISED ); // ERR_FINISED タスクを削除 // ERR_CONTINUE 次になんか割り込みなり、ユーザー操作なり、システムチックが // 来たときに再度実行 } #endif /* ======================================================== 加速度センサ割り込みピンがオリジナルマイコンには無いので ポーリングする ======================================================== */ task_interval tsk_soft_int(){ #ifdef _MCU_KE3_ static u8 pin; // Hエッジ検出 // pin = ( pin << 1 ) + ( ACC_VALID? 1: 0 ); // if( ( pin & 0x03 ) == 0x01 ){ if( ACC_VALID ){ renge_task_immed_add( tsk_cbk_accero ); } return( 0 ); #else // 本物のマイコンなら、割り込みでタスクを登録します return( 248 ); #endif } /* ======================================================== 逐一起動タスク ======================================================== */ /* ======================================================== COMMANDレジスタへの書き込み   0なら呼ばれません。ケア不要 ======================================================== */ task_status_immed do_command0(){ if( vreg_ctr[ VREG_C_COMMAND0 ] & REG_BIT_OFF_REQ ){ system_status.pwr_state = OFF_TRIG; }else{ if( vreg_ctr[ VREG_C_COMMAND0 ] & REG_BIT_RESET1_REQ ){ #ifdef _PMIC_TWL_ RESETs_ast; #else PM_reset_ast(); RESET2_ast; #endif FCRAM_RST_ast; } if( vreg_ctr[ VREG_C_COMMAND0 ] & REG_BIT_RESET2_REQ ){ RESET2_ast; } if( vreg_ctr[ VREG_C_COMMAND0 ] & REG_BIT_FCRAM_RESET_REQ ){ FCRAM_RST_ast; } wait_ms( 5 ); #ifdef _PMIC_TWL_ RESETs_neg; #else PM_reset_neg(); RESET2_neg; #endif FCRAM_RST_neg; } if( vreg_ctr[ VREG_C_COMMAND0 ] & REG_BIT_BL_ON ){ renge_task_immed_add( tski_PM_BL_on ); }else if( vreg_ctr[ VREG_C_COMMAND0 ] & REG_BIT_BL_OFF ){ renge_task_immed_add( tski_PM_BL_off ); } if( vreg_ctr[ VREG_C_COMMAND0 ] & REG_BIT_LCD_ON ){ renge_task_immed_add( tski_PM_LCD_on ); }else if( vreg_ctr[ VREG_C_COMMAND0 ] & REG_BIT_LCD_OFF ){ renge_task_immed_add( tski_PM_LCD_off ); } vreg_ctr[ VREG_C_COMMAND0 ] = 0; return( ERR_FINISED ); } /* ========================================================  互換向け、TWLアプリへの割り込み   0なら呼ばれません。ケア不要 ======================================================== */ task_status_immed do_command1(){ // 呼ばれません while(1){ NOP(); // 誤り検出 } vreg_twl[ REG_TWL_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_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_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_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_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_ADRS_IRQ ] |= (( vreg_ctr[ VREG_C_COMMAND1 ] & REG_BIT_TWL_CMD_VOL_CHANGE ) != 0 )? REG_BIT_TWL_IRQ_VOL_CHANGE: 0x00; //vol_changed return( ERR_FINISED ); } /* ======================================================== CPUからのスリープ要求 ======================================================== */ __interrupt void intp0_slp(){ // SLP if( SLP_REQ ){ system_status.pwr_state = SLEEP_TRIG; }else{ system_status.pwr_state = ON_TRIG; if( PM_BL_on() == 0 ){ renge_task_interval_run_force = 1; iic_mcu_stop(); system_status.pwr_state = OFF_TRIG; } } renge_task_interval_run_force = 1; }