git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_mcu@152 013db118-44a6-b54f-8bf7-843cb86687b1

This commit is contained in:
N2232 2010-05-17 05:31:52 +00:00
parent 7bdc27fb15
commit 57af4a89a8
73 changed files with 32180 additions and 0 deletions

View File

@ -0,0 +1,14 @@
#pragma sfr
#include "incs_loader.h"
//=========================================================
// ウォッチドッグタイマのリスタート
// 0xACはマジック
void WDT_Restart( void )
{
WDTE = WDT_RESTART_MAGIC;
}

View File

@ -0,0 +1,18 @@
#ifndef _WDT_
#define _WDT_
//=========================================================
#define WDT_RESTART_MAGIC 0xAC
//=========================================================
void WDT_Restart( void );
// 規定値以外を書くと例外でリセットがかかる
#define mcu_reset WDTE = 0x5A
#endif

View File

@ -0,0 +1,242 @@
/* ========================================================
 
CPUに割り込み
I2Cの競合回避などがあるので
======================================================== */
#pragma SFR
#pragma NOP
#pragma HALT
#pragma STOP
#pragma ROT
// rorb, rolb, rorw, rolw
#pragma MUL
#pragma BCD
#include "incs.h"
#include <math.h>
// ========================================================
// レジスタ名
#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 tsk_cbk_accero( )
{ // 疑似isrから登録されます
/*
if(( system_status.pwr_state == OFF ) || ( system_status.pwr_state == BT_CHARGE ) )
{
return ( ERR_SUCCESS );
}
else
{
*/
// 加速度センサデータレジスタへの反映
if( iic_mcu_read( IIC_SLA_ACCEL, ( ACC_REG_X | 0x80 ), 6, &vreg_ctr[VREG_C_ACC_XL] )
!= ERR_SUCCESS )
{
// 加速度センサが異常になったので止める
vreg_ctr[VREG_C_ACC_CONFIG] &= ~( VREG_BITMASK_ACC_CONF_HOSU | VREG_BITMASK_ACC_CONF_ACQ );
// vreg_ctr[ VREG_C_STATUS_1 ] |= REG_BIT_ACCERO_ERR;
acc_hosu_set();
return ( ERR_SUCCESS ); // タスクの削除は必要
}
else
{
// 正常時パス //
// 加速度更新&割り込み
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 == 1 )
{
u8 temp[6];
iic_mcu_read( IIC_SLA_ACCEL, ( ACC_REG_X | 0x80 ), 6, temp );
}
}
if(( system_status.pwr_state != OFF ) &&
( system_status.pwr_state != BT_CHARGE ) &&
( ( vreg_ctr[VREG_C_ACC_CONFIG] & VREG_BITMASK_ACC_CONF_HOSU ) != 0 )
)
{
DBG_LED_WIFI_2_on;
pedometer(); // 歩数計
DBG_LED_WIFI_2_off;
}
}
return ( ERR_SUCCESS );
}
/*=======================================================
  
========================================================*/
task_status_immed 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_SUCCESS );
}
/*=========================================================
  
========================================================*/
task_status_immed 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_SUCCESS );
}
/*=========================================================
 
todo
========================================================*/
task_status_immed acc_hosu_set( )
{
u8 str_send_buf[4];
iic_mcu_read_a_byte( IIC_SLA_ACCEL, ACC_REG_WHOAMI );
if( iic_mcu_bus_status == ERR_NOSLAVE )
{
vreg_ctr[ VREG_C_STATUS_1 ] |= REG_BIT_ACCERO_ERR;
#ifdef _MCU_BSR_
// PMK23 = 1;
#endif
return ( ERR_SUCCESS ); // とりあえず、タスクは削除しなくてはならない
}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
#ifdef _MODEL_WM0_
str_send_buf[2] = 0x10; // 3 IRQ pol :Active HI, Drive:Pushpull,
/// IRQ2flg latch: auto clear after read, IRQ2 conf: IRQ( fall,shock,...)
/// 1 : auto clear after read, conf: data ready
#else
str_send_buf[2] = 0x02; // 3 IRQ pol :Active HI, Drive:Pushpull,
/// IRQ2flg latch: auto clear after read, IRQ2 conf: IRQ( fall,shock,...)
/// 1 : auto clear after read, conf: data ready
#endif
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 )
{
#ifdef _MCU_BSR_
PMK23 = 1;
#endif
// 完全停止
str_send_buf[0] =
( ACC_BITS_PM_PDN << ACC_bP_PM0 | 0 << ACC_bP_DR0 | ACC_BITS_ALL_AXIS_ON );
}
else
{
#ifdef _MCU_BSR_
PMK23 = 0;
#endif
// 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 == 1 )
{
if( system_status.pwr_state == ON )
{
u8 temp[6];
iic_mcu_read( IIC_SLA_ACCEL, ( ACC_REG_X | 0x80 ), 6, temp );
}
}
return ( ERR_SUCCESS );
}
/* ========================================================
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( tsk_cbk_accero );
}
}
}
}

View File

@ -0,0 +1,14 @@
#ifndef _accero_
#define _accero_
#include "jhl_defs.h"
#include "pedometer.h"
///////////////////////////////////////////////////////////
task_status_immed tsk_cbk_accero( );
task_status_immed acc_hosu_set( );
#endif

View File

@ -0,0 +1,352 @@
/* ========================================================
nintendo
'09 Apr
======================================================== */
#include "incs.h"
#include "adc.h"
#include "pm.h"
#include "led.h"
bit adc_updated;
u8 adc_raw_vol;
u8 adc_raw_dep;
#define INTERVAL_TSK_ADC 3
/* ========================================================
ADC設定と
BT_TEMP,_P
ADIN1
VOL
PM_BT_DET,_P PM_init
8tics毎に呼ばれADCを停止します
 
======================================================== */
/*
// max -4db
static const u8 slider_to_codec[64] =
{
127, 125, 124, 123, 121, 120, 119, 117,
116, 115, 113, 112, 111, 109, 108, 107,
105, 104, 103, 101, 100, 99, 98, 96,
95, 94, 92, 91, 90, 88, 87, 86,
84, 83, 82, 80, 79, 78, 76, 75,
74, 72, 71, 70, 69, 67, 66, 65,
63, 62, 61, 59, 58, 57, 55, 54,
53, 51, 50, 49, 47, 46, 45, 44
};
*/
// max -10db
static const u8 slider_to_codec[64] =
{
127, 126, 125, 124, 123, 122, 121, 120,
119, 118, 117, 116, 115, 114, 113, 112,
111, 110, 109, 109, 108, 107, 106, 105,
104, 103, 102, 101, 100, 99, 98, 97,
96, 95, 94, 93, 92, 91, 90, 89,
88, 87, 86, 85, 84, 83, 82, 81,
81, 80, 79, 78, 77, 76, 75, 74,
73, 72, 71, 70, 69, 68, 67, 66
};
void tsk_adc( )
{
static u8 task_interval = 0;
static u8 old_tune;
static u8 sndvol_codec;
static u8 bt_temp_old;
if( task_interval-- != 0 )
{
return;
}
else
{
task_interval = (u8)( INTERVAL_TSK_ADC / SYS_INTERVAL_TICK );
}
if( adc_updated )
{
if( system_status.pwr_state == ON )
{
// Tune ///////////////////////////////////////
{
// 似非ヒステリシス V2
// ガリオームには適さない
#define KIKAN 32
static u8 old_value;
static s8 diffs;
u8 temp;
if( abs( adc_raw_dep - old_value ) >= 2 )
{
// 大きく離れた
vreg_ctr[ VREG_C_TUNE ] = adc_raw_dep;
old_value = adc_raw_dep;
#if 0
;
;
set_irq( VREG_C_IRQ0, REG_BIT_VR_TUNE_CHANGE );
#endif
diffs = 0;
}
else
{
// 近所の値でも、ある期間でいっぱい偏っていたらそっちに寄せる
static u8 kikan_count = KIKAN;
if( old_value < adc_raw_dep )
{
diffs += 1;
}
else if( old_value > adc_raw_dep )
{
diffs -= 1;
}
if( --kikan_count == 0 )
{
if( diffs >= KIKAN && ( diffs < 64 ))
{
old_value += 1;
}
else if( ( diffs <= ( 256 - KIKAN )) && ( diffs > ( 128 + 64 ) )) // あらー?
{
old_value -= 1;
}
vreg_ctr[ VREG_C_TUNE ] = old_value;
kikan_count = KIKAN;
diffs = 0;
}
}
}
vreg_ctr[ VREG_C_DBG1 ] = vreg_ctr[ VREG_C_TUNE ];
vreg_ctr[ VREG_C_DBG2 ] = adc_raw_dep; // dbg
// Volume /////////////////////////////////////
{
// 似非ヒステリシスを付けて64段
u8 temp;
static u8 vol_old;
static u8 force_update_vol;
if( abs( adc_raw_vol - vol_old ) >= 2 ) // 生値でこれくらいずれたら更新
{
// if( vreg_ctr[ VREG_C_SND_VOL ] != ( adc_raw_vol / 4 ) )
{
vol_old = adc_raw_vol;
// レジスタ更新
vreg_ctr[ VREG_C_SND_VOL ] = ( adc_raw_vol / 4 );
vreg_twl[ REG_TWL_INT_ADRS_VOL ] = adc_raw_vol / ( 256 / 32 ); // ←adc値でよい
// codecに伝える
iic_mcu_write_a_byte( IIC_SLA_CODEC, CODEC_REG_VOL, slider_to_codec[ adc_raw_vol / 4 ] );
#ifndef _MODEL_CTR_
iic_mcu_write_a_byte( IIC_SLA_DCP, 0, slider_to_codec[ ( 255 - adc_raw_vol ) / 4 ] ); // todo
#endif
// set_irq( VREG_C_IRQ0, REG_BIT_VR_SNDVOL_CHANGE ); // 割り込み廃止
force_update_vol = 100;
}
}
{
// ポーリング
if( --force_update_vol == 0 )
{
vol_old = adc_raw_vol;
// レジスタ更新
// vreg_ctr[ VREG_C_SND_VOL ] = temp;
// vreg_twl[ REG_TWL_INT_ADRS_VOL ] = adc_raw_vol / ( 256 / 32 ); // ←adc値でよい
// codecに伝える
iic_mcu_write_a_byte( IIC_SLA_CODEC, CODEC_REG_VOL, slider_to_codec[ adc_raw_vol / 4 ] );
force_update_vol = 100;
}
}
}
// TUNE_LED ///////////////////////////////////
// ここで?仕様?
{
switch ( vreg_ctr[VREG_C_LED_TUNE] )
{
case LED_TUNE_ILM_ON:
LED_duty_TUNE = vreg_ctr[VREG_C_LED_BRIGHT];
break;
case LED_TUNE_ILM_SVR:
LED_duty_TUNE = vreg_ctr[VREG_C_TUNE] / 16;
break;
case LED_TUNE_ILM_OFF:
default:
LED_duty_TUNE = 0;
break;
}
}
adc_updated = 0;
}
}
ADCEN = 1;
ADM = 0b00011011; // セレクトモード、章圧、fCLK/6 ///ここから ↓
ADPC = 0x06; // ADCポートのセレクト
ADS = ADC_SEL_TUNE;
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
ADCS = 1; // AD開始。 /// ここまで  までに1us=8clk以上開ける
ADIF = 0;
ADMK = 0;
}
/* ========================================================
 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_tune[3];
static u8 hist_snd_vol[3];
static u8 hist_bt_temp[3];
static u8 index;
EI( );
switch ( ADS )
{
/*
case ( ADC_SEL_AMB_BRIT ):
vreg_ctr[ VREG_C_AMBIENT_BRIGHTNESS ] = ADCRH;
break;
*/
case ( ADC_SEL_TUNE ):
hist_tune[index] = ADCRH;
#ifdef _MODEL_WM0_
adc_raw_dep = 255 - getmean3( hist_tune );
#else
adc_raw_dep = getmean3( hist_tune );
#endif
break;
case ( ADC_SEL_VOL ):
hist_snd_vol[index] = ADCRH;
adc_raw_vol = getmean3( hist_snd_vol );
// TWL用レジスタ(32段)の更新。アトミックな処理として扱わないと不都合が。
/// 割り込みはHorizonを通してコマンドを発行されるのを待てばよい
break;
case ( ADC_SEL_BATT_TEMP ):
hist_bt_temp[index] = ADCRH;
raw_adc_temperature = getmean3( hist_bt_temp );
renge_task_immed_add( PM_bt_temp_update );
break;
case ( ADC_SEL_BATT_DET ):
// vreg_ctr[ VREG_C_DBG_BATT_DET ] = ADCRH;
// todo
break;
}
// もっとまともな書き方がありそうだ
// if( ADS == ADC_SEL_BATT_DET ){
if( ADS != ADC_SEL_BATT_TEMP )
{ // 電池判別は電源投入の一回のみ
ADS += 1; // 次のチャンネル
BT_TEMP_P = 1; // 電池温度監視スタート
}
else
{
ADCEN = 0; // 止めてしまう
BT_TEMP_P = 0; // 電池温度監視スタート
adc_updated = 1;
index = ( index == 2 ) ? 0 : ( index + 1 );
}
}
/* ========================================================
tsk_adcと競合することを考慮していません
======================================================== */
u8 get_adc( u8 ch )
{
u8 temp;
ADMK = 1;
ADIF = 0;
ADCEN = 1;
ADCS = 0;
ADM = 0b00100011; // セレクトモード、昇圧、fCLK/6 ///ここから↓
ADPC = 0x06; // ADCポートのセレクト
ADS = ch;
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
ADCS = 1; // AD開始。 /// ここまで↑ に、1us以上開ける
ADMK = 0;
while( ADIF == 0 ){;}
temp = ADCRH;
ADCEN = 0;
return ( temp );
}

View File

@ -0,0 +1,43 @@
#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_TUNE 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
///////////////////////////////////////
///////////////////////////////////////
u8 get_adc( u8 ch );
#endif

View File

@ -0,0 +1,80 @@
/* ========================================================
======================================================== */
enum BATT_VENDER {
BT_PANASONIC, // open
BT_UNKNOWN1,
BT_UNKNOWN2,
BT_UNKNOWN3,
BT_UNKNOWN4,
BT_UNKNOWN5,
BT_UNKNOWN6, // gnd
BT_MAXELL
};
static const u8 BT_PARAM[][64] = {
// ID = 0 GND 白箱
/// パラメータ無し
{ // ID = 1 120 ohm
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
},
{ // ID = 2 360 hom
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
},
{ // ID = 3 750 ohm
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
},
{ // ID = 4 1.3kohm
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
},
{ // ID = 5 2.7kohm パナ
0xAD, 0x30, 0xAE, 0x70, 0xB0, 0x00, 0xB3, 0x00,
0xB4, 0x70, 0xB5, 0xA0, 0xB7, 0x80, 0xBA, 0x00,
0xBB, 0x90, 0xBD, 0x00, 0xBE, 0x00, 0xBF, 0xF0,
0xC3, 0x00, 0xC5, 0xC0, 0xC8, 0x00, 0xCA, 0xC0,
0x04, 0x00, 0x12, 0x00, 0x0C, 0x10, 0x24, 0x00,
0x10, 0xD0, 0x1B, 0xF0, 0x0A, 0xF0, 0x08, 0xE0,
0x0C, 0xF0, 0x08, 0xC0, 0x08, 0xB0, 0x07, 0xF0,
0x0B, 0x00, 0x05, 0xD0, 0x02, 0x00, 0x09, 0x00
},
{ // ID = 6 8.2kohm
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
},
{ // ID = 7 マクセル
0xAD, 0x30, 0xAE, 0x70, 0xB0, 0x00, 0xB3, 0x00,
0xB4, 0x70, 0xB5, 0xA0, 0xB7, 0x80, 0xBA, 0x00,
0xBB, 0x90, 0xBD, 0x00, 0xBE, 0x00, 0xBF, 0xF0,
0xC3, 0x00, 0xC5, 0xC0, 0xC8, 0x00, 0xCA, 0xC0,
0x04, 0x00, 0x12, 0x00, 0x0C, 0x10, 0x24, 0x00,
0x10, 0xD0, 0x1B, 0xF0, 0x0A, 0xF0, 0x08, 0xE0,
0x0C, 0xF0, 0x08, 0xC0, 0x08, 0xB0, 0x07, 0xF0,
0x0B, 0x00, 0x05, 0xD0, 0x02, 0x00, 0x09, 0x00
}
};
static const unsigned char BT_PANA_RCOMP = 135;
static const float BT_PANA_TEMPCOUP = 0.3;
static const float BT_PANA_TEMPCODN = 0.5;

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,52 @@
;;; 領域の定義
;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 @@LCODE : AT( 0E00H ) =BCL0 ; スタートアップルーチン
MERGE @@LCODE : =BCL0 ; スタートアップルーチン
;MERGE LDR_RINT:=BCL0
;MERGE LDR_CNST:=BCL0
MERGE LDR_CNSL:=BCL0
; 通常領域にあてる物達
MERGE ROM_CODE:=ROM
;MERGE ROM_CNST:=ROM
; ちょっと、困るんですが、こうしないと初期値がセットされない
MERGE @@CNST: =ROM
MERGE @@R_INIT: =ROM
; 謹製フラッシュライブラリ
; MERGE FSL_CODE:=FSL
MERGE FSL_CODE:=BCL0
; マジックナンバー
;; 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予約領域[使用禁止]

View File

@ -0,0 +1,56 @@
#ifndef __bsr_system__
#define __bsr_system__
// イベントループのステート
enum pwr_state_
{
OFF_TRIG = 0,
OFF,
ON_TRIG,
ON,
SLEEP_TRIG,
SLEEP,
// WAKE,
BT_CHARGE,
};
enum poweron_reason_
{
NONE = 0,
PWSW,
RTC_ALARM,
};
enum model_
{
MODEL_JIKKI = 0,
MODEL_TS_BOARD,
MODEL_SHIROBAKO,
MODEL_RESERVED1,
MODEL_RESERVED2,
MODEL_RESERVED3,
};
// タスクシステムの状態情報など
typedef struct
{
enum pwr_state_ pwr_state;
enum poweron_reason_ poweron_reason;
unsigned char dipsw0:1;
unsigned char dipsw1:1;
unsigned char dipsw2:1;
unsigned char reboot:1;
enum model_ model;
}
system_status_;
extern system_status_ system_status;
#endif

View File

