/* ======================================================== その他雑多なタスク タスクを分けた方が見やすくなる気がするが、リソースの問題で分けなかった物 $Id: task_misc.c 418 2011-09-22 01:35:37Z n2232 $ ======================================================== */ #ifndef _WIN32 #pragma SFR #pragma NOP #pragma HALT #pragma STOP #endif #include "incs.h" #include "renge\renge.h" #include "pm.h" #include "accero.h" #include "adc.h" #include "i2c_mcu.h" #include "led.h" #include "vreg_twl.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 // ======================================================== extern void f(); // スタックの最後を得る // ======================================================== bit twl_ver_read; // twl home menuがverを読んだら互換カーネルに割り込みを入れるため bit going_to_sleep; // SoCから、sleepに入る通知をもらう。slp_i のH期間が0になると // スリープから復帰できなくなるのを防ぐため // 自動テスト用 bit reserve_pedo_increnent; // ======================================================== static void update_LED_3D(); static void check_twl_vol_irq(); /********************************************//** 単品でタスクにしない雑多な処理 - 加速度センサ割り込みの取りこぼし確認(念の為) - TWL PM互換レジスタへの書き込みがあれば読みに行く - 互換カーネルにTWLランチャーの起動を通知 - TWLの音量変化割り込みをチェック - 3Dランプの更新 - (HAL) 歩数計、一歩増やす - (デバッグ) SEL押し続けるとWDTリセットを発生させる ***********************************************/ void tsk_misc( ) { // 割り込みの取りこぼし? if( ACC_VALID && ( ( vreg_ctr[ VREG_C_STATUS_1 ] & REG_BIT_ACCERO_ERR ) == 0 )) { if( renge_task_immed_add( tski_cbk_accero ) == ERR_SUCCESS ){ // dbg_nop(); } } if( system_status.pwr_state == ON ) { /* ======================================================== PM互換レジスタへの書き込み ポーリングで対応 ======================================================== */ if( !PM_IRQ_n ) { renge_task_immed_add( tski_ntr_pmic_comm ); // dbg_nop(); } /* ======================================================== TWLランチャーが起動したことをCTRが知りたいらしい ======================================================== */ if( twl_ver_read ) { twl_ver_read = false; set_irq( VREG_C_IRQ2, REG_BIT_TWL_VER_READ ); } // TWL の音量変化割り込みチェック // check_twl_vol_irq(); } // 3D ランプ更新 // update_LED_3D(); #ifdef _ENABLE_HAL_ // デバッグHAL 歩数を一歩増やす // if( reserve_pedo_increnent ) { reserve_pedo_increnent = 0; hosu_increment_if_necessary(); } #endif #ifdef _ENABLE_PRESS_SEL_TO_WDT_ if(( system_status.pwr_state == ON ) || ( system_status.pwr_state == SLEEP )) { static u16 timer; if( !SW_SEL_n ) { timer += 1; if( timer == 2000 ) { DI(); timer = 0; while(1) { NOP(); // そのうちWDTが発生する } } } } #endif //. スタックテスト // f(); } /********************************************//** TWLがVolを書くのと、スライダの操作がバッティングすると 不整合が起こる事があり、それを防ぐ TWLでは通常時、押しボタンは8段階だった。それに合わせて割り込みを入れる。 ***********************************************/ void check_twl_vol_irq() { static u8 vol_level_twl_sent; static u8 mabiki; if( !is_TWL ) { return; // おしまい } if( mabiki != 0 ) { mabiki--; return; // おしまい } mabiki = 9; // 1フレームは開ける if( vol_level_twl != vol_level_twl_sent ) { vol_level_twl_sent = vol_level_twl; set_irq( VREG_C_IRQ2, REG_BIT_SLIDE_VOL_ACROSS_TWL_BOUNDARY ); } } /********************************************//** 3Dランプ更新 ***********************************************/ void update_LED_3D() { if( system_status.pwr_state != ON ) { LED_duty_3d = 0; return; // おしまい // } if( vreg_ctr[VREG_C_LED_3D] == LED_3D_ILM_OFF ) { if( LED_duty_3d != 0 ) { LED_duty_3d --; } } else { if( LED_duty_3d != vreg_ctr[VREG_C_LED_BRIGHT] ) { if( LED_duty_3d < vreg_ctr[VREG_C_LED_BRIGHT] ) { LED_duty_3d ++; } else { LED_duty_3d --; } } } } /********************************************//** COMMANDレジスタへの書き込み 0なら呼ばれません。ケア不要 - sleep 通知(受) - リセット系コマンド ***********************************************/ task_status_immed tski_do_command0( ) { u8 temp_command; // command0 本体電源など DI_wt_chk(); temp_command = vreg_ctr[VREG_C_COMMAND0]; vreg_ctr[VREG_C_COMMAND0] = 0; EI(); // SLPO(SoC->mcu) が非同期のため、パルス幅がゼロになってしまい、mcu が SoCの一瞬の // スリープを検出出来ず、SLPIをトグル出来ない事がある。あらかじめ通知してもらい、 // タイムアウト処理を行う。 if( temp_command & REG_BIT_GOING_TO_SLEEP ) { going_to_sleep = true; } // リセット系のコマンド // if( ( temp_command & ( REG_BIT_OFF_REQ | REG_BIT_RESET1_REQ | REG_BIT_FCRAM_RESET_REQ | REG_BIT_RESET2_REQ )) != 0x00 ) { if( temp_command & REG_BIT_OFF_REQ ) { system_status.pwr_state = OFF_TRIG; } else { if( temp_command & REG_BIT_RESET1_REQ ) { PM_reset_ast( ); RESET2_ast; FCRAM_RST_ast; } if( temp_command & REG_BIT_RESET2_REQ ) { RESET2_ast; if( vreg_twl[ REG_TWL_INT_ADRS_MODE ] == 0 ) { FCRAM_RST_ast; // twlはntrモードで動作してる } // TWLモードからDSモードへの切り替え中にリセットすると // IRQが読まれない場合があるのでTWLレジスタを初期化する vreg_twl_init(); } if( temp_command & REG_BIT_FCRAM_RESET_REQ ) { FCRAM_RST_ast; } wait_ms( 5 ); // 時間稼ぎ FCRAM_RST_neg; PM_reset_neg(); RESET2_neg; // CODEC 不定レジスタ初期化 // codec_reg_init(); } } /* スリープ要求直後に電源OFF・リセットコマンドは来まい if( vreg_ctr[VREG_C_COMMAND0] != 0 ) { return ( TSKI_CONTINUE ); } */ return ( TSKI_FINISHED ); } /* デバッグ・自動テスト用 ============================== */ u16 _dbg_rcomp; extern u8 raw_adc_temperature; extern u8 iic_burst_state; extern bit temp_zone_charge_disable; extern bit bt_authorized; #define KOUMOKU 19 static u8 infos_bits[2]; static u8 infos_temp[5]; static const u8 *infos_table[ KOUMOKU ] = { &infos_temp[0], /* 0 */ &pmic_version, (u8*)&battery_manufacturer, &mgic_version[0], &mgic_version[1], &infos_temp[1], /* 5 */ &raw_adc_temperature, &infos_temp[2], &infos_temp[3], (u8*)&system_status.family, /* 9 */ &infos_bits[0], /* 10 */ (u8*)&LED_duty_pow_blu, (u8*)&LED_duty_3d, (u8*)&LED_duty_notify_red, (u8*)&LED_duty_notify_grn, (u8*)&LED_duty_notify_blu, /* 15 */ &infos_bits[1], (u8*)&LED_duty_WiFi, &infos_temp[4] /* 18 */ /* 項目足すときは KOUMOKU に注意 */ }; /********************************************//**  デバッグ用にステータスを返す。(拡張ステータス 0x7F)  返値はデータそのもの 出てくる順場は、 - 1) プラットフォーム - 2) PMIC バージョン - 3) 電池メーカー - 4) ガスゲージバージョン - 5) 〃 - 6) ( rcomp & 0xFF ) - 7) raw_adc_temperature - 8) ( !temp_zone_charge_disable | ( bt_authorized << 1 ) ) - 9) お知らせLEDはフルカラー? - 10) system_status.family ***********************************************/ u8 extinfo_read(void) { u8 ret = 0xFF; /* * tempは計算処理が必要なデータ。メモリに余裕がないので計算が必要な * 変数は、要/不要に関わらず計算するポリシー */ if( iic_burst_state < KOUMOKU ) { infos_temp[0] = system_status.captureBox? MODEL_CAPTURE_BOX : ( system_status.is_dev? MODEL_ISBAKO: (u8)system_status.model ); infos_temp[1] = (u8)( _dbg_rcomp & 0xFF ); infos_temp[2] = ( !temp_zone_charge_disable | ( bt_authorized << 1 ) ); infos_temp[3] = 1; /* 仕様変更により1固定になった */ infos_temp[4] = 0 // | ( PM_EXTDC_n ? REG_BIT_HAL0_PM_EXTDC_n : 0 ) // status0にある | ( BT_IN_CHG_n ? REG_BIT_HAL0_BT_IN_CHG_n : 0 ) | ( BT_CHG_Ena_n ? REG_BIT_HAL0_RSV_5 : 0 ) // 空きビット使用,out pin | 0 // WL_TX 使えない // | ( SHELL_OPEN ? REG_BIT_HAL0_SHELL_OPEN : 0 ) // status0にある | ( SW_WIFI_n ? REG_BIT_HAL0_SW_WIFI_n : 0 ) | ( SW_HOME_n ? REG_BIT_HAL0_SW_HOME_n : 0 ) | ( SW_POW_n ? REG_BIT_HAL0_SW_POW_n : 0 ); infos_bits[0] = (u8)LED_pow_red; infos_bits[1] = (u8)LED_CAM; ret = *infos_table[iic_burst_state]; #if 0 // debug // /// システムに機種識別で嘘をつく if( iic_burst_state == 9 ) { ret = (u8)FAMILY_FLOWER; } #endif iic_burst_state ++; } return ret; } #ifdef i2c_timeout_test /********************************************//** (デバッグ用)I2C_mcu にプロトコル違反(波形崩れ)が検出されたら全LEDを点灯して通知する ***********************************************/ void i2c_mcu_error_monitor() { LED_duty_pow_blu = 0xff; LED_duty_3d = 0xff; LED_duty_notify_red = 0xff; LED_duty_notify_grn = 0xff; LED_duty_notify_blu = 0xff; LED_pow_red = 1; LED_CAM = 1; } #endif