/branch/sim ブランチ作成

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_mcu@344 013db118-44a6-b54f-8bf7-843cb86687b1
This commit is contained in:
n2232 2011-06-15 08:08:58 +00:00
parent f349f470b6
commit bb0c5c167b
74 changed files with 15862 additions and 0 deletions

5
branches/sim/WDT.c Normal file
View File

@ -0,0 +1,5 @@
#pragma sfr
#include "incs_loader.h"

20
branches/sim/WDT.h Normal file
View File

@ -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

247
branches/sim/accero.c Normal file
View File

@ -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 <math.h>
#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 );
}
}
}
}

14
branches/sim/accero.h Normal file
View File

@ -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

584
branches/sim/adc.c Normal file
View File

@ -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
01,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 );
}
/* ========================================================
 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

48
branches/sim/adc.h Normal file
View File

@ -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

View File

@ -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

1022
branches/sim/bsr.hex Normal file

File diff suppressed because it is too large Load Diff

BIN
branches/sim/bsr.lmf Normal file

Binary file not shown.

687
branches/sim/bsr_k0r.map Normal file
View File

@ -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


48
branches/sim/bsr_mcu.dr Normal file
View File

@ -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予約領域[使用禁止]

63
branches/sim/bsr_system.h Normal file
View File

@ -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

81
branches/sim/config.h Normal file
View File

@ -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

362
branches/sim/fsl.h Normal file
View File

@ -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

108
branches/sim/fsl_user.h Normal file
View File

@ -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

BIN
branches/sim/hoge.bin Normal file

Binary file not shown.

279
branches/sim/i2c_ctr.c Normal file
View File

@ -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;
}

210
branches/sim/i2c_ctr.h Normal file
View File

@ -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

655
branches/sim/i2c_mcu.c Normal file
View File

@ -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 );
}
/* ========================================================
 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
// 文字の時は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 );
}
/* ========================================================
DMA転送終了割り込み
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 );
}
/* ========================================================
======================================================== */
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;
}
/* ========================================================
iic_mcu_write_a_byte CODEC不具合ワークアラウンド
======================================================== */
err iic_mcu_write_a_byte_codec( u8 adrs, u8 dat )
{
static u8 count;
// 文字の時は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 );
}

36
branches/sim/i2c_mcu.h Normal file
View File

@ -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

224
branches/sim/i2c_twl.c Normal file
View File

@ -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
{
// ③R 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 )
{
// ②
vreg_adrs = adrs_table_twl_ext2int( rcvd );
/// データが書かれるか、リスタートで読み出されるのを待つ
state = WAIT_DATA;
}
else if( state == DATA_READED )
{
// データ1バイト送信後発生する
LREL = 1;
return;
}
else
{
// ③W
// データ書き込まれ
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

7
branches/sim/i2c_twl.h Normal file
View File

@ -0,0 +1,7 @@
#ifndef _iic_twl_
#define _iic_twl_
void IIC_twl_Init( void );
void IIC_twl_Stop( void );
#endif

196
branches/sim/i2c_twl_defs.h Normal file
View File

@ -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

55
branches/sim/incs.h Normal file
View File

@ -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

View File

@ -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( );

382
branches/sim/ini_VECT.c Normal file
View File

@ -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( )
{
// 起きるだけ
}

29
branches/sim/jhl_defs.h Normal file
View File

@ -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

347
branches/sim/led.c Normal file
View File

@ -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のセット
 (P01:/reset2) 
     ( )
         
         WiFi
         (32kHz out 使)
         
         
         
*/
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 );
}

146
branches/sim/led.h Normal file
View File

@ -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

141
branches/sim/led_cam.c Normal file
View File

