diff --git a/trunk/accero.c b/trunk/accero.c index 10f9c03..fd82a64 100644 --- a/trunk/accero.c +++ b/trunk/accero.c @@ -80,9 +80,9 @@ task_status_immed tsk_cbk_accero( ) != ERR_SUCCESS ) { // 加速度センサが異常になったので止める - vreg_ctr[VREG_C_ACC_CONFIG] &= ~( VREG_BITMASK_ACC_CONF_HOSU | VREG_BITMASK_ACC_CONF_ACQ ); -// vreg_ctr[ VREG_C_STATUS_1 ] |= REG_BIT_ACCERO_ERR; + vreg_ctr[ VREG_C_ACC_CONFIG ] &= ~( VREG_BITMASK_ACC_CONF_HOSU | VREG_BITMASK_ACC_CONF_ACQ ); acc_hosu_set(); + vreg_ctr[ VREG_C_STATUS_1 ] |= REG_BIT_ACCERO_ERR; return ( ERR_SUCCESS ); // タスクの削除は必要 } else @@ -152,9 +152,7 @@ task_status_immed acc_write( ) /*========================================================= - 自動歩数カウントモードにセット - todo 他のモードだったら止めたり、復帰させたり - 割り込みルーチンなどでカウント判定が必要 + 加速度センサの設定 ========================================================*/ task_status_immed acc_hosu_set( ) { diff --git a/trunk/adc.c b/trunk/adc.c index 7e8d83c..545882b 100644 --- a/trunk/adc.c +++ b/trunk/adc.c @@ -44,14 +44,14 @@ extern void nop8(); // max -15db const u8 slider_to_codec[64] = { - 127, 126, 125, 124, 123, 122, 121, 120, - 119, 118, 117, 116, 115, 114, 113, 112, - 111, 110, 109, 109, 108, 107, 106, 105, - 104, 103, 102, 101, 100, 99, 98, 97, - 96, 95, 94, 93, 92, 91, 90, 89, - 88, 87, 86, 85, 84, 83, 82, 81, - 81, 80, 79, 78, 77, 76, 75, 74, - 73, 72, 71, 70, 69, 68, 67, 66 + 127, 127, 127, 126, 125, 124, 123, 122, + 121, 120, 119, 118, 117, 116, 115, 114, + 113, 112, 111, 110, 109, 108, 107, 106, + 105, 104, 103, 102, 101, 100, 99, 98, + 97, 96, 95, 94, 93, 92, 91, 90, + 89, 88, 87, 86, 85, 84, 83, 82, + 81, 80, 79, 78, 77, 76, 75, 74, + 73, 72, 71, 70, 69, 68, 67, 66 }; @@ -139,15 +139,15 @@ void tsk_adc( ) { vol_old = adc_raw_vol; // レジスタ更新 - vreg_ctr[ VREG_C_SND_VOL ] = ( adc_raw_vol / 4 ); // 64段 - vreg_twl[ REG_TWL_INT_ADRS_VOL ] = adc_raw_vol / ( 256 / 32 ); // ←adc値でよい + vreg_twl[ REG_TWL_INT_ADRS_VOL ] = vol_old / ( 256 / 32 ); // ←adc値でよい + vreg_ctr[ VREG_C_SND_VOL ] = ( vol_old / 4 ); // 64段 // codecに伝える - iic_mcu_write_a_byte( IIC_SLA_CODEC, CODEC_REG_VOL, slider_to_codec[ adc_raw_vol / 4 ] ); + iic_mcu_write_a_byte( IIC_SLA_CODEC, CODEC_REG_VOL, slider_to_codec[ vol_old / 4 ] ); #ifndef _MODEL_CTR_ - iic_mcu_write_a_byte( IIC_SLA_DCP, 0, slider_to_codec[ ( 255 - adc_raw_vol ) / 4 ] ); // todo + iic_mcu_write_a_byte( IIC_SLA_DCP, 0, slider_to_codec[ ( 255 - vol_old ) / 4 ] ); #endif -// set_irq( VREG_C_IRQ0, REG_BIT_VR_SNDVOL_CHANGE ); // 割り込み廃止 +// set_irq( VREG_C_IRQ0, REG_BIT_VR_SNDVOL_CHANGE ); // 割り込み廃止 force_update_vol = 200; } } @@ -178,7 +178,7 @@ void tsk_adc( ) ADCEN = 1; - ADM = 0b00011011; // セレクトモード、章圧、fCLK/6 ///ここから ↓ + ADM = 0b00001011; // セレクトモード、昇圧、fCLK/6 ///ここから ↓ ADPC = 0x06; // ADCポートのセレクト ADS = ADC_SEL_TUNE; @@ -225,6 +225,7 @@ static u8 getmean3( u8 * hist ) /* ========================================================  自前で次のチャンネル   一通り終わったら止める + // todo 値が飛ぶことがある? ======================================================== */ __interrupt void int_adc( ) { @@ -306,8 +307,7 @@ u8 get_adc( u8 ch ) ADIF = 0; ADCEN = 1; - ADCS = 0; - ADM = 0b00100011; // セレクトモード、昇圧、fCLK/6 ///ここから↓ + ADM = 0b00001011; // セレクトモード、昇圧、fCLK/6 ///ここから↓ ADPC = 0x06; // ADCポートのセレクト ADS = ch; diff --git a/trunk/bsr_system.h b/trunk/bsr_system.h index 9dedb1d..59944a3 100644 --- a/trunk/bsr_system.h +++ b/trunk/bsr_system.h @@ -19,6 +19,7 @@ enum poweron_reason_ NONE = 0, PWSW, RTC_ALARM, + EXT_POWER }; diff --git a/trunk/config.h b/trunk/config.h index 32509e0..95ad683 100644 --- a/trunk/config.h +++ b/trunk/config.h @@ -28,9 +28,9 @@ // 特殊仕様 // //#define _SW_HOME_ENABLE_ -//#define _PARRADIUM_ 廃止 -//#define _PM_BUG_ // バグ持ち CTR PMIC 廃止 - +//#define _PARRADIUM_ 廃止 +//#define _PM_BUG_ // バグ持ち CTR PMIC 廃止 +#define _FOR_E3_ // ---------------------------------- // #ifdef _MODEL_TEG2_ diff --git a/trunk/i2c_mcu.c b/trunk/i2c_mcu.c index 10f3dd1..414ec1f 100644 --- a/trunk/i2c_mcu.c +++ b/trunk/i2c_mcu.c @@ -571,7 +571,9 @@ void iic_mcu_start( ) SPS0 = 0x0000; // シリアルユニットのクロック0。(8M/2)/1 SMR02 = bSMR0n_FIXEDBIT | bMD0n2; // 簡易I2Cに設定 #ifdef _OVERCLOCK_ - SDR02 = 12 << 9; // ボーレート設定 (8M/2)/1/(x+1)/2 +// todo +// SDR02 = 12 << 9; // ボーレート設定 8M/1/(x+1)/2 + SDR02 = 13 << 9; // ボーレート設定 (8M/2)/1/(x+1)/2 #else SDR02 = 5 << 9; // ボーレート設定 (8M/2)/1/(x+1)/2 #endif diff --git a/trunk/led.c b/trunk/led.c index 54e1b75..4b28e51 100644 --- a/trunk/led.c +++ b/trunk/led.c @@ -79,18 +79,15 @@ uni_info_LED info_LED = { //調光可能LEDのワークというか -/* -typedef struct{ - u8 to; - sx16 delta; - ux16 now; -}st_LED_dim_status; -*/ st_LED_dim_status LED_dim_status_pow_B; st_LED_dim_status LED_dim_status_3D; st_LED_dim_status LED_dim_status_WiFi; +// 赤LEDの電池残量LEDの点滅パターン +uni_led_red_batt_empty led_red_batt_empty; + + // ======================================================== #define led_fade_to( now, goal ) now = fade_to( now, goal ) @@ -183,7 +180,8 @@ void LED_init( ) TOE0 = 0b0000000011101110; // TOxをタイマーモジュールが制御? TS0 = 0b0000000011101111; // 動作開始 - TDR00 = LED_BRIGHT_MAX - 1; // 10bit, 周期 +// TDR00 = LED_BRIGHT_MAX - 1; // 10bit, 周期 + TDR00 = LED_BRIGHT_MAX*5 - 1; // 10bit, 周期 if( system_status.reboot ) { @@ -283,11 +281,15 @@ void tsk_led_pow( ) static void led_pow_normal( ) { static u8 state; + static u8 red_blink_poi; + u8 temp; + if( vreg_ctr[VREG_C_BT_REMAIN] <= BATT_TH_EMPTY ) { - led_fade_to( LED_duty_pow_blu, 0 ); // 赤点滅 + led_fade_to( LED_duty_pow_blu, 0 ); +#if 0 state++; if( state < 127 ) { @@ -298,7 +300,33 @@ static void led_pow_normal( ) LED_pow_red = 1; } return; +#endif + led_fade_to( LED_duty_notify_grn, 0 ); + led_fade_to( LED_duty_notify_blu, 0 ); + state += 1; + if( state < 16 ) + { + return; + } + state = 0; + + if( ( led_red_batt_empty.bits & ( 1 << red_blink_poi )) != 1 ) + { + LED_pow_red = 1; + LED_duty_notify_red = 255; + } + else + { + LED_pow_red = 0; + LED_duty_notify_red = 0; + } + + red_blink_poi += 1; + if( red_blink_poi >= 32 ) + { + red_blink_poi = 0; + } } else if( vreg_ctr[VREG_C_BT_REMAIN] <= BATT_TH_LO ) { @@ -394,7 +422,7 @@ static void led_pow_hotaru( ) /* ======================================================== * 割り込みそのものは使いません * LED_Wifi 3 - todo 直書きの点滅間隔など + todo .old からのマージ ======================================================== */ void tsk_led_wifi( ) { @@ -487,6 +515,11 @@ void tsk_led_notify( ) static u8 frame; static st_LED_dim_status LED_dim_status_info_R, LED_dim_status_info_G, LED_dim_status_info_B; + if( vreg_ctr[VREG_C_BT_REMAIN] <= BATT_TH_EMPTY ) + { + // 電池切れが優先する + return; + } // 次のフレームに進める? if( time_to_next_frame == 0 ) @@ -522,6 +555,7 @@ void tsk_led_notify( ) led_fade_to2( LED_duty_notify_red, &LED_dim_status_info_R ); led_fade_to2( LED_duty_notify_grn, &LED_dim_status_info_G ); led_fade_to2( LED_duty_notify_blu, &LED_dim_status_info_B ); + } diff --git a/trunk/led.h b/trunk/led.h index 9b5a311..d470db9 100644 --- a/trunk/led.h +++ b/trunk/led.h @@ -71,10 +71,7 @@ enum LED_MODE_TUNE enum { WIFI_LED_OFF = 0, - WIFI_LED_ON, - WIFI_LED_TXAUTO, - WIFI_LED_PTN0, - WIFI_LED_PTN1 + WIFI_LED_ON }; @@ -124,6 +121,20 @@ typedef union{ extern uni_info_LED info_LED; + +typedef struct{ + u8 dats[4]; +}st_u8s4; + +typedef union{ + unsigned long bits; + st_u8s4 dats; +}uni_led_red_batt_empty; + + +extern uni_led_red_batt_empty led_red_batt_empty; + + /* お知らせLED */ diff --git a/trunk/pedo_alg_thre_det2.c b/trunk/pedo_alg_thre_det2.c index 365ad6e..7063071 100644 --- a/trunk/pedo_alg_thre_det2.c +++ b/trunk/pedo_alg_thre_det2.c @@ -218,6 +218,7 @@ static void hosu_increment() // 空白の時間を考慮する。1時間以上放置されたなど。 u16 now_hour; u8 now_year; + u8 now_min; // 時計を止める必要が有るので↓は一気に行って下さい DI(); @@ -227,6 +228,7 @@ static void hosu_increment() last_hour = HOUR; // 履歴読み出し時に使用。BCDのままでよい last_day = DAY; last_month = MONTH; + now_min = MIN; now_hour = get_long_hour(); // RWAIT = 0; ↑で行っています // EI(); 〃 @@ -259,13 +261,26 @@ static void hosu_increment() last_hour_fny = now_hour; // 実際にインクリメント - if( pool.vreg_c_ext.pedo_log[ p_record ] == HOSU_NODATA ) { - pool.vreg_c_ext.pedo_log[ p_record ] = 1; - } - else if( pool.vreg_c_ext.pedo_log[ p_record ] != HOSU_MAX ) - { - pool.vreg_c_ext.pedo_log[ p_record ] += 1; + u8 temp; + + temp = p_record; + if( now_min < vreg_ctr[ VREG_C_ACC_HOSU_ORIGIN ] ) + { + temp -= 1; + if( PEDOMETER_LOG_SIZE >= temp ) + { + temp = PEDOMETER_LOG_SIZE -1; + } + } + if( pool.vreg_c_ext.pedo_log[ temp ] == HOSU_NODATA ) + { + pool.vreg_c_ext.pedo_log[ temp ] = 1; + } + else if( pool.vreg_c_ext.pedo_log[ temp ] != HOSU_MAX ) + { + pool.vreg_c_ext.pedo_log[ temp ] += 1; + } } } } @@ -287,6 +302,10 @@ void fill_hosu_hist_hours( u16 hours ) do { p_record += 1; + if( PEDOMETER_LOG_SIZE >= p_record ) + { + p_record = 0; + } pool.vreg_c_ext.pedo_log[ p_record ] = 0; hours -= 1; } diff --git a/trunk/pm.c b/trunk/pm.c index 4d252a8..f766125 100644 --- a/trunk/pm.c +++ b/trunk/pm.c @@ -264,7 +264,10 @@ err PM_sys_pow_on( ) PM_VDD_normMode(); PM_VDD_on( ); - wait_ms( DELAY_PM_TW_PWUP ); +// wait_ms( DELAY_PM_TW_PWUP ); // gyro_csを挟むため + wait_ms( 10 ); + GYRO_CS_ENABLE(); + wait_ms( DELAY_PM_TW_PWUP - 10 ); PM_VDD50A_on( ); // 液晶電源ではなく、ledとかに使うものです @@ -288,14 +291,12 @@ err PM_sys_pow_on( ) FCRAM_RST_neg; RESET2_neg; -/* wait_ms( 100 ); { // CODEC 不定レジスタ初期化 u8 codec_reg_init[3] = { 0,0,0 }; iic_mcu_write( IIC_SLA_CODEC, CODEC_REG_PM, 3, codec_reg_init ); } -*/ #else // TWL PMIC @@ -330,12 +331,11 @@ err PM_sys_pow_on( ) FCRAM_RST_ast; return ( ERR_ERR ); } -/* + { // CODEC 不定レジスタ初期化 u8 codec_reg_init[3] = { 0,0,0 }; iic_mcu_write( IIC_SLA_CODEC, CODEC_REG_PM, 3, codec_reg_init ); } -*/ #endif return ( ERR_SUCCESS ); @@ -346,7 +346,6 @@ err PM_sys_pow_on( ) /* ======================================================== 電源OFFシーケンス - todo: 電源異常断の場合 ======================================================== */ err PM_sys_pow_off( ) { @@ -426,7 +425,7 @@ __interrupt void intp6_PM_irq( ) } - +#define _type1_ /* ======================================================== PMICからの割り込みを受けて、NTR PMIC互換レジスタからリード ======================================================== */ @@ -450,13 +449,19 @@ task_status_immed ntr_pmic_comm( ) { if( ( reg_shadow & REG_BIT_TWL_REQ_BL_U ) == 0 ) // 消えた { -// irq_work = REG_BIT_TWL_BL_U_OFF; +#ifdef _type1_ + irq_work = REG_BIT_TWL_BL_U_OFF; +#else set_irq( VREG_C_IRQ2, REG_BIT_TWL_BL_U_OFF ); +#endif } else { -// irq_work = REG_BIT_TWL_BL_U_ON; +#ifdef _type1_ + irq_work = REG_BIT_TWL_BL_U_ON; +#else set_irq( VREG_C_IRQ2, REG_BIT_TWL_BL_U_ON ); +#endif } } @@ -465,18 +470,26 @@ task_status_immed ntr_pmic_comm( ) { if( ( reg_shadow & REG_BIT_TWL_REQ_BL_L ) == 0 ) // 消えた { -// irq_work = REG_BIT_TWL_BL_L_OFF; +#ifdef _type1_ + irq_work |= REG_BIT_TWL_BL_L_OFF; +#else set_irq( VREG_C_IRQ2, REG_BIT_TWL_BL_L_OFF ); +#endif } else { -// irq_work = REG_BIT_TWL_BL_L_ON; +#ifdef _type1_ + irq_work |= REG_BIT_TWL_BL_L_ON; +#else set_irq( VREG_C_IRQ2, REG_BIT_TWL_BL_L_ON ); +#endif } } -#if 0 - irq_work &= ~VREG_C_IRQ_MASK2; + vreg_ctr[ VREG_C_STATUS_1 ] = ( vreg_ctr[ VREG_C_STATUS_1 ] & ~0x0C ) | ( reg_shadow & 0x0C ); // TWLバックライト情報のミラー + +#ifdef _type1_ + irq_work &= ~vreg_ctr[ VREG_C_IRQ_MASK2 ]; // set_irq 相当品 if( irq_work != 0 ) { @@ -620,6 +633,8 @@ void tsk_batt( ) } } +#if 0 + // todo // 充電 /////////////////////////// // 温度付きヒステリシス @@ -651,6 +666,16 @@ void tsk_batt( ) #endif } +#else + + // 充電 /////////////////////////// +# ifndef _MODEL_WM0_ +// CHG_ENABLEピンは /WL_RST に配線されているので + BT_CHG_ENABLE(); // 温度範囲OKで充電再開 +# endif + +#endif + // 充電 // // →割り込み。miscの中でよろしくやってくれている。 set_bit( !BT_CHG_n, vreg_ctr[VREG_C_STATUS], REG_BIT_BATT_CHARGE ); @@ -741,6 +766,7 @@ void BT_init( ) dat_16._u16 = swap_endian_16( 0x4A57 ); // unlock key if( iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_LOCK, 2, &dat_16 ) == ERR_SUCCESS ) { + vreg_ctr[ VREG_C_STATUS_1 ] &= ~REG_BIT_GASGAUGE_ERR; // 残量IC有り // if( battery_manufacturer < BT_VENDER_OPEN ) { @@ -896,6 +922,9 @@ task_status_immed BT_temp_update( ) newrcomp += rcomp; newrcomp = swap_endian_16( (u16)newrcomp ); + // todo + newrcomp = 0x9700; + DBG_P_n = 0; if( iic_mcu_write diff --git a/trunk/self_flash.c b/trunk/self_flash.c index 4b731f7..2cea8fa 100644 --- a/trunk/self_flash.c +++ b/trunk/self_flash.c @@ -174,7 +174,7 @@ void firm_update( ) } // 1ブロック書き込み完了。内部ベリファイを行う if( FSL_IVerify( target_block ) != FSL_OK ){ - // todo 再度消去→書き込み ベリファイを繰り返すだけじゃダメでした... + // 再度消去→書き込み ベリファイを繰り返すだけじゃダメでした... todo…? // リストア firm_duplicate( UPDATE_BLOCK_LAST +1, FIRM_TOP ); @@ -268,9 +268,7 @@ static void FSL_Open( void ) MK2H = FSL_MK2H_MASK; /* } */ #endif - // 何か前準備? - // todo DMAを止める - while( DST1 ){;} + while( DST1 ){;} // DMA停止 DEN1 = 0; MK0 = 0xFFFF; @@ -365,7 +363,7 @@ static err firm_duplicate( u8 block_src, // 1ブロック書き込み完了。内部電圧チェックを行う while( FSL_IVerify( target_block ) != FSL_OK ){ - // todo + // todo 失敗時? ; } } diff --git a/trunk/sw.c b/trunk/sw.c index 1e105b6..f63fe27 100644 --- a/trunk/sw.c +++ b/trunk/sw.c @@ -14,19 +14,24 @@ //========================================================= -#define INTERVAL_TSK_SW 16 -#define CLICK_THRESHOLD 1 -#define HOLD_THREASHOLD (u8)( 600 / INTERVAL_TSK_SW ) +#define INTERVAL_TSK_SW 8 +#define CLICK_THRESHOLD 2 +#ifdef _FOR_E3_ +#define HOLD_THREASHOLD (u8)( 800 / INTERVAL_TSK_SW ) +#else +#define HOLD_THREASHOLD (u8)( 2000 / INTERVAL_TSK_SW ) +#endif //========================================================= -u8 SW_pow_count, SW_home_count, SW_wifi_count; -bit SW_pow_mask, SW_home_mask, SW_wifi_mask; +u8 SW_pow_count; +bit SW_pow_mask; + +u8 SW_home_count, SW_wifi_count; bit SW_HOME_n; - //========================================================= // 押した時間を数える。押しっぱなしでも0に戻らない // maskが非0の時は、一度離すまで無視する @@ -46,6 +51,24 @@ bit SW_HOME_n; } +#define chk_clicked( button, count, irq_bit_name ) \ + if( !button ) \ + { \ + if( count <= CLICK_THRESHOLD ) \ + { \ + count += 1; \ + } \ + if( count == CLICK_THRESHOLD ) \ + { \ + set_irq( VREG_C_IRQ0, irq_bit_name ); \ + } \ + } \ + else \ + { \ + count = 0; \ + } + + /* ======================================================== スイッチの監視 @@ -53,23 +76,13 @@ bit SW_HOME_n; ======================================================== */ void tsk_sw( ) { - static u8 cnt_force_off = 0; + static u16 cnt_force_off = 0; static u8 task_interval = 0; switch ( system_status.pwr_state ) { - case ( OFF_TRIG ): - SW_pow_count = 0; - SW_wifi_count = 0; - SW_home_count = 0; - cnt_force_off = 0; - break; - case ( ON_TRIG ): - // 電源投入 - SW_pow_mask = 1; - SW_home_mask = 1; - SW_wifi_mask = 1; + cnt_force_off = 0; break; } @@ -82,7 +95,6 @@ void tsk_sw( ) task_interval = (u8)( INTERVAL_TSK_SW / SYS_INTERVAL_TICK ); } - switch ( system_status.pwr_state ) { case ( ON ): @@ -90,9 +102,10 @@ void tsk_sw( ) case ( BT_CHARGE ): case ( OFF ): // 電源スイッチの監視 // + count_sw_n( SW_POW_n, SW_pow_count, SW_pow_mask ); // ボタン押し時間のカウント if( SW_POW_n ) { - if( ( CLICK_THRESHOLD < SW_pow_count ) && ( SW_pow_count <= HOLD_THREASHOLD ) ) + if( SW_pow_count == CLICK_THRESHOLD ) { #ifdef _SW_HOME_ENABLE_ set_irq( VREG_C_IRQ0, REG_BIT_SW_POW_CLICK ); @@ -108,81 +121,45 @@ void tsk_sw( ) #else set_irq( VREG_C_IRQ0, REG_BIT_SW_HOME_HOLD ); #endif - } - else if( SW_pow_count == ( HOLD_THREASHOLD * 4 ) ) - {// 長押しによる強制OFF - vreg_ctr[ VREG_C_LED_POW ] = LED_POW_ILM_ONLY_RED; - system_status.pwr_state = OFF_TRIG; - renge_task_interval_run_force = 1; + cnt_force_off = 1; } - // 電源OFF割り込みを入れたが… - if( ( vreg_ctr[VREG_C_IRQ0] & REG_BIT_SW_POW_HOLD ) != 0 ) + if( cnt_force_off != 0 ) { - cnt_force_off += 1; - if( cnt_force_off >= 13 ) - { // …返事がない。強制的に切る。 +#ifdef _FOR_E3_ + if( ++cnt_force_off == ( 200 / INTERVAL_TSK_SW ) ) +#else + if( ++cnt_force_off == ( 4000 / INTERVAL_TSK_SW ) ) +#endif + { + // タイムアウトによる強制OFF + cnt_force_off = 0; vreg_ctr[ VREG_C_LED_POW ] = LED_POW_ILM_ONLY_RED; system_status.pwr_state = OFF_TRIG; renge_task_interval_run_force = 1; } } - else - { - cnt_force_off = 0; - } +#ifdef _SW_HOME_ENABLE_ // HOME スイッチ // switch( system_status.model ) { -#ifdef _MODEL_CTR_ +# ifdef _MODEL_CTR_ case( MODEL_JIKKI ): SW_HOME_n = SW_HOME_n_JIKKI; break; -#endif +# endif case( MODEL_TS_BOARD ): case( MODEL_SHIROBAKO ): SW_HOME_n = SW_HOME_n_TSBOARD; break; default: - SW_HOME_n = 1; - } - - if( SW_HOME_n ) - { - if( ( CLICK_THRESHOLD < SW_home_count ) && ( SW_home_count <= HOLD_THREASHOLD ) ) - { - set_irq( VREG_C_IRQ0, REG_BIT_SW_HOME_CLICK ); - } - } - else if( SW_home_count == HOLD_THREASHOLD ) - { - set_irq( VREG_C_IRQ0, REG_BIT_SW_HOME_HOLD ); + SW_HOME_n = 1; // 放されてる状態 } + chk_clicked( SW_HOME_n, SW_home_count, REG_BIT_SW_HOME_CLICK ); +#endif // wifi sw // - if( SW_wifi_count == CLICK_THRESHOLD ) - { - set_irq( VREG_C_IRQ0, REG_BIT_SW_WIFI_CLICK ); - } - - break; + chk_clicked( SW_WIFI_n, SW_wifi_count, REG_BIT_SW_WIFI_CLICK ); } - - // ボタン押し時間のカウント -/* -if( ( system_status.pwr_state == ON ) - || ( system_status.pwr_state == OFF ) - || ( system_status.pwr_state == BT_CHARGE ) ) - */ - - { - count_sw_n( SW_POW_n, SW_pow_count, SW_pow_mask ); -#ifdef _SW_HOME_ENABLE_ - count_sw_n( SW_HOME_n, SW_home_count, SW_home_mask ); -#endif - count_sw_n( SW_WIFI_n, SW_wifi_count, SW_wifi_mask ); - } - - return; } diff --git a/trunk/sw.h b/trunk/sw.h index f3bea21..12b473e 100644 --- a/trunk/sw.h +++ b/trunk/sw.h @@ -1,7 +1,7 @@ #ifndef _sw_ #define _sw_ -extern u8 SW_pow_count, SW_home_count, SW_wifi_count; -extern bit SW_pow_mask, SW_home_mask, SW_wifi_mask; +extern u8 SW_pow_count; +extern bit SW_pow_mask; #endif diff --git a/trunk/task_misc.c b/trunk/task_misc.c index 86d4445..3367a54 100644 --- a/trunk/task_misc.c +++ b/trunk/task_misc.c @@ -44,10 +44,16 @@ +// ======================================================== +bit twl_ver_read; + + // ======================================================== #define INTERVAL_TSK_MISC_STAT 4 + + /* ======================================================== ステータスレジスタなど ======================================================== */ @@ -140,6 +146,14 @@ void tsk_misc_stat( ) NOP(); } } + + + if( twl_ver_read ) + { + twl_ver_read = 0; + set_irq( VREG_C_IRQ2, REG_BIT_TWL_VER_READ ); + } + return; } @@ -184,14 +198,16 @@ task_status_immed do_command0( ) 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 ); } -*/ + */ } } diff --git a/trunk/task_sys.c b/trunk/task_sys.c index 4d72a36..78c282a 100644 --- a/trunk/task_sys.c +++ b/trunk/task_sys.c @@ -42,7 +42,7 @@ void tsk_sys( ) switch ( system_status.poweron_reason ) { - default: + case( NONE ): // スイッチで電源on if( SW_pow_count != 0 ) @@ -53,14 +53,14 @@ void tsk_sys( ) { timeout += 1; } - if( timeout > 127 ) + if( timeout > 100 ) { system_status.pwr_state = OFF_TRIG; // スイッチはノイズだった。寝る。 renge_task_interval_run_force = 1; return; } - if( SW_pow_count < 3 ) + if( SW_pow_count < 10 ) { // もう少しスイッチの様子を見る return; @@ -69,10 +69,12 @@ void tsk_sys( ) system_status.poweron_reason = PWSW; break; - case ( RTC_ALARM ): + default: break; } + SW_pow_mask = 1; + timeout = 0; BT_DET_P = 1; // チャージに時間が掛かるので先に上げておく @@ -120,17 +122,24 @@ void tsk_sys( ) { // とりあえず、LED消灯状態で起動させる vreg_ctr[VREG_C_LED_POW] = LED_POW_ILM_OFF; - // todo? } system_status.pwr_state = ON_TRIG; - // ここまで来ると、電源投入確定 + // ここまで来ると、電源投入確定 // break; case ON_TRIG: //------------------------------------------------------- LED_init( ); - PU7 = 0b00011101; // 4:SW_WIFI 3:SW_PWSW 2:PM_IRQ 0:PM_EXTDC_n + PU5 = 0b00000010; // 1:PM_CHARGE + PU7 = 0b00011101; // 4:SW_WIFI 3:SW_PWSW 2:PM_IRQ 0:PM_EXTDC_n +#ifdef _MODEL_CTR_ +# ifdef _SW_HOME_ENABLE_ + PU20 = 0b00010000; // SW_HOME +# else + PU20 = 0b00000000; +# endif +#endif IIC_ctr_Init( ); if( ( vreg_ctr[ VREG_C_MCU_STATUS ] & REG_BIT_STATUS_WDT_RESET ) @@ -235,6 +244,7 @@ void tsk_sys( ) IIC_ctr_Stop( ); IIC_twl_Stop( ); RTC_32k_off(); + GYRO_CS_DISABLE(); vreg_ctr[VREG_C_IRQ0] = 0; vreg_ctr[VREG_C_IRQ1] = 0; @@ -251,55 +261,43 @@ void tsk_sys( ) #ifdef _PMIC_TWL_ PM_TEG_LCD_dis( 1 ); #endif -// IRQ0_deactive; - // pullup_off(); ↓ - { - PU5 = 0b00000011; // PM_CHG,PM_CHGERR - PU7 = 0b00011001; // SW_WiFi,PWSWI,PM_EXTTDC - } - - PM_sys_pow_off( ); while( iic_mcu_busy ) {; } KRM = ( KR_SW_POW ); // Mask ではなく、Modeなのだそうだ。紛らわしい - // intp20系は後ほど MK0 = ~( INT_MSK0_EXTDC ); MK1 = ~( INT_MSK1_KR | INT_MSK1_RTCALARM | INT_MSK1_RTCINTVAL ); MK2L = 0b11111111; + // PU5 そのまま + PU7 = 0b00001001; // PWSWI,PM_EXTTDC,( IRQ0_deactive(), PM_IRQ_deactive ) + PU20 = 0x00; // SW_HOME 停止 + IF0 = 0; IF1 = 0; IF2 = 0; + PM_sys_pow_off( ); + timeout = 0; system_status.pwr_state = BT_CHARGE; + SW_pow_mask = 1; SW_pow_count = 0; - SW_wifi_count = 0; // no break // case BT_CHARGE: + system_status.pwr_state = OFF; if( !PM_EXTDC_n ) { // アダプタ有り:充電温度監視 BT_TEMP_P = 1; - - // 電源on? - if( ( SW_pow_count > 3 ) || ( SW_wifi_count > 3 ) - || ( system_status.poweron_reason == RTC_ALARM ) ) - { - system_status.pwr_state = OFF; // 若干抵抗有るが... - renge_task_interval_run_force = 1; - KRMK = 1; - return; - } - return; } else { // 省電力へ移行 + LED_CHARGE = 0; BT_TEMP_P = 0; while( RWST ) {;} @@ -314,23 +312,23 @@ void tsk_sys( ) OSMC = 0x00; # endif STOP( ); -# ifdef _MCU_BSR_ - OSMC = 0x01; - CKC = 0b00001000; -# endif - - RTCIMK = 0; // 起きる // - // 起きる条件は // ・KeyReturn割り込み(電源ボたん) // ・RTCアラーム // ・アダプタ挿抜 - system_status.pwr_state = OFF; // - renge_task_interval_run_force = 1; - KRMK = 1; - return; + + if( PM_EXTDC_n ) + { + SW_pow_mask = 0; + } +# ifdef _MCU_BSR_ + OSMC = 0x01; + CKC = 0b00001000; +# endif + RTCIMK = 0; } + return; default: while( 1 ) diff --git a/trunk/user_define.h b/trunk/user_define.h index 1f0f6d0..ee8d68b 100644 --- a/trunk/user_define.h +++ b/trunk/user_define.h @@ -160,10 +160,8 @@ // WiFi #ifndef _TEG_ #define WL_TX P20.3 // INTP21 -#define WL_RX P20.2 // INTP20 #else #define WL_TX P20.3 // INTP21 -#define WL_RX P20.2 // INTP20 #endif //#define LED_CAM P1.0 // TO02 @@ -193,10 +191,17 @@ #ifdef _MODEL_CTR_ // P5.0 に加え、P5.5, P140 P141 // P140が出力専用なので... -#define I2C_PU_on() { PM5 |= 0x09; P14 |= 0x03; P5 |= 0x09; PM5 &= ~0x09; } -#define I2C_PU_off() { PM5 |= 0x09; P14 &= ~0x03; } +#define I2C_PU_on() { PM5.3 = 1; PM3.3 = 1; P14 |= 0x03; P5.3 = 1; PM5.3 = 0; P3.3 = 1; PM3.3 = 0; } +#define I2C_PU_off() { PM5.3 = 1; PM3.3 = 1; P14 &= ~0x03; P5.3 = 0; PM5.3 = 0; P3.3 = 0; PM3.3 = 0; } #endif +#ifdef _MODEL_CTR_ +#define GYRO_CS_ENABLE() P5.0 = 1 +#define GYRO_CS_DISABLE() P5.0 = 0 +#else +#define GYRO_CS_ENABLE() ; +#define GYRO_CS_DISABLE() ; +#endif //#define I2C_M_SDA P3.1 // SDA10 //#define I2C_M_SCL P3.2 // SCL10 @@ -247,12 +252,9 @@ #endif - -#define DBG_M_n P2.1 #define DBG_P_n P2.2 - #define KR_SW_POW ( 1 << 3 ) #define KR_SW_WIFI ( 1 << 4 ) diff --git a/trunk/vreg_ctr.c b/trunk/vreg_ctr.c index d3bf742..5b4d252 100644 --- a/trunk/vreg_ctr.c +++ b/trunk/vreg_ctr.c @@ -274,6 +274,10 @@ void vreg_ctr_write( u8 adrs, u8 data ) } break; + case ( VREG_C_ACC_HOSU_ORIGIN ): + vreg_ctr[adrs] = data; + break; + case ( VREG_C_FREE_ADRS ): vreg_ctr[adrs] = data; break; @@ -300,6 +304,19 @@ void vreg_ctr_write( u8 adrs, u8 data ) break; } vreg_ctr[adrs] = data; + break; + + case( VREG_C_BATT_EMPTY_PATTERN ): + { +#ifdef _MODEL_CTR_NOTIFY_FULLCOLOR_ + if( iic_burst_state < 4 ) + { + led_red_batt_empty.dats.dats[ iic_burst_state ] = data; + iic_burst_state += 1; + } +#endif + } + break; } return; } @@ -368,7 +385,6 @@ u8 vreg_ctr_read( u8 adrs ) // I2C仮想レジスタから読まれて何かするレジスタ void vreg_ctr_after_read( u8 adrs ) { - // 割り込みフラグはリードでクリア switch( adrs ) { diff --git a/trunk/vreg_ctr.h b/trunk/vreg_ctr.h index 36e4013..501bd3d 100644 --- a/trunk/vreg_ctr.h +++ b/trunk/vreg_ctr.h @@ -9,7 +9,7 @@ // VREG_C_MCU_STATUS -#define REG_BIT_STATUS_WDT_RESET ( 1 << 1 ) +#define REG_BIT_STATUS_WDT_RESET ( 1 << 1 ) #define REG_BIT_RTC_BLACKOUT ( 1 << 0 ) @@ -27,17 +27,15 @@ // VREG_C_STATUS_X // 未使用 ( 1 << 6 ) // 未使用 ( 1 << 5 ) -// 未使用 ( 1 << 4 ) -// 未使用 ( 1 << 3 ) -// 未使用 ( 1 << 2 ) +#define REG_BIT_WIFI_TX ( 1 << 4 ) +// twl bl のミラー[1: ( 1 << 3 ) +// 0]( 1 << 2 ) #define REG_BIT_ACCERO_ERR ( 1 << 1 ) #define REG_BIT_GASGAUGE_ERR ( 1 << 0 ) - - // VREG_C_IRQ0 #define REG_BIT_VR_SNDVOL_CHANGE ( 1 << 7 ) -#define REG_BIT_IRQ_WDT_RESET ( 1 << 7 ) +#define REG_BIT_IRQ_WDT_RESET ( 1 << 7 ) #define REG_BIT_SHELL_OPEN ( 1 << 6 ) #define REG_BIT_SHELL_CLOSE ( 1 << 5 ) #define REG_BIT_SW_WIFI_CLICK ( 1 << 4 ) @@ -57,6 +55,7 @@ #define REG_BIT_BT_DC_DISC ( 1 << 0 ) // VREG_C_IRQ2 +#define REG_BIT_TWL_VER_READ ( 1 << 7 ) #define REG_BIT_TWL_SNDVOL_CHANGE ( 1 << 6 ) #define REG_BIT_TWL_BL_U_ON ( 1 << 5 ) #define REG_BIT_TWL_BL_U_OFF ( 1 << 4 ) @@ -216,6 +215,8 @@ enum VREG_C VREG_C_RTC_SEC_FINE_L, VREG_C_RTC_SEC_FINE_H, + VREG_C_ACC_HOSU_ORIGIN, + VREG_C_ACC_CONFIG = 0x40, VREG_C_ACC_R_ADRS, VREG_C_ACC_RESERVE, @@ -235,14 +236,16 @@ enum VREG_C VREG_C_ACC_HOSU_SETTING, VREG_C_ACC_HOSU_HIST = 0x4F, -// VREG_C_AMBIENT_BRIGHTNESS = 0xXX, - VREG_C_FREE_ADRS = 0x50, VREG_C_FREE_DATA, + VREG_C_BATT_EMPTY_PATTERN, + VREG_C_ENDMARK_ }; #define VREG_C_INFO 0x7F +// VREG_C_AMBIENT_BRIGHTNESS = 0xXX, + /* VREG_C_PM_INFO, // 未使用 diff --git a/trunk/vreg_twl.c b/trunk/vreg_twl.c index 666a773..8b00ebd 100644 --- a/trunk/vreg_twl.c +++ b/trunk/vreg_twl.c @@ -19,6 +19,9 @@ TWL u8 vreg_twl[_REG_TWL_INT_ADRS_ENDMARK]; +extern bit twl_ver_read; + + /* ======================================================== 仮想レジスタの初期化 ======================================================== */ @@ -92,6 +95,9 @@ u8 vreg_twl_read( u8 phy_adrs ) switch( phy_adrs ){ case( REG_TWL_INT_ADRS_VER_INFO ): +// set_irq( VREG_C_IRQ2, REG_BIT_TWL_VER_READ ); // 速度的に無理なので + twl_ver_read = 1; + return( TWL_REG_VER_INFO ); case( REG_TWL_INT_ADRS_POWER_INFO ): diff --git a/trunk/yav_mcu_bsr.prj b/trunk/yav_mcu_bsr.prj index 0553d19..1bf690d 100644 --- a/trunk/yav_mcu_bsr.prj +++ b/trunk/yav_mcu_bsr.prj @@ -512,14 +512,68 @@ DefaultMode2=1 DefaultMode3=1 DefaultMode4=1 DefaultMode5=1 -[ToolSet] -ToolSetName=(変更)78K0R Software Package V1.10 -Tool1=CC78K0R|W2.10 -Tool2=RA78K0R|W1.31 -Tool3=ID78K0R-QB|V3.60 [BuildBefore-AfterCmd] Before1=touch magic.c After1=ruby nec_s_2_bsrbin2.rb bsr.hex +[SrcFile] +Source1=loader.c +Source2=pm.c +Source3=i2c_ctr.c +Source4=main.c +Source5=magic.c +Source6=WDT.c +Source7=i2c_mcu.c +Source8=i2c_twl.c +Source9=led.c +Source10=rtc.c +Source11=vreg_ctr.c +Source12=vreg_twl.c +Source13=adc.c +Source14=renge\renge.c +Source15=accero.c +Source16=self_flash.c +Source17=sw.c +Source18=task_debug.c +Source19=task_misc.c +Source20=task_sys.c +Source21=pedo_alg_thre_det2.c +Source22=ini_VECT.c +Source23=led_old.c +[IncFile] +Include1=incs_loader.h +Include2=jhl_defs.h +Include3=config.h +Include4=user_define.h +Include5=bsr_system.h +Include6=renge\renge.h +Include7=renge\renge_defs.h +Include8=renge\renge_task_immediate.h +Include9=vreg_ctr.h +Include10=vreg_twl.h +Include11=loader.h +Include12=i2c_mcu.h +Include13=WDT.h +Include14=fsl.h +Include15=fsl_user.h +Include16=i2c_ctr.h +Include17=pm.h +Include18=rtc.h +Include19=reboot.h +Include20=incs.h +Include21=accero.h +Include22=pedometer.h +Include23=adc.h +Include24=led.h +Include25=batt_params.h +Include26=..\..\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r\fsl.h +Include27=i2c_twl_defs.h +Include28=renge\renge_task_intval.h +Include29=..\..\Program Files\NEC Electronics Tools\CC78K0R\W2.10\inc78k0r\math.h +Include30=i2c_twl.h +Include31=sw.h +Include32=self_flash.h +Include33=pool.h +Include34=pedo_lpf_coeff.h [Options.CC78K0R 0] Version=210 Include0=renge,C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r @@ -752,7 +806,6 @@ Version=210 Define0= Define1=_debug_,_TEG_,proc_is_ke3 Define2=_debug_,_TEG_,proc_is_ke3,%time% -Undefine0= Include0=renge,C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r Include1=renge,C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r Include2=renge,C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r @@ -1069,62 +1122,89 @@ VfiFileBoot0= VfiFileBoot1=boot.vfi VF78K0Rchk=0 VF78K0Rvs= -[SrcFile] -Source1=loader.c -Source2=pm.c -Source3=i2c_ctr.c -Source4=main.c -Source5=magic.c -Source6=WDT.c -Source7=i2c_mcu.c -Source8=i2c_twl.c -Source9=led.c -Source10=rtc.c -Source11=vreg_ctr.c -Source12=vreg_twl.c -Source13=adc.c -Source14=renge\renge.c -Source15=accero.c -Source16=self_flash.c -Source17=sw.c -Source18=task_debug.c -Source19=task_misc.c -Source20=task_sys.c -Source21=pedo_alg_thre_det2.c -Source22=ini_VECT.c -Source23=led_old.c -[IncFile] -Include1=incs_loader.h -Include2=jhl_defs.h -Include3=config.h -Include4=user_define.h -Include5=bsr_system.h -Include6=renge\renge.h -Include7=renge\renge_defs.h -Include8=renge\renge_task_immediate.h -Include9=vreg_ctr.h -Include10=vreg_twl.h -Include11=loader.h -Include12=i2c_mcu.h -Include13=WDT.h -Include14=fsl.h -Include15=fsl_user.h -Include16=i2c_ctr.h -Include17=pm.h -Include18=rtc.h -Include19=reboot.h -Include20=incs.h -Include21=accero.h -Include22=pedometer.h -Include23=adc.h -Include24=led.h -Include25=batt_params.h -Include26=..\..\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r\fsl.h -Include27=i2c_twl_defs.h -Include28=renge\renge_task_intval.h -Include29=..\..\Program Files\NEC Electronics Tools\CC78K0R\W2.10\inc78k0r\math.h -Include30=i2c_twl.h -Include31=sw.h -Include32=self_flash.h -Include33=pool.h -Include34=pedo_lpf_coeff.h +[Options.CC78K0R 2 pm.c] +Version=210 +Define0= +Define1=_debug_,_TEG_,proc_is_ke3 +Define2=_debug_,_TEG_,proc_is_ke3,%time% +Define3=_TEG_,proc_is_ke3 +Define4=proc_is_ke3 +Include0=renge,C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r +Include1=C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r +Memorymodel=1 +Flashobj=0 +FlashStartadr= +FlashBranchStartadr= +Mirror=0 +Saddrglobalchk=0 +Saddrglobal=1066 +Saddrstaticchk=0 +Saddrstatic=1072 +Bitfieldmsb=0 +Onebytechk=0 +Pacstructchk=0 +AssignROMchk=0 +AssignROM=0 +Maxoptimizechk=0 +Maxoptimize=1104 +Charunexpandchk=0 +Unsignedchar=0 +Usesaddrchk=0 +Autoallocationchk=1 +Jumpoptimize=1 +Librarycallchk=1 +Librarycall=1132 +Aggressivechk=1 +Relativebranchchk=1 +Debugoptchk=0 +Outdebugchk=1 +Outdebug=1153 +Outasmsrccmb0=inter_asm +Outasmsrccmb1=bsr.asm +Outasmsrcchk=1 +Outasmsrc=1158 +Outasmoptall=1 +Common=0 +Outerrlistchk=0 +Outerrlist=1174 +Xreference=0 +Preprocess=0 +Prenocomment=0 +Predefine=0 +Preifdef=1 +Preinclude=1 +Preline=1 +Prenumber=1 +Formfeed=0 +Columns=132 +Lines=0 +Tablength=8 +Ansi=0 +Cpraspras=1 +Commentnest=0 +Intunexpand=0 +Kanjicode=1210 +Verbose=0 +CommandFile=0 +Warninglevel=1 +Startupchk=1 +Fixation=0 +FarROMization=0 +Objectsel=1305 +Librarychk=1 +Floatingpoint=0 +Muldivunit=1 +Mulunit=1 +Startup=s0rm.rel +Library1=cl0rdm.lib +Library2=cl0rm.lib +Library3=cl0rmf.lib +VfiFileBoot0= +VfiFileBoot1=boot.vfi +VF78K0Rchk=0 +VF78K0Rvs= +[ToolSet] +ToolSetName=(変更)78K0R Software Package V1.10 +Tool1=CC78K0R|W2.10 +Tool2=RA78K0R|W1.31 +Tool3=ID78K0R-QB|V3.60