diff --git a/branches/sim/WDT.c b/branches/sim/WDT.c new file mode 100644 index 0000000..965b09c --- /dev/null +++ b/branches/sim/WDT.c @@ -0,0 +1,5 @@ +#pragma sfr + + +#include "incs_loader.h" + diff --git a/branches/sim/WDT.h b/branches/sim/WDT.h new file mode 100644 index 0000000..2e28e9d --- /dev/null +++ b/branches/sim/WDT.h @@ -0,0 +1,20 @@ +#ifndef _WDT_ +#define _WDT_ + + + +//========================================================= +#define WDT_RESTART_MAGIC 0xAC + + + +//========================================================= +// ウォッチドッグタイマのリスタート +// void WDT_Restart( void ); +#define WDT_Restart() WDTE = WDT_RESTART_MAGIC + +// 規定値以外を書くと例外でリセットがかかる +#define mcu_wdt_reset WDTE = 0x0 + + +#endif diff --git a/branches/sim/accero.c b/branches/sim/accero.c new file mode 100644 index 0000000..a5a3353 --- /dev/null +++ b/branches/sim/accero.c @@ -0,0 +1,247 @@ +/* ======================================================== + 加速度センサ関係 +・データ更新完了でデータを吸い上げ手レジスタを更新、CPUに割り込み +・フラグが立っていれば歩数カウント +・加速度センサ割り込みからタスクを登録して下さい。(I2Cの競合回避などがあるので) + + ======================================================== */ +#pragma SFR +#pragma NOP +#pragma HALT +#pragma STOP +#pragma ROT +// rorb, rolb, rorw, rolw +#pragma MUL +#pragma BCD + + + +#include "config.h" +#ifdef _MCU_BSR_ +#pragma interrupt INTP23 intp23_ACC_ready RB3 // 加速度センサ、データ準備完了 +#endif + + +#include "incs.h" + +#ifndef _WIN32 +#include +#endif +// ======================================================== +// レジスタ名 +#define ACC_REG_WHOAMI 0x0F +#define ACC_REG_CTRL1 0x20 +#define ACC_REG_CTRL5 0x24 +#define ACC_REG_X 0x28 + +// ビット位置 +#define ACC_bP_PM0 5 +#define ACC_bP_DR0 3 + +// ビット設定値 +#define ACC_BITS_PM_PDN 0 +#define ACC_BITS_PM_NORM 1 +#define ACC_BITS_PM_LP0R5 2 +#define ACC_BITS_PM_LP1 3 +#define ACC_BITS_PM_LP2 4 +#define ACC_BITS_PM_LP5 5 +#define ACC_BITS_PM_LP10 6 + +#define ACC_BITS_DR_50Hz 0 +#define ACC_BITS_DR_100Hz 1 +#define ACC_BITS_DR_400Hz 2 +#define ACC_BITS_DR_1000Hz 3 + +#define ACC_BITS_ALL_AXIS_ON 7 + + +#define VREG_BITMASK_ACC_CONF_ACQ ( 1 << 0 ) +#define VREG_BITMASK_ACC_CONF_HOSU ( 1 << 1 ) + + + + +// ======================================================== +task_status tsk_soft_int( ); + + + +/* ======================================================== + ・割り込みを確認してデータを吸い上げ、レジスタに書き出します + ・本当であればコールバック関数を登録しておけばいいじゃんとなるのですが、 + I2Cが使用中だったら?とか考えると私ではそこまでできないのです。 + ・自動歩数計とかでも結局 + ======================================================== */ +task_status_immed tski_cbk_accero( ) +{ // (疑似)isrから登録されます + static u8 err_count; + + // 加速度センサデータレジスタへの反映 + if( iic_mcu_read( IIC_SLA_ACCEL, ( ACC_REG_X | 0x80 ), 6, &vreg_ctr[VREG_C_ACC_XL] ) + != ERR_SUCCESS ) + { + err_count += 1; + if( err_count < 8 ) + { + // リトライ + return( ERR_CONTINUE ); + } + else + { + // 加速度センサが異常になったので止める + vreg_ctr[ VREG_C_ACC_CONFIG ] &= ~( VREG_BITMASK_ACC_CONF_HOSU | VREG_BITMASK_ACC_CONF_ACQ ); + tski_acc_hosu_set(); + vreg_ctr[ VREG_C_STATUS_1 ] |= REG_BIT_ACCERO_ERR; + return ( ERR_FINISED ); // タスクの削除は必要 + } + } + else + { + err_count = 0; + // 正常時パス // + // 加速度更新&割り込み + if( (( vreg_ctr[VREG_C_ACC_CONFIG] & VREG_BITMASK_ACC_CONF_ACQ ) != 0 ) && + ( system_status.pwr_state == ON ) + ) + { + set_irq( VREG_C_IRQ1, REG_BIT_ACC_DAT_RDY ); + // ゴミデータのカラ読み + if( ACC_VALID ) + { + u8 temp[6]; + iic_mcu_read( IIC_SLA_ACCEL, ( ACC_REG_X | 0x80 ), 6, temp ); + } + } + if(( system_status.pwr_state != ON_CHECK ) + &&( system_status.pwr_state != OFF ) +#ifndef _DBG_PEDO_AUTO_ENABLE_ + &&( ( vreg_ctr[VREG_C_ACC_CONFIG] & VREG_BITMASK_ACC_CONF_HOSU ) != 0 ) +#endif + ) + { + pedometer(); // 歩数計 + } + } + return ( ERR_FINISED ); +} + + + + + +/*======================================================= + 加速度センサ透過アクセス リード + ========================================================*/ +task_status_immed tski_acc_read( ) +{ + vreg_ctr[VREG_C_ACC_W_BUF] = iic_mcu_read_a_byte( IIC_SLA_ACCEL, vreg_ctr[VREG_C_ACC_R_ADRS] ); +// vreg_ctr[ VREG_C_ACC_R_BUF ] = iic_mcu_read_a_byte( IIC_SLA_ACCEL, vreg_ctr[VREG_C_ACC_R_ADRS] ); + vreg_ctr[VREG_C_IRQ1] |= REG_BIT_ACC_ACK; + if( ( vreg_ctr[VREG_C_IRQ_MASK1] & REG_BIT_ACC_ACK ) == 0 ) + { + IRQ0_ast; + } + return ( ERR_FINISED ); +} + + + +/*========================================================= + 加速度センサ透過アクセス ライト + ========================================================*/ +task_status_immed tski_acc_write( ) +{ + iic_mcu_write_a_byte( IIC_SLA_ACCEL, vreg_ctr[VREG_C_ACC_W_ADRS], vreg_ctr[VREG_C_ACC_W_BUF] ); + vreg_ctr[VREG_C_IRQ1] |= REG_BIT_ACC_ACK; + if( ( vreg_ctr[VREG_C_IRQ_MASK1] & REG_BIT_ACC_ACK ) == 0 ) + { + IRQ0_ast; + } + return ( ERR_FINISED ); +} + + + +/*========================================================= + 加速度センサの設定 + ========================================================*/ +task_status_immed tski_acc_hosu_set( ) +{ + u8 str_send_buf[4]; + + iic_mcu_read_a_byte( IIC_SLA_ACCEL, ACC_REG_WHOAMI ); + if( iic_mcu_result == ERR_NOSLAVE ) + { + vreg_ctr[ VREG_C_STATUS_1 ] |= REG_BIT_ACCERO_ERR; + return ( ERR_FINISED ); // とりあえず、タスクは削除しなくてはならない + }else{ + vreg_ctr[ VREG_C_STATUS_1 ] &= ~REG_BIT_ACCERO_ERR; + } + + str_send_buf[1] = 0x00; // ctrl2 HPF:normal, filterd, HPF for IRQ : dis/dis, HPF coeff:norm +/* +if( system_status.model == MODEL_TS_BOARD ) + { + // TS Final SoC + str_send_buf[2] = 0x02; // 3 IRQ pol :Active HI, Drive:Pushpull, + } + else + { + // 実機&派生種、白箱 + str_send_buf[2] = 0x10; // 3 IRQ pol :Active HI, Drive:Pushpull, + } +*/ + str_send_buf[2] = 0b00010010; // 面倒なので両方...。 + str_send_buf[3] = 0x80; // ctrl3 block update:enable, MSB first, scale: +-2G(default), selftest: dis + + if( ( vreg_ctr[VREG_C_ACC_CONFIG] & + ( VREG_BITMASK_ACC_CONF_HOSU | VREG_BITMASK_ACC_CONF_ACQ ) ) == 0 ) + { + PMK23 = 1; + // 完全停止 + str_send_buf[0] = + ( ACC_BITS_PM_PDN << ACC_bP_PM0 | 0 << ACC_bP_DR0 | ACC_BITS_ALL_AXIS_ON ); + } + else + { + PMK23 = 0; + // 100Hz 自動取り込み + str_send_buf[0] = + ( ACC_BITS_PM_NORM << ACC_bP_PM0 + | ACC_BITS_DR_100Hz << ACC_bP_DR0 + | ACC_BITS_ALL_AXIS_ON ); + } + iic_mcu_write( IIC_SLA_ACCEL, ( ACC_REG_CTRL1 | 0x80 ), 4, str_send_buf ); + + // カラ読み + if( ACC_VALID ) + { + if( system_status.pwr_state == ON ) + { + u8 temp[6]; + iic_mcu_read( IIC_SLA_ACCEL, ( ACC_REG_X | 0x80 ), 6, temp ); + } + } + return ( ERR_FINISED ); +} + + + +/* ======================================================== + 加速度センサ割り込み + I2Cが使用中かもしれないので、読み出しタスクの登録を行うのみ + ======================================================== */ +__interrupt void intp23_ACC_ready( ) +{ + EI(); + if( ( vreg_ctr[VREG_C_ACC_CONFIG] & 0x03 ) != 0x00 ) + { + if( ( system_status.pwr_state == ON ) || ( system_status.pwr_state == SLEEP ) ) + { + if( ACC_VALID ) + { + renge_task_immed_add( tski_cbk_accero ); + } + } + } +} diff --git a/branches/sim/accero.h b/branches/sim/accero.h new file mode 100644 index 0000000..20494b9 --- /dev/null +++ b/branches/sim/accero.h @@ -0,0 +1,14 @@ +#ifndef _accero_ +#define _accero_ + + +#include "jhl_defs.h" +#include "pedometer.h" + + +/////////////////////////////////////////////////////////// +task_status_immed tski_cbk_accero( ); +task_status_immed tski_acc_hosu_set( ); + + +#endif diff --git a/branches/sim/adc.c b/branches/sim/adc.c new file mode 100644 index 0000000..99c093f --- /dev/null +++ b/branches/sim/adc.c @@ -0,0 +1,584 @@ +/* ======================================================== + 藤田@開技 + nintendo + '09 Apr + ======================================================== */ +#include "incs.h" +#include "adc.h" +#include "pm.h" + +#include "led.h" + +#include "vreg_twl.h" + +#define _10db_ +#include "voltable.h" + + +// ===================================================== // +bit adc_updated; +bit vol_changed_by_ctr; +bit vol_changed_by_twl; +u8 vol_old; + + +u8 adc_raw_vol; +u8 adc_raw_dep; + +u8 vol_polling; + +u8 vol_level_twl; + + +typedef struct filter_work +{ + u8* value_used; + s8 diffs; // KIKAN中の偏り具合 + s8 kikan; + u8 large_diff_count; +}filter_work; + + +filter_work work_vr_3d = { + &vreg_ctr[ VREG_C_3D ] + }; + + +u8 vol_data_ctr; +u8 vol_data_ctr_tmp; +filter_work work_vr_vol = { + &vol_data_ctr_tmp + }; + + +// twl の8段階volのリニア値からの境界 +/* + twl内の32 -> 8 テーブル + 0〜1,〜4,〜8,〜13,〜18,〜23,〜28,31 + */ +const u8 TWL_VOL_BOUNDARY[] = { + 1, 4, 8, 13, 18, 23, 28, 31 +}; + +// ===================================================== // +extern void nop8(); +static void adc_filter( u8 new_val, filter_work* work ); +static u8 adc_scaling( u8 ); + + + +// ===================================================== // +#define INTERVAL_TSK_ADC 15 + + + +/* ======================================================== + ADC設定と、開始 + + 以下のピンは主にここで操作・監視されます。 + ・BT_TEMP,_P + ・ADIN1 + ・VOL + + 関係ありそうですが別のところで管理しています + ・PM_BT_DET,_P BT_chk + ======================================================== */ +void tsk_adc( ) +{ + static u8 old_3D; + static u8 sndvol_codec; + static u8 bt_temp_old; + + if( adc_updated ) + { + adc_updated = false; + + // 3D ///////////////////////////////////////// + vreg_ctr[ VREG_C_3D ] = adc_raw_dep; // 生値 + + // Volume ///////////////////////////////////// + { + vreg_ctr[ VREG_C_VOL_ADC_RAW ] = adc_raw_vol; + + adc_filter( adc_scaling( adc_raw_vol ), &work_vr_vol ); // 結果は*work_vr_volから指されるvol_data_ctr 読みにくい... + vol_data_ctr = vol_data_ctr_tmp / 4; + + if( vol_old != vol_data_ctr ) + { + vol_changed_by_ctr = true; + vol_old = vol_data_ctr; + vol_polling = 3; +// renge_task_immed_add( tski_vol_update ); ↓で登録 + } + } + + // バッテリ識別 /////////////////////////// + /* 呼ばれません */ + } + + // 書き忘れがあるといやなのでポーリング orz + if( vol_polling < 5 ) + { + renge_task_immed_add( tski_vol_update ); + vol_polling = 200 / SYS_INTERVAL_TICK + 5; // 5回/sec + } + vol_polling -= 1; + + + ADCEN = 1; + ADM = 0b00001011; // セレクトモード、昇圧、fCLK/6 ///ここから ↓ + + ADPC = 0x06; // ADCポートのセレクト + ADS = ADC_SEL_3D; + nop8(); + ADCS = 1; // AD開始。 /// ここまで ↑ までに1us=8clk以上開ける + + ADIF = 0; + ADMK = 0; +} + + + +void vol_reset() +{ + vol_old = vol_data_ctr; + vreg_ctr[ VREG_C_SND_VOL ] = vol_data_ctr; // 64段 +} + + +/* ======================================================== + Volを更新します。 +  こんな時に登録されます。 +  ・ユーザーがVolスライダを動かした +  ・Horizonに強制更新を指示された (codecリセット時) +  ・TWLアプリがVolをいじった +======================================================== */ +task_status_immed tski_vol_update() +{ + static u8 sent_index, sent_index_twl; + static u8 sent_data; + static bit last_modifyer_is_twl; // 0 = ctr + + if( !( system_status.pwr_state == ON ) || + ( system_status.pwr_state == SLEEP )){ + return( ERR_FINISED ); + } + + // どの音量にするの? // + if( vreg_ctr[ VREG_C_VOL_OPTION ] & ( REG_BIT_VOL_UPDATE_TO_SLIDER ) ) + { + // debug // + NOP(); + // 最優先 スライダに上書き + sent_index = vol_data_ctr; + vreg_ctr[ VREG_C_VOL_OPTION ] &= ~REG_BIT_VOL_UPDATE_TO_SLIDER; + } + else if( vol_changed_by_ctr ) + { + // スライダ + vol_changed_by_ctr = false; + last_modifyer_is_twl = false; + sent_index = vol_data_ctr; + } + else if( vol_changed_by_twl ) + { + // TWLアプリ + vol_changed_by_twl = false; + last_modifyer_is_twl = true; + if( vreg_twl[ REG_TWL_INT_ADRS_VOL ] == 0 ) + { + sent_index_twl = 0; + } + else + { + sent_index_twl = vreg_twl[ REG_TWL_INT_ADRS_VOL ] *2 +1; + } + sent_index = sent_index_twl; + } + else + { + // force_sliderを0にしたとき & 書きまくるとき + // スライダかTWLの最後にセットした方をセット + if( last_modifyer_is_twl ) + { + sent_index = sent_index_twl; + } + else + { + sent_index = vol_data_ctr; + } + } + + // レジスタの更新 // + vreg_ctr[ VREG_C_SND_VOL ] = sent_index; + // スケーリング + if( sent_index == 0 ) + { + vreg_twl[ REG_TWL_INT_ADRS_VOL ] = 0; + } + else if( sent_index <= 4 ) + { + vreg_twl[ REG_TWL_INT_ADRS_VOL ] = 2; + } + else + { + vreg_twl[ REG_TWL_INT_ADRS_VOL ] = sent_index/2 ; + } + + // 8段階のレベル化。 割り込みを入れるのに必要 + { + static u8 vol_twl_old; + + if( vol_twl_old != vreg_twl[ REG_TWL_INT_ADRS_VOL ] ) + { + // 8段レベルに変換 + u8 new_level = 31; + u8 i; + + vol_twl_old = vreg_twl[ REG_TWL_INT_ADRS_VOL ]; + + for( i=0; i<=7; i++ ) + { + if( vreg_twl[ REG_TWL_INT_ADRS_VOL ] <= TWL_VOL_BOUNDARY[ i ] ) + { + new_level = i; + break; + } + } + vol_level_twl = new_level; + } + } + + + // CODECに書きに行く? + if( vreg_ctr[ VREG_C_VOL_OPTION ] & REG_BIT_VOL_BY_SPI ) + { + return( ERR_FINISED ); + // by SPI ならここまででおしまい // + } + + // codecに伝える + /// 同値でも書く + iic_mcu_write_a_byte_codec( CODEC_REG_VOL, slider_to_codec[ sent_index ] ); + + // set_irq( VREG_C_IRQ0, REG_BIT_VR_SNDVOL_CHANGE ); // 割り込み廃止 + return( ERR_FINISED ); +} + + + +/* ======================================================== + 過去3つのminでもMAXでもない値を返す +  突発的なノイズを除く。 +  運が悪いと振動するよ +======================================================== */ +static u8 getmean3( u8 * hist ) +{ + if( *hist > *( hist + 1 ) ) + { + if( *hist > *( hist + 2 ) ) + { + return( ( *( hist + 1 ) > *( hist + 2 ) ) ? *( hist + 1 ) : *( hist + 2 ) ); + } + else + { + return( *hist ); + } + }else{ + if( *hist > *( hist + 2 ) ) + { + return( *hist ); + } + else + { + return( ( *( hist + 1 ) < *( hist + 2 ) ) ? *( hist + 1 ) : *( hist + 2 ) ); + } + } +} + + + +/* ======================================================== + 自前で次のチャンネル +  一通り終わったら止める + ======================================================== */ +__interrupt void int_adc( ) +{ + static u8 hist_3D[3]; + static u8 hist_snd_vol[3]; + static u8 hist_bt_temp[3]; + static u8 index; + + volatile u8 adc_data; + + adc_data = ADCRH; + + switch ( ADS ) + { +/* +case ( ADC_SEL_AMB_BRIT ): // 環境明るさ + vreg_ctr[ VREG_C_AMBIENT_BRIGHTNESS ] = adc_data; + break; +*/ + + case ( ADC_SEL_3D ): + EI(); + adc_raw_dep = adc_data; + break; + + case ( ADC_SEL_VOL ): + EI(); + if( system_status.model == MODEL_TS_BOARD ) + { + adc_raw_vol = adc_data; + } + else + { + adc_raw_vol = 255 - adc_data; + } + + break; + + case ( ADC_SEL_BATT_TEMP ): + EI(); + raw_adc_temperature = adc_data; +#ifdef _DEBUG_BT_TEMP_ + if( vreg_ctr[ VREG_C_COMMAND3 ] == 't' ) + { + raw_adc_temperature = vreg_ctr[ VREG_C_DBG01 ]; + } +#endif + + if( (( vreg_ctr[ VREG_C_STATUS_1 ] & REG_BIT_MGIC_ERR ) == 0 ) && + (( system_status.pwr_state == ON ) || + ( system_status.pwr_state == SLEEP ) + ) + ) + { + renge_task_immed_add( tski_BT_temp_update ); + } + break; + +/* 呼ばれません + case ( ADC_SEL_BATT_DET ): + break; +*/ + } + +// もっとまともな書き方がありそうだ + if( ADS < ADC_SEL_BATT_DET ) + { + ADS += 1; // 次のチャンネル + } + else + { + ADCEN = 0; // 止めてしまう + adc_updated = true; + index = ( index == 2 ) ? 0 : ( index + 1 ); // ノイズ取りの配列インデックス + } + ADIF = 0; // ←これをしないと、いっこ前のチャンネルのデータの完了で直後に割り込む可能性がある +} + + + +/* ======================================================== + tsk_adcと競合することを考慮していません。 + ======================================================== */ +u8 get_adc( u8 ch ) +{ + u8 temp; + + ADMK = 1; + ADIF = 0; + + ADCEN = 1; + ADM = 0b00001011; // セレクトモード、昇圧、fCLK/6 ///ここから↓ + + ADPC = 0x06; // ADCポートのセレクト + ADS = ch; + + nop8(); + + ADCS = 1; // AD開始。 /// ここまで↑ に、1us以上開ける + + ADIF = 0; + while( ADIF == 0 ){;} + temp = ADCRH; + ADCEN = 0; + + ADMK = 0; + return ( temp ); +} + + + + + +/* ======================================================== + VRの可動範囲を考えてスケーリング + + 音量Vol専用 使い回すならそのときどうにかする +======================================================== */ +static u8 adc_scaling( u8 orig_val ) +{ + u16 temp; + + if( orig_val <= vreg_ctr[ VREG_C_VOL_CAL_MIN ] ) + { + return( 0 ); + } + if( orig_val >= vreg_ctr[ VREG_C_VOL_CAL_MAX ] ) + { + return( 255 ); + } + + temp = (u16)(( orig_val - vreg_ctr[ VREG_C_VOL_CAL_MIN ] ) * 256 ) / ( vreg_ctr[ VREG_C_VOL_CAL_MAX ] - vreg_ctr[ VREG_C_VOL_CAL_MIN ] ); + if( temp > 255 ) + { + temp = 255; + } + + return( (u8)( temp & 0xFF ) ); +} + + + + +/* ======================================================== + 似非ヒステリシス V2 + 四捨五入的な動きします +======================================================== */ +#define KIKAN 16 +static void adc_filter( u8 new_val, filter_work *work ) +{ + u8 temp; + if( abs( new_val - *( work -> value_used )) > 2 ) + { + // 大きく離れた + work -> large_diff_count += 1; + if( work -> large_diff_count > 16 ) + { + *( work -> value_used ) = new_val; + work -> diffs = 0; + work -> kikan = KIKAN; + } + } + else + { + work -> large_diff_count = 0; + // 近所の値でも、ある期間でいっぱい偏っていたらそっちに寄せる + if( *( work -> value_used ) < new_val ) + { + work -> diffs += 1; + } + else if( *( work -> value_used ) > new_val ) + { + work -> diffs -= 1; + } + + if( --( work -> kikan ) == 0 ) + { + if( ( work -> diffs ) == KIKAN ) +// if( ( work -> diffs ) > (s8)( KIKAN * 0.8 ) ) + { + *( work -> value_used ) = *( work -> value_used ) + 1; + } + else if( ( work -> diffs ) == ( -1 * KIKAN ) ) +// else if( ( work -> diffs ) < (s8)( -1 * KIKAN * 0.8 ) ) + { + *( work -> value_used ) = *( work -> value_used ) - 1; + } + work -> diffs = 0; + work -> kikan = KIKAN; + } + } +} + + + + +#if 0 +// getmean使用 // +__interrupt void int_adc( ) +{ + static u8 hist_3D[3]; + static u8 hist_snd_vol[3]; + static u8 hist_bt_temp[3]; + static u8 index; + + volatile u8 adc_data; + + adc_data = ADCRH; + + switch ( ADS ) + { +/* +case ( ADC_SEL_AMB_BRIT ): // 環境明るさ + vreg_ctr[ VREG_C_AMBIENT_BRIGHTNESS ] = adc_data; + break; +*/ + + case ( ADC_SEL_3D ): + hist_3D[index] = adc_data; + EI(); +#ifdef _MODEL_WM0_ + adc_raw_dep = 255 - getmean3( hist_3D ); +#else + adc_raw_dep = getmean3( hist_3D ); +#endif + break; + + case ( ADC_SEL_VOL ): + hist_snd_vol[index] = adc_data; + EI(); +#ifdef _MODEL_CTR_ + if( system_status.model == MODEL_TS_BOARD ) + { + adc_raw_vol = getmean3( hist_snd_vol ); + } + else + { + adc_raw_vol = ( 255 - getmean3( hist_snd_vol )); + } +#else + adc_raw_vol = getmean3( hist_snd_vol ); +#endif + + break; + + case ( ADC_SEL_BATT_TEMP ): + hist_bt_temp[index] = adc_data; + EI(); + raw_adc_temperature = getmean3( hist_bt_temp ); + if( (( vreg_ctr[ VREG_C_STATUS_1 ] & REG_BIT_MGIC_ERR ) == 0 ) && + (( system_status.pwr_state == ON ) || + ( system_status.pwr_state == SLEEP ) + ) + ) + { + renge_task_immed_add( tski_BT_temp_update ); + } + break; +/* 呼ばれません + case ( ADC_SEL_BATT_DET ): + break; +*/ + } + +// もっとまともな書き方がありそうだ + if( ADS < ADC_SEL_BATT_DET ) + { + ADS += 1; // 次のチャンネル + ADIF = 0; // ←これをしないと、いっこ前のチャンネルのデータの完了で直後に割り込む可能性がある + } + else + { + ADCEN = 0; // 止めてしまう + adc_updated = true; + index = ( index == 2 ) ? 0 : ( index + 1 ); // ノイズ取りの配列インデックス + } +} + + + +#endif diff --git a/branches/sim/adc.h b/branches/sim/adc.h new file mode 100644 index 0000000..6f4ad04 --- /dev/null +++ b/branches/sim/adc.h @@ -0,0 +1,48 @@ +#ifndef __adc__ +#define __adc__ + +#include "jhl_defs.h" + +/////////////////////////////////////// +// ANI2 P22 +#define ADC_SEL_AMB_BRIT 0x02 + +/* +// ANI3 P23 +#define ADC_SEL_GYRO_YAW 0x03 +// ANI4 P24 +#define ADC_SEL_GYRO_PITCH 0x04 +// ANI5 P25 +#define ADC_SEL_GYRO_ROLL 0x05 +*/ + +// ANI6 P26 +#define ADC_SEL_3D 0x06 +// ANI7 P27 +#define ADC_SEL_VOL 0x07 + +// ANI8 P150 +#define ADC_SEL_BATT_TEMP 0x08 +// ANI9 P151 +#define ADC_SEL_BATT_DET 0x09 + + + +/////////////////////////////////////// +#define CODEC_REG_VOL 0x13 + + + +/////////////////////////////////////// +extern u8 vol_polling; +extern u8 vol_level_twl; + + + +/////////////////////////////////////// +u8 get_adc( u8 ch ); +void vol_reset(); + + + +#endif diff --git a/branches/sim/batt_params.h b/branches/sim/batt_params.h new file mode 100644 index 0000000..3b8d542 --- /dev/null +++ b/branches/sim/batt_params.h @@ -0,0 +1,94 @@ +#ifndef _bt_params_h_ +#define _bt_params_h_ + +#include "jhl_defs.h" +/* + 電池識別 CTR | SPFL | YBS + 0 ID = 0 maxell ← + 120 1 + 360 2 + 750   3 + 1.3k  4 + 2.7k 5 pana ← + 8.2k  6 +*/ + + +typedef enum +{ + BT_PARAM_CTR_MAXELL = 0, + BT_PARAM_CTR_PANA, + BT_PARAM_SPFL_MAXELL, + BT_PARAM_SPFL_PANA, + BT_PARAM_SHRIMP_MAXELL, + BT_PARAM_SHRIMP_PANA, + _BT_PARAM_NUM_ +} BT_TYPE; + +typedef struct +{ + u8 rcomp; + s16 up,down; +} rcomp_; + +typedef struct +{ + u8 hi,low; +} verify_; + + typedef struct +{ + u8 mg_param[64]; + u8 v_scale; + rcomp_ rcomp; + u16 ocv; + verify_ verify; +} bt_param_; + + + + +/* ======================================================== + 各社バッテリーパラメータ + ======================================================== */ +const bt_param_ bt_param[ _BT_PARAM_NUM_ ] = +{ + // BT_PARAM_CTR_MAXELL + { + { + 0xAE, 0xF0, 0xB4, 0x30, 0xB7, 0x40, 0xBA, 0x30, + 0xBB, 0x50, 0xBB, 0xB0, 0xBC, 0x50, 0xBD, 0x10, + 0xBD, 0x60, 0xBD, 0xB0, 0xBF, 0xE0, 0xC2, 0xB0, + 0xC4, 0x20, 0xC7, 0xB0, 0xCA, 0xE0, 0xCE, 0x10, + 0x01, 0xF0, 0x14, 0x10, 0x14, 0x20, 0x06, 0x30, + 0x63, 0x90, 0x49, 0x00, 0x6E, 0x00, 0x77, 0x70, + 0x7B, 0x00, 0x19, 0x00, 0x19, 0x00, 0x17, 0xF0, + 0x1C, 0x60, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00 + }, + 2, + { 92, (u8)(-256* 0.79), (u8)(-256* 4.35) }, + 0xD800, + { 0xEA, 0xE8 } + }, + + // BT_PARAM_CTR_PANA + { + { + 0x8C, 0x30, 0x9C, 0x10, 0xA5, 0xE0, 0xB0, 0x40, + 0xB1, 0xC0, 0xB2, 0x00, 0xB2, 0x50, 0xB3, 0x10, + 0xB4, 0x90, 0xB6, 0x20, 0xB8, 0x60, 0xBA, 0x50, + 0xBF, 0xA0, 0xC6, 0xB0, 0xCE, 0x90, 0xD0, 0x20, + 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, + 0x7B, 0x30, 0x68, 0x60, 0x20, 0x00, 0x17, 0x00, + 0x17, 0x30, 0x12, 0xF0, 0x0D, 0xE0, 0x07, 0xF0, + 0x07, 0x00, 0x09, 0x30, 0x01, 0xC0, 0x01, 0xC0 + }, + 1, + { 171, (u8)(-256* 1.00), (u8)(-256* 2.60) }, + 0xDA20, + { 0x69, 0x67 }, + } +}; + + +#endif diff --git a/branches/sim/bsr.hex b/branches/sim/bsr.hex new file mode 100644 index 0000000..0d0597b --- /dev/null +++ b/branches/sim/bsr.hex @@ -0,0 +1,1022 @@ +:02000000260DCB +:040010004D4A4F4ABC +:02001C00244C72 +:02002400904CFE +:02002A00FD4C8B +:08003400264EC84D214E554F28 +:02004A00514A19 +:02005A008C4ACE +:02006200D94E75 +:0400C0007EFBFF04C0 +:0A00C4001B339499E033F240BFAA09 +:1000CE00C7C1FBF8FFCEABACC736F00071F4C6610A +:1000DE00D8710022F98EA89C018C015C10D1DD0A2A +:1000EE007110D8FB710022F9EF0B8C015C80D1618D +:1000FE00E8710022F98F22F931030FF6BBBBF6B17E +:10010E00614900DD05617900EFF4FDAA01CC000024 +:10011E00CC01008C014C09DE468C01318E04F60FA9 +:10012E00C1317B9EFDC41189728C01318E04F64F54 +:10013E0014896142DF03F6EF01E6600D9B8C0131FD +:10014E008E12490020728C01318E04F64F14896193 +:10015E0042DF03F6EF01E6600D9B615901EFB440FB +:10016E00F84F3A61E86159008BD161E8FD4F0731D4 +:10017E00020406714022F9EF04714822F9FDC7020C +:10018E00EDD300C0C6D7717BFACEA010CEA180E50C +:10019E00F300CEA408F5AAFFF5A9FFD78F22F931F7 +:1001AE00050ACD0003CD0307F40EEF07F400CD03CF +:1001BE0006F40ECE20FFCE23F0CE2EFC8F22F93188 +:1001CE00031FF51005CD01C0F402CD0408F405F4AB +:1001DE0006CD0740F40CF40F7108F200F690BFB490 +:1001EE0001F6BEE0BEE2BED0CBE4FFFFCBE6FFFFE2 +:1001FE00CBD4FFFFCF1105FCF521FFCE22E9CE2493 +:10020E00F3CE25F2CE26FCCE275FCE2CFFCE2FFFCF +:10021E00CF120511F53000F53100F53300F534003D +:10022E00CF350002CF370019F53C00F53E00F543FF +:10023E0000F54700CF530006F55700CBE8FFFFCB84 +:10024E00EAFFFFCBECFFFFCBEEFEFFCED8FFCEDCFE +:10025E00FFCE3831CE3970CF38050AF53905F5376E +:10026E00FF7158F000F530FF7128F0005087BF186D +:10027E0001BF1A01BF1C01BF1E017148F000F5300D +:10028E000271080105F55005F5BCFFF5BDFFF5A59A +:10029E00FFF5A6FFD7C7C1C1FBF8FFCEABAC8C02F2 +:1002AE00D1DD12616902305C03BBF6614900DDEEFF +:1002BE00618900EFF51004C6D7FDEC32FD473CFD19 +:1002CE002705717AFAFDFB23F520F98F22F9310506 +:1002DE00175003C15084FD3103C0625C01D161E847 +:1002EE00CF20F902CFE1FB64FDCC33FD5E48717285 +:1002FE0022712BE7FD4A3CFDEC3C61EDEFF6D7D7C2 +:10030E00C7F616FD2705717BFA3102210571022110 +:10031E00EF0B717AFAA7F647DFECE2EF04717AFA87 +:10032E00F2C6D7C7C1C1FBF8FF17A1C1E0C18C0A45 +:10033E0070C18C0270FD5B031006D2DF05F543FB26 +:10034E00EF04CF43FB028C01721004C6D7C7C1FB6A +:10035E00F8FFFD0E03D2DD03E2EF618B70FD7B042F +:10036E00D2DD077103215202EF528C0870FD90040A +:10037E00FDDB048B6C0170FD9004300400BF240182 +:10038E00301740BF1C01300400BF22018C0A91DFE0 +:10039E0004F6BF2A01710BE2CE44FF3182E202EF76 +:1003AE00FAAC0C148E449961790C61690A8C0AD1ED +:1003BE00DFDAFD0405710BE2710321F2C0C6D7C767 +:1003CE00C1FBF8FFFD0E03D2DD03E2EF25710AE655 +:1003DE008B70FD7B04D2DD077103215202EF138C6B +:1003EE000870FD90048C0A70FD9004FD04057103E5 +:1003FE0021F2C0C6D7C7C1FBF8FFFD0E03D2DD0345 +:10040E00E2EF67710AE6710BE28B70FD7B04D2DDC1 +:10041E00077103215202EF52710BE231722039C77C +:10042E00343CFBAC0C1652048B99A5A792DFF9C68F +:10043E003184BD02EFFA717ABDCEB144CBB43CFB30 +:10044E008C0A318EBEB8CEBB48714BE1714BE57153 +:10045E000ABD8C089E44EF11710BE68C089E448CED +:10046E000A9F42FBAC0CBF40FBF2C0C6D7C716FDBD +:10047E00B30417FD9004D2DD06FD0405E2EF01F290 +:10048E00C6D7C716710AE6710BE2669E443182E248 +:10049E0002EFFAF6420401DD09AF0401BF0C01E2DE +:1004AE00EF01F2C6D7AF2801085CFB08BF2801FD9B +:1004BE000D03AF28015CFBBF2801300400BF2A01E9 +:1004CE00301780BF1C01300400BF2201D7AF2401BA +:1004DE00086C0408BF2401AF28016C0F086C0B08D0 +:1004EE00BF2801FD0D03AF2A01085CFB08BF2A01DE +:1004FE00FD0D03EDB304300400BF2401F6BF2A0145 +:10050E00300B0BBF2801FD0D03300B0FBF2801FD73 +:10051E000D03300F0FBF2801D731142101D77102FF +:10052E0021710BBD0000717BBD713A25713A236AB2 +:10053E000E03713205713B25713203713B23500A54 +:10054E00FDA3027120F000FD0D03F6BF260150241D +:10055E00BF1401CB440014300F0FBF28017173205C +:10056E00710BE2710AE6FDB304CE44FF3182E20262 +:10057E00EFFAFD0405AF0401BF0C017103217112E6 +:10058E0021D731042102EFFAFDDB04713A25713ACD +:10059E00235A0EFC713305713B25713303713B23D6 +:1005AE007128F000711321D7C7880616FD0E03D2ED +:1005BE00DD03E2EF38710AE650A4FD7B04D2DD07BD +:1005CE007103215202EF2617FD90046770FD90040F +:1005DE00FDDB0450A4FD90045020FD9004D944FB93 +:1005EE00FD9004A044FBFD0405710321F2C6D7C79C +:1005FE002008FBF8FFFD59095014C15008FD8B0867 +:10060E00C0CC07048C074C14DE0C8C07318EFD0811 +:10061E000A615907EFEECC07048C074C1461C8ED44 +:10062E00EB06CC06008C064C0461C8EDCA063024DD +:10063E00F9BC02F6BBCEABAC31B2D109C73641051F +:10064E007184C6DEF3F1C73641057184C661DC9C48 +:10065E0005713BD1AC02148F400599715050056164 +:10066E007902617900F0E1614900DD09C736410583 +:10067E007184C6DEC3F1C73641057184C661DC0ED6 +:10068E00059C055040C18C07318E31AD128C063160 +:10069E008E318D03BDD831FFBDDADADAADD8FDD497 +:1006AE000CC0D2DD0C5008C15014FD8B08C0FD915A +:1006BE000B8C05D1DF06615906ED33068C07318EA2 +:1006CE00FD0C0AD2DD0C5008C15014FD8B08C0FD84 +:1006DE00910B8C05D1DF06615907ED27067160502D +:1006EE0005CC0400CC05008C054C09DE2B8C0531A5 +:1006FE008E04F61FC1317B9EFDC41189728C0531AB +:10070E008E04F64F14896142DF03F6EF01E6600EA8 +:10071E00049C04615905EFCF41001140F81F3A6166 +:10072E00E86159048C04D1DF08FD920BFDA40CEF97 +:10073E000C5008C15014FD8B08C0FD910B1008C65B +:10074E00D7C72004FBF8FF715B21CC0100F6BC0279 +:10075E00AC02440900DE3EAC0204F60F1441001157 +:10076E008972AC020C5014896142DF03F6EF01E688 +:10077E00600E019C01AC021249005072AC0204F6EC +:10078E007F14896142DF03F6EF01E6600E019C01E2 +:10079E00617902EFBB40F67FFF61F86159018C0170 +:1007AE00D161F8ED5908CC0100717AFAFD27057177 +:1007BE001300711B20710303710205E0C15003C1C8 +:1007CE005084FDCD0310045013FDA302500FC1E061 +:1007DE00C15084FDCD031004CEABAC6159018C0128 +:1007EE0091DD068C014C03DF03E6EF01F66061FB41 +:1007FE007151018C014C0861F8CC010031320705B2 +:10080E00A082FCEF03F582FC4082FC11DC11F58224 +:10081E00FCF0C15003C15084FDCD031004EF12E66D +:10082E00BC02F6614902DDB000000000617902EF02 +:10083E00F1CE3708CBE4FFFFCBE6FFF7CED4FFCFE8 +:10084E00370008F5120561FDF5ABFFFD5909D250D1 +:10085E0008C15014FD8B08C0D2FD910B1004C6D7F1 +:10086E003184BD02EFFA717BBDCBE4FFFFCBE6FF17 +:10087E00FFCBD4FFFF717ABED7717BBED7C7C12025 +:10088E000CFBF8FF8C0C318E31ADC1317B9DD4C089 +:10089E00BC068DD49C088C149C0B8C14318E040CCD +:1008AE0000128C0B318EBDD813FD630F61C8ED5451 +:1008BE0009CEABACCC05068C0B318EFD040AD2DD15 +:1008CE00158C0B318EFD080A6169058C05D1DFE7A9 +:1008DE00FD8708E2EF71CC0A008C0A4C04DE54F658 +:1008EE00BC023024F9BBAC06148C089EFD11897233 +:1008FE00AB146299AC06A1BC06617900617902F075 +:10090E00E1614902DFE05040C18C0B318E31AD12F6 +:10091E008C0A318E318D03BDD831FFBDDADADAADF6 +:10092E00D8FDD40CC0D2DD06FD8708E2EF1961595F +:10093E000AEFA68C0B318EFD0C0AD2DD03E2EF0717 +:10094E0061590BEDA808F2100EC6D7C7717B9D71C9 +:10095E007BFAFD6E083024F9FDB70AFD420AC6D7B0 +:10096E00FD5909FD910BFD8708F5ABFFF2D7C7D5F1 +:10097E006AFDDD05B06AFDEF7BCF6AFD023114071B +:10098E00067110E5FBEF047118E5FB8FE5FB7F3078 +:10099E00FD76D1DD5F8FE5FB9F30FD4020F903DF53 +:1009AE0025665C10D1DD1F7122208FE5FB5C10D116 +:1009BE00DD0B5080C15011FDFC37C0EF095040C116 +:1009CE005011FDFC37C04020F903DD064020F9042C +:1009DE00DF22665C02D1DD1C8FE5FB5C02D1DD0BF4 +:1009EE005040C15010FDFC37C0EF095020C15010CF +:0609FE00FDFC37C0C6D766 +:100A04005208EF065203EF025206FEE600FE1B00F8 +:100A1400DC16089F03088F0408089F040862FE245C +:100A240000089F0408EEBF00EEBA00C1C514410ED1 +:100A340011D9D0FF118FD1FF312E45C4C0D7F23167 +:100A4400A2C401E2D79DE261DD4C09DF12717BFA99 +:100A5400C18F06089F7BFDC0CF060800EE2700313A +:100A6400F2FA04CF0608004C00DF05D50008DD16B5 +:100A740061DD717BFAD50608DD0ACDE31F61CD6126 +:100A8400CDEE160061CDFED40061FFFE9A00FCF8A5 +:100A9400FF0EFEB20061CDFED5004C09DF0EC18F02 +:100AA40006086F7BFD9F0608C0EE0400CF06080011 +:100AB400F8E3D75200EF025202FE3700CF7AFD006E +:100AC400CF060800BF0408C716629F000841001142 +:100AD4008F86229B4100118F87229F0108C65100F7 +:100AE400FE62FFEF025205CF060800C1510CFE0A58 +:100AF40000C0D7C1511DFE0200C0D761DD717BFA71 +:100B040070CEC0A59EC47CFF9EC4609EC461CDD738 +:100B140061DD717BFAC18EC45C1BFED6FFCF060873 +:100B240001FED7FFC061CDD731F2FA1AC1AEE4BFDE +:100B34006CFDAEE6BF6EFDAED4BF70FD30FFFFBEF0 +:100B4400E4BEE6BED4C0D731F2FA11C1AF6CFDBE2B +:100B5400E4AF6EFDBEE6AF70FDBED4C0D7C1BF72B8 +:100B6400FD13BF74FD15BF76FD17BF78FDC0D7AF69 +:100B740072FDDB74FDEB76FDFB78FDD7534B3052F1 +:100B84005430324E323030475631323000FFC1508B +:100B9400FEFEAB0061DD717BFACF060800FE0A00A1 +:100BA400FEA4FF61CDF8E3EECF00C7FB0408BF6CE1 +:100BB400FD8FC0009C05C5C337040600BF6EFD351C +:100BC40036F60B300000522BFE6600C2C4C630A4B9 +:100BD4000BB800300000B8022004AF6EFDB800303E +:100BE4000F00B802AF6CFD61FF520AFE3AFFECF849 +:100BF400FF0E717BFAC1C7FB04088C05C65C80FE3E +:100C04000200C0D761DD717BFA70CFC0FFA59FC021 +:100C1400007CFF9FC000609FC00061CDD7618BFE48 +:100C2400E2FF717BBE410011FB000017CEFC0061A6 +:100C3400CB089EFDF31161C999A58392DFF7D7FE16 +:100C4400B1FED57AFDDF23C1CF0308035109FEF4B9 +:100C5400FDC0D2DF37FE3800A20408CF03080751D5 +:100C640009FEE1FDD2B20408DF22C7FB0408318388 +:100C740002C6D7C6510AFECCFD624C1FDF06CF7AEE +:100C8400FD01EF04CF7AFD00C0EE5BFEC0EE55FE21 +:100C9400C7C1FB04088B31196C0161589BC0C6D7CE +:100CA400717BFAFE4DFEAF0408040600C114360839 +:100CB4000C300000522DF3FE77FF8FC000FE2BFE98 +:100CC40061CF5C807C8073C0041900CEFC0F61CBC3 +:100CD400C55404EF03C55417FE18FEC7360008BBFD +:100CE400629C0288089C03D1DD334C41DE2F70F1F5 +:100CF400312DB161090033081C000851FF612A41FC +:100D04000E118FD0FF613B118FD1FF6138DC0E8B48 +:100D14005C03DF0964C6C4FE2BFDEECAFDC6C4EE47 +:020D2400C3FD0D +:100D260061CF5100718C7109FECBF800FEFC940175 +:100D360000F6BF00F953C0F693935820FEDFF94141 +:100D46000036764F3432FDEF05118B99A7A517446F +:100D5600B04FDFF53602F93032FDEF04CC0000A7C4 +:100D660047DFF94100365B4F346CFDEF05118B9977 +:100D7600A7A517445B4FDFF5366CFD306CFDEF041D +:100D8600CC0000A747DFF9FCCE0000EFFE61DD7165 +:100D96007BFABEF0ADD8BEF200AEF661CDD7C36128 +:100DA600DD717BFABEF0ADD8BEF200DBF6FFADDC3E +:100DB600BEF000AEF6BDD8AEF40312ADDABEF20058 +:100DC600AEF661CD03BDDAC2D7C3F33174D9088359 +:100DD600C1F626D8BDD8C031750683C312F623C224 +:100DE600FDF10D93DF0312F623C2D7440000DD2682 +:100DF60061DD717BFACFE80080BEF6F6BEF4BEF286 +:100E0600ADD8BEF0CFE800818FE8003103FAAEF02E +:100E1600F5E80061CDD7B1D7C3F33174D90883C1E2 +:100E2600F626D8BDD8C0317505C312F623C2FD3FDC +:100E36000E93DF0312F623C2D7440000DD2761DDDF +:100E4600717BFACFE80080BEF6F6BEF4BEF2ADD8EE +:100E5600BEF0CFE800818FE8003103FAAFE000F57D +:100E6600E80061CDD7ADD8D7C3F33174DB0F83C1AA +:100E7600F626D8BDD861317026DABDDAC031750DD7 +:100E860083C312F626DCBDDC61317023C2FDA70EDA +:100E960093DF0CF626D8BDD861317026DABDDAC2EA +:100EA600D7C161686BDC6BDDC0DD2F61DD717BFA5C +:100EB600CFE80080BEF4ADDCBEF6ADD8BEF0ADDA4C +:100EC600BEF2CFE800818FE8003103FAAEF0BDD85C +:100ED600AEF2BDDAF5E80061CDD7F6BDD8BDDAD7FA +:100EE6008292DD2B61DD717BFACFE80080BEF0F6E1 +:100EF600BEF2BEF46208BEF6CFE800818FE800318C +:100F060003FAAFE0006072AEF0F5E80061CDD7609D +:100F160072F6B1D706DABDDAADDC06D8BDD861D82F +:100F2600A6DAD7D1DD17C1C3DAD89DD8ADDA311C20 +:100F360061EEB4D8DFF8BDDA13BDD8C2C0D7D1DDB3 +:100F46001BC1C3DADA9DDAADD8311E33311E3371D7 +:100F5600F9B4DADFF4BDD813BDDAC2C0D746D8DD9E +:100F66000771FF7177D971C0D75BDB9DDB605BDAF8 +:100F76009DDAADDC5BD9085BD808BDD8D7C3C7F30B +:100F8600728EFDC162314C4100365C4F1161A07218 +:100F9600C09EFD62C6C2D7C3C7F3728EFDC1625C36 +:100FA6000F0C000FFE00314C410036664F11618078 +:0B0FB6000FFE0073C09EFD63C6C2D793 +:0A0FF60030383A35343A3333000046 +:0A20000030383A35343A333300002B +:10200A00AEF0B430B740BA30BB50BBB0BC50BD1014 +:10201A00BD60BDB0BFE0C2B0C420C7B0CAE0CE1038 +:10202A0001F0141014200630639049006E00777096 +:10203A007B001900190017F01C6012001200120030 +:10204A00AEF0B430B740BA30BB50BBB0BC50BD10D4 +:10205A00BD60BDB0BFE0C2B0C420C7B0CAE0CE10F8 +:10206A0001F0141014200630639049006E00777056 +:10207A007B001900190017F01C60120012001200F0 +:10208A00AEF0B430B740BA30BB50BBB0BC50BD1094 +:10209A00BD60BDB0BFE0C2B0C420C7B0CAE0CE10B8 +:1020AA0001F0141014200630639049006E00777016 +:1020BA007B001900190017F01C60120012001200B0 +:1020CA008C309C10A5E0B040B1C0B200B250B31041 +:1020DA00B490B620B860BA50BFA0C6B0CE90D02097 +:1020EA0000200020002000207B30686020001700BC +:1020FA00173012F00DE007F00700093001C001C0E7 +:10210A008C309C10A5E0B040B1C0B200B250B31000 +:10211A00B490B620B860BA50BFA0C6B0CE90D02056 +:10212A0000200020002000207B306860200017007B +:10213A00173012F00DE007F00700093001C001C0A6 +:10214A008C309C10A5E0B040B1C0B200B250B310C0 +:10215A00B490B620B860BA50BFA0C6B0CE90D02016 +:10216A0000200020002000207B306860200017003B +:10217A00173012F00DE007F00700093001C001C066 +:10218A008C309C10A5E0B040B1C0B200B250B31080 +:10219A00B490B620B860BA50BFA0C6B0CE90D020D6 +:1021AA0000200020002000207B30686020001700FB +:1021BA00173012F00DE007F00700093001C001C026 +:1021CA005C003600A7005C003600A7005C00360001 +:1021DA00A700AB0000006700AB0000006700AB007F +:1021EA0000006700AB000000670000D800D800D8E4 +:1021FA0020DA20DA20DA20DAEAEAEA69696969E8A3 +:10220A00E8E8676767670202020101010105214FD9 +:10221A007B9EC5E91926344453626E777D80807DA2 +:10222A00776E625344342619100A08080808080809 +:10223A0008080A107F7E7D7C7A79787776757472C1 +:10224A0071706F6E6D6C6A696867666564626160F9 +:10225A005F5E5D5C5A5958575655535251504F4E0E +:10226A004D4B4A494948474645434241403F3E3D16 +:10227A003B3A39380104080D12171C1F08010102E4 +:10228A000203030200FEFBF7F3F0F0F3FA0412254F +:10229A00384D5F6E777A776E5F4D38251204FAF300 +:1022AA00F0F0F3F7FBFE0002030302020100000054 +:1022BA0000001F003B005A0078009700B500D400C8 +:0822CA00F300110130014E0187 +:1022D200D520F9DD108F33FDB033FDD161E8ED7EFD +:1022E20023CF33FD33FD7F234002F94BDC1640023E +:1022F200F9B9DE10400EF928DE05A00EF9EF2771BC +:102302003320EF224002F93EDC064002F9BDDC1028 +:10231200400FF928DE05A00FF9EF0B713220EF060E +:10232200F50EF9F50FF93132200D31042009310291 +:102332000705713304EF0371320431140508F510F7 +:10234200F9714302EF0E4010F902DE05A010F9EF19 +:1023520003714202D50BF9DD06B00BF9714202316D +:102362004402067140E5FBEF047148E5FB4020F9A9 +:1023720001DD094020F90561E8FD2227D7C72004C5 +:10238200FBF8FF710407E66130609C038F11F94E80 +:1023920003DD628C039F11F98C03D1DD137130E5EB +:1023A200FB5002C15011FDFC37C0CF0BF91EEF45A7 +:1023B2007138E5FBE0C15011FDFC37C0F50BF91790 +:1023C200A1C15002C1C1506CFD5B031006D2DF0FE8 +:1023D2008C01318E318D080E02081C00BF0CF9AF42 +:1023E2000CF944009BDC05D5E1FBDF095020C1500C +:1023F20011FDFC37C01004C6D7C78F32FD76FD3CF5 +:1024020024D523F9DD05710320EF2D664F32FD61DE +:10241200F83144201A714320FD2705664C07DD037D +:1024220081DF098F22F9310303FDBA24FDDF247114 +:102432000220306426FDA23CC6D7C77162017172C8 +:1024420001E0FDA3025008FD163B629F02F950090C +:10245200FD163B6276716301713822F94002F9F18F +:10246200DC05E523F9EF244002F904DE1BCF23F952 +:10247200025008C1506CFD3103C092DF0ED543FB00 +:10248200DF09713022F9EF03F523F9CF32FD075747 +:1024920000674C08DE1173091722614EDC06679F44 +:1024A20032FDEF0387EFEA4032FD07DF09D523F95A +:1024B20061F8CF23F903C6D7C7C1FBF8FF500AFD65 +:1024C200A302304000BB17C15002C15006C1506C7C +:1024D200FD030410065096FDA302C0C6D7C720080C +:1024E200FBF8FF8F32FD5006D604CA2114F75006BE +:1024F20089A54804F9A390DFF7D523F961E8ED60D7 +:1025020026304A57BB17C15002C1503EC1506CFD24 +:1025120003041006D2DD077100E4FBED60267108AA +:10252200E4FB17040300C15004C1500CC1506CFD00 +:102532005B031006D932FDF10104F42114A9318D97 +:1025420012A9318E616B08616A08BB17C15002C1C2 +:10255200500EC1506CFD03041006F690BB17C1501B +:1025620002C1500CC1506CFD03041006310421025B +:10257200EFFA7172208F32FDF0312E040A20C15021 +:1025820010C15040C1506CFD0304100631042102F9 +:10259200EFFA7172208F32FDF0312E041A20C150F1 +:1025A20010C15050C1506CFD0304100631042102C9 +:1025B200EFFA7172208F32FDF0312E042A20C150C1 +:1025C20010C15060C1506CFD030410063104210299 +:1025D200EFFA7172208F32FDF0312E043A20C15091 +:1025E20010C15070C1506CFD0304100650A5FDA32C +:1025F20002D932FDF10104F42114A9318D12A9315D +:102602008E616B08616A08BB17C15002C1500EC1CE +:10261200506CFD0304100650A5FDA3025004C150E6 +:102622006CFD3103C0629C07E932FD0909224E07A5 +:1026320061C308E932FD0902224E0717040300C1F3 +:102642005004C1500CC1506CFD03041006F6BB17B8 +:10265200C15002C1503EC1506CFD03041006100867 +:10266200C6D7C7C1FBF8FF8F12F94F02F961F8ED27 +:102672001E274014F928DE06A014F9ED1E27F514D2 +:10268200F98F02F99F12F98F02F95070D612307346 +:1026920051230480001231FF318E039F13F99FE012 +:1026A200FBF6BB8F13F97C804C95DC1B8F13F93141 +:1026B2008F241400BDD8AF06F9FD930D1231FF31FE +:1026C2008E03318FBBEF198F13F9318F241400BDA4 +:1026D200D8AF08F9FD930D1231FF318E03318FBB54 +:1026E200D904F9F1610900BB44000171FEDC03F673 +:1026F20090BB8C0101DE02F6BBABABBF8CFC17C1F9 +:102702005002C1500CC1506CFD03041006D2DF0808 +:102712008F02F99F12F9EF047100E4FBF2C0C6D7F1 +:10272200C72006FBF8FF4023F901DF0BCFE1FB6373 +:10273200CFE3FBC8ED7C284023F902DF2C17040409 +:1027420000C15002C15004C1506CFD5B031006D29F +:10275200DD06CFE1FB63EF0A8C049FE1FB8C059F52 +:10276200E2FBCFE3FBC8ED7C2817040400C1500252 +:10277200C15004C1506CFD5B031006D2DD11710023 +:10278200E4FB710320F5E1FB712022F9ED51288C65 +:1027920004318E318D080E05081C00BF0CF9D932A8 +:1027A200FDF1041022148972AF0CF9FDE60EBF0C84 +:1027B200F99C04D1DF08CC0401CC0500EF058F0C95 +:1027C200F99C0517040200C15002C1C1506CFD5BA7 +:1027D200031006D2DF798C029FE3FB8C02318E312B +:1027E2008D080E03081C00BF0CF94401A5DC09CCBE +:1027F2000164F6BF16F9EF57AF0CF92216F944013E +:10280200A0DC09CC011EF6BF16F9EF43AF0CF94468 +:10281200819DDC0BCC010A30F401BF16F9EF30AF19 +:102822000CF944019BDC0BCC010530F401BF16F915 +:10283200EF1DAF0CF9440191DC0BCC010030F40127 +:10284200BF16F9EF0A712022F930F401BF16F931EF +:1028520032040D31140509CFE1FB64F5E2FBEF1AF6 +:102862008C044E01DE0C8C049FE1FB8C059FE2FB85 +:10287200EF088C019FE1FBF5E2FB40E1FB51DC0636 +:10288200CF38FC0FEF3540E1FB33DC06CF38FC0BD1 +:10289200EF2940E1FB0BDC06CF38FC07EF1D40E1DE +:1028A200FB0661D831320406CF38FC03EF0DD5E1C7 +:1028B200FBDD05E538FCEF03F538FC8F18F94FE135 +:1028C200FBDD2B40E1FB0BDE064018F90BDE164068 +:1028D200E1FB06DE064018F906DE0AD5E1FBDF0E53 +:1028E200D518F9DD095020C15011FDFC37C08FE128 +:1028F200FB9F18F9D520F9DF05715320EF3340E132 +:10290200FB0BDE03E6EF01F66061FB7161207114DF +:102912002071672061C831522017715220716420E2 +:10292200711120F171642061DC70C15012FDB60595 +:10293200C01006C6D7C75007C15002C15084FDCD92 +:102942000310045012FDA302500FC15002C1508463 +:10295200FDCD0310045003FDA302501FC15002C15C +:102962005084FDCD0310045016FDA3025003C15044 +:1029720084FD3103C0625C01D1DD107170E5FB5052 +:1029820002C15013FDFC37C0F2EF01E2C6D7C750B7 +:1029920004C15084FD3103C0625C03D1DD40501498 +:1029A200FD292A34E5FB895C9F998A0C7CFF50FF44 +:1029B2005C14D1DD228A0C7CFF5C147234E9FB8941 +:1029C200616A997162075600316207058666D1DF36 +:1029D200F7716307716B2734F8FB895CEB9950023E +:1029E200C15084FD3103C0D2DD335017C15002C142 +:1029F2005084FDCD031004E0FDA3025007C1500234 +:102A0200C15084FDCD0310045033FDA302F0C15028 +:102A120002C15084FDCD0310047178E5FBE0C15082 +:102A220013FDFC37C0C6D7C7C12004FBF8FFCC0298 +:102A3200005004C15084FD3103C0629C038C045CCD +:102A420020D1DD0E8C036C019C038C026C209C0255 +:102A5200EF138C045C10D1DD0C8C035CFE9C038CA8 +:102A6200026C109C028C045C08D1DD0E8C036C029B +:102A72009C038C026C089C02EF138C045C04D1DD75 +:102A82000C8C035CFD9C038C026C049C028C03D1B5 +:102A9200DD05501AFDA3028C0370C15004C150849D +:102AA200FDCD0310048FE5FB5C9F728C03318E31E8 +:102AB2006D148C03318E314D616D08616C5C606107 +:102AC20062629FE5FB8FF1FB7CFF50FF5E02D1DD6E +:102AD200278FF1FB7CFF5E027234E9FB89616A9900 +:102AE200716207CC0100316207086159018C01D182 +:102AF200DFF4716307716B27F21006C6D7D9D9FBD1 +:102B0200C15006C15084FDCD031004D9DAFBC15077 +:102B120007C15084FDCD031004D7FDFF2AF2D771FF +:102B22001300711B20710303710205E0C15003C140 +:102B32005084FDCD0310045013FDA302F0C15005D3 +:102B4200C15084FDCD031004500FC1E0C15084FD7B +:102B5200CD031004500AFDA3027103055008FDA322 +:102B620002501FC1E0C15084FDCD0310045012FD7C +:102B7200A3025003C15084FD3103C0625C01D1DF66 +:102B820002E2D75003C1C15084FDCD03100471028B +:102B920003711A20FDE92CF50AF9F2D75003C1504E +:102BA20084FD3103C0625C01D1DD195014FD292A74 +:102BB200FD90295014FDA302E0C15003C15084FDD1 +:102BC200CD031004711300711B207103035014FD17 +:102BD200A302F0C1E0C15084FDCD031004F0C15046 +:102BE20003C15084FDCD031004D7C72004FBF8FFB6 +:102BF200CC02008F0AF99C035010C150A4FD31038E +:102C0200C0629F0AF9D543FBDD04F2EDC62C8C03AA +:102C12007F0AF95C08D1DD108F0AF95C08D1DF0563 +:102C2200CC0210EF03CC02208C037F0AF95C04D1A2 +:102C3200DD168F0AF95C04D1DF088C026C049C0259 +:102C4200EF068C026C089C028FE4FB5CF3728F0A25 +:102C5200F95C0C6162629FE4FB8FF0FB7CFF50FF2A +:102C62005E029C02D1DD1F34E8FB896E029971621B +:102C720007CC0100316207086159018C01D1DFF4F0 +:102C8200716307716B278F0AF95C40D1DD0950022D +:102C9200C15012FDFC37C08F0AF95C01D1DD08E09A +:102CA200C15012FDFC37C0717AFA8F0AF95C41D12A +:102CB200DD11340AF9895CBE99D90AF9C15010FDB7 +:102CC200B605C0F21004C6D7FD3729F2D7FD902908 +:102CD200F2D7C78FF8FB7617FD292A664FF8FBDF7C +:102CE200F2F5F8FBF2C6D75064FDA30240E1FB0BFC +:102CF200DE03E6EF01F66061FB711120F171142031 +:102D020061DC70C15012FDB605C0FDC039CF49FC6F +:102D120003D77100010571785005713AD5713BD125 +:102D2200713ADD713BD98F10055CFC9F1005CF54C1 +:102D3200054AE5420571104205710042057148508D +:102D4200057130500571205005CF530505CF52054E +:102D52000A7130510571205105713BD571705005D2 +:102D62008F11055CFC9F1105D77178500571080120 +:102D720005D77140F00071783002713AE6713BE29A +:102D8200713BEA713BEE8F10055CFC9F1005CF345E +:102D9200024AE552FF711A52710A527148300271A9 +:102DA20030300271203002CF330205CF32020A7175 +:102DB200303102713BE6717030028F11055CFC9F6D +:102DC200110571603002D7717830027148F000D776 +:102DD200C788061666614FDD0967614EDE0396EF0E +:102DE20001866672C6D7C7161714AA0412A943DD54 +:102DF20029AA0412A923FDB04FC3AC02FDB04F13A0 +:102E0200C2BDD813FD630FDE0C1714AA0212AA0466 +:102E120003BA04EF051714A9BA04AC041231FF3146 +:102E22009E03317F087208C6D7C771201205712030 +:102E320011057100F200304400BFB601300188BFB5 +:102E42009001300984BF9E01BF9C01BF9A01BF98C7 +:102E520001BF9601BF9401BF9201F53CFF30FE0015 +:102E6200BFBE01F6BFBC01BFB80150EEBFBA01A19F +:102E7200BFB201C918FE00711022F94023F901DF27 +:102E820006711822F9EF0B36100571A461D871187A +:102E920022F97128100571281105F6BE6EBE64BEB6 +:102EA2006A7123047153078F22F9310507F5FFFB7D +:102EB200CB6CFF00713321C6D730EF00BFB401F6EF +:102EC200BFBA017108F200712304715307715301F3 +:102ED200D7714321D9FFFBF1E7240000DD1223DD86 +:102EE2001923DD1123DD2623DD3423DD3923DD3FE4 +:102EF200FD6E2FEF3DFD912FEF38D9FEFBC1AE6C79 +:102F0200FDD22DC0F313BE6C712321EF25F0C1AEAB +:102F12006CFDD22DC0F313BE6C712321EF14F6BEEB +:102F22006C712221EF0CCB6CFF00712321EF03FDAA +:102F32000E308F22F9311508712421712104EF0618 +:102F4200712421715101314421218F22F93115104F +:102F5200F6BE64BE6A3124210390EF01F6BE6ED73D +:102F620031242104F690EF01F6BE6AD7CF3AFD472D +:102F7200F5AAFBAE6C317DBFB0FBFDE32FD2DF0EB5 +:102F8200D9FEFBC1AE6CFDD22DC0F313BE6CD7FDD2 +:102F9200E32FD2DD0FCF3AFD47F5AAFBAE6C317DB0 +:102FA200BFB0FBD7E9AAFB091E225080D6BFACFBFB +:102FB20022B0FBBDD8304700FDCF0DBFAEFB30AC19 +:102FC200FBFDE82DF313BE6CB03AFDD53AFDDF10E0 +:102FD200CF3AFD47A0AAFB40AAFB1F61C8F5AAFB96 +:102FE200D740E1FB0BDC05712321F2D740E1FB0660 +:102FF20061D831120511F0C1AE6CFDD22DC0F313B0 +:10300200BE6C712221EF03FD0E30E2D7714221F036 +:10301200C1AE6CFDD22DC0F313BE6CA0B2FB40B2A8 +:10302200FB40DC3DF5B2FBD9B3FBF1313F0436FD89 +:1030320014D9B3FBF1BDD85008FD1E0E087208E684 +:10304200D2DD040192DFFC896158D1DD05712221B4 +:10305200EF03712321A0B3FB40B3FB2061C8F5B39A +:10306200FBD78FB4FBB0B4FBD1DF7331D4D106717F +:103072005BD1E5B6FBD5B6FBDD347140E4FBD9B5D7 +:10308200FBF1E734020023DD0625DD0325DF05F62B +:10309200BE66EF06D9FEFBF1BE66A0B5FB40B5FBEE +:1030A20020DF06F5B5FBB0B6FBCFB4FB19D7CFB422 +:1030B200FB1E7148E4FBD500FCDF04F6BE66D7D9DF +:1030C200FEFBF14266FFDD16D9FEFBF112AE66434E +:1030D200DE05A266FFEF03B266FFCFB4FB03D73172 +:1030E200442101D74020F902DF10F6BE64BE6EBE55 +:1030F2006ABFBEFBBFC4FBBFCAFB31342139F6BF76 +:10310200BAFBBFC0FBBFC6FB22BEFB1231FF31AE12 +:1031120003316FBFBCFBF622C4FB1231FF31AE0399 +:10312200316FBFC2FBF622CAFB1231FF31AE03314F +:103132006FBFC8FBEDF33131642110716321710857 +:1031420004FCF5B8FBF5B7FBEDF331D5B7FB61E84D +:10315200EDF0318F46FB9FB7FB40B8FB1FDC1A71C5 +:103162000004FC4048FBFFDD22A0B9FB8F48FB4F67 +:10317200B9FBDE17F5B8FBEF12D9B8FBF1A1605C21 +:103182001F9FB8FB710804FCF5B9FBE9B8FB094ABB +:10319200FB5080D6BFBAFBE9B8FB096AFB5080D668 +:1031A200BFC0FBE9B8FB098AFB5080D6BFC6FBAFA4 +:1031B200BAFB22BEFB12D947FBF133BDD813FDCFB8 +:1031C2000DBFBCFBAFC0FB22C4FB12D947FBF133DE +:1031D200BDD813FDCF0DBFC2FBAFC6FB22CAFB1287 +:1031E200D947FBF133BDD813FDCF0DBFC8FBB0B734 +:1031F200FB8F22F931151F30C6FBFDE82DF313BEFC +:103202006430BAFBFDE82DF313BE6E30C0FBFDE85F +:103212002DF313BE6AD730C6FBFDE82DF313BE6A49 +:10322200D7C73152210BD5CCFBDD06B0CCFBEDEA82 +:1032320032715321D901FCF1E7240000DD0F23DDB7 +:103242001B23DD1123DD5723DD2923DD3B5600F54A +:103252003BFDEDD6325601F53BFDEF78D53BFDDF68 +:10326200075601E53BFDEF055600F53BFDCFCCFBD4 +:10327200FAEF61D53BFDDF0B5601E53BFDCFCCFB01 +:10328200FAEF51F501FCEF4CD53BFDDF0B5600E5A3 +:103292003BFDCFCCFBFAEF3CCF01FC02EF36D93934 +:1032A200FCF1E7240000DD0923DD2423DD0A23EFFE +:1032B2001E5600F53BFDEF1CD53BFDDF075601E531 +:1032C2003BFDEF055600F53BFDCFCCFBFAEF055673 +:1032D20001E53BFD8F22F93115086661FB7151074B +:1032E200EF066661FB710101C6D7C736F00071F4C3 +:1032F200DC297170F000CE9D08CE9EC0CE9F80F575 +:1033020094FFF593FFF592FFE597FFE596FFE595AC +:10331200FFE598FFCE9C7F7100D8FB711BE3712BF8 +:10332200E3711AE7712BE7717A9D710A9E31929EC1 +:1033320002EFFA710B9E717321710322711322C67F +:10334200D7C73172211E717221710A9E31929E027B +:10335200EFFA3406FC3692FF52078B99A5A792DF4B +:10336200F9710B9EC6D7C788061631022215710263 +:1033720022C734CEFB3092FF1652078B99A5A79233 +:10338200DFF9C666736718CEFBC6D7C771732131E2 +:1033920004221E710322710A9E31929E02EFFA34B8 +:1033A20092FF36CEFB52078B99A5A792DFF9710BDC +:1033B2009E31142213711322717B9E8F0EFC9E9AF2 +:1033C2008F0FFC9E9B717A9EC6D7CFD9FB5CCFDA5A +:1033D200FB5FCFFAFB20CF2EFC36CF2FFCC9D7C71D +:1033E200CFD6FB11CFD7FB0FCFFEFBFFF5FFFBF5CF +:1033F20000FCF501FCF502FCCFFBFB20F5FCFB56C3 +:1034020000664C64DE08723846FB0086EFF3C6D7CE +:10341200C788061617F1E73403002361E3ED40374E +:103422002361F8EDF634B12361E3EDFD342561F853 +:10343200ED0C3524070024070061D8ED4037240B3A +:103442000061F8ED2D352361F8ED74352361F8ED57 +:1034520041352361F8ED18372561F8ED2C372561E8 +:10346200F8EDDD35B12561D8ED013624000061F8B3 +:10347200ED0E362361F8ED40372402002361E3EDBF +:1034820033362361F8ED44362361F8ED5536236176 +:10349200F8ED44362361F8ED66362361F8ED7736B0 +:1034A2002361F8ED86362361F8EDA8362361F8ED45 +:1034B200B4362361F8EDC0362361F8EDC936240233 +:1034C200002361E3ED403724020061F8EDD1362399 +:1034D20061F8EDDD362561F8EDE936240A0061F880 +:1034E200EDF53624120061F8ED12372361F8ED0094 +:1034F20037ED4237679FD8FBED4C37301C2BFDA2CE +:103502003C66736718D6FBED4C3740DBFB6ADF1471 +:1035120040DCFB68DF0E674C6CDF09305645FDA2CC +:103522003C713AD5679FDDFBED4C3767D1DD063044 +:10353200AE40FDA23C34F6FB89616F99ED4C3767D2 +:103542005C02D1DD0830CA2CFDA23CEF0C675C01A5 +:10355200D1DD0630CF2CFDA23C675C3CD1DD1030C2 +:10356200D42CFDA23C675C3C7266736218D6FBEDFC +:103572004C3767D1DD625C01D1DD05300800EF0117 +:10358200F6609F35FC675C02D1DD03E6EF01F6349D +:1035920035FC89616899675C04D1DD04E6A1EF011D +:1035A200F63435FC89616899675C08D1DD05302005 +:1035B20000EF01F63435FC89616899675C10D1DD52 +:1035C20005301000EF01F63435FC89616899675CBB +:1035D20020D161E8716035FCED4C37D51AF9DF096D +:1035E200679FFFFBA01AF9EF13401AF905DE0DD908 +:1035F2001AF9F1B112674836FDA01AF9ED4C376796 +:103602005C0F7266736218D6FBED4C37401AF96490 +:10361200DE1F401AF901DF0667D161F85701E91A86 +:10362200F9671846FBA01AF9401AF90561C87162D8 +:1036320021675C7F70C117F1243000FD6833C0ED53 +:103642004C37675C3F70C117F1243000FD6833C00E +:10365200ED4C37675C0770C117F1243000FD683309 +:10366200C0ED4C37675C1F70C117F1243000FD6854 +:1036720033C0ED4C376770C117F1243000FD683359 +:10368200C0ED4C37CEABAC710A9E31929E02EFFA7E +:10369200D592FFDF05710B9EEFED679E99710B9E30 +:1036A2009F0DFCED4C37711222675C7F9F0EFCED83 +:1036B2004C37711222675C3F9F0FFCED4C37675C01 +:1036C2003F9F10FCED4C37675C1F9F11FCEF7B3076 +:1036D200A03EFDA23C679F16FCEF6F305B3EFDA251 +:1036E2003C679F17FCEF63307D3EFDA23C679F1A4B +:1036F200FCEF57675C01D1DD51FD5E48EF4C403075 +:10370200FCC8DE46E930FC671874FAA030FCEF3AD8 +:10371200679F30FCEF3467318E247200DF06306E13 +:1037220009FDA23C679FF9FBEF208FFCFB617F5CE8 +:1037320010D161E8CF49FC03679FFCFBEF0CEF0A55 +:10374200664C5ADE05736718D6FBC6D7C716664C99 +:1037520030DC094C37DE05FD4333EF67664C02DF90 +:103762001F8FD8FB5C03728F37FC5C03318E316D87 +:1037720008616A08128F37FC5C80312A6162EF4966 +:10378200664C3DDF0AAE90BF32FCF932FCEF3A667E +:103792004C3EDF05F933FCEF30664C4FDF05FD820E +:1037A20048EF26664C61DF09E930FC0974FA72EFD2 +:1037B20018664C7FDF0D302741FDA23C713AD5528D +:1037C2004AEF06667309D6FB72C6D7C78806161774 +:1037D200F1241000240500DC07244C00DD17EF184B +:1037E200717BFA17F104D6FB1489617F99717AFA19 +:1037F200712222EF03A030FCC6D7C7C1C1FBF8FF7C +:103802004020F903DD064020F904DF2F8C02730902 +:10381200DEFB5E0AD1DF248C02318E04D6FB1489D2 +:103822006E0A99716207CC01003162070861590181 +:103832008C01D1DFF4716307716B271004C6D7CFF7 +:1038420037FC03F535FCF539FCF53BFCD7C7880698 +:103852001617F1E734020025DD3E23DD1825DD1DB4 +:1038620023DD0523DD2CEF3C715222679F3AFCCF0A +:1038720049FC03EF2F675C839F37FCEF27675C03EC +:103882009F39FC675C034C0261F8715221FD2332BF +:10389200EF12679F3BFCEF0C6791DF08E0C150120B +:1038A200FDFC37C0C6D7C71617F1E7240000DD3A82 +:1038B20023DD23240300DD0C240200DD2224F90091 +:1038C200DD2FEF3031020705308000EF01F6086F7F +:1038D20038FC7208EF248F35FCF535FC72EF1B8F34 +:1038E20043FC9F44FCF93AFCEF107142235235EF3E +:1038F20009F2EF0666730934FC72C6D7C71617F1D0 +:10390200E7240000DD38241000DD1C23DD1C23DD4C +:1039120030240E00DD18241100DD1B240F00DD12FF +:10392200243000DD15EF1EE2EF1D5202EF195204A2 +:10393200EF155206EF115205EF0D5207EF09F2EFA4 +:10394200065203EF0252FFC6D7C731342241713308 +:10395200228F48FC9FDEFB8F47FC9FFDFB3642FD1A +:10396200C7D947FCFD473B618A70618AFD8C3BC029 +:10397200D94BFCF1312F609F4AFC8F46FC4F4AFC29 +:10398200DD0D7142228F4AFC9F46FCCF49FC034069 +:1039920049FC05DE0A30CD39FDA23CCF49FC6BB0B3 +:1039A20049FC7150F000CE300BCF170006CE310625 +:1039B200FD0D03717A30710BE3710BE7C6D78F4AA5 +:1039C200FC9F46FC8F4AFC9FDFFBD7C74020F903D0 +:1039D200DF064020F904DF04F2EDC23A8FFCFB5C03 +:1039E20010D1DD0C8F4AFC9F4FFC7148FCFBEF614C +:1039F200314422247143227163228FFCFB5C04D187 +:103A0200DD088FFBFB9F50FCEF068F4AFC9F50FCAA +:103A12008F50FC9F4FFCEF39315422237153227196 +:103A22006222D53AFCDF05F551FCEF0B8F3AFC50D0 +:103A320002D6A1609F51FC8F51FC9F4FFCEF1231C7 +:103A42006422088F51FC9F4FFCEF068F50FC9F4F62 +:103A5200FC8F4FFC9FDFFBD54FFCDF05F53AFCEFF7 +:103A62001A404FFC05DE06CF3AFC02EF0ED94FFC9E +:103A7200F11231FE03311F609F3AFC8F53FC4F3A23 +:103A8200FCDD23571F8F3AFC9F53FC5600664C08FF +:103A9200DE1073097E224F3AFCDC046677EF038660 +:103AA200EFEB679F43FC8FFCFB5C01D1DD03F2EF80 +:103AB2000FE94FFC093E2270C15013FDB605C0F25A +:103AC200C6D7C7168B728C01614ADE248B728C02B8 +:103AD200614ADE188C01728C02614ADE068C013169 +:103AE2008EEF048C02318E087208EF268B72EF2261 +:103AF2008B728C02614ADE048B72EF168C01728C1F +:103B0200026142DE068C01318EEF048C02318E0896 +:103B12007208C6D7C716710AE7710BE37150F0003D +:103B2200CE300BCF170006669E31FD0D03717A3041 +:103B3200710BE33182E302EFFA8D1F7158F00071CD +:103B42000BE772C6D7C7C1C1FBF8FF8F2EFC4E022E +:103B5200DC03F2EF318C024F2FFCDC0452FFEF2624 +:103B62008C022F2EFC706131318D128F2FFC2F2E83 +:103B7200FC70613133BDD813FDF10DBB440001DC93 +:103B820003F690BB8B721004C6D7C7C1C1FBF8FF06 +:103B9200AC0A14A91489708C026128706131FDB0DD +:103BA2004F1344030071FEDC24AC0A148A04819A88 +:103BB20004AC0A148A044C11DC11A9148C0299ACCD +:103BC2000A14CA0200AC0A14CA0310EF74AC0A1435 +:103BD200CA0400AC0A14A914894E02DE0AAC0A1403 +:103BE2008A02819A02EF13AC0A14A914894E026167 +:103BF200D308AC0A148A02919A02AC0A148A03917D +:103C02009A03D1DF3CAC0A148A024C10DF10A914CB +:103C120089318EA112AC0A14A9146299EF17AC0A69 +:103C2200148A024CF0DF0EA91489318EB112AC0A4B +:103C320014A9146299AC0A14CA0200AC0A14CA0389 +:103C4200101004C6D7ED8D3C717BFAC7D55EFC61BE +:103C5200F831742230717422711123717322D55E8E +:103C6200FCDD06B05EFCCEABAC717AFA5600664C57 +:103C72000ADD1272F3311C7948FDCEFC0061CAFDE7 +:103C8200EC3C86EFE9717AFAF2C6D7C75600664C69 +:103C920010DE0BF0317E12F67860FC86EFF0C6D7AC +:103CA200C7C1C1FBF8FFCC01008C014C10DE36719C +:103CB2007BFA8C01F0317E0460FC14A96168DF0993 +:103CC200AC02B9717AFAF2EF1D8C01F0317E1279F1 +:103CD20060FC614902DF06717AFAE2EF09717AFA51 +:103CE200615901EFC4E21004C6D7C72004FBF8FFF4 +:103CF200F64260FC61F8EDD13D717BFA9C038C03C6 +:103D02004C10DE3C8C03F0317E0460FC14A9616827 +:103D1200DF05717AFAEF29717AFA8C0372F3311C9A +:103D22007960FCCEFC0061CA629C02D1DF0A8C037E +:103D3200F0317E12E67860FC717BFA615903EFBEC6 +:103D4200CC0200CC01018C02F0317E0460FC14A98B +:103D52006168DD7B8C02F0317E127960FCE743DF23 +:103D6200688C014C10DE628C01F0317E127960FCAD +:103D7200E743DD50717BFA8C01F0317E0460FC1464 +:103D8200A96168DF1B616901717BFA8C01F0317EE8 +:103D920012F67860FC717AFA8C024E01DCE7EF2FA2 +:103DA2008C01F0317E0460FC14A9128C02F0317E89 +:103DB200337860FC8C01F0317E12E67860FC615948 +:103DC20002717AFA615901EF98615902ED483D009A +:103DD200F21004C6D7C72006FBF8FF341BFCC550FF +:103DE20006C150A8C15030FD5B031006D2DD1DA0F4 +:103DF20080FC4080FC08DE03E2EF5A3416FC895C4A +:103E0200FC99FDA03E7110E4FBF2EF49F580FC8FB6 +:103E120016FC5C01D1DD264020F903DF205010C1E1 +:103E220080FDFC37C0C736100571D4C6DE0F17C13E +:103E32005006C150A8C15030FD5B0310064020F966 +:103E420001DD114020F905DD0B8F16FC5C02D1610A +:103E5200E8FD5B45F21006C6D7D917FCC15030FD0C +:103E62003103C0629F1AFC7130E7FB8FEFFB5C08E5 +:103E7200D1DF06716307716B27F2D7D91AFCC1D95A +:103E820019FCC15030FDCD0310047130E7FB8FEFF8 +:103E9200FB5C08D1DF06716307716B27F2D7C7207D +:103EA2000AFBF8FF500FC15030FD3103C04043FB05 +:103EB20002DF077110E4FBF2EF547118E4FBCC0748 +:103EC20000CC0812CC09808F16FC5C03D1DF08718C +:103ED2007AD5CC0607EF06717BD5CC062F170406E0 +:103EE20000C15004C150A0C15030FD03041006C7E8 +:103EF20036100571D4C6DE154020F903DF0F17C155 +:103F02005006C150A8C15030FD5B031006F2100AE2 +:103F1200C6D7C74020F902DF04F6BF84FCB05CFDBF +:103F2200D55CFD61E8ED2440CF5CFD048F20F931C2 +:103F32008FE723DD0B24020024030061C8ED244037 +:103F42003028004284FCDF0AE0C15010FDFC37C07B +:103F5200EF2530FA004284FCDF0B5002C15010FD05 +:103F6200FC37C0EF128FFAFB5010D604FA004284DD +:103F7200FC61D8712022F931340709712323F6BF7D +:103F820084FCEF1731242306F6BF84FCEF0DA284D4 +:103F9200FCF64284FCDF04B1BF84FC8F23F9318F2D +:103FA200E7240000DD0623DD0D23DF123610057144 +:103FB200C4713123EF0B710402713123EF037132AB +:103FC200233132231A4086FC0361D8A086FC408646 +:103FD200FC02DF0E5004C15010FDFC37C0EF03F5A8 +:103FE20086FC3134231A4088FC0361D8A088FC4047 +:103FF20088FC02DF0E5008C15010FDFC37C0EF03F1 +:10400200F588FC314207184087FC0361D8A087FC81 +:104012004087FC02DF0C5010C1FDFC37C0EF03F5F6 +:1040220087FCC6D7C736100571D4DE0730D73DFDF1 +:10403200A23CD24020F903DF413122070630EC2BAB +:10404200FDA23C3144230C7143235080C15012FD28 +:10405200FC37C0D58AFCDD05B08AFCEF1DCF8AFC97 +:10406200068F37FC5C01D1DD118F43FC4F44FCDD30 +:10407200095040C15012FDFC37C04020F903DD0554 +:10408200F6BD1AEF25D502FCDF09F6461ADD1BB68E +:104092001AEF17D9FEFBF1461ADD0FD9FEFB12AD5E +:1040A2001A43DE04A61AEF02B61AC6D7C78FF6FB6A +:1040B20076F5F6FB5C10D161E8715223665C0FD194 +:1040C200DD60665C01D1DD05F520F9EF55665C0225 +:1040D200D1DD15E0C15003C15084FDCD0310047140 +:1040E2001300711B20710303665C04D1DD1271138E +:1040F20000711B20D537FC61F8710303CF37FC0335 +:10410200665C08D161E87103035005FDA3027102E8 +:10411200035003C1C15084FDCD031004711A20FD68 +:10412200E92CF2C6D7C7364105718461D8EDCB417F +:104132003641057194DE0771405005CEABAC31B209 +:10414200D104E2EDDA41713BD1CEABAC401AF909B0 +:10415200DE77D51AF9DF618F22F93133088F23F91F +:104162009F4005EF04CF400504F0C15084FD3103A8 +:10417200C0629F8EFC8F32FD9F8FFC3690FCC75031 +:1041820002C15008C1506CFD5B0310068F8CFC9F6E +:1041920092FC8F02F99F93FC713420E66130127118 +:1041A200042061DC31196162629F94FC8F22F93133 +:1041B20069317A9F95FCEF0BD91AF9F112498DFCFE +:1041C2009F4005A01AF9E2EF0F7160500571485047 +:1041D20005713BD5F51AF9F2C6D7C78F20F9318F91 +:1041E200E724000061F8EDAD4323DD1B2361F8ED08 +:1041F200B4422361F8ED32432361F8ED7B4323613E +:10420200F8ED4A44EDAD43D521F9DF2BF64284FCAB +:10421200DD05F55EFDEF03A05EFD405EFD65DC0998 +:10422200F520F9717222EDCA44AF84FC440A0061A0 +:10423200D8EDCA44E521F9712223F55EFDF5F9FBBB +:10424200FD2705714320FDFB234023F903DF09719C +:104252007222F520F9EDCA44FD222740E3FB9BDEE2 +:1042620009717222F520F9EDCA44714A2771401191 +:104272000571301105713A22715A22711A2EFD21EF +:104282002BD2DD09717222F520F9EDCA4471103585 +:1042920000CF37001D714012054021F901DF05F5FD +:1042A200FFFBEF04CFFFFB03CF20F902FDFF2AED56 +:1042B200CA44FD142DFD742D714A9DFD4138FDE166 +:1042C20033F537FF712BE0F521F9717222CBE43F10 +:1042D200EFCBE6F6F0FD2705713BD48F22F93105CD +:1042E200305004C15084FD3103C0625C03318E3111 +:1042F2005D34E5FB896168995002C15084FD310348 +:10430200C0D2DD067170E5FBEF047178E5FBFDFBC1 +:1043120023FD2B2E710822F9CF20F9038FD8FB5CE5 +:1043220002D1DD095080C15010FDFC37C0EDCA44F6 +:10433200FDCC4431A4E020712BE031020C05FD4696 +:1043420045EF145027C15005C15084FDCD03100420 +:10435200CF20F9047172223154230BA098FCD59816 +:10436200FC61F8FD4645FD39458F22F9314507319B +:10437200040703F520F9EDCA44FDCC4431020C18C0 +:10438200F0C15005C15084FDCD0310045005FDA3BA +:1043920002FD4645CF20F903FD39458F22F931450B +:1043A2000731040703F520F9EDCA44F520F9CFFFE0 +:1043B200FB03F500FCF502FC713221F6426CFF6151 +:1043C200E8EDCA44712822F9F516FCFDA03EFDBBBA +:1043D2002EFD6B2DFDC92D714B9DF5E6FBF5E7FB1F +:1043E200F5E8FBF5E9FB31042102EFFACE3708CB01 +:1043F200E4BFFFCBE6FFF1CED4FFCF37000971480F +:104402001205F6BEE0BEE2BED0716A27FD9E2B7198 +:104412004307714B27714810057148110571381017 +:104422000571381105713302713B22715302715BC0 +:104432002271130E711B2EFD9005F55EFDCF20F942 +:1044420005712223F6BF84FC3102072CFDFB23AF4A +:1044520084FC440A00DC06E521F9E520F9D523F9BC +:1044620061E8FD90058F22F931455D502EFDA302D2 +:10447200E521F9E520F9EF50D50BF9DF4BF521F9EC +:10448200FD9005FD7F237173017132043112050223 +:10449200EFFA71430271032071422031949E02EFC0 +:1044A200FA712AE7CEA409F5F30061FD310407038E +:1044B200712323E5F300CEA408712BE7E520F98FE1 +:1044C20022F9314503F520F9C6D7D599FCDF1E3113 +:1044D2000200195003C15084FD3103C0625C01D156 +:1044E200DF07F520F9717222D7E599FCD74099FCD4 +:1044F200F0DF083104003FF599FCD74099FCC8DF92 +:104502000BF520F9717222CF99FCF0D73102000429 +:10451200A099FCD7F0C15004C15084FDCD03100412 +:104522008FE5FB5C9F9FE5FB7110F6FB30AE40FD13 +:10453200A23CCF99FCF0D78F22F9312506F520F95C +:10454200717222D7715323F598FC717207FD0D0326 +:10455200717307D7FDFD05F2D7C7200CFBF8FF8F5B +:104562001CFCF0F91BFCF303FDB04F13BC048F1EBF +:10457200FCF0F91DFCF303FDB04F13BC028F20FCCD +:10458200F0F91FFCF303FDB04F13BBAC04BDD8F62A +:10459200BDDAAC04311EBDDCF6BDDEFDA40DADD826 +:1045A200BDDCADDABDDEAC02BDD8F6BDDAAC02319F +:1045B2001EDADCC3DADEC3BDDCF6BDDEFDA40DC04F +:1045C200BDDEC0BDDCADDEFD1A0FADD8BDDCADDA9F +:1045D200BDDEABBDD8F6BDDAAB311EDADCC3DADE46 +:1045E200C3BDDCF6BDDEFDA40DC0BDDEC0BDDCADCD +:1045F200DEFD1A0FDADAADD8FDAC49C3C58F26FD50 +:104602005C3FF0317E04A6FC14C2C0B9A026FDF6C0 +:10461200BC08BC0A9C078C074C2EDD3E8F26FD0E83 +:104622000770F161DC605C3FF0317E1279A6FCBD5F +:10463200D8F6BDDA8C0773098822318FBDDC70BDD4 +:10464200DEFDA40DAC08BDDCAC0AFD1A0FADDABC70 +:104652000AADD8BC08615907EFBCAC08BDD8AC0A9A +:10466200BDDAC9DC0004F6FD6E0EC9DCFFFFF6FD03 +:104672006F0FADD8BFA0FCAF9AFC42A0FCDD12AF19 +:104682009CFCBF9EFCAF9AFCBF9CFCAFA0FCBF9AF7 +:10469200FCAF9CFC429EFCDC50AF9AFC429CFCDED0 +:1046A20048AF60FD429AFCDE404064FD16DC1F40CC +:1046B20064FDA0DE168FA2FC4F64FDDE0EAF9AFCF5 +:1046C20022A4FC44691061C8FD3447F564FDAF9A29 +:1046D200FC445146DC0BAF9AFC241027BF62FDEF6D +:1046E2001930F82ABF62FDEF114064FDFFDD03E6D9 +:1046F200EF01F63464FD89610899AF9EFC429CFC8F +:10470200DC1BAF9CFC429AFCDE13AF9AFC4262FDBA +:10471200DE0BF5A2FCAF9AFCBFA4FCEF1140A2FC99 +:10472200FFDD03E6EF01F634A2FC89610899100C63 +:10473200C6D7C72006FBF8FFA021FCD521FCDF1C51 +:10474200A022FCD522FCDF14A023FCD523FCDF0C25 +:10475200CF21FCFFCF22FCFFCF23FCFF717BFA713C +:104762000A9E31929E02EFFA8E98FD830F9C039F60 +:104772002AFD8E949F65FD8E969F66FD8E979F679C +:10478200FD8E939F28FD8E929F29FDFD154913BC36 +:1047920004BDD8F6BDDA46DADF03B146D8DF198C9C +:1047A200035C0391DF03E6EF01F6046D01313D1274 +:1047B2000103B1BC046169038F68FD4E03DF12AFD0 +:1047C2002CFD614904DE40AC04222CFDFD3648EF8D +:1047D200368C03318EB112D968FDF143DF1E8C0392 +:1047E2005C0391DF03E6EF01F6046D01313D120136 +:1047F20003222CFD610904FD3648EF0B8F68FD4E44 +:1048020003DE04F6FD36488C039F68FDAC04BF2C22 +:10481200FDD927FDF1010424F9BB14A944FFFFDFF0 +:1048220004E6B9EF0BAB14A944FEFFDD03A9A1B95D +:104832001006C6D7C7161744A90061C836A800A03B +:1048420027FD4027FDA861C8F527FDF927FDF331B3 +:104852001CF67824F9B7F647DFE5C6D7C756A896FF +:1048620066F0317E12F6B17824F966D1DFF1F521D6 +:10487200FCF522FCF523FCF527FDC6D7716323D78F +:10488200C72004FBF8FFD91AF9F1E7240000DD1173 +:1048920023DD1C23DD2123DD2623DD2F23DD34EF61 +:1048A2003A8F27FD9F2EFDA01AF9F965FDEF60A052 +:1048B2001AF9F966FDEF58A01AF9F967FDEF50A051 +:1048C2001AF98F2AFDFD9D0F72EF44A01AF9F928FB +:1048D200FDEF3CA01AF9F929FDEF34F92EFDF33171 +:1048E2001C7924F9BB316223058B9C03EF128C01E6 +:1048F2009C03D52EFDDF06CF2EFDA7EF03B02EFDC4 +:10490200718071672361DC61FB7161238C0372101A +:1049120004C6D7C72008FBF8FF8E989C058E979C8B +:10492200048E969C038E949C028E939C018E929B85 +:10493200710B9E717AFA8C05FD830F9C058C04FD28 +:10494200830F9C048C03FD830F9C038C02FD830F59 +:104952009C028C04F0317E1279B822BC068C055C74 +:1049620003D1DF098C044C0361C86179068C0331E1 +:104972008EB1610906BC06313D120103BC068C06EC +:104982000E02708C071C00BC068F26FC4E01DC0D4B +:104992008C014F26FCDC0B8F27FC4DDE05AC06128A +:1049A200EF04AC06B1121008C6D7C7C3C12008FB7A +:1049B200F8FFF661490A61F8614908DF07F7340038 +:1049C20000ED494AE6BC04F6BC06AC0ABC02AC08DF +:1049D200BBAC06614902AC0461F8614900DE28AC57 +:1049E20004BDD8AC06BDDAE1FD290FADDABC06ADD7 +:1049F200D8BC04ABBDD8AC02BDDAE1FD440FADDAE0 +:104A0200BC02ADD8BBEFCAAC06BC02AC04BBAC085E +:104A1200BDD8AC0ABDDAAC04BDDCAC06FDA70EAC59 +:104A220004BDDCAC06FD1A0FE1FD440FADDABC0695 +:104A3200ADD8BC04AC06614902AC0461F86149001E +:0B4A4200DCC5AC0214AB12100CC6D790 +:104A4D0061FC61FCC1C3C5C7520C929269D4FEC111 +:104A5D00DFF88EFD708EFCC1717AFA4020F903DF0C +:104A6D000630EC2BFDA23CC09EFC609EFD34D4FEB6 +:104A7D005206C0B9A5A592DFF9C6C4C2C061FC61DA +:104A8D00DF520C929269D4FEC1DFF88EFD708EFC60 +:104A9D00C1717AFAC736410571A4C6DC51F534FDF2 +:104AAD0071485005716050053124223671620771CD +:104ABD0023228FE6FB5FEEFBD1DF1B8FE7FB5FEF62 +:104ACD00FBD1DF128FE8FB5FF0FBD1DF098FE9FB34 +:104ADD005FF1FBD1DD0C31620702EFFA71630771F3 +:104AED006B27FD7E48FD8D33F51AF9ED104CC73659 +:104AFD0041057184C6DE0DF534FD71485005FD8DFF +:104B0D0033ED104CC73641057194C6DE154034FDAA +:104B1D0003DD0C4034FD04DD064034FD0161F8F584 +:104B2D0034FDD934FDF1E7240000DD0823DD132326 +:104B3D00DD39EF6071405005E534FD71505005EDE4 +:104B4D00104C8F40059F1BF99F1EF9D91BF9FD4E87 +:104B5D0037629F1DF9401BF97FDD06CF34FD02EF53 +:104B6D0003F534FD71505005ED104CC736410571FC +:104B7D0094C6DE1CC736410571C4C6DE06CF34FDB2 +:104B8D0003EF11F534FD7148500571605005EF7359 +:104B9D00CF34FD044034FD03DF138F1DF99F400515 +:104BAD00D91DF9C1D91BF9FDCD37C0EF108F4005C7 +:104BBD0076C7D91BF9FD1234C071505005D91EF9B5 +:104BCD00F1242900DD2D240400DD28242200DD231D +:104BDD00241100DD0C240100DD19241E00DD14EF6D +:104BED000C401BF960DF0CCF1BF961EF06F51AF9CC +:104BFD00A01BF94034FD03DF0AD91BF9FD4E3762C6 +:104C0D009F1DF9C09EFC609EFD34D4FE5206C0B9B6 +:104C1D00A5A592DFF961FCC1C3C5C7520C9292697B +:104C2D00D4FEC1DFF88EFD708EFCC1F616717AFAD6 +:104C3D00714AE5717BBD51405F0401D1DD05A7F6D9 +:104C4D0047DFF3300400BF2401F6BF2A01300B0B00 +:104C5D00BF2801FD0D03300B0FBF2801FD0D0330E3 +:104C6D000F0FBF2801710AE6710321C09EFC609EE3 +:104C7D00FD34D4FE5206C0B9A5A592DFF9C6C4C253 +:104C8D00C061FCC1C3C5C7520C929269D4FEC1DF8D +:104C9D00F88EFD708EFCC1717AFAD542FBDD0EEBFC +:104CAD0040FB899E44A240FBB042FBEF2B710AE60C +:104CBD00300400BF2401F6BF2A01300B0BBF2801C1 +:104CCD00FD0D03300B0FBF2801FD0D03300F0FBF7E +:104CDD002801717320710321C09EFC609EFD34D4A8 +:104CED00FE5206C0B9A5A592DFF9C6C4C2C061FCCB +:104CFD0061EF520C929269D4FEC1DFF88EFD708E79 +:104D0D00FCC12008FBF8FF71503002CEABACCC01DA +:104D1D0000F6BC0231B2E20F617902F6614902DFA1 +:104D2D00F371603002EF7E8E519B713BE28B5C0222 +:104D3D00D1DD1D8B5C08D1DF0971503002CC010033 +:104D4D00EFCF8C0770FDA838629E50CC0102EFC1E9 +:104D5D008B5C03D1DF408E509C05715030028C016D +:104D6D00D1DF0E8C0570FDFE38629C07CC0101EF82 +:104D7D00318C014C02DF0671603002EF28CF340216 +:104D8D005A716030028C0570C18C0770FD4F38C0B0 +:104D9D00CF34024AEF0F8B5C01D1DD06716030021A +:104DAD00EF03ED1E4D1008C09EFC609EFD34D4FE39 +:104DBD005206C0B9A5A592DFF961FCC1C3C5C752A2 +:104DCD000C929269D4FEC1DFF88EFD708EFCC1711C +:104DDD000A9E31929E02EFFA8F10FC4F96FFDF195B +:104DED008F11FC4F97FFDF118F12FC4F98FFDF09DA +:104DFD005004C15011FDFC37C0710B9EC09EFC606C +:104E0D009EFD34D4FE5206C0B9A5A592DFF9C6C4E5 +:104E1D00C2C061FCA05EFC61FCC1C3C5C7520C924F +:104E2D009269D4FEC1DFF88EFD708EFCC1C1FBF816 +:104E3D00FF8D1F9C018E31318EE7240600DD082386 +:104E4D00DD0F23DD25EF45717AFA8C019F48FCEFCC +:104E5D003B717AFA4023F901DF078C019F47FCEF84 +:104E6D002B51FF2E019F47FCEF22717AFA8C019F87 +:104E7D0002F98FE4FB5C01D1DF124020F903DD065E +:104E8D004020F904DF06306426FDA23C4031FF09C5 +:104E9D00DE05A031FFEF197158F000713222405D2F +:104EAD00FC02DF03F6EF05D95DFCF1A1609F5DFC0F +:104EBD00710BE3C0C09EFC609EFD34D4FE5206C053 +:104ECD00B9A5A592DFF9C6C4C2C061FC61FF520C41 +:104EDD00929269D4FEC1DFF88EFD708EFCC1717A9D +:104EED00FA8F16FC5C03D1DD194020F903DD064075 +:104EFD0020F904DF0D36100571D4DE0630D73DFDE7 +:104F0D00A23CC09EFC609EFD34D4FE5206C0B9A5E5 +:104F1D00A592DFF961FC61FC61FC61FC61FC61FC47 +:104F2D0061FC61FC61FC61FC61FC61FC61FC61FC8C +:104F3D0061FC61FC61FC61FC61FC61FC61FC61FC7C +:0E4F4D0061FC61FC61FC61FC61FC61FC61FCCB +:0A4F5C0000060C12181E242A30363D +:104F660000163248648096122844607692082440DF +:104F7600FF000000555555554700DEFB00000000B8 +:104F86004BFC00000000143F4B39D222D32E643074 +:104F9600E130233226407C09DC4101000000983ACA +:0A4FA600F82AFF23301299000000E2 +:084FB000317503F7332312D71A +:0A4FF60030383A35343A3333000006 +:00000001FF + \ No newline at end of file diff --git a/branches/sim/bsr.lmf b/branches/sim/bsr.lmf new file mode 100644 index 0000000..d779fe4 Binary files /dev/null and b/branches/sim/bsr.lmf differ diff --git a/branches/sim/bsr_k0r.map b/branches/sim/bsr_k0r.map new file mode 100644 index 0000000..229ffe3 --- /dev/null +++ b/branches/sim/bsr_k0r.map @@ -0,0 +1,687 @@ + + + +78K0R Linker W1.33 Date:10 Jun 2011 Page: 1 + +Command: -yc:\program files (x86)\nec electronics tools\dev -_msgoff - + obsr.lmf ..\..\..\Program Files (x86)\NEC Electronics Tools\C + C78K0R\W2.13\lib78k0r\s0rm.rel -gi1B339499E033F240BFAAh -pbsr + _k0r.map -nkd -gb7EFBFFh -bC:\Program Files (x86)\NEC Electro + nics Tools\CC78K0R\W2.13\lib78k0r\fsl.lib -bcl0rdm.lib -bcl0r + m.lib -bcl0rmf.lib -iC:\Program Files (x86)\NEC Electronics T + ools\CC78K0R\W2.13\lib78k0r -dbsr_mcu.dr -s -w0 loader.rel pm + .rel i2c_ctr.rel main.rel magic.rel WDT.rel i2c_mcu.rel i2c_t + wl.rel led.rel rtc.rel vreg_ctr.rel vreg_twl.rel adc.rel reng + e.rel accero.rel self_flash.rel sw.rel task_debug.rel task_mi + sc.rel task_sys.rel pedo_alg_thre_det2.rel ini_VECT.rel task_ + status.rel led_cam.rel led_pow.rel +Para-file: +Out-file: bsr.lmf +Map-file: bsr_k0r.map +Direc-file:bsr_mcu.dr + + +*** Link information *** + + 65 output segment(s) + 3DA7H byte(s) real data + 5803 symbol(s) defined + + +*** Memory map *** + + + SPACE=REGULAR + + MEMORY=BCL0 + BASE ADDRESS=00000H SIZE=01000H + OUTPUT INPUT INPUT BASE SIZE + SEGMENT SEGMENT MODULE ADDRESS + @@VECT00 00000H 00002H CSEG AT + @@VECT00 @cstart 00000H 00002H + LDR_CNSL 00002H 00000H CSEG PAGE64KP + LDR_CNSL 00002H 00000H CSEG PAGE64KP + LDR_CNSL loader 00002H 00000H + LDR_CNSL 00002H 00000H CSEG PAGE64KP + LDR_CNSL main 00002H 00000H + LDR_CNSL 00002H 00000H CSEG PAGE64KP + LDR_CNSL WDT 00002H 00000H + LDR_CNSL 00002H 00000H CSEG PAGE64KP + LDR_CNSL i2c_mcu 00002H 00000H + LDR_CNSL 00002H 00000H CSEG PAGE64KP + LDR_CNSL self_flash + 00002H 00000H + LDR_CNSL 00002H 00000H CSEG PAGE64KP + LDR_CNSL task_debug + 00002H 00000H + LDR_CNSL 00002H 00000H CSEG PAGE64KP + LDR_CNSL task_status + 00002H 00000H +* gap * 00002H 0000EH + @@VECT10 00010H 00004H CSEG AT + @@VECT10 ini_VECT 00010H 00004H +* gap * 00014H 00008H + @@VECT1C 0001CH 00002H CSEG AT + @@VECT1C ini_VECT 0001CH 00002H +* gap * 0001EH 00006H + @@VECT24 00024H 00002H CSEG AT + @@VECT24 ini_VECT 00024H 00002H +* gap * 00026H 00004H + @@VECT2A 0002AH 00002H CSEG AT + @@VECT2A i2c_twl 0002AH 00002H +* gap * 0002CH 00008H + @@VECT34 00034H 00008H CSEG AT + @@VECT34 ini_VECT 00034H 00008H +* gap * 0003CH 0000EH + @@VECT4A 0004AH 00002H CSEG AT + @@VECT4A ini_VECT 0004AH 00002H +* gap * 0004CH 0000EH + @@VECT5A 0005AH 00002H CSEG AT + @@VECT5A i2c_ctr 0005AH 00002H +* gap * 0005CH 00006H + @@VECT62 00062H 00002H CSEG AT + @@VECT62 accero 00062H 00002H +* gap * 00064H 0005CH + ?CSEGOB0 000C0H 00004H CSEG OPT_BYTE + @@CODE 000C4H 00000H CSEG BASE + @@CODE magic 000C4H 00000H + @@CODE ini_VECT 000C4H 00000H + LDR_CODL 000C4H 00000H CSEG + LDR_CODL loader 000C4H 00000H + LDR_CODL main 000C4H 00000H + LDR_CODL WDT 000C4H 00000H + LDR_CODL i2c_mcu 000C4H 00000H + LDR_CODL self_flash + 000C4H 00000H + LDR_CODL task_debug + 000C4H 00000H + LDR_CODL task_status + 000C4H 00000H + ?CSEGSI 000C4H 0000AH CSEG + LDR_CODE 000CEH 00945H CSEG + LDR_CODE loader 000CEH 00218H + LDR_CODE main 002E6H 00042H + LDR_CODE WDT 00328H 00000H + LDR_CODE i2c_mcu 00328H 002F0H + LDR_CODE self_flash + 00618H 00373H + LDR_CODE task_debug + 0098BH 00000H + LDR_CODE task_status + 0098BH 00088H + FSL_CODE 00A13H 00322H CSEG + FSL_CODE fsl_block_cmd + 00A13H 0002BH + FSL_CODE fsl_block_check + 00A3EH 00013H + FSL_CODE fsl_common + 00A51H 0014FH + FSL_CODE fsl_reset + 00BA0H 00001H + FSL_CODE fsl_si_ibf + 00BA1H 00064H + FSL_CODE fsl_phySwap + 00C05H 0004DH + FSL_CODE fsl_si_common + 00C52H 00061H + FSL_CODE fsl_swap 00CB3H 00030H + FSL_CODE fsl_write + 00CE3H 00052H + @@LCODE 00D35H 00277H CSEG + @@LCODE @cstart 00D35H 0006DH + @@LCODE @imul 00DA2H 00011H + @@LCODE @lumul 00DB3H 0002BH + @@LCODE @isdiv 00DDEH 00022H + @@LCODE @iudiv 00E00H 0002DH + @@LCODE @isrem 00E2DH 00021H + @@LCODE @iurem 00E4EH 0002FH + @@LCODE @lsdiv 00E7DH 00039H + @@LCODE @ludiv 00EB6H 0003FH + @@LCODE @divuw 00EF5H 00034H + @@LCODE @ladd 00F29H 0000FH + @@LCODE @llsh 00F38H 0001BH + @@LCODE @lursh 00F53H 0001FH + @@LCODE @iscmp 00F72H 0000CH + @@LCODE @lband 00F7EH 00014H + @@LCODE @bcdtob 00F92H 0001AH +* gap * 00FACH 0004AH + MGC_LOAD 00FF6H 0000AH CSEG AT + MGC_LOAD magic 00FF6H 0000AH + + MEMORY=ROM + BASE ADDRESS=02000H SIZE=03000H + OUTPUT INPUT INPUT BASE SIZE + SEGMENT SEGMENT MODULE ADDRESS + MGC_MIMI 02000H 0000AH CSEG AT + MGC_MIMI magic 02000H 0000AH + @@CNST 0200AH 00282H CSEG + @@CNST @cstart 0200AH 00000H + @@CNST loader 0200AH 00000H + @@CNST pm 0200AH 001D0H + @@CNST i2c_ctr 021DAH 00000H + @@CNST main 021DAH 00000H + @@CNST magic 021DAH 00000H + @@CNST WDT 021DAH 00000H + @@CNST i2c_mcu 021DAH 00000H + @@CNST i2c_twl 021DAH 00000H + @@CNST led 021DAH 00000H + @@CNST rtc 021DAH 00000H + @@CNST vreg_ctr 021DAH 00000H + @@CNST vreg_twl 021DAH 00000H + @@CNST adc 021DAH 00048H + @@CNST renge 02222H 00000H + @@CNST accero 02222H 00000H + @@CNST self_flash + 02222H 00002H + @@CNST sw 02224H 00000H + @@CNST task_debug + 02224H 00000H + @@CNST task_misc + 02224H 00000H + @@CNST task_sys 02224H 00000H + @@CNST pedo_alg_thre_det2 + 02224H 00048H + @@CNST ini_VECT 0226CH 00000H + @@CNST task_status + 0226CH 00000H + @@CNST led_cam 0226CH 00000H + @@CNST led_pow 0226CH 00020H + ROM_CODE 0228CH 026F1H CSEG + ROM_CODE pm 0228CH 009F9H + ROM_CODE i2c_ctr 02C85H 00060H + ROM_CODE i2c_twl 02CE5H 0005EH + ROM_CODE led 02D43H 00265H + ROM_CODE rtc 02FA8H 000E0H + ROM_CODE vreg_ctr 03088H 00486H + ROM_CODE vreg_twl 0350EH 000FAH + ROM_CODE adc 03608H 002E7H + ROM_CODE renge 038EFH 00190H + ROM_CODE accero 03A7FH 0013DH + ROM_CODE sw 03BBCH 00178H + ROM_CODE task_misc + 03D34H 00177H + ROM_CODE task_sys 03EABH 00373H + ROM_CODE pedo_alg_thre_det2 + 0421EH 00502H + ROM_CODE led_cam 04720H 000DBH + ROM_CODE led_pow 047FBH 00182H + @@BASE 0497DH 004C6H CSEG BASE + @@BASE loader 0497DH 00000H + @@BASE pm 0497DH 0003FH + @@BASE i2c_ctr 049BCH 0018DH + @@BASE main 04B49H 00000H + @@BASE magic 04B49H 00000H + @@BASE WDT 04B49H 00000H + @@BASE i2c_mcu 04B49H 0009CH + @@BASE i2c_twl 04BE5H 000CBH + @@BASE led 04CB0H 00000H + @@BASE rtc 04CB0H 0005EH + @@BASE vreg_ctr 04D0EH 00000H + @@BASE vreg_twl 04D0EH 00000H + @@BASE adc 04D0EH 000B3H + @@BASE renge 04DC1H 00000H + @@BASE accero 04DC1H 0004AH + @@BASE self_flash + 04E0BH 00000H + @@BASE sw 04E0BH 00000H + @@BASE task_debug + 04E0BH 00000H + @@BASE task_misc + 04E0BH 00000H + @@BASE task_sys 04E0BH 00000H + @@BASE pedo_alg_thre_det2 + 04E0BH 00000H + @@BASE ini_VECT 04E0BH 00038H + @@BASE task_status + 04E43H 00000H + @@BASE led_cam 04E43H 00000H + @@BASE led_pow 04E43H 00000H + @@CNSTL 04E43H 00000H CSEG PAGE64KP + @@CNSTL @cstart 04E43H 00000H + @@CNSTL 04E43H 00000H CSEG PAGE64KP + @@CNSTL pm 04E43H 00000H + @@CNSTL 04E43H 00000H CSEG PAGE64KP + @@CNSTL i2c_ctr 04E43H 00000H + @@CNSTL 04E43H 00000H CSEG PAGE64KP + @@CNSTL i2c_twl 04E43H 00000H + @@CNSTL 04E43H 00000H CSEG PAGE64KP + @@CNSTL led 04E43H 00000H + @@CNSTL 04E43H 00000H CSEG PAGE64KP + @@CNSTL rtc 04E43H 00000H + @@CNSTL 04E43H 00000H CSEG PAGE64KP + @@CNSTL vreg_ctr 04E43H 00000H + @@CNSTL 04E43H 00000H CSEG PAGE64KP + @@CNSTL vreg_twl 04E43H 00000H + @@CNSTL 04E43H 00000H CSEG PAGE64KP + @@CNSTL adc 04E43H 00000H + @@CNSTL 04E43H 00000H CSEG PAGE64KP + @@CNSTL renge 04E43H 00000H + @@CNSTL 04E43H 00000H CSEG PAGE64KP + @@CNSTL accero 04E43H 00000H + @@CNSTL 04E43H 00000H CSEG PAGE64KP + @@CNSTL sw 04E43H 00000H + @@CNSTL 04E43H 00000H CSEG PAGE64KP + @@CNSTL task_misc + 04E43H 00000H + @@CNSTL 04E43H 00000H CSEG PAGE64KP + @@CNSTL task_sys 04E43H 00000H + @@CNSTL 04E43H 00000H CSEG PAGE64KP + @@CNSTL pedo_alg_thre_det2 + 04E43H 00000H + @@CNSTL 04E43H 00000H CSEG PAGE64KP + @@CNSTL ini_VECT 04E43H 00000H + @@CNSTL 04E43H 00000H CSEG PAGE64KP + @@CNSTL led_cam 04E43H 00000H + @@CNSTL 04E43H 00000H CSEG PAGE64KP + @@CNSTL led_pow 04E43H 00000H + @@R_INIS 04E43H 00000H CSEG UNIT64KP + @@R_INIS @cstart 04E43H 00000H + @@R_INIS loader 04E43H 00000H + @@R_INIS pm 04E43H 00000H + @@R_INIS i2c_ctr 04E43H 00000H + @@R_INIS main 04E43H 00000H + @@R_INIS magic 04E43H 00000H + @@R_INIS WDT 04E43H 00000H + @@R_INIS i2c_mcu 04E43H 00000H + @@R_INIS i2c_twl 04E43H 00000H + @@R_INIS led 04E43H 00000H + @@R_INIS rtc 04E43H 00000H + @@R_INIS vreg_ctr 04E43H 00000H + @@R_INIS vreg_twl 04E43H 00000H + @@R_INIS adc 04E43H 00000H + @@R_INIS renge 04E43H 00000H + @@R_INIS accero 04E43H 00000H + @@R_INIS self_flash + 04E43H 00000H + @@R_INIS sw 04E43H 00000H + @@R_INIS task_debug + 04E43H 00000H + @@R_INIS task_misc + 04E43H 00000H + @@R_INIS task_sys 04E43H 00000H + @@R_INIS pedo_alg_thre_det2 + 04E43H 00000H + @@R_INIS ini_VECT 04E43H 00000H + @@R_INIS task_status + 04E43H 00000H + @@R_INIS led_cam 04E43H 00000H + @@R_INIS led_pow 04E43H 00000H + @@R_INIS @rom 04E43H 00000H + @@CALT 04E43H 00000H CSEG + @@CALT @cstart 04E43H 00000H + @@CALT loader 04E43H 00000H + @@CALT pm 04E43H 00000H + @@CALT i2c_ctr 04E43H 00000H + @@CALT main 04E43H 00000H + @@CALT magic 04E43H 00000H + @@CALT WDT 04E43H 00000H + @@CALT i2c_mcu 04E43H 00000H + @@CALT i2c_twl 04E43H 00000H + @@CALT led 04E43H 00000H + @@CALT rtc 04E43H 00000H + @@CALT vreg_ctr 04E43H 00000H + @@CALT vreg_twl 04E43H 00000H + @@CALT adc 04E43H 00000H + @@CALT renge 04E43H 00000H + @@CALT accero 04E43H 00000H + @@CALT self_flash + 04E43H 00000H + @@CALT sw 04E43H 00000H + @@CALT task_debug + 04E43H 00000H + @@CALT task_misc + 04E43H 00000H + @@CALT task_sys 04E43H 00000H + @@CALT pedo_alg_thre_det2 + 04E43H 00000H + @@CALT ini_VECT 04E43H 00000H + @@CALT task_status + 04E43H 00000H + @@CALT led_cam 04E43H 00000H + @@CALT led_pow 04E43H 00000H + @@RLINIT 04E43H 00000H CSEG UNIT64KP + @@RLINIT loader 04E43H 00000H + @@RLINIT pm 04E43H 00000H + @@RLINIT i2c_ctr 04E43H 00000H + @@RLINIT main 04E43H 00000H + @@RLINIT magic 04E43H 00000H + @@RLINIT WDT 04E43H 00000H + @@RLINIT i2c_mcu 04E43H 00000H + @@RLINIT i2c_twl 04E43H 00000H + @@RLINIT led 04E43H 00000H + @@RLINIT rtc 04E43H 00000H + @@RLINIT vreg_ctr 04E43H 00000H + @@RLINIT vreg_twl 04E43H 00000H + @@RLINIT adc 04E43H 00000H + @@RLINIT renge 04E43H 00000H + @@RLINIT accero 04E43H 00000H + @@RLINIT self_flash + 04E43H 00000H + @@RLINIT sw 04E43H 00000H + @@RLINIT task_debug + 04E43H 00000H + @@RLINIT task_misc + 04E43H 00000H + @@RLINIT task_sys 04E43H 00000H + @@RLINIT pedo_alg_thre_det2 + 04E43H 00000H + @@RLINIT ini_VECT 04E43H 00000H + @@RLINIT task_status + 04E43H 00000H + @@RLINIT led_cam 04E43H 00000H + @@RLINIT led_pow 04E43H 00000H + @@RLINIT @rom 04E43H 00000H + @@CODEL 04E43H 00000H CSEG + @@CODEL pm 04E43H 00000H + @@CODEL i2c_ctr 04E43H 00000H + @@CODEL magic 04E43H 00000H + @@CODEL i2c_twl 04E43H 00000H + @@CODEL led 04E43H 00000H + @@CODEL rtc 04E43H 00000H + @@CODEL vreg_ctr 04E43H 00000H + @@CODEL vreg_twl 04E43H 00000H + @@CODEL adc 04E43H 00000H + @@CODEL renge 04E43H 00000H + @@CODEL accero 04E43H 00000H + @@CODEL sw 04E43H 00000H + @@CODEL task_misc + 04E43H 00000H + @@CODEL task_sys 04E43H 00000H + @@CODEL pedo_alg_thre_det2 + 04E43H 00000H + @@CODEL ini_VECT 04E43H 00000H + @@CODEL led_cam 04E43H 00000H + @@CODEL led_pow 04E43H 00000H +* gap * 04E43H 00001H + @@CNSTL 04E44H 0000AH CSEG PAGE64KP + @@CNSTL @bcdtob 04E44H 0000AH + @@R_INIT 04E4EH 00038H CSEG UNIT64KP + @@R_INIT @cstart 04E4EH 00000H + @@R_INIT loader 04E4EH 00000H + @@R_INIT pm 04E4EH 00002H + @@R_INIT i2c_ctr 04E50H 00002H + @@R_INIT main 04E52H 00000H + @@R_INIT magic 04E52H 00000H + @@R_INIT WDT 04E52H 00000H + @@R_INIT i2c_mcu 04E52H 00000H + @@R_INIT i2c_twl 04E52H 00000H + @@R_INIT led 04E52H 00000H + @@R_INIT rtc 04E52H 00000H + @@R_INIT vreg_ctr 04E52H 00000H + @@R_INIT vreg_twl 04E52H 00000H + @@R_INIT adc 04E52H 0000CH + @@R_INIT renge 04E5EH 00014H + @@R_INIT accero 04E72H 00000H + @@R_INIT self_flash + 04E72H 00000H + @@R_INIT sw 04E72H 00002H + @@R_INIT task_debug + 04E74H 00000H + @@R_INIT task_misc + 04E74H 00000H + @@R_INIT task_sys 04E74H 00002H + @@R_INIT pedo_alg_thre_det2 + 04E76H 00006H + @@R_INIT ini_VECT 04E7CH 00000H + @@R_INIT task_status + 04E7CH 00002H + @@R_INIT led_cam 04E7EH 00002H + @@R_INIT led_pow 04E80H 00006H + @@R_INIT @rom 04E86H 00000H + @@LCODEL 04E86H 00008H CSEG + @@LCODEL abs 04E86H 00008H +* gap * 04E8EH 00168H + MGC_TAIL 04FF6H 0000AH CSEG AT + MGC_TAIL magic 04FF6H 0000AH + + MEMORY=RAM + BASE ADDRESS=FF900H SIZE=00500H + OUTPUT INPUT INPUT BASE SIZE + SEGMENT SEGMENT MODULE ADDRESS + @@DATA FF900H 00430H DSEG BASEP + @@DATA @cstart FF900H 00002H + @@DATA loader FF902H 00000H + @@DATA pm FF902H 00018H + @@DATA i2c_ctr FF91AH 00006H + @@DATA main FF920H 0021EH + @@DATA magic FFB3EH 00000H + @@DATA WDT FFB3EH 00000H + @@DATA i2c_mcu FFB3EH 0000AH + @@DATA i2c_twl FFB48H 00000H + @@DATA led FFB48H 0007CH + @@DATA rtc FFBC4H 00008H + @@DATA vreg_ctr FFBCCH 0005EH + @@DATA vreg_twl FFC2AH 00010H + @@DATA adc FFC3AH 00018H + @@DATA renge FFC52H 00016H + @@DATA accero FFC68H 00002H + @@DATA self_flash + FFC6AH 00002H + @@DATA sw FFC6CH 0000AH + @@DATA task_debug + FFC76H 00000H + @@DATA task_misc + FFC76H 00004H + @@DATA task_sys FFC7AH 00002H + @@DATA pedo_alg_thre_det2 + FFC7CH 000A6H + @@DATA ini_VECT FFD22H 00000H + @@DATA task_status + FFD22H 00002H + @@DATA led_cam FFD24H 00002H + @@DATA led_pow FFD26H 0000AH + @@DATA @rom FFD30H 00000H + @@INIT FFD30H 00038H DSEG BASEP + @@INIT @cstart FFD30H 00000H + @@INIT loader FFD30H 00000H + @@INIT pm FFD30H 00002H + @@INIT i2c_ctr FFD32H 00002H + @@INIT main FFD34H 00000H + @@INIT magic FFD34H 00000H + @@INIT WDT FFD34H 00000H + @@INIT i2c_mcu FFD34H 00000H + @@INIT i2c_twl FFD34H 00000H + @@INIT led FFD34H 00000H + @@INIT rtc FFD34H 00000H + @@INIT vreg_ctr FFD34H 00000H + @@INIT vreg_twl FFD34H 00000H + @@INIT adc FFD34H 0000CH + @@INIT renge FFD40H 00014H + @@INIT accero FFD54H 00000H + @@INIT self_flash + FFD54H 00000H + @@INIT sw FFD54H 00002H + @@INIT task_debug + FFD56H 00000H + @@INIT task_misc + FFD56H 00000H + @@INIT task_sys FFD56H 00002H + @@INIT pedo_alg_thre_det2 + FFD58H 00006H + @@INIT ini_VECT FFD5EH 00000H + @@INIT task_status + FFD5EH 00002H + @@INIT led_cam FFD60H 00002H + @@INIT led_pow FFD62H 00006H + @@INIT @rom FFD68H 00000H + @@INIS FFD68H 00000H DSEG UNITP + @@INIS @cstart FFD68H 00000H + @@INIS loader FFD68H 00000H + @@INIS pm FFD68H 00000H + @@INIS i2c_ctr FFD68H 00000H + @@INIS main FFD68H 00000H + @@INIS magic FFD68H 00000H + @@INIS WDT FFD68H 00000H + @@INIS i2c_mcu FFD68H 00000H + @@INIS i2c_twl FFD68H 00000H + @@INIS led FFD68H 00000H + @@INIS rtc FFD68H 00000H + @@INIS vreg_ctr FFD68H 00000H + @@INIS vreg_twl FFD68H 00000H + @@INIS adc FFD68H 00000H + @@INIS renge FFD68H 00000H + @@INIS accero FFD68H 00000H + @@INIS self_flash + FFD68H 00000H + @@INIS sw FFD68H 00000H + @@INIS task_debug + FFD68H 00000H + @@INIS task_misc + FFD68H 00000H + @@INIS task_sys FFD68H 00000H + @@INIS pedo_alg_thre_det2 + FFD68H 00000H + @@INIS ini_VECT FFD68H 00000H + @@INIS task_status + FFD68H 00000H + @@INIS led_cam FFD68H 00000H + @@INIS led_pow FFD68H 00000H + @@INIS @rom FFD68H 00000H + @@DATS FFD68H 00000H DSEG UNITP + @@DATS @cstart FFD68H 00000H + @@DATS loader FFD68H 00000H + @@DATS pm FFD68H 00000H + @@DATS i2c_ctr FFD68H 00000H + @@DATS main FFD68H 00000H + @@DATS magic FFD68H 00000H + @@DATS WDT FFD68H 00000H + @@DATS i2c_mcu FFD68H 00000H + @@DATS i2c_twl FFD68H 00000H + @@DATS led FFD68H 00000H + @@DATS rtc FFD68H 00000H + @@DATS vreg_ctr FFD68H 00000H + @@DATS vreg_twl FFD68H 00000H + @@DATS adc FFD68H 00000H + @@DATS renge FFD68H 00000H + @@DATS accero FFD68H 00000H + @@DATS self_flash + FFD68H 00000H + @@DATS sw FFD68H 00000H + @@DATS task_debug + FFD68H 00000H + @@DATS task_misc + FFD68H 00000H + @@DATS task_sys FFD68H 00000H + @@DATS pedo_alg_thre_det2 + FFD68H 00000H + @@DATS ini_VECT FFD68H 00000H + @@DATS task_status + FFD68H 00000H + @@DATS led_cam FFD68H 00000H + @@DATS led_pow FFD68H 00000H + @@DATS @rom FFD68H 00000H + FSL_DATA FFD68H 00010H DSEG UNITP + FSL_DATA fsl_common + FFD68H 00010H + @@INITL FFD78H 00000H DSEG UNIT64KP + @@INITL loader FFD78H 00000H + @@INITL pm FFD78H 00000H + @@INITL i2c_ctr FFD78H 00000H + @@INITL main FFD78H 00000H + @@INITL magic FFD78H 00000H + @@INITL WDT FFD78H 00000H + @@INITL i2c_mcu FFD78H 00000H + @@INITL i2c_twl FFD78H 00000H + @@INITL led FFD78H 00000H + @@INITL rtc FFD78H 00000H + @@INITL vreg_ctr FFD78H 00000H + @@INITL vreg_twl FFD78H 00000H + @@INITL adc FFD78H 00000H + @@INITL renge FFD78H 00000H + @@INITL accero FFD78H 00000H + @@INITL self_flash + FFD78H 00000H + @@INITL sw FFD78H 00000H + @@INITL task_debug + FFD78H 00000H + @@INITL task_misc + FFD78H 00000H + @@INITL task_sys FFD78H 00000H + @@INITL pedo_alg_thre_det2 + FFD78H 00000H + @@INITL ini_VECT FFD78H 00000H + @@INITL task_status + FFD78H 00000H + @@INITL led_cam FFD78H 00000H + @@INITL led_pow FFD78H 00000H + @@INITL @rom FFD78H 00000H + @@DATAL FFD78H 00000H DSEG UNIT64KP + @@DATAL loader FFD78H 00000H + @@DATAL pm FFD78H 00000H + @@DATAL i2c_ctr FFD78H 00000H + @@DATAL main FFD78H 00000H + @@DATAL magic FFD78H 00000H + @@DATAL WDT FFD78H 00000H + @@DATAL i2c_mcu FFD78H 00000H + @@DATAL i2c_twl FFD78H 00000H + @@DATAL led FFD78H 00000H + @@DATAL rtc FFD78H 00000H + @@DATAL vreg_ctr FFD78H 00000H + @@DATAL vreg_twl FFD78H 00000H + @@DATAL adc FFD78H 00000H + @@DATAL renge FFD78H 00000H + @@DATAL accero FFD78H 00000H + @@DATAL self_flash + FFD78H 00000H + @@DATAL sw FFD78H 00000H + @@DATAL task_debug + FFD78H 00000H + @@DATAL task_misc + FFD78H 00000H + @@DATAL task_sys FFD78H 00000H + @@DATAL pedo_alg_thre_det2 + FFD78H 00000H + @@DATAL ini_VECT FFD78H 00000H + @@DATAL task_status + FFD78H 00000H + @@DATAL led_cam FFD78H 00000H + @@DATAL led_pow FFD78H 00000H + @@DATAL @rom FFD78H 00000H +* gap * FFD78H 00088H + + MEMORY=RAM2 + BASE ADDRESS=FFE20H SIZE=000C0H + OUTPUT INPUT INPUT BASE SIZE + SEGMENT SEGMENT MODULE ADDRESS + @@BITS FFE20H 00005H BSEG + @@BITS @cstart FFE20H.0 00000H.0 + @@BITS loader FFE20H.0 00000H.0 + @@BITS pm FFE20H.0 00001H.0 + @@BITS i2c_ctr FFE21H.0 00000H.0 + @@BITS main FFE21H.0 00000H.0 + @@BITS magic FFE21H.0 00000H.0 + @@BITS WDT FFE21H.0 00000H.0 + @@BITS i2c_mcu FFE21H.0 00000H.3 + @@BITS i2c_twl FFE21H.3 00000H.0 + @@BITS led FFE21H.3 00000H.4 + @@BITS rtc FFE21H.7 00000H.3 + @@BITS vreg_ctr FFE22H.2 00000H.1 + @@BITS vreg_twl FFE22H.3 00000H.0 + @@BITS adc FFE22H.3 00000H.4 + @@BITS renge FFE22H.7 00000H.3 + @@BITS accero FFE23H.2 00000H.0 + @@BITS self_flash + FFE23H.2 00000H.0 + @@BITS sw FFE23H.2 00000H.2 + @@BITS task_debug + FFE23H.4 00000H.0 + @@BITS task_misc + FFE23H.4 00000H.2 + @@BITS task_sys FFE23H.6 00000H.0 + @@BITS pedo_alg_thre_det2 + FFE23H.6 00000H.2 + @@BITS ini_VECT FFE24H.0 00000H.0 + @@BITS task_status + FFE24H.0 00000H.0 + @@BITS led_cam FFE24H.0 00000H.1 + @@BITS led_pow FFE24H.1 00000H.0 +* gap * FFE25H 000AFH + @@SEGREG FFED4H 00004H DSEG AT + @@SEGREG @SEGREG FFED4H 00004H + @@RTARG0 FFED8H 00008H DSEG AT + @@RTARG0 @RTARG0 FFED8H 00008H + + + Target chip : uPD79F0104 + Device file : E1.00b + \ No newline at end of file diff --git a/branches/sim/bsr_mcu.dr b/branches/sim/bsr_mcu.dr new file mode 100644 index 0000000..bd8099c --- /dev/null +++ b/branches/sim/bsr_mcu.dr @@ -0,0 +1,48 @@ +;;; 領域の定義 +;32kB = 0x7FFF +MEMORY BCL0: (00000H, 01000H ) +;MEMORY BCL1: (01000H, 01000H ) ; バックアップ領域 +MEMORY ROM : (02000H, 03000H ) +;MEMORY ROM_BKUP:(05000H, 03000H ) ; バックアップ領域 +;MEMORY OCD :(0FC00H, 00400H ) ; OCDが使っているらしい + + +;;; セグメントの割当先設定 +; ブートブロック0に割り当てる +MERGE LDR_CODE : =BCL0 +MERGE LDR_CODL : =BCL0 +MERGE FSL_CODE : =BCL0 ; =FSL ; 謹製フラッシュライブラリ +MERGE @@LCODE : =BCL0 ; スタートアップルーチン +;MERGE @@LCODEL : =BCL0 + +;MERGE LDR_RINT:=BCL0 +;MERGE LDR_CNST:=BCL0 +MERGE LDR_CNSL:=BCL0 + + + +; 通常領域に置く +MERGE ROM_CODE:=ROM +MERGE @@CNST: =ROM +MERGE @@R_INIT: =ROM ; ROM以外に置きたいならスタートアップルーチンを要修正 + + + + + + +; マジックナンバー +;; magic.cの中で指定 + + +;--- RAM領域 ------------------------------------------------------- +; +; RAM1,RAM2領域はユーザープログラムで使用しても良いですが、セルフプログラム時は +; セルフプログラムのライブラリが使用するため、値は破壊されます。 +; +memory RAM2 : (0FFE20H, 00C0H) ; セルフプログラム時、使用禁止領域 +;memory SLF_RAM : (0FFE00H, 0020H) ; Slef Program予約領域[使用禁止] +memory RAM : (0FF900H, 0500H) ; ユーザーRAM領域 +;memory SLF_RAM : (0FF900H, 0020H) ; Slef Program予約領域[使用禁止] + + diff --git a/branches/sim/bsr_system.h b/branches/sim/bsr_system.h new file mode 100644 index 0000000..6f5bb61 --- /dev/null +++ b/branches/sim/bsr_system.h @@ -0,0 +1,63 @@ +#ifndef __bsr_system__ +#define __bsr_system__ + +// イベントループのステート +enum pwr_state_ +{ + OFF_TRIG = 0, + ON_CHECK, + ON_TRIG, + ON, +// SLEEP_TRIG, + SLEEP, +// WAKE, + OFF, +}; + +enum poweron_reason_ +{ + NONE = 0, + PWSW +}; + + +enum model_ +{ + MODEL_JIKKI, + MODEL_TS_BOARD, + MODEL_SHIROBAKO, + MODEL_JIKKI_NOBATT, + MODEL_CAPTURE_BOX, + MODEL_ISBAKO, // ただし、system_status.modelは MODEL_JIKKI にしておくので未使用 + MODEL_RESERVED3, +}; + +enum family_ +{ + FAMILY_CTR, + FAMILY_SPFL, + FAMILY_SHRIMP +}; + +// タスクシステムの状態情報など +typedef struct _system_status_ +{ + enum pwr_state_ pwr_state; + enum poweron_reason_ poweron_reason; + unsigned char reboot:1; +// unsigned char info_fullcolor:1; + unsigned char captureBox:1; // キャプチャ箱 SDKには実機と返す + unsigned char taikendai:1; + unsigned char taikendai_nbd:1; + unsigned char is_dev:1; + enum model_ model; + enum family_ family; +}system_status_; + +extern bit force_off; + +extern system_status_ system_status; + + + +#endif diff --git a/branches/sim/config.h b/branches/sim/config.h new file mode 100644 index 0000000..32c3014 --- /dev/null +++ b/branches/sim/config.h @@ -0,0 +1,81 @@ +#ifndef __config__ +#define __config__ + + +// デバッグ向けスイッチ + +//#define _debug_led_ +//#define _ALLOW_NOBATT_ +//#define _DEBUG_BT_FUEL_ +//#define _DEBUG_BT_TEMP_ +//#define _DBG_PEDO_AUTO_ENABLE_ +//#define _DBG_LED_PRINT_ +//#define _DBG_FORCE_FULLCOLOR_ +//#define _PMIC_TEST_ +//#define _ENABLE_WDT_TEST_ +//#define _FORCE_TAIKENDAI_ +//#define _FORCE_TAIKENDAI_NBD_ + + +// 特殊仕様ファーム +//#define _TAIKENDAI_ +// homeメニューに入れてしまうのを回避する特殊ファームをつくる。ROMが足りないので電池パラメータ周りをパスする +//#define _TAIKENDAI_SEISAN_SPECIAL_ +// 生産中に体験台向け使用が発症すると、アダプタがないと電源が入らずに検査に支障があるので一時ファーム +//#define _RVD_ +// デバッガアタッチ時にターゲットリセットで電源が切れてしまうのを回避 + + +#define MCU_VER_MAJOR 0x01 +#define MCU_VER_MINOR 0x37 + +// ↑改訂の時は↓気をつけないと体験台の生産できないからね! +#ifdef _TAIKENDAI_SEISAN_SPECIAL_ +#define MCU_VER_MINOR 0x80 +#endif + + +#ifdef _TAIKENDAI_ +#define MCU_VER_MINOR 0x92 +// 0x90 1.31 相当 HOMEに入れてしまうのをスイッチのマスクで対策 +// ROM不足のため、電池パラメータ削除 + +#endif + + +#define _firm_format_v3_ + +//#define _MODEL_TEG2_ + // ↑TEG2 CPU + Type-T + +//#define _MODEL_WM0_ +//#define _MODEL_WM0_TEG2_CTRC_ + +//#define _MODEL_TS0_ + // ↑TEG2 CPU + Type-C + +#define _MODEL_CTR_ + // ↑TS board, WM1,1 TS-CTRC, 実機 + + +// ---------------------------------- // +#ifdef _MODEL_TEG2_ +unsupported! +#endif + + +#ifdef _MODEL_WM0_ +unsupported! +#endif + + +#ifdef _MODEL_TS0_ +unsupported! +#endif + +#ifdef _MODEL_CTR_ +#define _PMIC_CTR_ +#define _MCU_BSR_ +#endif + +#endif diff --git a/branches/sim/fsl.h b/branches/sim/fsl.h new file mode 100644 index 0000000..0e806b5 --- /dev/null +++ b/branches/sim/fsl.h @@ -0,0 +1,362 @@ +/*==============================================================================================*/ +/* Project = Selfprogramming library for 78K0R/Ix3/Kx3-L Single Voltage SST (MF2) Flash */ +/* Module = fsl.h */ +/* Version = V1.01 */ +/* Date = 28.03.2008 11:45:42 */ +/*==============================================================================================*/ +/* COPYRIGHT */ +/*==============================================================================================*/ +/* Copyright (c) 2007 by NEC Electronics (Europe) GmbH, */ +/* a company of the NEC Electronics Corporation */ +/*==============================================================================================*/ +/* Purpose: */ +/* constant, type and function prototype definitions used by the FSL */ +/* */ +/*==============================================================================================*/ +/* */ +/* Warranty Disclaimer */ +/* */ +/* Because the Product(s) is licensed free of charge, there is no warranty of any kind */ +/* whatsoever and expressly disclaimed and excluded by NEC, either expressed or implied, */ +/* including but not limited to those for non-infringement of intellectual property, */ +/* merchantability and/or fitness for the particular purpose. NEC shall not have any obligation */ +/* to maintain, service or provide bug fixes for the supplied Product(s) and/or the Application.*/ +/* */ +/* Each User is solely responsible for determining the appropriateness of using the Product(s) */ +/* and assumes all risks associated with its exercise of rights under this Agreement, */ +/* including, but not limited to the risks and costs of program errors, compliance with */ +/* applicable laws, damage to or loss of data, programs or equipment, and unavailability or */ +/* interruption of operations. */ +/* */ +/* Limitation of Liability */ +/* */ +/* In no event shall NEC be liable to the User for any incidental, consequential, indirect, */ +/* or punitive damage (including but not limited to lost profits) regardless of whether */ +/* such liability is based on breach of contract, tort, strict liability, breach of warranties, */ +/* failure of essential purpose or otherwise and even if advised of the possibility of */ +/* such damages. NEC shall not be liable for any services or products provided by third party */ +/* vendors, developers or consultants identified or referred to the User by NEC in connection */ +/* with the Product(s) and/or the Application. */ +/* */ +/*==============================================================================================*/ +/* Environment: PM plus (V6.30) */ +/* RA78K0(V1.20) */ +/* CC78K0(V2.00) */ +/*==============================================================================================*/ + +#ifndef __FSL_H_INCLUDED +#define __FSL_H_INCLUDED + + +/*==============================================================================================*/ +/* FSL type definitions */ +/*==============================================================================================*/ +typedef unsigned char fsl_u08; +typedef unsigned int fsl_u16; +typedef unsigned long int fsl_u32; + + +/*==============================================================================================*/ +/* constant definitions */ +/*==============================================================================================*/ + +/*status code definitions returned by the FSL functions */ +#define FSL_OK 0x00 +#define FSL_ERR_FLMD0 0x01 +#define FSL_ERR_PARAMETER 0x05 +#define FSL_ERR_PROTECTION 0x10 +#define FSL_ERR_ERASE 0x1A +#define FSL_ERR_BLANKCHECK 0x1B +#define FSL_ERR_IVERIFY 0x1B +#define FSL_ERR_WRITE 0x1C +#define FSL_ERR_EEP_IVERIFY 0x1D +#define FSL_ERR_EEP_BLANKCHECK 0x1E +#define FSL_ERR_INTERRUPTION 0x1F + + +/*==============================================================================================*/ +/* global function prototypes */ +/*==============================================================================================*/ + + +/*----------------------------------------------------------------------------------------------*/ +/* Block type: FSL command function */ +/*----------------------------------------------------------------------------------------------*/ +/* Purpose: initialization of selfprogramming environment */ +/* After initialization: */ +/* - the pointer to the data-buffer is stored */ +/* - all timing data are re-calculated according to the used system clock */ +/* */ +/* CAUTION: */ +/* The FSL_Init(&data_buffer) function is interruptible. Please use the */ +/* FSL_Init_cont(&data_buffer) to recall it as long return status is 0x1F. */ +/* */ +/* Input: data_buffer_pu08 - pointer to a data buffer of N...256 bytes */ +/* (used for data exchange between firmware and application) */ +/* Output: - */ +/* Returned: u08, status_code */ +/* = 0x00(FSL_OK), normal and means initialization OK */ +/* = 0x1F(FSL_ERR_INTERRUPTION), initialization interrupted by user interrupt*/ +/*----------------------------------------------------------------------------------------------*/ +extern fsl_u08 FSL_Init( fsl_u08 * data_buffer_pu08 ); +extern fsl_u08 FSL_Init_cont( fsl_u08 * data_buffer_pu08 ); + + +/*----------------------------------------------------------------------------------------------*/ +/* Block type: FSL command function */ +/*----------------------------------------------------------------------------------------------*/ +/* Purpose: checks the voltage level (high or low) at FLMD0 pin */ +/* Input: - */ +/* Output: - */ +/* Returned: fsl_u08, status_code */ +/* = 0x00(FSL_OK), normal and means FLMD0=HIGH */ +/* = 0x01(FSL_ERR_FLMD0), error, FLMD0=LOW */ +/*----------------------------------------------------------------------------------------------*/ +extern fsl_u08 FSL_ModeCheck( void ); + + +/*----------------------------------------------------------------------------------------------*/ +/* Block type: FSL command function */ +/*----------------------------------------------------------------------------------------------*/ +/* Purpose: checks if specified block is blank */ +/* Input: block_u16 - block number has to be checked */ +/* Output: - */ +/* Returned: fsl_u08, status_code */ +/* = 0x00(FSL_OK), normal and means "block is blank" */ +/* = 0x05(FSL_ERR_PARAMETER), parameter error */ +/* = 0x1B(FSL_ERR_BLANKCHECK), blank-check error, means "block not blank" */ +/* = 0x1F(FSL_ERR_INTERRUPTION), blank-check interrupted by user interrupt */ +/*----------------------------------------------------------------------------------------------*/ +extern fsl_u08 FSL_BlankCheck( fsl_u16 block_u16 ); + + +/*----------------------------------------------------------------------------------------------*/ +/* Block type: FSL command function */ +/*----------------------------------------------------------------------------------------------*/ +/* Purpose: erase specified block */ +/* Input: block_u16 - block number has to be erase */ +/* Output: - */ +/* Returned: fsl_u08, status_code */ +/* = 0x00(FSL_OK), normal and means "block erased successfully" */ +/* = 0x05(FSL_ERR_PARAMETER), parameter error */ +/* = 0x10(FSL_ERR_PROTECTION), tried to erase protected area */ +/* = 0x1A(FSL_ERR_ERASE), erase error, retry up to max. 255 times */ +/* = 0x1F(FSL_ERR_INTERRUPTION), erasing interrupted by user interrupt */ +/*----------------------------------------------------------------------------------------------*/ +extern fsl_u08 FSL_Erase( fsl_u16 block_u16 ); + + +/*----------------------------------------------------------------------------------------------*/ +/* Block type: FSL command function */ +/*----------------------------------------------------------------------------------------------*/ +/* Purpose: performs internal verify on specified block */ +/* Input: block_u16 - block number has to be verified */ +/* Output: - */ +/* Returned: fsl_u08, status_code */ +/* = 0x00(FSL_OK), normal and means "block is verified" */ +/* = 0x05(FSL_ERR_PARAMETER), parameter error */ +/* = 0x1B(FSL_ERR_IVERIFY), internal verify error */ +/* = 0x1F(FSL_ERR_INTERRUPTION), verify interrupted by user interrupt */ +/*----------------------------------------------------------------------------------------------*/ +extern fsl_u08 FSL_IVerify( fsl_u16 block_u16 ); + + +/*----------------------------------------------------------------------------------------------*/ +/* Block type: FSL command function */ +/*----------------------------------------------------------------------------------------------*/ +/* Purpose: writes N words from the data buffer into flash */ +/* Input: s_address_u32 - starting flash address the data has to be written */ +/* See Condition 2) please. */ +/* my_wordcount_u08 - number of words (4 bytes) has to be written */ +/* Output: - */ +/* Condition: 1) (s_address_u32 MOD 4 == 0) */ +/* 2) most significant byte (MSB) of s_address_u32 has to be 0x00. */ +/* Means: 0x00abcdef 24 bit flash address allowed */ +/* 3) (word_count_u08 <= sizeof(data buffer)) NOT CHECKED BY LIBRARY !!!!! */ +/* Changed: - */ +/* Returned: fsl_u08, status code */ +/* = 0x00(FSL_OK), normal */ +/* = 0x05(FSL_ERR_PARAMETER), parameter error */ +/* = 0x10(FSL_ERR_PROTECTION), protection error */ +/* = 0x1C(FSL_ERR_WRITE), write error */ +/* = 0x1F(FSL_ERR_INTERRUPTION), write interrupted by user interrupt */ +/*----------------------------------------------------------------------------------------------*/ +extern fsl_u08 FSL_Write( fsl_u32 s_address_u32, fsl_u08 word_count_u08 ); + + +/*----------------------------------------------------------------------------------------------*/ +/* Block type: FSL command function */ +/*----------------------------------------------------------------------------------------------*/ +/* Purpose: writes N words from the data buffer into flash */ +/* Before "writing" a N-word blankcheck is performed. */ +/* After "writing" a N-Word internal verify is performed. */ +/* Input: s_address_u32 - starting destination address has to be written */ +/* my_wordcount_u08 - number of words (4 bytes) has to be written */ +/* Output: - */ +/* Condition: 1) (s_address_u32 MOD 4 == 0) */ +/* 2) (word_count_u08 <= sizeof(data buffer)) NOT CHECKED BY FIRMWARE !!!!! */ +/* Changed: - */ +/* Returned: fsl_u08, status code */ +/* = 0x00(FSL_OK), normal */ +/* = 0x05(FSL_ERR_PARAMETER), parameter error */ +/* = 0x10(FSL_ERR_PROTECTION), protection error */ +/* = 0x1C(FSL_ERR_WRITE), write error */ +/* = 0x1D(FSL_ERR_EEP_IVERIFY), verify error */ +/* = 0x1E(FSL_ERR_EEP_BLANKCHECK), blankcheck error */ +/* = 0x1F(FSL_ERR_INTERRUPTION), write interrupted by user interrupt */ +/*----------------------------------------------------------------------------------------------*/ +extern fsl_u08 FSL_EEPROMWrite( fsl_u32 s_address_u32, + fsl_u08 word_count_u08 ); + + +/*----------------------------------------------------------------------------------------------*/ +/* Block type: FSL command function */ +/*----------------------------------------------------------------------------------------------*/ +/* Purpose: reads the security information */ +/* Input: destination_pu16 - destination address of the security info */ +/* The format of the security info is: "unsigned short int" */ +/* */ +/* Format of the security info: */ +/* bit_0 = 0 -> chip erase command disabled, otherwise enabled */ +/* bit_1 = 0 -> block erase command disabled, otherwise enabled */ +/* bit_2 = 0 -> write command disabled, otherwise enabled */ +/* bit_4 = 0 -> boot-area re-programming disabled, otherwise enabled */ +/* bit_8...bit_15 = 03H -> last block of the boot-area */ +/* other bits = 1 */ +/* Output: - */ +/* Changed: content of the data_buffer */ +/* Returned: fsl_u08, status code */ +/* = 0x00(FSL_OK), normal */ +/* = 0x05(FSL_ERR_PARAMETER), parameter error */ +/*----------------------------------------------------------------------------------------------*/ +extern fsl_u08 FSL_GetSecurityFlags( fsl_u16 * destination_pu16 ); + + +/*----------------------------------------------------------------------------------------------*/ +/* Block type: FSL command function */ +/*----------------------------------------------------------------------------------------------*/ +/* Purpose: read the boot flag i */ +/* Input: destination_pu08 - destination address of the bootflag info */ +/* The format of the boot-flag info is: "unsigned char" */ +/* The value of the boot info is 0x00 for cluster 0 and 0x01 for cluster 1. */ +/* Output: - */ +/* Changed: content of the data_buffer */ +/* Returned: fsl_u08, status code */ +/* = 0x00(FSL_OK), normal */ +/* = 0x05(FSL_ERR_PARAMETER), parameter error */ +/*----------------------------------------------------------------------------------------------*/ +extern fsl_u08 FSL_GetActiveBootCluster( fsl_u08 * destination_pu08 ); + + +/*----------------------------------------------------------------------------------------------*/ +/* Block type: FSL command function */ +/*----------------------------------------------------------------------------------------------*/ +/* Purpose: puts the last address of the specified block into *destination_pu32 */ +/* Input: *destination_pu32 - destination where the last-block-address */ +/* should be stored */ +/* block_u16 - block number of the last address is needed */ +/* Changed: - */ +/* Returned: fsl_u08, status code */ +/* = 0x00(FSL_OK), normal */ +/* = 0x05(FSL_ERR_PARAMETER), parameter error */ +/*----------------------------------------------------------------------------------------------*/ +extern fsl_u08 FSL_GetBlockEndAddr( fsl_u32 * destination_pu32, + fsl_u16 block_u16 ); + + +/*----------------------------------------------------------------------------------------------*/ +/* Block type: FSL command function */ +/*----------------------------------------------------------------------------------------------*/ +/* Purpose: puts the information about the protected flash area into the function parameter */ +/* Input: *start_block_pu16 - destination where the FSW start block should be stored */ +/* *end_block_pu16 - destination where the FSW end block should be stored */ +/* Changed: - */ +/* Returned: fsl_u08, status code */ +/* = 0x00(FSL_OK), normal */ +/* = 0x05(FSL_ERR_PARAMETER), parameter error */ +/*----------------------------------------------------------------------------------------------*/ +extern fsl_u08 FSL_GetFlashShieldWindow( fsl_u16 * start_block_pu16, + fsl_u16 * end_block_pu16 ); + + +/*----------------------------------------------------------------------------------------------*/ +/* Block type: FSL command function */ +/*----------------------------------------------------------------------------------------------*/ +/* Purpose: defines a new Flash-Shield-Window area inside the flash memory */ +/* Input: start_block_u16 - starting block of the Flash-Shield-Window (FSW) */ +/* end_block_u16 - ending block of the flash-Shield-Window (FSW) */ +/* Changed: - */ +/* Returned: fsl_u08, status code */ +/* = 0x00(FSL_OK), normal */ +/* = 0x05(FSL_ERR_PARAMETER), parameter error */ +/* = 0x10(FSL_ERR_PROTECTION), protection error */ +/* = 0x1A(FSL_ERR_ERASE), erase error */ +/* = 0x1B(FSL_ERR_IVERIFY), internal verify error */ +/* = 0x1F(FSL_ERR_INTERRUPTION), write interrupted by user interrupt */ +/*----------------------------------------------------------------------------------------------*/ +extern fsl_u08 FSL_SetFlashShieldWindow( fsl_u16 start_block_u16, + fsl_u16 end_block_u16 ); + + +/*----------------------------------------------------------------------------------------------*/ +/* Block type: FSL command function */ +/*----------------------------------------------------------------------------------------------*/ +/* Purpose: Swapping of bootcluster 0 and 1 */ +/* */ +/* CAUTION !!!! */ +/* After this function the boot cluster are immediately swapped */ +/* Input: - */ +/* Output: - */ +/* Returned: fsl_u08, status code */ +/* = 0x00(FSL_OK), normal */ +/* = 0x05(FSL_ERR_PARAMETER), parameter error */ +/* = 0x10(FSL_ERR_PROTECTION), protection error */ +/* = 0x1A(FSL_ERR_ERASE), erase error */ +/* = 0x1B(FSL_ERR_IVERIFY), internal verify error */ +/* = 0x1F(FSL_ERR_INTERRUPTION), write interrupted by user interrupt */ +/*----------------------------------------------------------------------------------------------*/ +extern fsl_u08 FSL_SwapBootCluster( void ); + + +/*----------------------------------------------------------------------------------------------*/ +/* Block type: FSL command function */ +/*----------------------------------------------------------------------------------------------*/ +/* Purpose: sets specified security flag by dedicated command-function. */ +/* */ +/* There are following security levels: */ +/* a) chip-erase protection (cannot be reset by programmer !!!) */ +/* b) block-erase protection (can be reset by chip-erase on programmer) */ +/* c) write protection (can be reset by chip-erase on programmer) */ +/* d) boot-cluster protection (cannot be reset by programmer !!!) */ +/* */ +/* CAUTION !!!! */ +/* Each security flag can be written by the application only once */ +/* */ +/* Input: - */ +/* Output: - */ +/* Returned: fsl_u08, status code */ +/* = 0x00(FSL_OK), normal */ +/* = 0x05(FSL_ERR_PARAMETER), parameter error */ +/* = 0x10(FSL_ERR_PROTECTION), protection error */ +/* = 0x1A(FSL_ERR_ERASE), erase error */ +/* = 0x1B(FSL_ERR_IVERIFY), internal verify error */ +/* = 0x1F(FSL_ERR_INTERRUPTION), write interrupted by user interrupt */ +/*----------------------------------------------------------------------------------------------*/ +extern fsl_u08 FSL_SetChipEraseProtectFlag( void ); +extern fsl_u08 FSL_SetBlockEraseProtectFlag( void ); +extern fsl_u08 FSL_SetWriteProtectFlag( void ); +extern fsl_u08 FSL_SetBootClusterProtectFlag( void ); + + +/*----------------------------------------------------------------------------------------------*/ +/* Block type: FSL function */ +/*----------------------------------------------------------------------------------------------*/ +/* Purpose: defines the firmware operation method after interrupt service (ISR) execution. */ +/* Input: mode_u08 = 0x00, after RETI the firmware is continuing the interrupted command.*/ +/* = other, after RETI the firmware is interrupted with status 0x1F. */ +/* Changed: - */ +/* Returned: - */ +/*----------------------------------------------------------------------------------------------*/ +extern void FSL_SetInterruptMode( fsl_u08 mode_u08 ); + +#endif diff --git a/branches/sim/fsl_user.h b/branches/sim/fsl_user.h new file mode 100644 index 0000000..823eb8d --- /dev/null +++ b/branches/sim/fsl_user.h @@ -0,0 +1,108 @@ +/*==============================================================================================*/ +/* Project = Selfprogramming library for 78K0R/Ix3/Kx3-L Single Voltage SST (MF2) Flash */ +/* Module = fsl_user.h */ +/* Version = V1.01 */ +/* Date = 28.03.2008 11:45:55 */ +/*==============================================================================================*/ +/* COPYRIGHT */ +/*==============================================================================================*/ +/* Copyright (c) 2007 by NEC Electronics (Europe) GmbH, */ +/* a company of the NEC Electronics Corporation */ +/*==============================================================================================*/ +/* Purpose: */ +/* user configurable constant/macros of the selfprogramming library */ +/* */ +/*==============================================================================================*/ +/* */ +/* Warranty Disclaimer */ +/* */ +/* Because the Product(s) is licensed free of charge, there is no warranty of any kind */ +/* whatsoever and expressly disclaimed and excluded by NEC, either expressed or implied, */ +/* including but not limited to those for non-infringement of intellectual property, */ +/* merchantability and/or fitness for the particular purpose. NEC shall not have any obligation */ +/* to maintain, service or provide bug fixes for the supplied Product(s) and/or the Application.*/ +/* */ +/* Each User is solely responsible for determining the appropriateness of using the Product(s) */ +/* and assumes all risks associated with its exercise of rights under this Agreement, */ +/* including, but not limited to the risks and costs of program errors, compliance with */ +/* applicable laws, damage to or loss of data, programs or equipment, and unavailability or */ +/* interruption of operations. */ +/* */ +/* Limitation of Liability */ +/* */ +/* In no event shall NEC be liable to the User for any incidental, consequential, indirect, */ +/* or punitive damage (including but not limited to lost profits) regardless of whether */ +/* such liability is based on breach of contract, tort, strict liability, breach of warranties, */ +/* failure of essential purpose or otherwise and even if advised of the possibility of */ +/* such damages. NEC shall not be liable for any services or products provided by third party */ +/* vendors, developers or consultants identified or referred to the User by NEC in connection */ +/* with the Product(s) and/or the Application. */ +/* */ +/*==============================================================================================*/ +/* Environment: PM plus (V6.30) */ +/* RA78K0(V1.20) */ +/* CC78K0(V2.00) */ +/*==============================================================================================*/ + + +#ifndef __FSL_USER_H_INCLUDED +#define __FSL_USER_H_INCLUDED + + +/*==============================================================================================*/ +/* constant definitions */ +/*==============================================================================================*/ + + +/* specify the CPU frequency in [Hz], only 2MHz....20MHz allowed */ +#define FSL_SYSTEM_FREQUENCY 4000000 + +/* define whether low-voltage mode is used or not */ +/* #define FSL_LOW_VOLTAGE_MODE */ + +/* size of the common data buffer expressed in [bytes] */ +/* the data buffer is used for data-exchange between the firmware and the selflib. */ +//#define FSL_DATA_BUFFER_SIZE 256 +#define FSL_DATA_BUFFER_SIZE 0 + + +/* customizable interrupt controller configuration during selfprogramming period */ +/* Bit --7-------6-------5-------4-------3-------2-------1-------0---------------------- */ +/* MK0L: PMK5 PMK4 PMK3 PMK2 PMK1 PMK0 LVIMK WDTIMK */ +/* MK0H: SREMK0 SRMK0* STMK0* DMAMK1 DMAMK0 SREMK3 SRMK3 STMK3 */ +/* MK1L: TMMK03 TMMK02 TMMK01 TMMK00 IICMK0 SREMK1 SRMK1 STMK1* */ +/* MK1H: TMMK04 SREMK2 SRMK2 STMK2* KRMK RTCIMK RTCMK ADMK */ +/* MK2L: PMK10 PMK9 PMK8 PMK7 PMK6 TMMK07 TMMK06 TMMK05 */ +/* MK2H: 1 1 1 1 1 1 1 PMK11 */ +/*------------------------------------------------------------------------------------------ */ +/* */ +/* Examples: */ +/* ========= */ +/*#define FSL_MK0L_MASK 0xF7 -> allow INTP1 interrupt during selfprogramming */ +/*#define FSL_MK0H_MASK 0xEF -> allow DMA1 interrupt during selfprogramming */ +/*#define FSL_MK1L_MASK 0xBF -> allow TM02 interrupt during selfprogramming */ +/*#define FSL_MK1H_MASK 0xFF -> all interrupts disabled during selfprogramming */ +/*#define FSL_MK2L_MASK 0xF7 -> allow INTP6 interrupt during selfprogramming */ +/*#define FSL_MK2H_MASK 0xFF -> all interrupts disabled during selfprogramming */ +/*------------------------------------------------------------------------------------------ */ +#define FSL_MK0L_MASK 0xFF /* all interrupts disabled during selfprogramming */ +#define FSL_MK0H_MASK 0xFF /* all interrupts disabled during selfprogramming */ +#define FSL_MK1L_MASK 0xFF /* all interrupts disabled during selfprogramming */ +#define FSL_MK1H_MASK 0xFF /* all interrupts disabled during selfprogramming */ +#define FSL_MK2L_MASK 0xFF /* all interrupts disabled during selfprogramming */ +#define FSL_MK2H_MASK 0xFF /* all interrupts disabled during selfprogramming */ + + +/* FLMD0 control bit */ +#define FSL_FLMD0_HIGH {BECTL.7 = 1;} +#define FSL_FLMD0_LOW {BECTL.7 = 0;} + + +/*----------------------------------------------------------------------------------------------*/ +/* switch interrupt backu functionality ON/OFF using #define/#undef */ +/*----------------------------------------------------------------------------------------------*/ +/* #define FSL_INT_BACKUP */ +#undef FSL_INT_BACKUP + + +#endif diff --git a/branches/sim/hoge.bin b/branches/sim/hoge.bin new file mode 100644 index 0000000..b52e71c Binary files /dev/null and b/branches/sim/hoge.bin differ diff --git a/branches/sim/i2c_ctr.c b/branches/sim/i2c_ctr.c new file mode 100644 index 0000000..4d56ebf --- /dev/null +++ b/branches/sim/i2c_ctr.c @@ -0,0 +1,279 @@ +/* ======================================================== + 対SoC 新規チャンネル I2C通信 + 藤田@開技.nintendo + '09 Apr + ======================================================== */ + +#include "config.h" + +#ifdef _MCU_KE3_ +#pragma interrupt INTIICA int_iic_ctr // CTR側 +#else +// TSはマザボでテレコ、WMは回路図がテレコで結局一致… +#pragma interrupt INTIICA1 int_iic_ctr RB1 +#endif + + +#include "incs.h" + +#ifdef _MCU_BSR_ +// #ifdef _MODEL_TS0_ || _MODEL_WM0_ + +// ワーキングモデルはI2Cが逆 +// TEGは回路図でテレコ +#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 bit irq_readed; // いずれかのIRQレジスタが読まれた + +u8 iic_burst_state; + + +/* ======================================================== + ======================================================== */ +enum IIC_STATE +{ + IIC_IDLE = 0, + IIC_RCV_REG_ADRS, + IIC_TX_OR_RX, + IIC_TX, + IIC_RX +}; + + +// 1バイト送受の度に割り込みが発生するバージョン +__interrupt void int_iic_ctr( ) +{ + static u8 state = IIC_IDLE; + static u8 reg_adrs; + static u8 reg_adrs_internal; + static u8 tx_buf; + u8 rx_buf; + static u8 adrs_access_from; + + EI(); + + // 読み出し終了 + if( !ACKD ) // 割り込み要因はNAK(データ送信の最後) + { + state = IIC_IDLE; + SPIE = 0; + LREL = 1; + + // レジスタリードで、割り込みピンをネゲート + // まだ読まれてない割り込みがあれば、再度アサート + if( irq_readed ) + { + IRQ0_neg; + irq_readed = false; + if( !( (( vreg_ctr[VREG_C_IRQ0] & vreg_ctr[VREG_C_IRQ_MASK0 ] ) == 0 ) + && (( vreg_ctr[VREG_C_IRQ1] & vreg_ctr[VREG_C_IRQ_MASK1 ] ) == 0 ) + && (( vreg_ctr[VREG_C_IRQ2] & vreg_ctr[VREG_C_IRQ_MASK2 ] ) == 0 ) + && (( vreg_ctr[VREG_C_IRQ3] & vreg_ctr[VREG_C_IRQ_MASK3 ] ) == 0 ) )) + { + while( !IRQ0 ){;} // 時間稼ぎ不要かも + IRQ0_ast; + } + } + hosu_read_end( ); // 歩数計読み出し終了 + rtc_unlock( ); + iic_burst_state = 0; + return; + } + + if( SPD ) // 割り込み要因はストップコンディション + // 通信の最後。↑の !ACKD に来たときは割り込み来ない (SPIE = 0 のため ) + { + state = IIC_IDLE; + SPIE = 0; + // I2C終了時に何かする物 // + rtc_unlock( ); + return; + } + + if( STD ) // 割り込み要因:スタートコンディション + { + if( ( state == IIC_TX ) || ( state == IIC_RX ) + || ( state == IIC_RCV_REG_ADRS ) + ) + { + state = IIC_IDLE; + // no break // + } + } + + switch ( state ) + { + case ( IIC_IDLE ): + // 自局呼び出しに応答。 + // 初期化など + SPIE = 1; + state = IIC_RCV_REG_ADRS; + WREL = 1; // ウェイト解除 + break; + + case ( IIC_RCV_REG_ADRS ): // 2バイト目(レジスタアドレス)受信後に来る + // レジスタアドレス受信 + reg_adrs = IICA; + adrs_access_from = reg_adrs; + tx_buf = vreg_ctr_read( reg_adrs ); // データの準備をしておく + state = IIC_TX_OR_RX; + WREL = 1; + break; + + case ( IIC_TX_OR_RX ): // ↑の次に来る割り込み。STなら送信準備、データが来たら書き込まれ +// if( TRC ){ // 送信方向フラグ で区別するのは、割り込み遅延時に不具合が起こりえる + if( STD ) + { // スタートコンディション検出フラグ + // リードされる + if( COI ) + { // アドレス一致フラグ + state = IIC_TX; + // no break, no return // + } + else + { + // リスタートで違うデバイスが呼ばれた! + state = IIC_IDLE; // 終了処理 + SPIE = 0; + LREL = 1; // ウェイト解除? + return; + } + } + else + { + state = IIC_RX; // データ1バイト受信の割り込みだった + // no break, no return // + } + + default: // バースト R/W でここが何回も呼ばれることになる + if( state == IIC_TX ) + { // 送信 + IICA = tx_buf; + vreg_ctr_after_read( reg_adrs, tx_buf ); // 読んだらクリアなどの処理 + } + else + { // 受信 + rx_buf = IICA; + vreg_ctr_write( reg_adrs, rx_buf ); + WREL = 1; + } + + // レジスタアドレスのインクリメント + /// アクセスポインタを進めない特殊なレジスタ + switch( adrs_access_from ) + { + case( VREG_C_ACC_HOSU_HIST ): + case( VREG_C_LED_NOTIFY_DATA ): + case( VREG_C_LED_POW ): + case( VREG_CX_INFO ): + case( VREG_CX_FREE_DATA ): + break; + case( VREG_CX_FREE_ADRS ): + if( reg_adrs == VREG_CX_FREE_ADRS ) + { + reg_adrs = VREG_CX_FREE_DATA; + } + break; + default: + iic_burst_state = 0; // 保険 + reg_adrs += 1; + } + + if( state == IIC_TX ) + { // さらにつぎに送るデータの準備だけシテオク。SPが来て使われないかもしれない + tx_buf = vreg_ctr_read( reg_adrs ); + } + break; + } +} + + + +// ======================================================== +void IIC_ctr_Init( void ) +{ + + IICAEN = 1; + + IICE = 0; /* IICA disable */ + + IICAMK = 1; /* INTIICA disable */ + IICAIF = 0; /* clear INTIICA interrupt flag */ + + IICAPR0 = 1; /* set INTIICA high priority */ + IICAPR1 = 0; /* set INTIICA high priority */ + +#ifdef _MODEL_TEG2_ + P6 &= ~0x3; +#else + P20 &= ~0x3; +#endif + + SVA = IIC_C_SLAVEADDRESS; + IICF = 0x01; + + STCEN = 1; // リスタートの許可 + IICRSV = 1; // 通信予約をさせない:スレーブに徹する + + SPIE = 0; // ストップコンディションでの割り込みを禁止 + WTIM = 1; // 自動でACKを返した後clkをLに固定する + ACKE = 1; // ダメCPUは無視して次の通信をはじめるかもしれないんで早くclkを開放しないといけない + + IICWH = 5; + IICWL = 10; // L期間の長さ + + SMC = 1; // 高速モード + DFC = 1; // デジタルフィルタon (@fast mode) + + IICAMK = 0; // 割り込みを許可 + + IICE = 1; + +#ifdef _MODEL_TEG2_ + PM6 &= ~0x3; /* set clock pin for IICA */ +#else + PM20 &= ~0x3; /* set clock pin for IICA */ +#endif +} + + + +// ======================================================== +void IIC_ctr_Stop( void ) +{ + IICE = 0; /* IICA disable */ + IICAEN = 0; +} + + + diff --git a/branches/sim/i2c_ctr.h b/branches/sim/i2c_ctr.h new file mode 100644 index 0000000..16234ff --- /dev/null +++ b/branches/sim/i2c_ctr.h @@ -0,0 +1,210 @@ +#ifndef _MDSERIAL_A_ +#define _MDSERIAL_A_ + + +/* IIC operation enable (IICE0) */ +#define IIC0_OPERATION 0x80 +#define IIC0_OPERATION_DISABLE 0x00 /* stop operation */ +#define IIC0_OPERATION_ENABLE 0x80 /* enable operation */ + +/* Exit from communications (LREL0) */ +#define IIC0_COMMUNICATION 0x40 +#define IIC0_COMMUNICATION_NORMAL 0x00 /* normal operation */ +#define IIC0_COMMUNICATION_EXIT 0x40 /* exit from current communication */ + +/* Wait cancellation (WREL0) */ +#define IIC0_WAITCANCEL 0x20 +#define IIC0_WAIT_NOTCANCEL 0x00 /* do not cancel wait */ +#define IIC0_WAIT_CANCEL 0x20 /* cancel wait */ + +/* Generation of interrupt when stop condition (SPIE0) */ +#define IIC0_STOPINT 0x10 +#define IIC0_STOPINT_DISABLE 0x00 /* disable */ +#define IIC0_STOPINT_ENABLE 0x10 /* enable */ + +/* Wait and interrupt generation (WTIM0) */ +#define IIC0_WAITINT 0x08 +#define IIC0_WAITINT_CLK8FALLING 0x00 /* generate at the eighth clocks falling edge */ +#define IIC0_WAITINT_CLK9FALLING 0x08 /* generated at the ninth clocks falling edge */ + +/* Acknowledgement control (ACKE0) */ +#define IIC0_ACK 0x04 +#define IIC0_ACK_DISABLE 0x00 /* enable acknowledgement */ +#define IIC0_ACK_ENABLE 0x04 /* disable acknowledgement */ + +/* Start condition trigger (STT0) */ +#define IIC0_STARTCONDITION 0x02 +#define IIC0_START_NOTGENERATE 0x00 /* do not generate start condition */ +#define IIC0_START_GENERATE 0x02 /* generate start condition */ + +/* Stop condition trigger (SPT0) */ +#define IIC0_STOPCONDITION 0x01 +#define IIC0_STOP_NOTGENERATE 0x00 /* do not generate stop condition */ +#define IIC0_STOP_GENERATE 0x01 /* generate stop condition */ + +/* + IIC Status Register 0 (IICS0) +*/ +/* Master device status (MSTS0) */ +#define IIC0_MASTERSTATUS 0x80 +#define IIC0_STATUS_NOTMASTER 0x00 /* slave device status or communication standby status */ +#define IIC0_STATUS_MASTER 0x80 /* master device communication status */ + +/* Detection of arbitration loss (ALD0) */ +#define IIC0_ARBITRATION 0x40 +#define IIC0_ARBITRATION_NO 0x00 /* arbitration win or no arbitration */ +#define IIC0_ARBITRATION_LOSS 0x40 /* arbitration loss */ + +/* Detection of extension code reception (EXC0) */ +#define IIC0_EXTENSIONCODE 0x20 +#define IIC0_EXTCODE_NOT 0x00 /* extension code not received */ +#define IIC0_EXTCODE_RECEIVED 0x20 /* extension code received */ + +/* Detection of matching addresses (COI0) */ +#define IIC0_ADDRESSMATCH 0x10 +#define IIC0_ADDRESS_NOTMATCH 0x00 /* addresses do not match */ +#define IIC0_ADDRESS_MATCH 0x10 /* addresses match */ + +/* Detection of transmit/receive status (TRC0) */ +#define IIC0_STATUS 0x08 +#define IIC0_STATUS_RECEIVE 0x00 /* receive status */ +#define IIC0_STATUS_TRANSMIT 0x08 /* transmit status */ + +/* Detection of acknowledge signal (ACKD0) */ +#define IIC0_ACKDETECTION 0x04 +#define IIC0_ACK_NOTDETECTED 0x00 /* ACK signal was not detected */ +#define IIC0_ACK_DETECTED 0x04 /* ACK signal was detected */ + +/* Detection of start condition (STD0) */ +#define IIC0_STARTDETECTION 0x02 +#define IIC0_START_NOTDETECTED 0x00 /* start condition not detected */ +#define IIC0_START_DETECTED 0x02 /* start condition detected */ + +/* Detection of stop condition (SPD0) */ +#define IIC0_STOPDETECTION 0x01 +#define IIC0_STOP_NOTDETECTED 0x00 /* stop condition not detected */ +#define IIC0_STOP_DETECTED 0x01 /* stop condition detected */ + +/* + IIC Flag Register 0 (IICF0) +*/ +/* STT0 clear flag (STCF) */ +#define IIC0_STARTFLAG 0x80 +#define IIC0_STARTFLAG_GENERATE 0x00 /* generate start condition */ +#define IIC0_STARTFLAG_UNSUCCESSFUL 0x80 /* start condition generation unsuccessful */ + +/* IIC bus status flag (IICBSY) */ +#define IIC0_BUSSTATUS 0x40 +#define IIC0_BUS_RELEASE 0x00 /* bus release status */ +#define IIC0_BUS_COMMUNICATION 0x40 /* bus communication status */ + +/* Initial start enable trigger (STCEN) */ +#define IIC0_STARTWITHSTOP 0x02 +#define IIC0_START_WITHSTOP 0x00 /* generation of a start condition without detecting a stop condition */ +#define IIC0_START_WITHOUTSTOP 0x02 /* generation of a start condition upon detection of a stop condition */ + +/* Communication reservation function disable bit (IICRSV) */ +#define IIC0_RESERVATION 0x01 +#define IIC0_RESERVATION_ENABLE 0x00 /* enable communication reservation */ +#define IIC0_RESERVATION_DISABLE 0x01 /* disable communication reservation */ + +/* + IIC clock selection register 0 (IICCL0) +*/ +#define IICCL0_INITIALVALUE 0x00 +/* Detection of SCL0 pin level (CLD0) */ +#define IIC0_SCLLEVEL 0x20 +#define IIC0_SCL_LOW 0x00 /* clock line at low level */ +#define IIC0_SCL_HIGH 0x20 /* clock line at high level */ + +/* Detection of SDA0 pin level (DAD0) */ +#define IIC0_SDALEVEL 0x10 +#define IIC0_SDA_LOW 0x00 /* data line at low level */ +#define IIC0_SDA_HIGH 0x10 /* data line at high level */ + +/* Operation mode switching (SMC0) */ +#define IIC0_OPERATIONMODE 0x08 +#define IIC0_MODE_STANDARD 0x00 /* operates in standard mode */ +#define IIC0_MODE_HIGHSPEED 0x08 /* operates in high-speed mode */ + +/* Digital filter operation control (DFC0) */ +#define IIC0_DIGITALFILTER 0x04 +#define IIC0_FILTER_OFF 0x00 /* digital filter off */ +#define IIC0_FILTER_ON 0x04 /* digital filter on */ + +/* Operation mode switching (CL01, CL00) */ +#define IIC0_CLOCKSELECTION 0x03 + +/* Combine of (SMC0, CL01, CL00)*/ +#define IIC0_CLOCK0 0x00 +#define IIC0_CLOCK1 0x01 +#define IIC0_CLOCK2 0x02 +#define IIC0_CLOCK3 0x03 +#define IIC0_CLOCK4 0x08 +#define IIC0_CLOCK5 0x09 +#define IIC0_CLOCK6 0x0a +#define IIC0_CLOCK7 0x0b + +/* + IIC function expansion register 0 (IICX0) +*/ +/* IIC clock expension (CLX0) */ +#define IIC0_CLOCKEXPENSION 0x01 +#define IIC0_EXPENSION0 0x00 +#define IIC0_EXPENSION1 0x01 + +/* Operation clock (CLX0, SMC0, CL01, CL00) + | IIC0_EXPENSION0 | IIC0_EXPENSION1 | +------------|-------------------|-------------------|---------------------- +IIC0_CLOCK0 | fprs/2 | prohibited | selection clock(fw) + | fprs/88 | | transfer clock + | normal | | mode +------------|-------------------|-------------------|---------------------- +IIC0_CLOCK1 | fprs/2 | prohibited | selection clock(fw) + | fprs/172 | | transfer clock + | normal | | mode +------------|-------------------|-------------------|---------------------- +IIC0_CLOCK2 | fprs/2 | prohibited | selection clock(fw) + | fprs/344 | | transfer clock + | normal | | mode +------------|-------------------|-------------------|---------------------- +IIC0_CLOCK3 |prohibited/fexscl0 | prohibited | selection clock(fw) + | fw/66 | | transfer clock + | normal | | mode +------------|-------------------|-------------------|---------------------- +IIC0_CLOCK4 | fprs/2 | fprs/2 | selection clock(fw) + | fprs/48 | fprs/24 | transfer clock + | high speed | high speed | mode +------------|-------------------|-------------------|---------------------- +IIC0_CLOCK5 | fprs/2 | fprs/2 | selection clock(fw) + | fprs/48 | fprs/24 | transfer clock + | high speed | high speed | mode +------------|-------------------|-------------------|---------------------- +IIC0_CLOCK6 | fprs/4 | fprs/4 | selection clock(fw) + | fprs/96 | fprs/48 | transfer clock + | high speed | high speed | mode +------------|-------------------|-------------------|---------------------- +IIC0_CLOCK7 |prohibited/fexscl0 | prohibited | selection clock(fw) + | fw/18 | | transfer clock + | high speed | | mode +------------|-------------------|-------------------|---------------------- +*/ + +#define ADDRESS_COMPLETE 0x80 +#define IIC_MASTER_FLAG_CLEAR 0x00 + +/****************************************************************************** + * Macro define + ******************************************************************************/ + + + +/****************************************************************************** + * Function define + ******************************************************************************/ + +void IIC_ctr_Init( void ); +void IIC_ctr_Stop( void ); + + +#endif diff --git a/branches/sim/i2c_mcu.c b/branches/sim/i2c_mcu.c new file mode 100644 index 0000000..7ee4929 --- /dev/null +++ b/branches/sim/i2c_mcu.c @@ -0,0 +1,655 @@ +/* ======================================================== + 簡易I2C(内蔵ペリフェラル使用)通信 + de JHL 藤田@開技 + '09 Feb - + ======================================================== */ +#pragma sfr +#pragma di +#pragma ei +#pragma nop +#pragma inline // memcpy()をインライン展開する(の方が小さい!) + +#include "incs_loader.h" +#include "i2c_mcu.h" + + + +// ======================================================== +// レジスタのビット名 +// プリフィックスbだが、一部のビット名がレジスタ名にかぶるため... +// SMR0n +#define bCKS0 ( 1 << 15 ) +#define bCCS0 ( 1 << 14 ) +#define bSTS0 ( 1 << 8 ) +#define bSIS0 ( 1 << 6 ) +#define bMD0n2 ( 1 << 2 ) +#define bMD0n1 ( 1 << 1 ) +#define bMD0n0 ( 1 << 0 ) +#define bSMR0n_FIXEDBIT ( 1 << 5 ) + +// SSR0n +#define bit_TSF0 6 +#define PEF0 ( 1 << 1 ) + +// SIR0n +#define PECT0 ( 1 << 1 ) + +// SCR0n +#define TXE0 ( 1 << 15 ) +#define RXE0 ( 1 << 14 ) +#define SLC02 4 +#define DLS02 0 +#define TSF0 ( 1 << 6 ) + +// SOn +#define TAUS_MASK 0b0000101100001011; + +// DMCn +#define DRS ( 1 << 6 ) + + + + +// ======================================================== +static void iic_mcu_send_st( ); +static void iic_mcu_send_re_st( ); +static void iic_mcu_send_sp( ); +static err iic_mcu_send_a_byte( u8 ); +static err iic_mcu_call_slave( u8 slave ); + + + +// ======================================================== +bit iic_mcu_wo_dma; +volatile bit iic_mcu_busy; +volatile bit iic_mcu_initialized; + + +u8 iic_send_work[4]; +u8 *p_iic_send_wo_dma_dat; +u8 iic_send_wo_dma_len; + +u8 iic_mcu_result; // 一文字リードの時はデータを返す。 + // ステータスが必要ならこっちを呼んで + +#ifdef i2c_timeout_test +extern bit i2c_mcu_time_out_error; +#endif + +// ======================================================== +void nop8() +{ + // 実は nop11 位なのだが +} + + +static err iic_mcu_wait_free() +{ + u16 tot = 0; + + iic_mcu_start( ); + while( 1 ) + { + DI(); + if( !iic_mcu_busy ) + { + iic_mcu_busy = true; + EI(); + break; + } + EI(); + if( ++tot == 0 ) + { +#ifdef i2c_timeout_test + i2c_mcu_time_out_error = true; +#endif + return( ERR_ERR ); + } + } + return( ERR_SUCCESS ); +} + + +/* ======================================================== + スレーブからの 『1文字』 リード + 返値がデータそのものです。 + ======================================================== */ +u8 iic_mcu_read_a_byte( u8 SLA, u8 adrs ) +{ + u8 dat; + +#if 1 + // ラッパー + if( iic_mcu_read( SLA, adrs, 1, &dat ) == ERR_SUCCESS ) + { + iic_mcu_result = ERR_OK; + } + else + { + iic_mcu_result = ERR_NOSLAVE; + } + return ( dat ); + +#else + iic_mcu_wait_free(); + + // スタートコンディションとスレーブの呼び出し、レジスタアドレスの送信 + if( iic_mcu_call_slave( SLA ) != 0 ) + { + iic_mcu_result = ERR_NOSLAVE; + iic_mcu_busy = false; + return ( 0 ); + } + + // レジスタアドレスの送信 + iic_mcu_send_a_byte( adrs ); // 終わるまで帰ってこない + // if( err != ERR_SUCCESS )〜 + + // データ受信 // + iic_mcu_send_re_st( ); // リスタートコンディション + iic_mcu_send_a_byte( SLA | 0x01 ); // 送信完了まで戻ってきません。 + + ST0 = 0x0004; // 受信モードに設定を変えるのでロジック停止 + SCR02 = RXE0 | 1 << SLC02 | 7 << DLS02; // 受信設定 + SS0 = 0x0004; // 通信待機 + + SOE0 = 0x0000; // 1バイト送信なので、最後のNAKを送る + IICIF10 = 0; + SIO10 = 0xFF; // ダミーデータを書くと受信開始 + + while( IICIF10 == 0 ) + { // 受信完了待ち + ; + } + dat = SIO10; + + iic_mcu_send_sp( ); + IICIF10 = 0; // 後を濁さないこと + iic_mcu_busy = false; + return ( dat ); +#endif +} + + + +/* ======================================================== + スレーブからのリード + 0 正常終了 + 1 スレーブが応答しない + 2 バスが誰かに占有されていてタイムアウト + 3 意味不明エラー + 【注】 + スレーブがウェイトコンディションを出すことは禁止です。 + その場合でもエラー検出などできません + ======================================================== */ +err iic_mcu_read( u8 slave, u8 adrs, u8 len, u8 * dest ) +{ + +#if 1 + if( iic_mcu_wait_free() != ERR_SUCCESS ) + { + return( ERR_ERR ); + } +#else + // 使用中なら帰る +#endif + + // スタートコンディションとスレーブの呼び出し、レジスタアドレスの送信 + if( iic_mcu_call_slave( slave ) != 0 ) + { + iic_mcu_busy = false; + return ( ERR_NOSLAVE ); + } + + // レジスタアドレスの送信 + iic_mcu_send_a_byte( adrs ); // 終わるまで帰ってこない + // if( err != ERR_SUCCESS )〜 + + // データ受信 // + iic_mcu_send_re_st( ); // リスタートコンディション + iic_mcu_send_a_byte( slave | 0x01 ); // 送信完了まで戻ってきません。 + + // データ受信 + ST0 = 0x0004; // 受信モードに設定を変えるのでロジック停止 + SCR02 = RXE0 | 1 << SLC02 | 7 << DLS02; // 受信設定 + SS0 = 0x0004; // 通信待機 + + do + { + if( len == 1 ) + { + SOE0 = 0x0000; // 最後のNAK + } + IICIF10 = 0; + SIO10 = 0xFF; // ダミーデータを書くと受信開始 + while( IICIF10 == 0 ) + {;} // 受信完了待ち + + *dest = SIO10; + dest++; + len--; + } + while( len != 0 ); + + iic_mcu_send_sp( ); + + IICIF10 = 0; + iic_mcu_busy = false; + return ( ERR_SUCCESS ); +} + + + + +/* ======================================================== + スレーブへ 『1バイト』 ライト + 前の転送が終わるのを待って、ライトします。 + 返値 iic_mcu_write に同じ + ======================================================== */ +err iic_mcu_write_a_byte( u8 SLA, u8 adrs, u8 dat ) +{ + +#if 0 + static u8 temp; // 書きっぱなしで終了を見ずに関数を抜ける(可能性が高い)のでstatic + + // これをしないと、立て続けに書いたときに前のデータを破壊してしまう + while( iic_mcu_busy ) + { + NOP( ); + } + + temp = dat; + iic_mcu_wo_dma = true; + return ( iic_mcu_write( SLA, adrs, 1, &temp ) ); +#else + // 1文字の時はDMAとか起動しないでさっさと終わらせる + if( iic_mcu_wait_free() != ERR_SUCCESS ) + { + return( ERR_ERR ); + } + + // スタートコンディションとスレーブの呼び出し... + IICMK10 = 1; + if( iic_mcu_call_slave( SLA ) != ERR_SUCCESS ) + { + iic_mcu_busy = false; + return ( ERR_NOSLAVE ); + } + iic_mcu_send_a_byte( adrs ); + iic_mcu_send_a_byte( dat ); + iic_mcu_send_sp( ); + iic_mcu_busy = false; + return ( ERR_SUCCESS ); +#endif +} + + + +/* ======================================================== + スレーブへライト + レジスタ adrs を先頭に、 + *strから + len文字書きます。 + + 0 正常終了 + 1 スレーブが応答しない + 2 バスが誰かに占有されていてタイムアウト + 3 前に指示された通信がまだ終わってない + 【注】 + スレーブがウェイトコンディションを出すことは禁止です。 + その場合でもエラー検出などできません + DMA1を使用します。 + ******************************************************************************/ +err iic_mcu_write( u8 slave, u8 adrs, u8 len, void * src ) +{ + if( iic_mcu_wait_free() != ERR_SUCCESS ) + { + return( ERR_ERR ); + } +#if 0 + // 使用中なら帰る +#endif + + // スタートコンディションとスレーブの呼び出し... + IICMK10 = 1; + IICIF10 = 0; + if( iic_mcu_call_slave( slave ) != ERR_SUCCESS ) + { + iic_mcu_busy = false; + return ( ERR_NOSLAVE ); + } + + IICIF10 = 0; + if( !iic_mcu_wo_dma ) + { + // DMAを使用する(通常) + + // レジスタアドレスを送り、データの準備 + memcpy( iic_send_work, src, 4 ); //バッファとして4バイトしか用意して無いため。 + // DMAセット + while( DST1 ) + {;} + + DEN1 = 1; + DSA1 = (u8)( &SIO10 ); + DRA1 = (u16)( &iic_send_work[0] ); + DBC1 = len; + DMC1 = DRS | 8; // RAM -> SFR, 8bit, IRQ, IIC10 + + DMAIF1 = 0; + DMAMK1 = 0; + DST1 = 1; + + SIO10 = adrs; // 書きっぱなし! 割り込みが発生してDMAスタート + // 残りは割り込みルーチン内で + } + else + { + // DMAを使用しない // + + // レジスタアドレスの送信 + IICMK10 = 0; + SIO10 = adrs; + + iic_send_wo_dma_len = len; + p_iic_send_wo_dma_dat = src; + // 残りは割り込みルーチン内で + } + + return ( ERR_SUCCESS ); +} + + + + +/* ======================================================== + DMA1転送終了割り込み + IIC_mcu の送信完了コールバック関数のようなもの + 注:DMA転送が終わっただけで、I2Cの転送は終わってません +  割り込み中などで、DMA1の処理が遅延した場合、 + IIC10の割り込みの準備ができずに、割り込みを発生させられなくなる + 恐れがあります。また、回避方法も特にありません。 +  そのため、DMA仕様の差異は、最後のバイトは送信完了を + フラグのポーリングで確認します。 + ======================================================== */ +__interrupt void int_dma1( ) +{ + EI(); + + DMAMK1 = 1; + DEN1 = 0; + while( ( SSR02L & TSF0 ) != 0 ) + { + u16 i = 0; + if( ++i == 0 ) // タイムアウト? + { + break; + } + } + +// iic_mcu_send_sp(); // ISR中で外の関数を呼ぶのは都合が悪い(汎用レジスタ待避が発生する)ので展開 + { + ST0 = 0x0004; + SOE0 = 0; // 受信の時はもっと前に「も」設定してる。(NACK出力) + SO0 = 0x0000 | TAUS_MASK; // SCL +// nop8(); すら呼んじゃだめ + NOP(); NOP(); NOP(); NOP(); + NOP(); NOP(); NOP(); NOP(); + SO0 = 0x0400 | TAUS_MASK; // SCL + NOP(); NOP(); NOP(); NOP(); + NOP(); NOP(); NOP(); NOP(); + SO0 = 0x0404 | TAUS_MASK; + } + + IICMK10 = 1; + iic_mcu_busy = false; +} + + + +/* ======================================================== + IIC MCUのバイト送出完了割り込み + ※DMA使用時は使用されません。 +  他の割り込み処理中でDMAの割り込みにすぐ飛ばない場合、 +  IIC割り込みのセットが間に合わず困ることがあります。 + ======================================================== */ +__interrupt void int_iic10( ) +{ + EI(); + if( iic_send_wo_dma_len != 0 ) + { + SIO10 = *p_iic_send_wo_dma_dat; + p_iic_send_wo_dma_dat++; + iic_send_wo_dma_len--; + return; + } + + // 最後のバイト送信完了 + IICMK10 = 1; +// iic_mcu_send_sp(); // ISR中で外の関数を呼ぶのは都合が悪い(汎用レジスタ待避が発生する)ので展開 + { + ST0 = 0x0004; + SOE0 = 0; // 受信の時はもっと前に「も」設定してる。(NACK出力) + SO0 = 0x0000 | TAUS_MASK; // SCL + NOP(); NOP(); NOP(); NOP(); + NOP(); NOP(); NOP(); NOP(); + SO0 = 0x0400 | TAUS_MASK; // SCL + NOP(); NOP(); NOP(); NOP(); + NOP(); NOP(); NOP(); NOP(); + SO0 = 0x0404 | TAUS_MASK; + } + + iic_mcu_wo_dma = false; + iic_mcu_busy = false; +} + + + +/* ======================================================== + スレーブの呼び出し + スレーブアドレスを呼んで、ACKの確認。 + ACK →                 返:0 + NACK → ストップコンディションを出す。 返:1 + ======================================================== */ +static err iic_mcu_call_slave( u8 slave ) +{ + iic_mcu_send_st( ); + +// SIR02 = SSR02; // NAKエラーのフラグクリア + if( iic_mcu_send_a_byte( slave ) != ERR_SUCCESS ) + { + iic_mcu_send_sp( ); + return ( ERR_NAK ); // 指定のスレーブがいない / busy + } + + return ( ERR_SUCCESS ); +} + + + +/* ======================================================== + ほんとに1バイト書くのみ + 書き終わるまで帰りません + ======================================================== */ +static err iic_mcu_send_a_byte( u8 dat ) +{ + IICMK10 = 1; + IICIF10 = 0; + SIO10 = dat; + while( IICIF10 == 0 ) + { +// NOP( ); + } // 通信中 + if( SSR02 != 0 ) + { + SIR02 = SSR02; + return ( ERR_NAK ); + } + return ( ERR_SUCCESS ); +} + + + +/* ======================================================== + スタートコンディションを発行 + ソフトウェア制御 + ======================================================== */ +static void iic_mcu_send_st( ) +{ + SO0 &= ~0x0004; // SDA + nop8(); + + SO0 &= ~0x0400; // SCL + SOE0 = 0x0004; // ハード制御へ + + SCR02 = TXE0 | 1 << SLC02 | 7 << DLS02; // 送信許可、データは8ビット単位 + SS0 = 0x0004; // 通信待機 +} + + + +/* ======================================================== + リスタート発行 + ======================================================== */ +static void iic_mcu_send_re_st( ) +{ + ST0 |= 0x0004; + SO0 |= 0x0400 | TAUS_MASK; // ( SDA = H ), SCL -> H + nop8(); + + SOE0 &= ~0x0004; // ( SCL = H ), SDA -> L + nop8(); + + iic_mcu_send_st( ); +} + + + +/* ======================================================== + ストップコンディション発行 + この前に、「最後のバイトの送受信」の時に前準備が必要です。 + ======================================================== */ +static void iic_mcu_send_sp( ) +{ + ST0 = 0x0004; + SOE0 = 0; // 受信の時はもっと前に「も」設定してる。(NACK出力) + SO0 = 0x0000 | TAUS_MASK; // SCL + nop8(); + + SO0 = 0x0400 | TAUS_MASK; // SCL + nop8(); + + SO0 = 0x0404 | TAUS_MASK; +} + + + + +/* ======================================================== + ペリフェラルモジュールの初期化 + ======================================================== */ +void iic_mcu_start( ) +{ + if( iic_mcu_initialized ) + { + return; + } + + iic_mcu_busy = true; + DST1 = 0; + NOP( ); // 2clkもしくは、DSTn==0をポーリング + NOP( ); + DEN1 = 0; + + I2C_PU_on(); + wait_ms( 20 ); // 立ち上がるのに50us位かかる + + SAU0EN = 1; + nop8(); + + SPS0 = 0x0000; // シリアルユニットのクロック0。(8M/2)/1 + SMR02 = bSMR0n_FIXEDBIT | bMD0n2; // 簡易I2Cに設定 + SDR02 = 10 << 9; // ボーレート設定 8M/1/(x+1)/2 + + SO0 = 0x0404 | TAUS_MASK; // 最初はHH + iic_mcu_wo_dma = false; + + + // バスのリセット + IICIF10 = 0; + IICMK10 = 1; + + iic_mcu_send_st(); + + SIO10 = 0xFF; + while( IICIF10 == 0 ){;} // 通信中 + iic_mcu_send_sp(); + + SIR02 = SSR02; + + iic_mcu_busy = false; + iic_mcu_initialized = true; +} + + + +/* ======================================================== + モジュールの停止 + 再度使うときは初期化が必要 + ======================================================== */ +void iic_mcu_stop( ) +{ + while( iic_mcu_busy ) + {;} // DMA動作中はもう少し待つ + iic_mcu_send_re_st( ); // SCL,SDAをLLにする + I2C_PU_off(); + SAU0EN = 0; + iic_mcu_initialized = false; +} + + + + + + + + + + +/* ======================================================== + コーデックに 『1バイト』 ライト + iic_mcu_write_a_byte CODEC不具合ワークアラウンド + ======================================================== */ +err iic_mcu_write_a_byte_codec( u8 adrs, u8 dat ) +{ + static u8 count; + + // 1文字の時はDMAとか起動しないでさっさと終わらせる + if( iic_mcu_wait_free() != ERR_SUCCESS ) + { + return( ERR_ERR ); + } + + // スタートコンディションとスレーブの呼び出し... + IICMK10 = 1; + if( iic_mcu_call_slave( IIC_SLA_CODEC ) != ERR_SUCCESS ) + { + iic_mcu_busy = false; + return ( ERR_NOSLAVE ); + } + iic_mcu_send_a_byte( adrs ); + iic_mcu_send_a_byte( dat ); + + // ワークアラウンドここから + /// リスタートにしてダミーライト + iic_mcu_send_re_st( ); + iic_mcu_send_a_byte( IIC_SLA_CODEC ); // ダミーライト + iic_mcu_send_a_byte( 0x20 ); + iic_mcu_send_a_byte( count ); + + count++; + + iic_mcu_send_sp( ); + iic_mcu_busy = false; + return ( ERR_SUCCESS ); +} diff --git a/branches/sim/i2c_mcu.h b/branches/sim/i2c_mcu.h new file mode 100644 index 0000000..af2b1d1 --- /dev/null +++ b/branches/sim/i2c_mcu.h @@ -0,0 +1,36 @@ +#ifndef __ic2_mcu__ +#define __ic2_mcu__ + + +// ======================================================== +#define ERR_OK 0 +#define ERR_NAK 1 +#define ERR_NOSLAVE 2 + + + +// ======================================================== +extern volatile bit iic_mcu_busy; +extern bit iic_mcu_wo_dma; + +extern u8 iic_mcu_result; + + +// ======================================================== +err iic_mcu_read( u8 SLA, u8 adrs, u8 len, u8 * dest ); +u8 iic_mcu_read_a_byte( u8 SLA, u8 adrs ); + +err iic_mcu_write( u8 SLA, u8 adrs, u8 len, void * src ); +err iic_mcu_write_a_byte( u8 SLA, u8 adrs, u8 dat ); + +err iic_mcu_write_a_byte_codec( u8 adrs, u8 dat ); + + +// ↓その通信が完了したら解除されます。 +#define iic_mcu_set_wo_dma() { while( iic_mcu_busy ){;} iic_mcu_wo_dma = 1; } + +void iic_mcu_start( ); +void iic_mcu_stop( ); + + +#endif diff --git a/branches/sim/i2c_twl.c b/branches/sim/i2c_twl.c new file mode 100644 index 0000000..1a2fa17 --- /dev/null +++ b/branches/sim/i2c_twl.c @@ -0,0 +1,224 @@ +#pragma sfr /* 特殊機能レジスタ使用 */ + + + +/*============================================================================*/ + +#include "config.h" +#ifdef _MCU_KE3_ +#else +#pragma interrupt INTIICA0 int_iic_twl RB2 +#endif + +#include "incs.h" +#include "i2c_twl_defs.h" +#include "i2c_twl.h" + +extern u8 vreg_twl[]; + +#ifdef _MCU_BSR_ +//#ifdef _MODEL_TS0_ || _MODEL_WM0_ + +// ワーキングモデルはI2Cが逆 +#define ACKD ACKD0 +#define ACKE ACKE0 +#define COI COI0 +#define IICAEN IICA0EN +#define IICRSV IICRSV0 +#define IICA IICA0 +#define IICAIF IICAIF0 +#define IICAMK IICAMK0 +#define IICAPR0 IICAPR00 +#define IICAPR1 IICAPR10 +#define IICCTL0 IICCTL00 +#define IICE IICE0 +#define IICF IICF0 +#define IICS IICS0 +#define IICWH IICWH0 +#define IICWL IICWL0 +#define LREL LREL0 +#define SPD SPD0 +#define SPIE SPIE0 +#define STCEN STCEN0 +#define STD STD0 +#define SVA SVA0 +#define WREL WREL0 +#define WTIM WTIM0 +#define SMC SMC0 +#define TRC TRC0 + +#endif + +#ifndef _MCU_BSR_ + +// ke3の時はダミー関数 +void IIC_twl_Stop( void ) +{ +} +void IIC_twl_Init( void ) +{ +} +#else + + + +enum IIC_TWL_STATE{ + WAIT_ADRS = 0, + WAIT_DATA, + DATA_READED +}; + + + + +/*============================================================================*/ + +// 注! ↓はマクロなので、returnはメインループに戻ります。 +#define wait_next { \ + tot = 0; \ + while( IICAIF != 1 ){ \ + tot++; \ + if( tot == 0 ){ \ + LREL = 1; \ + return; \ + } \ + } \ +} + + +__interrupt void int_iic_twl( ) +{ + u8 vreg_adrs; + u8 pre_dat; + u8 rcvd; + u16 tot; + u8 state; + + // @ + WREL = 1; // ウェイト解除して次のバイトを待つ + WDT_Restart(); + state = WAIT_ADRS; + + while( 1 ) + { + u8 my_iics; + + wait_next; // 1バイト受信完了を待つ + + my_iics = IICS; + IICAIF = 0; + + if( my_iics & 0x02 ) // ( STD && !SPD ) + { + // スタートコンディションがきた + if( ( my_iics & 0x08 ) == 0 ) // ( TRC ) 送信方向フラグ 0:マイコンが受信 + { + // @’マイコンが応答できず、TWLがリトライしたときとか + // ここに来るのはスレーブ呼び出しの時 // + WREL = 1; + state = WAIT_ADRS; + /// レジスタアドレスが書かれるのを待つ + } + else + { + // BR Rでのスレーブ呼び出し(リスタートコンディション) // + IICA = vreg_twl_read( vreg_adrs ); // データ送信 + // ストップ待ち後、LREL = 1 にしないと、送信バッファが破壊されることがある + state = DATA_READED; + } + } + else if( ( my_iics & 0x03 ) == 0 ) // ( !STD && !SPD ) + { + // 何らか受信 + rcvd = IICA; + WREL = 1; + + if( state == WAIT_ADRS ) + { + // A + vreg_adrs = adrs_table_twl_ext2int( rcvd ); + /// データが書かれるか、リスタートで読み出されるのを待つ + state = WAIT_DATA; + } + else if( state == DATA_READED ) + { + // データ1バイト送信後発生する + LREL = 1; + return; + } + else + { + // BW + // データ書き込まれ + SVA = 0x5A; // ダミー + LREL = 1; // スタートコンディション待ちへ(連続書き込み未対応のため) + vreg_twl_write( vreg_adrs, rcvd ); + SVA = IIC_T_SLAVEADDRESS; + return; // 受信おしまい // + } + } + else if( my_iics & 0x01 ) // SPD + { + // 終了 + LREL = 1; + return; + } + else + { + // NOP(); + } + } +} + + + +/*****************************************************/ +void IIC_twl_Init( void ) +{ + + IICAEN = 1; + + IICE = 0; /* IICA disable */ + + IICAMK = 1; /* INTIICA disable */ + IICAIF = 0; /* clear INTIICA interrupt flag */ + + IICAPR0 = 0; /* set INTIICA high priority */ + IICAPR1 = 0; /* set INTIICA high priority */ + P20 &= ~0x3; + + SVA = IIC_T_SLAVEADDRESS; + IICF = 0x01; + + STCEN = 1; // リスタートの許可 + IICRSV = 1; // 通信予約をさせない:スレーブに徹する + + SPIE = 0; // ストップコンディションでの割り込みを禁止 + WTIM = 1; // 自動でACKを返した後clkをLに固定する + ACKE = 1; // ダメCPUは無視して次の通信をはじめるかもしれないんで早くclkを開放しないといけない + + IICWH = 5; + IICWL = 10; // L期間の長さ(?) + + SMC = 1; + + IICAMK = 0; // 割り込みを許可 + + IICE = 1; + + PM20 &= ~0x3; /* set clock pin for IICA */ + + LREL = 1; +} + + + +//**************************************************************************** +void IIC_twl_Stop( void ) +{ + IICE = 0; /* IICA disable */ + IICAEN = 0; +} + + +#endif diff --git a/branches/sim/i2c_twl.h b/branches/sim/i2c_twl.h new file mode 100644 index 0000000..0f608b0 --- /dev/null +++ b/branches/sim/i2c_twl.h @@ -0,0 +1,7 @@ +#ifndef _iic_twl_ +#define _iic_twl_ + +void IIC_twl_Init( void ); +void IIC_twl_Stop( void ); + +#endif diff --git a/branches/sim/i2c_twl_defs.h b/branches/sim/i2c_twl_defs.h new file mode 100644 index 0000000..be5d566 --- /dev/null +++ b/branches/sim/i2c_twl_defs.h @@ -0,0 +1,196 @@ +#ifndef _MDSERIAL_ +#define _MDSERIAL_ + + +/* IIC operation enable (IICE0) */ +#define IIC0_OPERATION 0x80 +#define IIC0_OPERATION_DISABLE 0x00 /* stop operation */ +#define IIC0_OPERATION_ENABLE 0x80 /* enable operation */ + +/* Exit from communications (LREL0) */ +#define IIC0_COMMUNICATION 0x40 +#define IIC0_COMMUNICATION_NORMAL 0x00 /* normal operation */ +#define IIC0_COMMUNICATION_EXIT 0x40 /* exit from current communication */ + +/* Wait cancellation (WREL0) */ +#define IIC0_WAITCANCEL 0x20 +#define IIC0_WAIT_NOTCANCEL 0x00 /* do not cancel wait */ +#define IIC0_WAIT_CANCEL 0x20 /* cancel wait */ + +/* Generation of interrupt when stop condition (SPIE0) */ +#define IIC0_STOPINT 0x10 +#define IIC0_STOPINT_DISABLE 0x00 /* disable */ +#define IIC0_STOPINT_ENABLE 0x10 /* enable */ + +/* Wait and interrupt generation (WTIM0) */ +#define IIC0_WAITINT 0x08 +#define IIC0_WAITINT_CLK8FALLING 0x00 /* generate at the eighth clocks falling edge */ +#define IIC0_WAITINT_CLK9FALLING 0x08 /* generated at the ninth clocks falling edge */ + +/* Acknowledgement control (ACKE0) */ +#define IIC0_ACK 0x04 +#define IIC0_ACK_DISABLE 0x00 /* enable acknowledgement */ +#define IIC0_ACK_ENABLE 0x04 /* disable acknowledgement */ + +/* Start condition trigger (STT0) */ +#define IIC0_STARTCONDITION 0x02 +#define IIC0_START_NOTGENERATE 0x00 /* do not generate start condition */ +#define IIC0_START_GENERATE 0x02 /* generate start condition */ + +/* Stop condition trigger (SPT0) */ +#define IIC0_STOPCONDITION 0x01 +#define IIC0_STOP_NOTGENERATE 0x00 /* do not generate stop condition */ +#define IIC0_STOP_GENERATE 0x01 /* generate stop condition */ + +/* + IIC Status Register 0 (IICS0) +*/ +/* Master device status (MSTS0) */ +#define IIC0_MASTERSTATUS 0x80 +#define IIC0_STATUS_NOTMASTER 0x00 /* slave device status or communication standby status */ +#define IIC0_STATUS_MASTER 0x80 /* master device communication status */ + +/* Detection of arbitration loss (ALD0) */ +#define IIC0_ARBITRATION 0x40 +#define IIC0_ARBITRATION_NO 0x00 /* arbitration win or no arbitration */ +#define IIC0_ARBITRATION_LOSS 0x40 /* arbitration loss */ + +/* Detection of extension code reception (EXC0) */ +#define IIC0_EXTENSIONCODE 0x20 +#define IIC0_EXTCODE_NOT 0x00 /* extension code not received */ +#define IIC0_EXTCODE_RECEIVED 0x20 /* extension code received */ + +/* Detection of matching addresses (COI0) */ +#define IIC0_ADDRESSMATCH 0x10 +#define IIC0_ADDRESS_NOTMATCH 0x00 /* addresses do not match */ +#define IIC0_ADDRESS_MATCH 0x10 /* addresses match */ + +/* Detection of transmit/receive status (TRC0) */ +#define IIC0_STATUS 0x08 +#define IIC0_STATUS_RECEIVE 0x00 /* receive status */ +#define IIC0_STATUS_TRANSMIT 0x08 /* transmit status */ + +/* Detection of acknowledge signal (ACKD0) */ +#define IIC0_ACKDETECTION 0x04 +#define IIC0_ACK_NOTDETECTED 0x00 /* ACK signal was not detected */ +#define IIC0_ACK_DETECTED 0x04 /* ACK signal was detected */ + +/* Detection of start condition (STD0) */ +#define IIC0_STARTDETECTION 0x02 +#define IIC0_START_NOTDETECTED 0x00 /* start condition not detected */ +#define IIC0_START_DETECTED 0x02 /* start condition detected */ + +/* Detection of stop condition (SPD0) */ +#define IIC0_STOPDETECTION 0x01 +#define IIC0_STOP_NOTDETECTED 0x00 /* stop condition not detected */ +#define IIC0_STOP_DETECTED 0x01 /* stop condition detected */ + +/* + IIC Flag Register 0 (IICF0) +*/ +/* STT0 clear flag (STCF) */ +#define IIC0_STARTFLAG 0x80 +#define IIC0_STARTFLAG_GENERATE 0x00 /* generate start condition */ +#define IIC0_STARTFLAG_UNSUCCESSFUL 0x80 /* start condition generation unsuccessful */ + +/* IIC bus status flag (IICBSY) */ +#define IIC0_BUSSTATUS 0x40 +#define IIC0_BUS_RELEASE 0x00 /* bus release status */ +#define IIC0_BUS_COMMUNICATION 0x40 /* bus communication status */ + +/* Initial start enable trigger (STCEN) */ +#define IIC0_STARTWITHSTOP 0x02 +#define IIC0_START_WITHSTOP 0x00 /* generation of a start condition without detecting a stop condition */ +#define IIC0_START_WITHOUTSTOP 0x02 /* generation of a start condition upon detection of a stop condition */ + +/* Communication reservation function disable bit (IICRSV) */ +#define IIC0_RESERVATION 0x01 +#define IIC0_RESERVATION_ENABLE 0x00 /* enable communication reservation */ +#define IIC0_RESERVATION_DISABLE 0x01 /* disable communication reservation */ + +/* + IIC clock selection register 0 (IICCL0) +*/ +#define IICCL0_INITIALVALUE 0x00 +/* Detection of SCL0 pin level (CLD0) */ +#define IIC0_SCLLEVEL 0x20 +#define IIC0_SCL_LOW 0x00 /* clock line at low level */ +#define IIC0_SCL_HIGH 0x20 /* clock line at high level */ + +/* Detection of SDA0 pin level (DAD0) */ +#define IIC0_SDALEVEL 0x10 +#define IIC0_SDA_LOW 0x00 /* data line at low level */ +#define IIC0_SDA_HIGH 0x10 /* data line at high level */ + +/* Operation mode switching (SMC0) */ +#define IIC0_OPERATIONMODE 0x08 +#define IIC0_MODE_STANDARD 0x00 /* operates in standard mode */ +#define IIC0_MODE_HIGHSPEED 0x08 /* operates in high-speed mode */ + +/* Digital filter operation control (DFC0) */ +#define IIC0_DIGITALFILTER 0x04 +#define IIC0_FILTER_OFF 0x00 /* digital filter off */ +#define IIC0_FILTER_ON 0x04 /* digital filter on */ + +/* Operation mode switching (CL01, CL00) */ +#define IIC0_CLOCKSELECTION 0x03 + +/* Combine of (SMC0, CL01, CL00)*/ +#define IIC0_CLOCK0 0x00 +#define IIC0_CLOCK1 0x01 +#define IIC0_CLOCK2 0x02 +#define IIC0_CLOCK3 0x03 +#define IIC0_CLOCK4 0x08 +#define IIC0_CLOCK5 0x09 +#define IIC0_CLOCK6 0x0a +#define IIC0_CLOCK7 0x0b + +/* + IIC function expansion register 0 (IICX0) +*/ +/* IIC clock expension (CLX0) */ +#define IIC0_CLOCKEXPENSION 0x01 +#define IIC0_EXPENSION0 0x00 +#define IIC0_EXPENSION1 0x01 + +/* Operation clock (CLX0, SMC0, CL01, CL00) + | IIC0_EXPENSION0 | IIC0_EXPENSION1 | +------------|-------------------|-------------------|---------------------- +IIC0_CLOCK0 | fprs/2 | prohibited | selection clock(fw) + | fprs/88 | | transfer clock + | normal | | mode +------------|-------------------|-------------------|---------------------- +IIC0_CLOCK1 | fprs/2 | prohibited | selection clock(fw) + | fprs/172 | | transfer clock + | normal | | mode +------------|-------------------|-------------------|---------------------- +IIC0_CLOCK2 | fprs/2 | prohibited | selection clock(fw) + | fprs/344 | | transfer clock + | normal | | mode +------------|-------------------|-------------------|---------------------- +IIC0_CLOCK3 |prohibited/fexscl0 | prohibited | selection clock(fw) + | fw/66 | | transfer clock + | normal | | mode +------------|-------------------|-------------------|---------------------- +IIC0_CLOCK4 | fprs/2 | fprs/2 | selection clock(fw) + | fprs/48 | fprs/24 | transfer clock + | high speed | high speed | mode +------------|-------------------|-------------------|---------------------- +IIC0_CLOCK5 | fprs/2 | fprs/2 | selection clock(fw) + | fprs/48 | fprs/24 | transfer clock + | high speed | high speed | mode +------------|-------------------|-------------------|---------------------- +IIC0_CLOCK6 | fprs/4 | fprs/4 | selection clock(fw) + | fprs/96 | fprs/48 | transfer clock + | high speed | high speed | mode +------------|-------------------|-------------------|---------------------- +IIC0_CLOCK7 |prohibited/fexscl0 | prohibited | selection clock(fw) + | fw/18 | | transfer clock + | high speed | | mode +------------|-------------------|-------------------|---------------------- +*/ + +#define ADDRESS_COMPLETE 0x80 +#define IIC_MASTER_FLAG_CLEAR 0x00 + +#endif diff --git a/branches/sim/incs.h b/branches/sim/incs.h new file mode 100644 index 0000000..4ac3b15 --- /dev/null +++ b/branches/sim/incs.h @@ -0,0 +1,55 @@ +#pragma SFR +#pragma di +#pragma ei +#pragma nop +#pragma stop +#pragma halt + +#ifndef _WIN32 +#pragma section @@CODE ROM_CODE +//#pragma section @@CNST ROM_CNST +#endif + +# ifdef _WIN32 +// VCの赤線をどうにかする +#include "sim/simOnWin.h" + +# endif + + + +//========================================================= +#ifndef _incs_h_ +#define _incs_h_ + +// ↓ 歩数計で_pc_とで切り替えてます +#define _mcu_ + +#include "jhl_defs.h" +#include "user_define.h" + +#include "bsr_system.h" +#include "renge\renge.h" +#include "loader.h" + +#include "vreg_ctr.h" +#include "vreg_twl.h" + +#include "i2c_mcu.h" +#include "i2c_twl.h" + +#include "rtc.h" + +#include "accero.h" + +#include "pm.h" + +#include "sw.h" + +#include "adc.h" + +#include "wdt.h" + +//========================================================= + +#endif diff --git a/branches/sim/incs_loader.h b/branches/sim/incs_loader.h new file mode 100644 index 0000000..535be09 --- /dev/null +++ b/branches/sim/incs_loader.h @@ -0,0 +1,38 @@ +#pragma SFR +#pragma di +#pragma ei +#pragma nop +#pragma stop +#pragma halt + + +#pragma section @@CODE LDR_CODE +#pragma section @@CODEL LDR_CODL + +//#pragma section @@R_INIT FSL_RINT // これやるとスタートアップルーチンが初期値を +//#pragma section @@CNST FSL_CNST // セットしてくれない +#pragma section @@CNSTL LDR_CNSL + + + +//========================================================= +#include "jhl_defs.h" +#include "user_define.h" + +#include "bsr_system.h" +#include "renge\renge.h" + +#include "vreg_ctr.h" +#include "vreg_twl.h" + +#include "loader.h" + +#include "i2c_mcu.h" + +#include "WDT.h" + + + +//========================================================= +void firm_update( ); +void firm_restore( ); diff --git a/branches/sim/ini_VECT.c b/branches/sim/ini_VECT.c new file mode 100644 index 0000000..38bdea9 --- /dev/null +++ b/branches/sim/ini_VECT.c @@ -0,0 +1,382 @@ +#pragma nop + + +#include "config.h" + +//#pragma interrupt INTWDTI fn_intwdti // 未使用 +//#pragma interrupt INTLVI fn_intlvi // 未使用 + +//#pragma interrupt INTP0 intp0_slp // SLP (CPUより、要求) ポーリング +//#pragma interrupt INTP1 fn_intp1 // (I2C) +//#pragma interrupt INTP2 fn_intp2 // (I2C) +//#pragma interrupt INTP3 fn_intp3 // 未搭載 +#pragma interrupt INTP4 intp4_extdc // EXTDC, ただし電源offから起こすのみ。通常はポーリング +#pragma interrupt INTP5 intp5_shell // SHELL_CLOSE, ただし電源offから起こすのみ。通常はポーリング +#pragma interrupt INTP6 intp6_PM_irq // CODEC経由で旧PMICへのコマンド書き込み + +//#ifdef _MCU_BSR_ // 割り込みそのものは使いません +//#pragma interrupt INTP21 intp21_RFTx // 電波送信パルス +//#else +//#pragma interrupt INTP7 intp21_RFTx +//#endif + + +/* + + acceroへ +#ifdef _MCU_BSR_ +#pragma interrupt INTP23 intp23_ACC_ready RB3 // 加速度センサ、データ準備完了 +#endif +*/ + +//#pragma interrupt INTCMP0 fn_intcmp0 +//#pragma interrupt INTCMP1 fn_intcmp1 +//#pragma interrupt INTDMA0 fn_intdma0 +#pragma interrupt INTDMA1 int_dma1 + +//#pragma interrupt INTST0 fn_intst0 +/* #pragma interrupt INTCSI00 fn_intcsi00 */ +//#pragma interrupt INTSR0 fn_intsr0 +/* #pragma interrupt INTCSI01 fn_intcsi01 */ +//#pragma interrupt INTSRE0 fn_intsre0 + +//#pragma interrupt INTST1 fn_intst1 +/* #pragma interrupt INTCSI10 fn_intcsi10 */ +#pragma interrupt INTIIC10 int_iic10 +//#pragma interrupt INTSR1 fn_intsr1 +//#pragma interrupt INTSRE1 fn_intsre1 + + +/* +それぞれの .c へ +#ifdef _MCU_KE3_ +#pragma interrupt INTIICA int_iic_ctr RB1 // CTR側 +#else +// TSはマザボでテレコ、WMは回路図がテレコで結局一致… +#pragma interrupt INTIICA1 int_iic_ctr RB1 +#endif + + +#ifdef _MCU_KE3_ +#else +#pragma interrupt INTIICA0 int_iic_twl RB2 +#endif +*/ + +//#pragma interrupt INTTM00 fn_inttm00 +//#pragma interrupt INTTM01 fn_inttm01 +//#pragma interrupt INTTM02 fn_inttm02 +//#pragma interrupt INTTM03 fn_inttm03 + +#pragma interrupt INTAD int_adc +#pragma interrupt INTRTC int_rtc +#pragma interrupt INTRTCI int_rtc_int +#pragma interrupt INTKR int_kr +//#pragma interrupt INTMD fn_intmd + +//#pragma interrupt INTTM04 fn_inttm04 +//#pragma interrupt INTTM05 fn_inttm05 +//#pragma interrupt INTTM06 fn_inttm06 +//#pragma interrupt INTTM07 fn_inttm07 + +//#define _irq_debug_ +/****************************************************/ +/* 未使用時のダミー関数定義 */ +/****************************************************/ +__interrupt void fn_intwdti( ) +{ +#ifdef _irq_debug_ + while( 1 ) + { + NOP(); + } +#endif +} + +__interrupt void fn_intlvi( ) +{ +#ifdef _irq_debug_ + while( 1 ) + { + NOP(); + } +#endif +} + +__interrupt void fn_intp0(){ +#ifdef _irq_debug_ +while( 1 ) + { + NOP(); + } +#endif +} + +__interrupt void fn_intp1( ) +{ +#ifdef _irq_debug_ + while( 1 ) + { + NOP(); + } +#endif +} // +__interrupt void fn_intp2( ) +{ +#ifdef _irq_debug_ + while( 1 ) + { + NOP(); + } +#endif +} +__interrupt void fn_intp3( ) +{ +#ifdef _irq_debug_ + while( 1 ) + { + NOP(); + } +#endif +} + + +__interrupt void intp21_RFTx( ) +{ +#ifdef _irq_debug_ + while( 1 ) + { + NOP(); + } +#endif +} + + +//__interrupt void fn_intp4(){ while(1){} } // pm.c +//__interrupt void fn_intp5(){ while(1){} } // pm.c +//__interrupt void fn_intp6(){ while(1){} } // pm.c +//__interrupt void fn_intp7(){ while(1){} } // led.c +//__interrupt void fn_intp21(){ while(1){} } // led.c + +__interrupt void fn_intcmp0( ) +{ +#ifdef _irq_debug_ + while( 1 ) + { + NOP(); + } +#endif +} + +__interrupt void fn_intcmp1( ) +{ +#ifdef _irq_debug_ + while( 1 ) + { + NOP(); + } +#endif +} + +__interrupt void fn_intdma0( ) +{ +#ifdef _irq_debug_ + while( 1 ) + { + NOP(); + } +#endif +} + +//__interrupt void fn_intdma1(){} // i2c_mcu.cにある + +__interrupt void fn_intst0( ) +{ +#ifdef _irq_debug_ + while( 1 ) + { + NOP(); + } +#endif +} + +/* __interrupt void fn_intcsi00(){} */ +__interrupt void fn_intsr0( ) +{ +#ifdef _irq_debug_ + while( 1 ) + { + NOP(); + } +#endif +} + +/* __interrupt void fn_intcsi01(){} */ +__interrupt void fn_intsre0( ) +{ +#ifdef _irq_debug_ + while( 1 ) + { + NOP(); + } +#endif +} + +__interrupt void fn_intst1( ) +{ +#ifdef _irq_debug_ + while( 1 ) + { + NOP(); + } +#endif +} + +/* __interrupt void fn_intcsi10(){} */ +//__interrupt void fn_intiic10(){ while(1){} } +__interrupt void fn_intsr1( ) +{ +#ifdef _irq_debug_ + while( 1 ) + { + NOP(); + } +#endif +} + +__interrupt void fn_intsre1( ) +{ +#ifdef _irq_debug_ + while( 1 ) + { + NOP(); + } +#endif +} + +//__interrupt void fn_intiica(){} // i2c.cにある +/* __interrupt void fn_inttm00(){} *//* sub.cにて定義 */ +__interrupt void fn_inttm01( ) +{ +#ifdef _irq_debug_ + while( 1 ) + { + NOP(); + } +#endif +} + +__interrupt void fn_inttm02( ) +{ +#ifdef _irq_debug_ + while( 1 ) + { + NOP(); + } +#endif +} +__interrupt void fn_inttm03( ) +{ +#ifdef _irq_debug_ + while( 1 ) + { + NOP(); + } +#endif +} + +//__interrupt void fn_intad(){ while(1){} } // adc.c +__interrupt void fn_intrtc( ) +{ +#ifdef _irq_debug_ + while( 1 ) + { + NOP(); + } +#endif +} + +//__interrupt void int_rtcint(){} // rtc.cにある +//__interrupt void fn_intkr(){} // main.c +__interrupt void fn_intmd( ) +{ +#ifdef _irq_debug_ + while( 1 ) + { + NOP(); + } +#endif +} + +__interrupt void fn_inttm04( ) +{ +#ifdef _irq_debug_ + while( 1 ) + { + NOP(); + } +#endif +} + +__interrupt void fn_inttm05( ) +{ +#ifdef _irq_debug_ + while( 1 ) + { + NOP(); + } +#endif +} + +__interrupt void fn_inttm06( ) +{ +#ifdef _irq_debug_ + while( 1 ) + { + NOP(); + } +#endif +} + +__interrupt void fn_inttm07( ) +{ +#ifdef _irq_debug_ + while( 1 ) + { + NOP(); + } +#endif +} + + + +/* ======================================================== + キーリターン割り込み + ======================================================== */ +__interrupt void int_kr( ) +{ + // 起きるだけ +} + + + +/* ======================================================== + ext dc + ======================================================== */ +__interrupt void intp4( ) +{ + // 起きるだけ +} + + + +/* ======================================================== + shell close + ======================================================== */ +__interrupt void intp5( ) +{ + // 起きるだけ +} + + + diff --git a/branches/sim/jhl_defs.h b/branches/sim/jhl_defs.h new file mode 100644 index 0000000..b0b36c6 --- /dev/null +++ b/branches/sim/jhl_defs.h @@ -0,0 +1,29 @@ +#ifndef __jhl_defs_h__ +#define __jhl_defs_h__ + +typedef unsigned char u8; +typedef signed char s8; +typedef unsigned short u16; +typedef signed short s16; + +typedef unsigned short ux16; +typedef signed short sx16; + +#define true 1 +#define false 0 + + +// typedef unsigned char err; + +#include "config.h" + +#define set_bit( cond, reg, pos ) \ +{ \ + if( cond ){ \ + reg |= pos; \ + }else{ \ + reg &= ~pos; \ + } \ +} + +#endif diff --git a/branches/sim/led.c b/branches/sim/led.c new file mode 100644 index 0000000..aa78b7d --- /dev/null +++ b/branches/sim/led.c @@ -0,0 +1,347 @@ +/* ======================================================== + LED.c + ======================================================== */ +#pragma sfr + + +#include "incs.h" +#include "led.h" + + + +// ======================================================== +// TPS0 +#define BIT_PRS012 ( 1 << 2 ) +#define BIT_PRS002 ( 1 << 6 ) + +// TMR0 +#define BIT_CKS0 15 +#define BIT_CCS0 12 +#define BIT_MASTER0 11 +#define BIT_STS0 8 +#define BIT_CIS0 6 +#define BIT_MD123 1 +#define BIT_MD0 0 + + + +// ======================================================== +bit ledInitialized; + + +// お知らせLEDのパターンデータ +uni_info_LED info_LED; + + +bit info_led_off; +bit info_led_override; + + +// 充電中か否か +extern bit BT_IN_CHG_delayed_n; + + +// ======================================================== +#define led_fade_to( now, goal ) now = fade_to( now, goal ) + +/* ======================================================== + reg_ledをgoalになるまでグラデーションする + とりあえず、ステップ固定 + ====================================================== */ +u8 fade_to( u8 now, u8 goal ) +{ + if( now != goal ) + { + if( now > goal ) + { + now -= 1; + } + else + { + now += 1; + } + } + return( now ); +} + + + + +// ======================================================== +#define led_fade_to2( led, status ) \ + led = fade_to2( status ) + + +u8 fade_to2( st_LED_dim_status* status ) +{ + if( status->now != status->to ) + { + if( abs(( status->to - status->now )) > abs(status->delta) ) + { + status->now += status->delta; + } + else + { + status->now = status->to; + } + } + return( status->now / 128 ); +} + + + + +// ======================================================== + + +// ======================================================== +void LED_init( ) +{ +/** + PWMのセット、とりあえず全部消灯 + + マスタチャネル:0 (P01:/reset2) マスターは偶数チャネルしかできない + スレーブ    1 SLTO。(3D LED?) +         2 カメラ +         3 WiFi +         4 (ピンはRTC32kHz out に使用) +         5 充電 +         6 電源 L +         7 電源 H + */ + TAU0EN = 1; + TPS0 = BIT_PRS012 | BIT_PRS002; // マスタークロックはCK01,8M/2 /2^4 = 250kHz + + TMR00 = + 1 << BIT_CKS0 | 0 << BIT_CCS0 | 1 << BIT_MASTER0 | 0 << BIT_STS0 | 0 + << BIT_CIS0 | 0 << BIT_MD123 | 1 << BIT_MD0; + TMR01 = TMR02 = TMR03 = TMR04 = TMR05 = TMR06 = TMR07 = + 1 << BIT_CKS0 | 0 << BIT_CCS0 | 0 << BIT_MASTER0 | 4 << BIT_STS0 | 0 + << BIT_CIS0 | 4 << BIT_MD123 | 1 << BIT_MD0; + ISC = 0; + TOM0 = 0b0000000011111110; // 出力モード。4はPWM出力しないが1にしないとTO5以降にクロックが届かない + + TOL0 = 0b0000000000000000; // 出力を反転させるかフラグ + + TO0 = 0; // タイマー動作中で、タイマー出力にしてないときのピンのラッチ。タイマー出力を使わないなら0 + TOE0 = 0b0000000011101110; // TOxをタイマーモジュールが制御? + + TS0 = 0b0000000011101111; // 動作開始 + + TDR00 = LED_BRIGHT_MAX - 1; // 周期 10bit + +// system_status.info_fullcolor = 1; + + LED_duty_notify_red = 0; + LED_duty_notify_blu = 0; + LED_duty_notify_grn = 0; + LED_pow_red = 0; + LED_CAM = 0; + + if( system_status.reboot ) + { + vreg_ctr[VREG_C_LED_POW] = LED_POW_ILM_AUTO; + LED_duty_pow_blu = LED_BRIGHT_MAX; + } + info_led_off = false; + ledInitialized = true; +} + + + +void LED_stop( ) +{ + TT0 = 0b0000000011101111; // 一斉停止(しないとだめ) + TOE0 = 0b0000000000000000; // TOxをタイマーモジュールが制御?(GPIOになる) + TAU0EN = 0; + LED_pow_red = 0; + LED_CAM = 0; + ledInitialized = false; +} + + + + + + + +/* ======================================================== + * 割り込みそのものは使いません * + LED_Wifi 3 + ======================================================== */ +void tsk_led_wifi( ) +{ + static u8 task_interval; + static u8 state_wifi_tx; + static u8 flag_wifi_TX; + + if( task_interval-- != 0 ) + { + return; + } + + // 送信パルスのラッチ + if( WIFI_txLatch ) // 割り込みフラグそのものを使ってしまう + { + WIFI_txLatch = 0; + flag_wifi_TX = 1; + } + + if( flag_wifi_TX != 0 ) + { + vreg_ctr[ VREG_C_STATUS_1 ] |= REG_BIT_WIFI_TX; + // 送信パターン + switch ( state_wifi_tx ) + { + case ( 1 ): + case ( 3 ): + case ( 5 ): + LED_duty_WiFi = 0; + break; + default: + LED_duty_WiFi = vreg_ctr[VREG_C_LED_BRIGHT]; + } + state_wifi_tx++; + if( state_wifi_tx == 32 ) // ←点滅後、点灯している期間の長さ + { + state_wifi_tx = 0; + flag_wifi_TX -= 1; + } + task_interval = 25; + return; + } + else + { + task_interval = 30; + // 送信フラグ待ち + vreg_ctr[ VREG_C_STATUS_1 ] &= ~REG_BIT_WIFI_TX; + if( vreg_ctr[VREG_C_LED_WIFI] == WIFI_LED_OFF ) + { + LED_duty_WiFi = 0; + return; + } + else + { + if( LED_duty_WiFi == vreg_ctr[VREG_C_LED_BRIGHT] ) + { + return; + } + else if( LED_duty_WiFi < vreg_ctr[VREG_C_LED_BRIGHT] ) + { + LED_duty_WiFi += 1; + } + else + { + LED_duty_WiFi -= 1; + } + } + task_interval = 3; + return; + } +} + + + + + +bit info_led_pattern_updated; +/* ======================================================== + お知らせLED + ======================================================== */ +// グラデーション計算など +void calc_info_led_fade_out( st_LED_dim_status* tgt_led ) +{ + tgt_led -> to = 0; + tgt_led -> delta = ( 0 - tgt_led -> now ) / 64; +} + + +void calc_info_led_next_frame( st_LED_dim_status* tgt_led, u8 color ) +{ + tgt_led -> to = color * 128; + // グラデーションのデルタを計算 + tgt_led -> delta = (( tgt_led -> to - tgt_led -> now ) ) / info_LED.info_LED.fade_time; +} + + +// 本体 +void tsk_led_notify( ) +{ + static u8 time_to_next_frame; + static u8 frame; + static u8 loops; + static st_LED_dim_status LED_dim_status_info_R, LED_dim_status_info_G, LED_dim_status_info_B; + + if( info_led_override ) + { + // 電池切れが優先する + return; + } + + if( system_status.pwr_state == ON_TRIG ) + { + LED_duty_notify_blu = 0; + LED_duty_notify_red = 0; + LED_duty_notify_grn = 0; + LED_dim_status_info_R.now = 0; + LED_dim_status_info_G.now = 0; + LED_dim_status_info_B.now = 0; + } + + if( info_led_off ) // ←電源off時など強制off + { + // フェードアウトさせる + calc_info_led_fade_out( &LED_dim_status_info_R ); + calc_info_led_fade_out( &LED_dim_status_info_G ); + calc_info_led_fade_out( &LED_dim_status_info_B ); + } + else + { + // 通常運転 + if( info_led_pattern_updated ) + { + info_led_pattern_updated = false; + vreg_ctr[ VREG_C_LED_NOTIFY_FLAG ] &= ~REG_BIT_IN_LOOP; + frame = 0; // ちゃんと書こう + time_to_next_frame = 0; + } + else + { + // 次のフレームに進める? + if( time_to_next_frame == 0 ) + { + time_to_next_frame = info_LED.info_LED.term; + + if( frame >= NOTIFY_LED_TERM -1 ) + { + vreg_ctr[ VREG_C_LED_NOTIFY_FLAG ] |= REG_BIT_IN_LOOP; + if( info_LED.info_LED.last_loop != 255 ) // 255:無限ループ + { + loops++; + if( loops > info_LED.info_LED.last_loop ) + { + frame = 0; + } + } + } + else + { + frame = (( frame + 1 ) & 0x1F ); // ←ここでマスクをかけておかないと最終フレーム〜先頭間のグラデが効かない + vreg_ctr[ VREG_C_LED_NOTIFY_FLAG ] &= ~REG_BIT_IN_LOOP; + loops = 0; + } + + // グラデーション計算 + calc_info_led_next_frame( &LED_dim_status_info_R, info_LED.info_LED.red[frame] ); + calc_info_led_next_frame( &LED_dim_status_info_G, info_LED.info_LED.grn[frame] ); + calc_info_led_next_frame( &LED_dim_status_info_B, info_LED.info_LED.blu[frame] ); + + } + time_to_next_frame -= 1; + } + } + + 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/branches/sim/led.h b/branches/sim/led.h new file mode 100644 index 0000000..d745ba4 --- /dev/null +++ b/branches/sim/led.h @@ -0,0 +1,146 @@ +#ifndef __led__ +#define __led__ + + + +// ==================================== + +//#define LED_CHARGE P2.4 // PMで定義 + +// LED_DUTY +#define LED_duty_pow_blu TDR06 +#define LED_duty_WiFi TDR03 + +#define LED_duty_3d TDR01 +#define LED_duty_notify_red TDR07 +#define LED_duty_notify_grn TDR05 +#define LED_duty_notify_blu TDR02 + +// これらはduty変えられません +#define LED_pow_red P4.2 +#define LED_CAM P7.5 + + +#define NOTIFY_LED_TERM 32 + + +#define LED_BRIGHT_MAX 0x00FF + +// ==================================== +#ifdef _MCU_BSR_ // 電波送信パルス +#define WIFI_txLatch PIF21 +#else +#define WIFI_txLatch PIF7 +#endif + + + +// ==================================== +enum LED_ILUM_MODE +{ + LED_POW_ILM_AUTO = 0, + LED_POW_ILM_ON, + LED_POW_ILM_SLEEP, + LED_POW_ILM_OFF, + LED_POW_ILM_ONLY_RED, + LED_POW_ILM_ONLY_BLUE, + LED_POW_ILM_FORCE_BT_EMPTY +}; + + +enum LED_MODE_3D +{ + LED_3D_ILM_OFF = 0, + LED_3D_ILM_ON +}; + + +// VREG_C_WIFI_LED +enum WIFI_LED_MODE +{ + WIFI_LED_OFF = 0, + WIFI_LED_ON +}; + + +// VREG_C_WIFI_NOTIFY +enum NOTIFY_LED_MODE +{ + NOTIFY_LED_OFF = 0, + NOTIFY_LED_ON, + NOTIFY_LED_PTN0, + NOTIFY_LED_PTN1, + NOTIFY_LED_PTN2 +}; + + +// VREG_C_CAM_LED +enum CAM_LED_MODE +{ + CAM_LED_OFF = 0, + CAM_LED_BLINK, + CAM_LED_ON, + CAM_LED_BY_TWL, + CAM_LED_ON_PLUSE, + CAM_LED_OFF_PLUSE +}; + + + +// お知らせLED調光関係 // +typedef struct _st_info_LED +{ + u8 term; // 1フレーム何チック? + u8 fade_time; // 何チックで次のフレームの色に達するか + u8 last_loop; // 最終フレームを繰り返す? + u8 resv1; + u8 red[32]; + u8 grn[32]; + u8 blu[32]; +}st_info_LED; + +typedef union _uni_info_LED +{ + st_info_LED info_LED; + u8 bindata[ sizeof( st_info_LED ) ]; +}uni_info_LED; + +extern uni_info_LED info_LED; + + +// 赤LED 点滅向け // +typedef struct _st_led_red_batt_empty +{ + u8 dats[4]; +}st_led_red_batt_empty; + +extern st_led_red_batt_empty led_red_batt_empty; + + +/* + お知らせLED +*/ +typedef struct _st_LED_dim_status +{ + sx16 to; + sx16 delta; + sx16 now; // 小数点以下を覚えておかなくてはならないため +}st_LED_dim_status; + + + +// ==================================== +void LED_init( ); +void LED_stop( ); + + +extern void tsk_led_cam(); + + + +// ==================================== +extern bit ledInitialized; +extern bit info_led_override; + + +#endif diff --git a/branches/sim/led_cam.c b/branches/sim/led_cam.c new file mode 100644 index 0000000..a49477e --- /dev/null +++ b/branches/sim/led_cam.c @@ -0,0 +1,141 @@ +/******************************************************//** + LED_Cam TO02 +\n BLINK,*_PLUSE の時は、1周期分は必ずその状態になります。 +\n その間に OFF→BLINK などされると、OFFが無視されます。 + *********************************************************/ +#pragma sfr + +#include "incs.h" +#include "led.h" + + + +// ======================================================== +static u8 state_led_cam = 0; +static u16 task_interval; + +bit cam_led_update; + + + +// ======================================================== +static void cam_led_twl(); + + + +// ======================================================== +void tsk_led_cam( ) +{ + DI(); // レジスタへの書き込みで強制起動がかかることがあるため + if( !cam_led_update ) + { + if( task_interval != 0 ) + { + task_interval -= 1; + return; + } + } + cam_led_update = false; // TWL のブリンク設定(一発だけ点灯)のため + EI(); + + if( system_status.pwr_state == SLEEP ) // sleep中、強制消灯 + { + LED_CAM = 0; + state_led_cam = 0; + } + else + { + // ブリンクのように待たせたいとき以外は毎週起動する + // (レジスタの変更にすぐに反応する) + switch ( vreg_ctr[VREG_C_LED_CAM] ) + { + case ( CAM_LED_OFF ): + default: + LED_CAM = 0; + state_led_cam = 0; + break; + + case ( CAM_LED_ON ): + LED_CAM = 1; + state_led_cam = 0; + break; + + case ( CAM_LED_BLINK ): + if( state_led_cam == 0 ) + { + LED_CAM = 1; + state_led_cam = 1; + } + else + { + LED_CAM = 0; + state_led_cam = 0; + } + task_interval = 250; + break; + + case ( CAM_LED_ON_PLUSE ): + if( state_led_cam == 0 ) + { + LED_CAM = 1; + state_led_cam = 1; + task_interval = 250; + } + else + { + vreg_ctr[VREG_C_LED_CAM] = CAM_LED_OFF; + } + break; + + case ( CAM_LED_OFF_PLUSE ): + if( state_led_cam == 0 ) + { + LED_CAM = 0; + state_led_cam = 1; + task_interval = 250; + } + else + { + vreg_ctr[VREG_C_LED_CAM] = CAM_LED_ON; + } + break; + + case( CAM_LED_BY_TWL ): + cam_led_twl(); + } + } // if( system_status.pwr_state == sleep ) ... else ... +} + + + +void cam_led_twl() +{ + // TWL互換 // + switch ( vreg_twl[ REG_TWL_INT_ADRS_CAM ] ){ + case( TWL_CAMLED_OFF ): + LED_CAM = 0; + state_led_cam = 0; + break; + + case( TWL_CAMLED_BLINK ): + if( state_led_cam == 0 ) + { + LED_CAM = 1; + state_led_cam = 1; + } + else + { + LED_CAM = 0; + state_led_cam = 0; + } + task_interval = 600 / SYS_INTERVAL_TICK + 250; + break; + + case( TWL_CAMLED_ON ): + case( TWL_CAMLED_DEF_ON ): + default: + LED_CAM = 1; + state_led_cam = 1; + break; + } +} diff --git a/branches/sim/led_pow.c b/branches/sim/led_pow.c new file mode 100644 index 0000000..2d0bbe9 --- /dev/null +++ b/branches/sim/led_pow.c @@ -0,0 +1,265 @@ +/* ======================================================== + // 電源LED + LED_POW_B,R 6,7 + + TDR00 周期(0x03FF。TPS0で250kHzでカウントアップ。10bitなら250Hz位になる) + TDR0x Duty 0で消灯、TDR00(より大 =0x03FF以上)で点灯です。 + + enum pwr_state_{ + OFF_TRIG = 0, + ON_CHECK, + ON_TRIG, + ON, + SLEEP +}; + +enum LED_ILUM_MODE{ + LED_POW_ILM_AUTO, + LED_POW_ILM_ON, + LED_POW_ILM_SLEEP, + LED_POW_ILM_CEOFF +}; + ======================================================== */ +#pragma sfr + +#include "incs.h" +#include "led.h" + + +// ======================================================== +// スリープ中明滅のテーブル。マジか。 +const u8 LED_PTN_SLEEP[] = { + 25, 38, 52, 68, 83, 98, 110, 119, + 125, 128, 128, 125, 119, 110, 98, 83, + 68, 52, 38, 25, 16, 10, 8, 8, + 8, 8, 8, 8, 8, 8, 10, 16 + }; + + +// 赤LEDの電池残量LEDの点滅パターン +st_led_red_batt_empty led_red_batt_empty = { 0x55, 0x55, 0x55, 0x55 }; +#define LED_SLEEP_FRAME_LEN 71 +#define LED_SLEEP_DIM_LEN 71 +#define LED_SLEEP_FRAME_NUM 32 + + + +// ======================================================== +static void led_pow_normal( ); +static void led_pow_sleep( ); +static void led_pow_bt_empty(); +static u8 led_pow_batt_low(); + +#define led_fade_to( now, goal ) now = fade_to( now, goal ) +extern u8 fade_to( u8 now, u8 goal ); + +#define led_fade_to2( led, status ) led = fade_to2( status ) +extern u8 fade_to2( st_LED_dim_status* status ); + + + +// ======================================================== +// 電源LEDのスリープパターンのステータス類 +u8 time_to_next_frame_sleep = LED_SLEEP_FRAME_LEN; +u8 frame_sleep; +st_LED_dim_status LED_dim_status_sleep; + +extern bit ledInitialized; +extern bit BT_IN_CHG_delayed_n; + + + +// ======================================================== +void tsk_led_pow( ) +{ + if( ! ledInitialized ) + { + return; + // おしまい + } + + info_led_override = false; + + switch ( vreg_ctr[VREG_C_LED_POW] ) + { + case ( LED_POW_ILM_AUTO ): + default: + led_pow_normal( ); + break; + + case ( LED_POW_ILM_SLEEP ): + led_pow_sleep( ); + break; + + case ( LED_POW_ILM_ON ): + led_fade_to( LED_duty_pow_blu, vreg_ctr[VREG_C_LED_BRIGHT] ); + LED_pow_red = 0; + break; + + case ( LED_POW_ILM_OFF ): + led_fade_to( LED_duty_pow_blu, 0 ); + LED_pow_red = 0; + break; + + case ( LED_POW_ILM_ONLY_RED ): + LED_duty_pow_blu = 0; + LED_pow_red = 1; + break; + + case ( LED_POW_ILM_ONLY_BLUE ): + LED_duty_pow_blu = LED_BRIGHT_MAX; + LED_pow_red = 0; + break; + + case ( LED_POW_ILM_FORCE_BT_EMPTY ): + led_pow_bt_empty(); + break; + } + + if( system_status.pwr_state == OFF || system_status.pwr_state == ON_CHECK ) + { + LED_pow_red = 0; + info_led_override = false; + } + + if( info_led_override ) + { + LED_duty_notify_blu = 0; + LED_duty_notify_grn = 0; + LED_duty_notify_red = LED_pow_red ? 255: 0; + } +} + + + +/* ======================================================== + 電池残量で、 青→赤→赤点滅 + ======================================================== */ +static void led_pow_normal( ) +{ + time_to_next_frame_sleep = LED_SLEEP_FRAME_LEN; + frame_sleep = 0; + LED_dim_status_sleep.now = (sx16)LED_duty_pow_blu * 128; + + if( led_pow_batt_low() != 0 ) // 赤の点灯も←でやっています + { + return; + // おしまい + } + + // 青点灯 + led_fade_to( LED_duty_pow_blu, vreg_ctr[VREG_C_LED_BRIGHT] ); +} + + + +/* ======================================================== + ホタルパターン + 電池残量で赤→赤点滅にする + ======================================================== */ +static void led_pow_sleep( ) +{ + if( led_pow_batt_low() != 0 ) // 赤の点灯も←でやっています + { + time_to_next_frame_sleep = LED_SLEEP_FRAME_LEN; + frame_sleep = 0; + LED_dim_status_sleep.now = (sx16)LED_duty_pow_blu * 128; + return; + // おしまい + } + + LED_dim_status_sleep.to = LED_PTN_SLEEP[frame_sleep] * 128; + + // グラデーションのデルタを計算 + LED_dim_status_sleep.delta = (( LED_dim_status_sleep.to - LED_dim_status_sleep.now ) ) / LED_SLEEP_DIM_LEN; + led_fade_to2( LED_duty_pow_blu, &LED_dim_status_sleep ); + + // 次のフレームに進める? + time_to_next_frame_sleep -= 1; + if( time_to_next_frame_sleep == 0 ) + { + time_to_next_frame_sleep = LED_SLEEP_FRAME_LEN; + + frame_sleep += 1; + if( frame_sleep >= LED_SLEEP_FRAME_NUM -1 ) + { + frame_sleep = 0; + } + } +} + + + +/* ======================================================== + 電池が少ないときの共通 + 返値: 0 電池が少なくなかった +     1    少なかったので共通パターンにした + ======================================================== */ +static u8 led_pow_batt_low() +{ + if( vreg_ctr[VREG_C_BT_REMAIN] > BATT_TH_LO ) + { + LED_pow_red = 0; + return 0; + // おしまい + } + + if(( vreg_ctr[VREG_C_BT_REMAIN] > BATT_TH_EMPTY ) || !BT_IN_CHG_delayed_n ) + // 電池残量が5%(〜10%) または、それ未満でも充電中 + { + // 赤点灯 + led_fade_to( LED_duty_pow_blu, 0 ); + { + LED_pow_red = 1; + } + + } + else // 電池が5%未満 かつ アダプタなし + { + led_pow_bt_empty(); + } + return 1; +} + + + + +/* ======================================================== + 電池がないパターン +  指定パターンを流す +  お知らせを上書きしたりする + ======================================================== */ +static void led_pow_bt_empty() +{ + static u8 delay; + static u8 red_blink_poi; + + info_led_override = true; + + // 赤点滅 + led_fade_to( LED_duty_pow_blu, 0 ); + + // 赤の点滅パターンも指定できる + delay += 1; + if( delay < 64 ) // フレームの保持時間稼ぎ + { + return; + } + delay = 0; + + if( led_red_batt_empty.dats[ red_blink_poi / 8 ] & ( 1 << ( red_blink_poi % 8 )) ) + { + LED_pow_red = 1; + } + else + { + LED_pow_red = 0; + } + red_blink_poi += 1; + if( red_blink_poi >= 32 ) + { + red_blink_poi = 0; + } +} + + diff --git a/branches/sim/loader.c b/branches/sim/loader.c new file mode 100644 index 0000000..f7361a6 --- /dev/null +++ b/branches/sim/loader.c @@ -0,0 +1,372 @@ +/* ======================================================== + MCU CTR BSR + 2009/03/30 + 開発技術部 藤田 + + ブートローダー部 + ホストの通信と、自己書き換え、ファームのチェックを行う。 + + ======================================================== */ +#pragma SFR +#pragma di +#pragma ei +#pragma nop +#pragma stop +#pragma halt +#pragma opc + + +#include "incs_loader.h" + +#include +#include "fsl_user.h" + +#include "i2c_ctr.h" +#include "i2c_mcu.h" +#include "pm.h" +#include "rtc.h" + +#include "reboot.h" + +#include "magic.h" + + + +#define REG_BIT_RESF_WDT 0x10 +#define REG_BIT_RESF_TRAP 0x80 +#define REG_BIT_RESF_LVI 0x01 + + + +// ======================================================== +#if (FSL_DATA_BUFFER_SIZE>0) +fsl_u08 fsl_data_buffer[FSL_DATA_BUFFER_SIZE]; +#endif + + + +#ifdef FSL_INT_BACKUP +static fsl_u08 fsl_MK0L_bak_u08; /* if (interrupt backup required) */ +static fsl_u08 fsl_MK0H_bak_u08; /* { */ +static fsl_u08 fsl_MK1L_bak_u08; /* reserve space for backup information */ +static fsl_u08 fsl_MK1H_bak_u08; /* of interrupt mask flags */ +static fsl_u08 fsl_MK2L_bak_u08; /* */ +static fsl_u08 fsl_MK2H_bak_u08; /* } */ +#endif + + + +// ======================================================== +void FSL_Open( void ); +void FSL_Close( void ); +void hdwinit( void ); +static void hdwinit2( ); +static void chk_platform_type(); +static void chk_firm_broke(); + + +extern void main_loop( ); + + + +// ======================================================== +void main( ) +{ + while( 1 ) + { + WDT_Restart( ); + + if( RTCEN ) // これはTRAP(自己update)にしか使えない。WDT等では立たない + { + system_status.reboot = true; + } + + { + volatile u8 my_resf = RESF; // ←読むと消える + if( ( my_resf & REG_BIT_RESF_WDT ) != 0 ) + { + vreg_ctr[ VREG_C_MCU_STATUS ] |= REG_BIT_STATUS_WDT_RESET; + // set_irq( VREG_C_IRQ0, REG_BIT_IRQ_WDT_RESET ); + // ↑I2Cの初期化後に行う + system_status.reboot = true; + } + else if( ( my_resf & REG_BIT_RESF_TRAP ) != 0 ) // ( FSL_ForceReset, 'r' ) + { + system_status.reboot = true; + } +/* + else if(( my_resf & REG_BIT_RESF_LVI ) != 0 ) + { + vreg_ctr[ VREG_C_MCU_STATUS ] |= ( 1 << 2 ); + } +*/ + } + + if( !system_status.reboot ) + { + // 通常の電源投入 + // 電池接続時、ちょっと待ってみる(チャタリング対策) + u16 pwup_delay0; + for( pwup_delay0 = 0xFFFF; pwup_delay0 != 0; pwup_delay0-- ){;}; + } + + hdwinit2( ); + + // ファームの整合性チェック // + chk_firm_broke(); + + // 試遊台判定 + chk_platform_type(); + + // 通常運転 + main_loop( ); + } +} + + + +void chk_firm_broke() +{ + u8 i; + u8 comp = 0; + + // ローダーと本体は同じバージョンか? + /// 次へのアップデートの途中で終わってないか? + for( i = 0; i < sizeof( __TIME__ ); i++ ) // sizeof( __TIME__ ) = 8 らし + { + comp += ( *( __far u8 * )( MGC_LOAD + i ) == *( u8 * )( MGC_FOOT + i ) ) ? 0 : 1; + comp += ( *( u8 * )( MGC_HEAD + i ) == *( u8 * )( MGC_FOOT + i ) ) ? 0 : 1; + } + + if( *( u8 * )( MGC_FOOT +2 ) != ':' ) // 消去済のまま + { + comp += 1; + } + + if( comp != 0 ) + { + // ファームリストアを試みる + firm_restore( ); + // 帰ってこない。リセットをかける。 + } +} + + +/* ======================================================== + デバッガつないでると上手に判定できないことがあります。 +●CTRファミリ + DEV_DET(P12.[2:1]) + +●CTR&その開発機材 + P40,41 !注意! デバッグ有効でP40がLだとMCUが起動しません! + HH 実機 + HL NBD試遊台 + LH スタンドアロン試遊台 + LL ISデバッガ +======================================================== */ +void chk_platform_type() +{ + // ●CTRファミリ // + system_status.family = (enum _family)( DEV_DET >> 1 ); /// あぁ... + + // ●CTR&その開発機材 // + // 一応初期化 + system_status.is_dev = false; + system_status.taikendai = false; + system_status.taikendai_nbd = false; + + switch( DIPSW ) + { + case DIPSW_TAIKENDAI: + system_status.taikendai = true; + break; + + case DIPSW_TAIKENDAI_NBD: + system_status.taikendai_nbd = true; + break; + + case DIPSW_ISDEV: + system_status.is_dev = true; + break; + } +#ifdef _FORCE_TAIKENDAI_ + system_status.taikendai = true; +#endif + +#ifdef _FORCE_TAIKENDAI_NBD_ + system_status.taikendai_nbd = true; +#endif +} + + + + +// ======================================================== +void hdwinit( void ) +{ // スタートアップルーチンが勝手に呼びます + DI( ); /* マスタ割り込み禁止 */ + + CMC = 0b00010000; /* X1発振せず(入力ポート)、XT1使用、超低電力発振は不安定に付き通常で */ + CSC = 0b10000000; /* X1発振なし、XT1発振あり、高速内蔵発振動作 */ + OSMC = 0x01; /* 隠しレジスタ */ + CKC = 0b00001000; /* CPU/周辺クロック=fMAIN、fMAIN=fMX、fCLK=fMX */ + + /*--- 低電圧検出回路の設定 ---*/ + /* リセット解除時のデフォルトは、オプション・バイトにて指定される */ + LVIS = 0b00000000; /* VLVI = 4.22±0.1V */ + LVIM = 0b00000000; /* LVI動作禁止 */ + /* 電源電圧(VDD)<検出電圧(VLVI)時に割込発生 */ + /* 電源電圧(VDD)≧検出電圧 tempA[0][1], "offset" => tempA[0][2], "type" => tempA[0][3], "data" => tempA[0][4], "CRC" => tempA[0][5] } + + break if src_in["type"].hex == 01 + break if src_in["len"].hex == 00 + # next if src_in["type"].hex != 00 + if( src_in["type"].hex != 00 ) +# p dat + next + end + + offset = src_in["offset"].hex + next if(( 0x1000 <= offset ) && ( offset < 0x2000 )) + + dataTemp = src_in["data"].scan(/\w\w/) + + ( 0...(src_in["len"].to_s.hex) ).each{|i| + bindata[ offset + i ] = ( dataTemp[ i ] ).to_s.hex + } +end + +### debug enable bit check ############# +# デバッグ許可になっているとISデバッガで起動しない(MCUが動作しない) +p bindata[0xC3] +if( bindata[0xC3] != 0x04 ) + print( "!E debug enable!!" ) + exit( 1 ) +end + + +### format data and output ############# +4096.times{ + bindata.delete_at(4096) +} +dest.write( bindata[0..(0x4FFF - 0x1000)].pack("c*") ) +dest.close + +printf( "intel-HEX to bsr bin converter\n file converted!\n\n" ) diff --git a/branches/sim/pedo_alg_thre_det2.c b/branches/sim/pedo_alg_thre_det2.c new file mode 100644 index 0000000..a17faf2 --- /dev/null +++ b/branches/sim/pedo_alg_thre_det2.c @@ -0,0 +1,542 @@ +/* ******************************************************** + 歩数計 + 3軸加速度のリアルタイムデータから、ベクトルのノルムを出し、 + 閾値を超える時間、間隔、ノルムの大きさで閾値を切り替えるなど +********************************************************* */ +#pragma mul +#pragma div +#pragma bcd + +#include "incs.h" + +#ifndef _WIN32 +#include +#endif + +#include "accero.h" +#include "pedometer.h" + +#include "pedo_lpf_coeff.h" +#include "pool.h" + +// ======================================================== +// 履歴の最終記録時刻 +// この順番はログ読み出しの順番でもあるのでいじらないでね +// 順番にアドレスの若いのから確保されるのを期待してます... +typedef struct{ + u8 hour_bcd; + u8 day_bcd; + u8 month_bcd; + u8 year_bcd; + u8 min_bcd; + u8 sec_bcd; +}st_calender; + + + +// ======================================================== +static void hosu_increment_if_necessary(); +static u16 get_long_hour(); +static u16 calc_hours_spend( u8 ); + + + +// ======================================================== +bit pedolog_overflow; // 192時間記録済みフラグ(i2cで読める) +extern uni_pool pool; // 歩数ログはこの構造体の中 +static u8 p_record; // ログの書き込み位置 +static st_calender cal_log_latest; // 最後に歩数を更新した時刻 +static u16 last_hour_fny; // fny:from new year +static st_calender cal_temp; +static u16 now_longhour; + + + + + + +// ======================================================== +#define _use_my_sqrt_ +#ifdef _use_my_sqrt_ +unsigned long my_sqrt(); +#endif + +// 今年は閏年? +#define is_leapyear( y ) (( y & 0x03 ) == 0 ) +// 「去年」は閏年? +#define is_firstyear( y ) (( y & 0x03 ) == 1 ) + + + +/*========================================================= + 歩数計 + ========================================================*/ +void pedometer() +{ + static s16 th_H = 15000; // 閾値。動的変更します + static s16 th_L = 11000; + static u16 acc_norm[3]; // 加速度の大きさのヒストリ。数字が大きい方が古い + static u16 acc_norm_temp; + static u8 interval_hh = 0xFF; // 山-山間の時間。短過ぎたらはじく。 + static u8 time_l; // 前回の極小からの経過時間 + static u16 peak_l; // 谷の深さ + static u16 norm_hist[TAP]; + + static u8 hist_indx; + + signed long filterd; + + u8 i; + + u16 sx16 = abs( (u16)vreg_ctr[VREG_C_ACC_XH] * 256 + vreg_ctr[VREG_C_ACC_XL] ); + u16 sy16 = abs( (u16)vreg_ctr[VREG_C_ACC_YH] * 256 + vreg_ctr[VREG_C_ACC_YL] ); + u16 sz16 = abs( (u16)vreg_ctr[VREG_C_ACC_ZH] * 256 + vreg_ctr[VREG_C_ACC_ZL] ); + + // ベクトルのノルム +#ifdef _mcu_ +# ifndef _use_my_sqrt_ + norm_hist[ hist_indx & TAP-1 ] = sqrt( (long)sx16 * ( sx16 / 2 ) + + (long)sy16 * ( sy16 / 2 ) + + (long)sz16 * ( sz16 / 2 ) + ); +# else + norm_hist[ hist_indx & TAP-1 ] = my_sqrt( (long)sx16 * ( sx16 / 2 ) + + (long)sy16 * ( sy16 / 2 ) + + (long)sz16 * ( sz16 / 2 ) + ); +# endif +#endif + +#ifdef _pc_ + norm_hist[ hist_indx & TAP-1 ] = normh * 256 + norml; +#endif + + hist_indx += 1; + + // ヒストリにフィルタ(fir)を掛けて、今回の値を求める // + filterd = 0; +// for( i = 8; i != 55; i++ ) // 係数が0ばかりのため + for( i = 0; i != 46; i++ ) // 係数テーブルをいじりました。パラメータ調整時注意 + { + filterd += (signed long)norm_hist[ ( hist_indx + i ) & TAP-1 ] * lpf_coeff[ i ]; + } + + filterd += (4096)*512; // DC分加算...だったと思う + acc_norm_temp = (s16)( filterd /1024 & 0xFFFF ); // ←FIL_COEFF_QUANTから正規化 +/* + if( acc_norm[0] < acc_norm_temp ) + { + t_rise += 1; + if( t_rise == 0 ) + t_rise == 254; + } + else + { + t_rise = 0; + } +*/ + if( acc_norm[0] != acc_norm_temp ) + { + acc_norm[2] = acc_norm[1]; // ヒストリ + acc_norm[1] = acc_norm[0]; + acc_norm[0] = acc_norm_temp; + } + + if( acc_norm[2] <= acc_norm[1] && acc_norm[1] > acc_norm[0] + && acc_norm[0] > th_H ) + // 極大で、閾値を超えていた + { + if( 21 < interval_hh ) + // 前回の極大からの間隔がほどよい + { + if(( interval_hh < 160 ) && ( time_l < interval_hh )) + // 谷を挟んでいる + { + if( acc_norm[0] - peak_l > 4200 ){ + // ■一歩増えました + hosu_increment_if_necessary(); + } + } + interval_hh = 0; + } + // なんちゃって閾値の動的変更 + if( acc_norm[0] > 18000 ) + { + th_L = acc_norm[0] - 10000; + } + else + { + th_L = 11000; + } + } + else + { + interval_hh += ( interval_hh != 255 ) ? 1: 0; // 飽和加算って楽に書けたらいいのに + } + + // (2) 直近の極小からの時間 + if( acc_norm[2] >= acc_norm[1] && acc_norm[1] < acc_norm[0] + && acc_norm[0] < th_L ) + { + // 極小を検出 + time_l = 0; + peak_l = acc_norm[0]; + } + else + { + time_l += ( time_l != 255 ) ? 1: 0; + } +} + + + +/*========================================================= + 歩数+1 +  累積をインクリメント +  履歴を更新 + *2011/01/20 + 仕様変更 ログがいっぱいになったらそこで止める + ========================================================*/ + + +#define HOSU_NODATA 0xFFFF +#define HOSU_MAX 0xFFFE + +static void hosu_increment_if_necessary() +{ + u8 year_compd; // hour境界補正済み現在年。comp(ensation -ed) + + // 現在時刻取得 + DI(); + RWAIT = 1; + while( !RWST ){;} + + cal_temp.hour_bcd = HOUR; + cal_temp.day_bcd = DAY; + cal_temp.month_bcd = MONTH; + cal_temp.year_bcd = YEAR; + cal_temp.min_bcd = MIN; + cal_temp.sec_bcd = SEC; + + RWAIT = 0; + EI(); + + year_compd = bcdtob( cal_temp.year_bcd ); + + now_longhour = get_long_hour(); + + // 書き込みポインタの更新 + if( ! ( vreg_ctr[ VREG_C_ACC_HOSU_L ] == 0 && // 歩数計on後、最初の一歩までは前回からの経過時間を計算しない + vreg_ctr[ VREG_C_ACC_HOSU_M ] == 0 && + vreg_ctr[ VREG_C_ACC_HOSU_H ] == 0 )) //. 全ビットORでゼロ判定するのはデジタル回路屋の方言みたい + { + // 歩数計が止まっていた時間を考慮して必要なら進める + // 補正計算 元旦零時台で昨日扱いになった場合、大晦日の23時台に上書き + if( now_longhour == (u16)-1 ) // マジックナンバーとかではなくて実際に計算結果が-1 + { + now_longhour = ( ( 365 + ( is_firstyear(year_compd) ? 1: 0 )) * 24 ) -1; + year_compd -= 1; + } + fill_hosu_hist_hours( calc_hours_spend( year_compd ) ); // ■書き込みポインタの更新も行う + + // ログあふれで記録停止? + if( pedolog_overflow ) + { + return; + // おしまい。ログの更新もなし。 + } + } + + // インクリメントして良い + cal_log_latest = cal_temp; // ■ログ時刻更新 + last_hour_fny = now_longhour; + + // 毎時ログ インクリメント + if( pool.vreg_c_ext.pedo_log[ p_record ] == HOSU_MAX ) + { + // 何もしないでおしまい + //. 小計の合計と累計があわなくなるのを避けるためだろうけど、どうなの? + return; + } + else if( pool.vreg_c_ext.pedo_log[ p_record ] == HOSU_NODATA ) // その時間帯最初のカウントの時 + { // これしないと1歩足りない + pool.vreg_c_ext.pedo_log[ p_record ] = 1; + } + else + { + // 通常パス + pool.vreg_c_ext.pedo_log[ p_record ] += 1; + } + + // 累積の更新 // + if( ++vreg_ctr[ VREG_C_ACC_HOSU_L ] == 0 ) // カンストチェック + { + if( ++vreg_ctr[ VREG_C_ACC_HOSU_M ] == 0 ) + { + if( ++vreg_ctr[ VREG_C_ACC_HOSU_H ] == 0 ){ + vreg_ctr[ VREG_C_ACC_HOSU_L ] = 255; //. いろいろ失敗だったね... + vreg_ctr[ VREG_C_ACC_HOSU_M ] = 255; + vreg_ctr[ VREG_C_ACC_HOSU_H ] = 255; + } + } + } +} + + + +/* ======================================================== +空白の時間を適切に0にして、 +今を含む1時間のデータを書く位置にポインタ?を進める +======================================================== */ +static void fill_hosu_hist_hours( u16 hours ) +{ + // ログあふれ? + if( (u16)p_record + hours >= PEDOMETER_LOG_SIZE ) + { + pedolog_overflow = true; + return; + } + + // 空白の数時間の設定 + while( hours != 0 ) + { + // 新仕様 いっぱいで停止 + p_record += 1; +#if 1 // debug + if( p_record >= PEDOMETER_LOG_SIZE ) + { + pedolog_overflow = true; +// NOP(); // ここに来るようだとバグ + break; + } + else +#endif + { + pool.vreg_c_ext.pedo_log[ p_record ] = 0; + } + hours -= 1; + } + + return; +} + + + +/* ======================================================== +空白の時間を適切に0にして、 +今を含む1時間のデータを書く位置にポインタ?を進める +======================================================== */ +void clear_hosu_hist() +{ + u8 hours = PEDOMETER_LOG_SIZE; + do + { + hours -= 1; + pool.vreg_c_ext.pedo_log[ hours ] = 0xFFFF; + } + while( hours != 0 ); + vreg_ctr[ VREG_C_ACC_HOSU_L ] = 0; + vreg_ctr[ VREG_C_ACC_HOSU_M ] = 0; + vreg_ctr[ VREG_C_ACC_HOSU_H ] = 0; + p_record = 0; + pedolog_overflow = false; +} + + +extern u8 iic_burst_state; +bit pedolog_read_msb; +/* ======================================================== + 歩数計ヒストリ読み出しの後処理(初期化) + 読み出しポインタのクリア +======================================================== */ +/* マクロにしました +void hosu_read_end( ) +{ + pedolog_read_msb = 0; +} +*/ + + + +/* ======================================================== + 歩数計のヒストリを返す。 + 1回呼ぶ度に、ヒストリの下位、上位、一時間遡って下位上位... +======================================================== */ +u8 hosu_read( ) +{ + u8 rv; + static u8 p_record_buffer; + static st_calender cal_buff; // 一応、アトミック処理に + + if( iic_burst_state == 0 ) + { + p_record_buffer = p_record; + DI(); + cal_buff = cal_log_latest; + EI(); + } + + if( iic_burst_state <= 5 ) + { + rv = *( (u8*)&cal_buff + iic_burst_state ); // あうあう + iic_burst_state += 1; + return( rv ); + } + else + { + u16 temp; + // 16ビットで記録してあるのでばらして送る todo: もっと楽する方法があるんじゃ + temp = pool.vreg_c_ext.pedo_log[ p_record_buffer ]; + if( !pedolog_read_msb ) + { + rv = (u8)( temp & 0x00FF ); + } + else + { + rv = (u8)(( temp >> 8 ) & 0x00FF ); + if( p_record_buffer == 0 ) + { + p_record_buffer = PEDOMETER_LOG_SIZE-1; + } + else + { + p_record_buffer -= 1; + } + } + pedolog_read_msb ^= 1; + return( rv ); + } + +} + + + +/* ======================================================== + 今年の元旦からの経過時間(hour)を返す。 + 引数 無し + 返値 u16 long_hour +======================================================== */ +const u16 DAYS_FROM_HNY[] = { + 0, + 31, + 31+28, // =59。 …3月0日は1月59日 + 31+28+31, + 31+28+31+30, + 31+28+31+30+31, + 31+28+31+30+31+30, + 31+28+31+30+31+30+31, + 31+28+31+30+31+30+31+31, + 31+28+31+30+31+30+31+31+30, + 31+28+31+30+31+30+31+31+30+31, + 31+28+31+30+31+30+31+31+30+31+30 + }; + +static u16 get_long_hour() +{ + u8 year = bcdtob( cal_temp.year_bcd ); + u8 month = bcdtob( cal_temp.month_bcd ); + u8 day = bcdtob( cal_temp.day_bcd ); + u8 hour = bcdtob( cal_temp.hour_bcd ); + u8 min_bcd = cal_temp.min_bcd; // 大小比較しかしないのでbcdのままでよい + u8 sec_bcd = cal_temp.sec_bcd; + u16 long_hour; + + // まず日数の部分 + long_hour = DAYS_FROM_HNY[ month -1 ]; // -1はインデックス合わせ + if( is_leapyear(year) && ( 3 <= month )) + { + // 閏年で、閏日より後 + long_hour += 1; + } + long_hour += day - 1; + long_hour *= 24; // 日数→時間 + + long_hour += hour; + + // 時・分境界の前?後? + if( ( min_bcd > vreg_ctr[ VREG_C_ACC_HOSU_HOUR_BOUNDARY ] ) + || ( ( min_bcd >= vreg_ctr[ VREG_C_ACC_HOSU_HOUR_BOUNDARY ] ) + && ( sec_bcd >= vreg_ctr[ VREG_C_ACC_HOSU_HOUR_BOUNDARY_SEC ] )) + ) + { + return( long_hour ); + } + else + { + return( long_hour -1 ); // 1時間前に含める 注意:元旦で昨年扱いにするとき。-1 になる + } +} + + + +/* ======================================================== + 軽量平方根。 + 必要十分な精度で打ち切る +======================================================== */ +static unsigned long my_sqrt(unsigned long x) +{ + unsigned long s, t; + + if (x <= 0) return 0; + + s = 1; + t = x; + while (s < t) + { + s <<= 1; + t >>= 1; + } + do + { + t = s; + s = (x / s + s) >> 1; + } while (s < t); + + return t; +} + + + + +/* ======================================================== + 二つの 前回呼ばれた時刻と、現在時刻の差分を求める。返るのはfill_hosu_hist_hours にそのまま渡せる + //. 引数がyear_bcd なのがちょっといやだけど... +======================================================== */ +static u16 calc_hours_spend( u8 year ) +{ + u8 cal_log_latest_year = bcdtob( cal_log_latest.year_bcd ); + + // 同じ年の内 + if( cal_log_latest_year == year ) + { + if( now_longhour > last_hour_fny ) + { + return( now_longhour - last_hour_fny ); + } + else if( now_longhour == 0 && last_hour_fny != 0 ) + { + // 年明けたばかりで、境界を越えた一回目。これやらないと昨年最後に加算してしまう。 + return( 1 ); + } + else + { + return( 0 ); // 同じ時間帯(と、巻き戻り。 どうなっても知らない) + } + } + else if( cal_log_latest_year == ( year -1 ) ) + { + // 年をまたいでいるとき + return( ( ( 365 + ( is_firstyear(year) ? 1: 0 )) * 24 ) - last_hour_fny + now_longhour ); + } + else if( cal_log_latest_year < year ) + { + // 数年放置 + return( PEDOMETER_LOG_SIZE +1 ); + } + else + { + // カレンダーが巻き戻るなど + // ノーケアでよい…が、不定値というわけにもいかない + return( 0 ); + } +} diff --git a/branches/sim/pedo_lpf_coeff.h b/branches/sim/pedo_lpf_coeff.h new file mode 100644 index 0000000..f81d6c2 --- /dev/null +++ b/branches/sim/pedo_lpf_coeff.h @@ -0,0 +1,84 @@ +#ifndef _pedo_coeff_h_ +#define _pedo_coeff_h_ + +// ========================================================= +#define TAP 64 +#define FIL_COEFF_QUANT 10 +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 +*/ +}; +#endif diff --git a/branches/sim/pedometer.h b/branches/sim/pedometer.h new file mode 100644 index 0000000..56252a0 --- /dev/null +++ b/branches/sim/pedometer.h @@ -0,0 +1,29 @@ +#ifndef _pedo_ +#define _pedo_ + + + + +// ========================================================= +extern bit pedolog_read_msb; + + + +// ========================================================= +//void hosu_read_end( ); マクロ化 +#define hosu_read_end() pedolog_read_msb = 0 + +u8 hosu_read( ); +void fill_hosu_hist_hours( u16 ); +void clear_hosu_hist(); +void pedometer(); + + + +// ========================================================= +#define PEDOMETER_LOG_SIZE ( 24 * 7 ) + + + +// ========================================================= +#endif diff --git a/branches/sim/pm.c b/branches/sim/pm.c new file mode 100644 index 0000000..8fb1bec --- /dev/null +++ b/branches/sim/pm.c @@ -0,0 +1,1317 @@ +/* ======================================================== + 対PMIC + 藤田@開技 + nintendo + '08 Dec + ======================================================== */ +#pragma nop + +#include "incs.h" +#include "adc.h" +#include "led.h" +#include "pm.h" +#include "renge\renge.h" + +#include "batt_params.h" + +#include +#include "fsl_user.h" + + + +// ======================================================== +u8 raw_adc_temperature; +BT_VENDER battery_manufacturer = BT_VENDER_NOT_CHECKED; +static u8 ntr_pm_reg_shadow; // NTR PMIC レジスタミラー +bit bt_authorized; // バッテリパラメータ送信済。充電開始許可 +u8 chg_led_override; // アダプタ差したとき、充電するしないに関わらずしばらく点灯させる + +static u16 bt_volt16; + +static bit ntr_pm_bt_low_old; +bit BT_CHG_STAT_Change; +bit BT_IN_CHG_delayed_n; + +bit temp_zone_charge_disable; // 温度で充電停止する時にヒステリシスを付けるため + +u8 pmic_version; +u8 mgic_version[2]; + +static bt_param_* p_bt_param; + +static err send_cmd_mgic_2B( u8 reg, u16 dat ); +static err read_mgic_2B( u8 reg, u8* dat ); + + +// ======================================================== +static void BT_model_detect(); +static void BT_mgic_quick_start(); +static void BT_mgic_init(); +static void bt_chk_temparature(); +static void bt_get_charge_status(); +static void bt_param_select(); +static void bt_batt_update_twl(); +static void bt_batt_update_ntr(); + + + +// ======================================================== +#define swap_endian_16( x ) (unsigned int)(( x << 8 ) | ( x >> 8 )) + + + +// ======================================================== +const u8 BT_MANUF_BORDER[] = { + 5, 33, 79, 123, 158, 197, 233 + }; + + +/* ======================================================== + 電池の管理 + + 以下のピンは主にここで操作・監視されます。 + ・PM_BT_AUTH 現状、GPI in + ・PM_CHARGE_n CCIC /CHG in + ・PM_CHARGE_ERR_n /FLT in + ・PM_EXTDC_n /DOK INTP4 in + ・PM_CHARGE_EN_n /CEN out + + 以下の物は関係ありそうですが別のところで主に監視されています。 + ・LED_Pow R, B, Charge tsk_LED + ・BT_TEMP,_P tsk_ADC + + PM_EXTDCは割り込みメインにするかも + ======================================================== */ +#define INTERVAL_TSK_BATT 60 +// ↑100だと充電エラー時にうまく点滅しないので + +void tsk_batt( ) +{ + static u8 task_interval = 0; + + if( system_status.pwr_state != OFF_TRIG ) + { + if( task_interval-- != 0 ) + { + return; + } + else + { + task_interval = (u8)( INTERVAL_TSK_BATT / SYS_INTERVAL_TICK ); + } + } + + // アダプタステータス更新 // + pm_chk_adapter(); + + // 充電 // + bt_chk_temparature(); // 温度チェック + if( !temp_zone_charge_disable && bt_authorized && !PM_EXTDC_n ) + { + BT_CHG_ENABLE(); // 温度範囲OKで充電再開 + } + else + { + BT_CHG_DISABLE(); // 温度危険! 充電停止 + } + + bt_get_charge_status(); // CCIC制御 + + LED_CHARGE = ( ! BT_IN_CHG_delayed_n )? 1: 0; // LEDに反映 + + // アダプタつないだ瞬間、満充電でも数秒わざと点灯させる。給電してることをわからせるため。 + if( chg_led_override != 0 ){ // ↑から見ればわかるが、瞬間(数クロック)消える事がある。気がつく人いるかな…? + chg_led_override -= 1; + LED_CHARGE = 1; + } + + // レジスタの充電中ビットはLEDに同期する + set_bit( LED_CHARGE, vreg_ctr[VREG_C_STATUS], REG_BIT_BATT_CHARGE ); // set_bitのみ。 + + // 割り込み + // tsk_miscが引き受ける + + // 電池残量 // + if( system_status.pwr_state != ON_CHECK ) + { + BT_get_left(); + } +} + + +#define RAW_TEMP_LH 75 +#define RAW_TEMP_LL 61 +#define RAW_TEMP_HL 184 +#define RAW_TEMP_HH 189 +#define AVG_COUNT 40 + +/* ******************************************************* + 温度チェック + 温度付きヒステリシス + ******************************************************* */ +void bt_chk_temparature() +{ + static u8 heikinka_h,heikinka_l; + + if(( RAW_TEMP_LH <= raw_adc_temperature ) + && ( raw_adc_temperature <= RAW_TEMP_HL )) + { + if( heikinka_h < AVG_COUNT ) + { + heikinka_h++; + } + else + { + temp_zone_charge_disable = false; // 充電許可 + } + } + else if(( raw_adc_temperature <= RAW_TEMP_LL ) + || ( RAW_TEMP_HH <= raw_adc_temperature )) + { + if( heikinka_l < AVG_COUNT ) + { + heikinka_l++; + } + else + { + temp_zone_charge_disable = true; // 充電禁止 + } + } + else + { + // temp_zone_charge_disable そのまま + heikinka_h = 0; + heikinka_l = 0; + } +} + + + +void bt_get_charge_status() +{ + // CCICの不具合回避のため、/CHGのネゲートをちょっと丁寧に遅延させる + static u8 anti_chatter; + + if( !BT_IN_CHG_n ) + { + // さらにチャタリング除去 + if( anti_chatter < 2 ) // 電池無しでアダプタさして、電極をさわさわ + { // すると充電LEDががさがさするので + anti_chatter++; + } + else + { + BT_IN_CHG_delayed_n = 0; // 充電中 + } + } + else + { + // "丁寧に遅延" todo:もっといい方法? + if( !BT_CHG_Ena_n && vreg_ctr[ VREG_C_BT_REMAIN ] < 60 ) + { + BT_IN_CHG_delayed_n = 0; // 充電中と扱う。充電が終わっているはずがない + } + else + { + BT_IN_CHG_delayed_n = 1; + anti_chatter = 0; + } + } +} + + + +/******************************************************** +アダプタの有無チェック + 電源off中のアダプタ抜き差しで外から呼ばれるため分離 + ***********************************************************/ +void pm_chk_adapter() +{ + static u8 pm_extdc_old; + u8 temp_pm_extdc; + + temp_pm_extdc = (u8)!PM_EXTDC_n; // volatileのため + if( pm_extdc_old != temp_pm_extdc ) + { + pm_extdc_old = temp_pm_extdc; + if( temp_pm_extdc ) + { + // 刺さった + set_bit( 1, vreg_ctr[VREG_C_STATUS], REG_BIT_POW_SUPPLY ); + set_irq( VREG_C_IRQ1, REG_BIT_BT_DC_CONNECT ); + chg_led_override = (u8)( 3000 / INTERVAL_TSK_BATT ); + } + else + { + u8 temp_v[2]; + + // 抜けた + set_bit( 0, vreg_ctr[VREG_C_STATUS], REG_BIT_POW_SUPPLY ); + set_irq( VREG_C_IRQ1, REG_BIT_BT_DC_DISC ); + chg_led_override = 0; + + // 電池残量が1%台で、アダプタ有りの時には本体が起動し、ゲームが動くが + // 1%台に回復する前にアダプタが抜けたとき、割り込みを入れないと期待通りの + // 動作でない。特別対応のためここで + if( read_mgic_2B( BT_GAUGE_REG_VCELL, temp_v ) == ERR_SUCCESS ) + { + bt_volt16 = ( temp_v[0] * 256 + temp_v[1] ); + } + + if(( bt_volt16 < V_TH_ZERO ) || ( vreg_ctr[ VREG_C_BT_REMAIN ] == 0 )) + { + set_irq( VREG_C_IRQ1, REG_BIT_BT_REMAIN ); + } + } + } +} + + + +/******************************************************** +電池関係の初期化 + +   ゲージ  | 有り     | 無し +  ーーーーーーーーーーーーーーーーーーーーーーー +   電池 有り| 実機     | ? +  ーーーーーーーーーーーーーーーーーーーーーーー +      無し| 白箱     | TS +        | 実機電池無し | +  ーーーーーーーーーーーーーーーーーーーーーーー + +  ゲージ有り、電池無し の白箱/実機判別は、 + 電池温度で判定する + + 返値: 電池無し 0xFF + 電池変わってない 0 + 電池変わった 1 + +***********************************************************/ +bit bt_force_update; + +void BT_chk() +{ + BT_VENDER battery_manufacturer_old; + + battery_manufacturer_old = battery_manufacturer; + + BT_model_detect(); + if( system_status.model != MODEL_JIKKI ) + { + bt_authorized = false; + return; + // おしまい + } + + bt_param_select(); // バッテリ残量補正パラメータなどセット + + if(( battery_manufacturer_old != battery_manufacturer ) || + bt_force_update ) + { + bt_force_update = false; + iic_mcu_start( ); // 中で初期化フラグをもってるので呼びまくって良い こんなところに…orz + if( (( battery_manufacturer_old == BT_VENDER_OPEN ) || + ( battery_manufacturer_old == BT_VENDER_NOT_CHECKED )) && + !system_status.reboot ) + { + BT_mgic_quick_start(); + } + BT_mgic_init(); // 機種判定も行います + } + bt_authorized = true; + renge_task_immed_add( tski_BT_temp_update ); // 電池温度監視スタート +} + + + + +void BT_model_detect() +{ + u8 temp; + + BT_DET_P = 1; + BT_TEMP_P = 1; + wait_ms( 5 ); // 電圧が上がるのに時間が掛かる + + raw_adc_temperature = get_adc( ADC_SEL_BATT_TEMP ); + temp = get_adc( ADC_SEL_BATT_DET ); + BT_DET_P = 0; + + system_status.captureBox = 0; + // プラットフォーム判定 // + if( raw_adc_temperature > 0xF0 ) + { + // TS // + system_status.model = MODEL_TS_BOARD; + } + else if( raw_adc_temperature < 4 ) + { + // 白箱 // + system_status.model = MODEL_SHIROBAKO; + + // もしかして:キャプチャボード // + if(( iic_mcu_read_a_byte( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_VERSION ) == 0x01 ) && + ( iic_mcu_result == ERR_OK )) + { + system_status.captureBox = 1; + } + } + else + { + // 実機、残量IC NACK( バッテリ無しまたは残量IC故障 ) + system_status.model = MODEL_JIKKI; // バッテリ無しの時は↓で上書きする + } + + // 電池メーカーの識別 // + { + u8 i; + + battery_manufacturer = BT_VENDER_OPEN; // デフォルト値 + for(i=0; i<=7; i++) + { + if( temp <= BT_MANUF_BORDER[ i ] ) + { + battery_manufacturer = (BT_VENDER)i; + break; + /* + BT_VENDER_MAXELL; // = 0 + BT_VENDER_1; + BT_VENDER_2; + BT_VENDER_3; + BT_VENDER_4; + BT_VENDER_PANA; + BT_VENDER_6; + + BT_VENDER_OPEN; + */ + } + } + } + + + if( ( battery_manufacturer == BT_VENDER_OPEN ) && + ( system_status.model == MODEL_JIKKI ) ) + { + system_status.model = MODEL_JIKKI_NOBATT; + } +} + + + +static void BT_mgic_quick_start() +{ + wait_ms( 10 ); // MGICの起動に掛かる + + // 0. バッテリ残量IC クイックスタート + send_cmd_mgic_2B( BT_GAUGE_REG_MODE, swap_endian_16( 0x4000 ) ); + + wait_ms( 150 ); +} + + +#define MGIC_CMD_UNLOCK_KEY 0x4A57 +#define MGIC_CMD_RESET 0x5400 +static void BT_mgic_init() +{ + u8 temp; + u8 origParam[4]; + + /* + // -1. リセットをかけてみる + かけちゃだめ! + i2c_send_buff_2B._u16 = swap_endian_16( MGIC_CMD_RESET ); + send_cmd_mgic_2B( BT_GAUGE_REG_COMMAND ); // こいつはNACKを返す + */ + + if( system_status.model != MODEL_JIKKI ) + { + return; + // おしまい + } + + // 1. ロック解除 + if( send_cmd_mgic_2B( BT_GAUGE_REG_LOCK, swap_endian_16( MGIC_CMD_UNLOCK_KEY ) ) != ERR_SUCCESS ) + { + // 残量IC NACK + vreg_ctr[ VREG_C_STATUS_1 ] |= REG_BIT_MGIC_ERR; + return; + // おしまい + } + + vreg_ctr[ VREG_C_STATUS_1 ] &= ~REG_BIT_MGIC_ERR; + + // wait_ms( 5 + 1 ); 前にウェイト入れてるので不要 + + // 2. 初期パラメータを一時保存 + iic_mcu_read( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_RCOMP, 4, origParam ); + + // 3. 一時的にOCVを変更 + send_cmd_mgic_2B( BT_GAUGE_REG_OCV, swap_endian_16( p_bt_param->ocv )); // マジックナンバー的なもの。メーカー指定 + + // 4. 一時的にRCOMPを変更 + send_cmd_mgic_2B( BT_GAUGE_REG_RCOMP, swap_endian_16( 0xFF00 ) ); + + // 5.メーカー別パラメータのロード + { + u8 loop; + + // 16バイトごとに区切れとのこと (ノイズ対策とか言うんだけど、意味あるんか?) + for( loop = 0; loop < 4; loop++ ) + { + iic_mcu_set_wo_dma( ); + iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_BT_PARAM + loop*16, 16, p_bt_param->mg_param + loop*16 ); + } + } + + // 6. 150ms以上待つ + wait_ms( 150 + 15 ); + + // 7. OCVに「とある値」を書く + send_cmd_mgic_2B( BT_GAUGE_REG_OCV, swap_endian_16( p_bt_param->ocv ) ); // マジックナンバー的なもの。メーカー指定 + + // 8. 150〜600ms待つ。600msは厳守 + wait_ms( 150 + 15 ); + + // 9. SOCを読む。ベリファイのため。 + temp = iic_mcu_read_a_byte( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_SOC ); + + if(( p_bt_param->verify.low <= temp ) && ( temp <= p_bt_param->verify.hi )) + { + // カスタムモデル書き込みOK! + }else{ + // 失敗だったらリトライするのか? +// NOP(); + } + + // 10.元のRCOMPとOCVを書き戻す + iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_RCOMP, 4, origParam ); + + // 11. ロック + send_cmd_mgic_2B( BT_GAUGE_REG_LOCK, swap_endian_16( 0x0000 ) ); // lock key +} + + + +extern u16 _dbg_rcomp; +/* ======================================================== + raw_adc_temperatureに入っている値を℃に変換するとともに、 + ・レジスタにセット + ・残量ICにセット + ======================================================== */ +task_status_immed tski_BT_temp_update( ) +{ + static u8 rawdat_old; + static s8 temperature; + s16 newrcomp; + static u8 heikinka; + +/* + サーミスタ - 10kΩ分圧点の時、 + 常用温度では分圧比のカーブがほぼリニアで、 + 村田 T[℃] = 81.48 - 111.97 x ratio + TDK T = 81.406 - 111.81 x ratio +*/ + + if( rawdat_old != raw_adc_temperature ) + { + if( heikinka < 40 ) + { + heikinka++; + } + else + { + heikinka = 0; + rawdat_old = raw_adc_temperature; + // temperature = 81.45 - 111.9 * raw_adc_temperature/256.0; + // それぞれ256倍してある + temperature = (u8)(( 20851 - 112 * raw_adc_temperature + (256/2) ) /256); + vreg_ctr[VREG_C_BT_TEMP] = (u8)temperature; + + newrcomp = 0; + if( temperature > 20 ) + { + newrcomp = ( ( temperature - 20 ) * p_bt_param->rcomp.up )/256; + } + else + { + newrcomp = ( ( temperature - 20 ) * p_bt_param->rcomp.down )/256; + } + newrcomp = p_bt_param->rcomp.rcomp + newrcomp; + + if( newrcomp > 255 ) + { + newrcomp = 255; + } + if( newrcomp < 0 ) + { + newrcomp = 0; + } + _dbg_rcomp = newrcomp; + + if( send_cmd_mgic_2B( BT_GAUGE_REG_RCOMP, newrcomp ) == ERR_SUCCESS ) // swap不要 + { + rawdat_old = raw_adc_temperature; + } + else + { + vreg_ctr[ VREG_C_STATUS_1 ] |= REG_BIT_MGIC_ERR; + } + } + } + return ( ERR_FINISED ); +} + + + +/********************************************************** + 電池残量ICから残量を取得し、レジスタに書き込む。 +  電池残量ICが無い・故障などの時はとりあえず残量99%とする。 +         ↑は status_1で確認可能。電源投入時にチェックしています。 +  BT_chk()が実行されている必要があります。 +**********************************************************/ +void BT_get_left(){ + u8 temp_fuel[2]; + static u16 hysteresis; + +#ifdef _DEBUG_BT_FUEL_ + if( vreg_ctr[ VREG_C_COMMAND3 ] == 'd' ) + { + vreg_ctr[ VREG_C_BT_REMAIN ] = vreg_ctr[ VREG_C_DBG01 ]; + } + else +#endif + { + if( system_status.model == MODEL_TS_BOARD ) + { + // TS // + vreg_ctr[ VREG_C_BT_REMAIN ] = 99; + vreg_ctr[ VREG_C_BT_VOLTAGE ] = 200; + } + else if( system_status.model == MODEL_SHIROBAKO ) + { + // 白箱 // + // 電池残量 + if( read_mgic_2B( BT_GAUGE_REG_SOC, temp_fuel ) != ERR_SUCCESS ) + { + // エミュレーション機能がおかしい + vreg_ctr[ VREG_C_BT_REMAIN ] = 99; + } + else + { + vreg_ctr[ VREG_C_BT_REMAIN ] = temp_fuel[0]; + vreg_ctr[ VREG_C_BT_REMAIN_FINE ] = temp_fuel[1]; + } + +//* + // 電池電圧 + if( read_mgic_2B( BT_GAUGE_REG_VCELL, temp_fuel ) == ERR_SUCCESS ) + { + vreg_ctr[ VREG_C_BT_VOLTAGE ] = temp_fuel[0]; + } + else +//*/ + { + vreg_ctr[ VREG_C_BT_VOLTAGE ] = 200; + } + } + else + { + // 実機 // + u8 temp_v[2]; + u8 temp_force_fuel_left; + + // 残量リード + if( read_mgic_2B( BT_GAUGE_REG_SOC, temp_fuel ) != ERR_SUCCESS ) + { + // 残量ICがNACK …バッテリはずれた + vreg_ctr[ VREG_C_STATUS_1 ] |= REG_BIT_MGIC_ERR; + bt_authorized = false; + vreg_ctr[ VREG_C_BT_REMAIN ] = 0; + force_off = true; + } + else + { + // バッテリパラメータの関係でビットシフトが必要 + bt_volt16 = temp_fuel[0] * 256 + temp_fuel[1]; + bt_volt16 /= p_bt_param->v_scale; + temp_fuel[0] = (u8)(( bt_volt16 >> 8 ) & 0xFF); + if( temp_fuel[0] == 0 ) + { + // 0%台の時は1.00%に上げ底 + // 充電開始後もしばらくは電池残量が減るので + // 0%に到達してしまうことがあるのだ + temp_fuel[0] = 1; + temp_fuel[1] = 0; + } + else + { + temp_fuel[1] = (u8)(bt_volt16 & 0xFF); + } + + + // 電圧でキャップ + if( read_mgic_2B( BT_GAUGE_REG_VCELL, temp_v ) == ERR_SUCCESS ) + { + vreg_ctr[ VREG_C_BT_VOLTAGE ] = temp_v[0]; + + bt_volt16 = ( temp_v[0] * 256 + temp_v[1] ); + + if( bt_volt16 > V_TH_30 ) + { + temp_force_fuel_left = 100; + hysteresis = 0; + } + else if( bt_volt16 - hysteresis > V_TH_LO ) + { + temp_force_fuel_left = 30; + hysteresis = 0; + } + else if( bt_volt16 > V_TH_EMPTY ) + { + temp_force_fuel_left = BATT_TH_LO; // ここから赤 + hysteresis = 500; + } + else if( bt_volt16 > V_TH_ZERO ) + { + temp_force_fuel_left = BATT_TH_EMPTY; + hysteresis = 500; + } + else if( bt_volt16 > V_TH_FORCE_OFF ) + { + temp_force_fuel_left = 0; + hysteresis = 500; + } + else + { + force_off = true; + hysteresis = 500; + } + } + } + + // 充電許可(=アダプタも刺さってる)のに充電してない + // かつ、(少なくとも)素の電池残量が60%以上(CCICバグ回避) + // = 充電完了。電池がへたってくるとMGICが100%を返さない + if( !BT_CHG_Ena_n && BT_IN_CHG_delayed_n ){ + vreg_ctr[ VREG_C_BT_REMAIN ] = 100; + vreg_ctr[ VREG_C_BT_REMAIN_FINE ] = 0; + } + else + { // 少ない方にキャップ + if( temp_force_fuel_left > temp_fuel[0] ) + { + vreg_ctr[ VREG_C_BT_REMAIN ] = temp_fuel[0]; + vreg_ctr[ VREG_C_BT_REMAIN_FINE ] = temp_fuel[1]; + } + else + { + vreg_ctr[ VREG_C_BT_REMAIN ] = temp_force_fuel_left; + vreg_ctr[ VREG_C_BT_REMAIN_FINE ] = 0; + } + } + } + if( system_status.taikendai_nbd ) + { + vreg_ctr[ VREG_C_BT_REMAIN ] = 100; + } + } + + // twlのレジスタ更新 (CTRに割り込み入れる前に更新しないと割り込みのタイミングがまずいかもしれない) + bt_batt_update_twl(); + + // 残量で割り込み。急激に減ると飛ぶことがある // + { + static u8 bt_remain_old_ctr; + + if( bt_remain_old_ctr != vreg_ctr[ VREG_C_BT_REMAIN ] ) + // CTRに通知 + { + if( (( vreg_ctr[ VREG_C_BT_REMAIN ] <= BATT_TH_LO ) && ( BATT_TH_LO < bt_remain_old_ctr ))|| + (( vreg_ctr[ VREG_C_BT_REMAIN ] <= BATT_TH_EMPTY ) && ( BATT_TH_EMPTY < bt_remain_old_ctr ))|| + (( vreg_ctr[ VREG_C_BT_REMAIN ] == 0 ) && ( bt_remain_old_ctr != 0 )) ) + { + set_irq( VREG_C_IRQ1, REG_BIT_BT_REMAIN ); + } + } + bt_remain_old_ctr = vreg_ctr[ VREG_C_BT_REMAIN ]; + } + + // PMIC-NTRに電池残量を教えてあげる + bt_batt_update_ntr(); +} + + + +/* ======================================================== + 液晶系の電源制御 +  ステータスフラグはすぐに立ててしまう。 +  不感応時間があるし、 + 起動失敗であれば電源が落ちる + 別のタスクで電源落ちは監視していて、ステータスもクリアする + ======================================================== */ +// BSR // +err PM_LCD_on( ) +{ + u8 rv; + + PM_VDDLCD_on( ); + + if( system_status.family == FAMILY_SPFL ) + { + SPFL_LCD_AMOL_HV_CONT = 1; + } + + wait_ms( DELAY_PM_TSS_50B_AND_TCOM ); + + PM_TCOM_on( ); + + wait_ms( DELAY_PM_TCOM_TO_VCS ); + + PM_VCS_on( ); + + wait_ms( DELAY_PM_VCS_TO_BL ); + + rv = (u8)PM_chk_LDSW( ); + + if( rv != 0 ) // 正常パス + { + // 電源起動エラーなら電源も切れてしまう。ここではケアしない + vreg_ctr[VREG_C_STATUS] |= REG_BIT_LCD_POW; + set_irq( VREG_C_IRQ3, REG_BIT_LCD_ON ); + return ( ERR_SUCCESS ); + } + + return ( ERR_ERR ); +} + +// BSR // +void PM_LCD_off() +{ + // BLついてたら消す。// チェックするのは割り込みの関係 + if( ( read_pmic( PM_REG_ADRS_BL ) & 0x03 ) != 0 ) + { + u8 tot; + + PM_BL_set( REG_BIT_CMD_BL_U_OFF | REG_BIT_CMD_BL_L_OFF ); + vreg_ctr[VREG_C_STATUS] &= 0b10011111; + + if( (( REG_BIT_BL_U_OFF | REG_BIT_BL_L_OFF ) & ~vreg_ctr[ VREG_C_IRQ_MASK3 ] ) != 0 ) + { + vreg_ctr[ VREG_C_IRQ3 ] |= ( ( REG_BIT_BL_U_OFF | REG_BIT_BL_L_OFF ) & ~vreg_ctr[ VREG_C_IRQ_MASK3 ] ); + IRQ0_neg; + tot = 0; + while( !IRQ0 && ( ++tot != 0 ) ){;} + IRQ0_ast; + } + vreg_ctr[VREG_C_COMMAND2] &= ~( REG_BIT_CMD_BL_U_OFF | REG_BIT_CMD_BL_L_OFF ); + } + + + // 液晶電源切る // + SPFL_LCD_AMOL_HV_CONT = 0; // 他のファミリでも弊害ないし + + // 50msとか待つし、確認しましょうかね… + if( read_pmic( PM_REG_ADRS_VDD_LCD ) != 0 ) + { + if( system_status.family == FAMILY_SPFL ) + { + wait_ms( 10 ); // アモルファス15Vを切ったときのウェイト。数字は暫定 + } + + PM_TCOM_off(); + wait_ms( 1 ); + PM_TCOM_VCS_off( ); + wait_ms( DELAY_PM_LCD_OFF ); + + PM_VDDLCD_off( ); // 残ってたの全部止めます。 + vreg_ctr[VREG_C_STATUS] &= ~REG_BIT_LCD_POW; + } + + set_irq( VREG_C_IRQ3, REG_BIT_LCD_OFF ); // 無条件に発生。マスク無ければ。 +} + + + +/* ======================================================== + バックライトの個別on/off + 現状から on/off/維持 のフラグなので面倒 +  例えば、BL on/on の状態で、on/onにしろと言われても、on/on割り込みを入れます。 +======================================================== */ +err PM_BL_set( u8 dat ) +{ + u8 blset; + u8 intset = 0; + // RMWを行う + + // Read + blset = read_pmic( PM_REG_ADRS_BL ); + + // Modify + // ue + if(( dat & REG_BIT_CMD_BL_U_ON ) != 0 ) + { + blset |= PM_REG_BIT_BL_U; + intset |= REG_BIT_BL_U_ON; + } + else if(( dat & REG_BIT_CMD_BL_U_OFF ) != 0 ) + { + blset &= ~PM_REG_BIT_BL_U; + intset |= REG_BIT_BL_U_OFF; + } + + // shita + if(( dat & REG_BIT_CMD_BL_L_ON ) != 0 ) + { + blset |= PM_REG_BIT_BL_L; + intset |= REG_BIT_BL_L_ON; + } + else if(( dat & REG_BIT_CMD_BL_L_OFF ) != 0 ) + { + blset &= ~PM_REG_BIT_BL_L; + intset |= REG_BIT_BL_L_OFF; + } + + if( blset != 0 ) // BLを付ける場合はウェイトを挟まないとPWMが来ておらず + // シャットダウンすることがある + { + wait_ms( 16 + 10 ); + } + send_cmd_pmic( PM_REG_ADRS_BL, blset ); + +#if 0 +// SoCがPWMを出すようレジスタをセットしてから遅延が有るため、ステータスを先に +// 更新してしまう。 +#endif + // PMICのBLのビットと、MCUのSTATUSレジスタのビット位置が逆なため入れ替え + vreg_ctr[VREG_C_STATUS] = (( vreg_ctr[VREG_C_STATUS] & 0b10011111 ) + | ( (( blset << 6 ) | ( blset << 4 )) & 0b01100000 )); + + // 割り込み + /// 複数ビットまとめて行うので、いつもの関数使用不可 + { + u8 tot; + + if( ( intset & ~vreg_ctr[ VREG_C_IRQ_MASK3 ] ) != 0 ) + { + vreg_ctr[ VREG_C_IRQ3 ] |= ( intset & ~vreg_ctr[ VREG_C_IRQ_MASK3 ] ); + IRQ0_neg; + tot = 0; + while( !IRQ0 && ( ++tot != 0 ) ){;} + IRQ0_ast; + } + } + + return( ERR_SUCCESS ); // ここでは異常チェック不要 +} + + + +/* ======================================================== + 液晶の対向電圧の設定を行います。 + 仮想レジスタの内容を送るだけ + ======================================================== */ +void PM_LCD_vcom_set( ) +{ + send_cmd_pmic( PM_REG_ADRS_POW_DAC1, vreg_ctr[VREG_C_VCOM_T] ); // がっかりなことに、PMICはバースト書き込み不可 + send_cmd_pmic( PM_REG_ADRS_POW_DAC2, vreg_ctr[VREG_C_VCOM_B] ); + return; +} + + + +/* ======================================================== + ↑で、レジスタ書き込みから呼び出される時のため +  I2Cの取り合いの関係でここから呼ぶ + ======================================================== */ +task_status_immed tski_vcom_set( ) +{ + PM_LCD_vcom_set( ); + return ( ERR_FINISED ); +} + + + +/* ======================================================== + シーケンスの通り電源を立ち上げてゆきます。 + 返値 0 最後まで正常に完了した。 + 1 ショートなどで電源があがりきらなかった + + 以下のピンは主にここで操作・監視されます。 + ・POW_CONT1,2 TEG電源のみ + ======================================================== */ +err PM_sys_pow_on( ) +{ + // 電源順次立ち上げ +// PM_reset_ast( ); 不要 PM_LDSW_onまかせ + RESET2_ast; + FCRAM_RST_ast; + GYRO_DISABLE(); + + PM_LDSW_on( ); + + wait_ms( 1 + DELAY_PM_TW_PWUP ); + + PM_VDD_normMode(); + PM_VDD_on( ); +// wait_ms( DELAY_PM_TW_PWUP ); // GYROを挟むため + wait_ms( 10 ); + GYRO_ENABLE(); + wait_ms( DELAY_PM_TW_PWUP - 10 ); + + PM_VDD50A_on( ); // 液晶電源ではなく、ledとかに使うものです + + wait_ms( DELAY_PM_TW_PWUP ); + + // 無事電源が起動したかチェック。 + if( !PM_chk_LDSW() ) + { + return ( ERR_ERR ); // reset1はほっといて良い + } + + // 電源周りIC情報 + pmic_version = read_pmic( PM_REG_ADRS_VER ); + read_mgic_2B( BT_GAUGE_REG_VERSION, mgic_version ); + + // リセット解除など。システム起動! + PM_reset_neg(); + FCRAM_RST_neg; + RESET2_neg; + + codec_reg_init(); // CODEC 不定レジスタ初期化(reset2の後でないといけないので) + ntr_pm_reg_shadow = 0; //  〃 こんなところで... + + return ( ERR_SUCCESS ); +} + + + + +/* ======================================================== + 電源OFFシーケンス + ======================================================== */ +void PM_sys_pow_off( ) +{ +// if( RESET1_n ) + if( PM_chk_LDSW() ) + { + // 異常時は呼ばない + PM_BL_set( REG_BIT_CMD_BL_U_OFF | REG_BIT_CMD_BL_L_OFF ); + PM_LCD_off(); // TCOM,VCS OFF も消してきます。 + wait_ms( 20 ); + + PM_reset_ast(); + } + + RESET2_ast; + FCRAM_RST_ast; + + wait_ms( 20 ); + + PM_off( ); + PM_LDSW_off( ); + + return; +} + + + +/*========================================================= + extDC割り込み + 電源OFFから起こす(充電の温度監視のため)のみ + 普段はポーリング(pm) + =========================================================*/ +__interrupt void intp4_extdc( ) +{ +// chg_led_override = (u8)( 1000 / INTERVAL_TSK_BATT / SYS_INTERVAL_TICK ); +// chg_led_override = 4; +} + + + +/*========================================================= + フタ開け閉め割り込み + 普段はポーング(misc) + =========================================================*/ +__interrupt void intp5_shell( ) +{ + ; +} + + +/*========================================================= + 旧PMICへのコマンド書き込み + =========================================================*/ +__interrupt void intp6_PM_irq( ) +{ + EI(); + if( system_status.pwr_state == ON ) + { + renge_task_immed_add( tski_ntr_pmic_comm ); + } +} + + +/* ======================================================== + PMICからの割り込みを受けて、NTR PMIC互換レジスタからリード + ======================================================== */ +task_status_immed tski_ntr_pmic_comm( ) +{ + u8 reg1_old; + u8 irq_work = 0; + + reg1_old = ntr_pm_reg_shadow; + ntr_pm_reg_shadow = iic_mcu_read_a_byte( IIC_SLA_CODEC, CODEC_REG_PM ); + if( iic_mcu_result != ERR_SUCCESS ) + { + return ( ERR_FINISED ); + } + +// DI( ); + + // バックライト 上 //////////////////////////////////// + if( ( ( reg1_old ^ ntr_pm_reg_shadow ) & REG_BIT_TWL_REQ_BL_U ) != 0 ) + { + if( ( ntr_pm_reg_shadow & REG_BIT_TWL_REQ_BL_U ) == 0 ) // 消えた + { + irq_work = REG_BIT_TWL_BL_U_OFF; + } + else + { + irq_work = REG_BIT_TWL_BL_U_ON; + } + } + + // バックライト 下 + if( ( ( reg1_old ^ ntr_pm_reg_shadow ) & REG_BIT_TWL_REQ_BL_L ) != 0 ) + { + if( ( ntr_pm_reg_shadow & REG_BIT_TWL_REQ_BL_L ) == 0 ) // 消えた + { + irq_work |= REG_BIT_TWL_BL_L_OFF; + } + else + { + irq_work |= REG_BIT_TWL_BL_L_ON; + } + } + +// EI(); + + vreg_ctr[ VREG_C_STATUS_1 ] = ( vreg_ctr[ VREG_C_STATUS_1 ] & ~0x0C ) | ( ntr_pm_reg_shadow & 0x0C ); // TWLバックライト情報のミラー + + irq_work &= ~vreg_ctr[ VREG_C_IRQ_MASK2 ]; + // set_irq 相当品 + if( irq_work != 0 ) + { + u8 tot; + + vreg_ctr[ VREG_C_IRQ2 ] |= irq_work; + IRQ0_neg; // 一瞬上げてパルスを送り直す + tot = 0; + while( !IRQ0 && ( ++tot != 0 ) ){;} // O.Dなのでちゃんとあがるのを待つ & IRQ_mcu がLに縛られてると困る(基板不良) + IRQ0_ast; + } + +#if 0 + // バックライト設定 + // 勝手に消しておく + /// 今のところさらに細かくは分けないけど… + if( ( ntr_pm_reg_shadow & ( REG_BIT_TWL_REQ_BL_U | REG_BIT_TWL_REQ_BL_U ) ) == 0 ) + { + vreg_ctr[ VREG_C_COMMAND2 ] = ( REG_BIT_CMD_BL_U_OFF | REG_BIT_CMD_BL_U_OFF ); + renge_task_immed_add( tski_PM_BL_set ); + } +#endif + + // offリクエスト ////////////////////////////////////// + if( ( ntr_pm_reg_shadow & REG_BIT_TWL_REQ_OFF_REQ ) != 0 ) + { + set_irq( VREG_C_IRQ2, REG_BIT_TWL_OFF_REQ ); + } + + // リセットリクエスト ///////////////////////////////// + if( ( ntr_pm_reg_shadow & REG_BIT_TWL_REQ_RST_REQ ) != 0 ) + { +#if 0 + // CODECバグ回避 + // リセット単品でなかったら無視 + if( ( reg1_old ^ ntr_pm_reg_shadow ) == REG_BIT_TWL_REQ_RST_REQ ) +#endif + { + set_irq( VREG_C_IRQ2, REG_BIT_TWL_RESET_REQ ); + } + } + + // バックライトをマスクして書き戻す + EI( ); + if( ( ntr_pm_reg_shadow & ( REG_BIT_TWL_REQ_OFF_REQ | REG_BIT_TWL_REQ_RST_REQ )) != 0 ) + { + ntr_pm_reg_shadow &= ~( REG_BIT_TWL_REQ_OFF_REQ | REG_BIT_TWL_REQ_RST_REQ ); + iic_mcu_write_a_byte_codec( CODEC_REG_PM, ntr_pm_reg_shadow ); + } + return ( ERR_FINISED ); +} + + + +/********************************************************** + command2 液晶系 +  ラッパー的な物。ERR_SUCCESSしか返さないが… +**********************************************************/ +task_status_immed tski_PM_LCD_on() +{ + PM_LCD_on(); + return( ERR_FINISED ); +} + +task_status_immed tski_PM_LCD_off() +{ + PM_LCD_off(); + return( ERR_FINISED ); +} + +task_status_immed tski_PM_BL_set() +{ + u8 cmd_BL; // ↓volatileとか付けなくても大丈夫みたい + + do + { + cmd_BL = vreg_ctr[VREG_C_COMMAND2]; + PM_BL_set( cmd_BL ); // マスク済み + } + while( cmd_BL != vreg_ctr[VREG_C_COMMAND2] ); // <- PM_BL_setが更新する + vreg_ctr[VREG_C_COMMAND2] = 0; + + return( ERR_FINISED ); +} + + + +/********************************************************** + reset2 で CODEC にリセットがかかり、レジスタが不定になるため +**********************************************************/ +void codec_reg_init() +{ + wait_ms( 100 ); + + ntr_pm_bt_low_old = ( vreg_ctr[ VREG_C_BT_REMAIN ] <= BATT_TH_LO )? NTR_PM_BT_EMPTY: NTR_PM_BT_ENOUGH; // 1で電池切れ + iic_mcu_write_a_byte_codec( CODEC_REG_BT, (u8)ntr_pm_bt_low_old ); // SoC から書けず + + vol_reset(); +// renge_task_immed_add( tski_vol_update ); ポーリングするので。 + vol_polling = 3; +} + + +/* ============================================================ + ヘルパーというかラッパーというか? + ROM節約のため + ============================================================ */ +err send_cmd_mgic_2B( u8 reg, u16 dat ) // 送信バッファ +{ + u16 temp = dat; + return iic_mcu_write( IIC_SLA_BT_GAUGE, reg, 2, &temp ); // DMA転送するので送信データバッファのポインタがどうせ必要 +} + +err read_mgic_2B( u8 reg, u8* dat ) // 送信バッファは固定 +{ + return iic_mcu_read( IIC_SLA_BT_GAUGE, reg, 2, dat ); +} + +err send_cmd_pmic( u8 reg, u8 dat ) +{ + return iic_mcu_write_a_byte( IIC_SLA_PMIC, reg, dat ); +} + +u8 read_pmic( u8 reg ) +{ + return iic_mcu_read_a_byte( IIC_SLA_PMIC, reg ); +} + + +/* ============================================================ + 電池メーカーとモデルから、使う電池パラメータの決定 + ============================================================ */ +void bt_param_select() +{ + BT_TYPE bt_type_temp; + // 対応が増えてきたら分岐コード書き直すつもりで + if( battery_manufacturer <= BT_VENDER_3 ) + { + bt_type_temp = BT_PARAM_CTR_MAXELL; + } + else + { + bt_type_temp = BT_PARAM_CTR_PANA; + } + + if( system_status.family == FAMILY_SPFL ) + { + bt_type_temp += BT_PARAM_SPFL_MAXELL; // オフセット 残念な実装で…。 + } + else if( system_status.family == FAMILY_SHRIMP ) + { + bt_type_temp += BT_PARAM_SHRIMP_MAXELL; + } + p_bt_param = &bt_param[ bt_type_temp ]; +} + + + +/* ============================================================ + TWLに電池残量を教えてあげる + ============================================================ */ +static void bt_batt_update_twl() +{ + if (vreg_ctr[VREG_C_BT_REMAIN] > 80) + { + vreg_twl[REG_TWL_INT_ADRS_POWER_INFO] = 0x0F; + } + else if (vreg_ctr[VREG_C_BT_REMAIN] > 50) + { + vreg_twl[REG_TWL_INT_ADRS_POWER_INFO] = 0x0B; + } + else if (vreg_ctr[VREG_C_BT_REMAIN] > BATT_TH_LO) + { + vreg_twl[REG_TWL_INT_ADRS_POWER_INFO] = 0x07; + } + else if (( vreg_ctr[ VREG_C_BT_REMAIN ] > BATT_TH_EMPTY )|| + !BT_CHG_Ena_n ) + { // アダプタの有無で底上げ + vreg_twl[REG_TWL_INT_ADRS_POWER_INFO] = 0x03; + } + else if (vreg_ctr[VREG_C_BT_REMAIN] > 0) + { + vreg_twl[REG_TWL_INT_ADRS_POWER_INFO] = 0x01; + } + else + { + vreg_twl[REG_TWL_INT_ADRS_POWER_INFO] = 0x00; + } +} + + +/* ============================================================ + NTRに電池残量を教えてあげる + ============================================================ */ +static void bt_batt_update_ntr() +{ + static bit initialized; + static bit flag; // あれ?staticでないとコンパイラに怒られる + + if( system_status.pwr_state == OFF_TRIG ) + { + initialized = false; + } + else + { + + flag = (( vreg_ctr[ VREG_C_BT_REMAIN ] <= BATT_TH_LO )? NTR_PM_BT_EMPTY: NTR_PM_BT_ENOUGH ); // 1で電池切れ + + if(( ntr_pm_bt_low_old != flag ) || !initialized ) + { + initialized = true; + ntr_pm_bt_low_old = flag; + iic_mcu_write_a_byte_codec( CODEC_REG_BT, (u8)flag ); + } + } +} diff --git a/branches/sim/pm.h b/branches/sim/pm.h new file mode 100644 index 0000000..215e7e5 --- /dev/null +++ b/branches/sim/pm.h @@ -0,0 +1,211 @@ +#ifndef __PM__ +#define __PM__ + + + +#define IIC_SLA_PMIC 0x84 +#define IIC_SLA_BT_GAUGE 0x6C + +#define VCOM_DEFAULT_T 92 +#define VCOM_DEFAULT_B 95 + + + +#define BATT_TH_LO 10 +#define BATT_TH_EMPTY 5 + +// 電圧レジスタと直接比較できる用にオフセット +#define V_TH_30 (u16)( 3300 * 12.8 ) +#define V_TH_LO (u16)( 3200 * 12.8 ) +#define V_TH_EMPTY (u16)( 3150 * 12.8 ) +#define V_TH_ZERO (u16)( 3100 * 12.8 ) +#define V_TH_FORCE_OFF (u16)( 2900 * 12.8 ) + + +//========================================================= +#define LED_CHARGE P2.4 + + + +//========================================================= +enum PMIC_REG_ADRS +{ + PM_REG_ADRS_VER = 0x00, // verinfo など + PM_REG_ADRS_VDD_SYS, // システムが使用する電源 + PM_REG_ADRS_VDD_LCD, // 液晶電源 + PM_REG_ADRS_CONT, // /RESET1, LoadSwitch + PM_REG_ADRS_BL, // バックライト on/off + PM_REG_ADRS_POW_SAVE, // 省電力設定 + PM_REG_ADRS_POW_DAC1, + PM_REG_ADRS_POW_DAC2 +}; + +enum BT_GAUGE_REG_ADRS +{ + BT_GAUGE_REG_VCELL = 0x02, // それぞれ16ビットのため + BT_GAUGE_REG_SOC = 0x04, + BT_GAUGE_REG_MODE = 0x06, + BT_GAUGE_REG_VERSION = 0x08, + BT_GAUGE_REG_OCV = 0x0E, + BT_GAUGE_REG_RCOMP = 0x0C, + BT_GAUGE_REG_LOCK = 0x3E, + BT_GAUGE_REG_BT_PARAM = 0x40, + BT_GAUGE_REG_COMMAND = 0xFE +}; + + +typedef enum BT_VENDER +{ + BT_VENDER_MAXELL = 0, // ショート + BT_VENDER_1, // 120 + BT_VENDER_2, // 360 + BT_VENDER_3, // 750 + BT_VENDER_4, // 1.3k + BT_VENDER_PANA = 5, // 2.7k + BT_VENDER_6, // 8.2k + BT_VENDER_OPEN = 7, // open + BT_VENDER_NOT_CHECKED = 0xFF, +}BT_VENDER; + + + +enum NTR_PM_BT_STATUS{ + NTR_PM_BT_ENOUGH, + NTR_PM_BT_EMPTY, + NTR_PM_BT_NOT_INITIALIZED = 0xFF +}; + + + +//========================================================= +// CODEC上のPMIC互換レジスタ +#define CODEC_REG_PM 0x10 +#define CODEC_REG_BL 0x11 +#define CODEC_REG_BT 0x12 +//#define CODEC_REG_VOL 0x13 // ...都合により、adc.hで定義 + +// TWLがSPIでPMICに投げたコマンド +#define REG_BIT_TWL_REQ_OFF_REQ ( 1 << 6 ) +#define REG_BIT_TWL_REQ_RST_REQ ( 1 << 0 ) +#define REG_BIT_TWL_REQ_BL ( 3 << 2 ) + + + + +// 0x03 pw cnt3 +#define PM_REG_BIT_LDSW ( 1 << 0 ) +#define PM_REG_BIT_nRST1 ( 1 << 1 ) + +// 0x01 pw cnt1 +#define PM_REG_BIT_VDD 0x0F +#define PM_REG_BIT_VDD50A ( 1 << 4 ) + +// 0x02 pw cnt2 +#define PM_REG_BIT_VDDLCD 0x07 +#define PM_REG_BIT_LCD_VCS ( 0x01 << 4 ) +#define PM_REG_BIT_LCD_TCOM ( 0x01 << 3 ) + +// 0x04 bl cnt +#define PM_REG_BIT_BL_U 0x01 +#define PM_REG_BIT_BL_L 0x02 + + +// 0x05 pow save +#define PM_REG_BIT_VDD1P_1R15 0b00000000 +#define PM_REG_BIT_VDD1P_1R05 0b00001000 +#define PM_REG_BIT_VDD1P_0R90 0b00100000 +#define PM_REG_BIT_VDD_AUTO 0b00000111 +#define PM_REG_BIT_VDD_PWM 0b00000000 + + +#define DELAY_PM_TW_PWUP 16 + 2 +#define DELAY_PM_TSS_50B_AND_TCOM 17 + 1 +#define DELAY_PM_5V_TO_TCOM 17 + 1 +#define DELAY_PM_TCOM_TO_VCS 3 +#define DELAY_PM_VCS_TO_BL ( 17 + 5 ) +#define DELAY_PM_LCD_OFF ( 50 + 1 ) + + +//========================================================= +extern u8 raw_adc_temperature; +extern BT_VENDER battery_manufacturer; +extern bit bt_force_update; + +extern u8 pmic_version; +extern u8 mgic_version[]; + + +//========================================================= +err PM_sys_pow_on( ); +void PM_sys_pow_off( ); +//err PM_bt_auth( ); +void PM_LCD_vcom_set( ); + +err PM_LCD_on( ); +void PM_LCD_off( ); +err PM_BL_set( u8 ); + + +void BT_chk(); +void BT_get_left(); +void pm_chk_adapter(); + +void codec_reg_init(); + + + +task_status_immed tski_BT_temp_update( ); +task_status_immed tski_vcom_set( ); +task_status_immed tski_PM_LCD_on(); +task_status_immed tski_PM_LCD_off(); +task_status_immed tski_PM_BL_set(); + + +err send_cmd_pmic( u8 reg, u8 dat ); +u8 read_pmic( u8 reg ); + + +#define PM_Chg_Stop() { BT_TEMP_P = 0; BT_CHG_DISABLE(); LED_CHARGE = 0; bt_authorized = false; } + + +//  これを呼ぶ前に、現在温度を教えておく必要があります。 +#define PM_reset() ( send_cmd_pmic( PM_REG_ADRS_CONT, 0x00 ) ) + + +//========================================================= + + +// 元栓 // +#define PM_LDSW_on() ( send_cmd_pmic( PM_REG_ADRS_CONT, PM_REG_BIT_LDSW )) +#define PM_LDSW_off() ( send_cmd_pmic( PM_REG_ADRS_CONT, 0 )) + + +// システム電源 // +#define PM_VDD_on() ( send_cmd_pmic( PM_REG_ADRS_VDD_SYS, PM_REG_BIT_VDD )) +#define PM_VDD50A_on() ( send_cmd_pmic( PM_REG_ADRS_VDD_SYS, ( PM_REG_BIT_VDD | PM_REG_BIT_VDD50A ))) +#define PM_VDD_off() ( send_cmd_pmic( PM_REG_ADRS_VDD_SYS, 0 )) +#define PM_off() ( send_cmd_pmic( PM_REG_ADRS_VDD_SYS, 0 )) + +#define PM_VDD_normMode() ( send_cmd_pmic( PM_REG_ADRS_POW_SAVE, PM_REG_BIT_VDD1P_1R15 | PM_REG_BIT_VDD_PWM )) +#define PM_VDD_ecoMode() ( send_cmd_pmic( PM_REG_ADRS_POW_SAVE, PM_REG_BIT_VDD1P_0R90 | PM_REG_BIT_VDD_AUTO )) + +// ほか // +#define PM_reset_neg() ( send_cmd_pmic( PM_REG_ADRS_CONT, ( PM_REG_BIT_LDSW | PM_REG_BIT_nRST1 ))) +#define PM_reset_ast() ( send_cmd_pmic( PM_REG_ADRS_CONT, ( PM_REG_BIT_LDSW ))) +#define PM_chk_LDSW() ( read_pmic( PM_REG_ADRS_CONT ) & PM_REG_BIT_LDSW ) +// ↑ 0 だと異常 + +// 液晶系電源 // +#define PM_VDDLCD_on() ( send_cmd_pmic( PM_REG_ADRS_VDD_LCD, PM_REG_BIT_VDDLCD )) +#define PM_TCOM_on() ( send_cmd_pmic( PM_REG_ADRS_VDD_LCD, ( PM_REG_BIT_VDDLCD | PM_REG_BIT_LCD_TCOM ))) +#define PM_VCS_on() ( send_cmd_pmic( PM_REG_ADRS_VDD_LCD, ( PM_REG_BIT_VDDLCD | PM_REG_BIT_LCD_VCS | PM_REG_BIT_LCD_TCOM ))) +#define PM_TCOM_off() ( send_cmd_pmic( PM_REG_ADRS_VDD_LCD, ( PM_REG_BIT_VDDLCD | PM_REG_BIT_LCD_VCS ))) +#define PM_TCOM_VCS_off() PM_VDDLCD_on() +#define PM_VDDLCD_off() ( send_cmd_pmic( PM_REG_ADRS_VDD_LCD, 0 ) ) + +#define PM_set_BL( dat ) ( send_cmd_pmic( PM_REG_ADRS_BL, dat ) ) +#define PM_set_adc1( dat ) ( send_cmd_pmic( PM_REG_ADRS_POW_DAC1, dat ) ) +#define PM_set_adc2( dat ) ( send_cmd_pmic( PM_REG_ADRS_POW_DAC2, dat ) ) + + +#endif // __PM__ diff --git a/branches/sim/pool.h b/branches/sim/pool.h new file mode 100644 index 0000000..81c8091 --- /dev/null +++ b/branches/sim/pool.h @@ -0,0 +1,24 @@ +#ifndef _pool_h_ +#define _pool_h_ + + +#include "pedometer.h" + +#define VREG_C_FREE_SIZE 200 + +// 空いてるメモリ +typedef struct _st_vreg_c_ext{ + unsigned short pedo_log[ PEDOMETER_LOG_SIZE ]; + unsigned char vreg_c_free[ VREG_C_FREE_SIZE ]; +}st_vreg_c_ext; + +typedef union _uni_pool +{ + st_vreg_c_ext vreg_c_ext; + u8 self_update_work[ 256 ]; // 256以上はまとめ書きできない +}uni_pool; + +extern uni_pool pool; + + +#endif diff --git a/branches/sim/reboot.c b/branches/sim/reboot.c new file mode 100644 index 0000000..b784f15 --- /dev/null +++ b/branches/sim/reboot.c @@ -0,0 +1,24 @@ +/********************************************************//* + + むりやりリブート + + ファイル中にインラインアセンブラがあると、 + そのモジュール全部最適化が聞かなくなるため追い出した + + **********************************************************/ +#pragma SFR + +#include "incs_loader.h" + + +void my_reboot(){ +#asm + + MOV PSW,#06H ; ダミーのPSWをセット + MOVW AX,#000d0h ; リセットのベクタ値を取り込んでいます。 + PUSH PSW + PUSH AX ; これでRETIのためのスタックを準備 + RETI ; これでリセット・ベクタに分岐 + +#endasm +} diff --git a/branches/sim/reboot.h b/branches/sim/reboot.h new file mode 100644 index 0000000..c20e11e --- /dev/null +++ b/branches/sim/reboot.h @@ -0,0 +1,6 @@ +#ifndef __MYREBOOT__ +#define __MYREBOOT__ + +void my_reboot(); + +#endif diff --git a/branches/sim/renge/renge.c b/branches/sim/renge/renge.c new file mode 100644 index 0000000..f50fb59 --- /dev/null +++ b/branches/sim/renge/renge.c @@ -0,0 +1,306 @@ +#pragma section @@CODE ROM_CODE +#pragma nop +#pragma ei +#pragma di +#pragma sfr + +/****************************************************************************** + タスクシステム? + なるほど、iTRONにはコンフィギュレータがあるはずだ。 + →作りました + ctr_mcu_config.rb 参照。 task_config.hが作成されます。 + *****************************************************************************/ +#include "renge.h" +#include "renge_task_intval.h" +#include "renge_task_immediate.h" +#include "..\WDT.h" +#include "..\config.h" +#include "..\user_define.h" + + +//#define _renge_test_ + +#define true 1 +#define false 0 + +//****************************************************************************** +u8 renge_flg_interval; +bit renge_task_interval_run_force; +bit renge_task_immediate_not_empty; + +bit renge_task_interval_in_force; + + + +#include "..\bsr_system.h" +extern system_status_ system_status; + + + +//****************************************************************************** +static void renge_task_immed_init(); +static void renge_task_immed_del(); + + + +//****************************************************************************** +task_status_immed ( *tasks_immed[ TASK_IMMED_RUN_LIST_MAX ] )(); + + + +/****************************************************************************** + 初期化 +・タスクシステムの動的部分の初期化 +・インターバルタイマ + *****************************************************************************/ +void renge_init(){ + renge_task_immed_init(); + /* + イベントタイマのセットなど + 今回はRTCを流用しているのでコメントアウト + #define renge_tick 19xxxxxxx [ms] + renge_interval_init(); → RTC_init(); + */ +} + + + +/****************************************************************************** + システムチックを進める + *****************************************************************************/ +/* +void renge_interval(){ +// RTCがやってくれる +→__interrupt void int_rtc_int(); +} +*/ + + + +/****************************************************************************** + コンパイル時に決まっている、インターバル起動のタスク + そのうち、逐次起動と混ぜるかもしれない。 + *****************************************************************************/ +err renge_task_interval_run(){ + u8 i; + + // インターバル起動 + DI(); + if(( renge_flg_interval != 0 ) || + ( renge_task_interval_run_force )) // todo 統合 + { + renge_task_interval_in_force = renge_task_interval_run_force; + renge_task_interval_run_force = false; // 今から起動するタスク、割り込むタスクでフラグが立つかもなので + if( renge_flg_interval != 0 ) + { + renge_flg_interval -= 1; + WDT_Restart( ); + } + EI(); + for( i = 0; i != TSK_LAST; i += 1 ) + { + tasks[ i ](); + // 逐次起動タスクがあったら間に挟む + renge_task_immed_run(); + } + } + EI(); + return( ERR_SUCCESS ); +} + + + +/***************************************************************************** + ■逐一起動タスク■ + + ●task_immed を返す関数。 + ●システムtick、何らかの割り込み(I2C通信完了など)で + スリープから復帰したタイミングで実行されます。 + +■返値 ERR_FINISED タスクを削除 +    それ以外 次のタイミングでまた実行 + + *****************************************************************************/ + + +/************************************** + **************************************/ +void renge_task_immed_init(){ + u8 i; + + for( i = 0; i < TASK_IMMED_RUN_LIST_MAX; i++ ){ + tasks_immed[ i ] = TSK_IMM_EMPTY_; + } +} + + + +/************************************** + 逐次実行タスクの登録 + 割り込み禁止 36us → + **************************************/ +err renge_task_immed_add( task_status_immed (*new_task)() ){ + u8 i; + + // リストの空きの先頭に登録 + // 削除したばかりのタスクは、削除マーク(TSK_IMM_DELETED_)となり、空きとは明示的に区別される + // 重複登録を避ける + for( i = 0; i < TASK_IMMED_RUN_LIST_MAX; i += 1 ) + { + DI(); + if( tasks_immed[ i ] == TSK_IMM_EMPTY_ ) + { + // 空きを見つけた + tasks_immed[ i ] = new_task; + EI(); + return( ERR_SUCCESS ); + } + else + { + // 重複登録チェック + /// 歯抜けになってない、前詰めされてる前提 + if( tasks_immed[ i ] == new_task ) + { + // 重複登録はしない + EI(); + return( ERR_ERR ); + } + } + EI(); + } + // タスク登録しすぎ(無いはず + return( ERR_ERR ); +} + + + +/************************************** + 逐次実行タスクの実行 + **************************************/ +err renge_task_immed_run(){ + u8 list_id; + +// while( tasks_immed[ 0 ] != TSK_IMM_EMPTY_ ) + if( tasks_immed[ 0 ] != TSK_IMM_EMPTY_ ) + { + DI(); + for( list_id = 0; list_id < TASK_IMMED_RUN_LIST_MAX; list_id += 1 ){ + if( tasks_immed[ list_id ] == TSK_IMM_EMPTY_ ){ + // リスト完了 + EI(); + break; + } +#ifdef _renge_test_ + else if( tasks_immed[ list_id ] == TSK_IMM_DELETED_ ) + { + EI(); + NOP(); + // タスク管理の不備 + // 存在しないタスクを実行しようとした + // タスクの削除後の処理がまずい + // 予期しないタイミングで immed_run が呼ばれた + } +#endif + else + { + u8 rv; + + EI(); + rv = tasks_immed[ list_id ](); + if( rv == ERR_SUCCESS ) + { + tasks_immed[ list_id ] = TSK_IMM_DELETED_; + } + } + DI(); + } + // リスト上のタスクを一通り実行した + + // タスク削除 // + { + u8 i = 0; // リストの並べ替え先 + u8 j = 1; + + // 必ず i < j、j < TASK_IMMED_RUN_LIST_MAX (でないとタスクあふれ) + while( 1 ) + { + if( tasks_immed[ i ] == TSK_IMM_EMPTY_ ) + { + // 前詰め完了 && リスト空っぽ + // break; + goto imm_list_sort_fin; + } + else if( tasks_immed[ i ] == TSK_IMM_DELETED_ ) + { + for( ; j < TASK_IMMED_RUN_LIST_MAX; j++ ) + { + if( tasks_immed[ j ] == TSK_IMM_DELETED_ ) + { + // 隣(?)も削除対象だった + // next j + } + else + { + DI(); + if( tasks_immed[ j ] == TSK_IMM_EMPTY_ ) + { + do{ + j -= 1; + DI(); + tasks_immed[ j ] = TSK_IMM_EMPTY_; + // リスト前詰め完了 + EI(); + }while( i < j ); + goto imm_list_sort_fin; + } + else + { + // 前詰めすべきタスクを見つけた + tasks_immed[ i ] = tasks_immed[ j ]; + tasks_immed[ j ] = TSK_IMM_DELETED_; + i += 1; + EI(); + } + } + } + } + else + { + // このタスク、滞留 + } + i += 1; + } + } + } + +imm_list_sort_fin: + // ここまでで完全に前詰めされている +#ifdef _renge_test_ + /// ほんと? + { + u8 a,b; + + a = 0; + for( b = 0 ; b < TASK_IMMED_RUN_LIST_MAX; b++ ) + { + if( tasks_immed[ b ] == TSK_IMM_EMPTY_ ) + { + a = 1; + } + else + { + if( a != 0 ) + { + NOP(); // EMPTYより後ろにタスクやdeletedが有る + } + } + } + } +#else + NOP(); // リンカが怒る +#endif +// } + return( ERR_SUCCESS ); +} + + diff --git a/branches/sim/renge/renge.h b/branches/sim/renge/renge.h new file mode 100644 index 0000000..ee1d9f9 --- /dev/null +++ b/branches/sim/renge/renge.h @@ -0,0 +1,28 @@ +#ifndef __renge__ +#define __renge__ + +//****************************************************************************** + + + +//****************************************************************************** +#include "renge_defs.h" +#include "renge_task_immediate.h" +// #include "renge_task_interval_run.h" // 外から強制起動禁止! + +//****************************************************************************** +void renge_init(); +void renge_task_immed_init(); +err renge_task_immed_run(); +err renge_task_immed_add( task_status_immed (*p_task_func)() ); +// static err renge_task_immed_del( u8 ); + + + +//****************************************************************************** +err renge_task_interval_run(); +extern u8 renge_flg_interval; +extern bit renge_task_interval_run_force; // タスク強制実行フラグ +extern bit renge_task_interval_in_force; // 強制実行中フラグ + +#endif diff --git a/branches/sim/renge/renge_defs.h b/branches/sim/renge/renge_defs.h new file mode 100644 index 0000000..0199d76 --- /dev/null +++ b/branches/sim/renge/renge_defs.h @@ -0,0 +1,55 @@ +#ifndef __renge_defs__ +#define __renge_defs__ +/****************************************************************************** + Renge Ver.0 (2009/04/09) + 2009- 7k4jhl R.Fujita @ RED.nintendo + + OSにはほど遠い、簡易的なタスクシステム。 + Range の Typo ではないです。レンゲです。 + + なんと レンゲ は俗称で日本名は ゲンゲ + 小さいけど役に立つ役草です。 + 大きく育ってね! + ******************************************************************************/ + +typedef unsigned char u8; +typedef signed char s8; +typedef unsigned short u16; +typedef signed short s16; + + +// ************************************ +#define SYS_INTERVAL_TICK 1.953 + + + +// ************************************ +typedef enum _ERR +{ + ERR_SUCCESS = 0, + ERR_ERR +}err; + + +typedef enum _IMMED_TASK_ERR +{ + ERR_FINISED = 0, + ERR_CONTINUE +}IMMED_TASK_ERR; + + + +/************************************** + インターバル起動 + *************************************/ +typedef void task_status; + + +/************************************** + 逐一起動のタスクリスト + 廃止になるかもしれないが + *************************************/ +typedef IMMED_TASK_ERR task_status_immed; + + +#endif diff --git a/branches/sim/renge/renge_task_config.rb b/branches/sim/renge/renge_task_config.rb new file mode 100644 index 0000000..c2de509 --- /dev/null +++ b/branches/sim/renge/renge_task_config.rb @@ -0,0 +1,59 @@ +#!/usr/bin/ruby -Ks + +tasklist = Array.new + + +if( ARGV[0] == nil ) + printf( "既定ファイル renge_tasks.txt を使用します" ) + datfile = "renge_tasks.txt" +else + datfile = ARGV[0] +end + +if( !File.exist?( datfile ) ) + printf("設定ファイルが見つかりません。") + exit( 1 ) +end + + +setting = File.open( datfile ) + +setting.each{|dat| + dat.chomp! + if( dat != nil ) + tasklist << dat + end +} + +tasklist.each{|dat| + printf( "\n%s" , dat ) +} +printf( "\n----------\nタスク数 %d \n", tasklist.size ) + + +#----- 静的タスクの列挙 ------------------------------------------------------- +conf = File.new( "renge_task_intval.h", "w+" ) + +conf << "/*スクリプトによる自動生成です。手動で書き換えない方がよいです*/\n\n" +conf << "#ifndef __renge_task__\n#define __renge_task__\n\n" +conf << "#include \"renge_defs.h\"\n\n" + +conf << "enum {\n " +tasklist.each{|dat| + conf << "TSK_" << dat.upcase << ", " +} +conf << "TSK_LAST \n };\n\n" + + +tasklist.each{|dat| + conf << "extern void tsk_" << dat << "();\n" +} +conf << "\n" + +conf << "const void ( *tasks[ TSK_LAST ] )() = {\n" +tasklist.each{|dat| + conf << " tsk_" << dat << ",\n" +} +conf << " };\n" + +conf << "\n#endif\n" diff --git a/branches/sim/renge/renge_task_immediate.h b/branches/sim/renge/renge_task_immediate.h new file mode 100644 index 0000000..7c5016d --- /dev/null +++ b/branches/sim/renge/renge_task_immediate.h @@ -0,0 +1,25 @@ +#ifndef __tasks__ +#define __tasks__ + +#include "renge_defs.h" + +// ************************************* +#define TASK_IMMED_RUN_LIST_MAX 10 + + +extern task_status_immed tski_do_command0( ); +extern task_status_immed tski_ntr_pmic_comm(); +extern task_status_immed tski_acc_read(); +extern task_status_immed tski_acc_write(); +//extern task_status_immed tski_acc_hosu_set(); // accero.h +extern task_status_immed tski_mcu_reset(); +extern task_status_immed tski_vol_update(); + + +// ************************************* +#define TSK_IMM_EMPTY_ ( void * )( 0x0000 ) +#define TSK_IMM_DELETED_ ( void * )( 0x0001 ) + + + +#endif diff --git a/branches/sim/renge/renge_task_intval.h b/branches/sim/renge/renge_task_intval.h new file mode 100644 index 0000000..9b0d9ea --- /dev/null +++ b/branches/sim/renge/renge_task_intval.h @@ -0,0 +1,37 @@ +/*スクリプトによる自動生成です。手動で書き換えない方がよいです*/ + +#ifndef __renge_task__ +#define __renge_task__ + +#include "renge_defs.h" + +enum TSK +{ + TSK_SW, TSK_ADC, TSK_BATT, TSK_LED_POW, TSK_LED_WIFI, TSK_LED_NOTIFY, TSK_LED_CAM, TSK_MISC, TSK_STATUS, TSK_SYS, TSK_LAST + }; + +extern void tsk_sw(); +extern void tsk_adc(); +extern void tsk_batt(); +extern void tsk_led_pow(); +extern void tsk_led_wifi(); +extern void tsk_led_notify(); +extern void tsk_led_cam(); +extern void tsk_misc(); +extern void tsk_status(); +extern void tsk_sys(); + +const void ( *tasks[ TSK_LAST ] )() = { + tsk_sw, + tsk_adc, + tsk_batt, + tsk_led_pow, + tsk_led_wifi, + tsk_led_notify, + tsk_led_cam, + tsk_misc, + tsk_status, + tsk_sys, + }; + +#endif diff --git a/branches/sim/renge/renge_tasks.txt b/branches/sim/renge/renge_tasks.txt new file mode 100644 index 0000000..73af545 --- /dev/null +++ b/branches/sim/renge/renge_tasks.txt @@ -0,0 +1,11 @@ +sw +adc +batt +led_pow +led_wifi +led_notify +led_cam +misc +status +debug +sys diff --git a/branches/sim/rtc.c b/branches/sim/rtc.c new file mode 100644 index 0000000..ce00e45 --- /dev/null +++ b/branches/sim/rtc.c @@ -0,0 +1,169 @@ +/* ======================================================== + RTC + ======================================================== */ +#pragma sfr +#pragma inline + + +#include "incs.h" + + + +// ======================================================== +u8 rtc_work[7]; +bit rtc_lock; +bit rtc_dirty; +bit rtc_alarm_dirty; + + +/* ======================================================== + ペリフェラルの初期化 + レジスタの電池交換ビットのセット + ======================================================== */ +void RTC_init( void ) +{ + + if( !RTCEN ) // ビットが立っていたらリブート + { + RTCEN = 1; // モジュールON + + // RTC設定 + RTCC0 = 0b00001000; /* 動作停止、24時間制、32k出力「まだなし」、定周期割り込みなし */ + RTCC1 = 0b11000000; /* アラーム割り込み有効&動作開始 */ + RTCC2 = 0b10000000; /* インターバル:32k/2^6=2ms、RTCDIV出力なし */ + + HOUR = 0x00; + MIN = 0x00; + SEC = 0x00; + MONTH = 0x01; + DAY = 0x01; + WEEK = 0x01; // Mon + YEAR = 0x01; + + ALARMWW = 0x7F; + + vreg_ctr[VREG_C_MCU_STATUS] |= REG_BIT_RTC_BLACKOUT; + } + // 割り込み設定 + RTCIF = 0; + RTCIIF = 0; + RTCMK = 1; /* 割り込み(定周期)禁止 */ + RTCIMK = 0; /* 割り込み(アラーム&インターバル)許可 */ + + RTCE = 1; /* 動作開始 */ + + RWAIT = 1; + while( !RWST ) + {;} + RWAIT = 0; + + rtc_lock = false; + rtc_dirty = false; + rtc_alarm_dirty = false; +} + + + +/* ======================================================== + RTC アラーム割り込み + ======================================================== */ +__interrupt void int_rtc( ) +{ + RWAIT = 1; + while( !RWST ) + {;} + // 日付も指定日で + if( ( vreg_ctr[VREG_C_RTC_ALARM_DAY] == DAY ) + && ( vreg_ctr[VREG_C_RTC_ALARM_MONTH] == MONTH ) + && ( vreg_ctr[VREG_C_RTC_ALARM_YEAR] == YEAR ) ) + { + set_irq( VREG_C_IRQ1, REG_BIT_RTC_ALARM ); + } + RWAIT = 0; +} + + + +/* ======================================================== + RTC のリード + レジスタは、sec,min,hour,week,day,month,year の順 + ======================================================== */ +void rtc_buf_reflesh( ) +{ + if( !rtc_lock ) + { + rtc_lock = true; + RWAIT = 1; + while( !RWST ) + {;} + + memcpy( &vreg_ctr[VREG_C_RTC_SEC], &SEC, 7 ); + RWAIT = 0; +// renge_task_immed_add( tski_rtc_close ); + } +} + + + +/* ======================================================== + RTC のライト + set_rtc_close と対で使って下さい。 + こいつはバッファにコピーするだけで、 + 実際にRTCにセットするのはset_rtc_close()です。 + ======================================================== */ +void set_rtc( u8 adrs, u8 data ) +{ + if( !rtc_dirty ) + { + rtc_dirty = true; + memcpy( rtc_work, &SEC, 7 ); +// renge_task_immed_add( tski_rtc_close ); // I2C終了時に行う + } + rtc_work[adrs] = data; +} + + + +/* ======================================================== + 必要ならば、RTCレジスタの更新 + ======================================================== */ +// task_status_immed tski_rtc_close(){ +void rtc_unlock( ) +{ + // リードロック + rtc_lock = false; + + // ライトロック + if( rtc_dirty ) + { + rtc_dirty = false; + RWAIT = 1; + while( !RWST ) + {;} + memcpy( &SEC, rtc_work, 7 ); + RWAIT = 0; + } + + // アラームセット + if( rtc_alarm_dirty ) + { + rtc_alarm_dirty = false; + WALE = 0; + ALARMWM = vreg_ctr[VREG_C_RTC_ALARM_MIN]; + ALARMWH = vreg_ctr[VREG_C_RTC_ALARM_HOUR]; + WALE = 1; + } +} + + + + + +/* ======================================================== + RTC システムチックタイマ割り込みベクタ + 2^6/fXT(1.953125 ms) + ======================================================== */ +__interrupt void int_rtc_int( ) +{ + renge_flg_interval += 1; // インクリメント/デクリメント命令を使うので DI()不要 +} diff --git a/branches/sim/rtc.h b/branches/sim/rtc.h new file mode 100644 index 0000000..f189a89 --- /dev/null +++ b/branches/sim/rtc.h @@ -0,0 +1,21 @@ +#ifndef __rtc_h__ +#define __rtc_h__ + + +void RTC_init( void ); +void rtc_buf_reflesh( ); +void set_rtc( u8 adrs, u8 data ); + +//task_status_immed tski_rtc_close(); +void rtc_unlock( ); + +// ------------------------------------ +#define RTC_32k_on() { RCLOE0 = 1; } +#define RTC_32k_off() { RCLOE0 = 0; } + + +// ------------------------------------ +extern bit rtc_alarm_dirty; + + +#endif diff --git a/branches/sim/self_flash.c b/branches/sim/self_flash.c new file mode 100644 index 0000000..a22536b --- /dev/null +++ b/branches/sim/self_flash.c @@ -0,0 +1,600 @@ +/* ======================================================== + 自己アップデータ + ======================================================== */ +#pragma SFR +#pragma di +#pragma ei +#pragma nop +#pragma stop +#pragma halt + + +#include "incs_loader.h" + +#include +#include "fsl_user.h" +#include "i2c_ctr.h" + +#include "pool.h" +#include "magic.h" + +#include "pm.h" + +// ======================================================== +const u8 fsl_fx_MHz_u08 = 8; +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 + +// ↓ブロック番号(1ブロック=1kB) +#define INACTIVE_BOOTSECT_TOP 4 +#define FIRM_TOP 8 +#define FIRM_SIZE 12 +#define ALTERNATE_FIRMTOP 20 + + +#ifdef _MCU_BSR_ +#define ACKD ACKD1 +#define ACKE ACKE1 +#define COI COI1 +#define IICAEN IICA1EN +#define IICAPR0 IICAPR10 +#define IICRSV IICRSV1 +#define IICA IICA1 +#define IICAIF IICAIF1 +#define IICAMK IICAMK1 +#define IICAPR1 IICAPR11 +#define IICCTL0 IICCTL01 +#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 +#endif + + + +// ======================================================== +static void FSL_Open( void ); +static void FSL_Close( void ); +void firm_restore( ); + +static err my_FSL_Init(); +static err firm_duplicate( u8 block_src, u8 block_dest ); + +#ifdef _DBG_LED_PRINT_ +void alert( u8 ); +void led_print( u8 ); +#else +# define alert( x ) ; +# define led_print( x ) ; +#endif + + +// ======================================================== +extern uni_pool pool; + + +// 0.D以降 新アップデータ向け +// 新ファームは大丈夫? +#define N_MGC_L 0x1FF6 +#define N_MGC_T 0x4FF6 + + + +/* ======================================================== + I2Cで受信して、 + 書き込み、 + チェックOK → 新ファームに切り替えて再起動 +     NG → 旧(現)ファームに戻して再起動 + (この関数からは戻りません) + ======================================================== */ +void firm_update( ) +{ + u8 target_block; + u8 split_write_count; // ブロックへちまちま書き込むカウンタ + + // 書き替え前準備 ///////////////////////////////////// + my_FSL_Init(); + + /* ファームのバックアップ + 開始アドレス、書き込み先の先頭”ブロック番号” (サイズは FIRM_SIZE) + 0x2000 - 0x4FFF を + 0x5000 - 0x7FFF (ブロック 20 - 31) にコピー + */ + firm_duplicate( FIRM_TOP, + ALTERNATE_FIRMTOP ); + + // 全ブロック削除 ///////////////////////////////////// + // 電源断を判定するため、最初に全クラスタ消去する + //(新ファームが書かれるところに残ってる、以前のファームのフッタを消したい) + for( target_block = INACTIVE_BOOTSECT_TOP; + target_block < ALTERNATE_FIRMTOP; + target_block += 1 ) + { + FSL_Erase( target_block ); + } + + + // 書き替え /////////////////////////////////////////// + // ●ストップコンディションが来るまで続ける + // ●終わったら、スタートアップルーチンに飛ぶ + for( target_block = INACTIVE_BOOTSECT_TOP; + target_block < ALTERNATE_FIRMTOP; + target_block += 1 ) + { + u8 my_spd; + +/* すでに消してある。でないと中断されたとき終了してるか判別出来ない +// // 新ファーム領域削除 +// FSL_Erase( target_block ); +*/ + // 分割書き込み + for( split_write_count = 0; + split_write_count < SELF_UPDATE_SPLIT_WRITE_NUM; + split_write_count += 1 ) + { + u8* p_buffer = &pool.self_update_work[0]; + u16 buff_written_size = 0; + + WDT_Restart( ); + + // I2Cから書き込みデータをバッファにためる + do + { + while( !IICAIF && !SPD ) + {;} + my_spd = SPD; + IICAIF = 0; + *p_buffer = IICA; + WREL = 1; + p_buffer += 1; + buff_written_size += 1; + } + while( ( buff_written_size != SELF_UPDATE_BUFF_SIZE ) + && !SPD ); + + my_spd += 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 ) ) + + != FSL_OK ) + { + alert(1); + // 書き込み後のチェックエラー + // リストア + firm_duplicate( ALTERNATE_FIRMTOP, FIRM_TOP ); + FSL_ForceReset(); // リセット + // FSL_SwapBootCluster( ); // ブートスワップ「せずに」再起動って出来ないらしい + // 戻ってこない // + } + + if( my_spd != 0 ) + { + break; + } + } + + // 1ブロック書き込み完了。内部ベリファイを行う + if( FSL_IVerify( target_block ) != FSL_OK ){ + alert(2); + // 再度消去→書き込み ベリファイを繰り返すだけじゃダメでした... todo…? + // リストア + firm_duplicate( ALTERNATE_FIRMTOP, FIRM_TOP ); + FSL_ForceReset(); // リセット + // FSL_SwapBootCluster( ); // ブートスワップ「せずに」再起動って出来ないらしい + // 戻ってこない // + } + + if( my_spd != 0 ) + { + break; + } + } + + LREL = 1; + + // 書き込んだファームのチェック // + { + u8 i; + u8 comp = 0; + + // ローダーのマジックと、本文の末尾のマジックは同じか確認 + for( i = 0; i < sizeof( __TIME__ ); i++ ) + { + comp += (u8)(( (*( __far u8 * ) ( N_MGC_L + i )) == (*( u8 * ) ( N_MGC_T + i ) )) ? 0 : 1); + } + if( *( __far u8 * )( N_MGC_L +2 ) != ':' ) // 消去済のまま + { + comp += 1; + } + + if( comp == 0 ) + { + // OK! + FSL_InvertBootFlag( ); + FSL_SwapBootCluster( ); // リセットせずに頭から。FSL_Closeは不要 + } + else + { + // データ(マジックナンバーしか見てない)エラー + // リストア + alert(3); + + firm_duplicate( ALTERNATE_FIRMTOP, FIRM_TOP ); + FSL_ForceReset(); // リセット + // FSL_SwapBootCluster( ); // ブートスワップ「せずに」再起動って出来ないらしい + } + // 戻ってこない // + } +} + + + + +/* ======================================================== +  ■ファームをバックアップ領域からリストアします。 +  チェック後、最後の最後でブートスワップするので、 + ここではブートスワップは不要です。 + + ======================================================== */ +void firm_restore( ) +{ + DBG_LED_on; + PM1.5 = 0; + + // バックアップは正常? // + { + u16 i; + u8 comp = 0; + + for( i = 0; i < sizeof( __TIME__ ); i++ ) // sizeof( __TIME__ ) = 8 らし + { + comp += ( *( __far u8 * )( MGC_LOAD + i ) == *( u8 * )( MGC_HEAD_BKUP + i ) ) ? 0 : 1; + comp += ( *( u8 * )( MGC_HEAD_BKUP + i ) == *( u8 * )( MGC_FOOT_BKUP + i ) ) ? 0 : 1; + } + if( *( u8 * )( MGC_FOOT_BKUP ) == 0xFF ) + { + comp += 1; + } + + if( comp != 0 ) + { + // バックアップ領域も壊れた... + comp = 0; + + // 3.3Vが上がらないと困る + EI( ); + iic_mcu_start( ); + RESET2_ast; + FCRAM_RST_ast; + GYRO_DISABLE(); + PM_LDSW_on(); + wait_ms( 1 + DELAY_PM_TW_PWUP ); + PM_VDD_on( ); + + while(1) + { + WDT_Restart(); + + { + // 赤LED ピコピコ + comp++; + P1.5 = ( comp == 1 || comp == 3 )? 1: 0; + if( comp == 8 ) + { + comp = 0; + } + } + + { + // 電源ボタンで電源off + static u8 sw_hold_count; + + if( !SW_POW_n ) + { + sw_hold_count++; + } + else + { + sw_hold_count = 0; + } + + if( sw_hold_count > 16 ) + { + sw_hold_count = 0; + // 電源off + PM_LDSW_off( ); + break; + } + } + + // ウェイト + for( i = 1; i != 0; i++ ) + { + NOP(); + NOP(); + NOP(); + NOP(); + } + } + { + // ど、どうしよう…。 + + KRM = ( KR_SW_POW ); // Mask ではなく、Modeなのだそうだ。紛らわしい + MK0 = 0xFFFF; + MK1 = ~( INT_MSK1_KR ); + MK2L = 0xFF; + + // PU5 そのまま + PU7 = 0b00001000; // PWSWI + PU20 = 0x00; // SW_HOME 停止 + + STOP( ); + + mcu_wdt_reset; + } + } + } + + + if( my_FSL_Init() != ERR_SUCCESS ){ + alert(1); + } + + /* ファームのリストア + 0x4800 - 0x7FFF (ブロック 18 - 27) から + 0x2000 - 0x47FF (ブロック 8 - 17) へコピー + */ + if( firm_duplicate( ALTERNATE_FIRMTOP, FIRM_TOP ) != ERR_SUCCESS ) + { + alert(2); + } + DBG_LED_off; + + // todo + //  リストア失敗したら、LEDちかちかとかさせて、サービス送りにしてもらう? + +/* +// リブート + if( FSL_InvertBootFlag() != ERR_SUCCESS ) + { + alert(3); + } +*/ + FSL_ForceReset(); // リセット + // FSL_SwapBootCluster( ); // ブートスワップ「せずに」再起動って出来ないらしい +} + + + +// ======================================================== +static void FSL_Open( void ) +{ + /* save the configuration of the interrupt controller and set */ +#ifdef FSL_INT_BACKUP + fsl_MK0L_bak_u08 = MK0L; /* if (interrupt backup required) */ + fsl_MK0H_bak_u08 = MK0H; /* { */ + fsl_MK1L_bak_u08 = MK1L; /* */ + fsl_MK1H_bak_u08 = MK1H; /* save interrupt controller */ + fsl_MK2L_bak_u08 = MK2L; /* configuration */ + fsl_MK2H_bak_u08 = MK2H; /* */ + MK0L = FSL_MK0L_MASK; /* */ + MK0H = FSL_MK0H_MASK; /* */ + MK1L = FSL_MK1L_MASK; /* prepare interrupt controller */ + MK1H = FSL_MK1H_MASK; /* for selfprogramming */ + MK2L = FSL_MK2L_MASK; /* */ + MK2H = FSL_MK2H_MASK; /* } */ +#endif + + while( DST1 ){;} // DMA停止 + DEN1 = 0; + + MK0 = 0xFFFF; + MK1 = 0xFFFF; + MK2 = 0xFFFF; +/* + LVIM = 0b00000010; + LVIS = 0x08; + LVIM = 0b10000010; +*/ + FSL_FLMD0_HIGH; // フラッシュ書き替え許可 +} + + + +/*----------------------------------------------------------------------------------------------*/ +/* leave the "user room" and restore previous conditions */ +/*----------------------------------------------------------------------------------------------*/ +static void FSL_Close( void ) +{ + // 何か後始末? + + FSL_FLMD0_LOW; // フラッシュライトプロテクト + +#ifdef FSL_INT_BACKUP + MK0L = fsl_MK0L_bak_u08; /* do{ */ + MK0H = fsl_MK0H_bak_u08; /* restore interrupt controller */ + MK1L = fsl_MK1L_bak_u08; /* configuration */ + MK1H = fsl_MK1H_bak_u08; /* */ + MK2L = fsl_MK2L_bak_u08; /* */ + MK2H = fsl_MK2H_bak_u08; /* } */ +#endif +} + + + +/* ======================================================== + マイコン内でファームをコピーします。 + __far u8 * p_rom コピー元の先頭アドレス + block_dest コピー先の先頭ブロック + + コピー先に書けるようにmy_FSL_Initをあらかじめ実行する必要があります。 + ======================================================== */ +//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 ); + u8 retry_error; + + led_print(1); + + // 書き込み先ブロックの数だけ繰り返す + for( target_block = block_dest; + target_block < ( block_dest + FIRM_SIZE ); + target_block += 1 ) + { + led_print(2); + WDT_Restart( ); + // ブロック消去 + retry_error = 5 + 1; + while( FSL_BlankCheck( target_block ) != FSL_OK ) + { + led_print(3); + FSL_Erase( target_block ); + if( --retry_error == 0 ) + { + // フラッシュ寿命? + FSL_Close( ); + return ( ERR_ERR ); // リセット&復帰を試みる どうなるか知らん + } + } + + led_print(4); + // 分割書き込み分繰り返す + for( split_write_count = 0; + split_write_count < SELF_UPDATE_SPLIT_WRITE_NUM; + split_write_count += 1 ) + { + u16 buff_written_size; + u8* p_buff; + + // 書き込みデータをバッファにためる + buff_written_size = 0; + p_buff = &pool.self_update_work[0]; + do + { + *p_buff = *p_src; + p_src += 1; + p_buff += 1; + buff_written_size +=1; + } + 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 ) ) + != FSL_OK ) + { + // リカバリはリブート時 // + FSL_Close( ); + led_print(5); +// while(1){} + return ( ERR_ERR ); + } + } + led_print(6); + + // 1ブロック書き込み完了。内部電圧チェックを行う + while( FSL_IVerify( target_block ) != FSL_OK ) + { + // リカバリはリブート時 // + led_print(7); + return ( ERR_ERR ); + } + } + return( ERR_SUCCESS ); + +} + + + +/* ======================================================== + ======================================================== */ +static err my_FSL_Init() +{ + u8 rv; + + RTCE = 0; + + // 書き替え前準備 // + DI( ); + FSL_Open( ); // 割り込み禁止など + + FSL_Init( &pool.self_update_work[0] ); // ライブラリ初期化。割り込み中断考慮せず + rv = FSL_ModeCheck( ); // ライトプロテクトチェック。失敗することを考慮せず + + return( (err)rv ); +} + + +task_status_immed tski_mcu_reset() +{ + // 普通に再起動 + my_FSL_Init(); + + FSL_ForceReset(); // リセット + FSL_Close( ); + + // 保険? // + mcu_wdt_reset; + return( ERR_SUCCESS ); // no reach +} + + +#ifdef _DBG_LED_PRINT_ +// P1.5 = led_pow_red_old +void alert( u8 num ) +{ + u8 i; + + while(1) + { + WDT_Restart(); + P1.5 = 1; + for( i = 0; i < num; i++ ) + { + DBG_LED_on; + DBG_LED_off; + } + P1.5 = 0; + } +} + + +void led_print( u8 num ) +{ + u8 i; + + DBG_LED_on; + for( i = 0; i < num; i++ ) + { + P1.5 = 1; + P1.5 = 0; + } + DBG_LED_off; +} +#endif diff --git a/branches/sim/self_flash.h b/branches/sim/self_flash.h new file mode 100644 index 0000000..768565e --- /dev/null +++ b/branches/sim/self_flash.h @@ -0,0 +1,9 @@ +#ifndef _self_flash_h_ +#define _self_flash_h_ + + +void firm_update(); + + +#endif + diff --git a/branches/sim/sw.c b/branches/sim/sw.c new file mode 100644 index 0000000..58b5b41 --- /dev/null +++ b/branches/sim/sw.c @@ -0,0 +1,194 @@ +#pragma SFR +#pragma NOP +#pragma HALT +#pragma STOP + +#include "incs.h" + +#include "i2c_twl.h" +#include "i2c_ctr.h" +#include "led.h" +#include "pm.h" +#include "rtc.h" +#include "sw.h" + + +//========================================================= +/* + vreg_ctrから読みたいのでヘッダへ +#define INTERVAL_TSK_SW 8 +#define CLICK_THRESHOLD 2 + +#define HOLD_THREASHOLD (u8)( 2000 / INTERVAL_TSK_SW ) +#define FORCEOFF_THREASHOLD (u8)( 4000 / INTERVAL_TSK_SW ) +*/ +#define TIME_MUKAN (u8)( 300 / INTERVAL_TSK_SW ) +#define TIME_MUKAN_PWSW (u16)( 8000 / INTERVAL_TSK_SW ) + +//========================================================= +u16 SW_pow_count; +bit SW_pow_mask; + +u8 SW_home_count, SW_wifi_count, SW_home_count_rel; +u8 sw_wifi_mukan_time; + +bit SW_HOME_n; + +u16 off_timeout_timer; + +u16 sw_pwsw_mukan_time; + +//========================================================= +// 押した時間を数える。押しっぱなしでも0に戻らない +// maskが非0の時は、一度離すまで無視する +#define count_sw_n( sw, counter, mask ) \ + { \ + if( sw ){ \ + mask = 0; \ + counter = 0; \ + }else{ \ + if( mask != 0 ){ \ + counter = 0; \ + }else{ \ + counter += 1; \ + if( counter == 0 ) counter = -1; \ + } \ + } \ + } + + +#define chk_clicked( button, count, irq_bit_name ) \ + if( !button ) \ + { \ + if( count <= CLICK_THRESHOLD ) \ + { \ + count += 1; \ + } \ + if( count == CLICK_THRESHOLD ) \ + { \ + count += 1; \ + set_irq( VREG_C_IRQ0, irq_bit_name ); \ + } \ + } \ + else \ + { \ + count = 0; \ + } + + + +/* ======================================================== + スイッチの監視 +  チャタリングをはねたり、長押しや、押したトリガなどの検出など + ======================================================== */ +void tsk_sw( ) +{ + static u8 task_interval = 1; + + if( system_status.pwr_state == ON_TRIG ) + { + SW_pow_count = 0; // カウントクリア + } + + if( --task_interval != 0 ) + { + return; + } + else + { + task_interval = (u8)( INTERVAL_TSK_SW / SYS_INTERVAL_TICK ); + } + + + // 8ms 毎にきます + switch ( system_status.pwr_state ) + { + case ( ON ): + case ( SLEEP ): + case ( OFF ): + case ( ON_CHECK ): + // 実機の場合 + if( ! system_status.taikendai ) + { + + // 電源スイッチの監視 // + if( SW_pow_count == ( TIME_PWSW_CLICK ) ) // クリック時間に到達 + { + set_irq( VREG_C_IRQ0, REG_BIT_SW_POW_CLICK ); + } + else if( SW_pow_count == ( HOLD_THREASHOLD ) ) // 長押しに到達 + { + set_irq( VREG_C_IRQ0, REG_BIT_SW_POW_HOLD ); + if( off_timeout_timer == 0 ) // 強制電源断カウントダウン開始、何度も発動しないように。 + { + off_timeout_timer = vreg_ctr[ VREG_C_OFF_DELAY ] * 16; + } + } + + if( off_timeout_timer != 0 ) // 長押し割り込み後、タイムアウトで強制オフ。 + { + off_timeout_timer -= 1; + if( off_timeout_timer == 1 ) + { + force_off = true; + } + } + + }else{ + // 電源スイッチの監視 // + if( SW_pow_count == ( TIME_PWSW_CLICK ) ) + { + if( sw_pwsw_mukan_time == 0 ) + { + set_irq( VREG_C_IRQ0, REG_BIT_SW_POW_CLICK ); + // いやなタイミングでPWSWを押すとHOMEメニューに入れてしまうのを回避するためのマスクタイマー + sw_pwsw_mukan_time = TIME_MUKAN_PWSW; + } + } + else if( SW_pow_count == ( HOLD_THREASHOLD ) ) + { + force_off = true; + } + + if( sw_pwsw_mukan_time != 0 ) + { + sw_pwsw_mukan_time--; + } + } + + count_sw_n( SW_POW_n, SW_pow_count, SW_pow_mask ); // ボタン押し時間のカウント + + // HOME スイッチ // + switch( system_status.model ) + { + case( MODEL_JIKKI ): + case( MODEL_SHIROBAKO ): + SW_HOME_n = SW_HOME_n_JIKKI; // 接続先のポートが違うため + break; + case( MODEL_TS_BOARD ): + SW_HOME_n = SW_HOME_n_TSBOARD; + break; + default: + SW_HOME_n = 1; // 放されてる状態 + } + + + chk_clicked( SW_HOME_n, SW_home_count, REG_BIT_SW_HOME_CLICK ); + chk_clicked( !SW_HOME_n, SW_home_count_rel, REG_BIT_SW_HOME_RELEASE ); + + // wifi sw // + /// 最悪な実装なのはわかっているが、メモリ不足と、市場に出てしまった不良スイッチを救うため + if( sw_wifi_mukan_time != 0 ) + { + sw_wifi_mukan_time--; + } + else + { + chk_clicked( SW_WIFI_n, SW_wifi_count, REG_BIT_SW_WIFI_CLICK ); + if( SW_wifi_count == CLICK_THRESHOLD +1 ) // 押した判定発生! + { + sw_wifi_mukan_time = TIME_MUKAN; + } + } + } +} diff --git a/branches/sim/sw.h b/branches/sim/sw.h new file mode 100644 index 0000000..abe9715 --- /dev/null +++ b/branches/sim/sw.h @@ -0,0 +1,20 @@ +#ifndef _sw_ +#define _sw_ + +#include "config.h" + +extern u16 SW_pow_count; +extern bit SW_pow_mask; + +#define INTERVAL_TSK_SW 8 +#define CLICK_THRESHOLD 5 + +#define HOLD_THREASHOLD (u16)( 3000 /INTERVAL_TSK_SW ) +#define TIME_PWSW_CLICK (u8)( 220 /INTERVAL_TSK_SW ) +#define FORCEOFF_THREASHOLD (u8)( 12000 /INTERVAL_TSK_SW /16 ) + + +extern u16 off_timeout_timer; +#define clear_pow_off_countdown(){ off_timeout_timer = 0; force_off = false; } + +#endif diff --git a/branches/sim/task_debug.c b/branches/sim/task_debug.c new file mode 100644 index 0000000..1745e4e --- /dev/null +++ b/branches/sim/task_debug.c @@ -0,0 +1,123 @@ +#pragma SFR +#pragma NOP +#pragma HALT +#pragma STOP + +#include "incs_loader.h" +//#include "incs.h" +#include "renge\renge.h" +#include "pm.h" +#include "accero.h" + + +/* ======================================================== + ======================================================== */ + +// 7セグ 4バイト版 +# define IIC_SLA_DBG_MONITOR 0x44 + + +#if 0 + +注意! タスクリストからも外してますので、使うなら復活させて下さい! + +void tsk_debug( ) +{ +// u8 temp; + +#ifdef _DBG_PEDO_AUTO_ENABLE_ + if( system_status.pwr_state == ON_TRIG ){ + // 歩数計を起動時にonにする + vreg_ctr[ VREG_C_ACC_CONFIG ] = 0x03; + renge_task_immed_add( tski_acc_hosu_set ); + } +#endif + + /* + if( system_status.pwr_state == ON_TRIG ){ + { + static u8 count = 0; + // デバッグLED(8bit)の初期化 + 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 ); + } + } + */ + +#ifdef _PMIC_TEST_ + if( ( system_status.pwr_state == ON ) || ( system_status.pwr_state == SLEEP ) ) + { + iic_mcu_write_a_byte( IIC_SLA_DBG_MONITOR, 0x03, 0 ); + } +#endif + +// 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_3D ] ); +// 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_3D ] ); +// 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_STATUS ] ); +// iic_mcu_write_a_byte( IIC_SLA_DBG_MONITOR, 0, vreg_ctr[ VREG_C_ACC_ZH ] ); + + /* + { + u8 str[4]; + + if( ( system_status.pwr_state == ON ) || ( system_status.pwr_state == SLEEP ) ) + { + str[3] = vreg_ctr[ VREG_C_FREE0 ]; + str[2] = vreg_ctr[ VREG_C_FREE1 ]; + str[1] = vreg_ctr[ VREG_C_STATUS ]; + str[0] = vreg_ctr[ VREG_C_RTC_SEC ]; + + str[3] = vreg_ctr[ VREG_C_SND_VOL ]; + str[2] = vreg_ctr[ VREG_C_3D ]; + str[1] = vreg_ctr[ VREG_C_ACC_CONFIG ]; + str[0] = SEC; + iic_mcu_write( IIC_SLA_DBG_MONITOR, 0x03, 4, &str ); + } + } + */ +} + +#endif + + +#if 0 +/* ======================================================== + タスクひな形 + ======================================================== */ +task_interval tsk_hina( ) +{ + switch ( system_status.pwr_state ) + { + case ON_CHECK: + case ON_TRIG: + case ON: + case SLEEP: + case OFF_TRIG: + default: + } + + return ( 次の起 ・ョまでのシ ・X ・e ・ tick ・・); // 毎 tic 呼ばれることになります +} + + +// ポインタで何かもらうのは危険な気がしてきた +/* このように使う + renge_task_immed_add( タスク関数へのポインタ ); +*/ +task_status_immed tski_hina( u8 * arg ) +{ + return ( ERR_FINISED ); + // ERR_FINISED タスクを削除 + // ERR_CONTINUE 次になんか割り込みなり、ユーザー操作なり、システムチックが + // 来たときに再度実行 +} + + +#endif diff --git a/branches/sim/task_misc.c b/branches/sim/task_misc.c new file mode 100644 index 0000000..750c834 --- /dev/null +++ b/branches/sim/task_misc.c @@ -0,0 +1,316 @@ +#pragma SFR +#pragma NOP +#pragma HALT +#pragma STOP + +#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 + + + +// ======================================================== +bit twl_ver_read; +bit going_to_sleep; + + +void update_LED_3D(); +void check_twl_vol_irq(); + + +/* ======================================================== + ステータスレジスタなど + ======================================================== */ +void tsk_misc( ) +{ + /* ======================================================== + 加速度センサ割り込みピンがオリジナルマイコンには無いので + ポーリングする。 + 歩数計用 + BSRマイコンはaccero.cで割り込みルーチンからタスク登録します。 + ======================================================== */ + // 割り込みの取りこぼし? + if( ACC_VALID ) + { + if( renge_task_immed_add( tski_cbk_accero ) == ERR_SUCCESS ){ + // NOP(); + } + } + + if( system_status.pwr_state == ON ) + { + /* ======================================================== + PM互換レジスタへの書き込み + ポーリングしかしてない。割り込み? + ======================================================== */ + if( !PM_IRQ_n ) + { + renge_task_immed_add( tski_ntr_pmic_comm ); + // 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(); +} + + + +/* ======================================================== + TWLがVolを書くのと、スライダの操作がバッティングすると + 不整合が起こる事があり、それを防ぐ + TWLでは8通常時、押しボタンは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_LED ///////////////////////////////////// +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 -= 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 tski_do_command0( ) +{ + // command0 本体電源など + u8 temp_command = vreg_ctr[VREG_C_COMMAND0]; + vreg_ctr[VREG_C_COMMAND0] = 0; + + 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 ( ERR_CONTINUE ); + } +*/ + return ( ERR_FINISED ); +} + + + +/* ======================================================== + 互換向け、TWLアプリへの割り込み + 仮想レジスタの書き込み時に行います。 + ======================================================== */ + +u16 _dbg_rcomp; +extern u8 raw_adc_temperature; + +extern u8 iic_burst_state; +extern bit temp_zone_charge_disable; +extern bit bt_authorized; + + +/* ======================================================== + デバッグ用にいろいろ読んできます。 + 返値はデータそのもの + 出てくる順場は、 + 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 + ======================================================== */ + +#define KOUMOKU 9 +u8 extinfo_read() +{ + u8 infos[ KOUMOKU +1 ]; + + if( iic_burst_state > KOUMOKU ) + { + return( 0x73 ); + } + + // static でとるほどのものでないので毎回スタックからとってくる + // switchとかにするとromが困る... なんだかなぁ。 + infos[0] = system_status.captureBox? MODEL_CAPTURE_BOX + : ( system_status.is_dev? MODEL_ISBAKO: (u8)system_status.model ); + infos[1] = pmic_version; + infos[2] = battery_manufacturer; + infos[3] = mgic_version[0]; + infos[4] = mgic_version[1]; + infos[5] = (u8)( _dbg_rcomp & 0xFF ); + infos[6] = raw_adc_temperature; + infos[7] = ( !temp_zone_charge_disable | ( bt_authorized << 1 ) ); + infos[8] = 1; // system_status.info_fullcolor; + infos[9] = system_status.family; + // 項目足すときは気をつけてね!! // + + iic_burst_state++; + return( infos[ iic_burst_state -1 ] ); +} + +#ifdef i2c_timeout_test +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 + diff --git a/branches/sim/task_status.c b/branches/sim/task_status.c new file mode 100644 index 0000000..03f74e5 --- /dev/null +++ b/branches/sim/task_status.c @@ -0,0 +1,94 @@ +#pragma SFR +#pragma NOP +#pragma HALT +#pragma STOP + +#include "incs_loader.h" +#include "renge\renge.h" +#include "pm.h" + +#include "accero.h" +#include "adc.h" +#include "i2c_mcu.h" + + + +// ======================================================== +#define INTERVAL_TSK_STATUS 4 + + +extern bit BT_CHG_STAT_Change; + + +/* ======================================================== + ステータスレジスタなど + ======================================================== */ +void tsk_status( ) +{ + static u8 interval_task_status = 0; + static u8 state_old; // ステータス変化検出→割り込み の為 + u8 diff; + + if( interval_task_status != 0 ) + { + interval_task_status -= 1; + return; + } + else + { + interval_task_status = (u8)( INTERVAL_TSK_STATUS / SYS_INTERVAL_TICK ); + } + + // 蓋開けチェック + set_bit( SHELL_OPEN, vreg_ctr[VREG_C_STATUS], REG_BIT_ST_SHELL_OPEN ); + + // ステータスレジスタ関係 → 割り込み // + // pm.c で、その場で行います。 + // REG_BIT_LCD_ON/OFF + // REG_BIT_BL_ON/OFF + // REG_BIT_BT_DC_CONNECT/DISC + + diff = (u8)( vreg_ctr[VREG_C_STATUS] ^ state_old ); + if( diff != 0 ) + { + state_old = vreg_ctr[VREG_C_STATUS]; + + if( system_status.pwr_state == ON ) + { + if( diff & REG_BIT_BATT_CHARGE ) + { + BT_CHG_STAT_Change = true; + + // 充電状態に以下略 + if( vreg_ctr[VREG_C_STATUS] & REG_BIT_BATT_CHARGE ) + { + set_irq( VREG_C_IRQ1, REG_BIT_BT_CHG_START ); + } + else + { + set_irq( VREG_C_IRQ1, REG_BIT_BT_CHG_STOP ); + } + } + } + + if(( system_status.pwr_state == ON ) || + ( system_status.pwr_state == SLEEP ) + ) + { + if( diff & REG_BIT_ST_SHELL_OPEN ) + { + // 蓋の開け閉め + if( vreg_ctr[VREG_C_STATUS] & REG_BIT_ST_SHELL_OPEN ) + { + set_irq( VREG_C_IRQ0, REG_BIT_SHELL_OPEN ); + } + else + { + set_irq( VREG_C_IRQ0, REG_BIT_SHELL_CLOSE ); + } + } + } + } + return; +} + diff --git a/branches/sim/task_sys.c b/branches/sim/task_sys.c new file mode 100644 index 0000000..2356647 --- /dev/null +++ b/branches/sim/task_sys.c @@ -0,0 +1,578 @@ +#pragma SFR +#pragma NOP +#pragma HALT +#pragma STOP + +#include "incs.h" + +#include "i2c_twl.h" +#include "i2c_ctr.h" +#include "led.h" +#include "accero.h" +#include "pm.h" +#include "rtc.h" +#include "sw.h" +#include "adc.h" +#include "self_flash.h" + + +//========================================================= +#define WAIT_SHIROBAKO_POW_CONTROL 240 + + +//========================================================= +extern void nop8(); + + +static void chk_emergencyExit(); +static void force_off_check(); +static void send_getup_to_soc(); + + + +//========================================================= +extern bit info_led_off; +extern bit going_to_sleep; +extern bit bt_authorized; + +static u8 timeout_sleep; +extern u8 chg_led_override; + +#ifdef i2c_timeout_test +extern bit i2c_mcu_time_out_error; +#endif + +/* ======================================================== + マイコン内部で必要なもの +・省電力に入れる +  system_status.pwr_state == OFF_TRIG で、このタスクが呼ばれると、 + 省電力モードに入ります + ======================================================== */ +void tsk_sys( ) +{ + static u8 timeout = 0; + + switch ( system_status.pwr_state ) + { + case ON_CHECK: //------------------------------------------------------- + // スイッチ操作などで割り込みが発生し、スリープが解除されるとここに来ます。 + + if( system_status.poweron_reason == NONE ) + { + // スイッチで電源on + if( SW_pow_count != 0 ) + { + timeout = 0; + } + else + { + timeout += 1; + } + + if( timeout > 100 ) + { + system_status.pwr_state = OFF; // スイッチはノイズだった。寝る。 + renge_task_interval_run_force = true; + return; + } + + if( SW_pow_count < 10 ) + { + // もう少しスイッチの様子を見る + return; + } + // 電源投入 + system_status.poweron_reason = PWSW; + } + + SW_pow_mask = true; + + timeout = 0; + + // for debug +#ifdef _DEBUG_BT_FUEL_ + vreg_ctr[ VREG_C_DBG01 ] = 99; +#endif +#ifdef _DEBUG_BT_TEMP_ + vreg_ctr[ VREG_C_DBG01 ] = 0x80; +#endif + vreg_ctr[ VREG_C_COMMAND3 ] = 0; + + // 電源投入 // + iic_mcu_start( ); + + bt_force_update = false; + BT_chk(); // 実機やバッテリの判定、電池残量ICの設定 + +#ifndef _ALLOW_NOBATT_ + if( system_status.model == MODEL_JIKKI_NOBATT ) + { + renge_task_interval_run_force = true; + system_status.pwr_state = OFF_TRIG; + return; + } +#endif + + // 残量チェック + BT_get_left(); // 先に、BT_chk()が実行されている必要があります。 + if( +// ( vreg_ctr[VREG_C_BT_REMAIN] < 1 ) // こっちで判定すると電池がほとんど無いときに +// && // アダプタ差しても数分起動できなくなっちゃう + ( vreg_ctr[VREG_C_BT_VOLTAGE] < ( V_TH_ZERO / 256 ) ) + ) + { + // 電池が少ないので起動させない(電圧チェックもされてる) + renge_task_interval_run_force = true; + system_status.pwr_state = OFF_TRIG; + return; + } + + // ポートの設定 電源入れる前に。 + PM7.4 = 1; // SW_wifi + PM20.4 = 1; // sw_home + PM20.3 = 1; // wl_tx + PM2.3 = 1; // key_sel + PM2.5 = 1; // acc_valid1 + PM14.1 = 1; // acc_valid2 + + if( PM_sys_pow_on( ) != ERR_SUCCESS ) + { // 電源起動不可エラー + renge_task_interval_run_force = true; + system_status.pwr_state = OFF_TRIG; + return; + } + + // ここまで来ると、電源投入確定 // + + PU5.1 = 1; // 1:PM_CHARGE + PU7 = 0b00011101; // 4:SW_WIFI 3:SW_PWSW 2:PM_IRQ 0:PM_EXTDC_n + PU20.4 = 1; // SW_HOME + + if( system_status.poweron_reason == PWSW ) + { + // 電源ボタンでのonの時は、LEDを点灯させる + vreg_ctr[VREG_C_LED_POW] = LED_POW_ILM_AUTO; + } + else + { + // とりあえず、LED消灯状態で起動させる + vreg_ctr[VREG_C_LED_POW] = LED_POW_ILM_OFF; + } + + system_status.pwr_state = ON_TRIG; + + PM_LCD_vcom_set( ); // LCDの対向電圧値など書き込み + + break; + + case ON_TRIG: //------------------------------------------------------- +#ifdef i2c_timeout_test + LED_duty_pow_blu = 0; // debug + LED_duty_3d = 0; + LED_duty_notify_red = 0; + LED_duty_notify_grn = 0; + LED_duty_notify_blu = 0; + LED_pow_red = 0; + LED_CAM = 0; + i2c_mcu_time_out_error = false; +#endif + IIC_ctr_Init( ); + IIC_twl_Init( ); + RTC_32k_on( ); + + vreg_twl_init( ); + vreg_ctr_reset( ); + + KRM = 0b00000000; + PIF0 = 0; + + system_status.poweron_reason = NONE; + renge_task_interval_run_force = true; + + MK0 = INT_MSK0_RSV; + MK1 = INT_MSK1_RSV; + + iic_mcu_start(); + +#ifdef _MCU_BSR_ +// MK2 = ~( INT_MSK2_IIC_TWL | INT_MSK2_WIFI_TX_BSR | INT_MSK2_CODEC_PMIRQ ); +// PMK21 = 0; // wifi 使わない + PMK6 = 0; // pm_irq +#else + MK2L = ~INT_MSK2_WIFI_TX_KE3; +#endif + + // リブート時、ステータスを何となく更新 + if( system_status.reboot ) + { + u8 bl_status_temp; + + bl_status_temp = read_pmic( PM_REG_ADRS_BL ); + vreg_ctr[ VREG_C_STATUS ] |= (( bl_status_temp & 0x03 ) << 5 ); + set_bit( ( read_pmic( PM_REG_ADRS_VDD_LCD ) != 0 ), + vreg_ctr[ VREG_C_STATUS ], REG_BIT_LCD_POW ); + BT_chk(); + } + + LED_init( ); // reboot時の↑BT_Chk,BT_chk後に行いたい + + system_status.reboot = 0; + system_status.pwr_state = ON; + + // WDTリセット時、I2Cの初期化まで割り込み保留 + // ほんとはここにべた書きしたくないが... + if( ( vreg_ctr[ VREG_C_MCU_STATUS ] & REG_BIT_STATUS_WDT_RESET ) != 0 ) + { + set_irq( VREG_C_IRQ0, REG_BIT_IRQ_WDT_RESET ); + } + + break; + + case ON: //--------------------------------------------- + // PMICによる強制電源断チェック + // デバッガがreset1をアサートすることもある。そのときは全部リセット + chk_emergencyExit(); + + // SLP監視 + if( going_to_sleep ) // 絶対に SLP_REQ の前に予告が来る + { + timeout_sleep += 1; + if( timeout_sleep == 0 || // オーバーフローを期待。sleepするって言ったけど一瞬で起きて気がつかなかった + ( PIF0 && !SLP_REQ )) // slp割り込みが入った気がしたが、もう起きてしまった + { + PIF0 = 0; + send_getup_to_soc(); + } + if( PIF0 && SLP_REQ ){ + PIF0 = 0; + PM_VDD_ecoMode(); + system_status.pwr_state = SLEEP; + renge_task_interval_run_force = true; + } + } + + // 強制offカウント + force_off_check(); + +#ifndef _TAIKENDAI_SEISAN_SPECIAL_ + if( system_status.taikendai ) // アダプタが抜けたら自動で電源off + { + if( PM_EXTDC_n ) + { + system_status.pwr_state = OFF_TRIG; + } + } +#endif + + break; + + case SLEEP: //------------------------------------------ + chk_emergencyExit(); + // スリープから復帰 + if( !SLP_REQ ){ + PM_VDD_normMode(); + wait_ms( 5 ); // tdly_sw + send_getup_to_soc(); + system_status.pwr_state = ON; + } + + force_off_check(); + +#ifndef _TAIKENDAI_SEISAN_SPECIAL_ + if( system_status.taikendai ) // アダプタが刺さっていたら自動で電源on + { + if( PM_EXTDC_n ) + { + system_status.pwr_state = OFF_TRIG; + } + } + break; +#endif + + default: //--------------------------------------- + system_status.pwr_state = OFF_TRIG; + // no break // + case OFF_TRIG: //--------------------------------------- + // LED消灯を待つ + vreg_ctr[ VREG_C_LED_POW ] = LED_POW_ILM_OFF; + vreg_ctr[ VREG_C_LED_WIFI ] = WIFI_LED_OFF; + vreg_ctr[ VREG_C_LED_3D ] = LED_3D_ILM_OFF; + info_led_off = true; + if( LED_duty_pow_blu != 0 ) + { + return; + } + + clear_pow_off_countdown(); + + vreg_ctr[ VREG_C_ACC_CONFIG ] = 0x00; + tski_acc_hosu_set(); + + LED_stop( ); + IIC_ctr_Stop( ); + IIC_twl_Stop( ); + RTC_32k_off(); + + vreg_ctr[VREG_C_IRQ0] = 0; + vreg_ctr[VREG_C_IRQ1] = 0; + vreg_ctr[VREG_C_IRQ2] = 0; + vreg_ctr[VREG_C_IRQ3] = 0; + +// 電源オン条件の割り込みセット +// PWSW KR3 押すとL +// BG24 KR4 +// ふた開け INTP5 閉じるとL +// ACアダプタ INTP4 アダプタありでL +// RTC + while( iic_mcu_busy ) + {;} + + KRM = ( KR_SW_POW ); // Mask ではなく、Modeなのだそうだ。紛らわしい + 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.4 = 0; // SW_HOME 停止 + + IF0 = 0; + IF1 = 0; + IF2 = 0; + + IRQ0_disable; + + PM_sys_pow_off( ); + + P7.4 = 0; // SW_wifi + PM7.4 = 0; + + P20.4 = 0; // sw_home + PM20.4 = 0; + + P20.3 = 0; // WL_TX + PM20.3 = 0; + + P2.3 = 0; // KEY_SEL + PM2.3 = 0; + P2.5 = 0; // ACC_ready1 + PM2.5 = 0; + P14.1 = 0; // ACC_ready2 + PM14.1 = 0; + + iic_mcu_stop( ); + + system_status.pwr_state = OFF; + SW_pow_mask = true; + SW_pow_count = 0; + + + // no break // + + case OFF: + system_status.poweron_reason = NONE; + if( !PM_EXTDC_n ) + { + // アダプタが刺さってるときはこのブロックを繰り返す。 + BT_chk(); // 要ポーリング(電池抜かれ検出のため) + // ↑の中で必要だったらI2C_m_init呼んでます + + // アダプタ有り:充電温度監視 + if( SW_pow_count >= 10 ) // 電源スイッチが押されるのを待つ + { + // 電源投入 + system_status.pwr_state = ON_CHECK; + } + + if( system_status.model != MODEL_JIKKI ) + { + iic_mcu_stop( ); + } + + if( system_status.taikendai ) + { + // 電源投入 + wait_ms(46); + system_status.poweron_reason = PWSW; + system_status.pwr_state = ON_CHECK; + } + } + else + { + // アダプタなし + if( chg_led_override != 0 ) // これがゼロになるまで待つ + { + return; + }; + + // 省電力へ移行 + iic_mcu_stop( ); + pm_chk_adapter(); + PM_Chg_Stop(); + bt_force_update = true; + + while( RWST ) + {;} + + // 割り込み待ちで寝る // + RTCIMK = 1; + + CKC = 0b00001001; + OSMC = 0x00; + + if( PM_EXTDC_n ) // きわどいタイミングで挿抜が起きることがある + { + STOP( ); + } + + // 起きる // + // 起きる条件は + // ・KeyReturn割り込み(電源ボタン) + // ・アダプタ挿抜 + + OSMC = 0x01; + CKC = 0b00001000; + + if( PM_EXTDC_n ) + { + // 電源ボタンで起きたとき + SW_pow_mask = false; + system_status.pwr_state = ON_CHECK; + timeout = 0; + } + // else{ + // アダプタで起きたときは OFF の中をぐるぐるまわる + // } + + RTCIMK = 0; + if( system_status.taikendai ) + { + system_status.pwr_state = OFF_TRIG; + } + + } + return; + +#if 0 + default: + NOP( ); // あり得ないステート +#endif + + } +} + + + +/*******************************************************//** + PMICが電源異常で止めたか確認 + **********************************************************/ +static void chk_emergencyExit(){ + static u8 shirobako_power_control_count; + + if( shirobako_power_control_count == 0 ) + { + if( !RESET1_n ) // PM_chk_LDSW() はI2C_mを使用し、高コスト + { + if( PM_chk_LDSW( ) == 0 ) + { + // リセットが下がってる + /// PMICが異常終了判断をした + system_status.pwr_state = OFF_TRIG; + renge_task_interval_run_force = true; + } + else + { + // 白箱の仕業 + shirobako_power_control_count = 1; + } + } + } + else + { + if( shirobako_power_control_count == WAIT_SHIROBAKO_POW_CONTROL ) // マジックナンバー + // デバッガが何かした。reset1を解除するまでは無視 + { + if( RESET1_n ) // リセットネゲート待ち + { + shirobako_power_control_count = 0; + } + else + { + // nothing to do + } + } + else if( shirobako_power_control_count == 200 ) // * (sys_tick)[ms] + // デバッガが何かしたいらしい + { +#ifndef _RVD_ + // 白箱は電源を切りたいらしい + system_status.pwr_state = OFF_TRIG; + renge_task_interval_run_force = true; + shirobako_power_control_count = WAIT_SHIROBAKO_POW_CONTROL; +#endif + } + else + { + if( !RESET1_n ) + { + if( shirobako_power_control_count != 255 ) + shirobako_power_control_count += 1; + } + else + { + // (TSボードで手動で/デバッガが)リセットをかけたらしい + send_cmd_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( tski_do_command0 ); + shirobako_power_control_count = WAIT_SHIROBAKO_POW_CONTROL; + } + } + } +} + + + +/* ======================================================== + ・電源ボタン長押し + ・電池切れ + ・電池抜け + での強制OFF。発動すると解除不能 + ======================================================== */ +static void force_off_check() +{ + if( force_off ) + { + system_status.pwr_state = OFF_TRIG; + renge_task_interval_run_force = true; + } +} + + + +/* ======================================================== + SoCを起こす +  電圧が通常に戻ってから呼んで下さい。 + ======================================================== */ +void send_getup_to_soc() +{ + going_to_sleep = false; + timeout_sleep = 0; +#ifdef _MODEL_CTR_ + SLP_ACK = 1; + nop8(); + SLP_ACK = 0; +#endif +} + + + + +/*******************************************************//** + firm_update()を task_status_immed型 を返すようにすればいいのですが... + **********************************************************/ +task_status_immed tski_firm_update(){ + firm_update(); + return( ERR_SUCCESS ); +} + diff --git a/branches/sim/user_define.h b/branches/sim/user_define.h new file mode 100644 index 0000000..1906ca2 --- /dev/null +++ b/branches/sim/user_define.h @@ -0,0 +1,279 @@ +#ifndef _USER_DEF_ +#define _USER_DEF_ + + +#define IIC_T_SLAVEADDRESS 0x4A +#define IIC_C_SLAVEADDRESS 0x4A +#define IIC_C_SLAVEADDRESS_DMY 0x4C + +//#define IIC_SLA_DCP 0x50 + +#ifdef _debug_led_ +# define DBG_LED_on { PM2.1 = 0; P2.1 = 1; } +# define DBG_LED_off { P2.1 = 0; } +# define DBG_LED_toggle ( P2.1 ^= 1 ) +# define DBG_LED2_on { PM2.2 = 0; P2.2 = 1; } +# define DBG_LED2_off { P2.2 = 0; } +# define DBG_LED2_toggle ( P2.2 ^= 1 ) + +#else +# define DBG_LED_on ; +# define DBG_LED_off ; +# define DBG_LED_toggle ; +# define DBG_LED2_on ; +# define DBG_LED2_off ; +# define DBG_LED2_toggle ; +#endif + +#ifdef _PMIC_CTR_ +# define SLP_ACK P7.7 +#endif + + +#define IIC_SLA_CODEC 0xA4 +#define IIC_SLA_ACCEL 0x30 // ST LIS331DLH + + +// PMxは0で出力モード + +// SoC +#ifdef _MODEL_TEG2_ +#define IRQ0_ast { P3.0 = 0; PM3.0 = 0; } +#define IRQ0_neg { PM3.0 = 1; } +#define IRQ0 ( P3.0 ) +#endif +#ifdef _MODEL_WM0_ +#define IRQ0_ast { P3.0 = 0; PM3.0 = 0; } +#define IRQ0_neg { PM3.0 = 1; } +#define IRQ0 ( P3.0 ) +#endif + +#ifdef _MODEL_TS0_ +#define IRQ0_ast { P7.6 = 0; PM7.6 = 0; } +#define IRQ0_neg { PM7.6 = 1; } +#define IRQ0 ( P7.6 ) +#endif +#ifdef _MODEL_CTR_ +#define IRQ0_ast { P7.6 = 0; PM7.6 = 0; } +#define IRQ0_neg { P7.6 = 1; } +#define IRQ0_enable { PM7.6 = 0; } +#define IRQ0_disable { PM7.6 = 1; } +#define IRQ0 ( P7.6 ) +#endif + + +// ↓誤代入防止 +#define RESET1_n ( P0.0 ) + +#if 0 // PM_RESET1〜を使う +#define RESET1_ast { P0.0 = 0; PM0.0 = 0; } +#define RESET1_neg { PM0.0 = 1; } +#endif + +#define RESET2_ast { P0.1 = 0; PM0.1 = 0; } +#define RESET2_neg { PM0.1 = 1; } + +#define SLP_REQ P12.0 + +// CTR,SPFL,まだ見ぬ派生機識別 +#define DEV_DET ( P12 & 0x00000110 ) +#define DEV_CTR ( 0b00 << 1 ) +#define DEV_SPFL ( 0b01 << 1 ) +#define DEV_SHRIMP ( 0b10 << 1 ) +#define DEV_RSV2 ( 0b11 << 1 ) + +// FCRAM +#ifdef _MODEL_TEG2_ +#define FCRAM_RST P14.0 +#define FCRAM_RST_ast { P14.0 = 0; } +#define FCRAM_RST_neg { P14.0 = 1; } +#endif +#ifdef _MODEL_WM0_ +#define FCRAM_RST P14.0 +#define FCRAM_RST_ast { P14.0 = 0; } +#define FCRAM_RST_neg { P14.0 = 1; } +#endif + +#ifdef _MODEL_TS0_ +#define FCRAM_RST P3.0 +#define FCRAM_RST_ast { P3.0 = 0; } +#define FCRAM_RST_neg { P3.0 = 1; } +#endif +#ifdef _MODEL_CTR_ +#define FCRAM_RST P3.0 +#define FCRAM_RST_ast { P3.0 = 0; } +#define FCRAM_RST_neg { P3.0 = 1; } +#endif + + +// CODEC +#define PM_IRQ_n P7.2 +// INTP6 + +// PM +#define PM_EXTDC_n P7.0 +// INTP7 +//#define BT_TEMP P15.0 +// ANI8 +//#define BT_DET P15.1 +// ANI9 +#define BT_DET_P P1.6 +#define BT_TEMP_P P1.7 + + +// SPFLのアモルファスLCDで必要な±15Vの電源。 +#define SPFL_LCD_AMOL_HV_CONT P20.2 + + +// 充電せよ(out) +// 負論理です。注意。 +#define BT_CHG_ENABLE() ( P4.3 = 0 ) +#define BT_CHG_DISABLE() ( P4.3 = 1 ) +#define BT_CHG_Ena_n ( P4.3 ) + +// 充電中(in) +#define BT_IN_CHG_n P5.1 + +#define SW_WIFI_n P7.4 +// KR4 +#define SW_POW_n P7.3 +// KR3 +#define SW_SEL_n P2.3 +//#define VOL P2.7 +// ANI7 + +#define SW_HOME_n_JIKKI P20.4 +// INTP22 +#define SW_HOME_n_TSBOARD P2.0 + +// WiFi +#ifndef _TEG_ +#define WL_TX P20.3 // INTP21 +#else +#define WL_TX P20.3 // INTP21 +#endif + +//#define LED_CAM P1.0 // TO02 +//#define LED_WIFI P1.1 // TO03 +//#define LED_NOTIFY P1.3 // TO05 +//#define LED_3D P5.2 // SLTO ← TO01 +//#define LED_POW2 P1.4 // TO06 ( 青 ) +//#define LED_POW1 P1.5 // TO07 ( 赤 ) +//#define LED_CHARGE P2.4 + + +#ifdef _MODEL_TEG2_ +#define I2C_PU_on() P5.3 = 1 +#define I2C_PU_off() P5.3 = 0 +#endif + +#ifdef _MODEL_TS0_ +#define I2C_PU_on() P5.3 = 1 +#define I2C_PU_off() P5.3 = 0 +#endif + +#ifdef _MODEL_WM0_ +#define I2C_PU_on() P5.3 = 1 +#define I2C_PU_off() P5.3 = 0 +#endif + +#ifdef _MODEL_CTR_ +// P5.3 に加え、P5.5, P140 P141 +// P140が出力専用なので... +#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_ENABLE() P5.0 = 0 +#define GYRO_DISABLE() P5.0 = 1 +#else +#define GYRO_ENABLE() ; +#define GYRO_DISABLE() ; +#endif + +//#define I2C_M_SDA P3.1 // SDA10 +//#define I2C_M_SCL P3.2 // SCL10 + +//#define I2C_0_SCL P6.0 // IIC_TWL SCL0 +//#define I2C_0_SDA P6.1 // SDA0 + +//#define I2C_1_SCL P20.0 // IIC CTR SCL1 +//#define I2C_1_SDA P20.1 // SDA1 + +//#define 32kHz_O P1.2 // RTCCL +//#define 32k_I1 P12.3 // XT1 +//#define 32k_I2 P12.4 // XT2 + +// 実機、開発機、試遊台判別。 +#define DIPSW ( P4 & 0b00000011 ) // mini cube & ソフトウェアディップスイッチ TOOL0,1。 P4.0は L 注意! +#define DIPSW_CTR 0b11 // 未使用 +#define DIPSW_ISDEV 0b00 // KuCはBattGaugeで判別 +#define DIPSW_TAIKENDAI 0b10 +#define DIPSW_TAIKENDAI_NBD 0b01 + + +#ifndef _MODEL_WM0_ +#define SHELL_OPEN P7.1 // INTP5 ふた開閉 (閉じるとL) +#else +#define SHELL_OPEN 1 +#endif + +//#define DBG_VR P2.6 +// ANI6 + +#define DBG P14.1 + +#ifdef _MODEL_TEG2_ +#define ACC_VALID P15.2 +#define ACCEL_INT1 P2.5 +#endif + +#ifdef _MODEL_TS0_ +#define ACC_VALID P20.5 +#define ACCEL_INT1 P2.5 +#endif + +#ifdef _MODEL_WM0_ +// テレコになっていたが、センサ側の設定を変えたため、TS0と同じでよい +#define ACC_VALID P20.5 +#define ACCEL_INT1 P2.5 +#endif + +#ifdef _MODEL_CTR_ +#define ACC_VALID P20.5 +#define ACCEL_INT1 P2.5 +#endif + + + +#define KR_SW_POW ( 1 << 3 ) +#define KR_SW_WIFI ( 1 << 4 ) + + +/////////////////////////////////////////////////////////// + +#define INT_MSK0_IIC_M_DMA 0b0001000000000000 +#define INT_MSK0_SHELL 0b0000000010000000 +#define INT_MSK0_EXTDC 0b0000000001000000 +//#define INT_MSK0_SLP 0b0000000000000100 ) +//#define INT_MSK0_RSV 0b1110111100111011 ) +#define INT_MSK0_RSV 0b1110111100111111 + +#define INT_MSK1_KR 0b0000100000000000 +#define INT_MSK1_RTCINTVAL 0b0000010000000000 +#define INT_MSK1_RTCALARM 0b0000001000000000 +#define INT_MSK1_ADC 0b0000000100000000 +#define INT_MSK1_IIC_CTR 0b0000000000001000 +#define INT_MSK1_IIC_MCU 0b0000000000000001 +#define INT_MSK1_RSV 0b1111000011110110 + +#define INT_MSK2_WIFI_TX_KE3 0b00010000 +#define INT_MSK2L_RSV 0b11101111 + +#define INT_MSK2_IIC_TWL ( 0b0000000100000000 ) +#define INT_MSK2_WIFI_TX_BSR ( 0b0000010000000000 ) +#define INT_MSK2_CODEC_PMIRQ ( 0b0000000000001000 ) +#define INT_MSK2_RSV 0b1111101111110111 + +#endif diff --git a/branches/sim/voltable.h b/branches/sim/voltable.h new file mode 100644 index 0000000..6ff34ab --- /dev/null +++ b/branches/sim/voltable.h @@ -0,0 +1,57 @@ +#ifdef _10db_ +// max -10db +/* +const u8 slider_to_codec[64] = +{ + 127, 127, 127, 127, 126, 125, 123, 122, + 121, 120, 118, 117, 116, 115, 113, 112, + 111, 110, 108, 107, 106, 105, 103, 102, + 101, 100, 98, 97, 96, 95, 93, 92, + 91, 90, 88, 87, 86, 85, 83, 82, + 81, 80, 78, 77, 76, 75, 73, 72, + 72, 71, 70, 68, 67, 66, 64, 63, + 62, 61, 59, 58, 57, 56, 55, 55 + }; +*/ +const u8 slider_to_codec[64] = +{ + 127, 126, 125, 124, 122, 121, 120, 119, + 118, 117, 116, 114, 113, 112, 111, 110, + 109, 108, 106, 105, 104, 103, 102, 101, + 100, 98, 97, 96, 95, 94, 93, 92, + 90, 89, 88, 87, 86, 85, 83, 82, + 81, 80, 79, 78, 77, 75, 74, 73, + 73, 72, 71, 70, 69, 67, 66, 65, + 64, 63, 62, 61, 59, 58, 57, 56 + }; +#endif + +#ifdef _15db_ +// max -15db +const u8 slider_to_codec[64] = +{ + 127, 127, 127, 127, 127, 126, 125, 123, + 122, 121, 120, 119, 118, 117, 116, 115, + 114, 113, 112, 110, 109, 108, 107, 106, + 105, 104, 103, 102, 101, 100, 99, 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, + 71, 70, 69, 68, 67, 66, 66, 66 +}; +#endif + +#ifdef _4db_ +// max -4db +const u8 slider_to_codec[64] = +{ + 127, 127, 126, 125, 123, 122, 121, 119, + 118, 117, 115, 114, 112, 111, 110, 108, + 107, 106, 104, 103, 101, 100, 99, 97, + 96, 94, 93, 92, 90, 89, 88, 86, + 85, 83, 82, 81, 79, 78, 77, 75, + 74, 72, 71, 70, 68, 67, 66, 64, + 64, 63, 61, 60, 59, 57, 56, 54, + 53, 52, 50, 49, 48, 46, 44, 44 +}; +#endif diff --git a/branches/sim/vreg_ctr.c b/branches/sim/vreg_ctr.c new file mode 100644 index 0000000..0df1fcc --- /dev/null +++ b/branches/sim/vreg_ctr.c @@ -0,0 +1,530 @@ +/* ======================================================== + +CTR MCU I2Cレジスタ + + ====================================================== */ +#include "incs.h" +#include "vreg_ctr.h" +#include "rtc.h" +#include "led.h" +#include "accero.h" +#include "pm.h" +#include "pool.h" + +#include +#include "fsl_user.h" + + +extern u8 extinfo_read(); // task_misc.c + +extern u8 iic_burst_state; // 特殊バーストアクセスする時のカウンタ +extern bit info_led_pattern_updated; // お知らせLEDのパターンを先頭に戻す + +extern bit pedolog_overflow; + + + +// ******************************************************** +#ifdef _DBG_PEDO_AUTO_ENABLE_ +u8 vreg_ctr[VREG_C_ENDMARK_ + 16]; +#else +u8 vreg_ctr[VREG_C_ENDMARK_]; +#endif + +u8 vreg_free_adrs; // アドレス飛んでるのでしばらくはこれで + +bit irq_readed; // AAA型のため。 + + + +// ******************************************************** +extern task_status_immed tski_firm_update(); +extern task_status_immed tski_mcu_reset(); + + + +// ******************************************************** +#ifdef _MCU_BSR_ +#define IICAMK IICAMK1 +#endif + + +// ******************************************************** +// 非ゼロの初期値の指定が必要なアドレス +// マイコンリセット時に呼ばれます +void vreg_ctr_init( ) +{ + vreg_ctr[ VREG_C_VCOM_T ] = VCOM_DEFAULT_T; + vreg_ctr[ VREG_C_VCOM_B ] = VCOM_DEFAULT_B; + + vreg_ctr[ VREG_C_OFF_DELAY ] = FORCEOFF_THREASHOLD; + + vreg_ctr[ VREG_C_VOL_CAL_MIN ] = 0x36; + vreg_ctr[ VREG_C_VOL_CAL_MAX ] = 0xFF - 0x36; + +} + + +// ******************************************************** +// 本体の電源投入時にセットされます +void vreg_ctr_reset( ) +{ + vreg_ctr[ VREG_C_MCU_VER_MAJOR ] = MCU_VER_MAJOR | 0x10; + vreg_ctr[ VREG_C_MCU_VER_MINOR ] = MCU_VER_MINOR; + + vreg_ctr[ VREG_C_LED_BRIGHT ] = 0xFF; + vreg_ctr[ VREG_C_LED_POW ] = 0; + vreg_ctr[ VREG_C_LED_WIFI ] = 0; + vreg_ctr[ VREG_C_LED_CAM ] = 0; + vreg_ctr[ VREG_C_LED_3D ] = 0; + vreg_ctr[ VREG_C_VOL_OPTION ] = 0; +// vreg_ctr[ VREG_C_VOL_CAL_MIN ] = 0x36; ここで書いちゃダメ! +// vreg_ctr[ VREG_C_VOL_CAL_MAX ] = 0xFF - 0x36; 電源入れるたびにデフォルト値になってしまう + { + u8 i; + for( i = 0; i < sizeof( uni_info_LED ); i++ ) + { + info_LED.bindata[ i ] = 0; + } + } +} + + + +// ******************************************************** +// I2C仮想レジスタに書きます。 +// 引数 adrs は内部アドレス +//  書けないアドレスにアクセスした場合、何もしません。 +// ●書き込んだ結果、I2C_mcu通信が発生する場合、renge_task_immed_add() +// を使用しないと、I2C_mcu使用中でエラー終了した場合にリトライしません。 +void vreg_ctr_write( u8 adrs, u8 data ) +{ + switch ( adrs ) + { + + case ( VREG_C_MCU_STATUS ): +// vreg_twl[ REG_TWL_INT_ADRS_MODE ] = (u8)( ( data >> 6 ) & 0x03 ); Rでよい。その代わりリセットでクリア + vreg_ctr[ VREG_C_MCU_STATUS ] = data; + break; + + case ( VREG_C_VCOM_T ): + case ( VREG_C_VCOM_B ): + renge_task_immed_add( tski_vcom_set ); + vreg_ctr[adrs] = data; + break; + + case ( VREG_C_DBG03 ): + if( ( vreg_ctr[VREG_C_DBG01] == 'j' ) + && ( vreg_ctr[VREG_C_DBG02] == 'h' ) + && ( data == 'l' ) ) + { + renge_task_immed_add( tski_firm_update ); + IICAMK = 1; + } + vreg_ctr[ VREG_C_DBG03 ] = data; + break; + + case ( VREG_C_COMMAND0 ): + if( data != 0 ) + { + renge_task_immed_add( tski_do_command0 ); + } + vreg_ctr[ VREG_C_COMMAND0 ] |= data; + break; + + case ( VREG_C_COMMAND2 ): + // こちらからの完了割り込みを待ってくれないそうです。 #-ω-) 何のための割り込みだ + // 液晶電源 + if(( data & REG_BIT_CMD_LCD_ON ) != 0 ) + { + renge_task_immed_add( tski_PM_LCD_on ); + } + else if(( data & REG_BIT_CMD_LCD_OFF ) != 0 ) + { + renge_task_immed_add( tski_PM_LCD_off ); + } + + // バックライト設定 + /// 今のところさらに細かくは分けないけど… + if(( data & REG_BITS_CMD_BL ) != 0 ) + { + renge_task_immed_add( tski_PM_BL_set ); + vreg_ctr[adrs] = (u8)( data & REG_BITS_CMD_BL ); + } + break; + + case ( VREG_C_COMMAND1 ): + if( data != 0 ) + { + // TWLに割り込みを入れる + /// 実際に割り込みを入れるのはSoC + vreg_twl[REG_TWL_INT_ADRS_IRQ] = ( ( data & REG_BIT_SEND_TWL_PWSW_DET ) != 0 ) ? REG_BIT_TWL_IRQ_PWSW_DET : 0x00; //pwsw_det + vreg_twl[REG_TWL_INT_ADRS_IRQ] |= ( ( data & REG_BIT_SEND_TWL_RESET_DET ) != 0 ) ? REG_BIT_TWL_IRQ_RESET : 0x00; //reset_req + + vreg_twl[REG_TWL_INT_ADRS_IRQ] |= ( ( data & REG_BIT_SEND_TWL_OFF_DET ) != 0 ) ? REG_BIT_TWL_IRQ_OFF : 0x00; //off_req + + vreg_twl[REG_TWL_INT_ADRS_IRQ] |= ( ( data & REG_BIT_SEND_TWL_BATT_LOW ) != 0 ) ? REG_BIT_TWL_IRQ_BT_LOW : 0x00; //batt_low + vreg_twl[REG_TWL_INT_ADRS_IRQ] |= ( ( data & REG_BIT_SEND_TWL_BATT_EMPTY ) != 0 ) ? REG_BIT_TWL_IRQ_BT_EMPTY : 0x00; //batt_empty + + if(( data & REG_BIT_SEND_TWL_VOL_CLICK ) != 0 ) + { + vreg_twl[REG_TWL_INT_ADRS_IRQ] |= REG_BIT_TWL_IRQ_VOL_CHANGE; //vol_changed + } + } + break; + + case ( VREG_C_LED_POW ): + if( iic_burst_state == 0 ) + { + vreg_ctr[ VREG_C_LED_POW ] = data; + iic_burst_state += 1; + } + else if( iic_burst_state < 5 ) + { + led_red_batt_empty.dats[ iic_burst_state -1 ] = data; + iic_burst_state += 1; + } + break; + + case ( VREG_C_LED_WIFI ): + case ( VREG_C_LED_CAM ): + case ( VREG_C_LED_3D ): + vreg_ctr[adrs] = (u8)( data & 0x0F ); + break; + + case ( VREG_C_LED_NOTIFY_DATA ): + if( iic_burst_state < sizeof( uni_info_LED ) ) + { + if(( iic_burst_state == 1 ) && ( data == 0 )) // fade_time == 0 禁止 + { + data = 1; + } + info_LED.bindata[ iic_burst_state ] = data; + iic_burst_state += 1; + if( iic_burst_state > 4 ) // パターンを1文字でも書いた + { + info_led_pattern_updated = true; + } + } + break; + + /// 非同期で動いているためここでは書かない。 + // 予約するだけでstopで書く + case ( VREG_C_RTC_SEC ): + case ( VREG_C_RTC_MIN ): + set_rtc( adrs - VREG_C_RTC_SEC, data & 0x7F ); + break; + + case ( VREG_C_RTC_DAY ): + case ( VREG_C_RTC_HOUR ): + set_rtc( adrs - VREG_C_RTC_SEC, data & 0x3F ); + break; + + case ( VREG_C_RTC_YOBI ): + set_rtc( adrs - VREG_C_RTC_SEC, data & 0x07 ); + break; + + case ( VREG_C_RTC_MONTH ): + set_rtc( adrs - VREG_C_RTC_SEC, data & 0x1F ); + break; + + case ( VREG_C_RTC_YEAR ): + set_rtc( adrs - VREG_C_RTC_SEC, data ); + break; + + case ( VREG_C_RTC_COMP ): + WDT_Restart(); + while(1) + { + RWAIT = 1; + while( !RWST ){} + if( SEC != 0 ) + { + break; + } + RWAIT = 0; + } + SUBCUD = data; + RWAIT = 0; + vreg_ctr[ VREG_C_RTC_COMP ] = data; + break; + + case ( VREG_C_RTC_ALARM_MIN ): + rtc_alarm_dirty = true; + vreg_ctr[ VREG_C_RTC_ALARM_MIN ] = (u8)( data & 0x7F ); + break; + + case ( VREG_C_RTC_ALARM_HOUR ): + rtc_alarm_dirty = true; + vreg_ctr[ VREG_C_RTC_ALARM_HOUR ] = (u8)( data & 0x3F ); + break; + + // 書くだけでよい + case ( VREG_C_RTC_ALARM_DAY ): + vreg_ctr[ VREG_C_RTC_ALARM_DAY ] = (u8)( data & 0x3F ); + break; + + case ( VREG_C_RTC_ALARM_MONTH ): + vreg_ctr[ VREG_C_RTC_ALARM_MONTH ] = (u8)( data & 0x1F ); + break; + + case ( VREG_C_ACC_CONFIG ): + renge_task_immed_add( tski_acc_hosu_set ); + vreg_ctr[ VREG_C_ACC_CONFIG ] = data; + break; + + case ( VREG_C_ACC_R_ADRS ): + renge_task_immed_add( tski_acc_read ); + vreg_ctr[ VREG_C_ACC_R_ADRS ] = data; + break; + + case ( VREG_C_ACC_W_BUF ): + renge_task_immed_add( tski_acc_write ); + vreg_ctr[ VREG_C_ACC_W_BUF ] = data; + break; + + case ( VREG_C_ACC_HOSU_SETTING ): + if( ( data & 0x01 ) != 0 ) + { + clear_hosu_hist(); // 履歴クリア + } + break; + + case ( VREG_CX_FREE_DATA ): + if( vreg_free_adrs < VREG_C_FREE_SIZE ) + { + pool.vreg_c_ext.vreg_c_free[ vreg_free_adrs ] = data; + vreg_free_adrs += 1; + } + break; + + case ( VREG_CX_FREE_ADRS ): + vreg_free_adrs = data; + break; + + + case ( VREG_C_COMMAND3 ): + switch ( data ) + { + case ( 'r' ): + // 割り込みルーチンからFSLライブラリを呼ぶのは禁止 + // マイコンを再起動。 レジスタ類も初期化される。 + renge_task_immed_add( tski_mcu_reset ); + break; + +#ifdef _ENABLE_WDT_TEST_ + case ( 'w' ): + // WDTで再起動(テスト向け) + while(1) + { + NOP(); + } +// mcu_wdt_reset; // このコマンド使ったら意味ないでしょ! + break; +#endif + } + vreg_ctr[ VREG_C_COMMAND3 ] = data; + break; + + case ( VREG_C_VOL_OPTION ): + if(( vreg_ctr[ VREG_C_VOL_OPTION ] ^ data ) & ( REG_BIT_VOL_UPDATE_TO_SLIDER )) + { +// renge_task_immed_add( tski_vol_update ); + vol_polling = 3; + } + vreg_ctr[ VREG_C_VOL_OPTION ] = data; + break; + + // read only // + case ( VREG_C_MCU_VER_MAJOR ): + case ( VREG_C_MCU_VER_MINOR ): + // VREG_C_3D = 0x08, + // VREG_C_SND_VOL, + // VREG_C_BT_TEMP, + // VREG_C_BT_REMAIN, + // VREG_C_BT_REMAIN_FINE, + // VREG_C_BT_VOLTAGE, + case ( VREG_C_STATUS_1 ): + case ( VREG_C_STATUS ): + case ( VREG_C_IRQ0 ): + case ( VREG_C_IRQ1 ): + case ( VREG_C_IRQ2 ): + case ( VREG_C_IRQ3 ): + case ( VREG_C_IRQ4 ): + case ( VREG_C_LED_NOTIFY_FLAG ): + case ( VREG_C_RTC_SEC_FINE_L ): + case ( VREG_C_RTC_SEC_FINE_H ): + // VREG_C_ACC_RESERVE, + // VREG_C_ACC_HOSU_HIST = 0x4F, + break; + +//debug// + case ( VREG_C_VOL_DIGITAL ): + NOP(); + // no break // + + // ただ値を更新するだけ // + default: + /* + case ( VREG_C_IRQ_MASK0 ): + case ( VREG_C_IRQ_MASK1 ): + case ( VREG_C_IRQ_MASK2 ): + case ( VREG_C_IRQ_MASK3 ): + case ( VREG_C_IRQ_MASK4 ): + case ( VREG_C_DBG01 ): + case ( VREG_C_DBG02 ): + case ( VREG_C_LED_BRIGHT ): + case ( VREG_C_ACC_HOSU_L ): + case ( VREG_C_ACC_HOSU_M ): + case ( VREG_C_ACC_HOSU_H ): + case ( VREG_C_ACC_HOSU_HOUR_BOUNDARY ): + case ( VREG_C_FREE_ADRS ): + case ( VREG_C_RTC_ALARM_YEAR ): + case ( VREG_C_ACC_W_ADRS ): + case ( VREG_C_OFF_DELAY ): + */ + if( adrs < VREG_C_ENDMARK_ ) + { + vreg_ctr[adrs] = data; + break; + } + else + { + break; + } + } + return; +} + + + +// ******************************************************** +// I2C仮想レジスタから読みます。 +// 戻り: xx データ +// 注意:次のアドレスの準備で呼ばれる ので、 +// リードされたらクリアなどは気をつける +// ( →vreg_ctr_after_read( u8 adrs ) ) +u8 vreg_ctr_read( u8 adrs ) +{ + static u16 rsub_temp; + u8 temp; + + // RTCは読み出し途中に繰り上がるのを避けるため + if( ( VREG_C_RTC_SEC <= adrs ) && ( adrs <= VREG_C_RTC_YEAR ) ) + { + rtc_buf_reflesh( ); + } + else if( adrs == VREG_C_MCU_STATUS ) + { + return( ( vreg_ctr[ VREG_C_MCU_STATUS ] & 0x03 ) | + ( ( vreg_twl[ REG_TWL_INT_ADRS_MODE ] & 0x03 ) << 6 ) | // sys_mode + ( ( vreg_twl[ REG_TWL_INT_ADRS_MODE ] & 0x80 ) >> 2 )); // vol32 + } + else if( adrs == VREG_C_RTC_SEC_FINE_L ) + { + rsub_temp = RSUBC; + return( (u8)( rsub_temp & 0xFF ) ); + } + else if( adrs == VREG_C_RTC_SEC_FINE_H ) + { + return( (u8)( ( rsub_temp >> 8 ) & 0xFF ) ); + } + else if( adrs == VREG_C_ACC_HOSU_HIST ) + { + return( hosu_read() ); + } + else if( adrs == VREG_CX_FREE_DATA ) + { + temp = pool.vreg_c_ext.vreg_c_free[ vreg_free_adrs ]; + // vreg_free_adrs += 1; // ここで加算してしまうとインデックスがずれる + return( temp ); + } + else if( adrs == VREG_CX_INFO ) + { + return( extinfo_read() ); + } + else if( adrs == VREG_C_ACC_HOSU_SETTING ) + { + return( pedolog_overflow? 0x10: 0 ); + } + +#if 0 + if( adrs >= VREG_C_ENDMARK_ ) + { + // VREG_C_INFO > VREG_C_ENDMARK_ なので + // いじるときは注意 + return( 0xEE ); + } +#endif + return ( vreg_ctr[adrs] ); +} + + + +// ******************************************************** +// I2C仮想レジスタから読まれて何かするレジスタ +void vreg_ctr_after_read( u8 adrs, u8 data ) +{ + // 割り込みフラグはリードでクリア + switch( adrs ) + { + case VREG_C_IRQ0: + case VREG_C_IRQ1: + case VREG_C_IRQ2: + case VREG_C_IRQ3: + case VREG_C_IRQ4: + DI(); + vreg_ctr[ adrs ] ^= data; + EI(); + irq_readed = true; + break; + + case VREG_CX_FREE_DATA: + vreg_free_adrs += 1; + break; + + default: + break; + } +} + + + + + + +/****************************************************************************** + 割り込みを入れる + 割り込みマスクが必要と言うことでこんな事をする羽目になりました + *****************************************************************************/ +#if 0 +// マスクされてたら、フラグは立てるが、割り込みは入れない。 +#define set_irq( irqreg, bitpos ) \ +{ \ + vreg_ctr[ irqreg ] |= bitpos; \ + if( ( vreg_ctr[ irqreg+8 ] & bitpos ) == 0 ){ \ + IRQ0_ast; \ + } \ +} +#endif + +// マスクされてたら、フラグも立てず、割り込みも入れない。 +void set_irq( u8 irqreg, u8 irq_flg ) +{ + u8 tot; + + if(( system_status.pwr_state == ON ) || + ( system_status.pwr_state == SLEEP )) + { + // DI(); + if( ( vreg_ctr[ irqreg + 8 ] & irq_flg ) == 0 ){ + vreg_ctr[ irqreg ] |= irq_flg; + IRQ0_neg; // 一瞬上げて... + // EI(); + tot = 0; + while( !IRQ0 && ( ++tot != 0 ) ){;} // O.D.なのでちゃんとあがるのを待つ & IRQ_mcu がLに縛られてると困る(基板不良) + IRQ0_ast; // 落とし直す。 + } + } +// EI(); +} diff --git a/branches/sim/vreg_ctr.h b/branches/sim/vreg_ctr.h new file mode 100644 index 0000000..af4f86e --- /dev/null +++ b/branches/sim/vreg_ctr.h @@ -0,0 +1,267 @@ +#ifndef __vreg_ctr__ +#define __vreg_ctr__ + + +#include "config.h" + +// VREG_C_MCU_STATUS +#define REG_BIT_STATUS_WDT_RESET ( 1 << 1 ) +#define REG_BIT_RTC_BLACKOUT ( 1 << 0 ) + + +// VREG_C_STATUS, +#define REG_BIT_LCD_POW ( 1 << 7 ) +#define REG_BIT_BL_U ( 1 << 6 ) +#define REG_BIT_BL_L ( 1 << 5 ) +#define REG_BIT_BATT_CHARGE ( 1 << 4 ) +#define REG_BIT_POW_SUPPLY ( 1 << 3 ) +// 未使用 ( 1 << 2 ) +#define REG_BIT_ST_SHELL_OPEN ( 1 << 1 ) +// 未使用 ( 1 << 0 ) + + +// VREG_C_STATUS_X +// 未使用 ( 1 << 6 ) +// 未使用 ( 1 << 5 ) +#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_MGIC_ERR ( 1 << 0 ) + +// VREG_C_IRQ0 +#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 ) +#define REG_BIT_SW_HOME_RELEASE ( 1 << 3 ) +#define REG_BIT_SW_HOME_CLICK ( 1 << 2 ) +#define REG_BIT_SW_POW_HOLD ( 1 << 1 ) +#define REG_BIT_SW_POW_CLICK ( 1 << 0 ) + +// VREG_C_IRQ1 +#define REG_BIT_BT_CHG_START ( 1 << 7 ) +#define REG_BIT_BT_CHG_STOP ( 1 << 6 ) +#define REG_BIT_BT_REMAIN ( 1 << 5 ) +#define REG_BIT_ACC_DAT_RDY ( 1 << 4 ) +#define REG_BIT_ACC_ACK ( 1 << 3 ) +#define REG_BIT_RTC_ALARM ( 1 << 2 ) +#define REG_BIT_BT_DC_CONNECT ( 1 << 1 ) +#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_SLIDE_VOL_ACROSS_TWL_BOUNDARY ( 1 << 6 ) +#define REG_BIT_TWL_BL_U_ON ( 1 << 5 ) +#define REG_BIT_TWL_BL_U_OFF ( 1 << 4 ) +#define REG_BIT_TWL_BL_L_ON ( 1 << 3 ) +#define REG_BIT_TWL_BL_L_OFF ( 1 << 2 ) +#define REG_BIT_TWL_OFF_REQ ( 1 << 1 ) +#define REG_BIT_TWL_RESET_REQ ( 1 << 0 ) + +// VREG_C_IRQ3 +#define REG_BIT_BL_U_ON ( 1 << 5 ) +#define REG_BIT_BL_U_OFF ( 1 << 4 ) +#define REG_BIT_BL_L_ON ( 1 << 3 ) +#define REG_BIT_BL_L_OFF ( 1 << 2 ) +#define REG_BIT_LCD_ON ( 1 << 1 ) +#define REG_BIT_LCD_OFF ( 1 << 0 ) + + +// そのうちどこかに... +//#define REG_BIT_VR_3D_CHANGE ( 1 << 7 ) + + + +// VREG_C_COMMAND0 +//#define REG_BIT_CMD_LCD_ON ( 1 << 7 ) +//#define REG_BIT_CMD_LCD_OFF ( 1 << 6 ) +//#define REG_BIT_CMD_BL_ON ( 1 << 5 ) +//#define REG_BIT_CMD_BL_OFF ( 1 << 4 ) +#define REG_BIT_GOING_TO_SLEEP ( 1 << 4 ) +#define REG_BIT_FCRAM_RESET_REQ ( 1 << 3 ) +#define REG_BIT_RESET2_REQ ( 1 << 2 ) +#define REG_BIT_RESET1_REQ ( 1 << 1 ) +#define REG_BIT_OFF_REQ ( 1 << 0 ) + +// VREG_C_COMMAND1 (TWLに割り込みを入れる) +// 未使用 ( 1 << 7 ) +// 未使用 ( 1 << 6 ) +#define REG_BIT_SEND_TWL_VOL_CLICK ( 1 << 5 ) +#define REG_BIT_SEND_TWL_BATT_EMPTY ( 1 << 4 ) +#define REG_BIT_SEND_TWL_BATT_LOW ( 1 << 3 ) +#define REG_BIT_SEND_TWL_OFF_DET ( 1 << 2 ) +#define REG_BIT_SEND_TWL_RESET_DET ( 1 << 1 ) +#define REG_BIT_SEND_TWL_PWSW_DET ( 1 << 0 ) + +// VREG_C_COMMAND2 液晶関係 +#define REG_BIT_CMD_BL_U_ON ( 1 << 5 ) +#define REG_BIT_CMD_BL_U_OFF ( 1 << 4 ) +#define REG_BIT_CMD_BL_L_ON ( 1 << 3 ) +#define REG_BIT_CMD_BL_L_OFF ( 1 << 2 ) +#define REG_BIT_CMD_LCD_ON ( 1 << 1 ) +#define REG_BIT_CMD_LCD_OFF ( 1 << 0 ) +#define REG_BITS_CMD_BL ( REG_BIT_CMD_BL_U_ON | REG_BIT_CMD_BL_U_OFF | REG_BIT_CMD_BL_L_ON | REG_BIT_CMD_BL_L_OFF ) + + +// ↑TWLに通知するIRQレジスタ +#define REG_BIT_TWL_IRQ_PWSW_DET 0x08 +#define REG_BIT_TWL_IRQ_RESET 0x01 +#define REG_BIT_TWL_IRQ_OFF 0x02 +#define REG_BIT_TWL_IRQ_BT_LOW 0x20 +#define REG_BIT_TWL_IRQ_BT_EMPTY 0x10 +#define REG_BIT_TWL_IRQ_VOL_CHANGE 0x40 + +// VOL option (0x26) +#define REG_BIT_VOL_UPDATE_TO_SLIDER ( 1 << 4 ) +#define REG_BIT_VOL_BY_SPI ( 1 << 0 ) +// FORCE_REGの方が弱い + +// CODEC上のPMIC NTR の代理レジスタ +#define REG_BIT_TWL_REQ_OFF ( 1 << 6 ) +#define REG_BIT_TWL_REQ_BL_U ( 1 << 3 ) +#define REG_BIT_TWL_REQ_BL_L ( 1 << 2 ) +#define REG_BIT_TWL_REQ_RESET ( 1 << 0 ) + + + +// VREG_C_LED_NOTIFY_FLAG +#define REG_BIT_IN_LOOP ( 1 << 0 ) + + +/* + テンプレ +#define REG_BIT_ ( 1 << 7 ) +#define REG_BIT_ ( 1 << 6 ) +#define REG_BIT_ ( 1 << 5 ) +#define REG_BIT_ ( 1 << 4 ) +#define REG_BIT_ ( 1 << 3 ) +#define REG_BIT_ ( 1 << 2 ) +#define REG_BIT_ ( 1 << 1 ) +#define REG_BIT_ ( 1 << 0 ) +*/ + + + +/*============================================================================*/ +extern u8 vreg_ctr[]; + +/*============================================================================*/ +enum VREG_C_ADRS +{ // 未定義アドレスへ書き込んだ際の動作は不定 + VREG_C_MCU_VER_MAJOR = 0x00, + VREG_C_MCU_VER_MINOR, + VREG_C_MCU_STATUS, + + VREG_C_VCOM_T = 0x03, + VREG_C_VCOM_B, + + VREG_C_DBG01 = 0x05, + VREG_C_DBG02, + VREG_C_DBG03, + + VREG_C_3D = 0x08, + VREG_C_SND_VOL, + VREG_C_BT_TEMP, + VREG_C_BT_REMAIN, + VREG_C_BT_REMAIN_FINE, + VREG_C_BT_VOLTAGE, + + VREG_C_STATUS_1 = 0x0E, + VREG_C_STATUS = 0x0F, + + VREG_C_IRQ0 = 0x10, + VREG_C_IRQ1, + VREG_C_IRQ2, + VREG_C_IRQ3, + VREG_C_IRQ4, + + VREG_C_IRQ_MASK0 = 0x18, + VREG_C_IRQ_MASK1, + VREG_C_IRQ_MASK2, + VREG_C_IRQ_MASK3, + VREG_C_IRQ_MASK4, + + VREG_C_COMMAND0 = 0x20, + VREG_C_COMMAND1, + VREG_C_COMMAND2, + VREG_C_COMMAND3, // 'r' でマイコンリセット、 'w' でWDTリセット + + VREG_C_OFF_DELAY = 0x24, + VREG_C_VOL_DIGITAL = 0x25, + VREG_C_VOL_OPTION, + VREG_C_VOL_ADC_RAW, + + VREG_C_LED_BRIGHT = 0x28, + VREG_C_LED_POW, + VREG_C_LED_WIFI, + VREG_C_LED_CAM, + VREG_C_LED_3D, + VREG_C_LED_NOTIFY_DATA, + VREG_C_LED_NOTIFY_FLAG, + + VREG_C_RTC_SEC = 0x30, + VREG_C_RTC_MIN, + VREG_C_RTC_HOUR, + VREG_C_RTC_YOBI, + VREG_C_RTC_DAY, + VREG_C_RTC_MONTH, + VREG_C_RTC_YEAR, + + VREG_C_RTC_COMP, + + VREG_C_RTC_ALARM_MIN = 0x38, + VREG_C_RTC_ALARM_HOUR, + VREG_C_RTC_ALARM_DAY, + VREG_C_RTC_ALARM_MONTH, + VREG_C_RTC_ALARM_YEAR, + + VREG_C_RTC_SEC_FINE_L, + VREG_C_RTC_SEC_FINE_H, + + VREG_C_ACC_CONFIG = 0x40, + VREG_C_ACC_R_ADRS, + VREG_C_ACC_RESERVE, + VREG_C_ACC_W_ADRS, + VREG_C_ACC_W_BUF, + + VREG_C_ACC_XL = 0x45, + VREG_C_ACC_XH, + VREG_C_ACC_YL, + VREG_C_ACC_YH, + VREG_C_ACC_ZL, + VREG_C_ACC_ZH, + + VREG_C_ACC_HOSU_L = 0x4B, + VREG_C_ACC_HOSU_M, + VREG_C_ACC_HOSU_H, + VREG_C_ACC_HOSU_SETTING, + VREG_C_ACC_HOSU_HIST = 0x4F, + + VREG_C_ACC_HOSU_HOUR_BOUNDARY = 0x50, + VREG_C_ACC_HOSU_HOUR_BOUNDARY_SEC, + + VREG_C_VOL_CAL_MIN = 0x58, + VREG_C_VOL_CAL_MAX, + + VREG_C_ENDMARK_ +}; + +#define VREG_CX_INFO 0x7F +#define VREG_CX_FREE_ADRS 0x60 +#define VREG_CX_FREE_DATA 0x61 +// VREG_C_AMBIENT_BRIGHTNESS = 0xXX, + + + + +/*============================================================================*/ +void vreg_ctr_init( ); +void vreg_ctr_reset( ); +void vreg_ctr_write( u8 adrs, u8 data ); +u8 vreg_ctr_read( u8 phy_adrs ); +void vreg_ctr_after_read( u8 adrs, u8 data ); +void set_irq( u8 irqreg, u8 irq_flg ); + +#endif diff --git a/branches/sim/vreg_twl.c b/branches/sim/vreg_twl.c new file mode 100644 index 0000000..0bd0caa --- /dev/null +++ b/branches/sim/vreg_twl.c @@ -0,0 +1,150 @@ +/* ======================================================== + +TWL互換側のI2Cレジスタ + + ======================================================== */ +#include "incs.h" +#include "jhl_defs.h" +#include "led.h" + +#include "vreg_twl.h" +#include "vreg_ctr.h" + +// ======================================================== +#define TWL_REG_VER_INFO 0x35 +#define NON_EXIST_REG 0xFF + +// ======================================================== +u8 vreg_twl[_REG_TWL_INT_ADRS_ENDMARK]; + +extern bit twl_ver_read; +extern bit cam_led_update; + +extern bit vol_changed_by_twl; + + +/* ======================================================== + 仮想レジスタの初期化 + ======================================================== */ +void vreg_twl_init( ) +{ + vreg_twl[ REG_TWL_INT_ADRS_MODE ] = 0x03; + vreg_twl[ REG_TWL_INT_ADRS_IRQ ] = 0; + vreg_twl[ REG_TWL_INT_ADRS_CAM ] = 0; + vreg_twl[ REG_TWL_INT_ADRS_TEMP0 ] = 0; +} + +// ======================================================== +// I2C仮想レジスタに書く・何かアクションする +// 引数 adrs は内部アドレス +//  存在しないアドレスにアクセスした場合、何もしません。 +void vreg_twl_write( u8 adrs, u8 data ) +{ + switch ( adrs ) + { + case ( REG_TWL_INT_ADRS_VOL ): + { + vol_changed_by_twl = true; + vreg_twl[ REG_TWL_INT_ADRS_VOL ] = data; + //renge_task_immed_add( tski_vol_update ); + vol_polling = 3; + break; + } + + case ( REG_TWL_INT_ADRS_MODE ): + vreg_twl[ REG_TWL_INT_ADRS_MODE ] = ( data & 0x83 ); // [8]vol32 [1:0]nand + break; + + case ( REG_TWL_INT_ADRS_CAM ): + vreg_twl[ REG_TWL_INT_ADRS_CAM ] = ( data & 0x03 ); + if( ( data & 0x03 ) == TWL_CAMLED_BLINK ) + { + cam_led_update = true; // こうでないと一発消灯時に不具合があるため + } + tsk_led_cam(); + break; + + case ( REG_TWL_INT_ADRS_TEMP0 ): + vreg_twl[ REG_TWL_INT_ADRS_TEMP0 ] = data; + break; + + case ( REG_TWL_INT_ADRS_COMMAND ): +/* + if( data <= 2 ){ + if( ( data & REG_BIT_TWL_OFF_REQ ) != 0 ) + { + set_irq( VREG_C_IRQ2, REG_BIT_TWL_OFF_REQ ); // OFFも実装していたらしい。 + break; + } + else if( ( data & REG_BIT_TWL_RESET_REQ ) != 0 ) + { + set_irq( VREG_C_IRQ2, REG_BIT_TWL_RESET_REQ ); //リセットしかない。他のは、SPIから来ます。 + break; + } + } +*/ + if( data == REG_BIT_TWL_RESET_REQ ) + { + set_irq( VREG_C_IRQ2, REG_BIT_TWL_RESET_REQ ); //リセットしかない。他のは、SPIから来ます。 + break; + } + } + return; +} + + + +// ======================================================== +// I2C仮想レジスタから読みます。 +// 引数 adrs 外から見たときの、アドレス +// 戻り xx データ +//  存在しないアドレスにアクセスした場合、戻り値は0x5A +u8 vreg_twl_read( u8 phy_adrs ) +{ + u8 temp; + + switch( phy_adrs ){ + // 10%以下で赤になる + case( REG_TWL_INT_ADRS_POWER_INFO ): + // レベルのセットは get_batt_left()内(処理が遅くて無理でした) + return( vreg_twl[ REG_TWL_INT_ADRS_POWER_INFO ] | ( !PM_EXTDC_n ? 0x80: 0x00 ) ); // アダプタbit(アダプタ有無) + + case( REG_TWL_INT_ADRS_IRQ ): + temp = vreg_twl[ REG_TWL_INT_ADRS_IRQ ]; + vreg_twl[ REG_TWL_INT_ADRS_IRQ ]= 0; + return( temp ); + + case( REG_TWL_INT_ADRS_VER_INFO ): +// set_irq( VREG_C_IRQ2, REG_BIT_TWL_VER_READ ); // 速度的に無理なので + twl_ver_read = true; + return( TWL_REG_VER_INFO ); + + case( REG_TWL_ADRS_NON_EXIST ): + return( 0x00 ); + + default: + return( vreg_twl[ phy_adrs ] ); + } +} + + + +// ======================================================== +// 外部から見える虫食いアドレスを、内部の連続アドレスに読み替える +// 0xFFは存在しないアドレス。 +u8 adrs_table_twl_ext2int( u8 img ) +{ + switch( img ){ + case( REG_TWL_ADRS_IRQ ): return( REG_TWL_INT_ADRS_IRQ ); + case( REG_TWL_ADRS_COMMAND ): return( REG_TWL_INT_ADRS_COMMAND ); + case( REG_TWL_ADRS_POWER_INFO ): return( REG_TWL_INT_ADRS_POWER_INFO ); + case( REG_TWL_ADRS_VOL ): return( REG_TWL_INT_ADRS_VOL ); + case( REG_TWL_ADRS_CAM ): return( REG_TWL_INT_ADRS_CAM ); + case( REG_TWL_ADRS_TEMP0 ): return( REG_TWL_INT_ADRS_TEMP0 ); + case( REG_TWL_ADRS_VER_INFO ): return( REG_TWL_INT_ADRS_VER_INFO ); + case( REG_TWL_ADRS_MODE ): return( REG_TWL_INT_ADRS_MODE ); + default: return( REG_TWL_ADRS_NON_EXIST ); +// 0が読めればよい、書けなくて良い +// case( REG_TWL_ADRS_WIFI ): return( REG_TWL_INT_ADRS_WIFI ); + } +} diff --git a/branches/sim/vreg_twl.h b/branches/sim/vreg_twl.h new file mode 100644 index 0000000..63cdd94 --- /dev/null +++ b/branches/sim/vreg_twl.h @@ -0,0 +1,127 @@ +#ifndef __vreg_twl__ +#define __vreg_twl__ +/* ========================================================================= */ +extern u8 vreg_twl[]; + + +/* + * 外から見たときのマイコンレジスタアドレス。 + * 拡張性などを考えて飛び飛びにしてある。 + */ +/* + * 割り込み要因フラグは + * MSB:外部電源供給有り/なし変化 (未実装) + * 6:Volキー操作(変更に限らず。MAX時に+でも。) + * 5:電池電圧 少 検出 + * 4: 僅 + * 3:電源スイッチ 押され検出 + * 2:(未設定) + * 1:電源スイッチ OFF 時間押され検出 + * LSB: リセット + */ +enum REG_TWL_ADRS +{ // 未定義アドレスへ書き込んだ際は無視 + REG_TWL_ADRS_VER_INFO = 0x00, + REG_TWL_ADRS_PMIC_INFO, + REG_TWL_ADRS_BATT_INFO, + REG_TWL_ADRS_IRQ = 0x10, + REG_TWL_ADRS_COMMAND, + REG_TWL_ADRS_MODE, + REG_TWL_ADRS_POWER_INFO = 0x20, + REG_TWL_ADRS_POWER_SAVE, + REG_TWL_ADRS_WIFI = 0x30, + REG_TWL_ADRS_CAM, + REG_TWL_ADRS_VOL = 0x40, + REG_TWL_ADRS_BL, + REG_TWL_ADRS_CODEC_MIC_GAIN = 0x50, + REG_TWL_ADRS_ADC_CALIB = 0x60, + REG_TWL_ADRS_ADC_CALIB_STATUS, + REG_TWL_ADRS_ADC_CALIB_VALUE, + REG_TWL_ADRS_POWER_LED, + REG_TWL_ADRS_TEMP0 = 0x70, + REG_TWL_ADRS_TEMP1, + REG_TWL_ADRS_TEMP2, + REG_TWL_ADRS_TEMP3, + REG_TWL_ADRS_TEMP4, + REG_TWL_ADRS_TEMP5, + REG_TWL_ADRS_TEMP6, + REG_TWL_ADRS_TEMP7, + REG_TWL_ADRS_TIME_PWSW_DELAY = 0x80, + REG_TWL_ADRS_TIME_PWSW_THRESHOLD +}; + +#define REG_TWL_ADRS_NON_EXIST 0xFF + +/* + * マイコン内部でのレジスタの実装 + * もちろんつめてある + */ +enum REG_TWL_ADRS_INT +{ + REG_TWL_INT_ADRS_VER_INFO = 0x00, +// REG_TWL_INT_ADRS_PMIC_INFO, +// REG_TWL_INT_ADRS_BATT_INFO, + REG_TWL_INT_ADRS_IRQ, // 0x10, + REG_TWL_INT_ADRS_COMMAND, + REG_TWL_INT_ADRS_MODE, + REG_TWL_INT_ADRS_POWER_INFO, // 0x20, +// REG_TWL_INT_ADRS_POWER_SAVE, +// REG_TWL_INT_ADRS_WIFI, // 0x30, + REG_TWL_INT_ADRS_CAM, + REG_TWL_INT_ADRS_VOL, // 0x40, +// REG_TWL_INT_ADRS_BL, +// REG_TWL_INT_ADRS_CODEC_MIC_GAIN, // 0x50, +// REG_TWL_INT_ADRS_CODEC_MIC_GAIN_RELOAD, +// REG_TWL_INT_ADRS_ADC_CALIB, // 0x60, +// REG_TWL_INT_ADRS_ADC_CALIB_STATUS, +// REG_TWL_INT_ADRS_ADC_CALIB_VALUE, +// REG_TWL_INT_ADRS_POWER_LED, + REG_TWL_INT_ADRS_TEMP0, // 0x70 - 0x77 + REG_TWL_INT_ADRS_TEMP1, + REG_TWL_INT_ADRS_TEMP2, + REG_TWL_INT_ADRS_TEMP3, + REG_TWL_INT_ADRS_TEMP4, + REG_TWL_INT_ADRS_TEMP5, + REG_TWL_INT_ADRS_TEMP6, + REG_TWL_INT_ADRS_TEMP7, +// REG_TWL_INT_ADRS_TIME_PWSW_DELAY, +// REG_TWL_INT_ADRS_TIME_PWSW_THRESHOLD + _REG_TWL_INT_ADRS_ENDMARK, +}; + + + +/* ========================================================================= */ +#define is_TWL ( vreg_twl[ REG_TWL_INT_ADRS_MODE ] & 0x01 ) +#define with_NAND ( vreg_twl[ REG_TWL_INT_ADRS_MODE ] & 0x02 ) +#define volSteps32 ( vreg_twl[ REG_TWL_INT_ADRS_MODE ] & 0x80 ) + +#define reg_wifi_led ( vreg_twl[ REG_TWL_INT_ADRS_WIFI ] & 0x01 ) +#define reg_wifi_led_blink ( vreg_twl[ REG_TWL_INT_ADRS_WIFI ] & 0x02 ) + +#define REG_TWL_ADRS_MODE__VOL32 ( 1 << 7 ) + +typedef enum CAM_LED_TWL_MODE +{ + TWL_CAMLED_OFF, + TWL_CAMLED_ON, + TWL_CAMLED_BLINK, + TWL_CAMLED_DEF_ON +}twl_camLed_mode; + + +/* ========================================================================= */ +void vreg_twl_init( ); +void vreg_twl_write( u8 adrs, u8 data ); +u8 adrs_table_twl_ext2int( u8 img ); +u8 vreg_twl_read( u8 phy_adrs ); + + +// 読んだらクリアなどの処理 +#define vreg_twl_after_read( reg_adrs ); \ + if( reg_adrs == REG_TWL_INT_ADRS_IRQ ) \ + { \ + vreg_twl[ REG_TWL_INT_ADRS_IRQ ]= 0;\ + } + +#endif diff --git a/branches/sim/yav_mcu_bsr.plg b/branches/sim/yav_mcu_bsr.plg new file mode 100644 index 0000000..955cec1 --- /dev/null +++ b/branches/sim/yav_mcu_bsr.plg @@ -0,0 +1,152 @@ +C:\WINDOWS\system32\cmd.exe /c touch magic.c +"D:\Program Files\NEC Electronics Tools\CC78K0R\W2.12\bin\cc78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff -irenge -i"C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r" -ms -qvjl2w -sainter_asm -zpb -no loader.c +loader.c(121) : CC78K0R warning W0401: Conversion may lose significant digits +loader.c(122) : CC78K0R warning W0401: Conversion may lose significant digits +Compilation complete, 0 error(s) and 2 warning(s) found. +"D:\Program Files\NEC Electronics Tools\RA78K0R\W1.33\bin\ra78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff inter_asm\loader.asm +Assembly complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\CC78K0R\W2.12\bin\cc78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff -irenge -i"C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r" -ms -qvjl2w -sainter_asm -zpb -no pm.c +pm.c(801) : CC78K0R warning W0401: Conversion may lose significant digits +pm.c(878) : CC78K0R warning W0401: Conversion may lose significant digits +pm.c(886) : CC78K0R warning W0401: Conversion may lose significant digits +pm.c(1101) : CC78K0R warning W0401: Conversion may lose significant digits +pm.c(1104) : CC78K0R warning W0401: Conversion may lose significant digits +Compilation complete, 0 error(s) and 5 warning(s) found. +"D:\Program Files\NEC Electronics Tools\RA78K0R\W1.33\bin\ra78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff inter_asm\pm.asm +Assembly complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\CC78K0R\W2.12\bin\cc78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff -irenge -i"C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r" -ms -qvjl2w -sainter_asm -zpb -no i2c_ctr.c +Compilation complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\RA78K0R\W1.33\bin\ra78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff inter_asm\i2c_ctr.asm +Assembly complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\CC78K0R\W2.12\bin\cc78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff -irenge -i"C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r" -ms -qvjl2w -sainter_asm -zpb -no main.c +Compilation complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\RA78K0R\W1.33\bin\ra78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff inter_asm\main.asm +Assembly complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\CC78K0R\W2.12\bin\cc78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff -irenge -i"C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r" -ms -qvjl2w -sainter_asm -zpb -no magic.c +Compilation complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\RA78K0R\W1.33\bin\ra78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff inter_asm\magic.asm +Assembly complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\CC78K0R\W2.12\bin\cc78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff -irenge -i"C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r" -ms -qvjl2w -sainter_asm -zpb -no WDT.c +Compilation complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\RA78K0R\W1.33\bin\ra78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff inter_asm\WDT.asm +Assembly complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\CC78K0R\W2.12\bin\cc78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff -irenge -i"C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r" -ms -qvjl2w -sainter_asm -zpb -no i2c_mcu.c +i2c_mcu.c(210) : CC78K0R warning W0401: Conversion may lose significant digits +Compilation complete, 0 error(s) and 1 warning(s) found. +"D:\Program Files\NEC Electronics Tools\RA78K0R\W1.33\bin\ra78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff inter_asm\i2c_mcu.asm +Assembly complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\CC78K0R\W2.12\bin\cc78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff -irenge -i"C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r" -ms -qvjl2w -sainter_asm -zpb -no i2c_twl.c +Compilation complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\RA78K0R\W1.33\bin\ra78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff inter_asm\i2c_twl.asm +Assembly complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\CC78K0R\W2.12\bin\cc78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff -irenge -i"C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r" -ms -qvjl2w -sainter_asm -zpb -no led.c +led.c(109) : CC78K0R warning W0745: Expected function prototype +led.c(251) : CC78K0R warning W0401: Conversion may lose significant digits +led.c(256) : CC78K0R warning W0401: Conversion may lose significant digits +led.c(318) : CC78K0R warning W0401: Conversion may lose significant digits +led.c(377) : CC78K0R warning W0401: Conversion may lose significant digits +led.c(403) : CC78K0R warning W0401: Conversion may lose significant digits +led.c(579) : CC78K0R warning W0401: Conversion may lose significant digits +Compilation complete, 0 error(s) and 7 warning(s) found. +"D:\Program Files\NEC Electronics Tools\RA78K0R\W1.33\bin\ra78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff inter_asm\led.asm +Assembly complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\CC78K0R\W2.12\bin\cc78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff -irenge -i"C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r" -ms -qvjl2w -sainter_asm -zpb -no rtc.c +Compilation complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\RA78K0R\W1.33\bin\ra78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff inter_asm\rtc.asm +Assembly complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\CC78K0R\W2.12\bin\cc78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff -irenge -i"C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r" -ms -qvjl2w -sainter_asm -zpb -no vreg_ctr.c +vreg_ctr.c(163) : CC78K0R warning W0401: Conversion may lose significant digits +vreg_ctr.c(164) : CC78K0R warning W0401: Conversion may lose significant digits +vreg_ctr.c(166) : CC78K0R warning W0401: Conversion may lose significant digits +vreg_ctr.c(168) : CC78K0R warning W0401: Conversion may lose significant digits +vreg_ctr.c(169) : CC78K0R warning W0401: Conversion may lose significant digits +vreg_ctr.c(216) : CC78K0R warning W0401: Conversion may lose significant digits +vreg_ctr.c(216) : CC78K0R warning W0401: Conversion may lose significant digits +vreg_ctr.c(221) : CC78K0R warning W0401: Conversion may lose significant digits +vreg_ctr.c(221) : CC78K0R warning W0401: Conversion may lose significant digits +vreg_ctr.c(225) : CC78K0R warning W0401: Conversion may lose significant digits +vreg_ctr.c(225) : CC78K0R warning W0401: Conversion may lose significant digits +vreg_ctr.c(229) : CC78K0R warning W0401: Conversion may lose significant digits +vreg_ctr.c(229) : CC78K0R warning W0401: Conversion may lose significant digits +vreg_ctr.c(233) : CC78K0R warning W0401: Conversion may lose significant digits +Compilation complete, 0 error(s) and 14 warning(s) found. +"D:\Program Files\NEC Electronics Tools\RA78K0R\W1.33\bin\ra78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff inter_asm\vreg_ctr.asm +Assembly complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\CC78K0R\W2.12\bin\cc78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff -irenge -i"C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r" -ms -qvjl2w -sainter_asm -zpb -no vreg_twl.c +vreg_twl.c(57) : CC78K0R warning W0401: Conversion may lose significant digits +vreg_twl.c(61) : CC78K0R warning W0401: Conversion may lose significant digits +Compilation complete, 0 error(s) and 2 warning(s) found. +"D:\Program Files\NEC Electronics Tools\RA78K0R\W1.33\bin\ra78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff inter_asm\vreg_twl.asm +Assembly complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\CC78K0R\W2.12\bin\cc78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff -irenge -i"C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r" -ms -qvjl2w -sainter_asm -zpb -no adc.c +adc.c(103) : CC78K0R warning W0401: Conversion may lose significant digits +adc.c(200) : CC78K0R warning W0401: Conversion may lose significant digits +adc.c(232) : CC78K0R warning W0401: Conversion may lose significant digits +adc.c(344) : CC78K0R warning W0401: Conversion may lose significant digits +adc.c(384) : CC78K0R warning W0401: Conversion may lose significant digits +adc.c(462) : CC78K0R warning W0745: Expected function prototype +adc.c(491) : CC78K0R warning W0401: Conversion may lose significant digits +adc.c(496) : CC78K0R warning W0401: Conversion may lose significant digits +adc.c(122) : CC78K0R warning W0401: Conversion may lose significant digits +Compilation complete, 0 error(s) and 9 warning(s) found. +"D:\Program Files\NEC Electronics Tools\RA78K0R\W1.33\bin\ra78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff inter_asm\adc.asm +Assembly complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\CC78K0R\W2.12\bin\cc78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff -irenge -i"C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r" -ms -qvjl2w -sainter_asm -zpb -no renge\renge.c +Compilation complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\RA78K0R\W1.33\bin\ra78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff inter_asm\renge.asm +Assembly complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\CC78K0R\W2.12\bin\cc78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff -irenge -i"C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r" -ms -qvjl2w -sainter_asm -zpb -no accero.c +Compilation complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\RA78K0R\W1.33\bin\ra78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff inter_asm\accero.asm +Assembly complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\CC78K0R\W2.12\bin\cc78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff -irenge -i"C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r" -ms -qvjl2w -sainter_asm -zpb -no self_flash.c +self_flash.c(271) : CC78K0R warning W0401: Conversion may lose significant digits +self_flash.c(272) : CC78K0R warning W0401: Conversion may lose significant digits +Compilation complete, 0 error(s) and 2 warning(s) found. +"D:\Program Files\NEC Electronics Tools\RA78K0R\W1.33\bin\ra78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff inter_asm\self_flash.asm +Assembly complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\CC78K0R\W2.12\bin\cc78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff -irenge -i"C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r" -ms -qvjl2w -sainter_asm -zpb -no sw.c +Compilation complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\RA78K0R\W1.33\bin\ra78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff inter_asm\sw.asm +Assembly complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\CC78K0R\W2.12\bin\cc78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff -irenge -i"C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r" -ms -qvjl2w -sainter_asm -zpb -no task_debug.c +Compilation complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\RA78K0R\W1.33\bin\ra78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff inter_asm\task_debug.asm +Assembly complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\CC78K0R\W2.12\bin\cc78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff -irenge -i"C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r" -ms -qvjl2w -sainter_asm -zpb -no task_misc.c +task_misc.c(300) : CC78K0R warning W0401: Conversion may lose significant digits +Compilation complete, 0 error(s) and 1 warning(s) found. +"D:\Program Files\NEC Electronics Tools\RA78K0R\W1.33\bin\ra78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff inter_asm\task_misc.asm +Assembly complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\CC78K0R\W2.12\bin\cc78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff -irenge -i"C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r" -ms -qvjl2w -sainter_asm -zpb -no task_sys.c +task_sys.c(207) : CC78K0R warning W0401: Conversion may lose significant digits +task_sys.c(525) : CC78K0R warning W0401: Conversion may lose significant digits +Compilation complete, 0 error(s) and 2 warning(s) found. +"D:\Program Files\NEC Electronics Tools\RA78K0R\W1.33\bin\ra78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff inter_asm\task_sys.asm +Assembly complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\CC78K0R\W2.12\bin\cc78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff -irenge -i"C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r" -ms -qvjl2w -sainter_asm -zpb -no pedo_alg_thre_det2.c +pedo_alg_thre_det2.c(58) : CC78K0R warning W0745: Expected function prototype +pedo_alg_thre_det2.c(73) : CC78K0R warning W0401: Conversion may lose significant digits +pedo_alg_thre_det2.c(140) : CC78K0R warning W0401: Conversion may lose significant digits +pedo_alg_thre_det2.c(153) : CC78K0R warning W0401: Conversion may lose significant digits +Compilation complete, 0 error(s) and 4 warning(s) found. +"D:\Program Files\NEC Electronics Tools\RA78K0R\W1.33\bin\ra78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff inter_asm\pedo_alg_thre_det2.asm +Assembly complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\CC78K0R\W2.12\bin\cc78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff -irenge -i"C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r" -ms -qvjl2w -sainter_asm -zpb -no ini_VECT.c +Compilation complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\RA78K0R\W1.33\bin\ra78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff inter_asm\ini_VECT.asm +Assembly complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\CC78K0R\W2.12\bin\cc78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff -irenge -i"C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r" -ms -qvjl2w -sainter_asm -zpb -no task_status.c +Compilation complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\RA78K0R\W1.33\bin\ra78k0r.exe" -c9F0104 -y"d:\program files\nec electronics tools\dev" -_msgoff inter_asm\task_status.asm +Assembly complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\RA78K0R\W1.33\bin\lk78k0r.exe" -y"d:\program files\nec electronics tools\dev" -_msgoff -obsr.lmf "..\..\..\..\Program Files\NEC Electronics Tools\CC78K0R\W2.12\lib78k0r\s0rm.rel" -gi1B339499E033F240BFAAh -pbsr_k0r.map -nkd -gb7EFBFFh -b"C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\lib78k0r\fsl.lib" -bcl0rdm.lib -bcl0rm.lib -bcl0rmf.lib -i"D:\Program Files\NEC Electronics Tools\CC78K0R\W2.12\lib78k0r" -dbsr_mcu.dr -s -w0 loader.rel pm.rel i2c_ctr.rel main.rel magic.rel WDT.rel i2c_mcu.rel i2c_twl.rel led.rel rtc.rel vreg_ctr.rel vreg_twl.rel adc.rel renge.rel accero.rel self_flash.rel sw.rel task_debug.rel task_misc.rel task_sys.rel pedo_alg_thre_det2.rel ini_VECT.rel task_status.rel +Link complete, 0 error(s) and 0 warning(s) found. +"D:\Program Files\NEC Electronics Tools\RA78K0R\W1.33\bin\oc78k0r.exe" -y"d:\program files\nec electronics tools\dev" -_msgoff -o.\bsr.hex -nu -ki bsr.lmf +Object Conversion Complete, 0 error(s) and 0 warning(s) found. +C:\WINDOWS\system32\cmd.exe /c ruby nec_s_2_bsrbin2.rb bsr.hex +intel-HEX to bsr bin converter + file converted! + + +Build Total error(s) : 0 Total warning(s) : 49 diff --git a/branches/sim/yav_mcu_bsr.pri b/branches/sim/yav_mcu_bsr.pri new file mode 100644 index 0000000..edd788b --- /dev/null +++ b/branches/sim/yav_mcu_bsr.pri @@ -0,0 +1,1025 @@ +[Project.ID] +Ver=200 +Target=IDK0R32G +[Configuration] +Chip=uPD79F0104 +Internal Rom=32KB +Internal Ram=1536B +Clock=Target +Sub Clock=Target +Peripheral Break=0x3 +Firm Clock=System +Flash Programming=Permit +Low-voltage Flash Rewriting=On +Fail Safe Break=0x2000 +Port=1 +NMI=OFF +TRESET=OFF +IRESET=OFF +WAIT=OFF +SysClock=None +SubClock=None +[Mapping] +Count=0 +[Main] +Geometry=154, 154, 1080, 635 +Window=Max +MDI_MAX=OFF +Button=ON +Mode=Auto +Trace=Uncond ON +Trace2=Non Stop +Coverage=OFF +Timer=OFF +Tracer=OFF +[Load File] +Dir=\\Tsclient\c\78k_data\yav-mcu-basara\trunk\ +SaveFilter=0 +Start=0 +End=0 +LoadFilter=5 +Offset=0 +Object=ON +Symbol=ON +Erase=OFF +HighSpeed=OFF +Symbol Reset=ON +CPU Reset=ON +File1=\\Tsclient\c\78k_data\yav-mcu-basara\trunk\bsr.lmf +LoadFilter1=5 +Offset1=0 +Object1=ON +Symbol1=ON +Erase1=OFF +HighSpeed1=OFF +CPU Reset1=ON +Symbol Reset1=ON +[View File] +Dir=\\Tsclient\c\78k_data\yav-mcu-basara\trunk\ +Filter=Source +[Debugger Option] +Source Path="" +Symbol Size=Byte +Symbol Format=Hex +Register Name=Func +Offset Label=OFF +Offset Mnemonic=ON +Tab Count=4 +Tab Size1=*.*, 8 +Tab Size2=*.c, 8 +Tab Size3=*.s, 8 +Tab Size4=*.asm, 8 +Default Source=*.c;*.s;*.asm +Default Module=*.lnk;*.lmf +Startup Start=_@cstart +Startup End=_@cend +Main Symbol=_main +Symbol Type=OFF +Language=C +Kanji=SJIS +[Source] +Geometry=28, 27, 1001, 770 +Window=Normal +DispStart=432 +CaretPos=433,0 +Mode=Normal +DispFile= +Address1= +Address2= +Address3= +Address4= +Address5= +Address6= +Address7= +Address8= +Address9= +Address10= +Address11= +Address12= +Address13= +Address14= +Address15= +Address16= +Data1= +Data2= +Data3= +Data4= +Data5= +Data6= +Data7= +Data8= +Data9= +Data10= +Data11= +Data12= +Data13= +Data14= +Data15= +Data16= +Option=0 +Case=ON +Direction=Down +File1= +File2= +File3= +File4= +File5= +File6= +File7= +File8= +File9= +File10= +File11= +File12= +File13= +File14= +File15= +File16= +SaveRange=Screen +SaveStart= +SaveEnd= +Accumulative=ON +[Assemble] +Geometry=43, 31, 727, 721 +Window=Hide +DispStart=847754240 +CaretPos=0,0 +Address1= +Address2= +Address3= +Address4= +Address5= +Address6= +Address7= +Address8= +Address9= +Address10= +Address11= +Address12= +Address13= +Address14= +Address15= +Address16= +Data1= +Data2= +Data3= +Data4= +Data5= +Data6= +Data7= +Data8= +Data9= +Data10= +Data11= +Data12= +Data13= +Data14= +Data15= +Data16= +Case=ON +Scan=OFF +Direction=Down +FindStart=0 +FindEnd=0 +SaveRange=Screen +SaveStart= +SaveEnd= +[Memory] +Geometry=244, 107, 550, 400 +Window=Normal +Boundary=163 +Format=Hex +Mode=Byte +Endian=Little +Ascii=OFF +Idtag=OFF +Address= +DispStart=000F2220 +CaretPosData=26, 62009 +CaretPosAscii=50176, 0 +Address1= +Address2= +Address3= +Address4= +Address5= +Address6= +Address7= +Address8= +Address9= +Address10= +Address11= +Address12= +Address13= +Address14= +Address15= +Address16= +Data1= +Data2= +Data3= +Data4= +Data5= +Data6= +Data7= +Data8= +Data9= +Data10= +Data11= +Data12= +Data13= +Data14= +Data15= +Data16= +Binary=ON +Scan=OFF +Direction=DOWN +FindStart= +FindEnd= +Unit=Byte +SaveRange=Screen +SaveStart= +SaveEnd= +Accumulative=ON +[Memory fill] +Scope=0, 0 +Code=0 +[Memory copy] +Scope=0, 0 +To=0 +[Memory compare] +Source=0, 0 +Destination=0 +[I/O Port] +Line=0 +[Stack] +Geometry=0, 0, 0, 0 +Window=Hide +Boundary=0 +Mode=Proper +[Sfr] +Geometry=0, 0, 0, 0 +Window=Hide +Address1= +Address2= +Address3= +Address4= +Address5= +Address6= +Address7= +Address8= +Address9= +Address10= +Address11= +Address12= +Address13= +Address14= +Address15= +Address16= +Boundary=0, 0 +Mode=Hex +Attribute=Show +Sort=Unsort +Pickup=OFF +SelectSort=Address +Last Name= +Line=531 +L1=P0 +L2=P1 +L3=P2 +L4=P3 +L5=P4 +L6=P5 +L7=P6 +L8=P7 +L9=P12 +L10=P14 +L11=P15 +L12=SDR00 +L13=SIO00 +L14=TXD0 +L15=SDR01 +L16=RXD0 +L17=SIO01 +L18=TDR00 +L19=TDR01 +L20=ADCRH +L21=PM0 +L22=PM1 +L23=PM2 +L24=PM3 +L25=PM4 +L26=PM5 +L27=PM6 +L28=PM7 +L29=PM12 +L30=PM14 +L31=PM15 +L32=ADM +L33=ADCE +L34=ADCS +L35=ADS +L36=KRM +L37=EGP0 +L38=EGN0 +L39=ISC +L40=TIS0 +L41=SDR02 +L42=SIO10 +L43=TXD1 +L44=SDR03 +L45=RXD1 +L46=IICA0 +L47=IICS0 +L48=SPD0 +L49=STD0 +L50=ACKD0 +L51=TRC0 +L52=COI0 +L53=EXC0 +L54=ALD0 +L55=MSTS0 +L56=IICF0 +L57=IICRSV0 +L58=STCEN0 +L59=IICBSY0 +L60=STCF0 +L61=TDR02 +L62=TDR03 +L63=TDR04 +L64=TDR05 +L65=TDR06 +L66=TDR07 +L67=RSUBC +L68=SEC +L69=MIN +L70=HOUR +L71=WEEK +L72=DAY +L73=MONTH +L74=YEAR +L75=SUBCUD +L76=ALARMWM +L77=ALARMWH +L78=ALARMWW +L79=RTCC0 +L80=RCLOE0 +L81=RCLOE1 +L82=RTCE +L83=RTCC1 +L84=RWAIT +L85=RWST +L86=RIFG +L87=WAFG +L88=WALIE +L89=WALE +L90=RTCC2 +L91=RCKDIV +L92=RCLOE2 +L93=RINTE +L94=CMC +L95=CSC +L96=HIOSTOP +L97=XTSTOP +L98=MSTOP +L99=OSTC +L100=OSTS +L101=CKC +L102=MCM0 +L103=MCS +L104=CSS +L105=CLS +L106=CKS0 +L107=PCLOE0 +L108=CKS1 +L109=PCLOE1 +L110=RESF +L111=LVIM +L112=LVIF +L113=LVIMD +L114=LVISEL +L115=LVION +L116=LVIS +L117=WDTE +L118=DSA0 +L119=DSA1 +L120=DRA0 +L121=DRA0L +L122=DRA0H +L123=DRA1 +L124=DRA1L +L125=DRA1H +L126=DBC0 +L127=DBC0L +L128=DBC0H +L129=DBC1 +L130=DBC1L +L131=DBC1H +L132=DMC0 +L133=DWAIT0 +L134=DS0 +L135=DRS0 +L136=STG0 +L137=DMC1 +L138=DWAIT1 +L139=DS1 +L140=DRS1 +L141=STG1 +L142=DRC0 +L143=DST0 +L144=DEN0 +L145=DRC1 +L146=DST1 +L147=DEN1 +L148=BECTL +L149=FLMDPUP +L150=PFCMD +L151=PFS +L152=FPRERR +L153=FLPMC +L154=BFAEN +L155=FWEPR +L156=BRAMEN +L157=IF2 +L158=IF2L +L159=TMIF05 +L160=TMIF06 +L161=TMIF07 +L162=PIF6 +L163=IF2H +L164=IICAIF1 +L165=PIF20 +L166=PIF21 +L167=PIF22 +L168=PIF23 +L169=MK2 +L170=MK2L +L171=TMMK05 +L172=TMMK06 +L173=TMMK07 +L174=PMK6 +L175=MK2H +L176=IICAMK1 +L177=PMK20 +L178=PMK21 +L179=PMK22 +L180=PMK23 +L181=PR02 +L182=PR02L +L183=TMPR005 +L184=TMPR006 +L185=TMPR007 +L186=PPR06 +L187=PR02H +L188=IICAPR01 +L189=PPR020 +L190=PPR021 +L191=PPR022 +L192=PPR023 +L193=PR12 +L194=PR12L +L195=TMPR105 +L196=TMPR106 +L197=TMPR107 +L198=PPR16 +L199=PR12H +L200=IICAPR11 +L201=PPR120 +L202=PPR121 +L203=PPR122 +L204=PPR123 +L205=IF0 +L206=IF0L +L207=WDTIIF +L208=LVIIF +L209=PIF0 +L210=PIF1 +L211=PIF2 +L212=PIF4 +L213=PIF5 +L214=IF0H +L215=DMAIF0 +L216=DMAIF1 +L217=CSIIF00 +L218=STIF0 +L219=CSIIF01 +L220=SRIF0 +L221=SREIF0 +L222=IF1 +L223=IF1L +L224=CSIIF10 +L225=IICIF10 +L226=STIF1 +L227=SRIF1 +L228=SREIF1 +L229=IICAIF0 +L230=TMIF00 +L231=TMIF01 +L232=TMIF02 +L233=TMIF03 +L234=IF1H +L235=ADIF +L236=RTCIF +L237=RTCIIF +L238=KRIF +L239=MDIF +L240=TMIF04 +L241=MK0 +L242=MK0L +L243=WDTIMK +L244=LVIMK +L245=PMK0 +L246=PMK1 +L247=PMK2 +L248=PMK4 +L249=PMK5 +L250=MK0H +L251=DMAMK0 +L252=DMAMK1 +L253=CSIMK00 +L254=STMK0 +L255=CSIMK01 +L256=SRMK0 +L257=SREMK0 +L258=MK1 +L259=MK1L +L260=CSIMK10 +L261=IICMK10 +L262=STMK1 +L263=SRMK1 +L264=SREMK1 +L265=IICAMK0 +L266=TMMK00 +L267=TMMK01 +L268=TMMK02 +L269=TMMK03 +L270=MK1H +L271=ADMK +L272=RTCMK +L273=RTCIMK +L274=KRMK +L275=MDMK +L276=TMMK04 +L277=PR00 +L278=PR00L +L279=WDTIPR0 +L280=LVIPR0 +L281=PPR00 +L282=PPR01 +L283=PPR02 +L284=PPR04 +L285=PPR05 +L286=PR00H +L287=DMAPR00 +L288=DMAPR01 +L289=CSIPR000 +L290=STPR00 +L291=CSIPR001 +L292=SRPR00 +L293=SREPR00 +L294=PR01 +L295=PR01L +L296=CSIPR010 +L297=IICPR010 +L298=STPR01 +L299=SRPR01 +L300=SREPR01 +L301=IICAPR00 +L302=TMPR000 +L303=TMPR001 +L304=TMPR002 +L305=TMPR003 +L306=PR01H +L307=ADPR0 +L308=RTCPR0 +L309=RTCIPR0 +L310=KRPR0 +L311=MDPR0 +L312=TMPR004 +L313=PR10 +L314=PR10L +L315=WDTIPR1 +L316=LVIPR1 +L317=PPR10 +L318=PPR11 +L319=PPR12 +L320=PPR14 +L321=PPR15 +L322=PR10H +L323=DMAPR10 +L324=DMAPR11 +L325=CSIPR100 +L326=STPR10 +L327=CSIPR101 +L328=SRPR10 +L329=SREPR10 +L330=PR11 +L331=PR11L +L332=CSIPR110 +L333=IICPR110 +L334=STPR11 +L335=SRPR11 +L336=SREPR11 +L337=IICAPR10 +L338=TMPR100 +L339=TMPR101 +L340=TMPR102 +L341=TMPR103 +L342=PR11H +L343=ADPR1 +L344=RTCPR1 +L345=RTCIPR1 +L346=KRPR1 +L347=MDPR1 +L348=TMPR104 +L349=MDAL +L350=MULA +L351=MDAH +L352=MULB +L353=MDBH +L354=MULOH +L355=MDBL +L356=MULOL +L357=PMC +L358=MAA +L359=ADPC +L360=PU0 +L361=PU1 +L362=PU3 +L363=PU4 +L364=PU5 +L365=PU7 +L366=PU12 +L367=PU14 +L368=PIM3 +L369=PIM7 +L370=POM3 +L371=POM7 +L372=NFEN0 +L373=NFEN1 +L374=NFEN2 +L375=MDCL +L376=MDCH +L377=MDUC +L378=DIVST +L379=DIVMODE +L380=PER0 +L381=SAU0EN +L382=IICA0EN +L383=ADCEN +L384=RTCEN +L385=PER2 +L386=TAU0EN +L387=OSMC +L388=BCDADJ +L389=SSR00 +L390=SSR00L +L391=SSR01 +L392=SSR01L +L393=SSR02 +L394=SSR02L +L395=SSR03 +L396=SSR03L +L397=SIR00 +L398=SIR00L +L399=SIR01 +L400=SIR01L +L401=SIR02 +L402=SIR02L +L403=SIR03 +L404=SIR03L +L405=SMR00 +L406=SMR01 +L407=SMR02 +L408=SMR03 +L409=SCR00 +L410=SCR01 +L411=SCR02 +L412=SCR03 +L413=SE0 +L414=SE0L +L415=SS0 +L416=SS0L +L417=ST0 +L418=ST0L +L419=SPS0 +L420=SPS0L +L421=SO0 +L422=SOE0 +L423=SOE0L +L424=SOL0 +L425=SOL0L +L426=TCR00 +L427=TCR01 +L428=TCR02 +L429=TCR03 +L430=TCR04 +L431=TCR05 +L432=TCR06 +L433=TCR07 +L434=TMR00 +L435=TMR01 +L436=TMR02 +L437=TMR03 +L438=TMR04 +L439=TMR05 +L440=TMR06 +L441=TMR07 +L442=TSR00 +L443=TSR00L +L444=TSR01 +L445=TSR01L +L446=TSR02 +L447=TSR02L +L448=TSR03 +L449=TSR03L +L450=TSR04 +L451=TSR04L +L452=TSR05 +L453=TSR05L +L454=TSR06 +L455=TSR06L +L456=TSR07 +L457=TSR07L +L458=TE0 +L459=TE0L +L460=TS0 +L461=TS0L +L462=TT0 +L463=TT0L +L464=TPS0 +L465=TPS0L +L466=TO0 +L467=TO0L +L468=TOE0 +L469=TOE0L +L470=TOL0 +L471=TOL0L +L472=TOM0 +L473=TOM0L +L474=IICCTL00 +L475=SPT0 +L476=STT0 +L477=ACKE0 +L478=WTIM0 +L479=SPIE0 +L480=WREL0 +L481=LREL0 +L482=IICE0 +L483=IICCTL10 +L484=DFC0 +L485=SMC0 +L486=DAD0 +L487=CLD0 +L488=WUP0 +L489=IICWL0 +L490=IICWH0 +L491=SVA0 +L492=PER3 +L493=IICA1EN +L494=P20 +L495=PM20 +L496=PU20 +L497=EGP2 +L498=EGN2 +L499=IICA1 +L500=IICS1 +L501=SPD1 +L502=STD1 +L503=ACKD1 +L504=TRC1 +L505=COI1 +L506=EXC1 +L507=ALD1 +L508=MSTS1 +L509=IICF1 +L510=IICRSV1 +L511=STCEN1 +L512=IICBSY1 +L513=STCF1 +L514=IICCTL01 +L515=SPT1 +L516=STT1 +L517=ACKE1 +L518=WTIM1 +L519=SPIE1 +L520=WREL1 +L521=LREL1 +L522=IICE1 +L523=IICCTL11 +L524=DFC1 +L525=SMC1 +L526=DAD1 +L527=CLD1 +L528=WUP1 +L529=IICWL1 +L530=IICWH1 +L531=SVA1 +[Local Variable] +Geometry=1032, 466, 400, 300 +Window=Normal +Boundary=13041851 +Mode=Proper +[Trace View] +Geometry=0, 0, 0, 0 +Window=Hide +Mode=Normal +Frame=Show +Timetag=Clock +Address=Show +Data=Hex +Status=Show +Address2=Show +Data2=Hex +Status2=Show +Disasm=Show +Pick Up=Off +Synchronize=0 0 0 0 +Frameno= +Frameno1= +Frameno2= +Frameno3= +Frameno4= +Frameno5= +Frameno6= +Frameno7= +Frameno8= +Frameno9= +Frameno10= +Frameno11= +Frameno12= +Frameno13= +Frameno14= +Frameno15= +Frameno16= +ScanStatus=ALL +Access Size=B +ScanAddress=<>-<> +Mask Address= +ScanData= +Mask Data= +ScanExternal= +Mask External= +Scan=OFF +Direction=Down +FindStart= +FindEnd= +SaveRange=Screen +SaveStart= +SaveEnd= +[Register] +Geometry=0, 0, 0, 0 +Window=Hide +Mode=Hex +Boundary=62 +Pickup=OFF +Name=Functional +Register Bank=0 +RP0=3 +RP1=3 +RP2=3 +RP3=3 +PC=3 +SP=3 +PSW=3 +ES=3 +CS=3 +[Event Manager] +Geometry=0, 0, 0, 0 +Window=Hide +Sort by=Unsort +Detail=OFF +[Event Set] +Geometry=0, 0, 0, 0 +Window=Hide +Manager=ON +Sort by=Unsort +Detail=OFF +Last Name= +Count=0 +[Event Link] +Geometry=0, 0, 0, 0 +Window=Hide +Manager=ON +Sort by=Unsort +Detail=OFF +Last Name= +Count=0 +[Break] +Geometry=0, 0, 0, 0 +Window=Hide +Manager=ON +Sort by=Unsort +Detail=OFF +Last Name= +Count=0 +[Trace] +Geometry=0, 0, 0, 0 +Window=Hide +Manager=ON +Sort by=Unsort +Detail=OFF +Last Name= +Delay Count0=2 +Count=0 +[Snap] +Geometry=0, 0, 0, 0 +Window=Hide +Manager=ON +Sort by=Unsort +Detail=OFF +Last Name= +Count=0 +[Stub] +Geometry=0, 0, 0, 0 +Window=Hide +Manager=ON +Sort by=Unsort +Detail=OFF +Last Name= +Count=0 +[Timer] +Geometry=0, 0, 0, 0 +Window=Hide +Manager=ON +Sort by=Unsort +Detail=OFF +Last Name= +TimerRateRunBreak=0011 +TimerBreakOutRunBreak=OFF +Count=0 +[Timer Monitor] +Count=0 +[Dmm] +Geometry=0, 0, 0, 0 +Window=Hide +Manager=ON +Sort by=Unsort +Detail=OFF +Last Name= +Count=0 +[Variable] +Geometry=981, 20, 440, 451 +Window=Normal +Boundary=13762700 +0=.battery_manufacturer,P,N,A,+,1 +1=.temp_fuel,P,N,A,+,1 +2=.bt_volt16,P,N,A,+,1 +Line=3 +[Quick Watch] +0=LED_dim_status_info_G,P,A,1 +1=LED_dim_status_info_B,P,A,1 +2=LED_dim_status_info_R,P,A,1 +3=info_LED.info_LED,P,A,1 +4=temp,P,A,1 +5=p_batt_param,P,A,1 +6=loop,P,A,1 +7=system_status,P,A,1 +8=battery_manufacturer,P,A,1 +9=p_bt_param,P,A,1 +10=bt_volt16,P,A,1 +11=temp_fuel,P,A,1 +12= +13= +14= +15= +[Software Break] +Geometry=75, 75, 500, 200 +Window=Normal +Width=150 30 200 100 +Name0=Swb00001 +Address0=pm.c#_BT_get_left+0x13c +Window0=ASM +Status0=ON +Name1=Swb00003 +Address1=pm.c#_BT_get_left+0x135 +Window1=ASM +Status1=ON +Count=2 +[Reset] +Debugger=ON +Symbol=OFF +Target CPU=OFF +[Extended Option] +OnClick Software Break=ON +TraceTimetag=x1 +Redraw=500 +Break When Access Function=OFF +Break When Access Whole=Select +Verify=ON +Break Sound=ON +TraceAutoClear=OFF +RRM Clock=Internal +CKC Register Value=0x09 +RRM Internal Clock Frequency=8.000 +[About] +Version=Program +[Pseudo Emulation] +Geometry=0, 0, 0, 0 +Window=Hide +[Data Flash Option] +Data Flash Emulation=OFF +[List] +Geometry=0, 0, 0, 0 +Window=Hide +[Console] +Geometry=0, 0, 0, 0 +Window=Hide diff --git a/branches/sim/yav_mcu_bsr.prj b/branches/sim/yav_mcu_bsr.prj new file mode 100644 index 0000000..ca010d2 --- /dev/null +++ b/branches/sim/yav_mcu_bsr.prj @@ -0,0 +1,1057 @@ +[ProjectManager] +Version=6.00 +Path=C:\78k_data\yav-mcu-basara\trunk\ +Title=yav-mcu +Series=78K0R.PM +Device=uPD79F0104 +DeviceVer=E1.00b +DebugMode=1 +Target=C:\78k_data\yav-mcu-basara\trunk\bsr.lmf +[BuildMode0] +BuildModeName=Debug Build +TargetFile=0 +[BuildMode1] +BuildModeName=Release Build +TargetFile=0 +[Tools] +MakeFile=yav_mcu_bsr.mak +Debugger=C:\Program Files (x86)\NEC Electronics Tools\ID78K0R-QB\V3.61\BIN\IDK0R32G.EXE +DebOption= +DebCpuReset=1 +DebSymReset=1 +MuitiLoad=0 +LoadPrjNum=0 +CheckVersion=CC78K0R|W2.13;RA78K0R|W1.33 +[Option.IDK0R32G] +File=\\Tsclient\c\78k_data\yav-mcu-basara\trunk\yav_mcu_bsr.pri +[BuildMode2] +BuildModeName=K0R_dbg +TargetFile=0 +[BuildMode3] +BuildModeName=BSR_dbg +TargetFile=0 +[BuildMode4] +BuildModeName=BSR_rel +TargetFile=0 +[BuildMode5] +BuildModeName=BSR_WM0 +TargetFile=0 +[Options.CC78K0R 0] +Version=210 +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=1 +Unsignedchar=0 +Usesaddrchk=0 +Autoallocationchk=1 +Jumpoptimize=1 +Librarycallchk=0 +Librarycall=1129 +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=0 +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=0 +Startupchk=1 +Fixation=1 +FarROMization=0 +Objectsel=1305 +Librarychk=1 +Floatingpoint=0 +Muldivunit=1 +Mulunit=1 +Startup=s0rml.rel +Library1=cl0rdm.lib +Library2=cl0rm.lib +Library3=cl0rmf.lib +VfiFileBoot0= +VfiFileBoot1=boot.vfi +VF78K0Rchk=0 +VF78K0Rvs= +[Options.CC78K0R 1] +Version=210 +Memorymodel=2 +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=1 +Unsignedchar=0 +Usesaddrchk=0 +Autoallocationchk=1 +Jumpoptimize=1 +Librarycallchk=1 +Librarycall=1128 +Aggressivechk=1 +Relativebranchchk=0 +Debugoptchk=0 +Outdebugchk=0 +Outdebug=1153 +Outasmsrcchk=0 +Outasmsrc=1157 +Outasmoptall=1 +Common=0 +Outerrlistchk=0 +Outerrlist=1173 +Xreference=0 +Preprocess=0 +Prenocomment=0 +Predefine=0 +Preifdef=1 +Preinclude=0 +Preline=1 +Prenumber=1 +Formfeed=0 +Columns=132 +Lines=0 +Tablength=8 +Ansi=0 +Cpraspras=0 +Commentnest=0 +Intunexpand=0 +Kanjicode=1210 +Verbose=0 +CommandFile=0 +Warninglevel=1 +Startupchk=1 +Fixation=1 +FarROMization=1 +Objectsel=1305 +Librarychk=1 +Floatingpoint=0 +Muldivunit=1 +Mulunit=1 +Startup=s0rll.rel +Library1=cl0rdm.lib +Library2=cl0rm.lib +Library3=cl0rmf.lib +VF78K0Rchk=0 +VF78K0Rvs= +[Options.CC78K0R 2] +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 (x86)\NEC Electronics Tools\CC78K0R\W2.13\inc78k0r +Include1=renge,C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r +Include2=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=1129 +Aggressivechk=1 +Relativebranchchk=0 +Debugoptchk=0 +Outdebugchk=1 +Outdebug=1153 +Outobjectcmb0= +Outobjectcmb1=obj +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=1 +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= +[Options.CC78K0R 3] +Version=210 +Define0=_debug_,proc_is_bsr,_TEG_ +Define1=_debug_,proc_is_bsr +Define2=proc_is_bsr +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=1 +Unsignedchar=0 +Usesaddrchk=0 +Autoallocationchk=1 +Jumpoptimize=1 +Librarycallchk=0 +Librarycall=1129 +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=0 +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=0 +Startupchk=1 +Fixation=1 +FarROMization=0 +Objectsel=1305 +Librarychk=1 +Floatingpoint=0 +Muldivunit=1 +Mulunit=1 +Startup=s0rml.rel +Library1=cl0rdm.lib +Library2=cl0rm.lib +Library3=cl0rmf.lib +VfiFileBoot0= +VfiFileBoot1=boot.vfi +VF78K0Rchk=0 +VF78K0Rvs= +[Options.CC78K0R 4] +Version=210 +Define0=proc_is_bsr +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=1 +Unsignedchar=0 +Usesaddrchk=0 +Autoallocationchk=1 +Jumpoptimize=1 +Librarycallchk=0 +Librarycall=1129 +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=0 +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=0 +Startupchk=1 +Fixation=1 +FarROMization=0 +Objectsel=1305 +Librarychk=1 +Floatingpoint=0 +Muldivunit=1 +Mulunit=1 +Startup=s0rml.rel +Library1=cl0rdm.lib +Library2=cl0rm.lib +Library3=cl0rmf.lib +VfiFileBoot0= +VfiFileBoot1=boot.vfi +VF78K0Rchk=0 +VF78K0Rvs= +[Options.CC78K0R 5] +Version=210 +Define0= +Define1=_debug_,proc_is_bsr,_TEG_,_WM0_ +Define2=_debug_,proc_is_bsr,_TEG_,_WM0 +Define3=_debug_,proc_is_bsr,_TEG_ +Define4=_debug_,proc_is_bsr +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=1 +Unsignedchar=0 +Usesaddrchk=0 +Autoallocationchk=1 +Jumpoptimize=1 +Librarycallchk=0 +Librarycall=1129 +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=0 +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=0 +Startupchk=1 +Fixation=1 +FarROMization=0 +Objectsel=1305 +Librarychk=1 +Floatingpoint=0 +Muldivunit=1 +Mulunit=1 +Startup=s0rml.rel +Library1=cl0rdm.lib +Library2=cl0rm.lib +Library3=cl0rmf.lib +VfiFileBoot0= +VfiFileBoot1=boot.vfi +VF78K0Rchk=0 +VF78K0Rvs= +[Options.OC78K0R 0] +Version=100 +O0=.\bsr.hex +O1=bsr.hex +UC=1 +UN=FF +UST= +USZ= +K=1 +ZF=0 +S=1 +E=0 +CommandFile=0 +[Options.OC78K0R 1] +Version=100 +UC=1 +UN=FF +UST= +USZ= +K=1 +ZF=0 +S=1 +E=0 +CommandFile=0 +[Options.OC78K0R 2] +Version=100 +O0=.\bsr.hex +O1=bsr.hex +UC=0 +UN=FF +UST= +USZ= +K=0 +ZF=0 +S=1 +E=0 +CommandFile=0 +[Options.OC78K0R 3] +Version=100 +O0=.\bsr.hex +O1=bsr.hex +UC=1 +UN=FF +UST= +USZ= +K=1 +ZF=0 +S=1 +E=0 +CommandFile=0 +[Options.OC78K0R 4] +Version=100 +O0=.\bsr.hex +O1=bsr.hex +UC=1 +UN=FF +UST= +USZ= +K=1 +ZF=0 +S=1 +E=0 +CommandFile=0 +[Options.OC78K0R 5] +Version=100 +O0=.\bsr.hex +O1=bsr.hex +UC=1 +UN=FF +UST= +USZ= +K=1 +ZF=0 +S=1 +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=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=task_status.c +Source24=led_cam.c +Source25=led_pow.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=..\..\..\Program Files (x86)\NEC Electronics Tools\CC78K0R\W2.13\inc78k0r\fsl.h +Include15=fsl_user.h +Include16=i2c_ctr.h +Include17=pm.h +Include18=rtc.h +Include19=reboot.h +Include20=magic.h +Include21=incs.h +Include22=i2c_twl.h +Include23=accero.h +Include24=pedometer.h +Include25=sw.h +Include26=adc.h +Include27=led.h +Include28=batt_params.h +Include29=pool.h +Include30=i2c_twl_defs.h +Include31=voltable.h +Include32=renge\renge_task_intval.h +Include33=..\..\..\Program Files (x86)\NEC Electronics Tools\CC78K0R\W2.13\inc78k0r\math.h +Include34=self_flash.h +Include35=pedo_lpf_coeff.h +[BuildBefore-AfterCmd] +Before1=c:\cygwin\bin\touch magic.c +After1=ruby nec_s_2_bsrbin2.rb bsr.hex +[Options.RA78K0R 0] +Version=100 +G=1 +GA=1 +E=0 +COMMON=0 +COMPATI=0 +P=1 +KA=1 +KS=0 +KX=0 +LF=0 +LW=132 +LL=0 +LT=8 +Z=0 +CommandFile=0 +RA_OPT= +[Options.RA78K0R 1] +Version=100 +G=0 +GA=0 +E=0 +COMMON=0 +COMPATI=0 +P=1 +KA=1 +KS=0 +KX=0 +LF=0 +LW=132 +LL=0 +LT=8 +Z=0 +CommandFile=0 +RA_OPT= +[Options.RA78K0R 2] +Version=100 +O0= +O1=obj +G=1 +GA=1 +E=0 +COMMON=0 +COMPATI=0 +P=1 +KA=1 +KS=0 +KX=0 +LF=0 +LW=132 +LL=0 +LT=8 +Z=0 +CommandFile=0 +RA_OPT= +[Options.RA78K0R 3] +Version=100 +G=1 +GA=1 +E=0 +COMMON=0 +COMPATI=0 +P=1 +KA=1 +KS=0 +KX=0 +LF=0 +LW=132 +LL=0 +LT=8 +Z=0 +CommandFile=0 +RA_OPT= +[Options.RA78K0R 4] +Version=100 +G=1 +GA=1 +E=0 +COMMON=0 +COMPATI=0 +P=1 +KA=1 +KS=0 +KX=0 +LF=0 +LW=132 +LL=0 +LT=8 +Z=0 +CommandFile=0 +RA_OPT= +[Options.RA78K0R 5] +Version=100 +G=1 +GA=1 +E=0 +COMMON=0 +COMPATI=0 +P=1 +KA=1 +KS=0 +KX=0 +LF=0 +LW=132 +LL=0 +LT=8 +Z=0 +CommandFile=0 +RA_OPT= +[ToolSet] +ToolSetName=(変更)78K0R Software Package V1.10 +Tool1=CC78K0R|W2.13 +Tool2=RA78K0R|W1.33 +Tool3=SK78K0R|V3.10 +Tool4=ID78K0R-QB|V3.61 +[Options.LK78K0R 0] +Version=100 +O0=bsr_k0r.lmf +O1=bsr.lmf +O2=flash.lmf +O3=a.lmf +G=1 +E=0 +E0=flash.elk +E1=a.elk +GO=1 +GOValue=85 +GOStart=FC00 +GOSizeValue=1024 +GI=1 +GIValue=FFFFFFFFFFFFFFFFFFFF +CCZA=0 +MemInfoCheck=1 +P=1 +P0=bsr_k0r.map +P1=bsr.map +P2=flash.map +P3=a.map +MI=0 +GB=1 +GBValue=6EFBFF +KM=1 +KD=0 +KP=1 +KL=0 +LF=0 +LL=0 +B0=C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\lib78k0r\fsl.lib +D0=bsr_mcu.dr +D1=user_area.dr +S=1 +W=0 +SELFCheck=1 +SELF=0 +ZB= +Etcetera0= +Etcetera1=boot.lmf +CommandFile=0 +[Options.LK78K0R 1] +Version=100 +O0=a.lmf +G=0 +E=0 +E0=a.elk +GO=0 +GOValue= +GOStart=FC00 +GOSizeValue=1024 +GI=0 +GIValue=FFFFFFFFFFFFFFFFFFFF +CCZA=1 +MemInfoCheck=0 +P=1 +P0=a.map +MI=0 +GB=0 +GBValue= +KM=1 +KD=1 +KP=0 +KL=0 +LF=0 +LL=0 +S=0 +W=1 +SELFCheck=0 +SELF=0 +ZB= +CommandFile=0 +[Options.LK78K0R 2] +Version=100 +O0=bsr.lmf +O1=bsr_k0r.lmf +O2=flash.lmf +O3=a.lmf +G=1 +E=0 +E0=flash.elk +E1=a.elk +GO=0 +GOValue=85 +GOStart=FC00 +GOSizeValue=1024 +GI=1 +GIValue=1B339499E033F240BFAA +CCZA=0 +MemInfoCheck=1 +P=1 +P0=bsr_k0r.map +P1=bsr.map +P2=flash.map +P3=a.map +MI=0 +GB=1 +GBValue=7EFBFF +KM=1 +KD=0 +KP=0 +KL=0 +LF=0 +LL=0 +B0=C:\Program Files (x86)\NEC Electronics Tools\CC78K0R\W2.13\lib78k0r\fsl.lib +B1=C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\lib78k0r\fsl.lib +D0=bsr_mcu.dr +D1=user_area.dr +S=1 +W=0 +SELFCheck=0 +SELF=0 +ZB= +Etcetera0= +Etcetera1=boot.lmf +CommandFile=0 +OFILE=C:\78k_data\yav-mcu-basara\trunk\bsr.lmf +[Options.LK78K0R 3] +Version=100 +O0=bsr_bsr.lmf +O1=bsr_k0r.lmf +O2=bsr.lmf +O3=flash.lmf +O4=a.lmf +G=1 +E=0 +E0=flash.elk +E1=a.elk +GO=1 +GOValue=85 +GOStart=FC00 +GOSizeValue=1024 +GI=1 +GIValue=FFFFFFFFFFFFFFFFFFFF +CCZA=0 +MemInfoCheck=1 +P=1 +P0=bsr_bsr.map +P1=bsr_k0r.map +P2=bsr.map +P3=flash.map +P4=a.map +MI=0 +GB=1 +GBValue=6EFBFF +KM=1 +KD=0 +KP=1 +KL=0 +LF=0 +LL=0 +B0=C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\lib78k0r\fsl.lib +D0=bsr_mcu.dr +D1=user_area.dr +S=1 +W=2 +SELFCheck=0 +SELF=0 +ZB= +Etcetera0= +Etcetera1=boot.lmf +CommandFile=0 +[Options.LK78K0R 4] +Version=100 +O0=bsr_k0r.lmf +O1=bsr.lmf +O2=flash.lmf +O3=a.lmf +G=1 +E=0 +E0=flash.elk +E1=a.elk +GO=1 +GOValue=85 +GOStart=FC00 +GOSizeValue=1024 +GI=1 +GIValue=FFFFFFFFFFFFFFFFFFFF +CCZA=0 +MemInfoCheck=1 +P=1 +P0=bsr_k0r.map +P1=bsr.map +P2=flash.map +P3=a.map +MI=0 +GB=1 +GBValue=6EFBFF +KM=1 +KD=0 +KP=1 +KL=0 +LF=0 +LL=0 +B0=C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\lib78k0r\fsl.lib +D0=bsr_mcu.dr +D1=user_area.dr +S=1 +W=0 +SELFCheck=1 +SELF=0 +ZB= +Etcetera0= +Etcetera1=boot.lmf +CommandFile=0 +[Options.LK78K0R 5] +Version=100 +O0=bsr_bsr.lmf +O1=bsr_k0r.lmf +O2=bsr.lmf +O3=flash.lmf +O4=a.lmf +G=1 +E=0 +E0=flash.elk +E1=a.elk +GO=1 +GOValue=85 +GOStart=FC00 +GOSizeValue=1024 +GI=1 +GIValue=FFFFFFFFFFFFFFFFFFFF +CCZA=0 +MemInfoCheck=1 +P=1 +P0=bsr_bsr.map +P1=bsr_k0r.map +P2=bsr.map +P3=flash.map +P4=a.map +MI=0 +GB=1 +GBValue=6EFBFF +KM=1 +KD=0 +KP=1 +KL=0 +LF=0 +LL=0 +B0=C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\lib78k0r\fsl.lib +D0=bsr_mcu.dr +D1=user_area.dr +S=1 +W=2 +SELFCheck=0 +SELF=0 +ZB= +Etcetera0= +Etcetera1=boot.lmf +CommandFile=0 +[Options.LCNV78K0R 0] +Version=100 +LCNV_GO=0 +E=0 +CommandFile=0 +[Options.LCNV78K0R 1] +Version=100 +LCNV_GO=0 +E=0 +CommandFile=0 +[Options.LCNV78K0R 2] +Version=100 +LCNV_GO=0 +O0=inter_asm +E=0 +CommandFile=0 +[Options.LCNV78K0R 3] +Version=100 +LCNV_GO=0 +E=0 +CommandFile=0 +[Options.LCNV78K0R 4] +Version=100 +LCNV_GO=0 +E=0 +CommandFile=0 +[Options.LCNV78K0R 5] +Version=100 +LCNV_GO=0 +E=0 +CommandFile=0 +[Options.78K0R] +BuildMode=2 +BuildMode2=K0R_dbg +BuildMode3=BSR_dbg +BuildMode4=BSR_rel +BuildMode5=BSR_WM0 +DefaultMode2=1 +DefaultMode3=1 +DefaultMode4=1 +DefaultMode5=1 diff --git a/branches/sim/yav_mcu_bsr.prk b/branches/sim/yav_mcu_bsr.prk new file mode 100644 index 0000000..4ef0391 --- /dev/null +++ b/branches/sim/yav_mcu_bsr.prk @@ -0,0 +1,22 @@ +[ProjectManager] +FrameMax=0 +FrameX=89 +FrameY=169 +FrameCX=1550 +FrameCY=921 +OpenFile1=led.c,0,100,100,1295,581,2,168,45,0 +OpenFile2=ProjectWindow +PrjPos=0,0,706,0,291 +OpenFile3=led_cam.c,0,125,125,1320,606,0,24,0,0 +OpenFile4=led_pow.c,0,150,150,1345,631,0,205,0,0 +OpenFile5=config.h,0,442,428,1557,1029,29,23,29,0 +OpenFile6=i2c_mcu.c,0,175,175,1766,882,0,303,0,0 +OpenFile7=i2c_mcu.h,0,200,200,1791,907,46,23,48,0 +OpenFile8=self_flash.c,0,0,0,1195,481,21,290,12,0 +OpenFile9=batt_params.h,0,596,19,1842,741,0,31,0,0 +OpenFile10=pm.c,0,225,225,1278,761,33,54,32,0 +OpenFile11=OutputWindow +OutputPos=0,198,904,529,1655 +ActivePRJ=yav_mcu_bsr.prj +[ProjectWindow] +ProjectWindowDispType=0 diff --git a/branches/sim/yav_mcu_bsr.prw b/branches/sim/yav_mcu_bsr.prw new file mode 100644 index 0000000..7c0bbd6 --- /dev/null +++ b/branches/sim/yav_mcu_bsr.prw @@ -0,0 +1,8 @@ +[System] +System1=default +[default] +Project1=yav_mcu_bsr.prj +[BATCH_BUILD] +Build1=yav_mcu_bsr.prj,Debug Build,1 +Build2=yav_mcu_bsr.prj,Release Build,0 +Build3=yav_mcu_bsr.prj,BSR_WM0,0 diff --git a/branches/sim/yav_mcu_bsr.sdb b/branches/sim/yav_mcu_bsr.sdb new file mode 100644 index 0000000..d554cbd --- /dev/null +++ b/branches/sim/yav_mcu_bsr.sdb @@ -0,0 +1,271 @@ +[SdbInfo] +Ver=5 +[loader.c] +T=4cc02a17 +1=incs_loader.h +2=C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r\fsl.h +3=fsl_user.h +4=i2c_ctr.h +5=i2c_mcu.h +6=pm.h +7=rtc.h +8=reboot.h +9=magic.h +[pm.c] +T=4ce758f6 +1=incs.h +2=adc.h +3=led.h +4=pm.h +5=renge\renge.h +6=batt_params.h +7=C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r\fsl.h +8=fsl_user.h +[i2c_ctr.c] +T=4cc020c9 +1=config.h +2=incs.h +[main.c] +T=4cd9f64d +1=incs_loader.h +2=WDT.h +3=rtc.h +4=pm.h +5=accero.h +6=led.h +7=adc.h +8=pool.h +[magic.c] +T=4ce75924 +1=config.h +2=magic.h +[WDT.c] +T=4cc020c9 +1=incs_loader.h +[i2c_mcu.c] +T=4cd9f64c +1=incs_loader.h +2=i2c_mcu.h +[i2c_twl.c] +T=4cc020c9 +1=config.h +2=incs.h +3=i2c_twl_defs.h +4=i2c_twl.h +[led.c] +T=4cd9fb99 +1=incs.h +2=led.h +[rtc.c] +T=4cd9f64c +1=incs.h +[vreg_ctr.c] +T=4cc020c9 +1=incs.h +2=vreg_ctr.h +3=rtc.h +4=led.h +5=accero.h +6=pm.h +7=pool.h +8=C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r\fsl.h +9=fsl_user.h +[vreg_twl.c] +T=4cc11aea +1=incs.h +2=jhl_defs.h +3=led.h +4=vreg_twl.h +5=vreg_ctr.h +[adc.c] +T=4cc14cca +1=incs.h +2=adc.h +3=pm.h +4=led.h +5=vreg_twl.h +6=voltable.h +[renge\renge.c] +T=4cd9f64c +1=renge\renge.h +2=renge\renge_task_intval.h +3=renge\renge_task_immediate.h +4=WDT.h +5=config.h +6=user_define.h +7=bsr_system.h +[accero.c] +T=4cc020c9 +1=config.h +2=incs.h +3=..\..\..\..\Program Files\NEC Electronics Tools\CC78K0R\W2.12\inc78k0r\math.h +[self_flash.c] +T=4cd9f64c +1=incs_loader.h +2=C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r\fsl.h +3=fsl_user.h +4=i2c_ctr.h +5=pool.h +6=magic.h +7=pm.h +[sw.c] +T=4cc020c9 +1=incs.h +2=i2c_twl.h +3=i2c_ctr.h +4=led.h +5=pm.h +6=rtc.h +7=sw.h +[task_debug.c] +T=4cc020c9 +1=incs_loader.h +2=renge\renge.h +3=pm.h +4=accero.h +[task_misc.c] +T=4cd9f5ab +1=incs.h +2=renge\renge.h +3=pm.h +4=accero.h +5=adc.h +6=i2c_mcu.h +7=led.h +8=vreg_twl.h +[task_sys.c] +T=4cd9f64c +1=incs.h +2=i2c_twl.h +3=i2c_ctr.h +4=led.h +5=accero.h +6=pm.h +7=rtc.h +8=sw.h +9=adc.h +10=self_flash.h +[pedo_alg_thre_det2.c] +T=4cc020c9 +1=incs.h +2=..\..\..\..\Program Files\NEC Electronics Tools\CC78K0R\W2.12\inc78k0r\math.h +3=accero.h +4=pedometer.h +5=pedo_lpf_coeff.h +6=pool.h +[ini_VECT.c] +T=4cc020c9 +1=config.h +[task_status.c] +T=4cc020c9 +1=incs_loader.h +2=renge\renge.h +3=pm.h +4=accero.h +5=adc.h +6=i2c_mcu.h +[incs_loader.h] +T=4cc020c9 +1=jhl_defs.h +2=user_define.h +3=bsr_system.h +4=renge\renge.h +5=vreg_ctr.h +6=vreg_twl.h +7=loader.h +8=i2c_mcu.h +9=WDT.h +[jhl_defs.h] +T=4cc020c9 +1=config.h +[config.h] +T=4ce75a11 +[user_define.h] +T=4cc020c9 +[bsr_system.h] +T=4cc020c9 +[renge\renge.h] +T=4cc020c4 +1=renge\renge_defs.h +2=renge\renge_task_immediate.h +[renge\renge_defs.h] +T=4cc020c4 +[renge\renge_task_immediate.h] +T=4cc020c4 +1=renge\renge_defs.h +[vreg_ctr.h] +T=4cc11aea +1=config.h +[vreg_twl.h] +T=4cc11aea +[loader.h] +T=4cc020c9 +[i2c_mcu.h] +T=4cc020c9 +[WDT.h] +T=4cc020c9 +[C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r\fsl.h] +T=49a3bd4e +[fsl_user.h] +T=4cc020c9 +[i2c_ctr.h] +T=4cc020c9 +[pm.h] +T=4cd9f5ab +[rtc.h] +T=4cc020c9 +[reboot.h] +T=4cc020c9 +[magic.h] +T=4cc020c9 +[incs.h] +T=4cc020c9 +1=jhl_defs.h +2=user_define.h +3=bsr_system.h +4=renge\renge.h +5=loader.h +6=vreg_ctr.h +7=vreg_twl.h +8=i2c_mcu.h +9=i2c_twl.h +10=rtc.h +11=accero.h +12=pm.h +13=sw.h +14=adc.h +15=WDT.h +[i2c_twl.h] +T=4bf0fdc7 +[accero.h] +T=4cc020c9 +1=jhl_defs.h +2=pedometer.h +[pedometer.h] +T=4cc020c9 +[sw.h] +T=4cc020c9 +1=config.h +[adc.h] +T=4cc020c9 +1=jhl_defs.h +[led.h] +T=4cc020c9 +[batt_params.h] +T=4cc020c9 +[pool.h] +T=4cc020c9 +1=pedometer.h +[i2c_twl_defs.h] +T=4cc020c9 +[voltable.h] +T=4cc020c9 +[renge\renge_task_intval.h] +T=4cc020c4 +1=renge\renge_defs.h +[..\..\..\..\Program Files\NEC Electronics Tools\CC78K0R\W2.12\inc78k0r\math.h] +T=45f12258 +[self_flash.h] +T=4cc020c9 +[pedo_lpf_coeff.h] +T=4cc020c9