@ -0,0 +1,141 @@
/******************************************************//**
LED_Cam TO02
\n BLINK,*_PLUSE 1
\n OFFBLINK 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;
}
}

265
branches/sim/led_pow.c Normal file
View File

@ -0,0 +1,265 @@
/* ========================================================
// 電源LED
LED_POW_B,R 6,7
TDR00 (0x03FFTPS0で250kHzでカウントアップ10bitなら250Hz位になる)
TDR0x Duty 0TDR00( =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;
}
}

372
branches/sim/loader.c Normal file
View File

@ -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 <fsl.h>
#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)≧検出電圧<VLVI)、または動作禁止時に低電圧検出 */
}
/* ********************************************************
********************************************************** */
void hdwinit2( )
{
// ポート設定 //
if( system_status.reboot ) // リセットピンだけはすぐにセットする
{
P0 = 0b00000011;
P3 = 0b00000111; // 簡易I2Cは出力ラッチを1にする
P14 = 0b00000000;
}
else
{
P0 = 0b00000000;
P3 = 0b00000110; // 簡易I2Cは出力ラッチを1にする
P14 = 0b00000000;
}
PM0 = 0b11111111; // BSRマイコンでは、reset1は監視のみになる。
PM3 = 0b11110000; // P31,32は簡易I2C
PM14 = 0b11111100; // debugger[1] とりあえず出力
if( !system_status.reboot ) // リセットピンだけはすぐにセットする
{
P20 = 0b00000000;
P1 = 0b11000000;
P2 = 0b00000000;
P4 = 0b00001000;
P5 = 0b00000000;
P6 = 0b00000000;
P7 = 0b01000000;
P12 = 0b00000000;
P15 = 0b00000000;
/*--- タイマ・アレイ・ユニットの動作停止 ---*/
TAU0EN = 0; /* タイマ・アレイ・ユニットへのクロック供給停止 */
TT0 = 0x00ff; /* 全タイマ・チャネルの動作停止 */
/*--- RTCの動作停止 ---*/
// 別途初期化関数
// RTCEN = 0; /* RTCへのクロック供給停止 */
// RTCC0 = 0b00000000; /* カウンタ動作停止 */
}
/*--- 割り込み設定 ---------*/
IF0 = 0x0000; /* 割り込み要求フラグクリア */
IF1 = 0x0000;
IF2 = 0x0000;
MK0 = 0xFFFF; /* 割り込み禁止 */
MK1 = 0xFFFF;
MK2 = 0xFFFF;
PM20 = 0b11111100;
PM1 = 0b00000000;
PM2 = 0b11101001;
PM4 = 0b11110011;
PM5 = 0b11110010;
PM6 = 0b11111100; // I2CのラインがL出力になってしまうが、システムがOFFなのでかまわない
PM7 = 0b01011111;
PM12 = 0b11111111; // 32kHzクロックのピン設定はどっちでもよい
PM15 = 0b11111111;
PU20 = 0b00010001;
PU0 = 0b00000000; // バッテリ認証後にそれぞれセット
PU1 = 0b00000000;
PU3 = 0b00000000; // 外部でプルアップしないと具合が悪い。CPUがプルアップする
PU4 = 0b00000000; // 外部でプルアップしてほしいtool0,1)
PU5 = 0b00000010;
PU7 = 0b00011001;
PU12 = 0b00000000;
PU14 = 0b00000000;
// ポート入力モード・レジスタ設定 /////////////////////
// [0:通常入力バッファ 1:TTL入力バッファ]
PIM3 = 0b00000000;
PIM7 = 0b00000000;
// ポート出力モード・レジスタ設定
// [0:通常出力モード 1:N-chオープン・ドレーン出力]
POM3 = 0b00000110;
POM7 = 0b00000000;
/* 割り込み優先順位、全て低位(LV3) */
PR00 = 0xFFFF;
PR01 = 0xFFFF;
PR10 = 0xFFFF;
PR11 = 0xFFFE;
PR02L = 0xFF;
PR12L = 0xFF;
/*--- 外部割込の有効エッジ設定 ---*/
EGP0 = 0b00110001;
EGN0 = 0b01110000;
EGP2 = 0b00001010;
EGN2 = 0b00000000;
/*--- キー割り込み設定 ---*/
KRM = 0b00000000; /* 全キー割り込み信号を検出しない */
/*--- ADCの動作停止 ---*/
ADCEN = 0; /* ADCへのクロック供給停止 */
ADM = 0b00000000; /* 変換動作停止 */
/*--- シリアル・アレイ・ユニットの動作停止 ---*/
SAU0EN = 0; /* シリアル・アレイ・ユニット0へのクロック供給停止 */
SCR00 = 0x0087; /* 各チャンネルの通信禁止 */
SCR01 = 0x0087;
SCR02 = 0x0087;
SCR03 = 0x0087;
// IICの動作停止
IICA0EN = 0; /* IICA0(CTR)へのクロック供給停止 */
IICCTL00 = 0x00; /* IICA1動作停止 */
IICA1EN = 0; // IICA1(TWL)へのクロック供給停止
IICCTL01 = 0x00; // IICA1動作停止
/*--- DMAの動作停止 ---*/
DRC0 = 0b00000000; /* DMAチャネル0の動作禁止 */
DRC1 = 0b00000000; /* DMAチャネル1の動作禁止 */
/*--- クロック出力/ブザー出力停止 ---*/
CKS0 = 0b00000000;
CKS1 = 0b00000000;
}
/******************************************************************************
ms
NOPを回すだけCPUを **
*****************************************************************************/
void wait_ms( u8 ms ){
u16 fine;
WDT_Restart();
while( ms != 0 ){
ms--;
fine = 860;
while( fine != 0 ){
fine -= 1;
}
}
}