@ -0,0 +1,72 @@
#ifndef __config__
#define __config__
#define _debug_
//#define _debug_led_
#define MCU_VER_MAJOR 0x00
#define MCU_VER_MINOR 0x10
#define _OVERCLOCK_
//#define PM_CCIC_TIM
// 古い(C)電源ボード
//#define _PM_BUG_
//#define _PARRADIUM_
//#define _MODEL_TEG2_
// ↑TEG2 CPU Type-T
//#define _MODEL_WM0_
#define _MODEL_TS0_
// ↑TEG2 CPU Type-C
//#define _MODEL_CTR_TS_
// ↑FINAL SoC Type-C
//#define _MODEL_CTR_JIKKI_
//#define _SW_HOME_ENABLE_
// ---------------------------------- //
#ifdef _MODEL_CTR_TS_
#ifdef _MODEL_CTR_JIKKI_
#endif
#endif
#ifdef _MODEL_CTR_TS_
#define _MODEL_CTR_
#endif
#ifdef _MODEL_CTR_JIKKI_
#define _MODEL_CTR_
#endif
// ---------------------------------- //
#ifdef _MODEL_TEG2_
#define _PMIC_TWL_
#define _MCU_KE3_
#endif
#ifdef _MODEL_WM0_
#define _PMIC_TWL_
#define _MCU_BSR_
#define _SW_HOME_ENABLE_
#endif
#ifdef _MODEL_TS0_
#define _PMIC_CTR_
#define _MCU_BSR_
#endif
#ifdef _MODEL_CTR_
#define _PMIC_CTR_
#define _MCU_BSR_
#define _SW_HOME_ENABLE_
#endif
#endif

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

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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,568 @@
:02000000000EF0
:02000200FFFFFE
:02000800E334DF
:04001000D932DB32D4
:02001C00EB33C4
:02002400FB33AC
:02002A000F3392
:08003400E534AC34A734CF32EF
:04004A00DD32A234CD
:0400C0006EFBFF854F
:0A00C400FFFFFFFFFFFFFFFFFFFF3C
:0A00CE00FFFFFFFFFFFFFFFFFFFF32
:1000D800C7F616A7F647DFFBFDF307FD5921EFF832
:1000E800C6D73142210261EDD7717BFACEA016CE78
:1000F800A180CEA409F5AAFFF5A9FFF400F401F444
:1001080002CD0306F404F405F406CD0740F40CF41C
:100118000EF408F40FF53000F53100F53300F5342E
:1001280000CF350003CF370019F53C00F53E00F548
:1001380020FFF521FFCE22E9E523FFCE240BCE25B3
:1001480003F526FFCE271FCE2C1FE52EFFCE2F0747
:10015800CE28FFF54300F54700CF530006F55700BA
:10016800F5E0FFF5E1FFF5E2FFF5E3FFF5D0FFCE9F
:10017800E4FFCEE5FFCEE6FFCEE7FFCED4FFCEE824
:10018800FFCEECFFCEE9FFCEEDFFCEEAFFCEEEFECE
:10019800CEEBFFCEEFFFCED8FFCEDCFFF538FFF574
:1001A80039FFF537FF7108F200F690BFB4017138D6
:1001B800F100F54002F54102F54302F5A5FFF5A669
:1001C800FF7158F000F530FF7128F0005087BF1814
:1001D80001BF1A01BF1C01BF1E017148F000F530B4
:1001E80002F5BCFFF5BDFFD7F7D7C7C1FBF8FF3154
:1001F800642002EFFA715220340020C5304000C15B
:10020800C1506CFDF622100617C1E6A1C1500EC1FF
:10021800506CFD3A22100617C1E6A1C1500EC1501C
:100228006CFD3A22100617C1E6A1C1A1A1C1506C0C
:10023800FD3A22100617C1E6A1C1500EC1506CFD4F
:10024800F6221006CC0100CC000017C1E6A1C1506F
:100258003EC1506CFDF6221006CF03F99EAFC0F9DF
:10026800BF04F9AFC2F9BF06F9C0C6D7FD2224F60C
:10027800C15003C15084FDB6221004F3D7C720062D
:10028800FBF8FFC71704030016F74940209BA3A7F4
:100298005102614ADFF4C6C717A116F74942209BED
:1002A800A3A75102614ADFF4C68C01318EC1E6A1D1
:1002B800C15006C1506CFDF622100617040300C198
:1002C800E6A1C1503EC1506CFDF6221006716201D4
:1002D800300900FD9C2D62316A9C05716301FDF2B5
:1002E80001717201300800FD9C2D629F02F9300BEC
:1002F80003FD232EF6C15084FDC521C0629C051064
:1003080006C6D7C751E0D902F9D651A36128319E54
:100318009F46F92FC4F9318EFD84201344040071DF
:10032800FEDE05D5C5F9DF508F46F97C804C95DC9B
:1003380015D946F9F1241400BDD8AF04F9FD6D0EA6
:1003480012F62316EF13D946F9F1241400BDD8AFDD
:1003580006F9FD6D0E12F62316D903F9F107C1E669
:10036800A1C1500CC1506CFDF6221006D2DF068FD9
:1003780046F99FC4F9A0C5F9F7C6D77163073005D8
:1003880000FD242F300500FD242F304A00C15022E3
:10039800C15084FDB6221004717031F9E7D7300AD4
:1003A80000FD242F716031F9E7D7716831F9F7D76B
:1003B800716207303300FD242FF6C1E6A1C15084D5
:1003C800FDB62210043431F9895C3F99F7D7F7D785
:1003D800FDD603F7D7FD8303F7D7FDA603F7D7FDAF
:1003E800B203F7D7FDB803F7D7C75A00FC8E205CD5
:1003F800FC9E2071030E71520730A000FD242F715E
:100408005307300400C1506CFDC521C056C8663181
:100418008EF7BDD813BDDAFD3A0FC9DCCCCC30F469
:1004280040FDA60EDE03E7EF2B669F38F9710A2020
:100438007100300071120071020E306400FD242F2B
:100448003102000F5A00FC8E205CFC9E2071030EC6
:10045800E7EF01F7C6D7303200FD242F310400182A
:1004680071520730FA00FD242F30FA00FD242F3096
:10047800FA00FD242F7153075A00FC8E205CFC9E65
:100488002071030EF7D7FDB803F7D73104070671BB
:100498003031F9EF04713831F93102050671503104
:1004A800F9EF04715831F931120506714031F9EF4D
:1004B80004714831F94046F957DC094046F9B861FA
:1004C800D8E5C6F94046F947DC094046F9BD61D888
:1004D800F5C6F940C6F901DF0C4046F947DC06408D
:1004E80046F9BDDC11D5C6F9DF114046F957DC0BDA
:1004F8004046F9B8DE05712204EF03712304311276
:1005080005058F3BF9EF01F1318EBE6A323200D713
:10051800F7D7CEABACD7C720FE200CFBF8FFF6BF51
:10052800BA015020BFBA01FD2708717BFA170408E9
:1005380000FDE208629C06FD6D08620E069C06300E
:100548000020BC02CC040F5112879C0897878C08A6
:10055800974C1C61C8ED0406FD1A05878C08973175
:100568008EFD2F08D2DD0E878C0897318EFD33085B
:10057800629C06EFE6CC07008C074C04DE66F18728
:100588009C0997AC02148C049EFD118972878C0912
:1005980097318E07040800146299AC02A1BC028747
:1005A8008C099781879C0997878C0997D1DFD4306C
:1005B8004000C1878C0897318E31AD128C07318E7F
:1005C800318D03BDD831FFBDDADADAADD8FD340B91
:1005D800C0629C06D1DD08FD2B0800E7ED1107611C
:1005E8005907EF94878C0897318EFD3708D2DFF4CE
:1005F800878C089781879C0897ED55055104879C3F
:100608000897878C08974C12DE17878C0897318ECD
:10061800FD3308629C06878C089781879C0897EFB2
:10062800E15104879C0897878C08974C1261C8EDA4
:10063800CE06CC07008C074C04DE6D31825169FD73
:100648001A0531B2E20631825102EFF6713BE287B8
:100658008C0997318E07040800148E509971503018
:1006680002878C099781879C0997878C0997D161A4
:10067800E8318451CD304000C1878C0897318E31E4
:10068800AD128C07318E318D03BDD831FFBDDADA5A
:10069800DAADD8FD340BC0629C06D1DD06FD2B080F
:1006A800E7EF66615907EF8D878C0897318EFD3724
:1006B80008D2DFF431845102EF0C878C08978187C8
:1006C8009C0897ED2F0671503002CC0000CC010039
:1006D8008C014C09DE218C01318E1249F61F728C77
:1006E80001318E04F64714896142DF03F1EF01E11D
:1006F8000D9B615901EFD98BD1DF08FDF209FD048B
:100708000BEF06FD2B08FD170710FE100CC6D7C708
:1007180020FE200AFBF8FFF6BFBA015080BFBA01DD
:10072800717BFAFD270817040600FDE208629C04A5
:10073800FD6D08620E049C04300048BBCC020F51CA
:1007480008879C0697878C06974C1261C8EDE907C5
:10075800FD1A05878C0697318EFD3308629C04CC00
:1007680005008C054C04DE61F1879C0797AB148C5F
:10077800029EFD118972878C0797318E0704060047
:10078800146299ABA1BB878C079781879C079787D1
:100798008C0797D1DFD7304000C1878C0697318E00
:1007A80031AD128C05318E318D03BDD831FFBDDAE4
:1007B800DADAADD8FD340BC0629C04D1DD06FD2B1E
:1007C80008E7EF21615905EF99878C0697318EFD6F
:1007D8003708D2DFF4878C069781879C0697ED4D02
:1007E80007FDF109F710FE100AC6D7717BFAC7207A
:1007F800FE2004FBF8FFFD270817040200FDE208AD
:10080800629C01FD6D08626E019C0130BEF9FDBC61
:1008180009626E019C01FD2B0810FE1004C6D771F9
:070828007ABED7717BBED739
:10082F005208EF065203EF025206FEE600FE1B00CF
:10083F00DC16089F03088F0408089F040862FE2433
:10084F0000089F0408EEBF00EEBA00C1C514410EA8
:10085F0011D9D0FF118FD1FF312E45C4C0D7F2313E
:10086F00A2C401E2D79DE261DD4C09DF12717BFA70
:10087F00C18F06089F0DFAC0CF060800EE27003182
:10088F00F2FA04CF0608004C00DF05D50008DD168C
:10089F0061DD717BFAD50608DD0ACDE31F61CD61FD
:1008AF00CDEE160061CDFED40061FFFE9A00FCF87C
:1008BF00FF0EFEB20061CDFED5004C09DF0EC18FD9
:1008CF0006086F0DFA9F0608C0EE0400CF06080059
:1008DF00F8E3D75200EF025202FE3700CF0CFA00B6
:1008EF00CF060800BF0408C716629F000841001119
:1008FF008F44209B4100118F45209F0108C6510056
:10090F00FE62FFEF025205CF060800C1510CFE0A2E
:10091F0000C0D7C1511DFE0200C0D761DD717BFA47
:10092F0070CEC0A59EC47CFF9EC4609EC461CDD70F
:10093F0061DD717BFAC18EC45C1BFED6FFCF06084A
:10094F0001FED7FFC061CDD731F2FA1AC1AEE4BFB5
:10095F00FEF9AEE6BF00FAAED4BF02FA30FFFFBE1B
:10096F00E4BEE6BED4C0D731F2FA11C1AFFEF9BE74
:10097F00E4AF00FABEE6AF02FABED4C0D7C1BF04DF
:10098F00FA13BF06FA15BF08FA17BF0AFAC0D7AF96
:10099F0004FADB06FAEB08FAFB0AFAD7534B30528C
:1009AF005430324E323030475631323000C5C1519B
:1009BF00045001EE0000FE5AFF9F03085109FEA4E8
:1009CF00FEC4D2DF0908C3618AF3FE0500C2C4EE7C
:1009DF0035FFC1C7FB040861C999A58392DFF8C62B
:1009EF00C0D7FFC150FEFEAB0061DD717BFACF06B1
:1009FF000800FE0A00FE6FFF61CDF8E3EECF00C7DF
:100A0F00FB0408BFFEF98FC0009C05C5C337040661
:100A1F0000BF00FA3536560A300000522BFE660032
:100A2F00C2C4C630040AB800300000B8022004AFB8
:100A3F0000FAB800300F00B802AFFEF961FF520A9A
:100A4F00FE05FFECF8FF0E717BFAC1C7FB04088CA3
:100A5F0005C65C80FE0200C0D761DD717BFA70CFE6
:100A6F00C0FFA59FC0007CFF9FC000609FC00061BA
:100A7F00CDD7618BFEE2FF717BBE410011FB000001
:100A8F0017CEFC0061CB089EFDF31161C999A583B8
:100A9F0092DFF7D7FE7CFED50CFADF23C1CF030818
:100AAF00035109FEBFFDC0D2DF37FE3800A2040894
:100ABF00CF0308075109FEACFDD2B20408DF22C7ED
:100ACF00FB0408318302C6D7C6510AFE97FD624C5C
:100ADF001FDF06CF0CFA01EF04CF0CFA00C0EE2691
:100AEF00FEC0EE20FEC7C1FB04088B31196C0161FB
:100AFF00589BC0C6D7717BFAFE18FEAF04080406D8
:100B0F0000C11436680A300000522DF3FE77FF8FB4
:100B1F00C000FEF6FD61CF5C807C8073C0041900BD
:100B2F00CEFC0F61CBC55404EF03C55417FEE3FD94
:100B3F00C7360008BB629C0288089C03D1DD334C8A
:100B4F0041DE2F70F1312DB161090033081C00080F
:100B5F0051FF612A410E118FD0FF613B118FD1FFE1
:100B6F006138DC0E8B5C03DF0964C6C4FEF6FCEE55
:070B7F0095FDC6C4EE8EFDDA
:100E000061CF5100718C7109FECBF800FEFCF1003E
:100E100000F6BF00F953C0F693935820FEDFF94166
:100E20000036462034C0F9EF05118B99A7A5174469
:100E30008420DFF53602F930C0F9EF04CC0000A7BA
:100E400047DFF9410036842034FEF9EF05118B9914
:100E5000A7A517448420DFF536FEF930FEF9EF042C
:100E6000CC0000A747DFF9FCD80000EFFE61DD7180
:100E70007BFABEF0ADD8BEF200AEF661CDD7DF1D75
:100E800006DC44807FDF167152DEEF32DF0F06D8BA
:100E900044807FDF083154DE3C3172DE3CC9DE0520
:100EA00004FDF10EEF46C514ADDEC1657BDB5C8051
:100EB0009DDEADDA71FB3571FB44807FDEC03544C9
:100EC000807FDEC86BD96BD86BDD6BDC0561C8DD5C
:100ED0001BADDA71FB3174DE077174DBF181EF0C4D
:100EE00045ADD861F846DC61E87177DBC0BDDEC492
:100EF000D78EFC708EFDC1C5C3ADDE315E04943566
:100F0000320000C3C1D8DEF1C1AEF8FC1B0F00C037
:100F1000C0C0C2C4C09EFD609EFCD71489728A0402
:100F20009EFDAA021411894C40DD0E624C04300271
:100F30000061C8300100BF00F9D7C5C3C1ADDADA1E
:100F4000D831750914F62312F661D8B125ED590F81
:100F5000C5C3C1ADDADAD8F4DB0361C8DD3B235584
:100F60009E31730A9501311C61D8A13175F6618AF1
:100F70004C80618ADC11DF0633718C33DE0983DF3C
:100F80000604010061D8857174DB3561FB9DDB656A
:0D0F900071F99DDA637064BDD8C0C2C4D78A
:0A0FF60030383A34353A3339000040
:10200000EA0102030405060708090A0B0C0D0E0F6E
:10201000101112131415161718191A1B1C1D1E1F48
:10202000202122232425262728292A2B2C2D2E2F38
:10203000303132333435363738393A3B3C3D3E3F28
:062040004A5740000801B0
:102046000B001F000000000000000000C830000068
:10205600892B0000F82C000093040000B724000030
:102066007F2600008D2B0000042C00000C2C0000A5
:0E207600472C0000482F000000000000000072
:08208400317503F7332312D775
:0A21000030383A34353A3339000024
:10210A007140F00071783002713AE6713BE2713B3E
:10211A00EA713BEE5A06FCCF34024AE552FF711AC5
:10212A0052710A5271483002713030027120300205
:10213A00CF320206CF330205713BE6717030028E50
:10214A00265CFC9E26D7717830027148F000D7FDD4
:10215A00AE2751205FA8FFD1DD0971502FF9FD226A
:10216A0024EF03FD7402FD0027FD622AFDA221FD72
:10217A00CC2D8F2FF95C20D1DD06CF0EF902EF03AB
:10218A00F50EF9714221717AFAFD1A05FDCF2DFD7E
:10219A00F62EFDEA00EFF2D731020403F1EF01E176
:1021AA003410F9718C8971899931120403F1EF01A4
:1021BA00E13410F9718C89719999D7C7C1C1FBF8BB
:1021CA00FFFD22243164200300EFF9716220F51B20
:1021DA00F98C02318EFD7323D2DD0ACF1BF902710D
:1021EA006320F7EF478C0A318EFD8923FDD3238CB8
:1021FA00026C01318EFD8923300400BF240130179F
:10220A0040BF1C01300400BF2201F6BF2A01710B36
:10221A00E2CE44FF3182E202EFFA8E449C01FDFED7
:10222A0023710BE27163208C01318E121004C6D720
:10223A00C7C1FBF8FF31722003FD22243164200359
:10224A0000EFF97162208B318EFD7323D2DD0671A6
:10225A006320E7EF548C08318EFD8923FDD3238B4D
:10226A006C01318EFD8923300400BF2401301740F0
:10227A00BF1C01300400BF22018C0A91DF04F6BFA3
:10228A002A01710BE2CE44FF3182E202EFFAAC0C72
:10229A00148E449961790C61690A8C0AD1DFDAFDDE
:1022AA00FE23710BE2716320F7C0C6D7C7C1FBF8E2
:1022BA00FF31722003FD22243164200300EFF971FB
:1022CA006220710AE68B318EFD7323D2DD067163BB
:1022DA0020E7EF158C08318EFD89238C0A318EFD9B
:1022EA008923FDFE23716320F7C0C6D7C7C1FBF857
:1022FA00FF31722003FD22243164200300EFF971BB
:10230A006220710AE68B318EFD7323D2DD0671637A
:10231A0020E7EF5231522039C73414F9AC0C165267
:10232A00048B99A5A792DFF9C63184BD02EFFA7131
:10233A007ABDCEB144CBB414F98C0A318EBEB8CE74
:10234A00BB48714BE1714BE5710ABD8C089E44EFA5
:10235A0014710BE28C089E44710BE68C0A9F1AF9E1
:10236A00AC0CBF18F9F7C0C6D7C716FDAA2317F1D8
:10237A00FD8923D2DD06FDFE23E7EF01F7C6D7C7A5
:10238A0016710BE2669E443182E20300EFF9F642CF
:10239A000401DD09AF0401BF0C01E7EF01F7C6D75D
:1023AA00AF2801085CFB08BF280100000000AF2825
:1023BA00015CFBBF2801300400BF2A01301780BF2F
:1023CA001C01300400BF2201D7AF2401086C0408A5
:1023DA00BF2401AF28016C0F086C0B08BF2801004D
:1023EA00000000AF2A01085CFB08BF2A01000000B8
:1023FA0000EDAA23300400BF2401F6BF2A01300BE6
:10240A000BBF280100000000510FBF280100000087
:10241A0000500FBF2801D7D77132057120F0000094
:10242A00000000F6BF26015014BF1401CB44000A75
:10243A00300F0FBF2801716320715320717220D7AA
:10244A0031642002EFFAFDD3237133057128F000BD
:10245A00717320D7D7D77100F200301100BFB601CF
:10246A00300188BF9001300984BF9E01BF9C01BF23
:10247A009A01BF9801BF9601BF9401BF9201F53C32
:10248A00FF30FE00BFBE015006BFBC01F6BFB80157
:10249A0050EEBFBA01A1BFB201C918FE03D730EF8F
:1024AA0000BFB401F6BFBA017108F200D78F3CF938
:1024BA00D1DD0B91DD4B91DD4391DD20EF438F0E92
:1024CA00F92C03DC13D1DD0B91DD0D91DF05FDCA7B
:1024DA0025F3D7FD1025F3D732FA00D7F6426CFF61
:1024EA0061E8E1318F12AE6C23BE6CF6426EFF6179
:1024FA00E8E1318F12AE6E23BE6EF7D7FDCA25F31F
:10250A00D7FD1025F3D7C756008F38F9318EF7BD9E
:10251A00D813BDDAFD3A0FC9DC0000304C41FDA6E4
:10252A000EDE1DD51DF9DF0AF6BE6CBE6EE51DF97D
:10253A00EF09D93BF9F1BE6EF51DF932FA00EF7ECB
:10254A008F38F9318EF7BDD813BDDAFD3A0FC9DCE1
:10255A000000304C42FDA60EDE2EF6426CFFDD0571
:10256A00B26CFF5601D93BF9F1426EFFDD465601C6
:10257A00D93BF912AE6E43DE03E1EF0251FF318F10
:10258A0012AE6E03BE6EEF2CD93BF9F1426CFFDD41
:10259A00185601D93BF912AE6C43DE03E1EF025142
:1025AA00FF318F12AE6C03BE6CF6426EFFDD05B2D0
:1025BA006EFF560166D1DF0532FA00EF01F7C6D782
:1025CA00C75600AE6C4220F9DD1486AF20F9426C82
:1025DA00FFDE05B26CFFEF06AE6CA1A1BE6CAE6E5B
:1025EA004222F9DD155601AF22F9426EFFDE05B22D
:1025FA006EFFEF06AE6EA1A1BE6E66D1DF498F1ED9
:10260A00F9D1DD082C02DD042C02DF318F38F931D3
:10261A008EF7BDD813BDDAFD3A0FC9DC0000304C85
:10262A0042FDA60EDE0C307F00BF22F9F6BF20F96C
:10263A00EF12F6BF22F9507FBF20F9EF07F6BF224B
:10264A00F9BF20F9A01EF9320500C6D78F3EF95C02
:10265A0001D1DD08D93BF9F1BE64EF03F6BE648F00
:10266A003EF95C02D1DD078E386C809E38D78E38F1
:10267A005C7F9E38D78F3DF95C01D1DF0432FA00C6
:10268A00D7D51CF9DD18F51CF98F3DF95C02D1DDAF
:10269A0006CF24F902EF03F524F932FA00D7D5243C
:1026AA00F9DD2A8F25F991DD082C02DD042C02DFE1
:1026BA0005F6BE66EF06D93BF9F1BE66A025F940DC
:1026CA0025F920DF2DF525F9B024F9EF258F3DF9FD
:1026DA005C01D1DF0BF6BE668ED46C109ED4EF126D
:1026EA00D93BF9F1BE668E386C809E388ED45CEF89
:1026FA009ED4321C00D77170F000CE9D08CE9EC0C9
:10270A00CE9F80F592FFF593FFF594FFCE960EE5E6
:10271A0095FFCE9709CE9809CE9C7F711AE7712B47
:10272A00E7717A9DE541F9710321711321D7C73108
:10273A0002211E710221710A9E31929E02EFFA3421
:10274A0048F93692FF52078B99A5A792DFF9710BC8
:10275A009EC6D7C788061631122115711221C734B1
:10276A0026F93092FF1652078B99A5A792DFF9C670
:10277A006673671826F9C6D7C73104210371032186
:10278A003114211E711321710A9E31929E02EFFAB1
:10279A003492FF3626F952078B99A5A792DFF97171
:1027AA000B9EC6D7CF3BF9FFF53FF9CF40F903D7C8
:1027BA00C788061666320003F02C052361D8ED5F40
:1027CA00282361F8ED68289161F8ED7A289161F87B
:1027DA00ED0F299161F8ED1B299161F8ED242991FA
:1027EA0061F8ED52292361F8ED5E29912C0261D836
:1027FA00ED00292C042C0761D8ED76299161F8EDBA
:10280A00C8299161F8EDD229912361D8EDDC29D14B
:10281A0061F8ED6B29912C0261D8ED8629D161F816
:10282A00ED94292C0261F8EDA2299161F8EDAA290B
:10283A002C072361D8EDB8299161F8EDC029912CB4
:10284A000461D8EDDC292361D8EDE429D161F8EDE2
:10285A00EC29ED052A667367182EF9ED052A6673C9
:10286A0067182EF9D1DD06306D2CFD232EED052AD1
:10287A00667367182EF9D1DD7A8F3AF95C01D1DDDA
:10288A0005308000EF01F6609F80F98F3AF95C020B
:10289A00D1DD03E1EF01F1723480F989616A998F20
:1028AA003AF95C04D1DD045102EF01F1723480F986
:1028BA0089616A998F3AF95C08D1DD045120EF01E8
:1028CA00F1723480F989616A998F3AF95C10D1DD25
:1028DA00045110EF01F1723480F989616A998F3AD3
:1028EA00F95C20D1DD045140EF01F1723480F9899D
:1028FA00616A99ED052A30D803FD232E667367189D
:10290A002EF9ED052A667367182EF9FD5626ED0590
:10291A002A667367182EF9ED052A667367182EF969
:10292A008F3DF95C01D1DF0BF6BE668ED46C109E2A
:10293A00D4EF12D93BF9F1BE668E386C809E388E80
:10294A00D45CEF9ED4ED052A667367182EF9FD56FE
:10295A0026ED052A675CBF72667362182EF9ED05CB
:10296A002A667367182EF99E99ED052A67318EC17A
:10297A00662C1A318EFD5D27C0ED052A667367182D
:10298A002EF9307332FD232EEF71667367182EF914
:10299A00302C32FD232EEF63667367182EF9EF5B36
:1029AA00667367182EF9304F32FD232EEF4D66738A
:1029BA0067182EF9EF45667367182EF9EF3D6673AF
:1029CA0067182EF99E9AEF33667367182EF99E9B45
:1029DA00EF29667367182EF9EF21667367182EF9C7
:1029EA00EF19667367182EF9406CF96ADF0D406DAE
:1029FA00F968DF074C6C61F8FD1E05C6D7C7166675
:102A0A004C1ADC074C2161D8FD38276673092EF968
:102A1A00318E12C6D7C71666D1DD0891DD0A91DD5F
:102A2A000CEF0EF52EF9EF09F52FF9EF04CF30F977
:102A3A000266D1DD0891DD05664C02DF19710A23B1
:102A4A00D52EF9DF0BD52FF9DF064030F902DD0666
:102A5A00710303710B23C6D7CF70F935CF76F90FFF
:102A6A00CF77F907CF7BF903E57CF9E57FF9CF80CA
:102A7A00F960D7C7880616662C042C02DC0B912C49
:102A8A0005DC062C062C08DE066673671870F966E4
:102A9A002C04DF0A67D1DD0630752BFD232EC6D73D
:102AAA00C71666730970F9318E12C6D7C7C1C1FB42
:102ABA00F8FF8C025CF09C018C025C0F9B8C014C31
:102ACA0081DC05F792ED712B8C014C50DF05F792F2
:102ADA00ED712B8C014C31DE468C014C11DE1E8CC3
:102AEA00014C10DF0D8B4C03DE3351030D318E1276
:102AFA00EF758B4C03DE268B318E12EF6A8C014CFC
:102B0A0020DF0D8B4C02DE1551060D318E12EF5768
:102B1A008B4C02DE5051080D318E12EF4AEF468C73
:102B2A00014C61DE208C014C60DF0D8B4C04DE35DC
:102B3A00510E0D318E12EF2F8B4C02DE28510A0DE9
:102B4A00318E12EF228C014C70DF0D8B4C08DE1592
:102B5A0051120D318E12EF0F8B4C02DE08511A0DF5
:102B6A00318E12EF02F7921004C6D7716030F98FD6
:102B7A0035F95C40D1DF06710303710B23F7D732B5
:102B8A000A00D771320331240C06712031F9EF049F
:102B9A00712831F931140706711031F9EF047118EF
:102BAA0031F97133038F31F97F8CF9D1DD4271002C
:102BBA002FF98F0EF92C02DC37D1DD3491DD079124
:102BCA002C02DC12EF2A8F34F95C01D1DF22710367
:102BDA0003710B23EF1A8F8CF95C02D1DD123112CB
:102BEA00070E8F34F95C01D1DF06710303710B23E1
:102BFA008F31F99F8CF9326400D7C7D5CAF9F79299
:102C0A00C6D7C72004FBF8FF400EF903DD06400EC5
:102C1A00F905DF228F2EF99C038F2FF99C028F3141
:102C2A00F99C018F5FF99B17C1300400C1F6C150AE
:102C3A0044FDF62210063203001004C6D78F56F957
:102C4A005C01D1DF088F57F95C0391DF12400EF95E
:102C5A0003DF0A31240F0630E831FD232EF7D7327D
:102C6A00F800D78F39F95C01D1DD05F50EF9EF3996
:102C7A008F39F95C02D1DD0C5A00FC8E205CFC9E77
:102C8A002071030E8F39F95C04D161E87113008F4A
:102C9A0039F95C08D161E871030E300500FD242F73
:102CAA00710A2071120071020E8F39F95C20D1DD90
:102CBA000830E203FD232EEF0E8F39F95C10D1DDC7
:102CCA000630E703FD232E8F39F95C80D1DD083009
:102CDA00DD03FD232EEF0E8F39F95C40D1DD06307E
:102CEA00EC03FD232EF539F9F7D700EFFDD7400E97
:102CFA00F903DD06400EF905DF453124211F8F3720
:102D0A00F94F90F9DD148F37F99F90F9D990F9F1BD
:102D1A00C1F6C15050FDB62210047123217150F042
:102D2A0000CE301BCF170006CE3106717A30710BF8
:102D3A00E3710BE7D936F9F1312DBD1A320800D704
:102D4A00C7C1C1FBF8FFAC021489728A016142DE75
:102D5A0011899C01AC02148A017299AC02148C018B
:102D6A009A01AC021489728A01614ADC0689318EA1
:102D7A0012EF1BAC02148A01728A02614ADE078AC8
:102D8A0001318E12EF08AC02148A02318E1210043D
:102D9A00C6D7C716710AE7710BE37150F000717B51
:102DAA0030CE3023CF170006669E31717A30710B10
:102DBA00E73182E302EFFA8D1F7158F000318E126B
:102DCA00C6D7ED222EC73134212B71332130CCF9ED
:102DDA00161744F8F9DD1E148A02D1DF0BA9CEFCBE
:102DEA000061CA629C02EF0717148A02919A02A72D
:102DFA00A7A7A7EFDC3144211C71432130CCF91677
:102E0A001744F8F9DD0FABCEFC0061CA629C02A739
:102E1A00A7A7A7EFEBF7C6D7D7717BFAC7C1C1FB44
:102E2A00F8FFD5F9F9DD0300EFFDE5F9F940F8F906
:102E3A000FDC0300EFFDCC01008C014FF8F9DE1D19
:102E4A008C01F0317E12799CF9614902DF0A00F5A2
:102E5A00F9F9717AFAE7EF60615901EFDCCC010008
:102E6A008C014C0FDE188C01F0317E049CF914A9F8
:102E7A006168DF05AC02B9EF05615901EFE2A0F81C
:102E8A00F9CC0000CC01008C014C0EDE168C01F04E
:102E9A00317E049CF914A9616861E861590061599D
:102EAA0001EFE48B4FF8F9DD0300EFFDF5F9F97155
:102EBA007AFAF7EF0300EFFD1004C6D7C716667754
:102ECA0067F0317E049CF914A96168DD1A674C0F1A
:102EDA00DE1581F0317E049CF914A91267F0317E67
:102EEA0033789CF987EFD9B0F8F9C6D7C756006688
:102EFA004C0FDE23F0317E049CF914A96168DD14BD
:102F0A00A9CEFC0061CAD2DF0B717BFA17F1FDC6AC
:102F1A002E717AFA86EFD8F7C6D7C7C1C1FBF8FF78
:102F2A00FD1A058C02D1DD1261690230AE01BBF6D1
:102F3A00614900DDEE618900EFF51004C6D78F0EF6
:102F4A00F9D161F8ED693091DD1B9161F8ED1B3023
:102F5A009161F8ED4E309161F8ED55309161F8EDDF
:102F6A005E30EDC330712BE7713AE78F0FF991DDCF
:102F7A002ED5BAF9DF05D5BDF9DD05F5FAF9EF0366
:102F8A00A0FAF98FFAF901DE08F50EF9714221F774
:102F9A00D740BAF903DE0840BDF903DE02F7D7715C
:102FAA005221717221710222F5BAF9F5BCF9F5BD07
:102FBA00F9FD2224FD8502FDF001D2DD09714221CD
:102FCA00F50EF900EFFDFDF103D2DD0B714221FD93
:102FDA004A24E50EF9F7D7FDD603D50FF9DF25F513
:102FEA003CF9FD8303D2DF0B714221FD4A24E50E31
:102FFA00F9F7D7FDA603D2DF0F714221FD4A24E576
:10300A000EF9F7D7CF3CF903CF0EF902714221F737
:10301A00D7FD6024CF37001DFD0A21FD5F24714AC8
:10302A009DCE3831CE3971CBE43BEFCBE6F6F0CE0C
:10303A00D4FFCF0EF903F556F9307332FD232EF57E
:10304A000FF9EF783102000100EF71CF0EF905FD9B
:10305A00B203EF68CF0EF9023102006000EF5DFDA6
:10306A00A824FD5021FD5E24F52EF9F52FF9F5303F
:10307A00F9717301717BFAFD5E04FD4A24CF3500B4
:10308A0003CF370019CE3708F538FFCE3910CBE415
:10309A00BFFFCBE6FFF5CED4FFF6BEE0BEE2BED060
:1030AA00F5FAF9E50EF961FD717AFACED47F8E3818
:1030BA006C809E38714221EF0300EFFDE7D7400E86
:1030CA00F903DD06400EF901DF6331340708715355
:1030DA0021F5BAF9EF1531542105F5BAF9EF0CA02B
:1030EA00BAF9D5BAF961F8CFBAF9FF3144070871CC
:1030FA000322F5BDF9EF1531042205F5BDF9EF0CF0
:10310A00A0BDF9D5BDF961F8CFBDF9FF31040208B8
:10311A00717321F5BCF9EF1531742105F5BCF9EF8E
:10312A000CA0BCF9D5BCF961F8CFBCF9FF8F0EF938
:10313A00D1DD0B2C03DD162C02DD12EDE431F5BADC
:10314A00F9F5BDF9F5BCF9F5FBF9EDE43140BAF949
:10315A0006DF1471202EF98F33F95C04D1DF207158
:10316A000303710B23EF1840BAF942DF1271302EB4
:10317A00F98F33F95C08D1DF06710303710B238FD2
:10318A002EF95C08D1DD20A0FBF940FBF90DDC1A11
:10319A00CF3CF903F6426CFFDF10426EFFDF0BF5FE
:1031AA000EF9714221EF03F5FBF940BDF90ADF126E
:1031BA0071402EF98F33F95C10D1DF067103037168
:1031CA000B2340BCF90ADF1271502EF98F33F95CD8
:1031DA0020D1DF06710303710B23320800D7C740E1
:1031EA000EF903DF2C365CF9C7300600C150A8C1BE
:1031FA005030FD3A2210068F57F95C0391DF1271A5
:10320A00402FF98F34F95C10D1DF06710303710B7B
:10321A00238F56F95C01D1DD068F57F95C0391F7CC
:10322A00C6D7D958F9F1C15030FDC521C0629F5B9C
:10323A00F971302FF98F34F95C08D1DF0671030375
:10324A00710B23F7D7D95BF9F1C1D95AF9C15030BB
:10325A00FDB622100471302FF98F34F95C08D1DFE2
:10326A0006710303710B23F7D7C72004FBF8FF305D
:10327A000F00C15030FDC521C0401BF902DF03F722
:10328A00EF3FCC0100CC0202CC03808F56F95C01DF
:10329A00D1DF0D8F57F95C03D1DF05CC0007EF10A2
:1032AA008F57F95C0391DF05CC002FEF03CC00C7E1
:1032BA0017C1300400C150A0C15030FDF6221006DB
:0532CA00F71004C6D757
:1032CF00400EF90161FC61FC61FC61FC61FCC1C352
:1032DF00C5C7520C929269D4FEC1DFF88EFD708E75
:1032EF00FCC1301805FD232EC09EFC609EFD34D41A
:1032FF00FE5206C0B9A5A592DFF9C6C4C2C061FCD3
:10330F00C1C3C5C7520C929269D4FEC1DFF88EFDBE
:10331F00708EFCC13184510DF5C8F971483002FD32
:10332F008227EDD33331A2510A71603002F5C8F90B
:10333F00EDD3338FC8F9D1DD0891DD1291DD29EF7F
:10334F00467150300271403002E5C8F9EF768E5069
:10335F009F08F971503002D908F9F1FD072A629FD1
:10336F000AF9CFC8F902EF5C31B4511731C45106D5
:10337F00CFC8F903EF1171503002F5C8F971483019
:10338F0002EF41CFC8F90440C8F903DF0E8F0AF9E5
:10339F009E50D908F9F1FD1F2AEF158E509F0AF99B
:1033AF0071503002D90AF9F1C1D908F9FDBA27C015
:1033BF00A008F940C8F903DF0BD908F9F1FD072A76
:1033CF00629F0AF9C09EFC609EFD34D4FE5206C077
:1033DF00B9A5A592DFF9C6C4C2C061FCC1714AE5A7
:1033EF00717BBD710BE6AF0401C061FCC1C5717A81
:1033FF00FA31542013D51AF9DD0EEB18F9899E44D2
:10340F00A218F9B01AF9EF2B710AE6300400BF24A5
:10341F0001F6BF2A01300B0BBF280100000000513D
:10342F000FBF280100000000500FBF28017153206B
:10343F00716320C4C061FCEFFE61FCEFFE61FCEF25
:10344F00FE61FCEFFE61FCEFFE61FCEFFE61FCEF45
:10345F00FE61FCEFFE61FCEFFE61FCEFFE61FCEF35
:10346F00FE61FCEFFE61FCEFFE61FCEFFE61FCEF25
:10347F00FE61FCEFFE61FCEFFE61FCEFFE61FCEF15
:10348F00FE61FCEFFE61FCEFFE61FCEFFE61FCEF05
:10349F00FE61FCE51CF961FC71322161FCC18F52A8
:1034AF00F94F96FFDF2B8F53F94F97FFDF238F5481
:1034BF00F94F98FFDF1B71202FF98F34F95C04D17E
:1034CF00DF0F710303710B23400EF90161F8E50F54
:1034DF00F9C061FC61FCC1C3C5C7520C929269D49B
:1034EF00FEC1DFF88EFD708EFCC1717AFA8E312C21
:1034FF0006DD0991DD1D91DD3691EF4ED99AF9F177
:10350F000491F9148D1F993091F9FD4A2D629F3660
:10351F00F9EF378D1F764CC961C856C8E99AF9661D
:10352F001894F93094F9FD4A2D629F37F9EF1BD9A2
:10353F009AF9F10497F9148D1F993091F9FD4A2DDD
:10354F00629F02F9300B03FD232E4031FF08DD058A
:10355F00A031FFEF177158F000712221409AF90244
:10356F00DF03F1EF048F9AF9819F9AF9C09EFC60F7
:10357F009EFD34D4FE5206C0B9A5A592DFF9C6C48C
:04358F00C2C061FC59
:103594004040666D756C00004040666469760000CA
:1035A40040406661646400004040667375620000D8
:1035B400404066636D70000061636F73000000003B
:1035C4006173696E000000006174616E00000000A8
:1035D4006174616E32000000636F730000000000CC
:1035E40073696E000000000074616E00000000004A
:1035F400636F73680000000073696E680000000068
:1036040074616E68000000006578700000000000BE
:1036140066726578700000006C6465787000000064
:103624006C6F6700000000006C6F673130000000B1
:103634006D6F646600000000706F7700000000008A
:1036440073717274000000006365696C000000000F
:0E365400666C6F6F72000000666D6F640000A0
:0A47F60030383A34353A3339000008
:00000001FF


