#pragma SFR #pragma NOP #pragma HALT #pragma STOP #include "incs.h" #include "renge.h" #include "pm.h" #include "accero.h" #include "adc.h" #include "i2c_mcu.h" #include "led.h" #ifdef _MCU_BSR_ #define ACKD ACKD1 #define ACKE ACKE1 #define COI COI1 #define IICAEN IICA1EN #define IICRSV IICRSV1 #define IICA IICA1 #define IICAIF IICAIF1 #define IICAMK IICAMK1 #define IICAPR0 IICAPR11 #define IICAPR1 IICAPR01 #define IICCTL0 IICCTL10 #define IICE IICE1 #define IICF IICF1 #define IICS IICS1 #define IICWH IICWH1 #define IICWL IICWL1 #define LREL LREL1 #define SPD SPD1 #define SPIE SPIE1 #define STCEN STCEN1 #define STD STD1 #define SVA SVA1 #define WREL WREL1 #define WTIM WTIM1 #define TRC TRC1 #define SMC SMC1 #define DFC DFC1 #endif // ======================================================== bit twl_ver_read; // ======================================================== #define INTERVAL_TSK_MISC_STAT 4 /* ======================================================== ステータスレジスタなど ======================================================== */ void tsk_misc( ) { /* static u8 interval_task_misc = 0; if( interval_task_misc_stat != 0 ) { interval_task_misc_stat -= 1; return; } else { interval_task_misc_stat = ( INTERVAL_TSK_MISC_STAT / SYS_INTERVAL_TICK ); } */ //#ifdef _MCU_KE3_ // KE3では必須です。 /* ======================================================== 加速度センサ割り込みピンがオリジナルマイコンには無いので ポーリングする。 歩数計用 BSRマイコンはaccero.cで割り込みルーチンからタスク登録します。 ======================================================== */ // 割り込みの取りこぼし? if( ( vreg_ctr[VREG_C_ACC_CONFIG] & 0x03 ) != 0x00 ) { if( ACC_VALID == 1 ) { if( renge_task_immed_add( tsk_cbk_accero ) == ERR_SUCCESS ){ NOP(); } } } //#endif if( system_status.pwr_state == ON ) { /* ======================================================== PM互換レジスタへの書き込み ポーリングしかしてないけど... todo 割り込みも? ======================================================== */ if( !PM_IRQ_n ){ renge_task_immed_add( ntr_pmic_comm ); NOP(); } /* ======================================================== TWLランチャーが起動したことをCTRが知りたいらしい ======================================================== */ if( twl_ver_read ) { twl_ver_read = 0; set_irq( VREG_C_IRQ2, REG_BIT_TWL_VER_READ ); } } // TUNE_LED /////////////////////////////////// { // これはold版もおなじポートを使ってます。 if( vreg_ctr[VREG_C_LED_TUNE] == LED_TUNE_ILM_OFF ) { if( LED_duty_3d != 0 ) { LED_duty_3d -= 1; } } else { if( LED_duty_3d != vreg_ctr[VREG_C_LED_BRIGHT] ) { if( LED_duty_3d < vreg_ctr[VREG_C_LED_BRIGHT] ) { LED_duty_3d += 1; } else { LED_duty_3d -= 1; } } } } } /* ======================================================== 逐一起動タスク ======================================================== */ /* ======================================================== COMMANDレジスタへの書き込み   0なら呼ばれません。ケア不要 ======================================================== */ task_status_immed do_command0( ) { // command0 本体電源など if( ( vreg_ctr[VREG_C_COMMAND0] & ( REG_BIT_OFF_REQ | REG_BIT_RESET1_REQ | REG_BIT_FCRAM_RESET_REQ | REG_BIT_RESET2_REQ )) != 0x00 ) { 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 ) { PM_reset_ast( ); RESET2_ast; FCRAM_RST_ast; } if( vreg_ctr[VREG_C_COMMAND0] & REG_BIT_FCRAM_RESET_REQ ) { FCRAM_RST_ast; } else if( vreg_ctr[VREG_C_COMMAND0] & REG_BIT_RESET2_REQ ) { RESET2_ast; } wait_ms( 5 ); FCRAM_RST_neg; PM_reset_neg(); RESET2_neg; // 起動時以外はリセット不要 /* // CODEC 不定レジスタ初期化 wait_ms( 100 ); { u8 codec_reg_init[3] = { 0,0,0 }; iic_mcu_write( IIC_SLA_CODEC, CODEC_REG_PM, 3, codec_reg_init ); } */ } } vreg_ctr[VREG_C_COMMAND0] = 0; return ( ERR_FINISED ); } /* ========================================================  互換向け、TWLアプリへの割り込み 仮想レジスタの書き込み時に行います。 ======================================================== */ // task_status_immed do_command1( ) u16 _dbg_rcomp; extern u8 raw_adc_temperature; extern u8 iic_burst_state; /* ========================================================  デバッグ用にいろいろ読んできます。  返値はデータそのもの ======================================================== */ task_status_immed tski_mcu_info_read() { if( SPD ) { goto end; } if( STD ) { SPIE = 1; } if( IICAIF == 0 ) { return( ERR_CONTINUE ); } else { IICAIF = 0; } switch( iic_burst_state++ ){ case( 0 ): // 本体種類識別 IICA = (u8)system_status.model; break; case( 1 ): // IICがなにかエラーでも知らない。00かFFならエラーの可能性が高い IICA = iic_mcu_read_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_VER ); break; case( 2 ): // 電池メーカーの識別 IICA = battery_manufacturer; break; case( 3 ): // ガスゲージバージョン IICA = iic_mcu_read_a_byte( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_VERSION ); break; case( 4 ): // LSB IICA = iic_mcu_read_a_byte( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_VERSION + 1 ); break; case( 5 ): IICA = (u8)(( _dbg_rcomp >> 8 ) & 0xFF ); break; case( 6 ): IICA = (u8)( _dbg_rcomp & 0xFF ); break; case( 7 ): IICA = raw_adc_temperature; break; default: goto end; } return( ERR_CONTINUE ); end: LREL = 1; SPIE = 0; IICAMK = 0; iic_burst_state = 0; return( ERR_FINISED ); }