7
branches/sim/loader.h Normal file
View File

@ -0,0 +1,7 @@
#ifndef _loader_h_
#define _loader_h_
void wait_ms( u8 );
#endif

72
branches/sim/magic.c Normal file
View File

@ -0,0 +1,72 @@
/*****************************************************************************
(touchしてね)
****************************************************************************/
#include "config.h"
#include "magic.h"
// V0.5 (ニセ0.1改)
#pragma section @@CNSTL MGC_LOAD AT 0x0FF6
__far const unsigned char MGC_LOADd[] = __TIME__;
#ifdef _firm_format_v3_
#pragma section @@CNST MGC_MIMI AT 0x2000
const unsigned char MGC_HEADdN[] = __TIME__;
#else
#pragma section @@CNST MGC_MIM2 AT 0x2100
const unsigned char MGC_HEADd[] = __TIME__;
#endif
#pragma section @@CNST MGC_TAIL AT 0x4FF6
const unsigned char MGC_TAILd[] = __TIME__;
// 0Dまでこれを使用
// #define SIG { 0x30, 0x38, 0x3A, 0x34, 0x35, 0x3A, 0x33, 0x39, 0x00, 0x00 }
// あーあ。
/*
// V0.5 (ニセ0.1改)
#define SIG { 0x30, 0x38, 0x3A, 0x34, 0x35, 0x3A, 0x33, 0x39, 0x00, 0x00 }
*/
/*
(使)
V0.2 31 34 3A 33 35 3A 33 35 00 00
#define SIG { 0x31, 0x34, 0x3A, 0x33, 0x35, 0x3A, 0x33, 0x35, 0x00, 0x00 };
ctr_wm0
31373A30353A32310000
#define SIG { 0x31, 0x37, 0x3A, 0x30, 0x35, 0x3A, 0x32, 0x31, 0x00, 0x00 };
ctr_wm0_2
31303A34393A35390000
#define SIG { 0x31, 0x30, 0x3A, 0x34, 0x39, 0x3A, 0x35, 0x39, 0x00, 0x00 };
bsr_V0.2_090828_WM2
31323A35393A32350000
#define SIG { 0x31, 0x32, 0x3A, 0x35, 0x39, 0x3A, 0x32, 0x35, 0x00, 0x00 };
*/
/*
// V0.1の署名(日付) 30 38 3A 34 35 3A 33 39 00 00
#pragma section @@CNSTL MGC_LOAD AT 0x0FF6
__far static const unsigned char MGC_LOAD[] =
#define SIG { 0x30, 0x38, 0x3A, 0x34, 0x35, 0x3A, 0x33, 0x39, 0x00, 0x00 }
// V0.4以降
#pragma section @@CNSTL MGC_LOAD AT 0x0FF6
__far const unsigned char MGC_LOAD[] = __TIME__;
#pragma section @@CNST MGC_MIMI AT 0x2100
const unsigned char MGC_HEAD[] = __TIME__;
#pragma section @@CNST MGC_TAIL AT 0x47F6
const unsigned char MGC_TAIL[] = __TIME__;
*/