File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,649 @@
:02000000820577
:02000200FFFFFE
:020008005C0D8D
:04001000D40AD60A2E
:02001C002B0CAB
:02002400770C57
:02002A000A0BBF
:080034005E0D250D200DCA0A26
:04004A00D80A1B0DA8
:0400C0007EFBFF853F
:0A00C400FFFFFFFFFFFFFFFFFFFF3C
:0A00CE00FFFFFFFFFFFFFFFFFFFF32
:1000D800C7FD5D02C736F00071F4C6DE0671301048
:1000E800F9EF10360000868767D1DFFB66D1DFF6AF
:1000F800FD7C01360000674C09DE22318E12490072
:10010800217267318E04F60FC1317B9EFDC41189BF
:100118006142DF03F1EF01E1610687EFD940002179
:10012800FFDF03E1EF01F161065700674C09DE1CB0
:10013800318E124900217267318E04F647148961A5
:1001480042DF03F1EF01E1610687EFDF66D161E885
:10015800FD5E04FD3D05FD6824EDD900C6D761EDBF
:10016800D7717BFACEA016CEA180CEA409F5AAFF3E
:10017800F5A9FFD7F400F401F402CD0306F404F462
:1001880005F406CD0740F40CF40EF408F40FF5302E
:1001980000F53100F53300F53400CF350003CF37D3
:1001A8000019F53C00F53E00F520FFF521FFCE22B1
:1001B800E9E523FFCE240BCE2503F526FFCE271F26
:1001C800CE2C1FE52EFFCE2F07CE28FFF54300F5D6
:1001D8004700CF530006F55700F6BEE0BEE2F5D063
:1001E800FFCBE4FFFFCBE6FFFFCED4FFCEE8FFCE88
:1001F800ECFFCEE9FFCEEDFFCEEAFFCEEEFECEEB72
:10020800FFCEEF49CED8FFCEDCFFCE38B1CE397164
:10021800F537FF7108F20090BFB4017138F100F5AD
:100228004002F54102F54302F5A5FFF5A6FF715816
:10023800F000F530FF7128F0005087BF1801BF1A91
:1002480001BF1C01BF1E017148F000F53002F5BC6A
:10025800FFF5BDFFD7CEABACD7C720FE200CFBF80F
:10026800FFF6BFBA015020BFBA01FD7105717BFAD4
:1002780017040800FD2608629C06FDB107620E06F9
:100288009C06300020BC02CC04005112879C0897C1
:10029800878C08974C1C61C8ED4703FD5D02878C6D
:1002A8000897318EFD7307D2DD0E878C0897318E43
:1002B800FD7707629C06EFE6CC07008C074C04DE4E
:1002C80066F1879C0997AC02148C049EFD11897213
:1002D800878C0997318E07040800146299AC02A133
:1002E800BC02878C099781879C0997878C0997D1CD
:1002F800DFD4304000C1878C0897318E31AD128C25
:1003080007318E318D03BDD831FFBDDADADAADD8C9
:10031800FD780AC0629C06D1DD08FD7E0500E7ED88
:100328005804615907EF94878C0897318EFD7B0735
:10033800D2DFF4878C089781879C0897ED98025143
:1003480004879C0897878C08974C12DE17878C08BF
:1003580097318EFD7707629C06878C089781879C6A
:100368000897EFE1715030025104879C0897878CF9
:1003780008974C1261C8ED1504CC07008C074C0493
:10038800DE6D31825169FD5D0231B2E20631825182
:1003980002EFF6713BE2878C0997318E070408005B
:1003A800148E509971503002878C099781879C0967
:1003B80097878C0997D161E8318451CD304000C1CD
:1003C800878C0897318E31AD128C07318E318D03B1
:1003D800BDD831FFBDDADADAADD8FD780AC0629C43
:1003E80006D1DD06FD7E05E7EF66615907EF8D87CB
:1003F8008C0897318EFD7B07D2DFF431845102EFF0
:100408000C878C089781879C0897ED76037160307C
:1004180002CC0000CC01008C014C09DE218C01319A
:100428008E1249F61F728C01318E04F647148961C9
:1004380042DF03F1EF01E10D9B615901EFD98BD147
:10044800DF08FD3609FD480AEF06FD7E05FD5E045E
:1004580010FE100CC6D7C720FE200AFBF8FF717BE0
:100468009DF6BFBA015080BFBA01717BFAFD7105D4
:1004780017040600FD2608629C04FDB107620E04FD
:100488009C04300048BBCC02005108879C06978723
:100498008C06974C1261C8ED3305FD5D02878C060A
:1004A80097318EFD7707629C04CC05008C054C04BF
:1004B800DE61F1879C0797AB148C029EFD1189724F
:1004C800878C0797318E07040600146299ABA1BB8D
:1004D800878C079781879C0797878C0797D1DFD7E9
:1004E800304000C1878C0697318E31AD128C0531B2
:1004F8008E318D03BDD831FFBDDADADAADD8FD789B
:100508000AC0629C04D1DD06FD7E05E7EF21615932
:1005180005EF99878C0697318EFD7B07D2DFF4872C
:100528008C069781879C0697ED9704FD3509F7108F
:10053800FE100AC6D7717BFAC720FE2004FBF8FF1D
:10054800FD710517040200FD2608629C01FDB10734
:10055800626E019C013058FAFD0009626E019C012F
:10056800FD7E0510FE1004C6D73184BD02EFFA7176
:0A0578007BBD717ABED7717BBED740
:1005820061CF5100718C7109FECBF800FEFC69014C
:1005920000F6BF00F953C0F693935820FEDFF941ED
:1005A20000365E20345AFAEF05118B99A7A517443D
:1005B2007420DFF53602F9305AFAEF04CC0000A7B6
:1005C20047DFF941003674203470FAEF05118B9938
:1005D200A7A517447420DFF53670FA3070FAEF04DD
:1005E200CC0000A747DFF9FCD80000EFFE61DD7107
:1005F2007BFABEF0ADD8BEF200AEF661CDD706DA18
:10060200BDDAADDC06D8BDD861D8A6DAD7C312AD43
:10061200D826DCBDD861317006DA23BDDAC2D7D163
:10062200DD1BC1C3DADA9DDAADD8311E33311E3398
:1006320071F9B4DADFF4BDD813BDDAC2C0D75BDB1F
:100642009DDB605BDA9DDAADDC5BD9085BD808BD67
:10065200D8D7DF1D06DC44807FDF167152DEEF3211
:10066200DF0F06D844807FDF083154DE3C3172DE72
:100672003CC9DE0504FDC706EF46C514ADDEC16503
:100682007BDB5C809DDEADDA71FB3571FB44807FE4
:10069200DEC03544807FDEC86BD96BD86BDD6BDC86
:1006A2000561C8DD1BADDA71FB3174DE077174DBE5
:1006B200F181EF0C45ADD861F846DC61E87177DB7A
:1006C200C0BDDEC4D78EFC708EFDC1C5C3ADDE31A8
:1006D2005E048639320000C3C1D8DEF1C1AEF8FC37
:1006E200F10600C0C0C0C2C4C09EFD609EFCD7140B
:1006F20089728A049EFDAA021411894C40DD0E62A1
:100702004C0430020061C8300100BF00F9D7C5C3F4
:10071200C1ADDADAD831750914F62312F661D8B10F
:1007220025ED2F07C5C3C1ADDADAD8F4DB0361C802
:10073200DD3B23559E31730A9501311C61D8A131ED
:1007420075F6618A4C80618ADC11DF0633718C3365
:10075200DE0983DF0604010061D8857174DB35612F
:10076200FB9DDB6571F99DDA637064BDD8C0C2C4BC
:01077200D7AF
:100773005208EF065203EF025206FEE600FE1B008C
:10078300DC16089F03088F0408089F040862FE24F0
:1007930000089F0408EEBF00EEBA00C1C514410E65
:1007A30011D9D0FF118FD1FF312E45C4C0D7F231FB
:1007B300A2C401E2D79DE261DD4C09DF12717BFA2D
:1007C300C18F06089F7FFAC0CF060800EE270031CD
:1007D300F2FA04CF0608004C00DF05D50008DD1649
:1007E30061DD717BFAD50608DD0ACDE31F61CD61BA
:1007F300CDEE160061CDFED40061FFFE9A00FCF839
:10080300FF0EFEB20061CDFED5004C09DF0EC18F95
:1008130006086F7FFA9F0608C0EE0400CF060800A3
:10082300F8E3D75200EF025202FE3700CF7EFA0000
:10083300CF060800BF0408C716629F0008410011D5
:100843008F5C209B4100118F5D209F0108C65100E2
:10085300FE62FFEF025205CF060800C1510CFE0AEB
:1008630000C0D7C1511DFE0200C0D761DD717BFA04
:1008730070CEC0A59EC47CFF9EC4609EC461CDD7CC
:1008830061DD717BFAC18EC45C1BFED6FFCF060807
:1008930001FED7FFC061CDD731F2FA1AC1AEE4BF72
:1008A30070FAAEE6BF72FAAED4BF74FA30FFFFBE81
:1008B300E4BEE6BED4C0D731F2FA11C1AF70FABEBE
:1008C300E4AF72FABEE6AF74FABED4C0D7C1BF7646
:1008D300FA13BF78FA15BF7AFA17BF7CFAC0D7AFFD
:1008E30076FADB78FAEB7AFAFB7CFAD7534B305281
:1008F3005430324E323030475631323000C5C15158
:10090300045001EE0000FE5AFF9F03085109FEA4A4
:10091300FEC4D2DF0908C3618AF3FE0500C2C4EE38
:1009230035FFC1C7FB040861C999A58392DFF8C6E7
:10093300C0D7FFC150FEFEAB0061DD717BFACF066D
:100943000800FE0A00FE6FFF61CDF8E3EECF00C79B
:10095300FB0408BF70FA8FC0009C05C5C3370406AB
:1009630000BF72FA35369A09300000522BFE66003A
:10097300C2C4C6304809B800300000B8022004AF32
:1009830072FAB800300F00B802AF70FA61FF520A72
:10099300FE05FFECF8FF0E717BFAC1C7FB04088C60
:1009A30005C65C80FE0200C0D761DD717BFA70CFA3
:1009B300C0FFA59FC0007CFF9FC000609FC0006177
:1009C300CDD7618BFEE2FF717BBE410011FB0000BE
:1009D30017CEFC0061CB089EFDF31161C999A58375
:1009E30092DFF7D7FE7CFED57EFADF23C1CF030863
:1009F300035109FEBFFDC0D2DF37FE3800A2040851
:100A0300CF0308075109FEACFDD2B20408DF22C7A9
:100A1300FB0408318302C6D7C6510AFE97FD624C18
:100A23001FDF06CF7EFA01EF04CF7EFA00C0EE2669
:100A3300FEC0EE20FEC7C1FB04088B31196C0161B7
:100A4300589BC0C6D7717BFAFE18FEAF0408040694
:100A530000C11436AC09300000522DF3FE77FF8F2E
:100A6300C000FEF6FD61CF5C807C8073C00419007A
:100A7300CEFC0F61CBC55404EF03C55417FEE3FD51
:100A8300C7360008BB629C0288089C03D1DD334C47
:100A930041DE2F70F1312DB161090033081C0008CC
:100AA30051FF612A410E118FD0FF613B118FD1FF9E
:100AB3006138DC0E8B5C03DF0964C6C4FEF6FCEE12
:070AC30095FDC6C4EE8EFD97
:100ACA00400EF90161FC61FC61FC61FC61FCC1C37F
:100ADA00C5C7520C929269D4FEC1DFF88EFD708EA2
:100AEA00FCC1301324FDA533C09EFC609EFD34D4A6
:100AFA00FE5206C0B9A5A592DFF9C6C4C2C061FC00
:100B0A00C1C3C5C7520C929269D4FEC1DFF88EFDEB
:100B1A00708EFCC13184510DF562FA71483002FDC4
:100B2A00EC2BED130C31A25139F562FA71483002FF
:100B3A0071603002FDEC2BD542F9DF0FD543F9DFA6
:100B4A000AD544F9DF05D545F9DD11710A233102C9
:100B5A000302EFFA710303710B23EF03710A23ED0A
:100B6A00130C319451124062FA03DD064062FA0412
:100B7A00DF06F562FAFDEC2B8F62FAD1DD0891DD12
:100B8A001291DD29EF467140300271503002E56260
:100B9A00FAEF768E509F08F971503002D908F9F1B0
:100BAA00FD792E629F0AF9CF62FA02EF5C31945105
:100BBA001731C45106CF62FA03EF11F562FA714890
:100BCA00300271603002EF41CF62FA044062FA03E8
:100BDA00DF0E8F0AF99E50D908F9F1FD912EEF1513
:100BEA008E509F0AF9D90AF9F1C1D908F9FD372CB3
:100BFA00C071503002A008F94062FA03DF0BD9082D
:100C0A00F9F1FD792E629F0AF9C09EFC609EFD34BF
:100C1A00D4FE5206C0B9A5A592DFF9C6C4C2C06106
:100C2A00FCC1C7F616710BE2714AE5717BBD710A08
:100C3A00E651405F0401D1DD05A7F647DFF3710AEB
:100C4A00E6300400BF2401F6BF2A01300B0BBF288F
:100C5A000100000000510FBF280100000000500FE2
:100C6A00BF2801715320716320C6C061FCC1C53120
:100C7A00542016D51AF9DD0EEB18F9899E44A218EC
:100C8A00F9B01AF9EF2B715320710AE6300400BF4C
:100C9A002401F6BF2A01300B0BBF28010000000017
:100CAA00510FBF280100000000500FBF28017163D7
:100CBA0020C4C061FCEFFE61FCEFFE61FCEFFE6147
:100CCA00FCEFFE61FCEFFE61FCEFFE61FCEFFE61F2
:100CDA00FCEFFE61FCEFFE61FCEFFE61FCEFFE61E2
:100CEA00FCEFFE61FCEFFE61FCEFFE61FCEFFE61D2
:100CFA00FCEFFE61FCEFFE61FCEFFE61FCEFFE61C2
:100D0A00FCEFFE61FCEFFE61FCEFFE61FCEFFE61B1
:100D1A00FCE51CF961FC71422161FCC18F6CF94F41
:100D2A0096FFDF2B8F6DF94F97FFDF238F6EF94FF9
:100D3A0098FFDF1B8F4BF95C04D1DF13712043F955
:100D4A00710303710B23400EF90161F8E50FF9C035
:100D5A0061FC61FCC1C3C5C7520C929269D4FEC141
:100D6A00DFF88EFD708EFCC1717AFA8E312C06DDA9
:100D7A000991DD1D91DD3191EF49D9AEF9F104A553
:100D8A00F9148D1F9930A5F9FDE932629F3AF9EFFE
:100D9A0032D9AEF9F104A8F9148D1F9930A8F9FDDA
:100DAA00E932629F3BF9EF1BD9AEF9F104ABF914B2
:100DBA008D1F9930A5F9FDE932629F02F93012229E
:100DCA00FDA5334031FF08DD05A031FFEF1771584B
:100DDA00F00071322140AEF902DF03F1EF048FAE69
:100DEA00F9819FAEF9C09EFC609EFD34D4FE520686
:100DFA00C0B9A5A592DFF9C6C4C2C061FCC1C3C50A
:100E0A00C7520C929269D4FEC1DFF88EFD708EFC37
:100E1A00C18F72F95C03D1DD16400EF903DD06407D
:100E2A000EF905DF0A31240F0630B737FDA533C0A6
:100E3A009EFC609EFD34D4FE5206C0B9A5A592DF81
:070E4A00F9C6C4C2C061FC3F
:0A0FF60030383A34353A3339000040
:10200000EA0102030405060708090A0B0C0D0E0F6E
:10201000101112131415161718191A1B1C1D1E1F48
:10202000202122232425262728292A2B2C2D2E2F38
:10203000303132333435363738393A3B3C3D3E3F28
:102040004A574000F6DA6E9472362B329223D2272A
:0E2050008F29EB2AC52F653168311035080144
:10205E000B001F0000000000000000000000000048
:06206E000000000000006C
:08207400317503F7332312D785
:0A21000030383A34353A3339000024
:10210A00F7D7C7C1FBF8FF31642002EFFA715220FA
:10211A00340020C5304000C1C1506CFD05261006B0
:10212A0017C1E6A1C1500EC1506CFD492510061712
:10213A00C1E6A1C1500EC1506CFD4925100617C158
:10214A00E6A1C1A1A1C1506CFD4925100617C1E63F
:10215A00A1C1500EC1506CFD05261006CC0100CC61
:10216A00000017C1E6A1C1503EC1506CFD05261002
:10217A0006CF03F99EAF5AFABF04F9AF5CFABF065D
:10218A00F9C0C6D7C72006FBF8FFC7170403001615
:10219A00F74940209BA3A75102614ADFF4C6C7173B
:1021AA00A116F74942209BA3A75102614ADFF4C650
:1021BA0017A1C1E6A1C15006C1506CFD0526100643
:1021CA0017040300C1E6A1C1503EC1506CFD0526AB
:1021DA001006716201300900FD3B3362316A9C05C9
:1021EA00716301FD0C21717201300800FD3B3362FD
:1021FA009F02F9301222FDA533F6C15084FDD02486
:10220A00C0629C051006C6D7C7C1FBF8FF51E0D9CA
:10221A0002F9D651A36128319E9F3DF92F5EFA310A
:10222A008EFD74201344040071FEDE05D55FFADFCB
:10223A00548F3DF97C804C95DC15D93DF9F1241475
:10224A0000BDD8AF04F9FDEF0512F623BBEF13D991
:10225A003DF9F1241400BDD8AF06F9FDEF0512F6D9
:10226A0023BBD903F9F1610900BB17C1E6A1C1502B
:10227A000CC1506CFD05261006D2DF068F3DF99F72
:10228A005EFAA05FFAF7C0C6D7300500FDEC34301D
:10229A000500FDEC34717041F9E7D7303300FDECED
:1022AA0034F6C1E6A1C15084FDC5251004717841F8
:1022BA00F9F7D7300A00FDEC34716041F9E7D771BC
:1022CA006841F9F7D7F7D7FDCF22F7D7FD9322F761
:1022DA00D7FDBD22F7D7FDC922F7D7FDA522F7D72B
:1022EA00C75A00FC8E205CFC9E2071030E715207B7
:1022FA0030A000FDEC34715307300400C1506CFD6E
:10230A00D024C056C866318EF7BDD813BDDAFD1089
:10231A0007C9DCCCCC30F440FD7C06DE03E7EF2BAA
:10232A00669F3CF9710A2071003000711200710237
:10233A000E306400FDEC343102000F5A00FC8E208E
:10234A005CFC9E2071030EE7EF01F7C6D73104004B
:10235A00245A00FC8E205CFC9E2071030E715207E9
:10236A0030FA00FDEC3430FA00FDEC3430FA00FDAE
:10237A00EC347153075A00FC8E205CFC9E207103DA
:10238A000EF7D7FDA522F7D7D560FADD04B060FABB
:10239A00D7CF60FA3331040706713041F9EF04717F
:1023AA003841F931120506714041F9EF047148418B
:1023BA00F9403DF957DC09403DF9B861D8E561FAC1
:1023CA00403DF947DC09403DF9BD61D8F561FA4065
:1023DA0061FA01DF0C403DF947DC06403DF9BDDCFE
:1023EA0011D561FADF11403DF957DC0B403DF9B8D0
:1023FA00DE05712204EF03712304311205058F5A99
:10240A00F9EF01F1318EBE6AD7F7D77140F000714A
:10241A00783002713AE6713BE2713BEA713BEE5A5F
:10242A0006FCCF34024AE552FF711A52710A527100
:10243A004830027130300271203002CF330208CFA7
:10244A0032020A71303102713BE6717030028E2617
:10245A005CFC9E26D7717830027148F000D7FD6186
:10246A002BFD65278F10F9313305F50EF9EF04CFEF
:10247A000EF903FD2B2CFDA62EFD3727FDAD24FDFD
:10248A006B33715221717AFAFD5D02FD6E3331545C
:10249A002108715321FD6E33EFF4FD7834FD660196
:1024AA00EFE6D731020403F1EF01E13410F9718C40
:1024BA008971899931120403F1EF01E13410F9713C
:1024CA008C89719999D7C7C1C1FBF8FF3172200372
:1024DA00FD37273164200300EFF9716220F51BF9FB
:1024EA008C02318EFD8826D2DD0ACF1BF902716378
:1024FA0020F7EF478C0A318EFD9E26FDE8268C02D6
:10250A006C01318EFD9E26300400BF240130174035
:10251A00BF1C01300400BF2201F6BF2A01710BE281
:10252A00CE44FF3182E202EFFA8E449C01FD13276A
:10253A00710BE27163208C01318E121004C6D7C769
:10254A00C1FBF8FF31722003FD37273164200300F5
:10255A00EFF97162208B318EFD8826D2DD06716318
:10256A0020E7EF548C08318EFD9E26FDE8268B6C01
:10257A0001318EFD9E26300400BF2401301740BF72
:10258A001C01300400BF22018C0A91DF04F6BF2A25
:10259A0001710BE2CE44FF3182E202EFFAAC0C1475
:1025AA008E449961790C61690A8C0AD1DFDAFD13CC
:1025BA0027710BE2716320F7C0C6D7C7C1FBF8FFCA
:1025CA0031722003FD37273164200300EFF971626D
:1025DA0020710AE68B318EFD8826D2DD06716320D2
:1025EA00E7EF158C08318EFD9E268C0A318EFD9EF2
:1025FA0026FD1327716320F7C0C6D7C7C1FBF8FFB2
:10260A0031722003FD37273164200300EFF971622C
:10261A0020710AE6710BE28B318EFD8826D2DD0924
:10262A00716320717AFAE7EF52710BE23152203965
:10263A00C73414F9AC0C1652048B99A5A792DFF98A
:10264A00C63184BD02EFFA717ABDCEB144CBB4145F
:10265A00F98C0A318EBEB8CEBB48714BE1714BE59D
:10266A00710ABD8C089E44EF118C089E44710BE6DA
:10267A008C0A9F1AF9AC0CBF18F9F7C0C6D7C7164F
:10268A00FDBF2617F1FD9E26D2DD06FD1327E7EFD3
:10269A0001F7C6D7C716710BE2669E443182E20380
:1026AA0000EFF9F6420401DD09AF0401BF0C01E7AE
:1026BA00EF01F7C6D7AF2801085CFB08BF28010065
:1026CA00000000AF28015CFBBF2801300400BF2ACC
:1026DA0001301780BF1C01300400BF2201D7AF248C
:1026EA0001086C0408BF2401AF28016C0F086C0BA9
:1026FA0008BF280100000000AF2A01085CFB08BFE0
:10270A002A0100000000EDBF26300400BF2401F6B4
:10271A00BF2A01300B0BBF280100000000510FBF78
:10272A00280100000000500FBF2801D7D7710BBD48
:10273A00717BBD7132057120F00000000000F6BF08
:10274A0026015014BF1401CB44000A300F0FBF28D2
:10275A0001716320715320717220D731642002EF16
:10276A00FAFDE8267133057128F000717320D7D776
:10277A00D77100F200301100BFB601300188BF9056
:10278A0001300984BF9E01BF9C01BF9A01BF980115
:10279A00BF9601BF9401BF9201F53CFF30FE00BF16
:1027AA00BE015004BFBC01F6BFB80150EEBFBA016A
:1027BA00A1BFB201C918FE00D730EF00BFB401F6BD
:1027CA00BFBA017108F200D78F5BF9D1DD1191DD33
:1027DA004991DD4291DD2091DD4491DD49EF3B8F46
:1027EA000EF92C03DC47D1DD0A91DD4191DF04FDAE
:1027FA00D528D7FD3828D7F6426CFF61E8E1318F3A
:10280A0012AE6C23BE6CF6426EFF61E8E1318F12A4
:10281A00AE6E23BE6ED7FDD528D7FD3828D7F6BEB3
:10282A006CCB6EFF00D7CB6CFF00F6BE6ED78F3C29
:10283A00F9318EF7BDD813BDDAFD1007C9DC0000E7
:10284A00304C41FD7C06DE17A01DF9401DF97FDEE4
:10285A0007F6BE6CBE6EEF06D95AF9F1BE6ED78F77
:10286A003CF9318EF7BDD813BDDAFD1007C9DC007B
:10287A0000304C42FD7C06DE29F6426CFF61E8B26C
:10288A006CFFD95AF9F1426EFFDD3FD95AF912AEFF
:10289A006E43DE03E1EF0251FF318F12AE6E03BECB
:1028AA006ED7D95AF9F1426CFFDD16D95AF912AE30
:1028BA006C43DE03E1EF0251FF318F12AE6C03BEAF
:1028CA006CF6426EFF61E8B26EFFD7D51EF9DD04E1
:1028DA00B01EF9D7CF1EF903AE6E4222F9DD13AF4F
:1028EA0022F9426EFFDE05B26EFFEF06AE6EA1A1BF
:1028FA00BE6EAE6C4220F9DD13AF20F9426CFFDEEA
:10290A0005B26CFFEF06AE6CA1A1BE6C8F1FF9D1A8
:10291A00DD082C02DD042C02DF338F3CF9318EF7FF
:10292A00BDD813BDDAFD1007C9DC0000304C42FDEA
:10293A007C06DE0CF6BF20F9D95AF9BF22F9EF332B
:10294A00D95AF9F1BF20F9F6BF22F9EF268F3CF9DF
:10295A00318EF7BDD813BDDAFD1007C9DC0000308F
:10296A004C42FD7C06DE07E6A1BF22F9EF05E6A18F
:10297A00BF20F9AE6C4220F9DF0AAE6E4222F9613D
:10298A00F8A01FF9D7C7D524F9DD06B024F9EDE977
:10299A002A8F5CF9D1DD1491DD2391DD359161F83F
:1029AA00ED322A9161F8ED612AEF12F6BE66F51C46
:1029BA00F9F526F9F525F9714302EDE92AD95AF90B
:1029CA00F1BE66F51CF9F526F9F525F9714202ED15
:1029DA00E92AD51CF9DD07F51CF9CF25F902D52519
:1029EA00F9DD358F26F991DD082C02DD042C02DF92
:1029FA0008F6BE66714302EF09D95AF9F1BE66714B
:102A0A004202A026F94026F920DF06F526F9B0256C
:102A1A00F9CF24F916EDE92AD95AF9F1BE667142BD
:102A2A0002CF24F9C8EDE92A7142028F26F991DD15
:102A3A00082C02DD042C02DF08D95AF9F1BE66EF30
:102A4A0003F6BE66A026F94026F91061F8F526F9C4
:102A5A00CF24F932EDE92A714202D525F9DD0CF6C7
:102A6A00BE66F525F9CF24F93CEF748F26F95C038D
:102A7A003119728F26F931AE0444201489D2DD054A
:102A8A00311992DFFB318FF1085CC076D1DF03F197
:102A9A00EF048F26F9819F26F966D1DD0E2C40DDE1
:102AAA00162C40DD1E2C40DD29EF0CF6BE66F525FE
:102ABA00F9CF24F9B4EF28F6BE66E525F9CF24F953
:102ACA003CEF1CD95AF9F1BE66E525F9CF24F93C49
:102ADA00EF0DD95AF9F1BE66E525F9CF24F9B4C646
:102AEA00D7D527F9DD04B027F9D78F5DF9D1DD0FE6
:102AFA0091DD1D91DD1091DD1791DD2F91DD43F6FA
:102B0A00BE64F564FAD7D95AF9F1BE64F564FAD706
:102B1A00D564FADF0BD95AF9F1BE64E564FAEF0617
:102B2A00F6BE64F564FACF27F9FAD7D564FADF0E50
:102B3A00D95AF9F1BE64E564FACF27F9FAD7F55DF7
:102B4A00F9D7D564FADF0BF6BE64E564FACF27F944
:102B5A00FAD7CF5DF902D7C736F00071F4DC1371EA
:102B6A0070F000CE9D08CE9EC0CE9F80CE9C7FE5A1
:102B7A0034F9711BE3712BE3711AE7712BE7717A50
:102B8A009D710A9E31929E02EFFA710B9E7103218A
:102B9A00711321712321C6D7C73102211E71022167
:102BAA00710A9E31929E02EFFA3462F93692FF520E
:102BBA00078B99A5A792DFF9710B9EC6D7C788061E
:102BCA001631122115711221C7342AF93092FF16D3
:102BDA0052078B99A5A792DFF9C6667367182AF977
:102BEA00C6D7C77103213114211E711321710A9EA0
:102BFA0031929E02EFFA3492FF362AF952078B99E4
:102C0A00A5A792DFF9710B9E31242113717B9E8F48
:102C1A006AF99E9A8F6BF99E9B711321717A9EC6EF
:102C2A00D7CF5AF9FFF532F9CF33F905D7C7880656
:102C3A001666320002F02361F8EDE52C912361D883
:102C4A00EDF22C2361D8ED012DD161F8ED0A2D2C7E
:102C5A00032361D8ED622E2C0C2C0461D8ED262DAD
:102C6A002C0461F8ED2F2D9161F8ED412D2361F8C7
:102C7A00ED6A2E912C0461D8EDC72DD161F8EDD003
:102C8A002D9161F8EDD92D9161F8EDE22D9161F860
:102C9A00EDEB2D9161F8EDF42D2C042C0761D8EDA4
:102CAA00FC2DD161F8ED0B2E912361D8ED152E2C58
:102CBA000361D8ED202E2C0361F8ED282E9161F8DE
:102CCA00ED362E2361F8ED442E9161F8ED4C2E2C51
:102CDA00072C0361D8ED5A2EED772E675CBF72661A
:102CEA0073621832F9ED772E30D122FDA53366735F
:102CFA00671832F9ED772E6673671832F9ED772E79
:102D0A006673671832F94037F96ADF0D4038F96897
:102D1A00DF074C6C61F8FD6102ED772E6673671868
:102D2A0032F9ED772E6673671832F9D1DD0630A0D5
:102D3A0031FDA533ED772E6673671832F9D1DD7A46
:102D4A008F53F95C01D1DD05308000EF01F6609FF9
:102D5A0092F98F53F95C02D1DD03E1EF01F172348C
:102D6A0092F989616A998F53F95C04D1DD045102A1
:102D7A00EF01F1723492F989616A998F53F95C080B
:102D8A00D1DD045120EF01F1723492F989616A9917
:102D9A008F53F95C10D1DD045110EF01F1723492B6
:102DAA00F989616A998F53F95C20D1DD045140EFAA
:102DBA0001F1723492F989616A99ED772E66736727
:102DCA001832F9ED772E6673671832F9ED772E66A9
:102DDA0073671832F9ED772E6673671832F9ED7753
:102DEA002E6673671832F9ED772E6673671832F913
:102DFA00EF7B67318EC1662C30318EFDC72BC0EF59
:102E0A006C6673671832F99E99EF626673671832B7
:102E1A00F9712221EF576673671832F9EF4F66731B
:102E2A00671832F9303139FDA533EF4166736718F7
:102E3A0032F930EA38FDA533EF336673671832F991
:102E4A00EF2B6673671832F9300D39FDA533EF1D84
:102E5A006673671832F9EF156673671832F9EF0D62
:102E6A006673671832F92C7261F8CEABAAC6D7C757
:102E7A0016664C30DC074C3761D8FDA22B66730905
:102E8A0032F9318E12C6D7C716664C13DF0CF545D8
:102E9A00F9F544F9F543F9F542F9C6D7CF82F93580
:102EAA00CF88F90FCF89F907CF8DF903E58EF9E5B8
:102EBA0091F9CF92F960D7C7880616662C042C02BE
:102ECA00DC0B912C05DC062C062C08DE06667367E3
:102EDA001882F9662C04DF1667D1DD128F4DF95C72
:102EEA0010D1DF0A714045F9710303710B23C6D76C
:102EFA00C71666730982F9318E12C6D7C7C1C1FBDC
:102F0A00F8FF8C025CF09C018C025C0F9B8C014CDC
:102F1A0081DC05F792EDC12F8C014C50DF05F79249
:102F2A00EDC12F8C014C31DE468C014C11DE1E8C1A
:102F3A00014C10DF0D8B4C03DE3351030D318E1221
:102F4A00EF758B4C03DE268B318E12EF6A8C014CA7
:102F5A0020DF0D8B4C02DE1551060D318E12EF5714
:102F6A008B4C02DE5051080D318E12EF4AEF468C1F
:102F7A00014C61DE208C014C60DF0D8B4C04DE3588
:102F8A00510E0D318E12EF2F8B4C02DE28510A0D95
:102F9A00318E12EF228C014C70DF0D8B4C08DE153E
:102FAA0051120D318E12EF0F8B4C02DE08511A0DA1
:102FBA00318E12EF02F7921004C6D7C7D566FADD32
:102FCA0006B066FAED6331CF66FA02713203312434
:102FDA000C06712041F9EF04712841F931140706F2
:102FEA00711041F9EF04711841F9713303400EF978
:102FFA0003DD09400EF90561E8ED63318F41F97F80
:10300A009EF976D161F8ED51318F41F99F9EF966AB
:10301A005C80D1DD2E8F41F95C80D1DD148F4DF9B2
:10302A005C08D1DF1E713045F9710303710B23EF80
:10303A00128F4DF95C04D1DF0A712045F97103033F
:10304A00710B23665C40D1DD2E8F41F95C40D1DDE6
:10305A00148F4DF95C02D1DF1E711045F97103031B
:10306A00710B23EF128F4DF95C01D1DF0A71004514
:10307A00F9710303710B23665C10D1DD2E8F41F9C0
:10308A005C10D1DD148F4CF95C80D1DF1E71704465
:10309A00F9710303710B23EF128F4CF95C40D1DFF6
:1030AA000A716044F9710303710B23665C08D1DD70
:1030BA002E8F41F95C08D1DD148F4CF95C20D1DFE9
:1030CA001E715044F9710303710B23EF128F4CF9EF
:1030DA005C10D1DF0A714044F9710303710B236656
:1030EA005C04D1DD2E8F41F95C04D1DD148F4CF9DB
:1030FA005C04D1DF1E712044F9710303710B23EFC5
:10310A00128F4CF95C08D1DF0A713044F97103035C
:10311A00710B23665C02D1DD2E8F41F95C02D1DD91
:10312A00148F4CF95C02D1DF1E711044F97103034C
:10313A00710B23EF128F4CF95C01D1DF0A71004445
:10314A00F9710303710B238F72F95C03D1DD0A3124
:10315A00240F0630B737FDA533C6D7C7C6D7C72051
:10316A0004FBF8FF400EF903DD06400EF905DF22E5
:10317A008F42F99C038F43F99C028F44F99C018F7B
:10318A0041F99B17C1300400C1F6C15044FD052620
:10319A0010061004C6D78F52F95C01D1DD05F50E71
:1031AA00F9EF398F52F95C02D1DD0C5A00FC8E20FE
:1031BA005CFC9E2071030E8F52F95C04D161E871A8
:1031CA0013008F52F95C08D161E871030E300500D3
:1031DA00FDEC34710A2071120071020E8F52F95CF3
:1031EA0020D1DD0830DB22FDA533EF0E8F52F95CCA
:1031FA0010D1DD0630E022FDA5338F52F95C80D173
:10320A00DD0830D622FDA533EF0E8F52F95C40D18E
:10321A00DD0630E522FDA533F552F9F7D700EFFDBB
:10322A00D7C7400EF903DD09400EF90561E8EDE75D
:10323A003231342170D568FADD06B068FAEDE7322A
:10324A00CF68FA088FA3F92F3BF9318EFD7420134A
:10325A0044040071FEDC258F3BF99FA3F98F3BF9EB
:10326A00315A4FA4F9DD159FA4F98F4AF95C40D170
:10327A00DF0A716042F9710303710B238F3BF94F27
:10328A00A1F9DD1E8F3BF9311A738F3BF9312A619F
:10329A000B9FA1F9D9A1F9F1C1F6C15050FDC5257D
:1032AA0010047133217150F000CE301BCF17000685
:1032BA00CE3106717A30710BE3710BE78F5EF991AB
:1032CA00DD0591DD0AEF13D95AF9F1BD1AEF0E5156
:1032DA00FF2F3AF9318EBD1AEF03F6BD1AC6D7C7CA
:1032EA00C1C1FBF8FFAC021489728A016142DE1186
:1032FA00899C01AC02148A017299AC02148C019A5D
:10330A0001AC021489728A01614ADC0689318E1283
:10331A00EF1BAC02148A01728A02614ADE078A0133
:10332A00318E12EF08AC02148A02318E121004C6D2
:10333A00D7C716710AE7710BE37150F000717B3041
:10334A00CE3023CF170006669E31717A30710BE7B3
:10335A003182E302EFFA8D1F7158F000318E12C6E6
:10336A00D7ED8D33C73144211771432130482016D8
:10337A0017445C20DD0AABCEFC0061CAA7A7EFF0B8
:10338A00F7C6D7C75600664C0FDE0BF0317E12F631
:10339A0078B0F986EFF0F56AFAC6D7717BFAC7C139
:1033AA00C1FBF8FFD56BFADD0300EFFDE56BFA40D0
:1033BA006AFA0FDC0300EFFDCC01008C014F6AFAB8
:1033CA00DE1D8C01F0317E1279B0F9614902DF0A03
:1033DA0000F56BFA717AFAE7EF60615901EFDCCC1C
:1033EA0001008C014C0FDE188C01F0317E04B0F91B
:1033FA0014A96168DF05AC02B9EF05615901EFE272
:10340A00A06AFACC0000CC01008C014C0EDE168CAE
:10341A0001F0317E04B0F914A9616861E8615900CC
:10342A00615901EFE48B4F6AFADD0300EFFDF56B9A
:10343A00FA717AFAF7EF0300EFFD1004C6D7C71640
:10344A00667767F0317E04B0F914A96168DD1A67FE
:10345A004C0FDE1581F0317E04B0F914A91267F021
:10346A00317E3378B0F987EFD9B06AFAC6D7C72068
:10347A0004FBF8FFCC0200CC03008C034C0FDE39AE
:10348A008C03F0317E04B0F914A96168DD26A9CE57
:10349A00FC0061CAD2DF1DD50EF9DF0BCC01008C0E
:1034AA0001D1DF0300EFF8717BFA8C03318EFD48FE
:1034BA0034717AFA615903EFC1CC03008C034C0FC3
:1034CA00DE168C03F0317E04B0F914A9616861E854
:1034DA00615902615903EFE48C02D1DF97F71004B6
:1034EA00C6D7C7C1C1FBF8FFFD5D028C02D1DD1250
:1034FA0061690230AE01BBF6614900DDEE61890007
:10350A00EFF51004C6D7C7712BE78F0EF9D161F812
:10351A00ED103691DD1B9161F8EDC2359161F8ED40
:10352A00F5359161F8EDFC359161F8ED0536ED6DF3
:10353A00368F0FF991DD30D5CEF9DF05D5D1F9DD1A
:10354A0005F56CFAEF03A06CFA8F6CFA01DE09F547
:10355A000EF9715221ED703640CEF903DE0940D1E1
:10356A00F90361D8ED7036F56CFA716221710222A5
:10357A00711222FD3727FD8E21FD0A21D2DD097144
:10358A005221F50EF900EFFDFDEA22D2DD0C71524F
:10359A0021FD6527E50EF9ED7036FDCF227163072F
:1035AA00D50FF9DF05F55BF9EF04CF5BF903CF0E11
:1035BA00F902715221ED7036FD7B27CF37001DCB02
:1035CA00E43BEFCBE6F6F0CED4EFFD1524FD7A27E7
:1035DA00714A9DCF0EF903308000C15008C1505086
:1035EA00FDC525100400F50FF9EF7B31020001003B
:1035FA00EF74CF0EF905FDC922EF6BCF0EF9023138
:10360A0002006300EF60FDC327FD5F24FD7927F503
:10361A0042F9F543F9F544F9F545F9717301717BFE
:10362A00FA716207FD5723CF350003CF370019CE51
:10363A003708CBE4BFFFCBE6FFF5CED4FFF6BEE0FA
:10364A00BEE2BED0F56CFAE50EF931949E02EFFAAD
:10365A00FD652761FD713AE7712BE7717AFA7152BC
:10366A0021EF0300EFFDC6D7D56FFADD04B06FFA7C
:10367A00D7CF6FFA08400EF903DD06400EF901DFD5
:10368A006331340708716321F5CEF9EF15316421EE
:10369A0005F5CEF9EF0CA0CEF9D5CEF961F8CFCE6B
:1036AA00F9FF31440708711322F5D1F9EF153114E6
:1036BA002205F5D1F9EF0CA0D1F9D5D1F961F8CFEE
:1036CA00D1F9FF31040208710322F5D0F9EF15315F
:1036DA00042205F5D0F9EF0CA0D0F9D5D0F961F89C
:1036EA00CFD0F9FF8F0EF9D1DD092C03DD122C02A0
:1036FA00DD0ED7F5CEF9F5D1F9F5D0F9F56DFAD792
:10370A00D5CEF9DF20406EFA04DC40406EFA32DE94
:10371A003A8F4AF95C04D1DF32712042F97103030E
:10372A00710B23EF2640CEF932DF148F4AF95C0879
:10373A00D1DF18713042F9710303710B23EF0C408A
:10374A00CEF9C8DF06F50EF97152218FCEF99F6EB8
:10375A00FA8F42F95C08D1DD20A06DFA406DFA0DAE
:10376A00DC1ACF5BF903F6426CFFDF10426EFFDF13
:10377A000BF50EF9715221EF03F56DFA40D1F90AF2
:10378A00DF128F4AF95C10D1DF0A714042F97103E6
:10379A0003710B2340D0F90ADF128F4AF95C20D15A
:1037AA00DF0A715042F9710303710B23D7C7400E28
:1037BA00F90361E8EDD9383477F9C5300600C1500C
:1037CA00A8C15030FD492510068F78F9F0F977F92C
:1037DA00F303FD7420131431FF31EE05312FC18F2D
:1037EA007AF9F0F979F9F303FD7420C01413C514BA
:1037FA0031FF31EE05312FC405C18F7CF9F0F97B19
:10380A00F9F303FD7420C01413C51431FF31EE051A
:10381A00312FC40516F1609F77F917709F78F98FD9
:10382A0056FA5C1FF0317E04D2F914A9BDDCF6BD4C
:10383A00DEAF52FABDD8AF54FABDDAADDEFD0F06DF
:10384A00ADDABF54FAADD8BF52FA8F56FA5C1FF000
:10385A00317E121778D2F9BDDCF6BDDEAF52FABD61
:10386A00D8AF54FABDDAADDEFD0006ADDABF54FAC0
:10387A00ADD8BF52FAA056FAAF52FABDD8AF54FA31
:10388A00BDDA5106FD2106C9DCFF00F6FD40068DB2
:10389A00D89F79F9AF52FABDD8AF54FABDDA5106BA
:1038AA00FD21065108FD2106C9DCFF00F6FD400690
:1038BA008DD89F7AF98F72F95C03D1DD128F4BF99B
:1038CA005C10D1DF0A714043F9710303710B238F36
:1038DA0072F95C02D1DD068F72F95C01D1F7C6D7A5
:1038EA00D973F9F1C15030FDD024C0629F76F971C5
:1038FA003043F98F4BF95C08D1DF06710303710B72
:10390A0023F7D7D976F9F1C1D975F9C15030FDC578
:10391A00251004713043F98F4BF95C08D1DF067129
:10392A000303710B23F7D7C72004FBF8FF300F00FE
:10393A00C15030FDD024C0401BF902DF03F7EF3736
:10394A00CC0100CC0202CC03808F72F95C03D1DF78
:10395A0005CC0007EF108F72F95C01D1DD05CC00B0
:10396A002FEF03CC002F17C1300400C150A0C15063
:0B397A0030FD05261006F71004C6D72C
:103986004040666D756C00004040666469760000D4
:1039960040406661646400004040667375620000E2
:1039A600404066636D70000061636F730000000045
:1039B6006173696E000000006174616E00000000B2
:1039C6006174616E32000000636F730000000000D6
:1039D60073696E000000000074616E000000000054
:1039E600636F73680000000073696E680000000072
:1039F60074616E68000000006578700000000000C9
:103A060066726578700000006C646578700000006E
:103A16006C6F6700000000006C6F673130000000BB
:103A26006D6F646600000000706F77000000000094
:103A360073717274000000006365696C0000000019
:0E3A4600666C6F6F72000000666D6F640000AA
:0A47F60030383A34353A3339000008
:00000001FF


