diff --git a/trunk/accero.c b/trunk/accero.c index 8566de7..d51e0c6 100644 --- a/trunk/accero.c +++ b/trunk/accero.c @@ -65,17 +65,10 @@ task_status tsk_soft_int( ); task_status_immed tsk_cbk_accero( ) { // (疑似)isrから登録されます -/* - if(( system_status.pwr_state == OFF ) || ( system_status.pwr_state == BT_CHARGE ) ) - { - return ( ERR_SUCCESS ); - } - else - { -*/ - // 加速度センサデータレジスタへの反映 - if( iic_mcu_read( IIC_SLA_ACCEL, ( ACC_REG_X | 0x80 ), 6, &vreg_ctr[VREG_C_ACC_XL] ) - != ERR_SUCCESS ) + + // 加速度センサデータレジスタへの反映 + if( iic_mcu_read( IIC_SLA_ACCEL, ( ACC_REG_X | 0x80 ), 6, &vreg_ctr[VREG_C_ACC_XL] ) + != ERR_SUCCESS ) { // 加速度センサが異常になったので止める vreg_ctr[VREG_C_ACC_CONFIG] &= ~( VREG_BITMASK_ACC_CONF_HOSU | VREG_BITMASK_ACC_CONF_ACQ ); @@ -84,7 +77,7 @@ task_status_immed tsk_cbk_accero( ) return ( ERR_SUCCESS ); // タスクの削除は必要 } else - { + { // 正常時パス // // 加速度更新&割り込み if( (( vreg_ctr[VREG_C_ACC_CONFIG] & VREG_BITMASK_ACC_CONF_ACQ ) != 0 ) && @@ -104,9 +97,9 @@ task_status_immed tsk_cbk_accero( ) ( ( vreg_ctr[VREG_C_ACC_CONFIG] & VREG_BITMASK_ACC_CONF_HOSU ) != 0 ) ) { - DBG_LED_WIFI_2_on; - pedometer(); // 歩数計 - DBG_LED_WIFI_2_off; + DBG_LED_WIFI_2_on; + pedometer(); // 歩数計 + DBG_LED_WIFI_2_off; } } return ( ERR_SUCCESS ); diff --git a/trunk/adc.c b/trunk/adc.c index b4a242c..b0f7eab 100644 --- a/trunk/adc.c +++ b/trunk/adc.c @@ -40,23 +40,9 @@ extern void nop8(); ・8tics毎に呼ばれ、3チャンネル分取り込むとADCを停止します。  タスク起動時、レジスタには前回の取り込み値が入っています。 ======================================================== */ -/* -// max -4db -static const u8 slider_to_codec[64] = -{ - 127, 125, 124, 123, 121, 120, 119, 117, - 116, 115, 113, 112, 111, 109, 108, 107, - 105, 104, 103, 101, 100, 99, 98, 96, - 95, 94, 92, 91, 90, 88, 87, 86, - 84, 83, 82, 80, 79, 78, 76, 75, - 74, 72, 71, 70, 69, 67, 66, 65, - 63, 62, 61, 59, 58, 57, 55, 54, - 53, 51, 50, 49, 47, 46, 45, 44 -}; -*/ -// max -10db -static const u8 slider_to_codec[64] = +// max -15db +const u8 slider_to_codec[64] = { 127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, 115, 114, 113, 112, @@ -325,14 +311,9 @@ u8 get_adc( u8 ch ) ADPC = 0x06; // ADCポートのセレクト ADS = ch; - NOP(); - NOP(); - NOP(); - NOP(); - NOP(); - NOP(); - NOP(); - NOP(); + + nop8(); + ADCS = 1; // AD開始。 /// ここまで↑ に、1us以上開ける while( ADIF == 0 ){;} diff --git a/trunk/bsr_system.h b/trunk/bsr_system.h index f377db9..9dedb1d 100644 --- a/trunk/bsr_system.h +++ b/trunk/bsr_system.h @@ -47,7 +47,6 @@ typedef struct system_status_; - extern system_status_ system_status; diff --git a/trunk/config.h b/trunk/config.h index 8e26538..9ee1555 100644 --- a/trunk/config.h +++ b/trunk/config.h @@ -6,7 +6,7 @@ #define MCU_VER_MAJOR 0x00 -#define MCU_VER_MINOR 0x10 +#define MCU_VER_MINOR 0x12 #define _OVERCLOCK_ diff --git a/trunk/i2c_mcu.c b/trunk/i2c_mcu.c index c877f17..10f3dd1 100644 --- a/trunk/i2c_mcu.c +++ b/trunk/i2c_mcu.c @@ -81,39 +81,52 @@ void nop8() } -static u8 iic_mcu_is_ready() +static err iic_mcu_is_ready() { if( iic_mcu_initialized == 0 ) { #ifdef _debug_ iic_mcu_start( ); #else + return( ERR_ERR ); while( 1 ) { NOP(); } #endif } + while( iic_mcu_busy ) { NOP( ); } iic_mcu_busy = 1; + return( ERR_SUCCESS ); } /* ======================================================== スレーブからの 『1文字』 リード 返値がデータそのものです。 - エラー判定ができません。 ======================================================== */ u8 iic_mcu_read_a_byte( u8 SLA, u8 adrs ) { u8 dat; - iic_mcu_is_ready(); +#if 1 + // ラッパー + if( iic_mcu_read( SLA, adrs, 1, &dat ) == ERR_SUCCESS ) + { + iic_mcu_bus_status = ERR_OK; + } + else + { + iic_mcu_bus_status = ERR_NOSLAVE; + } + return ( dat ); - iic_mcu_bus_status = ERR_OK; +#else + iic_mcu_is_ready(); // スタートコンディションとスレーブの呼び出し、レジスタアドレスの送信 if( iic_mcu_call_slave( SLA ) != 0 ) @@ -149,6 +162,7 @@ u8 iic_mcu_read_a_byte( u8 SLA, u8 adrs ) IICIF10 = 0; // 後を濁さないこと iic_mcu_busy = 0; return ( dat ); +#endif } @@ -167,7 +181,11 @@ err iic_mcu_read( u8 slave, u8 adrs, u8 len, u8 * dest ) { #if 1 - iic_mcu_is_ready(); + if( iic_mcu_is_ready() != ERR_SUCCESS ) + { + return( ERR_ERR ); + } + ; #else // 使用中なら帰る if( iic_mcu_initialized == 0 ){ @@ -234,12 +252,19 @@ err iic_mcu_read( u8 slave, u8 adrs, u8 len, u8 * dest ) err iic_mcu_write_a_byte( u8 SLA, u8 adrs, u8 dat ) { -#if 0 +#if 1 // ラッパー + static u8 temp; // 書きっぱなしで終了を見ずに関数を抜ける(可能性が高い)のでstatic + + // これをしないと、立て続けに書いたときに前のデータを破壊してしまう + while( iic_mcu_busy ) + { + NOP( ); + } + temp = dat; iic_mcu_wo_dma = 1; return ( iic_mcu_write( SLA, adrs, 1, &temp ) ); -} #else // 1文字の時はDMAとか起動しないでさっさと終わらせる iic_mcu_is_ready(); @@ -279,8 +304,10 @@ err iic_mcu_write_a_byte( u8 SLA, u8 adrs, u8 dat ) err iic_mcu_write( u8 slave, u8 adrs, u8 len, void * src ) { - iic_mcu_is_ready(); - + if( iic_mcu_is_ready() != ERR_SUCCESS ) + { + return( ERR_ERR ); + } #if 0 // 使用中なら帰る if( iic_mcu_initialized == 0 ){ @@ -331,9 +358,9 @@ err iic_mcu_write( u8 slave, u8 adrs, u8 len, void * src ) // DMAを使用しない // // レジスタアドレスの送信 + IICMK10 = 0; SIO10 = adrs; - IICMK10 = 0; iic_send_wo_dma_len = len; p_iic_send_wo_dma_dat = src; // 残りは割り込みルーチン内で diff --git a/trunk/led.c b/trunk/led.c index b231d0f..1e07b11 100644 --- a/trunk/led.c +++ b/trunk/led.c @@ -31,9 +31,25 @@ static void led_pow_hotaru( ); // ======================================================== -static const char MSG_MAIL[] = { 0b11110110, 0b11011010, 0b01101110, 0b10010100 }; -#define MSG_SPD 60 -// ↑255/3以下であること! +// お知らせLEDのパターンを流し込んでもらう +typedef struct{ + unsigned char red:3; + unsigned char grn:3; + unsigned char blu:2; +}st_info_LED_ptn; + +st_info_LED_ptn info_LED_ptn[32]; + + + + + + + + + +// ======================================================== + // ======================================================== void LED_init( ) @@ -412,7 +428,6 @@ void tsk_led_notify( ) switch ( vreg_ctr[VREG_C_LED_NOTIFY] ) { - case ( NOTIFY_LED_OFF ): default: LED_duty_NOTIFY = 0; state_notify_led = 0; @@ -424,87 +439,6 @@ void tsk_led_notify( ) state_notify_led = 0; flg_char_space = 0; break; - - case ( NOTIFY_LED_PTN0 ): - // ゆっくりバースト - switch ( state_notify_led ) - { - case ( 1 ): - case ( 3 ): - case ( 5 ): - LED_duty_NOTIFY = vreg_ctr[VREG_C_LED_BRIGHT]; - break; - default: - LED_duty_NOTIFY = 0; - } - state_notify_led++; - if( state_notify_led == 16 ) - { - state_notify_led = 0; - } - task_interval = 50; - return; - - case ( NOTIFY_LED_PTN1 ): - // データテーブルに従って点滅 - { - u8 dat; - - task_interval = MSG_SPD; // 共通のため。場合によって上書き - - if( flg_char_space != 0 ) - { - LED_duty_NOTIFY = 0; - flg_char_space = 0; - return; - } - - // データバッファの見る位置の更新 - dat = ( MSG_MAIL[state_notify_led / 4] << ( ( state_notify_led % 4 ) * 2 ) ) & 0xC0; - if( dat == 0 ) - { - state_notify_led = 0; - } - else - { - state_notify_led += 1; - } - - flg_char_space = 1; - if(( dat & 0b10000000 ) != 0 ) - { - // 点灯はさせる - LED_duty_NOTIFY = vreg_ctr[VREG_C_LED_BRIGHT]; - if(( dat & 0b01000000 ) == 0 ) - { - // 短 - // nothing to do - } - else - { - // 長 - task_interval = ( MSG_SPD * 3 ); - } - // 次は単語間休み、とかの判定をさせたかったが - /// 1バイトに2ビットずつデータが並んでおり、次のバイトに - /// またがるようなときが面倒なのでやめる - return; - } - else - { - if(( dat & 0b01000000 ) == 0 ) - { - // 一文終了 - task_interval = ( MSG_SPD * 3 ); - } - else - { - // 単語間 - // nothing to do - } - return; - } - } } } diff --git a/trunk/led.h b/trunk/led.h index db22719..52f6620 100644 --- a/trunk/led.h +++ b/trunk/led.h @@ -85,6 +85,6 @@ enum void LED_init( ); void LED_stop( ); - +extern void tsk_led_cam(); #endif diff --git a/trunk/loader.c b/trunk/loader.c index 1092f95..109db0a 100644 --- a/trunk/loader.c +++ b/trunk/loader.c @@ -243,16 +243,16 @@ void hdwinit2( ) PM5 = 0b11110011; PM6 = 0b11111100; // I2CのラインがL出力になってしまうが、システムがOFFなのでかまわない +#ifdef _PMIC_CTR_ + PM7 = 0b01011111; +#else PM7 = 0b00011111; +#endif PM12 = 0b11111111; // 32kHzクロックのピン設定はどっちでもよい PM15 = 0b11111111; #ifdef _MCU_BSR_ -#ifdef _MODEL_CTR_ - PM20 = 0b11111101; -#else PM20 = 0b11111100; -#endif #else PM8 = 0b11111111; #endif diff --git a/trunk/magic.c b/trunk/magic.c index 514d27f..774bcf1 100644 --- a/trunk/magic.c +++ b/trunk/magic.c @@ -7,14 +7,13 @@ // V0.5 (ニセ0.1改) #pragma section @@CNSTL MGC_LOAD AT 0x0FF6 -__far static const unsigned char MGC_LOAD[] = __TIME__; +__far const unsigned char MGC_LOAD[] = __TIME__; #pragma section @@CNST MGC_MIMI AT 0x2100 -static const unsigned char MGC_HEAD[] = __TIME__; +const unsigned char MGC_HEAD[] = __TIME__; #pragma section @@CNST MGC_TAIL AT 0x4FF6 -static const unsigned char MGC_TAIL[] = __TIME__; -//static const unsigned char MGC_TAIL[] = "fuga_"; +const unsigned char MGC_TAIL[] = __TIME__; // 0Dまでこれを使用 diff --git a/trunk/main.c b/trunk/main.c index a3fa84a..f4686e1 100644 --- a/trunk/main.c +++ b/trunk/main.c @@ -15,16 +15,18 @@ #include "led.h" #include "adc.h" +#include "pool.h" + + // ======================================================== static void read_dipsw( ); // ======================================================== system_status_ system_status; -bit update; +uni_pool pool; -u16 pool[256]; // アップデート時のワークエリア 兼 歩数計データ /* ======================================================== 本当のエントリ関数は loader.c にあります ======================================================== */ diff --git a/trunk/pedo_alg_thre_det2.c b/trunk/pedo_alg_thre_det2.c index 44d64cf..6ad3473 100644 --- a/trunk/pedo_alg_thre_det2.c +++ b/trunk/pedo_alg_thre_det2.c @@ -13,13 +13,17 @@ #include "accero.h" #include "pedometer.h" +#include "pedo_lpf_coeff.h" +#include "pool.h" +// ======================================================== static void hosu_increment(); + + + +// ======================================================== u16 get_long_hour(); - - - -extern u16 pool[]; +extern uni_pool pool; @@ -243,13 +247,13 @@ static void hosu_increment() last_hour_fny = now_hour; // 実際にインクリメント - if( pool[ p_record ] == HOSU_NODATA ) + if( pool.vreg_c_ext.pedo_log[ p_record ] == HOSU_NODATA ) { - pool[ p_record ] = 1; + pool.vreg_c_ext.pedo_log[ p_record ] = 1; } - else if( pool[ p_record ] != HOSU_MAX ) + else if( pool.vreg_c_ext.pedo_log[ p_record ] != HOSU_MAX ) { - pool[ p_record ] += 1; + pool.vreg_c_ext.pedo_log[ p_record ] += 1; } } } @@ -262,16 +266,16 @@ static void hosu_increment() ======================================================== */ void fill_hosu_hist_hours( u16 hours ) { - if( hours > 255 ) + if( hours > PEDOMETER_LOG_SIZE ) { - hours = 0; + hours = PEDOMETER_LOG_SIZE; } // 空白の数時間の設定 do { p_record += 1; - pool[ p_record ] = 0; + pool.vreg_c_ext.pedo_log[ p_record ] = 0; hours -= 1; } while( hours != 0 ); @@ -285,12 +289,11 @@ void fill_hosu_hist_hours( u16 hours ) ======================================================== */ void clear_hosu_hist() { - u8 hours = 0; - // 空白の数時間の設定 + u8 hours = PEDOMETER_LOG_SIZE; do { - pool[ hours ] = 0xFFFF; hours -= 1; + pool.vreg_c_ext.pedo_log[ hours ] = 0xFFFF; } while( hours != 0 ); vreg_ctr[ VREG_C_ACC_HOSU_L ] = 0; @@ -349,7 +352,7 @@ u8 hosu_read( ) return( 0xAA ); // reserved. dummy default: - temp = pool[ p_record_buffer ]; + temp = pool.vreg_c_ext.pedo_log[ p_record_buffer ]; if( record_read_msb_lsb == 0 ) { dat = (u8)( temp & 0x00FF ); @@ -357,7 +360,14 @@ u8 hosu_read( ) else { dat = (u8)(( temp >> 8 ) & 0x00FF ); - p_record_buffer -= 1; + if( p_record_buffer == 0 ) + { + p_record_buffer = PEDOMETER_LOG_SIZE-1; + } + else + { + p_record_buffer -= 1; + } } record_read_msb_lsb += 1; return( dat ); @@ -371,7 +381,7 @@ u8 hosu_read( ) 引数 無し 返値 u16 long_hour ======================================================== */ -static const u16 DAYS_FROM_HNY[] = { +const u16 DAYS_FROM_HNY[] = { 0, 0, 31, 31+28, 59+31, 90+30, 120+31, 151+30, 181+31, 212+31, 243+30, diff --git a/trunk/pedometer.h b/trunk/pedometer.h index 1dd1d03..40caf2a 100644 --- a/trunk/pedometer.h +++ b/trunk/pedometer.h @@ -2,98 +2,21 @@ #define _pedo_ +// ========================================================= void hosu_read_end( ); u8 hosu_read( ); void fill_hosu_hist_hours( u16 ); void clear_hosu_hist(); - - -// ========================================================= -#define TAP 64 -#define FIL_COEFF_QUANT 10 -static const s8 lpf_coeff[]={ -/* -Window Function Algorithm LPF -Sampling Frequency = 100.0 -cutoff1 = 6.0000000 -Tap Count =64 -Kaiser Constant = 7.000000 -Quantized by 11 [bits] - */ -/* 0,// [0] - 0, - 0, - 0, - 0, - 0, - 0, - 0, -*/ - 1,// 8 - 2, - 2, - 3, - 3, - 2, - 0, - -2, - -5,// 16 - -9, - -13, - -16, - -16, - -13, - -6, - 4, - 18,// 24 - 37, - 56, - 77, - 95, - 110, - 119, - 122, - 119,// 32 - 110, - 95, - 77, - 56, - 37, - 18, - 4, - -6,// 40 - -13, - -16, - -16, - -13, - -9, - -5, - -2, - 0,// 48 - 2, - 3, - 3, - 2, - 2, - 1, -/* - 0, - 0,// 56 - 0, - 0, - 0, - 0, - 0, - 0, - 0 -*/ -}; -// */ - -// ========================================================= - void pedometer(); -static void hosu_increment(); + + + +// ========================================================= +#define PEDOMETER_LOG_SIZE ( 24 * 7 ) + + + +// ========================================================= #endif diff --git a/trunk/pm.c b/trunk/pm.c index 627e427..500b779 100644 --- a/trunk/pm.c +++ b/trunk/pm.c @@ -16,7 +16,8 @@ #include #include "fsl_user.h" -extern u16 pool[]; + + // ======================================================== @@ -71,7 +72,7 @@ err PM_LCD_on( ) vreg_ctr[VREG_C_STATUS] |= REG_BIT_LCD_POW; set_irq( VREG_C_IRQ3, REG_BIT_LCD_ON ); - SND_DEPOP_DEACT; // 1でミュート + SND_DEPOP_SND_ENABLE; } #ifdef _PMIC_TWL_ @@ -84,7 +85,7 @@ err PM_LCD_on( ) // BSR // void PM_LCD_off() { - SND_DEPOP_ACT; + SND_DEPOP_SND_MUTE; // BLついてたら消す #ifdef _PMIC_TWL_ @@ -230,14 +231,14 @@ err PM_LCD_on( ) { vreg_ctr[VREG_C_STATUS] |= REG_BIT_LCD_POW; set_irq( VREG_C_IRQ3, REG_BIT_LCD_ON ); - SND_DEPOP_DEACT; // 1でミュート + SND_DEPOP_SND_ENABLE; // 1でミュート return ( ERR_SUCCESS ); } void PM_LCD_off( ) { - SND_DEPOP_ACT; + SND_DEPOP_SND_MUTE; vreg_ctr[VREG_C_STATUS] &= ~REG_BIT_LCD_POW; set_irq( VREG_C_IRQ3, REG_BIT_LCD_OFF ); } @@ -559,7 +560,7 @@ task_status_immed ntr_pmic_comm( ) // CODECバグ回避 // リセット単品でなかったら無視 // codec 修正済↓ -// if( ( reg1_old ^ reg_shadow ) == REG_BIT_TWL_REQ_RST_REQ ) + if( ( reg1_old ^ reg_shadow ) == REG_BIT_TWL_REQ_RST_REQ ) { set_irq( VREG_C_IRQ2, REG_BIT_TWL_RESET_REQ ); } @@ -634,7 +635,7 @@ task_status_immed tski_PM_BL_set() void tsk_batt( ) { static u8 task_interval = 0; - static u8 charge_hys = 0; // ヒステリシスで上限下限を拡張するとき1 + static u8 temp_area = 0; // 温度で充電停止する時にヒステリシスを付けるため static bit pm_extdc_old; if( task_interval-- != 0 ) @@ -666,25 +667,26 @@ void tsk_batt( ) // 充電 /////////////////////////// // 温度付きヒステリシス - if( vreg_ctr[VREG_C_BT_TEMP] < 0x36 ) + if(( 86 < vreg_ctr[VREG_C_BT_TEMP] ) + && ( vreg_ctr[VREG_C_BT_TEMP] < 185 )) { - charge_hys = 1; + temp_area = 1; // 充電許可 + } + else if(( vreg_ctr[VREG_C_BT_TEMP] < 70 ) + || ( 189 < vreg_ctr[VREG_C_BT_TEMP] )) + { + temp_area = 0; // 充電禁止 + } + else + { + // temp_area そのまま } - if( ( 1 < vreg_ctr[VREG_C_BT_TEMP] ) - && ( vreg_ctr[VREG_C_BT_TEMP] < 0x2C ) ) - { - charge_hys = 0; - } - - if( ( ( charge_hys == 1 ) - && ( 1 < vreg_ctr[VREG_C_BT_TEMP] ) - && ( vreg_ctr[VREG_C_BT_TEMP] < 0x2C ) ) - || - ( ( charge_hys == 0 ) - && ( vreg_ctr[VREG_C_BT_TEMP] < 0x36 ) ) ) + if(( temp_area == 1 ) + && ( battery_manufacturer <= BT_VENDER_6 )) { #ifndef _MODEL_WM0_ +// CHG_ENABLEピンは /WL_RST に配線されているので BT_CHG_ENABLE(); // 温度範囲OKで充電再開 } else @@ -692,16 +694,12 @@ void tsk_batt( ) BT_CHG_DISABLE(); // 温度危険! 充電停止 #endif } -#ifdef _MODEL_WM0_ -// CHG_ENABLEピンは /WL_RST に配線されているので -#endif // 充電 // // →割り込み。miscの中でよろしくやってくれている。 set_bit( !BT_CHG_n, vreg_ctr[VREG_C_STATUS], REG_BIT_BATT_CHARGE ); LED_CHARGE = !BT_CHG_n ? 1 : 0; - // 電池残量 // if( system_status.pwr_state == ON ) { diff --git a/trunk/renge/renge_defs.h b/trunk/renge/renge_defs.h index bf0bb48..8b725b7 100644 --- a/trunk/renge/renge_defs.h +++ b/trunk/renge/renge_defs.h @@ -29,7 +29,8 @@ typedef unsigned char err; // ************************************ typedef enum{ ERR_SUCCESS = 0, - ERR_ERR + ERR_ERR, + ERR_SYSTEM_OFF }ERR; diff --git a/trunk/renge/renge_task_intval.h b/trunk/renge/renge_task_intval.h index b5588db..e06c9e9 100644 --- a/trunk/renge/renge_task_intval.h +++ b/trunk/renge/renge_task_intval.h @@ -1,10 +1,11 @@ /*スクリプトによる自動生成です。手動で書き換えない方がよいです*/ +#include "renge_defs.h" + + #ifndef __renge_task__ #define __renge_task__ -#include "renge_defs.h" - enum { TSK_SW, TSK_ADC, TSK_BATT, TSK_LED_POW, TSK_LED_WIFI, TSK_LED_NOTIFY, TSK_LED_CAM, TSK_MISC_STAT, TSK_DEBUG, TSK_DEBUG2, TSK_SYS, TSK_LAST }; @@ -21,7 +22,8 @@ extern void tsk_debug(); extern void tsk_debug2(); extern void tsk_sys(); -static const task_status ( *tasks[ TSK_LAST ] )() = { + +const void ( *tasks[ TSK_LAST ] )() = { tsk_sw, tsk_adc, tsk_batt, @@ -35,5 +37,6 @@ static const task_status ( *tasks[ TSK_LAST ] )() = { tsk_sys, }; - #endif + + diff --git a/trunk/self_flash.c b/trunk/self_flash.c index 57f7a51..4b731f7 100644 --- a/trunk/self_flash.c +++ b/trunk/self_flash.c @@ -15,6 +15,7 @@ #include "fsl_user.h" #include "i2c_ctr.h" +#include "pool.h" // ======================================================== @@ -24,6 +25,7 @@ const u8 fsl_low_voltage_u08 = 1; // 自己フラッシュパラメータ #define SAM_BLOCK_SIZE 1024 + // ↓256バイト以上はまとめてかけません。 #define SELF_UPDATE_BUFF_SIZE 256 #define SELF_UPDATE_SPLIT_WRITE_NUM ( SAM_BLOCK_SIZE / SELF_UPDATE_BUFF_SIZE ) #define SAM_WORD_SIZE 4 @@ -36,8 +38,6 @@ const u8 fsl_low_voltage_u08 = 1; #ifdef _MCU_BSR_ - - #define ACKD ACKD1 #define ACKE ACKE1 #define COI COI1 @@ -72,12 +72,12 @@ static void FSL_Close( void ); void firm_restore( ); static err my_FSL_Init(); -static err firm_duplicate( __far u8 * p_rom, u8 block_dest ); +static err firm_duplicate( u8 block_src, u8 block_dest ); // ======================================================== -extern u16 pool[]; +extern uni_pool pool; // 0.D以降 新アップデータ向け @@ -102,11 +102,12 @@ void firm_update( ) my_FSL_Init(); /* ファームのバックアップ + 開始アドレス、書き込み先の先頭”ブロック番号” (サイズは FIRM_SIZE) 0x2000 - 0x4FFF を 0x5000 - 0x7FFF (ブロック 20 - 31) にコピー */ - firm_duplicate( ( __far u8 * ) 0x2000, - ( 0x5000 / 0x0400 ) ); + firm_duplicate( FIRM_TOP, + UPDATE_BLOCK_LAST +1 ); // 全ブロック削除 ///////////////////////////////////// // 電源断を判定するため、最初に全クラスタ消去する @@ -134,36 +135,37 @@ void firm_update( ) && ( !SPD ) ); split_write_count += 1 ) { - u8* p_buffer = pool; - u8 buffer_fill = 0; + u8* p_buffer = &pool.self_update_work[0]; + u16 buff_written_size = 0; - WDT_Restart( ); // I2Cから書き込みデータをバッファにためる do { - while( !IICAIF && !SPD ){;} + while( !IICAIF && !SPD ) + { + WDT_Restart( ); + } IICAIF = 0; *p_buffer = IICA; WREL = 1; p_buffer += 1; - buffer_fill += 1; + buff_written_size += 1; } - while( ( buffer_fill != ( u8 ) SELF_UPDATE_BUFF_SIZE ) && !SPD ); + while( ( buff_written_size != SELF_UPDATE_BUFF_SIZE ) + && !SPD ); // 書き込み // 最後だと、ゴミをパディングするが別にかまわない if( FSL_Write( ( fsl_u32 ) ( target_block * SAM_BLOCK_SIZE - + - split_write_count * - SELF_UPDATE_BUFF_SIZE ), - ( fsl_u08 ) ( SELF_UPDATE_BUFF_SIZE / SAM_WORD_SIZE ) ) + + split_write_count * SELF_UPDATE_BUFF_SIZE ), + ( fsl_u08 ) ( SELF_UPDATE_BUFF_SIZE / SAM_WORD_SIZE ) ) != FSL_OK ) { // 書き込み後のチェックエラー // リストア - firm_duplicate( ( __far u8 * ) 0x5000, + firm_duplicate( UPDATE_BLOCK_LAST +1, FIRM_TOP ); FSL_ForceReset(); // 戻ってこない // @@ -173,7 +175,11 @@ void firm_update( ) // 1ブロック書き込み完了。内部ベリファイを行う if( FSL_IVerify( target_block ) != FSL_OK ){ // todo 再度消去→書き込み ベリファイを繰り返すだけじゃダメでした... - NOP(); + // リストア + firm_duplicate( UPDATE_BLOCK_LAST +1, + FIRM_TOP ); + FSL_ForceReset(); + // 戻ってこない // } if( SPD ) @@ -205,7 +211,7 @@ void firm_update( ) { // データ(マジックナンバーしか見てない)エラー // リストア - firm_duplicate( ( __far u8 * ) 0x5000, + firm_duplicate( UPDATE_BLOCK_LAST, FIRM_TOP ); FSL_ForceReset(); // リセット // 戻ってこない // @@ -230,7 +236,7 @@ void firm_restore( ) 0x4800 - 0x7FFF (ブロック 18 - 27) から 0x2000 - 0x47FF (ブロック 8 - 17) へコピー */ - firm_duplicate( ( __far u8 * ) 0x5000, + firm_duplicate( UPDATE_BLOCK_LAST +1, FIRM_TOP ); // todo //  リストア失敗したら、LEDちかちかとかさせて、サービス送りにしてもらう @@ -304,11 +310,14 @@ static void FSL_Close( void ) コピー先に書けるようにmy_FSL_Initをあらかじめ実行する必要があります。 ======================================================== */ -static err firm_duplicate( __far u8 * p_rom, - u8 block_dest ) +//static err firm_duplicate( __far u8 * p_rom, +// u8 block_dest ) +static err firm_duplicate( u8 block_src, + u8 block_dest ) { u8 target_block; u8 split_write_count; // ブロックへちまちま書き込むカウンタ + __far u8* p_src = ( __far u8* )( block_src * 0x400 ); // 書き込み先ブロックの数だけ繰り返す for( target_block = block_dest; @@ -327,29 +336,28 @@ static err firm_duplicate( __far u8 * p_rom, split_write_count < SELF_UPDATE_SPLIT_WRITE_NUM; split_write_count += 1 ) { - u8 buffer_fill; + u16 buff_written_size; u8* p_buff; // 書き込みデータをバッファにためる - buffer_fill = 0; - p_buff = pool; + buff_written_size = 0; + p_buff = &pool.self_update_work[0]; do { - *p_buff = *p_rom; - p_rom += 1; + *p_buff = *p_src; + p_src += 1; p_buff += 1; - buffer_fill +=1; + buff_written_size +=1; } - while( buffer_fill != ( u8 ) SELF_UPDATE_BUFF_SIZE ); + while( buff_written_size != SELF_UPDATE_BUFF_SIZE ); // 書き込み if( FSL_Write( ( fsl_u32 ) ( target_block * SAM_BLOCK_SIZE - + - split_write_count * - SELF_UPDATE_BUFF_SIZE ), - ( fsl_u08 ) ( SELF_UPDATE_BUFF_SIZE / SAM_WORD_SIZE ) ) + + split_write_count * SELF_UPDATE_BUFF_SIZE ), + ( fsl_u08 ) ( SELF_UPDATE_BUFF_SIZE / SAM_WORD_SIZE ) ) != FSL_OK ) { + // todo リカバリ? // FSL_Close( ); return ( ERR_ERR ); } @@ -377,7 +385,7 @@ static err my_FSL_Init() DI( ); FSL_Open( ); // 割り込み禁止など - FSL_Init( pool ); // ライブラリ初期化。割り込み中断考慮せず + FSL_Init( &pool.self_update_work[0] ); // ライブラリ初期化。割り込み中断考慮せず FSL_ModeCheck( ); // ライトプロテクトチェック。失敗することを考慮せず return( ERR_SUCCESS ); @@ -386,12 +394,11 @@ static err my_FSL_Init() task_status_immed tski_mcu_reset() { - WDT_Restart( ); // 普通に再起動 my_FSL_Init(); FSL_SwapBootCluster(); -// FSL_ForceReset(); // リセット + FSL_ForceReset(); // リセット FSL_Close( ); // 保険? // diff --git a/trunk/task_sys.c b/trunk/task_sys.c index 04b9d57..63ece94 100644 --- a/trunk/task_sys.c +++ b/trunk/task_sys.c @@ -90,7 +90,7 @@ void tsk_sys( ) system_status.pwr_state = OFF_TRIG; return; } - + // 残量チェック BT_get_left(); // 先に、BT_init()が実行されている必要があります。(大丈夫) if( vreg_ctr[VREG_C_BT_REMAIN] < 5 ) @@ -265,6 +265,9 @@ void tsk_sys( ) } PM_sys_pow_off( ); + while( iic_mcu_busy ) + {; + } KRM = ( KR_SW_POW ); // Mask ではなく、Modeなのだそうだ。紛らわしい // intp20系は後ほど @@ -354,21 +357,59 @@ void tsk_sys( ) **********************************************************/ static void chk_emergencyExit(){ #ifndef _PARRADIUM_ - if( !RESET1_n ) + static u8 shirobako_power_control; + + if( shirobako_power_control == 0 ) // PM_chk_LDSW() はI2C_mを使用し、高コスト { - if( PM_chk_LDSW( ) == 0 ) + if( !RESET1_n ) { - // PMICが異常終了判断をした + // リセットが下がってる + if( PM_chk_LDSW( ) == 0 ) + { + // PMICが異常終了判断をした + system_status.pwr_state = OFF_TRIG; + renge_task_interval_run_force = 1; + } + else + { + // 白箱の仕業 + shirobako_power_control = 1; + } + } + } + else + { + if( shirobako_power_control == 240 ) + // デバッガが何かした。reset1を解除するまでは無視 + { + if( RESET1_n ) + { + shirobako_power_control = 0; + } + }else if( shirobako_power_control == 200 ) + // デバッガが何かしたいらしい + { + // 白箱は電源を切りたいらしい system_status.pwr_state = OFF_TRIG; renge_task_interval_run_force = 1; + shirobako_power_control = 240; } else { - // デバッガなりがリセットをかけた - iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_BL, 0 ); - vreg_ctr[VREG_C_STATUS] = ( vreg_ctr[VREG_C_STATUS] & 0b10011111 ); - vreg_ctr[VREG_C_COMMAND0] |= REG_BIT_RESET1_REQ; - renge_task_immed_add( do_command0 ); + if( !RESET1_n ) + { + shirobako_power_control += 1; + } + else + { + + // リセットをかけたらしい + iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_BL, 0 ); + vreg_ctr[VREG_C_STATUS] = ( vreg_ctr[VREG_C_STATUS] & 0b10011111 ); + vreg_ctr[VREG_C_COMMAND0] |= REG_BIT_RESET1_REQ; + renge_task_immed_add( do_command0 ); + shirobako_power_control = 240; + } } } #endif diff --git a/trunk/user_define.h b/trunk/user_define.h index 2ac7b6a..cdd61a3 100644 --- a/trunk/user_define.h +++ b/trunk/user_define.h @@ -118,11 +118,11 @@ // INTP6 #ifndef _MODEL_CTR_ -#define SND_DEPOP_ACT P7.6 = 1 -#define SND_DEPOP_DEACT P7.6 = 0 +#define SND_DEPOP_SND_MUTE P7.7 = 1 +#define SND_DEPOP_SND_ENABLE P7.7 = 0 #else -#define SND_DEPOP_ACT ; -#define SND_DEPOP_DEACT ; +#define SND_DEPOP_SND_MUTE ; +#define SND_DEPOP_SND_ENABLE ; #endif // PM @@ -194,8 +194,10 @@ #endif #ifdef _MODEL_CTR_ -#define I2C_PU_on() { PM14 |= 0x03; P5 |= 0x09; P14 |= 0x03; PM14 &= ~0x03; } -#define I2C_PU_off() { PM14 |= 0x03; P5 &= 0x09; } +// 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; } #endif diff --git a/trunk/vreg_ctr.c b/trunk/vreg_ctr.c index d099022..b418c00 100644 --- a/trunk/vreg_ctr.c +++ b/trunk/vreg_ctr.c @@ -19,12 +19,8 @@ extern u8 mcu_info_read(); // task_misc.c // ******************************************************** u8 vreg_ctr[VREG_C_ENDMARK_]; - bit irq_readed; // AAA型のため。 -extern bit update; -extern u16 pool[]; - // ******************************************************** extern task_status_immed tski_firm_update(); diff --git a/trunk/vreg_twl.c b/trunk/vreg_twl.c index 2a162c5..666a773 100644 --- a/trunk/vreg_twl.c +++ b/trunk/vreg_twl.c @@ -5,10 +5,11 @@ TWL ======================================================== */ #include "incs.h" #include "jhl_defs.h" +#include "led.h" + #include "vreg_twl.h" #include "vreg_ctr.h" -#include "renge\renge_task_intval.h" // ======================================================== #define TWL_REG_VER_INFO 0x35 diff --git a/trunk/vreg_twl.h b/trunk/vreg_twl.h index b52ec28..0dc1b35 100644 --- a/trunk/vreg_twl.h +++ b/trunk/vreg_twl.h @@ -116,7 +116,7 @@ void vreg_twl_write( u8 adrs, u8 data ); u8 adrs_table_twl_ext2int( u8 img ); u8 vreg_twl_read( u8 phy_adrs ); -task_status_immed command_from_twl( ); +extern task_status_immed command_from_twl( ); // 読んだらクリアなどの処理 diff --git a/trunk/yav_mcu_bsr.prj b/trunk/yav_mcu_bsr.prj index 6cf09e6..c4bf64b 100644 --- a/trunk/yav_mcu_bsr.prj +++ b/trunk/yav_mcu_bsr.prj @@ -36,9 +36,6 @@ TargetFile=0 [BuildMode5] BuildModeName=BSR_WM0 TargetFile=0 -[BuildBefore-AfterCmd] -Before1=touch magic.c -After1=ruby nec_s_2_bsrbin2.rb bsr.hex [Options.OC78K0R 0] Version=100 O0=.\bsr.hex @@ -254,30 +251,6 @@ Version=100 LCNV_GO=0 E=0 CommandFile=0 -[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=ini_VECT.c -Source10=led.c -Source11=rtc.c -Source12=vreg_ctr.c -Source13=vreg_twl.c -Source14=adc.c -Source15=renge\renge.c -Source16=accero.c -Source17=self_flash.c -Source18=reboot.c -Source19=sw.c -Source20=task_debug.c -Source21=task_misc.c -Source22=task_sys.c -Source23=pedo_alg_thre_det2.c [Options.LK78K0R 0] Version=100 O0=bsr_k0r.lmf @@ -539,44 +512,6 @@ 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 -[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 [Options.CC78K0R 0] Version=210 Include0=renge,C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r @@ -1043,3 +978,69 @@ 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 +[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=ini_VECT.c +Source10=led.c +Source11=rtc.c +Source12=vreg_ctr.c +Source13=vreg_twl.c +Source14=adc.c +Source15=renge\renge.c +Source16=accero.c +Source17=self_flash.c +Source18=sw.c +Source19=task_debug.c +Source20=task_misc.c +Source21=task_sys.c +Source22=pedo_alg_thre_det2.c +[BuildBefore-AfterCmd] +Before1=touch magic.c +After1=ruby nec_s_2_bsrbin2.rb bsr.hex +[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