24
branches/sim/magic.h Normal file
View File

@ -0,0 +1,24 @@
#ifndef _magic_h_
#define _magic_h_
// magic.c の記述と違わないように注意!
#define MGC_LOAD 0x0FF6
#define MGC_FOOT 0x4FF6
#ifdef _firm_format_v3_
#define MGC_HEAD 0x2000
#else
#define MGC_HEAD 0x2100
#endif
#define MGC_LOAD_BKUP 0x1FF6
#define MGC_FOOT_BKUP 0x7FF6
#ifdef _firm_format_v3_
#define MGC_HEAD_BKUP 0x5000
#else
#define MGC_HEAD_BKUP 0x5100
#endif
#endif

85
branches/sim/main.c Normal file
View File

@ -0,0 +1,85 @@
/* ========================================================
MCU CTR BSR
2008,2009 nintendo
 
======================================================== */
// ========================================================
#include "incs_loader.h"
#include "WDT.h"
#include "rtc.h"
#include "pm.h"
#include "accero.h"
#include "led.h"
#include "adc.h"
#include "pool.h"
// ========================================================
system_status_ system_status;
uni_pool pool;
bit force_off;
#ifdef i2c_timeout_test
bit i2c_mcu_time_out_error; // I2Cが何らかで詰まった。結露など含む。
extern void i2c_mcu_error_monitor();
#endif
/* ========================================================
loader.c
======================================================== */
void main_loop( void )
{
#ifdef i2c_timeout_test
i2c_mcu_time_out_error = false;
#endif
// 電池投入時、ファームアップデート後のみ
RTC_init( ); // 内部でリブートか判定しています
renge_init( );
iic_mcu_start( );
EI( );
BT_chk();
system_status.pwr_state = OFF_TRIG;
if( system_status.reboot )
{
// リブート時は電源onに上書き
if( PM_chk_LDSW() != 0 )
{
system_status.pwr_state = ON_TRIG;
}
vreg_ctr[VREG_C_BT_REMAIN] = 100;
}
vreg_ctr_init( );
clear_hosu_hist(); // 履歴クリア
renge_task_interval_run_force = true;
RTCIMK = 0; /* 割り込み(アラーム&インターバル)許可 */
// メインループ //
while( 1 )
{ // システムtick、または割り込みで廻ります。
renge_task_interval_run( ); // 内部で、システムtickまたは強制起動します
renge_task_immed_run();
#ifdef i2c_timeout_test
if( i2c_mcu_time_out_error )
{
i2c_mcu_error_monitor();
}
#endif
HALT( );
}
}

82
branches/sim/nec_s_2_bsrbin2.rb Executable file
View File

@ -0,0 +1,82 @@
#!/usr/bin/ruby
$KCODE = "S"
=begin
 NECの環境が吐きだしたSRECを
  0xFF
  BSRのアップデート用に必要な部分だけ切り出します
            0x0000 - 0x0FFF, 0x2000-0x47FF