File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,261 @@
/* ========================================================
SoC I2C通信
.nintendo
'09 Apr
======================================================== */
#include "incs.h"
#include "accero.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_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;
EI();
// 読み出し終了
if( !ACKD ) // 割り込み要因はNAKデータ送信の最後
{
state = IIC_IDLE;
SPIE = 0;
LREL = 1;
// レジスタリードで、割り込みピンをネゲート
// まだ読まれてない割り込みがあれば、再度アサート
if( irq_readed )
{
IRQ0_neg;
irq_readed = 0;
if( !( ( vreg_ctr[VREG_C_IRQ0] == 0 )
&& ( vreg_ctr[VREG_C_IRQ1] == 0 )
&& ( vreg_ctr[VREG_C_IRQ2] == 0 )
&& ( vreg_ctr[VREG_C_IRQ3] == 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;
tx_buf = vreg_ctr_read( reg_adrs ); // データの準備をしておく
if( reg_adrs != VREG_C_INFO )
{
state = IIC_TX_OR_RX;
}
else
{
state = IIC_IDLE;
}
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 ); // 読んだらクリアなどの処理
}
else
{ // 受信
rx_buf = IICA;
vreg_ctr_write( reg_adrs, rx_buf );
WREL = 1;
}
//
if( ( reg_adrs != VREG_C_ACC_HOSU_HIST )
&& ( reg_adrs != VREG_C_INFO ) )
{ // この二つのレジスタは特殊なアクセス方法をする。アクセスポインタを進めない。
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;
}

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

View File

@ -0,0 +1,734 @@
/* ========================================================
I2C使
de JHL
'09 Feb -
======================================================== */
#pragma sfr
#pragma di
#pragma ei
#pragma nop
#pragma inline // memcpy()をインライン展開する
#include "incs.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_bus_status; // 一文字リードの時はデータを返す。
// ステータスが必要ならこっちを呼んで
void nop8()
{
}
/* ========================================================
1
======================================================== */
u8 iic_mcu_read_a_byte( u8 SLA, u8 adrs )
{
u8 dat;
if( iic_mcu_initialized == 0 )
{
#ifdef _debug_
iic_mcu_start( );
#else
while( 1 )
{
}
#endif
}
while( iic_mcu_busy )
{
NOP( );
}
iic_mcu_busy = 1;
iic_mcu_bus_status = ERR_OK;
// スタートコンディションとスレーブの呼び出し、レジスタアドレスの送信
if( iic_mcu_call_slave( SLA ) != 0 )
{
iic_mcu_bus_status = ERR_NOSLAVE;
iic_mcu_busy = 0;
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 = 0;
return ( dat );
}
/* ========================================================
0
1
2
3
======================================================== */
err iic_mcu_read( u8 slave, u8 adrs, u8 len, u8 * dest )
{
//*
// 使用中なら待つ
if( iic_mcu_initialized == 0 )
{
#ifdef _debug_
iic_mcu_start( );
#else
while( 1 )
{
}
#endif
}
while( iic_mcu_busy )
{
NOP( );
}
/*/
// 使用中なら帰る
if( iic_mcu_initialized == 0 ){
return(0x80);
}
if( iic_mcu_busy != 0 ){
return( 3 );
}
//*/
iic_mcu_busy = 1;
// スタートコンディションとスレーブの呼び出し、レジスタアドレスの送信
if( iic_mcu_call_slave( slave ) != 0 )
{
iic_mcu_busy = 0;
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 = 0;
return ( ERR_SUCCESS );
}
/* ========================================================
 iic_mcu_write 
======================================================== */
err iic_mcu_write_a_byte( u8 SLA, u8 adrs, u8 dat )
{
if( iic_mcu_initialized == 0 )
{
#ifdef _debug_
iic_mcu_start( );
#else
while( 1 )
{
}
#endif
}
while( iic_mcu_busy )
{
NOP( );
}
iic_mcu_busy = 1;
#if 0
temp = dat;
return ( iic_mcu_write( SLA, adrs, 1, &temp ) );
}
#else
// スタートコンディションとスレーブの呼び出し...
IICMK10 = 1;
if( iic_mcu_call_slave( SLA ) != 0 )
{
iic_mcu_busy = 0;
return ( ERR_NAK );
}
iic_mcu_send_a_byte( adrs );
iic_mcu_send_a_byte( dat );
iic_mcu_send_sp( );
iic_mcu_busy = 0;
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_initialized == 0 )
{
#ifdef _debug_
iic_mcu_start( );
#else
while( 1 )
{
}
#endif
}
while( iic_mcu_busy )
{
NOP( );
}
/*/
// 使用中なら帰る
if( iic_mcu_initialized == 0 ){
return(0x80);
}
if( iic_mcu_busy != 0 ){
return( 3 );
}
//*/
iic_mcu_busy = 1;
// スタートコンディションとスレーブの呼び出し...
IICMK10 = 1;
IICIF10 = 0;
if( iic_mcu_call_slave( slave ) != 0 )
{
iic_mcu_busy = 0;
EI( );
return ( ERR_NAK );
}
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;
DBC1 = len;
DMC1 = DRS | 8; // RAM -> SFR, 8bit, IRQ, IIC10
DMAIF1 = 0;
DMAMK1 = 0;
DST1 = 1;
SIO10 = adrs; // 書きっぱなし! 割り込みが発生してDMAスタート
// 残りは割り込みルーチン内で
}
else
{
// DMAを使用しない //
// レジスタアドレスの送信
SIO10 = adrs;
IICMK10 = 0;
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( )
{
u16 i = 0;
EI();
DMAMK1 = 1;
DEN1 = 0;
while( ( SSR02L & TSF0 ) != 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( );
#ifdef _OVERCLOCK_
NOP( );
NOP( );
NOP( );
NOP( );
NOP( );
#endif
*/
SO0 = 0x0400 | TAUS_MASK; // SCL
nop8();
/*
NOP( );
NOP( );
NOP( );
NOP( );
#ifdef _OVERCLOCK_
NOP( );
NOP( );
NOP( );
NOP( );
NOP( );
#endif
*/
SO0 = 0x0404 | TAUS_MASK;
}
IICMK10 = 1;
iic_mcu_busy = 0;
}
/* ========================================================
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
nop8();
/*
NOP( );
NOP( );
NOP( );
NOP( );
#ifdef _OVERCLOCK_
NOP( );
NOP( );
NOP( );
NOP( );
NOP( );
#endif
*/
SO0 = 0x0400 | TAUS_MASK; // SCL
nop8();
/*
NOP( );
NOP( );
NOP( );
NOP( );
#ifdef _OVERCLOCK_
NOP( );
NOP( );
NOP( );
NOP( );
NOP( );
#endif
*/
SO0 = 0x0404 | TAUS_MASK;
}
iic_mcu_wo_dma = 0;
iic_mcu_busy = 0;
}
/* ========================================================
 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();
/*
NOP( );
NOP( );
NOP( );
NOP( );
#ifdef _OVERCLOCK_
NOP( );
NOP( );
NOP( );
NOP( );
NOP( );
#endif
*/
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();
/*
NOP( );
NOP( );
NOP( );
NOP( );
#ifdef _OVERCLOCK_
NOP( );
NOP( );
NOP( );
NOP( );
NOP( );
#endif
*/
SOE0 &= ~0x0004; // ( SCL = H ), SDA -> L
nop8();
/*
NOP( );
NOP( );
NOP( );
NOP( );
#ifdef _OVERCLOCK_
NOP( );
NOP( );
NOP( );
NOP( );
NOP( );
#endif
*/
iic_mcu_send_st( );
}
/* ========================================================
======================================================== */
static void iic_mcu_send_sp( )
{
ST0 = 0x0004;
SOE0 = 0; // 受信の時はもっと前に「も」設定してる。(NACK出力)
SO0 = 0x0000 | TAUS_MASK; // SCL
nop8();
/*
NOP( );
NOP( );
NOP( );
NOP( );
#ifdef _OVERCLOCK_
NOP( );
NOP( );
NOP( );
NOP( );
NOP( );
#endif
*/
SO0 = 0x0400 | TAUS_MASK; // SCL
nop8();
/*
NOP( );
NOP( );
NOP( );
NOP( );
#ifdef _OVERCLOCK_
NOP( );
NOP( );
NOP( );
NOP( );
NOP( );
#endif
*/
SO0 = 0x0404 | TAUS_MASK;
}
/* ========================================================
======================================================== */
void iic_mcu_start( )
{
DST1 = 0;
NOP( ); // 2clkもしくは、DSTn==0をポーリング
NOP( );
DEN1 = 0;
I2C_PU = 1;
SAU0EN = 1;
nop8();
/*
NOP( );
NOP( );
NOP( );
NOP( );
#ifdef _OVERCLOCK_
NOP( );
NOP( );
NOP( );
NOP( );
NOP( );
#endif
*/
SPS0 = 0x0000; // シリアルユニットのクロック0。(8M/2)/1
SMR02 = bSMR0n_FIXEDBIT | bMD0n2; // 簡易I2Cに設定
#ifdef _OVERCLOCK_
SDR02 = 12 << 9; // ボーレート設定 (8M/2)/1/(x+1)/2
#else
SDR02 = 5 << 9; // ボーレート設定 (8M/2)/1/(x+1)/2
#endif
SO0 = 0x0404 | TAUS_MASK; // 最初はHH
iic_mcu_busy = 0;
iic_mcu_wo_dma = 0;
// バスのリセット
IICIF10 = 0;
IICMK10 = 1;
iic_mcu_send_st();
SIO10 = 0xFF;
while( IICIF10 == 0 ){} // 通信中
iic_mcu_send_sp();
SIR02 = SSR02;
iic_mcu_initialized = 1;
}
/* ========================================================
使
======================================================== */
void iic_mcu_stop( )
{
while( iic_mcu_busy )
{;
} // DMA動作中はもう少し待つ
iic_mcu_send_re_st( ); // SCL,SDAをLLにする
I2C_PU = 0;
SAU0EN = 0;
iic_mcu_initialized = 0;
}

View File

@ -0,0 +1,34 @@
#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_bus_status;
// ========================================================
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 );
// ↓その通信が完了したら解除されます。
#define iic_mcu_set_wo_dma() { while( iic_mcu_busy ){;} iic_mcu_wo_dma = 1; }
void iic_mcu_start( );
void iic_mcu_stop( );
#endif

View File

@ -0,0 +1,206 @@
#pragma sfr /* 特殊機能レジスタ使用 */
/*============================================================================*/
#include "incs.h"
#include "i2c_twl_defs.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
#endif
#ifndef _MCU_BSR_
// ke3の時はダミー関数
void IIC_twl_Stop( void )
{
}
void IIC_twl_Init( void )
{
}
#else
/*============================================================================*/
u8 vreg_adrs;
u8 pre_dat;
u16 tot;
// 注 ↓はマクロなので、returnはメインループに戻ります。
#define wait_next { \
tot = 0; \
while( IICAIF != 1 ){ \
if( SPD ){ \
LREL = 1; \
return; \
} \
tot++; \
if( tot == 0 ){ \
LREL = 1; \
return; \
} \
} \
}
__interrupt void int_iic_twl( )
{
u8 temp;
u16 tot;
// WDT_Restart();
// フラグ1回目 スレーブアドレス,R/W
/* COI != 1 なら、割り込みはいらない
if( COI != 1 ){ // 被呼び出し?
LREL = 1; // 呼ばれたのは他のID
return;
}else{
ACKE0 = 1; // 自動でackを返すようにする
WREL = 1; // ウェイト解除して次のバイトを待つ
}
*/
WREL = 1; // ウェイト解除して次のバイトを待つ
wait_next; // 1バイト受信完了を待つ
// 2回目 R/W レジスタアドレス
temp = IICA;
IICAIF = 0;
WREL = 1;
vreg_adrs = adrs_table_twl_ext2int( temp );
// 3回目
// スタートコンディションか、データ受信完了フラグ待ち
while( 1 )
{
u8 my_iics = IICS;
if( my_iics & 0x01 ) // SPD
{ // 強制終了
LREL = 1;
return;
}
else if( my_iics & 0x02 ) // ( STD && !SPD )
{
// 送信 // (スタートコンディション検出)
pre_dat = vreg_twl_read( vreg_adrs ); // mcu内部アドレスを渡す。一バイト目の準備 IICBに書き込むとウェイト解除
// 自局をRで呼ばれるのを待つ
wait_next;
IICAIF = 0;
if( COI != 1 )
{ // 被呼び出し?
LREL = 1; // 呼ばれたのは他のIDあれ
return;
}
IICA = pre_dat; // データを送る。ウェイトも解除される。
wait_next;
// 4回目。(送信データ後の、ACK/NACK後) どうしても発生してしまう。
IICAIF = 0; // おしまい
LREL = 1;
return;
}
else if( IICAIF && (( my_iics & 0x03 ) == 0 )) // !STD && !SPD )
{
// 受信 //
IICAIF = 0;
temp = IICA;
WREL = 1;
// 通常アクセス(ライト) //
LREL = 1; // スタートコンディション待ちへ(連続書き込み未対応のため)
vreg_twl_write( vreg_adrs, temp );
return; // 受信おしまい //
}
}
}
/*****************************************************/
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

View File

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

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

View File

@ -0,0 +1,36 @@
#pragma SFR
#pragma di
#pragma ei
#pragma nop
#pragma stop
#pragma halt
#pragma section @@CODE ROM_CODE
//#pragma section @@CNST ROM_CNST
//=========================================================
#ifndef _incs_h_
#define _incs_h_
#define _mcu_
#include "jhl_defs.h"
#include "user_define.h"
#include "bsr_system.h"
#include "renge.h"
#include "vreg_ctr.h"
#include "vreg_twl.h"
#include "i2c_mcu.h"
#include "rtc.h"
#include "accero.h"
//=========================================================
err firm_update( );
#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.h"
#include "vreg_ctr.h"
#include "vreg_twl.h"
#include "loader.h"
#include "i2c_mcu.h"
#include "WDT.h"
//=========================================================
err firm_update( );
err firm_restore( );

View File

@ -0,0 +1,283 @@
#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
#ifdef _MCU_BSR_
#pragma interrupt INTP23 intp23_ACC_ready // 加速度センサ、データ準備完了
#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
#ifdef _MCU_KE3_
#pragma interrupt INTIICA int_iic_ctr // CTR側
#else
// TSはマザボでテレコ、WMは回路図がテレコで結局一致…
#pragma interrupt INTIICA0 int_iic_twl
#pragma interrupt INTIICA1 int_iic_ctr
#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
/****************************************************/
/* 未使用時のダミー関数定義 */
/****************************************************/
__interrupt void fn_intwdti( )
{
while( 1 )
{
NOP();
}
}
__interrupt void fn_intlvi( )
{
while( 1 )
{
NOP();
}
}
__interrupt void fn_intp0(){
while( 1 )
{
NOP();
}
}
__interrupt void fn_intp1( )
{
while( 1 )
{
NOP();
}
} //
__interrupt void fn_intp2( )
{
while( 1 )
{
NOP();
}
}
__interrupt void fn_intp3( )
{
while( 1 )
{
NOP();
}
}
__interrupt void intp21_RFTx( )
{
while( 1 )
{
NOP();
}
}
//__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( )
{
while( 1 )
{
NOP();
}
}
__interrupt void fn_intcmp1( )
{
while( 1 )
{
NOP();
}
}
__interrupt void fn_intdma0( )
{
while( 1 )
{
NOP();
}
}
//__interrupt void fn_intdma1(){} // i2c_mcu.cにある
__interrupt void fn_intst0( )
{
while( 1 )
{
NOP();
}
}
/* __interrupt void fn_intcsi00(){} */
__interrupt void fn_intsr0( )
{
while( 1 )
{
NOP();
}
}
/* __interrupt void fn_intcsi01(){} */
__interrupt void fn_intsre0( )
{
while( 1 )
{
NOP();
}
}
__interrupt void fn_intst1( )
{
while( 1 )
{
NOP();
}
}
/* __interrupt void fn_intcsi10(){} */
//__interrupt void fn_intiic10(){ while(1){} }
__interrupt void fn_intsr1( )
{
while( 1 )
{
NOP();
}
}
__interrupt void fn_intsre1( )
{
while( 1 )
{
NOP();
}
}
//__interrupt void fn_intiica(){} // i2c.cにある
/* __interrupt void fn_inttm00(){} *//* sub.cにて定義 */
__interrupt void fn_inttm01( )
{
while( 1 )
{
NOP();
}
}
__interrupt void fn_inttm02( )
{
while( 1 )
{
NOP();
}
}
__interrupt void fn_inttm03( )
{
while( 1 )
{
NOP();
}
}
//__interrupt void fn_intad(){ while(1){} } // adc.c
__interrupt void fn_intrtc( )
{
while( 1 )
{
NOP();
}
}
//__interrupt void int_rtcint(){} // rtc.cにある
//__interrupt void fn_intkr(){} // main.c
__interrupt void fn_intmd( )
{
while( 1 )
{
NOP();
}
}
__interrupt void fn_inttm04( )
{
while( 1 )
{
NOP();
}
}
__interrupt void fn_inttm05( )
{
while( 1 )
{
NOP();
}
}
__interrupt void fn_inttm06( )
{
while( 1 )
{
NOP();
}
}
__interrupt void fn_inttm07( )
{
while( 1 )
{
NOP();
}
}

View File

@ -0,0 +1,26 @@
#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 char err;
#include "config.h"
#define set_bit( cond, reg, pos ) \
{ \
if( cond ){ \
reg |= pos; \
}else{ \
reg &= ~pos; \
} \
}
#endif

View File

@ -0,0 +1,618 @@
/* ========================================================
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
// ========================================================
static void led_pow_normal( );
static void led_pow_hotaru( );
// ========================================================
static const char MSG_MAIL[] = { 0b11110110, 0b11011010, 0b01101110, 0b10010100 };
#define MSG_SPD 60
// ↑255/3以下であること
// ========================================================
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以降にクロックが届かない
#ifdef _MCU_BSR_
TOL0 = 0b0000000000000000; // 出力を反転させるかフラグ
#else
TOL0 = 0b0000000000000100; // 出力を反転させるかフラグ
#endif
TO0 = 0; // タイマー動作中で、タイマー出力にしてないときのピンのラッチ。タイマー出力を使わないなら0
TOE0 = 0b0000000011101110; // TOxをタイマーモジュールが制御
TS0 = 0b0000000011101111; // 動作開始
TDR00 = LED_BRIGHT_MAX - 1; // 10bit, 周期
if( system_status.reboot )
{
vreg_ctr[VREG_C_LED_POW] = LED_POW_ILM_AUTO;
LED_duty_pow_H = LED_BRIGHT_MAX;
}
}
void LED_stop( )
{
TT0 = 0b0000000011101111; // 一斉停止(しないとだめ)
TOE0 = 0b0000000000000000; // TOxをタイマーモジュールが制御(GPIOになる)
TAU0EN = 0;
}
/* ========================================================
// 電源LED
LED_POW_B,R 6,7
TDR00 (0x03FFTPS0で250kHzでカウントアップ10bitなら250Hz位になる)
TDR0x Duty 0TDR00( =0x03FF)
enum pwr_state_{
OFF_TRIG = 0,
OFF,
ON_TRIG,
ON,
SLEEP_TRIG,
SLEEP
};
enum LED_ILUM_MODE{
LED_POW_ILM_AUTO,
LED_POW_ILM_ON,
LED_POW_ILM_HOTARU,
LED_POW_ILM_CEOFF
};
======================================================== */
void tsk_led_pow( )
{
switch ( vreg_ctr[VREG_C_LED_POW] )
{
// 自動切り替え
case ( LED_POW_ILM_AUTO ):
switch ( system_status.pwr_state )
{
case SLEEP:
led_pow_hotaru( );
break;
case ON:
led_pow_normal( );
break;
default:
break;
}
break;
// 強制
case ( LED_POW_ILM_OFF ):
LED_duty_pow_H -= ( LED_duty_pow_H == 0x0000 ) ? 0 : 1;
LED_duty_pow_L -= ( LED_duty_pow_L == 0x0000 ) ? 0 : 1;
break;
case ( LED_POW_ILM_HOTARU ):
led_pow_hotaru( );
break;
case ( LED_POW_ILM_ON ):
default:
led_pow_normal( );
break;
case ( LED_POW_ILM_ONLY_RED ):
LED_duty_pow_H = 0x0000;
LED_duty_pow_L = LED_BRIGHT_MAX;
break;
case ( LED_POW_ILM_ONLY_BLUE ):
LED_duty_pow_H = LED_BRIGHT_MAX;
LED_duty_pow_L = 0x0000;
break;
}
}
/* ========================================================
 
======================================================== */
static void led_pow_normal( )
{
static u8 state;
if( vreg_ctr[VREG_C_BT_REMAIN] < 3 )
{
// 赤点滅
state++;
if( state < 127 )
{
LED_duty_pow_H = 0x0000;
LED_duty_pow_L = 0x0000;
}
else
{
LED_duty_pow_L = vreg_ctr[VREG_C_LED_BRIGHT];
}
return;
}
else if( vreg_ctr[VREG_C_BT_REMAIN] < 12 )
{
// 赤点灯
if( LED_duty_pow_H != 0x0000 )
{ // 青フェードアウト
LED_duty_pow_H -= 1;
}
if( LED_duty_pow_L != vreg_ctr[VREG_C_LED_BRIGHT] )
{ // 赤フェードイン
LED_duty_pow_L += ( LED_duty_pow_L < vreg_ctr[VREG_C_LED_BRIGHT] ) ? 1 : -1;
}
return;
}
else
{
// 青点灯
if( LED_duty_pow_H != vreg_ctr[VREG_C_LED_BRIGHT] )
{
LED_duty_pow_H += ( LED_duty_pow_H < vreg_ctr[VREG_C_LED_BRIGHT] ) ? 1 : -1;
}
if( LED_duty_pow_L != 0x0000 )
{
LED_duty_pow_L -= 1;
}
}
return;
}
/* ========================================================
======================================================== */
static void led_pow_hotaru( )
{
static u8 delay;
static u8 state;
static u16 blue_to;
static u16 red_to;
if( delay != 0 )
{
delay -= 1;
return;
}
else
{
delay = 10;
}
if( LED_duty_pow_L != red_to )
{
if( LED_duty_pow_L > red_to )
{
LED_duty_pow_L -= 1;
}
else
{
LED_duty_pow_L += 2;
}
}
if( LED_duty_pow_H != blue_to )
{
if( LED_duty_pow_H > blue_to )
{
LED_duty_pow_H -= 1;
}
else
{
LED_duty_pow_H += 2;
}
}
switch ( state )
{
// フェードイン
case ( 0 ):
case ( 2 ):
case ( 4 ):
if( vreg_ctr[VREG_C_BT_REMAIN] < 12 )
{
// 赤いとき
blue_to = 0;
red_to = vreg_ctr[VREG_C_LED_BRIGHT];
}
else
{
blue_to = vreg_ctr[VREG_C_LED_BRIGHT];
red_to = 0;
}
break;
default:
// フェードアウト
if( vreg_ctr[VREG_C_BT_REMAIN] < 12 )
{
red_to = 2;
}
else
{
blue_to = 2;
}
break;
}
if( ( LED_duty_pow_H == blue_to ) && ( LED_duty_pow_L == red_to ) )
{
state += 1;
}
return;
}
/* ========================================================
* 使 *
LED_Wifi 3
todo
======================================================== */
void tsk_led_wifi( )
{
static u8 task_interval;
static u8 remain_wifi_tx;
static u8 state_wifi_tx;
static u8 flag_wifi_TX;
if( task_interval-- != 0 )
{
return;
}
// 送信パルスのラッチ
if( vreg_ctr[VREG_C_LED_WIFI] == WIFI_LED_TXAUTO )
{
if( WIFI_txLatch )
{
WIFI_txLatch = 0;
flag_wifi_TX = 2;
}
}
else
{
flag_wifi_TX = 0;
}
switch ( vreg_ctr[VREG_C_LED_WIFI] )
{
case ( WIFI_LED_OFF ):
default:
LED_duty_WiFi = 0;
state_wifi_tx = 0;
remain_wifi_tx = 0;
break;
case ( WIFI_LED_ON ):
LED_duty_WiFi = vreg_ctr[VREG_C_LED_BRIGHT];
state_wifi_tx = 0;
remain_wifi_tx = 0;
break;
case ( WIFI_LED_TXAUTO ):
if( flag_wifi_TX != 0 ) // 短いパルスを捕まえるために、割り込みフラグを見る
{
// 送信パターン
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 = 22;
return;
}
else
{
// 送信フラグ待ち
LED_duty_WiFi = vreg_ctr[VREG_C_LED_BRIGHT];
task_interval = 200;
return;
}
break;
}
}
/* ========================================================
* 使 *
LED_Wifi2 P24
======================================================== */
void tsk_led_notify( )
{
static u8 task_interval;
static u8 flg_char_space;
static u8 state_notify_led; // 点灯パターンの進行具合
static u8 flag_wifi_TX;
if( task_interval-- != 0 )
{
return;
}
switch ( vreg_ctr[VREG_C_LED_NOTIFY] )
{
case ( NOTIFY_LED_OFF ):
default:
LED_duty_NOTIFY = 0;
state_notify_led = 0;
flg_char_space = 0;
break;
case ( NOTIFY_LED_ON ):
LED_duty_NOTIFY = vreg_ctr[VREG_C_LED_BRIGHT];
state_notify_led = 0;
flg_char_space = 0;
break;
case ( NOTIFY_LED_PTN0 ):
// ゆっくりバースト
switch ( state_notify_led )
{
case ( 1 ):
case ( 3 ):
case ( 5 ):
LED_duty_NOTIFY = vreg_ctr[VREG_C_LED_BRIGHT];
break;
default:
LED_duty_NOTIFY = 0;
}
state_notify_led++;
if( state_notify_led == 16 )
{
state_notify_led = 0;
}
task_interval = 50;
return;
case ( NOTIFY_LED_PTN1 ):
// データテーブルに従って点滅
{
u8 dat;
task_interval = MSG_SPD; // 共通のため。場合によって上書き
if( flg_char_space != 0 )
{
LED_duty_NOTIFY = 0;
flg_char_space = 0;
return;
}
// データバッファの見る位置の更新
dat = ( MSG_MAIL[state_notify_led / 4] << ( ( state_notify_led % 4 ) * 2 ) ) & 0xC0;
if( dat == 0 )
{
state_notify_led = 0;
}
else
{
state_notify_led += 1;
}
flg_char_space = 1;
if(( dat & 0b10000000 ) != 0 )
{
// 点灯はさせる
LED_duty_NOTIFY = vreg_ctr[VREG_C_LED_BRIGHT];
if(( dat & 0b01000000 ) == 0 )
{
// 短
// nothing to do
}
else
{
// 長
task_interval = ( MSG_SPD * 3 );
}
// 次は単語間休み、とかの判定をさせたかったが
/// 1バイトに2ビットずつデータが並んでおり、次のバイトに
/// またがるようなときが面倒なのでやめる
return;
}
else
{
if(( dat & 0b01000000 ) == 0 )
{
// 一文終了
task_interval = ( MSG_SPD * 3 );
}
else
{
// 単語間
// nothing to do
}
return;
}
}
}
}
/******************************************************//**
LED_Cam TO02
\n BLINK,*_PLUSE 1
\n OFFBLINK OFFが無視されます
*********************************************************/
void tsk_led_cam( )
{
static u8 state_led_cam = 0;
static u8 task_interval;
static u8 state_led_cam_twl;
if( task_interval != 0 )
{
task_interval -= 1;
return;
}
// ブリンクのように待たせたいとき以外は毎週起動する
// (レジスタの変更にすぐに反応する)
switch ( vreg_ctr[VREG_C_LED_CAM] )
{
case ( CAM_LED_OFF ):
default:
LED_duty_CAM = 0;
state_led_cam = 0;
break;
case ( CAM_LED_ON ):
LED_duty_CAM = vreg_ctr[VREG_C_LED_BRIGHT];
state_led_cam = 0;
break;
case ( CAM_LED_BLINK ):
if( state_led_cam == 0 )
{
LED_duty_CAM = vreg_ctr[VREG_C_LED_BRIGHT];
state_led_cam = 1;
}
else
{
LED_duty_CAM = 0;
state_led_cam = 0;
}
task_interval = 250;
break;
case ( CAM_LED_ON_PLUSE ):
if( state_led_cam == 0 )
{
LED_duty_CAM = vreg_ctr[VREG_C_LED_BRIGHT];
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_duty_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 ):
switch ( vreg_twl[ REG_TWL_INT_ADRS_CAM ] ){ // switchのネストとか…
case( TWL_CAMLED_OFF ):
LED_duty_CAM = 0;
state_led_cam = 0;
break;
case( TWL_CAMLED_BLINK ):
if( state_led_cam == 0 )
{
LED_duty_CAM = vreg_ctr[VREG_C_LED_BRIGHT];
state_led_cam = 1;
}
else
{
LED_duty_CAM = 0;
state_led_cam = 0;
}
task_interval = 250;
break;
case( TWL_CAMLED_ON ):
case( TWL_CAMLED_DEF_ON ):
default:
LED_duty_CAM = vreg_ctr[VREG_C_LED_BRIGHT];
state_led_cam = 1;
break;
}
}
return;
}

View File

@ -0,0 +1,90 @@
#ifndef __led__
#define __led__
// ====================================
// LED_DUTY
#define LED_duty_pow_L TDR07
#define LED_duty_pow_H TDR06
#define LED_duty_WiFi TDR03
#define LED_duty_NOTIFY TDR05
#define LED_duty_CAM TDR02
#define LED_duty_TUNE TDR01
// wifi2はPWMできません。
#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_HOTARU,
LED_POW_ILM_OFF,
LED_POW_ILM_ONLY_RED,
LED_POW_ILM_ONLY_BLUE
};
enum LED_MODE_TUNE
{
LED_TUNE_ILM_OFF = 0,
LED_TUNE_ILM_ON,
LED_TUNE_ILM_SVR
};
// VREG_C_WIFI_LED
enum
{
WIFI_LED_OFF = 0,
WIFI_LED_ON,
WIFI_LED_TXAUTO,
WIFI_LED_PTN0,
WIFI_LED_PTN1
};
// VREG_C_WIFI_NOTIFY
enum
{
NOTIFY_LED_OFF = 0,
NOTIFY_LED_ON,
NOTIFY_LED_PTN0,
NOTIFY_LED_PTN1,
NOTIFY_LED_PTN2
};
// VREG_C_CAM_LED
enum
{
CAM_LED_OFF = 0,
CAM_LED_BLINK,
CAM_LED_ON,
CAM_LED_BY_TWL,
CAM_LED_ON_PLUSE,
CAM_LED_OFF_PLUSE
};
// ====================================
void LED_init( );
void LED_stop( );
#endif

View File

@ -0,0 +1,392 @@
/* ========================================================
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"
// ========================================================
#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
// magic.c の記述と違わないように注意!
#define MGC_LOAD 0x0FF6
#define MGC_FOOT 0x4FF6
// ========================================================
void FSL_Open( void );
void FSL_Close( void );
void hdwinit( void );
void power_save( );
static void hdwinit2( );
extern void main_loop( );
// ========================================================
void main( )
{
while( 1 )
{
WDT_Restart( );
if( RTCEN )
{
system_status.reboot = 1;
}
else if( ( RESF & 0x10 ) != 0) // WDRF,WDTでリセット
{
system_status.reboot = 1;
#ifdef _PMIC_TWL_
// 暴走してしまうので再起動させる
PM_reset_ast();
/// hdwinit2ないでリセット解除される。続きに続行してよい頭痛が痛い的
#endif
vreg_ctr[ VREG_C_MCU_STATUS ] |= REG_BIT_STATUS_WDT_RESET;
// set_irq( VREG_C_IRQ0, REG_BIT_IRQ_WDT_RESET );
// ↑I2Cの初期化後に行う
hdwinit2( );
}
else
{
u8 pwup_delay0 = 0;
u8 pwup_delay1 = 0;
do
{ // 電池接続時、16ms待ってみる(チャタリング対策)
pwup_delay0 += 1;
do
{
pwup_delay1 += 1;
}
while( pwup_delay1 != 0 ); // u16にするとコンパイラが怒るんだが…。
}
while( pwup_delay0 != 0 );
hdwinit2( );
}
// ファームの整合性チェック //
{
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;
}
if( comp != 0 )
{
// ファームリストアを試みる
firm_restore( );
// 帰ってこない。リセットをかける。
}
}
// 通常運転
main_loop( );
}
}
/* ========================================================
======================================================== */
__interrupt void int_kr( )
{
}
/* ========================================================
ext dc
======================================================== */
__interrupt void intp4( )
{
}
/* ========================================================
shell close
======================================================== */
__interrupt void intp5( )
{
}
// ========================================================
void hdwinit( void )
{ // スタートアップルーチンが勝手に呼びます
DI( ); /* マスタ割り込み禁止 */
CMC = 0b00010110; /* X1発振せず(入力ポート)、XT1使用、推奨の推奨で超低電力発振 */
CSC = 0b10000000; /* X1発振なし、XT1発振あり、高速内蔵発振動作 */
#ifdef _MCU_BSR_
OSMC = 0x01; /* 隠しレジスタ */
#endif
#ifdef _OVERCLOCK_
CKC = 0b00001000; /* CPU/周辺クロック=fMAIN、fMAIN=fMX、fCLK=fMX */
#else
// CKC デフォルトでよい
#endif
/*--- 低電圧検出回路の設定 ---*/
/* リセット解除時のデフォルトは、オプション・バイトにて指定される */
LVIS = 0b00000000; /* VLVI = 4.22±0.1V */
LVIM = 0b00000000; /* LVI動作禁止 */
/* 電源電圧(VDD)<検出電圧(VLVI)時に割込発生 */
/* 電源電圧(VDD)≧検出電圧<VLVI)、または動作禁止時に低電圧検出 */
}
void hdwinit2( )
{
// ポート設定 /////////////////////////////////////////
if( system_status.reboot ) // リセットピンだけはすぐにセットする
{
#ifdef _MODEL_TEG2_
P0 = 0b00000011;
P3 = 0b00000110; // 簡易I2Cは出力ラッチを1にする
P14 = 0b00000001;
#endif
#ifdef _MODEL_WM0_
P0 = 0b00000011;
P3 = 0b00000110; // 簡易I2Cは出力ラッチを1にする
P14 = 0b00000001;
#endif
#ifdef _MODEL_TS0_
P0 = 0b00000001;
P3 = 0b00000111; // 簡易I2Cは出力ラッチを1にする
P14 = 0b00000000;
#endif
#ifdef _MODEL_CTR_
P0 = 0b00000001;
P3 = 0b00000111; // 簡易I2Cは出力ラッチを1にする
P14 = 0b00000000;
#endif
}
else
{
P0 = 0b00000000;
P3 = 0b00000110; // 簡易I2Cは出力ラッチを1にする
P14 = 0b00000000;
}
#ifdef _MCU_BSR_
PM0 = 0b11111111; // BSRマイコンでは、reset1は監視のみになる。
#else
PM0 = 0b00000000; // 0で出力
#endif
PM3 = 0b11110000; // P31,32は簡易I2C
PM14 = 0b11111100; // debugger[1] とりあえず出力
P1 = 0b00000000;
P2 = 0b00000000;
P4 = 0b00000000;
P5 = 0b00000000;
P6 = 0b00000000;
P7 = 0b01000000;
P12 = 0b00000000;
#ifdef _MCU_BSR_
P20 = 0b00000000;
#else
P8 = 0b00000000;
#endif
P15 = 0b00000000;
PM1 = 0b00000000;
PM2 = 0b11101001;
#ifdef _PMIC_CTR_
PM4 = 0b11110111;
#else
PM4 = 0b11111011;
#endif
PM5 = 0b11110011;
PM6 = 0b11111100; // I2CのラインがL出力になってしまうが、システムがOFFなのでかまわない
PM7 = 0b00011111;
PM12 = 0b11111111; // 32kHzクロックのピン設定はどっちでもよい
PM15 = 0b11111111;
#ifdef _MCU_BSR_
#ifdef _MODEL_CTR_
PM20 = 0b11111101;
#else
PM20 = 0b11111100;
#endif
#else
PM8 = 0b11111111;
#endif
// プルアップ /////////////////////////////////////////
PU0 = 0b00000000; // バッテリ認証後にそれぞれセット
PU1 = 0b00000000;
PU3 = 0b00000000; // 外部でプルアップしないと具合が悪い。CPUがプルアップする
PU4 = 0b00000000; // 外部でプルアップしてほしいtool0,1)
PU5 = 0b00000011;
PU7 = 0b00011001;
PU12 = 0b00000000;
PU14 = 0b00000000;
#ifdef _MCU_BSR_
#ifdef _MODEL_CTR_
#ifdef _SW_HOME_ENABLE_
PU20 = 0b00010001;
#else
PU20 = 0b00000001;
#endif
#else
PU20 = 0b00000000;
#endif
#endif
// ポート入力モード・レジスタ設定 /////////////////////
// [0:通常入力バッファ 1:TTL入力バッファ]
PIM3 = 0b00000000;
PIM7 = 0b00000000;
// ポート出力モード・レジスタ設定
// [0:通常出力モード 1:N-chオープン・ドレーン出力]
POM3 = 0b00000110;
POM7 = 0b00000000;
/*--- 割り込み設定 ---------*/
IF0 = 0x0000; /* 割り込み要求フラグクリア */
IF1 = 0x0000;
#ifdef _MCU_BSR_
IF2 = 0x0000;
#else
IF2L = 0x00;
#endif
MK0 = 0xFFFF; /* 割り込み禁止 */
MK1 = 0xFFFF;
#ifdef _MCU_BSR_
MK2 = 0xFFFF;
#else
MK2L = 0xFF;
#endif
PR00L = 0b11111111; /* 割り込み優先順位、全て低位(LV3) */
PR10L = 0b11111111;
PR00H = 0b11111111;
PR10H = 0b11111111;
PR01L = 0b11111111;
PR11L = 0b11111110;
PR01H = 0b11111111;
PR11H = 0b11111111;
PR02L = 0b11111111;
PR12L = 0b11111111;
/*--- 外部割込の有効エッジ設定 ---*/
#ifdef _MCU_BSR_
EGP0 = 0b00110001;
EGN0 = 0b01110001;
EGP2 = 0b00001010;
EGN2 = 0b00000000;
#else
EGP0 = 0b10110001;
EGN0 = 0b01110001;
#endif
/*--- キー割り込み設定 ---*/
KRM = 0b00000000; /* 全キー割り込み信号を検出しない */
/*--- タイマ・アレイ・ユニットの動作停止 ---*/
TAU0EN = 0; /* タイマ・アレイ・ユニットへのクロック供給停止 */
TT0 = 0x00ff; /* 全タイマ・チャネルの動作停止 */
/*--- RTCの動作停止 ---*/
// RTCEN = 0; /* RTCへのクロック供給停止 */
// RTCC0 = 0b00000000; /* カウンタ動作停止 */
// 別途初期化関数
#ifndef _MCU_BSR_
/*--- コンパレータ/プログラマブル・ゲイン・アップの動作停止 ---*/
OACMPEN = 0; /* クロック供給停止 */
OAM = 0x00; /* プログラマブル・ゲイン・アップの動作停止 */
C0CTL = 0x00; /* コンパレータ0動作停止 */
C1CTL = 0x00; /* コンパレータ1動作停止 */
#endif
/*--- クロック出力/ブザー出力停止 ---*/
CKS0 = 0b00000000;
CKS1 = 0b00000000;
/*--- ADCの動作停止 ---*/
ADCEN = 0; /* ADCへのクロック供給停止 */
ADM = 0b00000000; /* 変換動作停止 */
/*--- シリアル・アレイ・ユニットの動作停止 ---*/
SAU0EN = 0; /* シリアル・アレイ・ユニット0へのクロック供給停止 */
SCR00 = 0x0087; /* 各チャンネルの通信禁止 */
SCR01 = 0x0087;
SCR02 = 0x0087;
SCR03 = 0x0087;
#ifdef _MCU_BSR_
// IICの動作停止
IICA0EN = 0; /* IICA0(CTR)へのクロック供給停止 */
IICCTL00 = 0x00; /* IICA1動作停止 */
IICA1EN = 0; // IICA1(TWL)へのクロック供給停止
IICCTL01 = 0x00; // IICA1動作停止
#else
/*--- IICAの動作停止 ---*/
IICAEN = 0; /* IICAへのクロック供給停止 */
IICCTL0 = 0x00; /* IICA動作停止 */
#endif
/*--- DMAの動作停止 ---*/
DRC0 = 0b00000000; /* DMAチャネル0の動作禁止 */
DRC1 = 0b00000000; /* DMAチャネル1の動作禁止 */
}

View File

@ -0,0 +1,4 @@
#include "jhl_defs.h"
err firm_update( );

View File

@ -0,0 +1,65 @@
/*****************************************************************************
(touchしてね)
****************************************************************************/
#include "config.h"
// V0.5 (ニセ0.1改)
#pragma section @@CNSTL MGC_LOAD AT 0x0FF6
__far static const unsigned char MGC_LOAD[] = __TIME__;
#pragma section @@CNST MGC_MIMI AT 0x2100
static const unsigned char MGC_HEAD[] = __TIME__;
#pragma section @@CNST MGC_TAIL AT 0x4FF6
static const unsigned char MGC_TAIL[] = __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 static const unsigned char MGC_LOAD[] = __TIME__;
#pragma section @@CNST MGC_MIMI AT 0x2100
static const unsigned char MGC_HEAD[] = __TIME__;
#pragma section @@CNST MGC_TAIL AT 0x47F6
static const unsigned char MGC_TAIL[] = __TIME__;
*/

View File

@ -0,0 +1,103 @@
/* ========================================================
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"
// ========================================================
static void read_dipsw( );
// ========================================================
system_status_ system_status;
bit update;
u16 pool[256]; // アップデート時のワークエリア 兼 歩数計データ
/* ========================================================
loader.c
======================================================== */
void main_loop( void )
{
// 電池投入時、ファームアップデート後のみ
RTC_init( ); // 内部でリブートか判定しています
renge_init( );
iic_mcu_start( );
EI( );
PM_init();
if( system_status.reboot )
{
#ifdef _PMIC_TWL_
if( RESET1_n )
#else
if( PM_chk_LDSW() != 0 )
#endif
{
system_status.pwr_state = ON_TRIG;
}
}
else
{
// リブート時は実行されない
system_status.pwr_state = OFF_TRIG;
}
#ifdef _PARRADIUM_
system_status.pwr_state = OFF;
#endif
vreg_ctr_init( );
vreg_twl_init( );
read_dipsw( ); // 特定スイッチで何かするか?
clear_hosu_hist(); // 履歴クリア
renge_task_interval_run_force = 1;
RTCIMK = 0; /* 割り込み(アラーム&インターバル)許可 */
// メインループ //
while( 1 )
{ // システムtick、または割り込みで廻ります。
WDT_Restart( );
renge_task_interval_run( ); // 内部で、システムtickまたは強制起動します
while( renge_task_interval_run_force != 0 )
{
renge_task_interval_run( );
}
WDT_Restart( );
while( renge_task_immed_run( ) != ERR_SUCCESS ); // ここのループが廻る度に実行されます
HALT( );
}
}
/* ========================================================
======================================================== */
static void read_dipsw( )
{
// ソフトディップスイッチ読み込み
// PU4 |= 0x03; // dip sw 0,1
system_status.dipsw0 = ( DIPSW_0 == 0 ) ? 0 : 1;
system_status.dipsw1 = ( DIPSW_1 == 0 ) ? 0 : 1;
// PU4 &= ~0x03;
}

View File

@ -0,0 +1,74 @@
#!/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( '/cygdrive/c/78k_data/yav-mcu-basara/bsr.hex' )
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
### 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,411 @@
/* ********************************************************
********************************************************* */
#pragma MUL
#pragma BCD
#include "incs.h"
#include <math.h>
#include "accero.h"
#include "pedometer.h"
static void hosu_increment();
u16 get_long_hour();
extern u16 pool[];
/*=========================================================
 
========================================================*/
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; // 山-山間の時間。短過ぎたらはじく。
static u8 time_l; // 前回の極小からの経過時間
static u16 peak_l; // 谷の深さ
static u16 peak_h; // 山の高さ
static u16 norm_hist[TAP];
static u8 hist_indx;
static u8 t_rise;
signed long filterd;
u8 i;
signed long temp1,temp2,temp3;
signed long temp4,temp5,temp6;
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_
norm_hist[ hist_indx & TAP-1 ] = sqrt( (long)sx16 * ( sx16 / 2 ) +
(long)sy16 * ( sy16 / 2 ) +
(long)sz16 * ( sz16 / 2 )
);
#endif
#ifdef _pc_
norm_hist[ hist_indx & TAP-1 ] = normh * 256 + norml;
#endif
hist_indx += 1;
// ヒストリにフィルタを掛けて、今回の値を求める
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;
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();
}
}
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;
}
{
/*
static u8 i = 0;
vreg_ctr[VREG_C_FREE_0] = i++;
vreg_ctr[VREG_C_FREE_1] = (u8)( acc_norm[0] / 256 & 0x00FF );
vreg_ctr[VREG_C_FREE_2] = (u8)( acc_norm[0] & 0x00FF );
vreg_ctr[VREG_C_FREE_3] = (u8)( norm_hist[ hist_indx -1 & TAP-1 ] / 256 & 0xFF );
vreg_ctr[VREG_C_FREE_4] = (u8)( norm_hist[ hist_indx -1 & TAP-1 ] & 0xFF );
vreg_ctr[VREG_C_FREE_5] = interval_hh;
vreg_ctr[VREG_C_FREE_6] = time_l;
vreg_ctr[VREG_C_FREE_7] = vreg_ctr[ VREG_C_ACC_HOSU_L ];
vreg_ctr[VREG_C_FREE_8] = (u8)( peak_l / 256 & 0x00FF );
vreg_ctr[VREG_C_FREE_9] = (u8)( peak_l & 0x00FF );
// vreg_ctr[VREG_C_FREE_A] = (u8)( norm_avg[0] / 256 & 0x00FF );
// vreg_ctr[VREG_C_FREE_B] = (u8)( norm_avg[0] & 0x00FF );
*/
}
}
/*=========================================================
 
  
 
========================================================*/
u8 p_record;
u8 last_hour = 0x23; // 履歴の最新は何時?
u8 last_day = 0x30;
u8 last_month = 0x12;
u8 last_year = 0x99;
#define HOSU_NODATA 0xFFFF
#define HOSU_MAX 0xFFFE
static void hosu_increment()
{
static u16 last_hour_fny;
// 累積の更新 //
// いろいろ失敗した...
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; // カンスト orz
vreg_ctr[ VREG_C_ACC_HOSU_M ] = 255;
vreg_ctr[ VREG_C_ACC_HOSU_H ] = 255;
}
}
}
{
// 毎時履歴の更新 /////////////////////////////
// 空白の時間を考慮する。1時間以上放置されたなど。
u16 now_hour;
u8 now_year;
// 時計を止める必要が有るので↓は一気に行って下さい
DI();
RWAIT = 1;
while( !RWST ){;}
now_year = bcdtob( YEAR );
last_hour = HOUR; // 履歴読み出し時に使用。BCDのままでよい
last_day = DAY;
last_month = MONTH;
now_hour = get_long_hour();
// RWAIT = 0; ↑で行っています
// EI(); 〃
// 歩数計が止まっていた時間を考慮して必要なら進める //
if( last_year == now_year )
{
if( now_hour > last_hour_fny )
{
fill_hosu_hist_hours( now_hour - last_hour_fny );
}
}
else if( last_year == ( now_year -1 ) )
{
// 年をまたいでいるとき
u16 temp_hours = ( ( 365 + (( now_year & 0x03 ) == 1 ? 1: 0 )) * 24 ) - last_hour_fny + now_hour;
fill_hosu_hist_hours( temp_hours );
}
else if( last_year < now_year )
{
// 数年放置
fill_hosu_hist_hours( 0 );
}
else
{
// カレンダーが巻き戻るなど
// ノーケアでよい
}
last_year = now_year;
last_hour_fny = now_hour;
// 実際にインクリメント
if( pool[ p_record ] == HOSU_NODATA )
{
pool[ p_record ] = 1;
}
else if( pool[ p_record ] != HOSU_MAX )
{
pool[ p_record ] += 1;
}
}
}
/* ========================================================
0
======================================================== */
void fill_hosu_hist_hours( u16 hours )
{
if( hours > 255 )
{
hours = 0;
}
// 空白の数時間の設定
do
{
p_record += 1;
pool[ p_record ] = 0;
hours -= 1;
}
while( hours != 0 );
}
/* ========================================================
0
======================================================== */
void clear_hosu_hist()
{
u8 hours = 0;
// 空白の数時間の設定
do
{
pool[ hours ] = 0xFFFF;
hours -= 1;
}
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;
}
extern u8 iic_burst_state;
bit record_read_msb_lsb;
/* ========================================================
()
======================================================== */
void hosu_read_end( )
{
record_read_msb_lsb = 0;
}
/* ========================================================
...
======================================================== */
u8 hosu_read( )
{
u8 dat;
u16 temp;
static u8 p_record_buffer;
switch( iic_burst_state ){
case( 0 ):
p_record_buffer = p_record;
iic_burst_state += 1;
return( last_hour );
case( 1 ):
iic_burst_state += 1;
return( last_day );
case( 2 ):
iic_burst_state += 1;
return( last_month );
case( 3 ):
iic_burst_state += 1;
return( btobcd(last_year) );
case( 4 ):
iic_burst_state += 1;
return( 0x55 ); // reserved dummy
case( 5 ):
iic_burst_state += 1;
return( 0xAA ); // reserved. dummy
default:
temp = pool[ p_record_buffer ];
if( record_read_msb_lsb == 0 )
{
dat = (u8)( temp & 0x00FF );
}
else
{
dat = (u8)(( temp >> 8 ) & 0x00FF );
p_record_buffer -= 1;
}
record_read_msb_lsb += 1;
return( dat );
}
}
/* ========================================================
(hour)
u16 long_hour
======================================================== */
static const u16 DAYS_FROM_HNY[] = {
0,
0, 31, 31+28, 59+31, 90+30,
120+31, 151+30, 181+31, 212+31, 243+30,
273+31, 304+30 };
u16 get_long_hour()
{
u16 long_hour;
u8 year_hex;
u8 month_hex;
u8 day_hex;
u8 hour_hex;
year_hex = bcdtob( YEAR );
month_hex = bcdtob( MONTH );
day_hex = bcdtob( DAY );
hour_hex = bcdtob( HOUR );
RWAIT = 0;
EI();
// まず日数の部分
long_hour = DAYS_FROM_HNY[ month_hex ];
if(( ( year_hex & 0x03 ) == 0 ) && ( ( 3 <= month_hex )
|| (( 2 == month_hex ) && ( day_hex == 29 )) ))
{
// 閏年で、閏日より後
long_hour += 1;
}
long_hour += day_hex - 1;
long_hour *= 24; // 日数→時間
long_hour += hour_hex;
return( long_hour );
}

View File

@ -0,0 +1,99 @@
#ifndef _pedo_
#define _pedo_
void hosu_read_end( );
u8 hosu_read( );
void fill_hosu_hist_hours( u16 );
void clear_hosu_hist();
// =========================================================
#define TAP 64
#define FIL_COEFF_QUANT 10
static const s8 lpf_coeff[]={
/*
Window Function Algorithm LPF
Sampling Frequency = 100.0
cutoff1 = 6.0000000
Tap Count =64
Kaiser Constant = 7.000000
Quantized by 11 [bits]
*/
/* 0,// [0]
0,
0,
0,
0,
0,
0,
0,
*/
1,// 8
2,
2,
3,
3,
2,
0,
-2,
-5,// 16
-9,
-13,
-16,
-16,
-13,
-6,
4,
18,// 24
37,
56,
77,
95,
110,
119,
122,
119,// 32
110,
95,
77,
56,
37,
18,
4,
-6,// 40
-13,
-16,
-16,
-13,
-9,
-5,
-2,
0,// 48
2,
3,
3,
2,
2,
1,
/*
0,
0,// 56
0,
0,
0,
0,
0,
0,
0
*/
};
// */
// =========================================================
void pedometer();
static void hosu_increment();
#endif