=end
=begin
if( ARGV[0] == nil )
print( "input file name is nessesary!\nabort.\n" )
exit(1)
end
unless(File.exist?( ARGV[0] ))
print( "file" << ARGV[0] << " not found.\nabort.\n" )
exit(1)
end
=end
src = File.open( 'bsr.hex' )
dest = File.new( "hoge.bin","wb" )
dest.write( 'jhl' )
### get data ##########################
src_in = Hash.new
tempA = Array.new
dataTemp = Array.new
offset = Numeric.new
bindata = Array.new( 32*1024, 0xFF )
while(src.readline)
tempA = $_.scan(/(\:)(\w\w)(\w\w\w\w)(\w\w)(\w+)(\w\w)/)
break if( tempA.size == 0 )
src_in = { "len" => 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" )

View File

@ -0,0 +1,542 @@
/* ********************************************************
3
********************************************************* */
#pragma mul
#pragma div
#pragma bcd
#include "incs.h"
#ifndef _WIN32
#include <math.h>
#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;
}
}
/*=========================================================
 
  
 
*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
======================================================== */
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
======================================================== */
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;
}
*/
/* ========================================================
...
======================================================== */
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。 日は
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 );
}
}

View File

@ -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

29
branches/sim/pedometer.h Normal file
View File

@ -0,0 +1,29 @@
#ifndef _pedo_
#define _pedo_
// =========================================================
extern bit pedolog_read_msb;
// =========================================================
//void hosu_read_end( ); ƒ}ƒNƒ<4E>‰»
#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

1317
branches/sim/pm.c Normal file

File diff suppressed because it is too large Load Diff

211
branches/sim/pm.h Normal file
View File

@ -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__

24
branches/sim/pool.h Normal file
View File

@ -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

24
branches/sim/reboot.c Normal file
View File

@ -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
}

6
branches/sim/reboot.h Normal file
View File

@ -0,0 +1,6 @@
#ifndef __MYREBOOT__
#define __MYREBOOT__
void my_reboot();
#endif

306
branches/sim/renge/renge.c Normal file
View File

@ -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
tickI2C通信完了など
 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 );
}

View File

@ -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

View File

@ -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

View File

@ -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"

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,11 @@
sw
adc
batt
led_pow
led_wifi
led_notify
led_cam
misc
status
debug
sys

169
branches/sim/rtc.c Normal file
View File

@ -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/fXT1.953125 ms
======================================================== */
__interrupt void int_rtc_int( )
{
renge_flg_interval += 1; // インクリメント/デクリメント命令を使うので DI()不要
}

21
branches/sim/rtc.h Normal file
View File

@ -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

600
branches/sim/self_flash.c Normal file
View File

@ -0,0 +1,600 @@
/* ========================================================
======================================================== */
#pragma SFR
#pragma di
#pragma ei
#pragma nop
#pragma stop
#pragma halt
#include "incs_loader.h"
#include <fsl.h>
#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

View File

@ -0,0 +1,9 @@
#ifndef _self_flash_h_
#define _self_flash_h_
void firm_update();
#endif

194
branches/sim/sw.c Normal file
View File

@ -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;
}
}
}
}

20
branches/sim/sw.h Normal file
View File

@ -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

123
branches/sim/task_debug.c Normal file
View File

@ -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;
// デバッグLED8bitの初期化
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

316
branches/sim/task_misc.c Normal file
View File

@ -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

View File

@ -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;
}

578
branches/sim/task_sys.c Normal file
View File

@ -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 );
}

279
branches/sim/user_define.h Normal file
View File

@ -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

57
branches/sim/voltable.h Normal file
View File

@ -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

530
branches/sim/vreg_ctr.c Normal file
View File

@ -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 <fsl.h>
#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();
}

267
branches/sim/vreg_ctr.h Normal file
View File

@ -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

150
branches/sim/vreg_twl.c Normal file
View File

@ -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 );
}
}

127
branches/sim/vreg_twl.h Normal file
View File

@ -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

View File

@ -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

1025
branches/sim/yav_mcu_bsr.pri Normal file

File diff suppressed because it is too large Load Diff

1057
branches/sim/yav_mcu_bsr.prj Normal file

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -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

View File

@ -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