View File

@ -0,0 +1,930 @@
/* ========================================================
PMIC
nintendo
'08 Dec
======================================================== */
#pragma nop
#include "incs.h"
#include "adc.h"
#include "led.h"
#include "pm.h"
#include "renge.h"
#include "batt_params.h"
#include <fsl.h>
#include "fsl_user.h"
extern u16 pool[];
// ========================================================
// ========================================================
u8 raw_adc_temperature;
u8 rcomp;
float temp_co_up;
float temp_co_dn;
// ========================================================
static void PM_get_batt_left();
/******************************************************//**
PMIC達の初期化
\n
\n ICのセット
\n
\n
\n
\n PM_BT_DET,_P
*********************************************************/
#define swap_endian_16( x ) (unsigned int)( x << 8 | x >> 8 )
void PM_init( )
{
u8 temp;
u8 origParam[4];
union{
u16 _u16; // ↓でわかるように、little endian です。注意。
struct{
u8 lsb;
u8 msb;
}chars;
}dat_16;
system_status.model = MODEL_JIKKI;
wait_ms( 150 );
// -1. なんかおかしい… リセットをかけてみる
dat_16._u16 = swap_endian_16( 0x5400 ); // reset
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_COMMAND, 2, &dat_16 ); // こいつはNACKを返す
// 0. バッテリ残量IC クイックスタート
dat_16._u16 = swap_endian_16( 0x4000 ); // quick start
if( iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_MODE, 2, &dat_16 ) != ERR_SUCCESS )
{
vreg_ctr[ VREG_C_STATUS_1 ] |= REG_BIT_GASGAUGE_ERR;
system_status.model = MODEL_TS_BOARD;
}
else
{
// 1. ロック解除
dat_16._u16 = swap_endian_16( 0x4057 ); // unlock key
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_LOCK, 2, &dat_16 );
// 2. 初期パラメータを一時保存
iic_mcu_read( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_RCOMP, 4, origParam );
// 3. 一時的にOCVを変更
dat_16._u16 = swap_endian_16( 0xD4C0 ); // マジックナンバー的なもの。メーカー指定
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_OCV, 2, &dat_16 );
// 4. 一時的にRCOMPを変更
dat_16._u16 = swap_endian_16( 0xFF00 );
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_RCOMP, 2, &dat_16 );
// 電池メーカーの識別
BT_DET_P = 1;
temp = ( u8 ) ( ( get_adc( ADC_SEL_BATT_DET ) >> 5 ) -1 ); // 識別値0の白箱の分、インデックス合わせ
BT_DET_P = 0;
iic_mcu_set_wo_dma( );
// 5.メーカー別パラメータのロード
switch ( temp )
{
case( BT_VENDER_SHIROBAKO ):
system_status.model = MODEL_SHIROBAKO;
break;
case( BT_VENDER_PANA ):
case( BT_VENDER_MAXELL ):
default:
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_BT_PARAM, 64, &BT_PARAM[0] );
rcomp = BT_PANA_RCOMP;
temp_co_up = BT_PANA_TEMPCOUP;
temp_co_dn = BT_PANA_TEMPCODN;
break;
}
// 6. 150ms以上待つ
wait_ms( 200 );
// 7. OCVに「とある値」を書く
dat_16._u16 = swap_endian_16( 0xD4C0 );
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_OCV, 2, &dat_16 );
// 8. 150600ms待つ。600msは厳守
wait_ms( 200 );
// 9. SOCを読む。ベリファイのため。
temp = iic_mcu_read_a_byte( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_SOC );
if( 0x6D == temp || temp == 0x6E || temp == 0x6F ){
// カスタムモデル書き込みOK
}else{
// 失敗だったらリトライするのか?
}
// 10.元のRCOMPとOCVを書き戻す
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_RCOMP, 4, origParam );
// 11. ロック
dat_16._u16 = swap_endian_16( 0x0000 ); // lock key
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_LOCK, 2, &dat_16 );
// おしまい //
}
// 電池温度測定
BT_TEMP_P = 1; // 電池温度監視スタート
raw_adc_temperature = get_adc( ADC_SEL_BATT_TEMP ); // 温度のtemp。
renge_task_immed_add( PM_bt_temp_update );
// PMIC バージョン読み出し
// temp = iic_mcu_read_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_VER );
// vreg_ctr[ VREG_C_PM_INFO ] = temp;
// デバッグ用は別にまとめた
}
/* ========================================================
raw_adc_temperatureに入っている値を
ICにセット
todo
======================================================== */
task_status_immed PM_bt_temp_update( )
{
static u8 count = 0; // たまにしか書きに行かない
static u8 rawdat_old;
static s16 temperature; // todo
u16 newrcomp;
/*
- 10kΩ分圧点の時
T[] = 81.48 - 111.97 x ratio
TDK T = 81.406 - 111.81 x ratio
*/
if( rawdat_old != raw_adc_temperature ){
DBG_P_n = 1;
temperature = 81.45 - 111.9 * raw_adc_temperature/256.0;
vreg_ctr[VREG_C_BT_TEMP] = (u8)temperature;
DBG_P_n = 0;
}
// 時々書きにゆく
if( count == 0 )
{
DBG_P_n = 1;
if( vreg_ctr[VREG_C_BT_TEMP] > 20 )
{
newrcomp = -( ( temperature - 20 ) * temp_co_up );
}
else
{
newrcomp = -( ( temperature - 20 ) * temp_co_dn );
}
newrcomp += rcomp;
newrcomp = swap_endian_16( (u16)newrcomp );
DBG_P_n = 0;
if( iic_mcu_write
( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_RCOMP, 2, &newrcomp ) == ERR_SUCCESS )
{
rawdat_old = raw_adc_temperature;
}
}
count += 1;
return ( ERR_SUCCESS );
}
#ifdef _PMIC_TWL_
u8 blset;
#endif
#ifndef _PARRADIUM_
/* ========================================================
 
 
======================================================== */
// BSR //
err PM_LCD_on( )
{
u8 rv;
PM_VDDLCD_on( );
wait_ms( DELAY_PM_TSS_50B_AND_TCOM );
PM_TCOM_on( );
wait_ms( DELAY_PM_TCOM_TO_VCS );
PM_VCS_on( );
wait_ms( DELAY_PM_VCS_TO_BL );
#ifdef _PM_BUG_
iic_mcu_write_a_byte( IIC_SLA_PMIC, 0x22, 0x4A ); // バグ持ちPMIC対策
#endif
rv = PM_chk_LDSW( );
if( rv != 0 )
{
// 電源起動エラーなら電源も切れてしまう。ここではケアしない
vreg_ctr[VREG_C_STATUS] |= REG_BIT_LCD_POW;
set_irq( VREG_C_IRQ3, REG_BIT_LCD_ON );
SND_DEPOP_DEACT; // 1でミュート
}
#ifdef _PMIC_TWL_
PM_TEG_LCD_dis( 0 );
blset = ( PM_REG_BIT_BL_U | PM_REG_BIT_BL_L );
#endif
return ( rv );
}
// BSR //
void PM_LCD_off()
{
SND_DEPOP_ACT;
// BLついてたら消す
#ifdef _PMIC_TWL_
if( blset != 0 )
#else
if( ( iic_mcu_read_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_BL ) & 0x03 ) != 0 )
#endif
{
u8 tot;
PM_BL_set( REG_BIT_CMD_BL_U_OFF | REG_BIT_CMD_BL_L_OFF );
vreg_ctr[VREG_C_STATUS] &= 0b10011111;
if( (( REG_BIT_BL_U_OFF | REG_BIT_BL_L_OFF ) & ~vreg_ctr[ VREG_C_IRQ_MASK3 ] ) != 0 )
{
vreg_ctr[ VREG_C_IRQ3 ] |= ( ( REG_BIT_BL_U_OFF | REG_BIT_BL_L_OFF ) & ~vreg_ctr[ VREG_C_IRQ_MASK3 ] );
IRQ0_neg;
tot = 0;
while( !IRQ0 && ( ++tot != 0 ) ){;}
IRQ0_ast;
}
vreg_ctr[VREG_C_COMMAND2] &= ~( REG_BIT_CMD_BL_U_OFF | REG_BIT_CMD_BL_L_OFF );
}
#ifdef _PMIC_TWL_
PM_TEG_LCD_dis( 1 );
blset = 0;
#endif
PM_TCOM_VCS_off( );
wait_ms( DELAY_PM_LCD_OFF );
PM_VDDLCD_off( ); // 残ってたの全部止めます。
vreg_ctr[VREG_C_STATUS] &= ~REG_BIT_LCD_POW;
set_irq( VREG_C_IRQ3, REG_BIT_LCD_OFF );
}
/* ========================================================
 on/off
  on/off/ 
  BL on/on on/onにしろと言われてもon/on割り込みを入れます
======================================================== */
err PM_BL_set( u8 dat )
{
#ifndef _PMIC_TWL_
u8 blset;
#endif
u8 intset = 0;
// RMWを行う
#ifndef _PMIC_TWL_
// Read
blset = iic_mcu_read_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_BL ) ;
#endif
// Modify
// ue
if(( dat & REG_BIT_CMD_BL_U_ON ) != 0 )
{
blset |= PM_REG_BIT_BL_U;
intset |= REG_BIT_BL_U_ON;
}
else if(( dat & REG_BIT_CMD_BL_U_OFF ) != 0 )
{
blset &= ~PM_REG_BIT_BL_U;
intset |= REG_BIT_BL_U_OFF;
}
// shita
if(( dat & REG_BIT_CMD_BL_L_ON ) != 0 )
{
blset |= PM_REG_BIT_BL_L;
intset |= REG_BIT_BL_L_ON;
}
else if(( dat & REG_BIT_CMD_BL_L_OFF ) != 0 )
{
blset &= ~PM_REG_BIT_BL_L;
intset |= REG_BIT_BL_L_OFF;
}
/*
SoCがPWMを出すようレジスタをセットしてから遅延が有るため
// Write
iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_BL, blset );
if( blset != 0x00 ){
wait_ms( 10 );
}
*/
vreg_ctr[VREG_C_STATUS] = (( vreg_ctr[VREG_C_STATUS] & 0b10011111 )
| (( blset << 6 ) | ( blset << 4 )) & 0b01100000 );
// PMICのBLのビットと、MCUのSTATUSレジスタのビット位置が逆なため入れ替え
{
u8 tot;
if( ( intset & ~vreg_ctr[ VREG_C_IRQ_MASK3 ] ) != 0 )
{
vreg_ctr[ VREG_C_IRQ3 ] |= ( intset & ~vreg_ctr[ VREG_C_IRQ_MASK3 ] );
IRQ0_neg;
tot = 0;
while( !IRQ0 && ( ++tot != 0 ) ){;} // 割り込みを入れ直す
IRQ0_ast;
}
}
// Write
if( blset != 0 ) // BLを付ける場合はウェイトを挟まないとPWMが来ておらず
/// シャットダウンすることがある
{
wait_ms( 10 );
}
iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_BL, blset );
return( ERR_SUCCESS ); // ここでは異常チェック不要
}
/* ========================================================
======================================================== */
err PM_LCD_vcom_set( )
{
u8 rv;
rv = iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_POW_DAC1, vreg_ctr[VREG_C_VCOM_T] ); // がっかりなことに、PMICはバースト書き込み不可
rv |= iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_POW_DAC2, vreg_ctr[VREG_C_VCOM_B] );
return ( rv );
}
#else
// パラディウム上のSoCでチェックしたいとき、PMICも液晶もつながってないので
// 異常終了しないようにダミー関数にする
err PM_LCD_on( )
{
vreg_ctr[VREG_C_STATUS] |= REG_BIT_LCD_POW;
set_irq( VREG_C_IRQ3, REG_BIT_LCD_ON );
SND_DEPOP_DEACT; // 1でミュート
return ( ERR_SUCCESS );
}
void PM_LCD_off( )
{
SND_DEPOP_ACT;
vreg_ctr[VREG_C_STATUS] &= ~REG_BIT_LCD_POW;
set_irq( VREG_C_IRQ3, REG_BIT_LCD_OFF );
}
err PM_BL_set( u8 )
{
wait_ms( 10 );
vreg_ctr[VREG_C_STATUS] = ( vreg_ctr[VREG_C_STATUS] & ~( REG_BIT_BL_U | REG_BIT_BL_L )
| ( command_bl_set & REG_BIT_CMD_BL_U_ON )? REG_BIT_BL_U
| ( command_bl_set & REG_BIT_CMD_BL_L_ON )? REG_BIT_BL_L
);
return ( PM_chk_LDSW( ) );
}
err PM_LCD_vcom_set( )
{
return ( ERR_SUCCESS );
}
#endif
/* ========================================================
 I2Cの取り合いの関係でここから呼ぶ
======================================================== */
task_status_immed tski_vcom_set( )
{
PM_LCD_vcom_set( );
return ( ERR_FINISED );
}
/* ========================================================
0
1
POW_CONT1,2 TEG電源のみ
======================================================== */
err PM_sys_pow_on( )
{
#ifdef _PMIC_CTR_
u8 temp;
// 電池温度測定
while( ADCEN != 0 )
{;
}
BT_TEMP_P = 1;
vreg_ctr[VREG_C_BT_TEMP] = get_adc( ADC_SEL_BATT_TEMP );
BT_TEMP_P = 0;
PM_bt_temp_update( ); // 温度のtemp。 残量ICに行きます
// 残量チェック
PM_get_batt_left(); // 先に、PM_init()が実行されている必要があります。(大丈夫)
// todo: batt remain -> volatage?
if( vreg_ctr[VREG_C_BT_REMAIN] < 0 )
{
return ( 1 );
}
// 電源順次立ち上げ
// PM_reset_ast( ); 不要 PM_LDSW_onまかせ
RESET2_ast;
FCRAM_RST_ast;
PM_LDSW_on( );
wait_ms( 1 );
#ifdef _PM_BUG_
iic_mcu_write_a_byte( IIC_SLA_PMIC, 0x22, 0xCA ); // バグ持ちPMIC対策 OVP解除
#endif
wait_ms( DELAY_PM_TW_PWUP );
PM_VDD_on( );
wait_ms( DELAY_PM_TW_PWUP );
PM_VDD50A_on( ); // 液晶電源ではなく、ledとかに使うものです
wait_ms( DELAY_PM_TW_PWUP );
PM_VDD_normMode();
#ifdef _PM_BUG_
iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_POW_SAVE, 0x03 ); // バグ持ちPMIC対策 強制PWM
#endif
if( PM_chk_LDSW( ) == 0 )
{
return ( ERR_ERR );
}
FCRAM_RST_neg;
PM_reset_neg();
RESET2_neg;
/*
wait_ms( 100 );
{
// CODEC 不定レジスタ初期化
u8 codec_reg_init[3] = { 0,0,0 };
iic_mcu_write( IIC_SLA_CODEC, CODEC_REG_PM, 3, codec_reg_init );
}
*/
#else
// TWL PMIC
u8 temp;
// 電源投入
PM_reset_ast();
RESET2_ast;
FCRAM_RST_ast;
PM_TEG_PWSW = 1;
wait_ms( 160 );
PM_TEG_PWSW = 0;
// 残量確認
temp = 99;
if( temp < 5 )
{
return ( ERR_ERR );
}
vreg_ctr[VREG_C_BT_REMAIN] = temp;
FCRAM_RST_neg;
PM_reset_neg();
RESET2_neg;
wait_ms( 100 );
if( !RESET1_n )
{
// 起動失敗
PM_reset_ast();
RESET2_ast;
FCRAM_RST_ast;
return ( ERR_ERR );
}
/*
{ // CODEC 不定レジスタ初期化
u8 codec_reg_init[3] = { 0,0,0 };
iic_mcu_write( IIC_SLA_CODEC, CODEC_REG_PM, 3, codec_reg_init );
}
*/
#endif
return ( ERR_SUCCESS );
}
/* ========================================================
OFFシーケンス
todo:
======================================================== */
err PM_sys_pow_off( )
{
#ifdef _PMIC_CTR_
// PM_BL_set( REG_BIT_CMD_BL_U_OFF | REG_BIT_CMD_BL_L_OFF );
// PM_LCD_off( ); // TCOM,VCS OFF も消してきます。
PM_reset_ast( );
RESET2_ast;
FCRAM_RST_ast;
PM_off( );
PM_LDSW_off( );
#else
if( RESET1_n )
{
PM_reset_ast();
RESET2_ast;
FCRAM_RST_ast;
PM_TEG_PWSW = 1;
wait_ms( 250 );
wait_ms( 250 );
wait_ms( 250 );
PM_TEG_PWSW = 0;
}
PM_reset_ast();
RESET2_ast;
FCRAM_RST_ast;
#endif
return ( ERR_SUCCESS );
}
/* ========================================================
PM_BT_AUTH GPI in
PM_CHARGE_n CCIC /CHG in
PM_CHARGE_ERR_n /FLT in
PM_EXTDC_n /DOK INTP4 in
PM_CHARGE_EN_n /CEN out
LED_Pow R, B, Charge tsk_LED
BT_TEMP,_P tsk_ADC
PM_EXTDCは割り込みメインにするかも
======================================================== */
#define INTERVAL_TSK_BATT 250
void tsk_batt( )
{
static u8 task_interval = 0;
static u8 charge_hys = 0; // ヒステリシスで上限下限を拡張するとき1
static bit pm_extdc_old;
if( task_interval-- != 0 )
{
return;
}
else
{
task_interval = (u8)( INTERVAL_TSK_BATT / SYS_INTERVAL_TICK );
}
// アダプタ? //
if( pm_extdc_old != !PM_EXTDC_n )
{
pm_extdc_old = !PM_EXTDC_n;
if( pm_extdc_old )
{
set_bit( 1, vreg_ctr[VREG_C_STATUS], REG_BIT_POW_SUPPLY );
set_irq( VREG_C_IRQ1, REG_BIT_BT_DC_CONNECT );
}
else
{
set_bit( 0, vreg_ctr[VREG_C_STATUS], REG_BIT_POW_SUPPLY );
set_irq( VREG_C_IRQ1, REG_BIT_BT_DC_DISC );
}
}
// 充電 ///////////////////////////
// 温度付きヒステリシス
if( vreg_ctr[VREG_C_BT_TEMP] < 0x36 )
{
charge_hys = 1;
}
if( ( 1 < vreg_ctr[VREG_C_BT_TEMP] )
&& ( vreg_ctr[VREG_C_BT_TEMP] < 0x2C ) )
{
charge_hys = 0;
}
if( ( ( charge_hys == 1 )
&& ( 1 < vreg_ctr[VREG_C_BT_TEMP] )
&& ( vreg_ctr[VREG_C_BT_TEMP] < 0x2C ) )
||
( ( charge_hys == 0 )
&& ( vreg_ctr[VREG_C_BT_TEMP] < 0x36 ) ) )
{
#ifndef _MODEL_WM0_
BT_CHG_ENABLE(); // 温度範囲OKで充電再開
}
else
{
BT_CHG_DISABLE(); // 温度危険! 充電停止
#endif
}
#ifdef _MODEL_WM0_
// CHG_ENABLEピンは /WL_RST に配線されているので
#endif
// 充電 //
// →割り込み。miscの中でよろしくやってくれている。
set_bit( !BT_CHG_n, vreg_ctr[VREG_C_STATUS], REG_BIT_BATT_CHARGE );
LED_CHARGE = !BT_CHG_n ? 1 : 0;
// 電池残量 //
PM_get_batt_left();
// dubug monitor
return;
}
/*=========================================================
extDC割り込み
OFFから起こす
(pm)
=========================================================*/
__interrupt void intp4_extdc( )
{
;
}
/*=========================================================
(misc)
=========================================================*/
__interrupt void intp5_shell( )
{
;
}
/*=========================================================
PMICへのコマンド書き込み
=========================================================*/
__interrupt void intp6_PM_irq( )
{
if( system_status.pwr_state == ON )
{
EI();
renge_task_immed_add( ntr_pmic_comm );
}
}
extern u8 temp_debug_3;
/* ========================================================
PMICからの割り込みを受けてNTR PMIC互換レジスタからリード
======================================================== */
task_status_immed ntr_pmic_comm( )
{
static u8 reg_shadow;
u8 reg1_old;
u8 irq_work = 0;
reg1_old = reg_shadow;
reg_shadow = iic_mcu_read_a_byte( IIC_SLA_CODEC, CODEC_REG_PM );
if( iic_mcu_bus_status != ERR_SUCCESS )
{
return ( ERR_FINISED );
}
DI( );
// バックライト 上 ////////////////////////////////////
if( ( ( reg1_old ^ reg_shadow ) & REG_BIT_TWL_REQ_BL_U ) != 0 )
{
if( ( reg_shadow & REG_BIT_TWL_REQ_BL_U ) == 0 ) // 消えた
{
// irq_work = REG_BIT_TWL_BL_U_OFF;
set_irq( VREG_C_IRQ2, REG_BIT_TWL_BL_U_OFF );
}
else
{
// irq_work = REG_BIT_TWL_BL_U_ON;
set_irq( VREG_C_IRQ2, REG_BIT_TWL_BL_U_ON );
}
}
// バックライト 下
if( ( ( reg1_old ^ reg_shadow ) & REG_BIT_TWL_REQ_BL_L ) != 0 )
{
if( ( reg_shadow & REG_BIT_TWL_REQ_BL_L ) == 0 ) // 消えた
{
// irq_work = REG_BIT_TWL_BL_L_OFF;
set_irq( VREG_C_IRQ2, REG_BIT_TWL_BL_L_OFF );
}
else
{
// irq_work = REG_BIT_TWL_BL_L_ON;
set_irq( VREG_C_IRQ2, REG_BIT_TWL_BL_L_ON );
}
}
#if 0
irq_work &= ~VREG_C_IRQ_MASK2;
// set_irq 相当品
if( irq_work != 0 )
{
u8 tot;
DI();
vreg_ctr[ VREG_C_IRQ2 ] |= irq_work;
EI();
IRQ0_neg; // 一瞬上げてパルスを送り直す
tot = 0;
while( !IRQ0 && ( ++tot != 0 ) ){;} // O.Dなのでちゃんとあがるのを待つ IRQ_mcu がLに縛られてると困る(基板不良)
IRQ0_ast;
}
#endif
#if 0
// バックライト設定
// 勝手に消しておく
/// 今のところさらに細かくは分けないけど…
if( ( reg_shadow & ( REG_BIT_TWL_REQ_BL_U | REG_BIT_TWL_REQ_BL_U ) ) == 0 )
{
vreg_ctr[ VREG_C_COMMAND2 ] = ( REG_BIT_CMD_BL_U_OFF | REG_BIT_CMD_BL_U_OFF );
renge_task_immed_add( tski_PM_BL_set );
}
#endif
// offリクエスト //////////////////////////////////////
if( ( reg_shadow & REG_BIT_TWL_REQ_OFF_REQ ) != 0 )
{
set_irq( VREG_C_IRQ2, REG_BIT_TWL_OFF_REQ );
}
// リセットリクエスト /////////////////////////////////
if( ( reg_shadow & REG_BIT_TWL_REQ_RST_REQ ) != 0 )
{
// CODECバグ回避
// リセット単品でなかったら無視
// codec 修正済↓
// if( ( reg1_old ^ reg_shadow ) == REG_BIT_TWL_REQ_RST_REQ )
{
set_irq( VREG_C_IRQ2, REG_BIT_TWL_RESET_REQ );
}
}
// バックライトをマスクして書き戻す
EI( );
if( ( reg_shadow & ( REG_BIT_TWL_REQ_OFF_REQ | REG_BIT_TWL_REQ_RST_REQ )) != 0 )
{
reg_shadow &= ~( REG_BIT_TWL_REQ_OFF_REQ | REG_BIT_TWL_REQ_RST_REQ );
iic_mcu_write_a_byte( IIC_SLA_CODEC, CODEC_REG_PM, reg_shadow );
}
return ( ERR_FINISED );
}
/**********************************************************
ICから残量を取得し
 ICが無い99%
         status_1で確認可能
 PM_init()
**********************************************************/
static void PM_get_batt_left(){
if(( vreg_ctr[ VREG_C_STATUS_1 ] & REG_BIT_GASGAUGE_ERR ) == 0 )
{
// 電池残量の取得
{
u8 temp[2];
iic_mcu_read( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_SOC, 2, temp );
vreg_ctr[ VREG_C_BT_REMAIN ] = temp[0];
vreg_ctr[ VREG_C_BT_REMAIN_FINE ] = temp[1];
// todo 閾値を超えたら割り込み
}
vreg_ctr[ VREG_C_BT_VOLTAGE ] = iic_mcu_read_a_byte( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_VCELL );
}
else
{
vreg_ctr[ VREG_C_BT_REMAIN ] = 99;
}
// PMIC-NTRに電池残量を教えてあげる
iic_mcu_write_a_byte( IIC_SLA_CODEC, CODEC_REG_BT,
( vreg_ctr[ VREG_C_BT_REMAIN ] < 5 )? 1 : 0 ); // 1で電池切れ
}
/**********************************************************
command2
  ERR_SUCCESSしか返さないが
**********************************************************/
task_status_immed tski_PM_LCD_on()
{
PM_LCD_on();
return( ERR_SUCCESS );
}
task_status_immed tski_PM_LCD_off()
{
PM_LCD_off();
return( ERR_SUCCESS );
}
task_status_immed tski_PM_BL_set()
{
u8 cmd_BL; // ↓volatileとか付けなくても大丈夫みたい
do
{
cmd_BL = vreg_ctr[VREG_C_COMMAND2];
PM_BL_set( cmd_BL ); // マスク済み
}
while( cmd_BL != vreg_ctr[VREG_C_COMMAND2] );
vreg_ctr[VREG_C_COMMAND2] = 0;
return( ERR_SUCCESS );
}

View File

@ -0,0 +1,175 @@
#ifndef __PM__
#define __PM__
#define IIC_SLA_PMIC 0x84
#define IIC_SLA_BT_GAUGE 0x6C
//=========================================================
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
};
enum BT_VENDER
{
BT_VENDER_SHIROBAKO = 0,
BT_VENDER_PANA = 3,
BT_VENDER_MAXELL = 7
};
//=========================================================
// 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
#define DELAY_PM_TSS_50B_AND_TCOM 17
#define DELAY_PM_5V_TO_TCOM 17
#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;
//=========================================================
err PM_sys_pow_on( );
err PM_sys_pow_off( );
err PM_bt_auth( );
void PM_init( );
err PM_LCD_vcom_set( );
err PM_LCD_on( );
void PM_LCD_off( );
err PM_BL_set( u8 );
task_status_immed PM_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();
//  これを呼ぶ前に、現在温度を教えておく必要があります。
#define PM_reset() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_CONT, 0x00 ) )
//=========================================================
// 元栓 //
#define PM_LDSW_on() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_CONT, PM_REG_BIT_LDSW ))
#define PM_LDSW_off() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_CONT, 0 ))
// システム電源 //
#define PM_VDD_on() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_VDD_SYS, PM_REG_BIT_VDD ))
#define PM_VDD50A_on() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_VDD_SYS, ( PM_REG_BIT_VDD | PM_REG_BIT_VDD50A )))
#define PM_VDD_off() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_VDD_SYS, 0 ))
#define PM_off() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_VDD_SYS, 0 ))
#ifdef _MODEL_CTR_
#define PM_VDD_normMode() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_POW_SAVE, PM_REG_BIT_VDD1P_1R15 | PM_REG_BIT_VDD_PWM ))
#define PM_VDD_ecoMode() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_POW_SAVE, PM_REG_BIT_VDD1P_0R90 | PM_REG_BIT_VDD_AUTO ))
#else
// 本番チップ待ち
#ifdef _PM_BUG_
#define PM_VDD_ecoMode() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_POW_SAVE, PM_REG_BIT_VDD1P_0R90 | PM_REG_BIT_VDD_AUTO ))
#define PM_VDD_normMode() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_POW_SAVE, PM_REG_BIT_VDD1P_1R10 | PM_REG_BIT_VDD_PWM ))
#else
#define PM_VDD_ecoMode() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_POW_SAVE, PM_REG_BIT_VDD1P_1R05 | PM_REG_BIT_VDD_AUTO ))
#define PM_VDD_normMode() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_POW_SAVE, PM_REG_BIT_VDD1P_1R05 | PM_REG_BIT_VDD_PWM ))
#endif
#endif
// ほか //
#ifdef _PMIC_TWL_
#define PM_reset_neg() { PM0.0 = 1; }
#define PM_reset_ast() { P0.0 = 0; PM0.0 = 0; }
#define PM_chk_LDSW() ( 1 )
#else
#define PM_reset_neg() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_CONT, ( PM_REG_BIT_LDSW | PM_REG_BIT_nRST1 )))
#define PM_reset_ast() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_CONT, ( PM_REG_BIT_LDSW )))
#define PM_chk_LDSW() ( iic_mcu_read_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_CONT ) & PM_REG_BIT_LDSW )
// ↑ 0 だと異常
#endif
// 液晶系電源 //
#define PM_VDDLCD_on() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_VDD_LCD, PM_REG_BIT_VDDLCD ))
#define PM_TCOM_on() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_VDD_LCD, ( PM_REG_BIT_VDDLCD | PM_REG_BIT_LCD_TCOM )))
#define PM_VCS_on() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_VDD_LCD, ( PM_REG_BIT_VDDLCD | PM_REG_BIT_LCD_VCS | PM_REG_BIT_LCD_TCOM )))
#define PM_TCOM_VCS_off() PM_VDDLCD_on()
#define PM_VDDLCD_off() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_VDD_LCD, 0 ) )
#define PM_set_BL( dat ) ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_BL, dat ) )
#define PM_set_adc1( dat ) ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_POW_DAC1, dat ) )
#define PM_set_adc2( dat ) ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_POW_DAC2, dat ) )
#endif // __PM__

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
}

View File

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

View File

@ -0,0 +1,359 @@
#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_
//******************************************************************************
bit renge_flg_interval;
bit renge_task_interval_run_force;
bit renge_task_immediate_not_empty;
u8 system_time;
#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;
// インターバル起動
if(( renge_flg_interval == 1 )
|| ( renge_task_interval_run_force != 0 )) // todo 統合
{
renge_task_interval_run_force = 0;
renge_flg_interval = 0;
for( i = 0; i != TSK_LAST; i += 1 )
{
tasks[ i ]();
// 逐次起動タスクがあったら起動しておく
renge_task_immed_run();
}
}
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* new_task ){
u8 i;
// リストの空きの先頭に登録
// 削除したばかりのタスクは、削除マーク(TSK_IMM_DELETED_)となり、空きとは明示的に区別される
// 重複登録を避ける
for( i = 0; i < TASK_IMMED_RUN_LIST_MAX; i += 1 )
{
if( tasks_immed[ i ] != TSK_IMM_EMPTY_ )
{
// 重複登録チェック
if( tasks_immed[ i ] == new_task )
{
// 重複登録はしない
NOP();
return( ERR_ERR );
}
}
else
{
// 空きを見つけた
// もたもたしているうちに割り込み等から割り込まれるのを考慮
// 滅多にないはずだが
for( ; i < TASK_IMMED_RUN_LIST_MAX; i += 1 )
{
if( tasks_immed[ i ] == TSK_IMM_EMPTY_ )
{
tasks_immed[ i ] = new_task;
return( ERR_SUCCESS );
}
}
// 割り込まれてタスク登録できなくなった
return( ERR_ERR );
}
}
// タスク登録しすぎ(無いはず
NOP(); // デバッガで捕まえるため
return( ERR_ERR );
}
/**************************************
**************************************/
err renge_task_immed_run(){
u8 list_id;
u8 last_task_id;
do{
last_task_id = 0xFF;
for( list_id = 0; list_id < TASK_IMMED_RUN_LIST_MAX; list_id += 1 ){
if( tasks_immed[ list_id ] != TSK_IMM_EMPTY_ ){
#ifdef _renge_test_
if( tasks_immed[ list_id ] == TSK_IMM_DELETED_ )
{
NOP();
// タスク管理の不備
// 存在しないタスクを実行しようとした
// タスクの削除後の処理がまずい
// 予期しないタイミングで immed_run が呼ばれた
}
else
#endif
{
if( tasks_immed[ list_id ]() == ERR_SUCCESS )
{
tasks_immed[ list_id ] = TSK_IMM_DELETED_;
}
last_task_id = list_id;
}
}
#ifdef _renge_test_
else
{
list_id += 1;
for( ; list_id < TASK_IMMED_RUN_LIST_MAX; list_id++ )
{
if( tasks_immed[ list_id ] != TSK_IMM_EMPTY_ )
{
NOP(); // ?
}
}
break;
}
#endif
}
// タスク削除
{
if( last_task_id != 0xFF )
{
u8 i,j;
#ifdef _renge_test_
if ( tasks_immed[ 1 ] != 0 ){
NOP();
}
#endif
// リスト前詰め
i = 0; // 前詰め後リストの最後尾
j = 1; // リストの後ろの方のタスクを探す
for( ; j < TASK_IMMED_RUN_LIST_MAX; j++ )
{
DI();
if( tasks_immed[ i ] == TSK_IMM_DELETED_ )
{
if( tasks_immed[ j ] == TSK_IMM_EMPTY_ )
{
// リストの最後だった
for( ; i < j ; i += 1 )
{
tasks_immed[ i ] = TSK_IMM_EMPTY_;
}
#ifdef _renge_test_
/// ほんと?
j += 1;
for( ; j < TASK_IMMED_RUN_LIST_MAX; j++ )
{
if( tasks_immed[ j ] != TSK_IMM_EMPTY_ )
{
NOP(); // ?
}
}
#endif
EI();
break;
}
if( tasks_immed[ j ] != TSK_IMM_DELETED_ )
{
// 探索隊が前詰めすべきタスクを見つけた
tasks_immed[ i ] = tasks_immed[ j ];
tasks_immed[ j ] = TSK_IMM_DELETED_;
i += 1;
}
}
else
{
#ifdef _renge_test_
// タスクが滞留
if( tasks_immed[ i ] == TSK_IMM_EMPTY_ )
{
NOP();
// そんなはずない
}
#endif
i += 1;
}
EI();
if( tasks_immed[ i ] == TSK_IMM_EMPTY_ )
{
#ifdef _renge_test_
NOP();
#endif
break;
// リストの最後だった
}
}
DI();
// ここまでで完全に前詰めされている
for( j = 0; j < TASK_IMMED_RUN_LIST_MAX; j++ )
{
if( tasks_immed[ j ] == TSK_IMM_EMPTY_ )
{
#ifdef _renge_test_
NOP();
j += 1;
for( ; j < TASK_IMMED_RUN_LIST_MAX; j++ )
{
if( tasks_immed[ j ] != TSK_IMM_EMPTY_ )
{
NOP(); // ?
}
}
#endif
break;
// リストの最後
}
if( tasks_immed[ j ] == TSK_IMM_DELETED_ )
{
tasks_immed[ j ] = TSK_IMM_EMPTY_;
}
}
EI();
}
}
}
#if 0
while( last_task_id != 0xFF ); // タスクが残っていたら延々再実行
#else
while( 0 );
#endif
if( last_task_id != 0xFF )
{
// まだタスクが残ってる(また呼んでね)
return( ERR_ERR );
}
return( ERR_SUCCESS );
}
/******************************************************************************
ms
NOPを回すだけCPUを **
*****************************************************************************/
void wait_ms( u8 ms ){
u16 fine;
WDT_Restart();
// まだ適当です!
while( ms != 0 ){
ms--;
#ifdef _OVERCLOCK_
fine = 860;
#else
fine = 430;
#endif
while( fine != 0 ){
fine -= 1;
}
}
}

View File

@ -0,0 +1,32 @@
#ifndef __renge__
#define __renge__
//******************************************************************************
//******************************************************************************
#include "renge_defs.h"
#include "renge_task_immediate.h"
// #include "renge_task_interval_run.h" // ŠO©ç­<E280B9>§N“®ÖŽ~<7E>I
//******************************************************************************
void renge_init();
void renge_task_immed_init();
err renge_task_immed_run();
err renge_task_immed_add( task_immed );
// static err renge_task_immed_del( u8 );
void wait_ms( u8 );
//******************************************************************************
err renge_task_interval_run();
extern bit renge_task_interval_run_force;
extern bit renge_flg_interval;
extern u8 system_time;
#endif

View File

@ -0,0 +1,56 @@
#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;
typedef unsigned char err;
// ************************************
#define SYS_INTERVAL_TICK 1.953
// ************************************
typedef enum{
ERR_SUCCESS = 0,
ERR_ERR
}ERR;
typedef enum{
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,60 @@
#!/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 << "static const task_status ( *tasks[ TSK_LAST ] )() = {\n"
tasklist.each{|dat|
conf << " tsk_" << dat << ",\n"
}
conf << " };\n"
conf << "\n\n#endif\n"

View File

@ -0,0 +1,26 @@
#ifndef __tasks__
#define __tasks__
#include "renge_defs.h"
// *************************************
#define TASK_IMMED_RUN_LIST_MAX 8
extern task_status_immed do_command0( );
extern task_status_immed ntr_pmic_comm();
extern task_status_immed acc_read();
extern task_status_immed acc_write();
extern task_status_immed tski_mcu_info_read();
//extern task_status_immed acc_hosu_set();
extern task_status_immed tski_mcu_reset();
// *************************************
#define TSK_IMM_EMPTY_ ( void * )( 0x0000 )
#define TSK_IMM_DELETED_ ( void * )( 0x0001 )
#endif

View File

@ -0,0 +1,39 @@
/*スクリプトによる自動生成です。手動で書き換えない方がよいです*/
#ifndef __renge_task__
#define __renge_task__
#include "renge_defs.h"
enum {
TSK_SW, TSK_ADC, TSK_BATT, TSK_LED_POW, TSK_LED_WIFI, TSK_LED_NOTIFY, TSK_LED_CAM, TSK_MISC_STAT, TSK_DEBUG, TSK_DEBUG2, TSK_SYS, TSK_LAST
};
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_stat();
extern void tsk_debug();
extern void tsk_debug2();
extern void tsk_sys();
static const task_status ( *tasks[ TSK_LAST ] )() = {
tsk_sw,
tsk_adc,
tsk_batt,
tsk_led_pow,
tsk_led_wifi,
tsk_led_notify,
tsk_led_cam,
tsk_misc_stat,
tsk_debug,
tsk_debug2,
tsk_sys,
};
#endif

View File

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

View File

@ -0,0 +1,180 @@
/* ========================================================
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出力なし */
SEC = 0x00;
MIN = 0x00;
HOUR = 0x15;
DAY = 0x01;
WEEK = 0x00;
MONTH = 0x11;
YEAR = 0x09;
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 = 0;
rtc_dirty = 0;
rtc_alarm_dirty = 0;
}
/* ========================================================
RTC
2^6/fXT1.953125 ms
======================================================== */
__interrupt void int_rtc( )
{
// 日付も指定日で
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 ) )
{
if( ( vreg_ctr[VREG_C_IRQ_MASK1] & REG_BIT_RTC_ALARM ) == 0 )
{
vreg_ctr[VREG_C_IRQ1] |= REG_BIT_RTC_ALARM;
IRQ0_ast;
// マスクをしてあったら、電源を入れません
if(( system_status.pwr_state == BT_CHARGE ) ||
( system_status.pwr_state == OFF ))
{
system_status.poweron_reason = RTC_ALARM;
}
}
}
}
/* ========================================================
RTC
sec,min,hour,week,day,month,year
======================================================== */
void rtc_buf_reflesh( )
{
if( rtc_lock == 0 )
{
rtc_lock = 1;
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 == 0 )
{
rtc_dirty = 1;
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( )
{
// リードロック
// if( rtc_lock != 0 ){
rtc_lock = 0;
// }
// ライトロック
if( rtc_dirty != 0 )
{
rtc_dirty = 0;
RWAIT = 1;
while( !RWST )
{;
}
memcpy( &SEC, rtc_work, 7 );
RWAIT = 0;
}
// アラームセット
if( rtc_alarm_dirty )
{
WALE = 0;
ALARMWM = vreg_ctr[VREG_C_RTC_ALARM_MIN];
ALARMWH = vreg_ctr[VREG_C_RTC_ALARM_HOUR];
rtc_dirty = 0;
WALE = 1;
}
}
/* ========================================================
RTC
2^6/fXT1.953125 ms
======================================================== */
__interrupt void int_rtc_int( )
{
renge_flg_interval = 1;
}

View File

@ -0,0 +1,21 @@
#ifndef __rtc_h__
#define __rtc_h__
void RTC_init( void );
void rtc_buf_reflesh( );
void set_rtc( );
//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

View File

@ -0,0 +1,402 @@
/* ========================================================
======================================================== */
#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"
// ========================================================
const u8 fsl_fx_MHz_u08 = 8;
const u8 fsl_low_voltage_u08 = 1;
// 自己フラッシュパラメータ
#define SAM_BLOCK_SIZE 1024
#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 UPDATE_BLOCK_LAST ( FIRM_TOP + FIRM_SIZE - 1 )
#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 );
err firm_restore( );
static err my_FSL_Init();
static err firm_duplicate( __far u8 * p_rom, u8 block_dest );
// ========================================================
extern u16 pool[];
// 0.D以降 新アップデータ向け
#define N_MGC_L 0x1FF6
#define N_MGC_T 0x4FF6
/* ========================================================
I2Cで受信して
OK  
    NG  
======================================================== */
err firm_update( )
{
u8 target_block;
u8 split_write_count; // ブロックへちまちま書き込むカウンタ
// 書き替え前準備 /////////////////////////////////////
my_FSL_Init();
/* ファームのバックアップ
0x2000 - 0x4FFF
0x5000 - 0x7FFF ( 20 - 31)
*/
firm_duplicate( ( __far u8 * ) 0x2000,
( 0x5000 / 0x0400 ) );
// 全ブロック削除 /////////////////////////////////////
// 電源断を判定するため、最初に全クラスタ消去する
//(新ファームが書かれるところに残ってる、以前のファームのフッタを消したい)
for( target_block = INACTIVE_BOOTSECT_TOP;
target_block <= UPDATE_BLOCK_LAST;
target_block += 1 )
{
FSL_Erase( target_block );
}
// 書き替え ///////////////////////////////////////////
// ●ストップコンディションが来るまで続ける
// ●終わったら、スタートアップルーチンに飛ぶ
for( target_block = INACTIVE_BOOTSECT_TOP;
target_block <= UPDATE_BLOCK_LAST;
target_block += 1 )
{
// 新ファーム領域削除
FSL_Erase( target_block );
// 分割書き込み
for( split_write_count = 0;
( ( split_write_count < SELF_UPDATE_SPLIT_WRITE_NUM )
&& ( !SPD ) );
split_write_count += 1 )
{
u8* p_buffer = pool;
u8 buffer_fill = 0;
WDT_Restart( );
// I2Cから書き込みデータをバッファにためる
do
{
while( !IICAIF && !SPD ){;}
IICAIF = 0;
*p_buffer = IICA;
WREL = 1;
p_buffer += 1;
buffer_fill += 1;
}
while( ( buffer_fill != ( u8 ) SELF_UPDATE_BUFF_SIZE ) && !SPD );
// 書き込み
// 最後だと、ゴミをパディングするが別にかまわない
if( FSL_Write( ( fsl_u32 ) ( target_block * SAM_BLOCK_SIZE
+
split_write_count *
SELF_UPDATE_BUFF_SIZE ),
( fsl_u08 ) ( SELF_UPDATE_BUFF_SIZE / SAM_WORD_SIZE ) )
!= FSL_OK )
{
// 書き込み後のチェックエラー
// リブートののち、リストア
// FSL_ForceReset(); // リセット
FSL_SwapBootCluster( );
// FSL_Close( );
return ( ERR_ERR );
}
}
// 1ブロック書き込み完了。内部ベリファイを行う
if( FSL_IVerify( target_block ) != FSL_OK ){
// todo 再度消去→書き込み ベリファイを繰り返すだけじゃダメでした...
NOP();
}
if( SPD )
{
break;
}
}
LREL = 1;
// 書き込んだファームのチェック //
{
u8 i;
u8 comp = 0;
// ローダーのマジックと、本文の末尾のマジックは同じか確認
for( i = 0; i < sizeof( __TIME__ ); i++ )
{
comp += ( *( u8 * ) ( N_MGC_L + i ) == *( u8 * ) ( N_MGC_T + i ) ) ? 0 : 1;
}
if( comp == 0 )
{
FSL_InvertBootFlag( );
FSL_SwapBootCluster( ); // リセットせずに頭から。FSL_Closeは不要
// FSL_ForceReset(); // リセット
// FSL_SwapActiveBootCluster(); // ←スワップされてしまうので、続けられず暴走!
// 戻ってこない //
}
else
{
// データエラー
// リブートののち、リストア
// FSL_ForceReset(); // リセット
FSL_SwapBootCluster( );
// FSL_Close( );
// 戻ってこない //
}
}
}
/* ========================================================
 
 
 
======================================================== */
err firm_restore( )
{
my_FSL_Init();
/* ファームのリストア
0x4800 - 0x7FFF ( 18 - 27)
0x2000 - 0x47FF ( 8 - 17)
*/
firm_duplicate( ( __far u8 * ) 0x5000,
FIRM_TOP );
// todo
//  リストア失敗したら、LEDちかちかとかさせて、サービス送りにしてもらう
// リブート
// スワップは不要です!
FSL_SwapBootCluster();
// FSL_ForceReset( );
return ( ERR_SUCCESS );
}
// ========================================================
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
// 何か前準備?
// todo DMAを止める
while( DST1 ){;}
DEN1 = 0;
MK0 = 0xFFFF;
MK1 = 0xFFFF;
MK2 = 0xFFFF;
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 )
{
u8 target_block;
u8 split_write_count; // ブロックへちまちま書き込むカウンタ
// 書き込み先ブロックの数だけ繰り返す
for( target_block = block_dest;
target_block < block_dest + FIRM_SIZE;
target_block += 1 )
{
WDT_Restart( );
// ブロック消去
while( FSL_BlankCheck( target_block ) != FSL_OK )
{
FSL_Erase( target_block );
}
// 分割書き込み分繰り返す
for( split_write_count = 0;
split_write_count < SELF_UPDATE_SPLIT_WRITE_NUM;
split_write_count += 1 )
{
u8 buffer_fill;
u8* p_buff;
// 書き込みデータをバッファにためる
buffer_fill = 0;
p_buff = pool;
do
{
*p_buff = *p_rom;
p_rom += 1;
p_buff += 1;
buffer_fill +=1;
}
while( buffer_fill != ( u8 ) 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( );
return ( ERR_ERR );
}
}
// 1ブロック書き込み完了。内部電圧チェックを行う
while( FSL_IVerify( target_block ) != FSL_OK ){
// todo
;
}
}
return( ERR_SUCCESS );
}
/* ========================================================
======================================================== */
static err my_FSL_Init()
{
RTCE = 0;
// 書き替え前準備 //
DI( );
FSL_Open( ); // 割り込み禁止など
FSL_Init( pool ); // ライブラリ初期化。割り込み中断考慮せず
FSL_ModeCheck( ); // ライトプロテクトチェック。失敗することを考慮せず
return( ERR_SUCCESS );
}
task_status_immed tski_mcu_reset()
{
// 普通に再起動
my_FSL_Init();
FSL_Close( );
// FSL_SwapBootCluster();
FSL_ForceReset(); // リセット
// 保険? //
WDTE = 0xAA; // WDTで再起動テスト向け
return( ERR_SUCCESS ); // no reach
}

View File

@ -0,0 +1,189 @@
#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"
//=========================================================
#define INTERVAL_TSK_SW 16
#define CLICK_THRESHOLD 1
#define HOLD_THREASHOLD (u8)( 600 / INTERVAL_TSK_SW )
//=========================================================
u8 SW_pow_count, SW_home_count, SW_wifi_count;
bit SW_pow_mask, SW_home_mask, SW_wifi_mask;
bit SW_HOME_n;
//=========================================================
// 押した時間を数える。押しっぱなしでも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 = 255; \
} \
} \
}
/* ========================================================
 
======================================================== */
void tsk_sw( )
{
static u8 cnt_force_off = 0;
static u8 task_interval = 0;
switch ( system_status.pwr_state )
{
case ( OFF_TRIG ):
SW_pow_count = 0;
SW_wifi_count = 0;
SW_home_count = 0;
cnt_force_off = 0;
break;
case ( ON_TRIG ):
// 電源投入
SW_pow_mask = 1;
SW_home_mask = 1;
SW_wifi_mask = 1;
break;
}
if( task_interval-- != 0 )
{
return;
}
else
{
task_interval = (u8)( INTERVAL_TSK_SW / SYS_INTERVAL_TICK );
}
switch ( system_status.pwr_state )
{
case ( ON ):
case ( SLEEP ):
case ( BT_CHARGE ):
case ( OFF ):
// 電源スイッチの監視 //
if( SW_POW_n )
{
if( ( CLICK_THRESHOLD < SW_pow_count ) && ( SW_pow_count <= HOLD_THREASHOLD ) )
{
#ifdef _SW_HOME_ENABLE_
set_irq( VREG_C_IRQ0, REG_BIT_SW_POW_CLICK );
#else
set_irq( VREG_C_IRQ0, REG_BIT_SW_HOME_CLICK );
#endif
}
}
else if( SW_pow_count == HOLD_THREASHOLD )
{
#ifdef _SW_HOME_ENABLE_
set_irq( VREG_C_IRQ0, REG_BIT_SW_POW_HOLD );
#else
set_irq( VREG_C_IRQ0, REG_BIT_SW_HOME_HOLD );
#endif
}
else if( SW_pow_count == ( HOLD_THREASHOLD * 4 ) )
{ // todo
vreg_ctr[ VREG_C_LED_POW ] = LED_POW_ILM_ONLY_RED;
system_status.pwr_state = OFF_TRIG;
renge_task_interval_run_force = 1;
}
// 電源OFF割り込みを入れたが…
if( ( vreg_ctr[VREG_C_IRQ0] & REG_BIT_SW_POW_HOLD ) != 0 )
{
cnt_force_off += 1;
if( cnt_force_off >= 13 )
{ // …返事がない。強制的に切る。
vreg_ctr[ VREG_C_LED_POW ] = LED_POW_ILM_ONLY_RED;
system_status.pwr_state = OFF_TRIG;
renge_task_interval_run_force = 1;
}
}
else
{
cnt_force_off = 0;
}
// HOME スイッチ //
switch( system_status.model )
{
#ifdef _MODEL_CTR_
case( MODEL_JIKKI ):
SW_HOME_n = SW_HOME_n_JIKKI;
break;
#endif
case( MODEL_TS_BOARD ):
case( MODEL_SHIROBAKO ):
SW_HOME_n = SW_HOME_n_TSBOARD;
break;
default:
SW_HOME_n = 1;
}
if( SW_HOME_n )
{
if( ( CLICK_THRESHOLD < SW_home_count ) && ( SW_home_count <= HOLD_THREASHOLD ) )
{
set_irq( VREG_C_IRQ0, REG_BIT_SW_HOME_CLICK );
}
}
else if( SW_home_count == HOLD_THREASHOLD )
{
set_irq( VREG_C_IRQ0, REG_BIT_SW_HOME_HOLD );
}
// wifi sw //
if( SW_wifi_count == CLICK_THRESHOLD )
{
set_irq( VREG_C_IRQ0, REG_BIT_SW_WIFI_CLICK );
}
break;
}
// ボタン押し時間のカウント
/*
if( ( system_status.pwr_state == ON )
|| ( system_status.pwr_state == OFF )
|| ( system_status.pwr_state == BT_CHARGE ) )
*/
{
count_sw_n( SW_POW_n, SW_pow_count, SW_pow_mask );
#ifdef _SW_HOME_ENABLE_
count_sw_n( SW_HOME_n, SW_home_count, SW_home_mask );
#endif
count_sw_n( SW_WIFI_n, SW_wifi_count, SW_wifi_mask );
}
return;
}

View File

@ -0,0 +1,7 @@
#ifndef _sw_
#define _sw_
extern u8 SW_pow_count, SW_home_count, SW_wifi_count;
extern bit SW_pow_mask, SW_home_mask, SW_wifi_mask;
#endif

View File

@ -0,0 +1,110 @@
#pragma SFR
#pragma NOP
#pragma HALT
#pragma STOP
#include "incs.h"
#include "renge.h"
#include "pm.h"
#include "accero.h"
/* ========================================================
======================================================== */
void tsk_debug( )
{
u8 temp;
static u8 count = 0;
static u8 task_interval;
if( system_status.pwr_state == ON_TRIG ){
#ifdef _MODEL_WM0_
PM_CHG_TIMEOUT_DISABLE(); // /WL_RST に配線されています
#endif
#ifndef _MODEL_CTR_
iic_mcu_write_a_byte( IIC_SLA_DCP, 0x08, 0x80 ); // ACR←0x80 揮発モードへ
#endif
/*
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 );
*/
}
return;
}
u8 temp_debug_3;
void tsk_debug2( )
{
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_TUNE ];
str[1] = vreg_ctr[ VREG_C_ACC_CONFIG ];
str[0] = SEC;
// 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_TUNE ] );
// 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_TUNE ] );
// 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 ] );
iic_mcu_write( IIC_SLA_DBG_MONITOR, 0, 4, &str[0] );
}
return;
}
#if 0
/* ========================================================
======================================================== */
task_interval tsk_hina( )
{
switch ( system_status.pwr_state )
{
case OFF:
case ON_TRIG:
case ON:
case SLEEP_TRIG:
case SLEEP:
case OFF_TRIG:
default:
}
return ( X e tick ); // 毎 tic 呼ばれることになります
}
// ポインタで何かもらうのは危険な気がしてきた
/* このように使う
renge_task_immed_add( );
*/
task_status_immed tsk_imm_hina( u8 * arg )
{
return ( ERR_FINISED );
// ERR_FINISED タスクを削除
// ERR_CONTINUE 次になんか割り込みなり、ユーザー操作なり、システムチックが
// 来たときに再度実行
}
#endif

View File

@ -0,0 +1,276 @@
#pragma SFR
#pragma NOP
#pragma HALT
#pragma STOP
#include "incs.h"
#include "renge.h"
#include "pm.h"
#include "accero.h"
#include "adc.h"
#include "i2c_mcu.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
// ========================================================
#define INTERVAL_TSK_MISC_STAT 4
/* ========================================================
======================================================== */
void tsk_misc_stat( )
{
static u8 interval_task_misc_stat = 0;
static u8 state_old; // ステータス変化検出→割り込み の為
#ifdef _BL_INDEPENDENT_
static u8 state2_old;
#endif
u8 diff;
if( interval_task_misc_stat != 0 )
{
interval_task_misc_stat -= 1;
return;
}
else
{
interval_task_misc_stat = ( INTERVAL_TSK_MISC_STAT / SYS_INTERVAL_TICK );
}
set_bit( SHELL_OPEN, vreg_ctr[VREG_C_STATUS], REG_BIT_ST_SHELL_OPEN );
// ステータスレジスタ関係 → 割り込み //
if( ( system_status.pwr_state == ON ) || ( system_status.pwr_state == SLEEP ) )
{
// pm.c で、その場で行います。
// REG_BIT_LCD_ON/OFF
// REG_BIT_BL_ON/OFF
// REG_BIT_BT_DC_CONNECT/DISC
diff = vreg_ctr[VREG_C_STATUS] ^ state_old;
if( diff != 0 )
{
state_old = vreg_ctr[VREG_C_STATUS];
if( diff & REG_BIT_BATT_CHARGE )
{
// 充電状態に以下略
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( 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 );
}
}
}
//#ifdef _MCU_KE3_
// KE3では必須です。
/* ========================================================
BSRマイコンはaccero.cで割り込みルーチンからタスク登録します
======================================================== */
// 割り込みの取りこぼし?
if( ( vreg_ctr[VREG_C_ACC_CONFIG] & 0x03 ) != 0x00 )
{
if( ACC_VALID )
{
if( renge_task_immed_add( tsk_cbk_accero ) == ERR_SUCCESS ){
NOP();
}
}
}
//#endif
// 割り込みの取りこぼし?
if( !PM_IRQ_n ){
renge_task_immed_add( ntr_pmic_comm );
NOP();
}
}
return;
}
/* ========================================================
======================================================== */
/* ========================================================
COMMANDレジスタへの書き込み
  0
======================================================== */
task_status_immed do_command0( )
{
// command0 本体電源など
if( ( vreg_ctr[VREG_C_COMMAND0] & ( REG_BIT_OFF_REQ | REG_BIT_RESET1_REQ | REG_BIT_FCRAM_RESET_REQ | REG_BIT_RESET2_REQ )) != 0x00 )
{
if( vreg_ctr[VREG_C_COMMAND0] & REG_BIT_OFF_REQ )
{
system_status.pwr_state = OFF_TRIG;
}
else
{
if( vreg_ctr[VREG_C_COMMAND0] & REG_BIT_RESET1_REQ )
{
PM_reset_ast( );
RESET2_ast;
FCRAM_RST_ast;
}
if( vreg_ctr[VREG_C_COMMAND0] & REG_BIT_FCRAM_RESET_REQ )
{
FCRAM_RST_ast;
}
else if( vreg_ctr[VREG_C_COMMAND0] & REG_BIT_RESET2_REQ )
{
RESET2_ast;
}
wait_ms( 5 );
FCRAM_RST_neg;
PM_reset_neg();
RESET2_neg;
/*
// CODEC 不定レジスタ初期化
wait_ms( 100 );
{
u8 codec_reg_init[3] = { 0,0,0 };
iic_mcu_write( IIC_SLA_CODEC, CODEC_REG_PM, 3, codec_reg_init );
}
*/
}
}
vreg_ctr[VREG_C_COMMAND0] = 0;
return ( ERR_FINISED );
}
/* ========================================================
 TWLアプリへの割り込み
======================================================== */
// task_status_immed do_command1( )
extern u8 iic_burst_state;
/* ========================================================
 
 
======================================================== */
task_status_immed tski_mcu_info_read()
{
u8 temp;
if( SPD )
{
goto end;
}
if( STD )
{
SPIE = 1;
}
if( IICAIF == 0 )
{
return( ERR_CONTINUE );
}
else
{
IICAIF = 0;
}
switch( iic_burst_state++ ){
case( 0 ): // 本体種類識別
IICA = (u8)system_status.model;
break;
case( 1 ): // IICがなにかエラーでも知らない。00かFFならエラーの可能性が高い
IICA = iic_mcu_read_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_VER );
break;
case( 2 ): // 電池メーカーの識別
BT_DET_P = 1;
IICA = ( u8 ) ( get_adc( ADC_SEL_BATT_DET ) >> 5 );
BT_DET_P = 0;
break;
case( 3 ): // ガスゲージバージョン
IICA = iic_mcu_read_a_byte( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_VERSION );
break;
case( 4 ): // LSB
IICA = iic_mcu_read_a_byte( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_VERSION + 1 );
break;
default:
goto end;
}
return( ERR_CONTINUE );
end:
LREL = 1;
SPIE = 0;
IICAMK = 0;
iic_burst_state = 0;
return( ERR_FINISED );
}

View File

@ -0,0 +1,378 @@
#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"
//=========================================================
static void chk_emergencyExit();
//=========================================================
/* ========================================================
 system_status.pwr_state == OFF_TRIG
======================================================== */
void tsk_sys( )
{
static u8 timeout = 0;
switch ( system_status.pwr_state )
{
case OFF: //-------------------------------------------------------
// スイッチ操作などで割り込みが発生し、スリープが解除されるとここに来ます。
#ifndef _PARRADIUM_
switch ( system_status.poweron_reason )
{
default:
// スイッチで電源on
if( SW_pow_count != 0 )
{
timeout = 0;
}
else
{
timeout += 1;
}
if( timeout > 127 )
{
system_status.pwr_state = OFF_TRIG; // スイッチはノイズだった。寝る。
renge_task_interval_run_force = 1;
return;
}
if( SW_pow_count < 3 )
{
// もう少しスイッチの様子を見る
return;
}
// 電源投入
system_status.poweron_reason = PWSW;
break;
case ( RTC_ALARM ):
break;
}
timeout = 0;
// 電源投入 //
iic_mcu_start( );
// ↓で電池残量ICの起動待ちウェイトなどがあります。
PM_init( ); // 電池残量ICの設定
if( PM_sys_pow_on( ) != ERR_SUCCESS )
{ // 電源起動不可エラー
renge_task_interval_run_force = 1;
iic_mcu_stop( );
system_status.pwr_state = OFF_TRIG;
return;
}
PM_CHG_TIMEOUT_ENABLE();
// IRQ0_active;
#else
vreg_ctr[ VREG_C_STATUS_1 ] |= REG_BIT_GASGAUGE_ERR;
system_status.poweron_reason = PWSW;
#endif // _PARADDIUM_
PM_LCD_vcom_set( ); // LCDの対向電圧値など書き込み
#ifdef _PMIC_TWL_
PM_TEG_LCD_dis( 0 );
#endif
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;
// todo?
}
system_status.pwr_state = ON_TRIG;
// ここまで来ると、電源投入確定
break;
case ON_TRIG: //-------------------------------------------------------
LED_init( );
PU7 = 0b00011101; // 4:SW_WIFI 3:SW_PWSW 2:PM_IRQ 0:PM_EXTDC_n
IIC_ctr_Init( );
if( ( vreg_ctr[ VREG_C_MCU_STATUS ] & REG_BIT_STATUS_WDT_RESET )
/*
if( vreg_ctr[ VREG_C_IRQ0 ]
| vreg_ctr[ VREG_C_IRQ0 ]
| vreg_ctr[ VREG_C_IRQ0 ]
| vreg_ctr[ VREG_C_IRQ0 ]
*/
!= 0 )
{
set_irq( VREG_C_IRQ0, REG_BIT_IRQ_WDT_RESET );
}
IIC_twl_Init( );
RTC_32k_on( );
KRM = 0b00000000;
system_status.poweron_reason = NONE;
renge_task_interval_run_force = 1;
MK0 = INT_MSK0_RSV;
MK1 = INT_MSK1_RSV;
#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
system_status.reboot = 0;
system_status.pwr_state = ON;
break;
case ON: //---------------------------------------------
// PMICによる強制電源断チェック
// デバッガがreset1をアサートすることもある。そのときは全部リセット
chk_emergencyExit();
// SLP監視
if( SLP_REQ ){
system_status.pwr_state = SLEEP_TRIG;
renge_task_interval_run_force = 1;
}
break;
case SLEEP_TRIG: //-------------------------------------
PM_VDD_ecoMode();
system_status.pwr_state = SLEEP;
break;
case SLEEP: //------------------------------------------
chk_emergencyExit();
// スリープから復帰
if( !SLP_REQ ){
PM_VDD_normMode();
wait_ms( 5 ); // tdly_sw
#ifdef _MODEL_CTR_
SLP_ACK = 1;
NOP(); // 適当ウェイト
NOP();
NOP();
NOP();
SLP_ACK = 0;
#endif
system_status.pwr_state = ON_TRIG;
renge_task_interval_run_force = 1;
}
break;
case OFF_TRIG: //---------------------------------------
// LED消灯を待つ
vreg_ctr[VREG_C_LED_POW] = LED_POW_ILM_OFF;
if(( LED_duty_pow_H != 0 ) || ( LED_duty_pow_L != 0 ))
{
return;
}
PM_CHG_TIMEOUT_ENABLE();
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
#ifdef _PMIC_TWL_
PM_TEG_LCD_dis( 1 );
#endif
// IRQ0_deactive;
// pullup_off(); ↓
{
PU5 = 0b00000011; // PM_CHG,PM_CHGERR
PU7 = 0b00011001; // SW_WiFi,PWSWI,PM_EXTTDC
}
PM_sys_pow_off( );
KRM = ( KR_SW_POW ); // Mask ではなく、Modeなのだそうだ。紛らわしい
// intp20系は後ほど
MK0 = ~( INT_MSK0_EXTDC );
MK1 = ~( INT_MSK1_KR | INT_MSK1_RTCALARM | INT_MSK1_RTCINTVAL );
MK2L = 0b11111111;
IF0 = 0;
IF1 = 0;
IF2 = 0;
timeout = 0;
system_status.pwr_state = BT_CHARGE;
SW_pow_count = 0;
SW_wifi_count = 0;
// no break //
case BT_CHARGE:
if( !PM_EXTDC_n )
{
// アダプタ有り:充電温度監視
BT_TEMP_P = 1;
// 電源on
if( ( SW_pow_count > 3 ) || ( SW_wifi_count > 3 )
|| ( system_status.poweron_reason == RTC_ALARM ) )
{
system_status.pwr_state = OFF; // 若干抵抗有るが...
renge_task_interval_run_force = 1;
KRMK = 1;
return;
}
return;
}
else
{
// 省電力へ移行
BT_TEMP_P = 0;
while( RWST )
{;}
iic_mcu_stop( );
// 割り込み待ちで寝る //
RTCIMK = 1;
#ifndef _PARRADIUM_
#ifdef _MCU_BSR_
CKC = 0b00001001;
OSMC = 0x00;
#endif
STOP( );
#ifdef _MCU_BSR_
OSMC = 0x01;
CKC = 0b00001000;
#endif
#endif
RTCIMK = 0;
// 起きる //
// 起きる条件は
// ・KeyReturn割り込み電源ボたん
// ・RTCアラーム
// ・アダプタ挿抜
system_status.pwr_state = OFF; //
renge_task_interval_run_force = 1;
KRMK = 1;
return;
}
default:
while( 1 )
{
NOP( );
// あり得ないステート
}
}
}
/*******************************************************//**
PMICが電源異常で止めたか確認
**********************************************************/
static void chk_emergencyExit(){
#ifndef _PARRADIUM_
if( !RESET1_n )
{
if( PM_chk_LDSW( ) == 0 )
{
// PMICが異常終了判断をした
system_status.pwr_state = OFF_TRIG;
renge_task_interval_run_force = 1;
}
else
{
// デバッガなりがリセットをかけた
iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_BL, 0 );
vreg_ctr[VREG_C_STATUS] = ( vreg_ctr[VREG_C_STATUS] & 0b10011111 );
vreg_ctr[VREG_C_COMMAND0] |= REG_BIT_RESET1_REQ;
renge_task_immed_add( do_command0 );
}
}
#endif
}
/* ========================================================
CPUからのスリープ要求
 
======================================================== */
/*
__interrupt void intp0_slp( )
{ // SLP
if( SLP_REQ ){
system_status.pwr_state = SLEEP_TRIG;
}else{
system_status.pwr_state = ON_TRIG;
if( PM_BL_set() != ERR_SUCCESS ){
renge_task_interval_run_force = 1;
iic_mcu_stop();
system_status.pwr_state = OFF_TRIG;
}
}
renge_task_interval_run_force = 1;
}
*/
/*******************************************************//**
...
**********************************************************/
task_status_immed tski_firm_update(){
firm_update();
return( ERR_SUCCESS );
}

View File

@ -0,0 +1,273 @@
#ifndef _USER_DEF_
#define _USER_DEF_
#define IIC_SLV_ADDR_MONITOR 0x6E
#define IIC_T_SLAVEADDRESS 0x4A
#define IIC_C_SLAVEADDRESS 0x4A
#define IIC_SLA_DCP 0x50
#ifdef _debug_
// 8ドットのLED
#define IIC_SLA_8LEDS 0x42
#define IIC_8LEDS_REG_DO 1
#define IIC_8LEDS_REG_DI 2
#define IIC_8LEDS_REG_DIR 3
// 7セグ 4バイト版
#define IIC_SLA_DBG_MONITOR 0x44
#endif
#ifdef _debug_led_
#define DBG_LED_WIFI_2_on { PM2.4 = 0; P2.4 = 1; }
#define DBG_LED_WIFI_2_off { PM2.4 = 1; P2.4 = 0; }
#define DBG_LED_WIFI_2_toggle ( P2.4 ^= 1 )
#else
#define DBG_LED_WIFI_2_on ;
#define DBG_LED_WIFI_2_off ;
#define DBG_LED_WIFI_2_toggle ;
#endif
#ifdef _PMIC_TWL_
#define PM_TEG_PWSW P7.5 // TEGのみ
#define PM_TEG_LCD_dis( val ) ( P7.6 = val ) // TEGのみ
#else
#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 { 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; }
#ifndef _PARRADIUM_
#define SLP_REQ P12.0
#else
#define SLP_REQ 0
#endif
// 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
#ifndef _MODEL_CTR_
#define SND_DEPOP_ACT P7.6 = 1
#define SND_DEPOP_DEACT P7.6 = 0
#else
#define SND_DEPOP_ACT ;
#define SND_DEPOP_DEACT ;
#endif
// 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
// 充電せよ(out)
#ifdef _PMIC_CTR_
#define BT_CHG_ENABLE() ( P4.3 = 0 )
#define BT_CHG_DISABLE() ( P4.3 = 1 )
#else
#define BT_CHG_ENABLE() ( P4.2 = 0 )
#define BT_CHG_DISABLE() ( P4.2 = 1 )
#endif
#ifdef PM_CCIC_TIM
#define PM_CHG_TIMEOUT_ENABLE() ( P5.0 = 0 )
#define PM_CHG_TIMEOUT_DISABLE() ( P5.0 = 1 )
#else
#define PM_CHG_TIMEOUT_ENABLE() ;
#define PM_CHG_TIMEOUT_DISABLE() ;
#endif
// 充電中(in)
#define BT_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
#define WL_RX P20.2 // INTP20
#else
#define WL_TX P20.3 // INTP21
#define WL_RX P20.2 // INTP20
#endif
//#define LED_CAM P1.0 // TO02
//#define LED_WIFI P1.1 // TO03
//#define LED_NOTIFY P1.3 // TO05
//#define LED_TUNE P5.2 // SLTO ← TO01
//#define LED_POW2 P1.4 // TO06 ( 青 )
//#define LED_POW1 P1.5 // TO07 ( 赤 )
#define LED_CHARGE P2.4
#define I2C_PU P5.3
//#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_0 P4.0 // mini cube ソフトウェアディップスイッチ
#define DIPSW_1 P4.1 // mini cube ソフトウェアディップスイッチ
#ifndef _MODEL_WM0_
#define SHELL_OPEN P7.1 // INTP5 ふた開閉 (閉じると?)
#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_ || _MODEL_CTR_
#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 DBG_M_n P2.1
#define DBG_P_n P2.2
#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

View File

@ -0,0 +1,407 @@
/* ========================================================
CTR MCU I2Cレジスタ
====================================================== */
#include "incs.h"
#include "vreg_ctr.h"
#include "rtc.h"
#include "led.h"
#include "accero.h"
#include "pm.h"
#include <fsl.h>
#include "fsl_user.h"
extern u8 mcu_info_read(); // task_misc.c
// ********************************************************
u8 vreg_ctr[VREG_C_ENDMARK_];
bit irq_readed; // AAA型のため。
extern bit update;
extern u16 pool[];
// ********************************************************
extern task_status_immed tski_firm_update();
extern task_status_immed tski_mcu_info_read();
// ********************************************************
#ifdef _MCU_BSR_
#define IICAMK IICAMK1
#endif
// ********************************************************
// 非ゼロの初期値の指定が必要なアドレス
void vreg_ctr_init( )
{
vreg_ctr[VREG_C_LED_BRIGHT] = 0xFF;
#ifdef _MODEL_TEG2_
vreg_ctr[VREG_C_MCU_VER_MAJOR] = MCU_VER_MAJOR;
#else
vreg_ctr[VREG_C_MCU_VER_MAJOR] = MCU_VER_MAJOR | 0x10;
#endif
vreg_ctr[VREG_C_MCU_VER_MINOR] = MCU_VER_MINOR;
vreg_ctr[VREG_C_VCOM_T] = 92;
vreg_ctr[VREG_C_VCOM_B] = 95;
}
// ********************************************************
// I2C仮想レジスタに書きます。
// 引数 adrs は内部アドレス
//  書けないアドレスにアクセスした場合、何もしません。
// ●書き込んだ結果、I2C_mcu通信が発生する場合、renge_task_immed_add()
// を使用しないと、I2C_mcu使用中でエラー終了した場合にリトライしません。
void vreg_ctr_write( u8 adrs, u8 data )
{
if( adrs >= VREG_C_ENDMARK_ )
return;
switch ( adrs )
{
case ( VREG_C_MCU_STATUS ):
vreg_ctr[adrs] = data;
vreg_twl[ REG_TWL_INT_ADRS_MODE ] = ( ( data & 0xC0 ) >> 6 );
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_DBG1 ):
case ( VREG_C_DBG2 ):
vreg_ctr[adrs] = data;
break;
case ( VREG_C_DBG3 ):
vreg_ctr[adrs] = data;
if( ( vreg_ctr[VREG_C_DBG1] == 'j' )
&& ( vreg_ctr[VREG_C_DBG2] == 'h' )
&& ( data == 'l' ) )
{
renge_task_immed_add( tski_firm_update );
IICAMK = 1;
}
break;
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 ):
vreg_ctr[adrs] = data;
break;
case ( VREG_C_COMMAND0 ):
vreg_ctr[adrs] |= data;
if( data != 0 )
{
renge_task_immed_add( do_command0 );
}
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 )
{
vreg_ctr[adrs] = ( data & REG_BITS_CMD_BL );
renge_task_immed_add( tski_PM_BL_set );
}
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
vreg_twl[REG_TWL_INT_ADRS_IRQ] |= ( ( data & REG_BIT_SEND_TWL_VOL_CLICK ) != 0 ) ? REG_BIT_TWL_IRQ_VOL_CHANGE : 0x00; //vol_changed
}
break;
case ( VREG_C_DBG20 ):
case ( VREG_C_DBG21 ):
case ( VREG_C_DBG22 ):
case ( VREG_C_DBG23 ):
vreg_ctr[adrs] = data;
break;
case ( VREG_C_FREE_0 ):
case ( VREG_C_FREE_1 ):
case ( VREG_C_FREE_2 ):
case ( VREG_C_FREE_3 ):
case ( VREG_C_FREE_4 ):
case ( VREG_C_FREE_5 ):
case ( VREG_C_FREE_6 ):
case ( VREG_C_FREE_7 ):
case ( VREG_C_FREE_8 ):
case ( VREG_C_FREE_9 ):
case ( VREG_C_FREE_A ):
case ( VREG_C_FREE_B ):
case ( VREG_C_FREE_C ):
case ( VREG_C_FREE_D ):
case ( VREG_C_FREE_E ):
case ( VREG_C_FREE_F ):
vreg_ctr[adrs] = data;
break;
case ( VREG_C_LED_BRIGHT ):
vreg_ctr[adrs] = data;
break;
case ( VREG_C_LED_POW ):
case ( VREG_C_LED_WIFI ):
case ( VREG_C_LED_CAM ):
case ( VREG_C_LED_TUNE ):
case ( VREG_C_LED_NOTIFY ):
vreg_ctr[adrs] = data & 0x0F;
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_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_DAY ):
set_rtc( adrs - VREG_C_RTC_SEC, data & 0x3F );
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 ):
vreg_ctr[adrs] = data;
SUBCUD = data;
break;
case ( VREG_C_RTC_ALARM_MIN ):
vreg_ctr[adrs] = ( data & 0x7F );
rtc_alarm_dirty = 1;
break;
case ( VREG_C_RTC_ALARM_HOUR ):
vreg_ctr[adrs] = ( data & 0x3F );
rtc_alarm_dirty = 1;
break;
// 書くだけでよい
case ( VREG_C_RTC_ALARM_DAY ):
vreg_ctr[adrs] = ( data & 0x3F );
break;
case ( VREG_C_RTC_ALARM_MONTH ):
vreg_ctr[adrs] = ( data & 0x1F );
break;
case ( VREG_C_RTC_ALARM_YEAR ):
vreg_ctr[adrs] = data;
break;
case ( VREG_C_ACC_CONFIG ):
vreg_ctr[adrs] = data;
renge_task_immed_add( acc_hosu_set );
break;
case ( VREG_C_ACC_R_ADRS ):
vreg_ctr[adrs] = data;
renge_task_immed_add( acc_read );
break;
case ( VREG_C_ACC_W_ADRS ):
vreg_ctr[adrs] = data;
break;
case ( VREG_C_ACC_W_BUF ):
vreg_ctr[adrs] = data;
renge_task_immed_add( acc_write );
break;
case ( VREG_C_ACC_HOSU_L ):
case ( VREG_C_ACC_HOSU_M ):
case ( VREG_C_ACC_HOSU_H ):
vreg_ctr[adrs] = data;
break;
case ( VREG_C_ACC_HOSU_SETTING ):
if( ( data & 0x01 ) != 0 )
{
clear_hosu_hist(); // 履歴クリア
}
break;
case ( VREG_C_COMMAND3 ):
vreg_ctr[adrs] = data;
switch ( data )
{
case ( 'r' ):
// 割り込みルーチンからFSLライブラリを呼ぶのは禁止のため
// renge_task_immed_add( tski_mcu_reset );
// break;
case ( 'w' ):
// WDTで再起動テスト向け
WDTE = 0xAA;
break;
}
}
return;
}
// ********************************************************
// I2C仮想レジスタから読みます。
// 戻り: xx データ
// 注意:次のアドレスの準備で呼ばれる ので、
// リードされたらクリアなどは気をつける
u8 vreg_ctr_read( u8 adrs )
{
static u16 rsub_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 ] | ( ( vreg_twl[ REG_TWL_INT_ADRS_MODE ] & 0x03 ) << 6 ) );
}
else if( adrs == VREG_C_ACC_HOSU_HIST )
{
return( hosu_read() );
}
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_INFO )
{
renge_task_immed_add( tski_mcu_info_read );
IICAMK = 1;
return( 0x4A );
}
#if 1
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 )
{
// 割り込みフラグはリードでクリア
switch( adrs )
{
case VREG_C_IRQ0:
case VREG_C_IRQ1:
case VREG_C_IRQ2:
case VREG_C_IRQ3:
case VREG_C_IRQ4:
vreg_ctr[ adrs ] = 0;
irq_readed = 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;
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();
}

View File

@ -0,0 +1,272 @@
#ifndef __vreg_ctr__
#define __vreg_ctr__
#include "config.h"
#define REG_BIT__SYS_MODE0 0b01000000
#define REG_BIT_MCU_FIRMBROKEN 0b10000000
// 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 )
// 未使用 ( 1 << 4 )
// 未使用 ( 1 << 3 )
// 未使用 ( 1 << 2 )
#define REG_BIT_ACCERO_ERR ( 1 << 1 )
#define REG_BIT_GASGAUGE_ERR ( 1 << 0 )
// VREG_C_IRQ0
#define REG_BIT_VR_SNDVOL_CHANGE ( 1 << 7 )
#define REG_BIT_IRQ_WDT_RESET ( 1 << 7 )
#define REG_BIT_SHELL_OPEN ( 1 << 6 )
#define REG_BIT_SHELL_CLOSE ( 1 << 5 )
#define REG_BIT_SW_WIFI_CLICK ( 1 << 4 )
#define REG_BIT_SW_HOME_HOLD ( 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_SNDVOL_CHANGE ( 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_TUNE_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_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
// 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 )
/*
#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
{ // 未定義アドレスへ書き込んだ際の動作は不定
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_DBG1 = 0x05,
VREG_C_DBG2,
VREG_C_DBG3,
VREG_C_TUNE = 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' でマイコンリセット
VREG_C_DBG20 = 0x24,
VREG_C_DBG21,
VREG_C_DBG22,
VREG_C_DBG23,
VREG_C_LED_BRIGHT = 0x28,
VREG_C_LED_POW,
VREG_C_LED_WIFI,
VREG_C_LED_CAM,
VREG_C_LED_TUNE,
VREG_C_LED_NOTIFY,
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_AMBIENT_BRIGHTNESS = 0x60,
// 歩数計の評価のため...
VREG_C_FREE_0 = 0x50,
VREG_C_FREE_1,
VREG_C_FREE_2,
VREG_C_FREE_3,
VREG_C_FREE_4,
VREG_C_FREE_5,
VREG_C_FREE_6,
VREG_C_FREE_7,
VREG_C_FREE_8,
VREG_C_FREE_9,
VREG_C_FREE_A,
VREG_C_FREE_B,
VREG_C_FREE_C,
VREG_C_FREE_D,
VREG_C_FREE_E,
VREG_C_FREE_F,
VREG_C_ENDMARK_
};
#define VREG_C_INFO 0x7F
/*
VREG_C_PM_INFO, // 未使用
VREG_C_BT_INFO, // 未使用
*/
/*============================================================================*/
void vreg_ctr_init( );
void vreg_ctr_write( u8 adrs, u8 data );
u8 vreg_ctr_read( u8 phy_adrs );
void vreg_ctr_after_read( u8 adrs );
void set_irq( u8 irqreg, u8 irq_flg );
#endif

View File

@ -0,0 +1,146 @@
/* ========================================================
TWL互換側のI2Cレジスタ
======================================================== */
#include "incs.h"
#include "jhl_defs.h"
#include "vreg_twl.h"
#include "vreg_ctr.h"
#include "renge\renge_task_intval.h"
// ========================================================
#define TWL_REG_VER_INFO 0x35
#define NON_EXIST_REG 0xFF
// ========================================================
u8 vreg_twl[_REG_TWL_INT_ADRS_ENDMARK];
/* ========================================================
======================================================== */
void vreg_twl_init( )
{
vreg_twl[ REG_TWL_INT_ADRS_MODE ] = 0x03;
}
// ========================================================
// I2C仮想レジスタに書く・何かアクションする
// 引数 adrs は内部アドレス
//  存在しないアドレスにアクセスした場合、何もしません。
void vreg_twl_write( u8 adrs, u8 data )
{
switch ( adrs )
{
case ( REG_TWL_INT_ADRS_VOL ):
{
set_irq( VREG_C_IRQ2, REG_BIT_TWL_SNDVOL_CHANGE );
break;
}
case ( REG_TWL_INT_ADRS_MODE ):
vreg_twl[adrs] = ( data & 0x03 );
break;
case ( REG_TWL_INT_ADRS_CAM ):
vreg_twl[adrs] = ( data & 0x03 );
tsk_led_cam(); // todo 大丈夫?
break;
case ( REG_TWL_INT_ADRS_TEMP0 ):
vreg_twl[adrs] = 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 ){
case( REG_TWL_INT_ADRS_VER_INFO ):
return( TWL_REG_VER_INFO );
case( REG_TWL_INT_ADRS_POWER_INFO ):
if( vreg_ctr[ VREG_C_BT_REMAIN ] > 90 ){
vreg_twl[ REG_TWL_INT_ADRS_POWER_INFO ] = 0x0F;
}else if( vreg_ctr[ VREG_C_BT_REMAIN ] > 75 ){
vreg_twl[ REG_TWL_INT_ADRS_POWER_INFO ] = 0x0B;
}else if( vreg_ctr[ VREG_C_BT_REMAIN ] > 50 ){
vreg_twl[ REG_TWL_INT_ADRS_POWER_INFO ] = 0x07;
}else if( vreg_ctr[ VREG_C_BT_REMAIN ] > 25 ){
vreg_twl[ REG_TWL_INT_ADRS_POWER_INFO ] = 0x03;
}else if( vreg_ctr[ VREG_C_BT_REMAIN ] > 5 ){
vreg_twl[ REG_TWL_INT_ADRS_POWER_INFO ] = 0x01;
}else{
vreg_twl[ REG_TWL_INT_ADRS_POWER_INFO ] = 0x00;
}
return( vreg_twl[ REG_TWL_INT_ADRS_POWER_INFO ] | ( !BT_CHG_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 );
default:
return( vreg_twl[ phy_adrs ] );
case( REG_TWL_ADRS_NON_EXIST ):
return( 0x00 );
}
}
// ========================================================
// 外部から見える虫食いアドレスを、内部の連続アドレスに読み替える
// 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_CAM ): return( REG_TWL_INT_ADRS_CAM );
case( REG_TWL_ADRS_VOL ): return( REG_TWL_INT_ADRS_VOL );
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 );
}
}

View File

@ -0,0 +1,129 @@
#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 ( vregs[ REG_TWL_INT_ADRS_MODE ] & 0x01 )
#define with_NAND ( vregs[ REG_TWL_INT_ADRS_MODE ] & 0x02 )
#define volSteps32 ( vregs[ REG_TWL_INT_ADRS_MODE ] & 0x80 )
#define reg_wifi_led ( vregs[ REG_TWL_INT_ADRS_WIFI ] & 0x01 )
#define reg_wifi_led_blink ( vregs[ REG_TWL_INT_ADRS_WIFI ] & 0x02 )
typedef enum twl_camLed_mode_{
TWL_CAMLED_OFF,
TWL_CAMLED_ON,
TWL_CAMLED_BLINK,
TWL_CAMLED_DEF_ON
}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 );
task_status_immed command_from_twl( );
// 読んだらクリアなどの処理
#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,16 @@
C:\WINDOWS\system32\cmd.exe /c touch magic.c
"C:\Program Files\NEC Electronics Tools\CC78K0R\W2.10\bin\cc78k0r.exe" -c9F0104 -y"C:\Program Files\NEC Electronics Tools\DEV" -_msgoff -irenge -i"C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r" -ms -qvjl3wt -sainter_asm -zp -no magic.c
Compilation complete, 0 error(s) and 0 warning(s) found.
"C:\Program Files\NEC Electronics Tools\RA78K0R\W1.31\bin\ra78k0r.exe" -c9F0104 -y"C:\Program Files\NEC Electronics Tools\DEV" -_msgoff inter_asm\magic.asm
Assembly complete, 0 error(s) and 0 warning(s) found.
"C:\Program Files\NEC Electronics Tools\RA78K0R\W1.31\bin\lk78k0r.exe" -y"C:\Program Files\NEC Electronics Tools\DEV" -_msgoff -obsr.lmf "..\..\Program Files\NEC Electronics Tools\CC78K0R\W2.10\lib78k0r\s0rm.rel" -go85h,0FC00h,1024 -gi0FFFFFFFFFFFFFFFFFFFFh -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"C:\Program Files\NEC Electronics Tools\CC78K0R\W2.10\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 ini_VECT.rel led.rel rtc.rel vreg_ctr.rel vreg_twl.rel adc.rel renge.rel accero.rel self_flash.rel reboot.rel sw.rel task_debug.rel task_misc.rel task_sys.rel pedo_alg_thre_det2.rel
Link complete, 0 error(s) and 0 warning(s) found.
"C:\Program Files\NEC Electronics Tools\RA78K0R\W1.31\bin\oc78k0r.exe" -y"C:\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
nec_s_2_bsrbin2.rb:2: warning: variable $KCODE is no longer effective; ignored
intel-HEX to bsr bin converter
file converted!
Build Total error(s) : 0 Total warning(s) : 0

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,27 @@
[ProjectManager]
FrameMax=1
FrameX=255
FrameY=34
FrameCX=1299
FrameCY=1044
OpenFile1=renge\renge.h,0,502,637,1746,1394,29,16,29,0
OpenFile2=jhl_defs.h,0,250,539,1494,1265,0,10,8,0
OpenFile3=renge\\renge_defs.h,0,293,307,1537,1033,18,37,18,0
OpenFile4=renge\renge_defs.h,0,667,22,1514,748,0,16,0,0
OpenFile5=task_sys.c,0,330,330,1574,1056,0,172,37,0
OpenFile6=loader.c,0,296,307,1286,923,20,214,20,0
OpenFile7=pm.h,0,254,446,1244,1062,0,115,0,0
OpenFile8=sw.c,0,574,367,1818,1093,43,36,43,0
OpenFile9=vreg_ctr.h,0,632,184,1876,910,8,40,25,0
OpenFile10=pedo_alg_thre_det2.c,0,132,132,1376,858,0,12,0,0
OpenFile11=adc.c,0,286,286,1530,1012,0,145,0,0
OpenFile12=self_flash.c,0,154,154,1398,880,7,365,7,0
OpenFile13=ProjectWindow
PrjPos=0,2,754,3,253
OpenFile14=magic.c,0,323,248,1567,974,0,17,0,0
OpenFile15=config.h,0,288,71,1532,797,18,2,21,0
OpenFile16=OutputWindow
OutputPos=0,572,1038,46,1104
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,234 @@
[SdbInfo]
Ver=5
[loader.c]
T=4bb93708
1=incs_loader.h
2=fsl.h
3=fsl_user.h
4=i2c_ctr.h
5=i2c_mcu.h
6=pm.h
7=rtc.h
8=reboot.h
[pm.c]
T=4bb92f33
1=incs.h
2=adc.h
3=led.h
4=pm.h
5=renge\renge.h
6=batt_params.h
7=..\..\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r\fsl.h
8=fsl_user.h
[i2c_ctr.c]
T=4bb92f33
1=incs.h
2=accero.h
[main.c]
T=4bb92f33
1=incs_loader.h
2=WDT.h
3=rtc.h
4=pm.h
5=accero.h
6=led.h
7=adc.h
[magic.c]
T=4bb94d0f
1=config.h
[WDT.c]
T=4bb92f33
1=incs_loader.h
[i2c_mcu.c]
T=4bb92f33
1=incs.h
2=i2c_mcu.h
[i2c_twl.c]
T=4bb92f33
1=incs.h
2=i2c_twl_defs.h
[ini_VECT.c]
T=4bb92f33
1=config.h
[led.c]
T=4bb92f33
1=incs.h
2=led.h
[rtc.c]
T=4bb92f33
1=incs.h
[vreg_ctr.c]
T=4bb92f33
1=incs.h
2=vreg_ctr.h
3=rtc.h
4=led.h
5=accero.h
6=pm.h
7=..\..\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r\fsl.h
8=fsl_user.h
[vreg_twl.c]
T=4bb92f33
1=incs.h
2=jhl_defs.h
3=vreg_twl.h
4=vreg_ctr.h
5=renge\renge_task_intval.h
[adc.c]
T=4bb92f33
1=incs.h
2=adc.h
3=pm.h
4=led.h
[renge\renge.c]
T=4bb92f32
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=4bb92f33
1=incs.h
2=..\..\Program Files\NEC Electronics Tools\CC78K0R\W2.10\inc78k0r\math.h
[self_flash.c]
T=4bb92f33
1=incs_loader.h
2=..\..\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r\fsl.h
3=fsl_user.h
4=i2c_ctr.h
[reboot.c]
T=4bb92f33
1=incs_loader.h
[sw.c]
T=4bb92f33
1=incs.h
2=i2c_twl.h
3=i2c_ctr.h
4=led.h
5=accero.h
6=pm.h
7=rtc.h
[task_debug.c]
T=4bb92f33
1=incs.h
2=renge\renge.h
3=pm.h
4=accero.h
[task_misc.c]
T=4bb92f33
1=incs.h
2=renge\renge.h
3=pm.h
4=accero.h
5=adc.h
6=i2c_mcu.h
[task_sys.c]
T=4bb92f33
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
[pedo_alg_thre_det2.c]
T=4bb92f33
1=incs.h
2=..\..\Program Files\NEC Electronics Tools\CC78K0R\W2.10\inc78k0r\math.h
3=accero.h
4=pedometer.h
[incs_loader.h]
T=4bb92f33
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=4bb92f33
1=config.h
[config.h]
T=4bb9687f
[user_define.h]
T=4bb92f33
[bsr_system.h]
T=4bb92f33
[renge\renge.h]
T=4bb92f32
1=renge\renge_defs.h
2=renge\renge_task_immediate.h
[renge\renge_defs.h]
T=4bb92f32
[renge\renge_task_immediate.h]
T=4bb92f32
1=renge\renge_defs.h
[vreg_ctr.h]
T=4bb92f33
1=config.h
[vreg_twl.h]
T=4bb92f33
[loader.h]
T=4bb92f33
1=jhl_defs.h
[i2c_mcu.h]
T=4bb92f33
[WDT.h]
T=4bb92f33
[fsl.h]
T=4bb92f33
[fsl_user.h]
T=4bb92f33
[i2c_ctr.h]
T=4bb92f33
[pm.h]
T=4bb92f33
[rtc.h]
T=4bb92f33
[reboot.h]
T=4bb92f33
[incs.h]
T=4bb92f33
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=i2c_mcu.h
8=rtc.h
9=accero.h
[accero.h]
T=4bb92f33
1=jhl_defs.h
2=pedometer.h
[pedometer.h]
T=4bb92f33
[adc.h]
T=4bb92f33
1=jhl_defs.h
[led.h]
T=4bb92f33
[batt_params.h]
T=4bb92f33
[..\..\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r\fsl.h]
T=49a3bd4e
[i2c_twl_defs.h]
T=4bb92f33
[renge\renge_task_intval.h]
T=4bb92f32
1=renge\renge_defs.h
[..\..\Program Files\NEC Electronics Tools\CC78K0R\W2.10\inc78k0r\math.h]
T=45f12258
[i2c_twl.h]
T=4bb92f33
[sw.h]
T=4bb92f33