V0.6 ベータ

全ファイルをindentに通した
ほか、たくさん修正

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_mcu@12 013db118-44a6-b54f-8bf7-843cb86687b1
This commit is contained in:
fujita_ryohei 2009-10-19 11:16:14 +00:00
parent 9453e8fbfe
commit 5e9ec34e61
47 changed files with 4748 additions and 4172 deletions

View File

@ -8,7 +8,7 @@
//========================================================= //=========================================================
// ウォッチドッグタイマのリスタート // ウォッチドッグタイマのリスタート
// 0xACはマジック // 0xACはマジック
void WDT_Restart( void ){ void WDT_Restart( void )
{
WDTE = WDT_RESTART_MAGIC; WDTE = WDT_RESTART_MAGIC;
} }

View File

@ -9,8 +9,12 @@
#pragma NOP #pragma NOP
#pragma HALT #pragma HALT
#pragma STOP #pragma STOP
#pragma ROT
// rorb, rolb, rorw, rolw
#pragma MUL
#include "incs.h" #include "incs.h"
#include <math.h>
// ======================================================== // ========================================================
@ -44,7 +48,8 @@
#define VREG_BITMASK_ACC_CONF_HOSU ( 1 << 1 ) #define VREG_BITMASK_ACC_CONF_HOSU ( 1 << 1 )
#define VREG_BITMASK_ACC_CONF_ACQ ( 1 << 0 ) #define VREG_BITMASK_ACC_CONF_ACQ ( 1 << 0 )
// ========================================================
static u8 hyst_pedometer[256];
// ======================================================== // ========================================================
@ -52,46 +57,153 @@ task_interval tsk_soft_int();
/* ======================================================== /* ========================================================
   
I2Cが使用中だったら I2Cが使用中だったら
======================================================== */ ======================================================== */
task_status_immed tsk_cbk_accero(){ // 疑似isrから登録されます task_status_immed tsk_cbk_accero( )
{ // 疑似isrから登録されます
if( system_status.pwr_state == ON ){
if( system_status.pwr_state == ON )
{
// 加速度センサデータレジスタへの反映 // 加速度センサデータレジスタへの反映
iic_mcu_read( IIC_SLA_ACCEL, ( ACC_REG_X | 0x80 ), 6, &vreg_ctr[VREG_C_ACC_XL] ); iic_mcu_read( IIC_SLA_ACCEL, ( ACC_REG_X | 0x80 ), 6, &vreg_ctr[VREG_C_ACC_XL] );
if(( vreg_ctr[ VREG_C_ACC_CONFIG ] & ( VREG_BITMASK_ACC_CONF_ACQ | VREG_BITMASK_ACC_CONF_HOSU ) ) != 0 ){
{
// 歩数計 //
unsigned int mean; // 二乗平均はあまりにも処理が重いので(!) 絶対値の合計にします
static u8 direction;
static s16 th_H = 0x2380; // 閾値。暫定。動的変更とかしたい…
static s16 th_L = 0x2180;
static u16 interval; // 山と谷の間の時間。短すぎても長すぎてもはじく。
s16 sx16 = vreg_ctr[VREG_C_ACC_XH] * 256 + vreg_ctr[VREG_C_ACC_XL];
s16 sy16 = vreg_ctr[VREG_C_ACC_YH] * 256 + vreg_ctr[VREG_C_ACC_YL];
s16 sz16 = vreg_ctr[VREG_C_ACC_ZH] * 256 + vreg_ctr[VREG_C_ACC_ZL];
// そのうちローコストな方法を考え
mean = sqrt( (long)abs( sx16 ) * abs( sx16 ) /4 +
(long)abs( sy16 ) * abs( sy16 ) /4 +
(long)abs( sz16 ) * abs( sz16 ) /4 );
{
static u8 count_H = 0;
static u8 count_L = 0;
if( direction == 0 ) // 前回に下限を下回っていて
{
if( mean > th_H ) // 今回、上の閾値を上回った
{
if( count_H == 5 ){ // 突発的なノイズは省く...
direction = 1;
count_L = 0;
}
if( count_H <= 5 ){
count_H += 1;
}
}
else
{
count_H = 0;
}
}
if( count_H >= 5 ){
interval += 1;
}
if( 500 < interval ){
interval = 0;
direction = 0;
count_H = 0;
count_L = 0;
}
// 下の閾値を超えるのを待つ
if( direction == 1 )
{
if( mean < th_L )
{
if( count_L == 5 ){
direction = 0; // 次は上の閾値を待つ
if( count_H >= 5 ){
if( 70 < interval )
{
vreg_ctr[ VREG_C_ACC_HOSU_L ] += 1; // 一歩加算
hyst_pedometer[0] += 1;
}
}
count_H = 0;
}
if( count_L <= 5 ){
count_L += 1;
}
}
else
{
count_L = 0;
}
}
}
// debug
if( mean > th_H )
{
DBG_LED_WIFI_on;
DBG_LED_WIFI_2_off;
}
if( mean < th_L )
{
DBG_LED_WIFI_off;
DBG_LED_WIFI_2_on;
}
}
if( ( vreg_ctr[VREG_C_ACC_CONFIG] &
( VREG_BITMASK_ACC_CONF_ACQ | VREG_BITMASK_ACC_CONF_HOSU ) ) != 0 )
{
set_irq( VREG_C_IRQ1, REG_BIT_ACC_DAT_RDY ); set_irq( VREG_C_IRQ1, REG_BIT_ACC_DAT_RDY );
} }
} }
// 歩数計 offでなければ、電源off中でも計測 // 歩数計 offでなければ、電源off中でも計測
if(( vreg_ctr[ VREG_C_ACC_CONFIG ] & VREG_BITMASK_ACC_CONF_HOSU ) != 0x00 ){ if( ( vreg_ctr[VREG_C_ACC_CONFIG] & VREG_BITMASK_ACC_CONF_HOSU ) != 0x00 )
if(( vreg_ctr[ VREG_C_ACC_CONFIG ] & VREG_BITMASK_ACC_CONF_ACQ ) != 0x00 ){ {
if( ( vreg_ctr[VREG_C_ACC_CONFIG] & VREG_BITMASK_ACC_CONF_ACQ ) != 0x00 )
{
// 歩数計アルゴリズム 100Hz版 // 歩数計アルゴリズム 100Hz版
}else{ }
else
{
// 同 省電力版 // 同 省電力版
} }
}
}
return ( ERR_SUCCESS ); return ( ERR_SUCCESS );
} }
/*========================================================= /*=========================================================
     
========================================================*/ ========================================================*/
task_status_immed acc_read(){ 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_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_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; vreg_ctr[VREG_C_IRQ1] |= REG_BIT_ACC_ACK;
if( ( vreg_ctr[ VREG_C_IRQ_MASK1 ] & REG_BIT_ACC_ACK ) == 0 ){ if( ( vreg_ctr[VREG_C_IRQ_MASK1] & REG_BIT_ACC_ACK ) == 0 )
{
IRQ0_ast; IRQ0_ast;
} }
return ( ERR_SUCCESS ); return ( ERR_SUCCESS );
@ -102,10 +214,12 @@ task_status_immed acc_read(){
/*========================================================= /*=========================================================
     
========================================================*/ ========================================================*/
task_status_immed acc_write(){ 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] ); 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; vreg_ctr[VREG_C_IRQ1] |= REG_BIT_ACC_ACK;
if( ( vreg_ctr[ VREG_C_IRQ_MASK1 ] & REG_BIT_ACC_ACK ) == 0 ){ if( ( vreg_ctr[VREG_C_IRQ_MASK1] & REG_BIT_ACC_ACK ) == 0 )
{
IRQ0_ast; IRQ0_ast;
} }
return ( ERR_SUCCESS ); return ( ERR_SUCCESS );
@ -118,41 +232,69 @@ task_status_immed acc_write(){
todo todo
========================================================*/ ========================================================*/
task_status_immed acc_hosu_set(){ task_status_immed acc_hosu_set( )
{
u8 str_send_buf[4]; u8 str_send_buf[4];
iic_mcu_read_a_byte( IIC_SLA_ACCEL, ACC_REG_WHOAMI ); iic_mcu_read_a_byte( IIC_SLA_ACCEL, ACC_REG_WHOAMI );
if( iic_mcu_bus_status == ERR_NOSLAVE ){ if( iic_mcu_bus_status == ERR_NOSLAVE )
{
return ( ERR_SUCCESS ); // とりあえず、タスクは削除しなくてはならない return ( ERR_SUCCESS ); // とりあえず、タスクは削除しなくてはならない
} }
str_send_buf[1] = 0x10; // ctrl2 HPF:normal, filterd, HPF for IRQ : dis/dis, HPF coeff:norm str_send_buf[1] = 0x00; // ctrl2 HPF:normal, filterd, HPF for IRQ : dis/dis, HPF coeff:norm
#ifdef _MCU_WM0_ #ifdef _MODEL_WM0_
str_send_buf[2] = 0x10; // 3 IRQ pol :Active HI, Drive:Pushpull, str_send_buf[2] = 0x10; // 3 IRQ pol :Active HI, Drive:Pushpull,
// IRQ2flg latch: auto clear after read, IRQ2 conf: IRQ( fall,shock,...) /// IRQ2flg latch: auto clear after read, IRQ2 conf: IRQ( fall,shock,...)
// 1 : auto clear after read, conf: data ready /// 1 : auto clear after read, conf: data ready
#else #else
str_send_buf[2] = 0x02; // 3 IRQ pol :Active HI, Drive:Pushpull, str_send_buf[2] = 0x02; // 3 IRQ pol :Active HI, Drive:Pushpull,
// IRQ2flg latch: auto clear after read, IRQ2 conf: IRQ( fall,shock,...) /// IRQ2flg latch: auto clear after read, IRQ2 conf: IRQ( fall,shock,...)
// 1 : auto clear after read, conf: data ready /// 1 : auto clear after read, conf: data ready
#endif #endif
str_send_buf[3] = 0x80; // ctrl3 block update:enable, MSB first, scale: +-2G(default), selftest: dis 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 ){ 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 ); str_send_buf[0] =
( ACC_BITS_PM_PDN << ACC_bP_PM0 | 0 << ACC_bP_DR0 | ACC_BITS_ALL_AXIS_ON );
} }
else else
{ {
if(( vreg_ctr[ VREG_C_ACC_CONFIG ] & VREG_BITMASK_ACC_CONF_ACQ ) != 0x00 ){ #ifdef _MCU_BSR_
PMK23 = 0;
#endif
if( ( vreg_ctr[VREG_C_ACC_CONFIG] & VREG_BITMASK_ACC_CONF_ACQ ) != 0x00 )
{
// 100Hz 自動取り込み // 100Hz 自動取り込み
str_send_buf[0] = ( ACC_BITS_PM_NORM << ACC_bP_PM0 | ACC_BITS_DR_100Hz << ACC_bP_DR0 | ACC_BITS_ALL_AXIS_ON ); str_send_buf[0] =
}else{ ( ACC_BITS_PM_NORM << ACC_bP_PM0 | ACC_BITS_DR_100Hz <<
// 10Hz 自動取り込み(歩数計向け省電力モード) ACC_bP_DR0 | ACC_BITS_ALL_AXIS_ON );
str_send_buf[0] = ( ACC_BITS_PM_LP10 << ACC_bP_PM0 | ACC_BITS_ALL_AXIS_ON ); }
else
{
// 100Hz 自動取り込み
str_send_buf[0] =
( ACC_BITS_PM_NORM << ACC_bP_PM0 | ACC_BITS_DR_100Hz <<
ACC_bP_DR0 | ACC_BITS_ALL_AXIS_ON );
// // 10Hz 自動取り込み(歩数計向け省電力モード)
// str_send_buf[0] = ( ACC_BITS_PM_LP10 << ACC_bP_PM0 | ACC_BITS_ALL_AXIS_ON );
} }
} }
iic_mcu_write( IIC_SLA_ACCEL, ( ACC_REG_CTRL1 | 0x80 ), 4, str_send_buf ); iic_mcu_write( IIC_SLA_ACCEL, ( ACC_REG_CTRL1 | 0x80 ), 4, str_send_buf );
if( ACC_VALID == 1 )
{
if( system_status.pwr_state == ON )
{
renge_task_immed_add( tsk_cbk_accero );
}
}
return ( ERR_SUCCESS ); return ( ERR_SUCCESS );
} }
@ -162,37 +304,16 @@ task_status_immed acc_hosu_set(){
I2Cが使用中かもしれないので I2Cが使用中かもしれないので
======================================================== */ ======================================================== */
__interrupt void intp23_ACC_ready(){ __interrupt void intp23_ACC_ready( )
if( ( vreg_ctr[ VREG_C_ACC_CONFIG ] & 0x03 ) != 0x00 ){ {
if(( system_status.pwr_state == ON ) || ( system_status.pwr_state == SLEEP ) ){ if( ( vreg_ctr[VREG_C_ACC_CONFIG] & 0x03 ) != 0x00 )
if( ACC_VALID ){ {
if( ( system_status.pwr_state == ON ) || ( system_status.pwr_state == SLEEP ) )
{
if( ACC_VALID )
{
renge_task_immed_add( tsk_cbk_accero ); renge_task_immed_add( tsk_cbk_accero );
} }
} }
} }
} }
/* ========================================================
todo : // 本物のマイコンなら、割り込みでタスクを登録
======================================================== */
task_interval tsk_soft_int(){
if( ( vreg_ctr[ VREG_C_ACC_CONFIG ] & 0x03 ) != 0x00 ){
if(( system_status.pwr_state == ON ) || ( system_status.pwr_state == SLEEP ) ){
// Hエッジ検出
// pin = ( pin << 1 ) + ( ACC_VALID? 1: 0 );
// if( ( pin & 0x03 ) == 0x01 ){
if( ACC_VALID ){
renge_task_immed_add( tsk_cbk_accero );
}
}
return( 0 );
}
return( 248 );
}

View File

@ -12,6 +12,7 @@
bit adc_updated; bit adc_updated;
#define INTERVAL_TSK_ADC 16
/* ======================================================== /* ========================================================
ADC設定と ADC設定と
@ -26,22 +27,41 @@ bit adc_updated;
8tics毎に呼ばれADCを停止します 8tics毎に呼ばれADCを停止します
   
======================================================== */ ======================================================== */
task_interval tsk_adc(){ void tsk_adc( )
{
static u8 task_interval = 0;
static u8 old_tune; static u8 old_tune;
static u8 sndvol_codec; static u8 sndvol_codec;
static u8 bt_temp_old; static u8 bt_temp_old;
if(( system_status.pwr_state == ON ) if( ( system_status.pwr_state == ON ) || ( system_status.pwr_state == SLEEP ) )
|| ( system_status.pwr_state == SLEEP )){ {
if( adc_updated ){ if( adc_updated )
{
if( task_interval != 0 )
{
task_interval -= 1;
return;
}
else
{
task_interval = ( INTERVAL_TSK_ADC / SYS_INTERVAL_TICK );
}
#if 0 #if 0
tune <EFBFBD> tune <EFBFBD>
// tune // tune
if( abs( old_tune - vreg_ctr[ VREG_TUNE ] ) >= 4 ){ if( abs( old_tune - vreg_ctr[VREG_TUNE] ) >= 4 )
{
old_tune = vreg_ctr[VREG_TUNE]; old_tune = vreg_ctr[VREG_TUNE];
vreg_ctr[VREG_C_IRQ0] |= REG_BIT_VR_TUNE_CHANGE; vreg_ctr[VREG_C_IRQ0] |= REG_BIT_VR_TUNE_CHANGE;
if( ( vreg_ctr[ VREG_C_IRQ_MASK0 ] & REG_BIT_VR_TUNE_CHANGE ) == 0 ){ if( ( vreg_ctr[VREG_C_IRQ_MASK0] & REG_BIT_VR_TUNE_CHANGE ) == 0 )
{
IRQ0_ast; IRQ0_ast;
} }
} }
@ -49,30 +69,43 @@ task_interval tsk_adc(){
// Volume // Volume
{ {
static u8 vol_old;
static u8 class_old; static u8 class_old;
u8 class; u8 class;
static u8 direction = 0; // 0:上り方向 static u8 direction = 0; // 0:上り方向
u8 comp; // 補正値 u8 comp; // 補正値
//*
if( abs( vol_old - vreg_ctr[VREG_C_SND_VOL] ) > 3 )
{
vol_old = vreg_ctr[VREG_C_SND_VOL];
class = vreg_ctr[VREG_C_SND_VOL] / ( 256 / 8 );
if( class != class_old )
{
class_old = class;
/*/
if( vol_old != vreg_ctr[ VREG_C_SND_VOL ] ){
vol_old = vreg_ctr[ VREG_C_SND_VOL ];
class = ( vreg_ctr[ VREG_C_SND_VOL ] + ( ( direction != 0 )? 0: 2 ) ) / ( 200 / 8 ) ; class = ( vreg_ctr[ VREG_C_SND_VOL ] + ( ( direction != 0 )? 0: 2 ) ) / ( 200 / 8 ) ;
if( class != class_old ){ if( class != class_old ){
direction = ( class > class_old )? 0: 1; direction = ( class > class_old )? 0: 1;
class_old = class; class_old = class;
*/
set_irq( VREG_C_IRQ0, REG_BIT_VR_SNDVOL_CHANGE ); set_irq( VREG_C_IRQ0, REG_BIT_VR_SNDVOL_CHANGE );
} }
}
} }
// codecに伝える // codecに伝える
if( vreg_ctr[ VREG_C_SND_VOL ] != sndvol_codec ){ if( vreg_ctr[VREG_C_SND_VOL] != sndvol_codec )
sndvol_codec = vreg_ctr[ VREG_C_SND_VOL ]; {
sndvol_codec = ( vreg_ctr[VREG_C_SND_VOL] / 2 + vreg_ctr[VREG_C_SND_VOL] / 4 );
#ifndef _CODEC_CTR_ #ifndef _CODEC_CTR_
iic_mcu_write_a_byte( IIC_SLA_DCP, 0, sndvol_codec ); iic_mcu_write_a_byte( IIC_SLA_DCP, 0, sndvol_codec );
// iic_mcu_write_a_byte( IIC_SLA_DCP, 0, (u8)((unsigned int)sndvol_codec * 4 / 5 ) ); // iic_mcu_write_a_byte( IIC_SLA_DCP, 0, (u8)((unsigned int)sndvol_codec * 4 / 5 ) );
#else #else
iic_mcu_write_a_byte( IIC_SLA_CODEC, REG_ADRS_CODEC_VOL, sndvol_codec );
iic_mcu_write_a_byte( IIC_SLA_CODEC, REG_ADRS_CODEC_VOL, sndvol_codec );
#endif #endif
} }
adc_updated = 0; adc_updated = 0;
@ -91,9 +124,10 @@ task_interval tsk_adc(){
// TUNE_LED ここかよ! // TUNE_LED ここかよ!
switch( vreg_ctr[ VREG_C_LED_TUNE ] ){ switch ( vreg_ctr[VREG_C_LED_TUNE] )
{
case ( 1 ): // 点灯 case ( 1 ): // 点灯
LED_duty_TUNE = 0; LED_duty_TUNE = vreg_ctr[VREG_C_LED_BRIGHT];
break; break;
case ( 2 ): // case ( 2 ): //
@ -101,10 +135,9 @@ task_interval tsk_adc(){
break; break;
default: // 消灯 default: // 消灯
LED_duty_TUNE = vreg_ctr[ VREG_C_LED_BRIGHT ]; LED_duty_TUNE = 0;
break; break;
} }
return( 8 );
} }
} }
@ -114,21 +147,29 @@ task_interval tsk_adc(){
   
 使  使
======================================================== */ ======================================================== */
static u8 getmean3( u8* hist ){ static u8 getmean3( u8 * hist )
{
u8 temp; u8 temp;
if( *hist < *( hist+1 ) ){ if( *hist < *( hist + 1 ) )
{
temp = *hist; temp = *hist;
*hist = *( hist + 1 ); *hist = *( hist + 1 );
*( hist + 1 ) = temp; *( hist + 1 ) = temp;
} }
if( !( *hist > *(hist+1) )){ if( !( *hist > *( hist + 1 ) ) )
{
return *hist; return *hist;
}else{ }
if( *(hist+1) > *(hist+2) ){ else
{
if( *( hist + 1 ) > *( hist + 2 ) )
{
return *( hist + 1 ); return *( hist + 1 );
}else{ }
else
{
return *( hist + 2 ); return *( hist + 2 );
} }
} }
@ -139,7 +180,8 @@ static u8 getmean3( u8* hist ){
   
     
======================================================== */ ======================================================== */
__interrupt void int_adc(){ __interrupt void int_adc( )
{
static u8 hist_tune[3]; static u8 hist_tune[3];
static u8 hist_snd_vol[3]; static u8 hist_snd_vol[3];
static u8 hist_bt_temp[3]; static u8 hist_bt_temp[3];
@ -147,7 +189,8 @@ __interrupt void int_adc(){
u8 temp; u8 temp;
EI( ); EI( );
switch( ADS ){ switch ( ADS )
{
case ( ADC_SEL_TUNE ): case ( ADC_SEL_TUNE ):
hist_tune[index] = ADCRH; hist_tune[index] = ADCRH;
vreg_ctr[VREG_C_TUNE] = getmean3( hist_tune ); vreg_ctr[VREG_C_TUNE] = getmean3( hist_tune );
@ -172,9 +215,12 @@ __interrupt void int_adc(){
// もっとまともな書き方がありそうだ // もっとまともな書き方がありそうだ
// if( ADS == ADC_SEL_BATT_DET ){ // if( ADS == ADC_SEL_BATT_DET ){
if( ADS != ADC_SEL_BATT_TEMP ){ // 電池判別は電源投入の一回のみ if( ADS != ADC_SEL_BATT_TEMP )
{ // 電池判別は電源投入の一回のみ
ADS += 1; // 次のチャンネル ADS += 1; // 次のチャンネル
}else{ }
else
{
ADCEN = 0; // 止めてしまう ADCEN = 0; // 止めてしまう
adc_updated = 1; adc_updated = 1;
index = ( index == 2 ) ? 0 : ( index + 1 ); index = ( index == 2 ) ? 0 : ( index + 1 );
@ -186,7 +232,8 @@ __interrupt void int_adc(){
/* ======================================================== /* ========================================================
tsk_adcと競合することを考慮していません tsk_adcと競合することを考慮していません
======================================================== */ ======================================================== */
u8 get_adc( u8 ch ){ u8 get_adc( u8 ch )
{
u8 temp; u8 temp;
ADMK = 1; ADMK = 1;
@ -201,10 +248,11 @@ u8 get_adc( u8 ch ){
ADCS = 1; // AD開始。 /// ここまでに、1us以上開ける ADCS = 1; // AD開始。 /// ここまでに、1us以上開ける
ADMK = 0; ADMK = 0;
while( ADIF == 0 ){;} while( ADIF == 0 )
{;
}
temp = ADCRH; temp = ADCRH;
ADCEN = 0; ADCEN = 0;
return ( temp ); return ( temp );
} }

View File

@ -3,6 +3,7 @@
MEMORY BCL0:(00000H, 01000H ) MEMORY BCL0:(00000H, 01000H )
;MEMORY BCL1:(01000H, 01000H ) ; バックアップ領域 ;MEMORY BCL1:(01000H, 01000H ) ; バックアップ領域
MEMORY ROM :(02000H, 02800H ) MEMORY ROM :(02000H, 02800H )
;MEMORY ROM :(02000H, 04000H )
;MEMORY ROM_:(04800H, 02800H ) ; バックアップ領域 ;MEMORY ROM_:(04800H, 02800H ) ; バックアップ領域
;MEMORY FSL :(07000H, 00C00H ) ; 過去の名残。いらない ;MEMORY FSL :(07000H, 00C00H ) ; 過去の名残。いらない
;MEMORY OCD :(0FC00H, 00400H ) ; OCDが使っているらしい ;MEMORY OCD :(0FC00H, 00400H ) ; OCDが使っているらしい
@ -13,7 +14,8 @@ MEMORY ROM :(02000H, 02800H )
; ブートブロック0に割り当てる ; ブートブロック0に割り当てる
MERGE LDR_CODE: =BCL0 MERGE LDR_CODE: =BCL0
MERGE LDR_CODL: =BCL0 MERGE LDR_CODL: =BCL0
MERGE @@LCODE : AT( 0E00H ) =BCL0 ; スタートアップルーチン ;MERGE @@LCODE : AT( 0E00H ) =BCL0 ; スタートアップルーチン
MERGE @@LCODE : =BCL0 ; スタートアップルーチン
;MERGE LDR_RINT:=BCL0 ;MERGE LDR_RINT:=BCL0
;MERGE LDR_CNST:=BCL0 ;MERGE LDR_CNST:=BCL0

View File

@ -2,7 +2,8 @@
#define __bsr_system__ #define __bsr_system__
// イベントループのステート // イベントループのステート
enum pwr_state_{ enum pwr_state_
{
OFF_TRIG = 0, OFF_TRIG = 0,
OFF, OFF,
ON_TRIG, ON_TRIG,
@ -12,21 +13,24 @@ enum pwr_state_{
// WAKE, // WAKE,
}; };
enum poweron_reason_{ enum poweron_reason_
{
PWSW = 0, PWSW = 0,
RTC_ALARM, RTC_ALARM,
}; };
// タスクシステムの状態情報など // タスクシステムの状態情報など
typedef struct{ typedef struct
{
enum pwr_state_ pwr_state; enum pwr_state_ pwr_state;
enum poweron_reason_ poweron_reason; enum poweron_reason_ poweron_reason;
unsigned char dipsw0:1; unsigned char dipsw0:1;
unsigned char dipsw1:1; unsigned char dipsw1:1;
unsigned char dipsw2:1; unsigned char dipsw2:1;
unsigned char reboot:1; unsigned char reboot:1;
}system_status_; }
system_status_;
extern system_status_ system_status; extern system_status_ system_status;

View File

@ -5,9 +5,8 @@
//#define _debug_led_ //#define _debug_led_
#define MCU_VER_MAJOR 0; #define MCU_VER_MAJOR 0;
#define MCU_VER_MINOR 4; #define MCU_VER_MINOR 6;
//#define _MODEL_TEG2_ //#define _MODEL_TEG2_

View File

@ -205,7 +205,8 @@ extern fsl_u08 FSL_Write(fsl_u32 s_address_u32, fsl_u08 word_count_u08);
/* = 0x1E(FSL_ERR_EEP_BLANKCHECK), blankcheck error */ /* = 0x1E(FSL_ERR_EEP_BLANKCHECK), blankcheck error */
/* = 0x1F(FSL_ERR_INTERRUPTION), write interrupted by user interrupt */ /* = 0x1F(FSL_ERR_INTERRUPTION), write interrupted by user interrupt */
/*----------------------------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------------------------*/
extern fsl_u08 FSL_EEPROMWrite(fsl_u32 s_address_u32, fsl_u08 word_count_u08); extern fsl_u08 FSL_EEPROMWrite( fsl_u32 s_address_u32,
fsl_u08 word_count_u08 );
/*----------------------------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------------------------*/
@ -259,7 +260,8 @@ extern fsl_u08 FSL_GetActiveBootCluster(fsl_u08* destination_pu08);
/* = 0x00(FSL_OK), normal */ /* = 0x00(FSL_OK), normal */
/* = 0x05(FSL_ERR_PARAMETER), parameter error */ /* = 0x05(FSL_ERR_PARAMETER), parameter error */
/*----------------------------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------------------------*/
extern fsl_u08 FSL_GetBlockEndAddr(fsl_u32* destination_pu32, fsl_u16 block_u16); extern fsl_u08 FSL_GetBlockEndAddr( fsl_u32 * destination_pu32,
fsl_u16 block_u16 );
/*----------------------------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------------------------*/
@ -273,7 +275,8 @@ extern fsl_u08 FSL_GetBlockEndAddr(fsl_u32* destination_pu32, fsl_u16 block_u16
/* = 0x00(FSL_OK), normal */ /* = 0x00(FSL_OK), normal */
/* = 0x05(FSL_ERR_PARAMETER), parameter error */ /* = 0x05(FSL_ERR_PARAMETER), parameter error */
/*----------------------------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------------------------*/
extern fsl_u08 FSL_GetFlashShieldWindow(fsl_u16* start_block_pu16, fsl_u16* end_block_pu16); extern fsl_u08 FSL_GetFlashShieldWindow( fsl_u16 * start_block_pu16,
fsl_u16 * end_block_pu16 );
/*----------------------------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------------------------*/
@ -291,7 +294,8 @@ extern fsl_u08 FSL_GetFlashShieldWindow(fsl_u16* start_block_pu16, fsl_u16* end
/* = 0x1B(FSL_ERR_IVERIFY), internal verify error */ /* = 0x1B(FSL_ERR_IVERIFY), internal verify error */
/* = 0x1F(FSL_ERR_INTERRUPTION), write interrupted by user interrupt */ /* = 0x1F(FSL_ERR_INTERRUPTION), write interrupted by user interrupt */
/*----------------------------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------------------------*/
extern fsl_u08 FSL_SetFlashShieldWindow(fsl_u16 start_block_u16, fsl_u16 end_block_u16); extern fsl_u08 FSL_SetFlashShieldWindow( fsl_u16 start_block_u16,
fsl_u16 end_block_u16 );
/*----------------------------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------------------------*/

View File

@ -10,8 +10,10 @@
#ifndef _PMIC_CTR_ #ifndef _PMIC_CTR_
#define IRQ0_neg { PM3.0 = 1; } #define IRQ0_neg { PM3.0 = 1; }
#define IRQ0 ( P3.0 )
#else #else
#define IRQ0_neg { PM7.6 = 1; } #define IRQ0_neg { PM7.6 = 1; }
#define IRQ0 ( P7.6 )
#endif #endif
@ -54,7 +56,8 @@
/* ======================================================== /* ========================================================
======================================================== */ ======================================================== */
enum{ enum
{
IIC_IDLE = 0, IIC_IDLE = 0,
IIC_RCV_REG_ADRS, IIC_RCV_REG_ADRS,
IIC_TX_OR_RX, IIC_TX_OR_RX,
@ -64,14 +67,16 @@ enum{
// 1バイト送受の度に割り込みが発生するバージョン // 1バイト送受の度に割り込みが発生するバージョン
__interrupt void int_iic_ctr(){ __interrupt void int_iic_ctr( )
{
static u8 state = IIC_IDLE; static u8 state = IIC_IDLE;
static u8 reg_adrs; static u8 reg_adrs;
static u8 reg_adrs_internal; static u8 reg_adrs_internal;
static u8 trx_buf; static u8 trx_buf;
if( SPD ){ if( SPD )
{
state = IIC_IDLE; state = IIC_IDLE;
SPIE = 0; SPIE = 0;
// I2C終了時に何かする物 // // I2C終了時に何かする物 //
@ -80,7 +85,8 @@ __interrupt void int_iic_ctr(){
} }
// 読み出し終了 // 読み出し終了
if( !ACKD ){ if( !ACKD )
{
state = IIC_IDLE; state = IIC_IDLE;
SPIE = 0; SPIE = 0;
LREL = 1; LREL = 1;
@ -88,20 +94,37 @@ __interrupt void int_iic_ctr(){
rtc_unlock( ); rtc_unlock( );
// レジスタリードで、割り込みピンの設定 // レジスタリードで、割り込みピンの設定
IRQ0_neg; // if( ( reg_adrs - 1 ) == VREG_C_IRQ3 ){
// IRQ0_neg;
if( !( ( vreg_ctr[VREG_C_IRQ0] == 0 ) if( !( ( vreg_ctr[VREG_C_IRQ0] == 0 )
&& ( vreg_ctr[VREG_C_IRQ1] == 0 ) && ( vreg_ctr[VREG_C_IRQ1] == 0 )
&& ( vreg_ctr[ VREG_C_IRQ2 ] == 0 ) && ( vreg_ctr[VREG_C_IRQ2] == 0 ) && ( vreg_ctr[VREG_C_IRQ3] == 0 ) ) )
&& ( vreg_ctr[ VREG_C_IRQ3 ] == 0 ) {
) ){ IRQ0_neg;
while( !IRQ0 )
{;
}
IRQ0_ast; IRQ0_ast;
} }
else
{
IRQ0_neg;
// }
}
return; return;
} }
if( STD )
{
if( ( state == IIC_TX ) || ( state == IIC_RX ) )
{
state = IIC_IDLE;
rtc_unlock( );
}
}
switch( state ){ switch ( state )
{
case ( IIC_IDLE ): case ( IIC_IDLE ):
// 自局呼び出しに応答。 // 自局呼び出しに応答。
// 初期化など // 初期化など
@ -121,28 +144,37 @@ __interrupt void int_iic_ctr(){
case ( IIC_TX_OR_RX ): case ( IIC_TX_OR_RX ):
// if( TRC ){ // 送信方向フラグ // if( TRC ){ // 送信方向フラグ
if( STD ){ // スタートコンディション検出フラグ if( STD )
{ // スタートコンディション検出フラグ
// リードされる // リードされる
if( COI ){ // アドレス一致フラグ if( COI )
{ // アドレス一致フラグ
state = IIC_TX; state = IIC_TX;
// no break, no return // // no break, no return //
}else{ }
else
{
// リスタートで違うデバイスが呼ばれた! // リスタートで違うデバイスが呼ばれた!
state = IIC_IDLE; // 終了処理 state = IIC_IDLE; // 終了処理
SPIE = 0; SPIE = 0;
LREL = 1; // ウェイト解除? LREL = 1; // ウェイト解除?
return; return;
} }
}else{ }
else
{
state = IIC_RX; // データ1バイト受信の割り込みだった state = IIC_RX; // データ1バイト受信の割り込みだった
// no break, no return // // no break, no return //
} }
default: default:
if( state == IIC_TX ){ // 送信 if( state == IIC_TX )
{ // 送信
IICA = trx_buf; IICA = trx_buf;
vreg_ctr_after_read( reg_adrs ); // 読んだらクリアなどの処理 vreg_ctr_after_read( reg_adrs ); // 読んだらクリアなどの処理
}else{ }
else
{
// RX // RX
trx_buf = IICA; trx_buf = IICA;
vreg_ctr_write( reg_adrs, trx_buf ); vreg_ctr_write( reg_adrs, trx_buf );
@ -150,7 +182,8 @@ __interrupt void int_iic_ctr(){
} }
reg_adrs += 1; reg_adrs += 1;
// reg_adrs_internal = adrs_table_ctr_ext2int( reg_adrs ); // reg_adrs_internal = adrs_table_ctr_ext2int( reg_adrs );
if( state == IIC_TX ){ if( state == IIC_TX )
{
trx_buf = vreg_ctr_read( reg_adrs ); trx_buf = vreg_ctr_read( reg_adrs );
// temp = vreg_ctr[ reg_adrs ]; // temp = vreg_ctr[ reg_adrs ];
} }
@ -162,13 +195,15 @@ __interrupt void int_iic_ctr(){
#if 0 #if 0
// 一度通信が始まったら終わるまで戻らないバージョン // 一度通信が始まったら終わるまで戻らないバージョン
__interrupt void int_iic_ctr(){ __interrupt void int_iic_ctr( )
{
static u8 state = 0; static u8 state = 0;
static u8 reg_adrs; static u8 reg_adrs;
// static u8 reg_adrs_internal; // static u8 reg_adrs_internal;
static u8 trx_buf; static u8 trx_buf;
if( SPD ){ if( SPD )
{
return; return;
} }
@ -176,7 +211,9 @@ __interrupt void int_iic_ctr(){
// 初期化など // 初期化など
WREL = 1; // ウェイト解除 WREL = 1; // ウェイト解除
while( !IICAIF ){;} while( !IICAIF )
{;
}
IICAIF = 0; IICAIF = 0;
// レジスタアドレス受信 // レジスタアドレス受信
@ -184,47 +221,66 @@ __interrupt void int_iic_ctr(){
WREL = 1; WREL = 1;
trx_buf = vreg_ctr_read( reg_adrs ); // データの準備をしておく trx_buf = vreg_ctr_read( reg_adrs ); // データの準備をしておく
while( !IICAIF ){;} while( !IICAIF )
{;
}
IICAIF = 0; IICAIF = 0;
if( STD ){ // リスタートコンディション if( STD )
{ // リスタートコンディション
// リードされる // リードされる
if( COI ){ if( COI )
{
state = IIC_TX; state = IIC_TX;
}else{ }
else
{
// リスタートで違うデバイスが呼ばれた! // リスタートで違うデバイスが呼ばれた!
WREL = 1; // ウェイト解除? WREL = 1; // ウェイト解除?
state = IIC_IDLE; // 終了処理 state = IIC_IDLE; // 終了処理
SPIE = 0; SPIE = 0;
return; return;
} }
}else{ // ライト続行 }
else
{ // ライト続行
state = IIC_RX; state = IIC_RX;
} }
if( state == IIC_TX ){ if( state == IIC_TX )
{
// 送信 // // 送信 //
do{ do
{
IICA = trx_buf; IICA = trx_buf;
vreg_ctr_after_read( reg_adrs ); // 読んだらクリアなどの処理 vreg_ctr_after_read( reg_adrs ); // 読んだらクリアなどの処理
reg_adrs += 1; reg_adrs += 1;
trx_buf = vreg_ctr_read( reg_adrs ); trx_buf = vreg_ctr_read( reg_adrs );
while( !IICAIF ){;} while( !IICAIF )
{;
}
IICAIF = 0; IICAIF = 0;
}while( ACKD ); }
while( ACKD );
LREL = 1; LREL = 1;
}else{ }
else
{
// 受信 // // 受信 //
SPIE = 1; SPIE = 1;
do{ do
{
trx_buf = IICA; trx_buf = IICA;
vreg_ctr_write( reg_adrs, trx_buf ); vreg_ctr_write( reg_adrs, trx_buf );
reg_adrs += 1; reg_adrs += 1;
WREL = 1; WREL = 1;
while( !IICAIF ){;} while( !IICAIF )
{;
}
IICAIF = 0; IICAIF = 0;
}while( !SPD ); }
while( !SPD );
SPIE = 0; SPIE = 0;
} }
state = IIC_IDLE; state = IIC_IDLE;
@ -234,7 +290,8 @@ __interrupt void int_iic_ctr(){
// ======================================================== // ========================================================
void IIC_ctr_Init( void ){ void IIC_ctr_Init( void )
{
IICAEN = 1; IICAEN = 1;
@ -265,7 +322,7 @@ void IIC_ctr_Init( void ){
IICWH = 8; IICWH = 8;
IICWL = 10; // L期間の長さ IICWL = 10; // L期間の長さ
SMC = 1; SMC = 1; // 高速モード
IICAMK = 0; // 割り込みを許可 IICAMK = 0; // 割り込みを許可
@ -280,8 +337,8 @@ void IIC_ctr_Init( void ){
// ======================================================== // ========================================================
void IIC_ctr_Stop( void ){ void IIC_ctr_Stop( void )
{
IICE = 0; /* IICA disable */ IICE = 0; /* IICA disable */
IICAEN = 0; IICAEN = 0;
} }

View File

@ -63,25 +63,31 @@ u8 iic_mcu_bus_status; //
======================================================== */ ======================================================== */
u8 iic_mcu_read_a_byte( u8 SLA, u8 adrs ){ u8 iic_mcu_read_a_byte( u8 SLA, u8 adrs )
{
u8 dat; u8 dat;
if( iic_mcu_initialized == 0 ){ if( iic_mcu_initialized == 0 )
{
#ifdef _debug_ #ifdef _debug_
iic_mcu_start( ); iic_mcu_start( );
#else #else
while(1){}; while( 1 )
{
};
#endif #endif
} }
while( iic_mcu_busy ){ while( iic_mcu_busy )
{
NOP( ); NOP( );
} }
iic_mcu_busy = 1; iic_mcu_busy = 1;
iic_mcu_bus_status = ERR_OK; iic_mcu_bus_status = ERR_OK;
// スタートコンディションとスレーブの呼び出し、レジスタアドレスの送信 // スタートコンディションとスレーブの呼び出し、レジスタアドレスの送信
if( iic_mcu_call_slave( SLA ) != 0 ){ if( iic_mcu_call_slave( SLA ) != 0 )
{
iic_mcu_bus_status = ERR_NOSLAVE; iic_mcu_bus_status = ERR_NOSLAVE;
iic_mcu_busy = 0; iic_mcu_busy = 0;
return ( 0 ); return ( 0 );
@ -103,8 +109,10 @@ u8 iic_mcu_read_a_byte( u8 SLA, u8 adrs ){
IICIF10 = 0; IICIF10 = 0;
SIO10 = 0xFF; // ダミーデータを書くと受信開始 SIO10 = 0xFF; // ダミーデータを書くと受信開始
while( IICIF10 == 0 ){ // 受信完了待ち while( IICIF10 == 0 )
;} { // 受信完了待ち
;
}
dat = SIO10; dat = SIO10;
iic_mcu_send_sp( ); iic_mcu_send_sp( );
@ -125,18 +133,23 @@ u8 iic_mcu_read_a_byte( u8 SLA, u8 adrs ){
======================================================== */ ======================================================== */
err iic_mcu_read( u8 slave, u8 adrs, u8 len, u8* dest ){ err iic_mcu_read( u8 slave, u8 adrs, u8 len, u8 * dest )
{
//* //*
// 使用中なら待つ // 使用中なら待つ
if( iic_mcu_initialized == 0 ){ if( iic_mcu_initialized == 0 )
{
#ifdef _debug_ #ifdef _debug_
iic_mcu_start( ); iic_mcu_start( );
#else #else
while(1){}; while( 1 )
{
};
#endif #endif
} }
while( iic_mcu_busy ){ while( iic_mcu_busy )
{
NOP( ); NOP( );
} }
/*/ /*/
@ -151,7 +164,8 @@ err iic_mcu_read( u8 slave, u8 adrs, u8 len, u8* dest ){
iic_mcu_busy = 1; iic_mcu_busy = 1;
// スタートコンディションとスレーブの呼び出し、レジスタアドレスの送信 // スタートコンディションとスレーブの呼び出し、レジスタアドレスの送信
if( iic_mcu_call_slave( slave ) != 0 ){ if( iic_mcu_call_slave( slave ) != 0 )
{
iic_mcu_busy = 0; iic_mcu_busy = 0;
return ( ERR_NAK ); return ( ERR_NAK );
} }
@ -169,18 +183,23 @@ err iic_mcu_read( u8 slave, u8 adrs, u8 len, u8* dest ){
SCR02 = RXE0 | 1 << SLC02 | 7 << DLS02; // 受信設定 SCR02 = RXE0 | 1 << SLC02 | 7 << DLS02; // 受信設定
SS0 = 0x0004; // 通信待機 SS0 = 0x0004; // 通信待機
do{ do
if( len == 1 ){ {
if( len == 1 )
{
SOE0 = 0x0000; // 最後のNAK SOE0 = 0x0000; // 最後のNAK
} }
IICIF10 = 0; IICIF10 = 0;
SIO10 = 0xFF; // ダミーデータを書くと受信開始 SIO10 = 0xFF; // ダミーデータを書くと受信開始
while( IICIF10 == 0 ){ // 受信完了待ち while( IICIF10 == 0 )
;} { // 受信完了待ち
;
}
*dest = SIO10; *dest = SIO10;
dest++; dest++;
len--; len--;
}while( len != 0 ); }
while( len != 0 );
iic_mcu_send_sp( ); iic_mcu_send_sp( );
@ -198,16 +217,21 @@ err iic_mcu_read( u8 slave, u8 adrs, u8 len, u8* dest ){
 iic_mcu_write   iic_mcu_write 
======================================================== */ ======================================================== */
err iic_mcu_write_a_byte( u8 SLA, u8 adrs, u8 dat ){ err iic_mcu_write_a_byte( u8 SLA, u8 adrs, u8 dat )
{
if( iic_mcu_initialized == 0 ){ if( iic_mcu_initialized == 0 )
{
#ifdef _debug_ #ifdef _debug_
iic_mcu_start( ); iic_mcu_start( );
#else #else
while(1){}; while( 1 )
{
};
#endif #endif
} }
while( iic_mcu_busy ){ while( iic_mcu_busy )
{
NOP( ); NOP( );
} }
iic_mcu_busy = 1; iic_mcu_busy = 1;
@ -218,7 +242,8 @@ err iic_mcu_write_a_byte( u8 SLA, u8 adrs, u8 dat ){
#else #else
// スタートコンディションとスレーブの呼び出し... // スタートコンディションとスレーブの呼び出し...
IICMK10 = 1; IICMK10 = 1;
if( iic_mcu_call_slave( SLA ) != 0 ){ if( iic_mcu_call_slave( SLA ) != 0 )
{
iic_mcu_busy = 0; iic_mcu_busy = 0;
return ( ERR_NAK ); return ( ERR_NAK );
} }
@ -247,17 +272,22 @@ err iic_mcu_write_a_byte( u8 SLA, u8 adrs, u8 dat ){
DMA1を使用します DMA1を使用します
******************************************************************************/ ******************************************************************************/
err iic_mcu_write( u8 slave, u8 adrs, u8 len, u8* src ){ err iic_mcu_write( u8 slave, u8 adrs, u8 len, u8 * src )
{
//* //*
// 使用中なら待つ // 使用中なら待つ
if( iic_mcu_initialized == 0 ){ if( iic_mcu_initialized == 0 )
{
#ifdef _debug_ #ifdef _debug_
iic_mcu_start( ); iic_mcu_start( );
#else #else
while(1){}; while( 1 )
{
};
#endif #endif
} }
while( iic_mcu_busy ){ while( iic_mcu_busy )
{
NOP( ); NOP( );
} }
/*/ /*/
@ -273,20 +303,24 @@ err iic_mcu_write( u8 slave, u8 adrs, u8 len, u8* src ){
// スタートコンディションとスレーブの呼び出し... // スタートコンディションとスレーブの呼び出し...
IICMK10 = 1; IICMK10 = 1;
IICIF10 = 0; IICIF10 = 0;
if( iic_mcu_call_slave( slave ) != 0 ){ if( iic_mcu_call_slave( slave ) != 0 )
{
iic_mcu_busy = 0; iic_mcu_busy = 0;
EI( ); EI( );
return ( ERR_NAK ); return ( ERR_NAK );
} }
IICIF10 = 0; IICIF10 = 0;
if( !iic_mcu_wo_dma ){ if( !iic_mcu_wo_dma )
{
// DMAを使用する通常 // DMAを使用する通常
// レジスタアドレスを送り、データの準備 // レジスタアドレスを送り、データの準備
memcpy( iic_send_work, src, 4 ); //バッファとして4バイトしか用意して無いため。 memcpy( iic_send_work, src, 4 ); //バッファとして4バイトしか用意して無いため。
// DMAセット // DMAセット
while( DST1 ){;}; while( DST1 )
{;
};
DEN1 = 1; DEN1 = 1;
DSA1 = ( u8 ) ( &SIO10 ); DSA1 = ( u8 ) ( &SIO10 );
@ -300,7 +334,9 @@ err iic_mcu_write( u8 slave, u8 adrs, u8 len, u8* src ){
SIO10 = adrs; // 書きっぱなし! 割り込みが発生してDMAスタート SIO10 = adrs; // 書きっぱなし! 割り込みが発生してDMAスタート
// 残りは割り込みルーチン内で // 残りは割り込みルーチン内で
}else{ }
else
{
// DMAを使用しない // // DMAを使用しない //
// レジスタアドレスの送信 // レジスタアドレスの送信
@ -321,21 +357,27 @@ err iic_mcu_write( u8 slave, u8 adrs, u8 len, u8* src ){
DMA転送終了割り込み DMA転送終了割り込み
IIC_mcu IIC_mcu
DMA転送が終わっただけでI2Cの転送は終わってません DMA転送が終わっただけでI2Cの転送は終わってません
  DMA1の処理が遅延した場合
IIC10の割り込みの準備ができずに
 DMA仕様の差異は
======================================================== */ ======================================================== */
__interrupt void int_dma1(){ __interrupt void int_dma1( )
IICIF10 = 0; {
u16 i = 0;
DMAMK1 = 1; DMAMK1 = 1;
DEN1 = 0; DEN1 = 0;
IICMK10 = 1; while( ( SSR02L & TSF0 ) != 0 )
while(( SSR02L & TSF0 ) != 0 ){; {
if( ++i == 0 ) // タイムアウト?
{
break;
}
} }
// 最後のバイト転送後、I2C割り込みが発生する
// ↓
// 共通(最終バイト送信完了) // iic_mcu_send_sp(); // ISR中で外の関数を呼ぶのは都合が悪いので展開
IICMK10 = 1;
// ISR中で外の関数を呼ぶのは都合が悪いので展開
// iic_mcu_send_sp();
{ {
ST0 = 0x0004; ST0 = 0x0004;
SOE0 = 0; // 受信の時はもっと前に「も」設定してる。(NACK出力) SOE0 = 0; // 受信の時はもっと前に「も」設定してる。(NACK出力)
@ -351,31 +393,28 @@ __interrupt void int_dma1(){
NOP( ); NOP( );
SO0 = 0x0404 | TAUS_MASK; SO0 = 0x0404 | TAUS_MASK;
} }
iic_mcu_wo_dma = 0;
iic_mcu_busy = 0; iic_mcu_busy = 0;
} }
/* ======================================================== /* ========================================================
IIC MCUのバイト送出完了割り込み IIC MCUのバイト送出完了割り込み
DMA使用時は使用されません
======================================================== */ ======================================================== */
__interrupt void int_iic10(){ __interrupt void int_iic10( )
if( iic_mcu_wo_dma ){ {
// DMA使用せず、転送途中 if( iic_send_wo_dma_len != 0 )
if( iic_send_wo_dma_len != 0 ){ {
SIO10 = *p_iic_send_wo_dma_dat; SIO10 = *p_iic_send_wo_dma_dat;
p_iic_send_wo_dma_dat++; p_iic_send_wo_dma_dat++;
iic_send_wo_dma_len--; iic_send_wo_dma_len--;
return; return;
} }
iic_mcu_wo_dma = 0;
} // 最後のバイト送信完了
// 共通(最終バイト送信完了)
IICMK10 = 1; IICMK10 = 1;
// ISR中で外の関数を呼ぶのは都合が悪いので展開 // iic_mcu_send_sp(); // ISR中で外の関数を呼ぶのは都合が悪いので展開
// iic_mcu_send_sp();
{ {
ST0 = 0x0004; ST0 = 0x0004;
SOE0 = 0; // 受信の時はもっと前に「も」設定してる。(NACK出力) SOE0 = 0; // 受信の時はもっと前に「も」設定してる。(NACK出力)
@ -391,6 +430,7 @@ __interrupt void int_iic10(){
NOP( ); NOP( );
SO0 = 0x0404 | TAUS_MASK; SO0 = 0x0404 | TAUS_MASK;
} }
iic_mcu_wo_dma = 0;
iic_mcu_busy = 0; iic_mcu_busy = 0;
} }
@ -402,11 +442,13 @@ __interrupt void int_iic10(){
ACK                  0 ACK                  0
 NACK   1  NACK   1
======================================================== */ ======================================================== */
static err iic_mcu_call_slave( u8 slave ){ static err iic_mcu_call_slave( u8 slave )
{
iic_mcu_send_st( ); iic_mcu_send_st( );
// SIR02 = SSR02; // NAKエラーのフラグクリア // SIR02 = SSR02; // NAKエラーのフラグクリア
if( iic_mcu_send_a_byte( slave ) != 0 ){ if( iic_mcu_send_a_byte( slave ) != 0 )
{
iic_mcu_send_sp( ); iic_mcu_send_sp( );
return ( ERR_NAK ); // 指定のスレーブがいない / busy return ( ERR_NAK ); // 指定のスレーブがいない / busy
} }
@ -420,14 +462,17 @@ static err iic_mcu_call_slave( u8 slave ){
======================================================== */ ======================================================== */
static err iic_mcu_send_a_byte( u8 dat ){ static err iic_mcu_send_a_byte( u8 dat )
{
IICIF10 = 0; IICIF10 = 0;
SIO10 = dat; SIO10 = dat;
while( IICIF10 == 0 ){ while( IICIF10 == 0 )
{
NOP( ); NOP( );
} // 通信中 } // 通信中
if( SSR02 != 0 ){ if( SSR02 != 0 )
{
SIR02 = SSR02; SIR02 = SSR02;
return ( ERR_NAK ); return ( ERR_NAK );
} }
@ -440,7 +485,8 @@ static err iic_mcu_send_a_byte( u8 dat ){
======================================================== */ ======================================================== */
static void iic_mcu_send_st(){ static void iic_mcu_send_st( )
{
SO0 &= ~0x0004; // SDA SO0 &= ~0x0004; // SDA
NOP( ); NOP( );
NOP( ); NOP( );
@ -458,7 +504,8 @@ static void iic_mcu_send_st(){
/* ======================================================== /* ========================================================
======================================================== */ ======================================================== */
static void iic_mcu_send_re_st(){ static void iic_mcu_send_re_st( )
{
ST0 |= 0x0004; ST0 |= 0x0004;
SO0 |= 0x0400 | TAUS_MASK; // ( SDA = H ), SCL -> H SO0 |= 0x0400 | TAUS_MASK; // ( SDA = H ), SCL -> H
NOP( ); NOP( );
@ -479,7 +526,8 @@ static void iic_mcu_send_re_st(){
======================================================== */ ======================================================== */
static void iic_mcu_send_sp(){ static void iic_mcu_send_sp( )
{
ST0 = 0x0004; ST0 = 0x0004;
SOE0 = 0; // 受信の時はもっと前に「も」設定してる。(NACK出力) SOE0 = 0; // 受信の時はもっと前に「も」設定してる。(NACK出力)
SO0 = 0x0000 | TAUS_MASK; // SCL SO0 = 0x0000 | TAUS_MASK; // SCL
@ -501,7 +549,8 @@ static void iic_mcu_send_sp(){
( (
======================================================== */ ======================================================== */
void iic2m_bus_reset(){ void iic2m_bus_reset( )
{
/* /*
u8 count; u8 count;
for( count = 19; count != 0; count-- ){ for( count = 19; count != 0; count-- ){
@ -525,7 +574,8 @@ void iic2m_bus_reset(){
/* ======================================================== /* ========================================================
======================================================== */ ======================================================== */
void iic_mcu_start(){ void iic_mcu_start( )
{
DST1 = 0; DST1 = 0;
DEN1 = 0; DEN1 = 0;
I2C_PU = 1; I2C_PU = 1;
@ -551,8 +601,11 @@ void iic_mcu_start(){
使 使
======================================================== */ ======================================================== */
void iic_mcu_stop(){ void iic_mcu_stop( )
while( iic_mcu_busy ){;} // DMA動作中はもう少し待つ {
while( iic_mcu_busy )
{;
} // DMA動作中はもう少し待つ
iic_mcu_send_re_st( ); // SCL,SDAをLLにする iic_mcu_send_re_st( ); // SCL,SDAをLLにする
I2C_PU = 0; I2C_PU = 0;
SAU0EN = 0; SAU0EN = 0;

View File

@ -44,8 +44,12 @@ extern u8 vreg_twl[];
#ifndef _MCU_BSR_ #ifndef _MCU_BSR_
// ke3の時はダミー関数 // ke3の時はダミー関数
void IIC_twl_Stop( void ){} void IIC_twl_Stop( void )
void IIC_twl_Init( void ){} {
}
void IIC_twl_Init( void )
{
}
#else #else
@ -75,7 +79,8 @@ u16 tot;
} }
__interrupt void int_iic_twl(){ __interrupt void int_iic_twl( )
{
u8 temp; u8 temp;
u16 tot = 0; u16 tot = 0;
@ -103,8 +108,10 @@ __interrupt void int_iic_twl(){
// 3回目 // 3回目
// スタートコンディションか、データ受信完了フラグ待ち // スタートコンディションか、データ受信完了フラグ待ち
while( 1 ){ while( 1 )
if( IICAIF == 1 ){ {
if( IICAIF == 1 )
{
// 受信 // // 受信 //
IICAIF = 0; IICAIF = 0;
temp = IICA; temp = IICA;
@ -116,14 +123,17 @@ __interrupt void int_iic_twl(){
vreg_twl_write( vreg_adrs, temp ); vreg_twl_write( vreg_adrs, temp );
return; // 受信おしまい // return; // 受信おしまい //
}else if( STD ){ }
else if( STD )
{
// 送信 // (スタートコンディション検出) // 送信 // (スタートコンディション検出)
pre_dat = vreg_twl_read( vreg_adrs ); // mcu内部アドレスを渡す。一バイト目の準備 IICBに書き込むとウェイト解除 pre_dat = vreg_twl_read( vreg_adrs ); // mcu内部アドレスを渡す。一バイト目の準備 IICBに書き込むとウェイト解除
// 自局をRで呼ばれるのを待つ // 自局をRで呼ばれるのを待つ
wait_next; wait_next;
IICAIF = 0; IICAIF = 0;
if( COI != 1 ){ // 被呼び出し? if( COI != 1 )
{ // 被呼び出し?
LREL = 1; // 呼ばれたのは他のIDあれ LREL = 1; // 呼ばれたのは他のIDあれ
return; return;
} }
@ -134,7 +144,9 @@ __interrupt void int_iic_twl(){
IICAIF = 0; // おしまい IICAIF = 0; // おしまい
LREL = 1; LREL = 1;
return; return;
}else if( SPD ){ // 強制終了 }
else if( SPD )
{ // 強制終了
LREL = 1; LREL = 1;
return; return;
} }
@ -144,7 +156,8 @@ __interrupt void int_iic_twl(){
/*****************************************************/ /*****************************************************/
void IIC_twl_Init( void ){ void IIC_twl_Init( void )
{
IICAEN = 1; IICAEN = 1;
@ -191,7 +204,8 @@ void IIC_twl_Init( void ){
//**************************************************************************** //****************************************************************************
void IIC_twl_Stop( void ){ void IIC_twl_Stop( void )
{
IICE = 0; /* IICA disable */ IICE = 0; /* IICA disable */
IICAEN = 0; IICAEN = 0;
} }

View File

@ -34,4 +34,3 @@
//========================================================= //=========================================================
err firm_update( ); err firm_update( );
err firm_restore( ); err firm_restore( );

View File

@ -75,48 +75,170 @@
/****************************************************/ /****************************************************/
/* 未使用時のダミー関数定義 */ /* 未使用時のダミー関数定義 */
/****************************************************/ /****************************************************/
__interrupt void fn_intwdti(){ while(1){}; } __interrupt void fn_intwdti( )
__interrupt void fn_intlvi(){ while(1){}; } {
while( 1 )
{
};
}
__interrupt void fn_intlvi( )
{
while( 1 )
{
};
}
//__interrupt void fn_intp0(){} // tasks.c //__interrupt void fn_intp0(){} // tasks.c
__interrupt void fn_intp1(){ while(1){}; } // __interrupt void fn_intp1( )
__interrupt void fn_intp2(){ while(1){}; } {
__interrupt void fn_intp3(){ while(1){}; } while( 1 )
{
};
} //
__interrupt void fn_intp2( )
{
while( 1 )
{
};
}
__interrupt void fn_intp3( )
{
while( 1 )
{
};
}
//__interrupt void fn_intp4(){ while(1){}; } // pm.c //__interrupt void fn_intp4(){ while(1){}; } // pm.c
//__interrupt void fn_intp5(){ while(1){}; } // pm.c //__interrupt void fn_intp5(){ while(1){}; } // pm.c
//__interrupt void fn_intp6(){ while(1){}; } // pm.c //__interrupt void fn_intp6(){ while(1){}; } // pm.c
//__interrupt void fn_intp7(){ while(1){}; } // led.c //__interrupt void fn_intp7(){ while(1){}; } // led.c
//__interrupt void fn_intp21(){ while(1){}; } // led.c //__interrupt void fn_intp21(){ while(1){}; } // led.c
__interrupt void fn_intcmp0(){ while(1){}; } __interrupt void fn_intcmp0( )
__interrupt void fn_intcmp1(){ while(1){}; } {
__interrupt void fn_intdma0(){ while(1){}; } while( 1 )
{
};
}
__interrupt void fn_intcmp1( )
{
while( 1 )
{
};
}
__interrupt void fn_intdma0( )
{
while( 1 )
{
};
}
//__interrupt void fn_intdma1(){} // i2c_mcu.cにある //__interrupt void fn_intdma1(){} // i2c_mcu.cにある
__interrupt void fn_intst0(){ while(1){}; } __interrupt void fn_intst0( )
/* __interrupt void fn_intcsi00(){} */ {
__interrupt void fn_intsr0(){ while(1){}; } while( 1 )
/* __interrupt void fn_intcsi01(){} */ {
__interrupt void fn_intsre0(){ while(1){}; } };
}
/* __interrupt void fn_intcsi00(){} */
__interrupt void fn_intsr0( )
{
while( 1 )
{
};
}
/* __interrupt void fn_intcsi01(){} */
__interrupt void fn_intsre0( )
{
while( 1 )
{
};
}
__interrupt void fn_intst1( )
{
while( 1 )
{
};
}
__interrupt void fn_intst1(){ while(1){}; }
/* __interrupt void fn_intcsi10(){} */ /* __interrupt void fn_intcsi10(){} */
//__interrupt void fn_intiic10(){ while(1){}; } //__interrupt void fn_intiic10(){ while(1){}; }
__interrupt void fn_intsr1(){ while(1){}; } __interrupt void fn_intsr1( )
__interrupt void fn_intsre1(){ while(1){}; } {
while( 1 )
{
};
}
__interrupt void fn_intsre1( )
{
while( 1 )
{
};
}
//__interrupt void fn_intiica(){} // i2c.cにある //__interrupt void fn_intiica(){} // i2c.cにある
/* __interrupt void fn_inttm00(){} *//* sub.cにて定義 */ /* __interrupt void fn_inttm00(){} *//* sub.cにて定義 */
__interrupt void fn_inttm01(){ while(1){}; } __interrupt void fn_inttm01( )
__interrupt void fn_inttm02(){ while(1){}; } {
__interrupt void fn_inttm03(){ while(1){}; } while( 1 )
{
};
}
__interrupt void fn_inttm02( )
{
while( 1 )
{
};
}
__interrupt void fn_inttm03( )
{
while( 1 )
{
};
}
//__interrupt void fn_intad(){ while(1){}; } // adc.c //__interrupt void fn_intad(){ while(1){}; } // adc.c
__interrupt void fn_intrtc(){ while(1){}; } __interrupt void fn_intrtc( )
{
while( 1 )
{
};
}
//__interrupt void int_rtcint(){} // rtc.cにある //__interrupt void int_rtcint(){} // rtc.cにある
//__interrupt void fn_intkr(){} // main.c //__interrupt void fn_intkr(){} // main.c
__interrupt void fn_intmd(){ while(1){}; } __interrupt void fn_intmd( )
{
while( 1 )
{
};
}
__interrupt void fn_inttm04(){ while(1){}; } __interrupt void fn_inttm04( )
__interrupt void fn_inttm05(){ while(1){}; } {
__interrupt void fn_inttm06(){ while(1){}; } while( 1 )
__interrupt void fn_inttm07(){ while(1){}; } {
};
}
__interrupt void fn_inttm05( )
{
while( 1 )
{
};
}
__interrupt void fn_inttm06( )
{
while( 1 )
{
};
}
__interrupt void fn_inttm07( )
{
while( 1 )
{
};
}

View File

@ -2,9 +2,6 @@
LED.c LED.c
======================================================== */ ======================================================== */
#pragma sfr #pragma sfr
@ -12,6 +9,7 @@
#include "led.h" #include "led.h"
// ======================================================== // ========================================================
// TPS0 // TPS0
#define BIT_PRS01 4 #define BIT_PRS01 4
@ -27,8 +25,8 @@
#define BIT_MD0 0 #define BIT_MD0 0
// ======================================================== // ========================================================
static task_interval led_pow_normal(); static void led_pow_normal( );
static task_interval led_pow_hotaru(); static void led_pow_hotaru( );
@ -38,10 +36,11 @@ u8 wifi_TX;
// ======================================================== // ========================================================
static const char MSG_MAIL[] = { 0b11110110, 0b11011010, 0b01101110, 0b10010100 }; static const char MSG_MAIL[] = { 0b11110110, 0b11011010, 0b01101110, 0b10010100 };
#define MSG_SPD 70 #define MSG_SPD 60
// ======================================================== // ========================================================
void LED_init(){ void LED_init( )
{
/** /**
PWMのセット PWMのセット
@ -57,21 +56,16 @@ void LED_init(){
TAU0EN = 1; TAU0EN = 1;
TPS0 = 1 << BIT_PRS01 | 1 << BIT_PRS00; // マスタークロックはCK01,8M/2/2^4 = 250kHz TPS0 = 1 << BIT_PRS01 | 1 << BIT_PRS00; // マスタークロックは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; TMR00 =
TMR01 = TMR02 = TMR03 = TMR04 = TMR05 = TMR06 = TMR07 \ 1 << BIT_CKS0 | 0 << BIT_CCS0 | 1 << BIT_MASTER0 | 0 << BIT_STS0 | 0
= 1 << BIT_CKS0 | 0 << BIT_CCS0 | 0 << BIT_MASTER0 | 4 << BIT_STS0 | 0 << BIT_CIS0 | 4 << BIT_MD123 | 1 << BIT_MD0; << 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; ISC = 0;
TOM0 = 0b0000000011111110; // 出力モード。4はPWM出力しないが1にしないとTO5以降にクロックが届かない TOM0 = 0b0000000011111110; // 出力モード。4はPWM出力しないが1にしないとTO5以降にクロックが届かない
#if 0 TOL0 = 0b0000000000000100; // 出力を反転させるかフラグ
#ifdef _MODEL_WM0_
TOL0 = 0b0000000000000010; // 出力を反転させるかフラグ
#else
#ifdef _MODEL_TS0_
TOL0 = 0b0000000000000110;
#endif
TOL0 = 0b0000000000000110;
#endif
#endif
TO0 = 0; // タイマー動作中で、タイマー出力にしてないときのピンのラッチ。タイマー出力を使わないなら0 TO0 = 0; // タイマー動作中で、タイマー出力にしてないときのピンのラッチ。タイマー出力を使わないなら0
TOE0 = 0b0000000011101110; // TOxをタイマーモジュールが制御 TOE0 = 0b0000000011101110; // TOxをタイマーモジュールが制御
TS0 = 0b0000000011101111; // 動作開始 TS0 = 0b0000000011101111; // 動作開始
@ -81,7 +75,8 @@ void LED_init(){
void LED_stop(){ void LED_stop( )
{
TT0 = 0b0000000011101111; // 一斉停止(しないとだめ) TT0 = 0b0000000011101111; // 一斉停止(しないとだめ)
TOE0 = 0b0000000000000000; // TOxをタイマーモジュールが制御(GPIOになる) TOE0 = 0b0000000000000000; // TOxをタイマーモジュールが制御(GPIOになる)
TAU0EN = 0; TAU0EN = 0;
@ -113,58 +108,54 @@ enum LED_ILUM_MODE{
LED_POW_ILM_CEOFF LED_POW_ILM_CEOFF
}; };
======================================================== */ ======================================================== */
task_interval tsk_led_pow(){ void tsk_led_pow( )
{
switch( vreg_ctr[ VREG_C_LED_POW ] ){ switch ( vreg_ctr[VREG_C_LED_POW] )
{
// 自動切り替え
case ( LED_POW_ILM_AUTO ): case ( LED_POW_ILM_AUTO ):
switch( system_status.pwr_state ){ switch ( system_status.pwr_state )
{
case ( SLEEP ): case ( SLEEP ):
return( led_pow_hotaru() ); led_pow_hotaru( );
break; break;
case ( ON ): case ( ON ):
default: default:
return( led_pow_normal() ); led_pow_normal( );
break; break;
case ( ON_TRIG ): case ( ON_TRIG ):
case ( SLEEP_TRIG ): case ( SLEEP_TRIG ):
case ( OFF_TRIG ): case ( OFF_TRIG ):
case ( OFF ): case ( OFF ):
return( 250 );
break; break;
} }
break; break;
// 強制
case ( LED_POW_ILM_OFF ): case ( LED_POW_ILM_OFF ):
LED_duty_pow_H -= ( LED_duty_pow_H == 0x0000 ) ? 0 : 1; LED_duty_pow_H -= ( LED_duty_pow_H == 0x0000 ) ? 0 : 1;
LED_duty_pow_L -= ( LED_duty_pow_L == 0x0000 ) ? 0 : 1; LED_duty_pow_L -= ( LED_duty_pow_L == 0x0000 ) ? 0 : 1;
if(( LED_duty_pow_H == 0 ) && ( LED_duty_pow_L == 0 )){
return( 250 );
}else{
return( 0 );
}
break; break;
case ( LED_POW_ILM_HOTARU ): case ( LED_POW_ILM_HOTARU ):
return( led_pow_hotaru() ); led_pow_hotaru( );
break; break;
case ( LED_POW_ILM_ON ): case ( LED_POW_ILM_ON ):
default: default:
return( led_pow_normal() ); led_pow_normal( );
break; break;
case ( LED_POW_ILM_ONLY_RED ): case ( LED_POW_ILM_ONLY_RED ):
LED_duty_pow_H = 0x0000; LED_duty_pow_H = 0x0000;
LED_duty_pow_L = LED_BRIGHT_MAX; LED_duty_pow_L = LED_BRIGHT_MAX;
return( 250 );
break; break;
case ( LED_POW_ILM_ONLY_BLUE ): case ( LED_POW_ILM_ONLY_BLUE ):
LED_duty_pow_H = LED_BRIGHT_MAX; LED_duty_pow_H = LED_BRIGHT_MAX;
LED_duty_pow_L = 0x0000; LED_duty_pow_L = 0x0000;
return( 250 );
break; break;
} }
@ -176,51 +167,54 @@ task_interval tsk_led_pow(){
   
======================================================== */ ======================================================== */
static task_interval led_pow_normal(){ static void led_pow_normal( )
{
static u8 state; static u8 state;
u8 dirty;
dirty = 0; if( vreg_ctr[VREG_C_BT_REMAIN] < ( 255 * 0.05 ) )
if( vreg_ctr[ VREG_C_BT_REMAIN ] < ( 255 * 0.05 ) ){ {
// 赤点滅 // 赤点滅
if( state == 0 ){ state++;
if( state < 127 )
{
LED_duty_pow_H = 0x0000; LED_duty_pow_H = 0x0000;
LED_duty_pow_L = 0x0000; LED_duty_pow_L = 0x0000;
state = 1; }
}else{ else
{
LED_duty_pow_L = vreg_ctr[VREG_C_LED_BRIGHT]; LED_duty_pow_L = vreg_ctr[VREG_C_LED_BRIGHT];
state = 0;
} }
return( 250 ); return;
}else if( vreg_ctr[ VREG_C_BT_REMAIN ] < ( 255 * 0.2 ) ){
// 赤点灯
if( LED_duty_pow_H != 0x0000 ){
LED_duty_pow_H -= 1;
dirty = 1;
} }
if( LED_duty_pow_L != vreg_ctr[ VREG_C_LED_BRIGHT ] ){ else if( vreg_ctr[VREG_C_BT_REMAIN] < ( 255 * 0.2 ) )
dirty = 1; {
// 赤点灯
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; LED_duty_pow_L += ( LED_duty_pow_L < vreg_ctr[VREG_C_LED_BRIGHT] ) ? 1 : -1;
} }
return;
}else{ }
else
{
// 青点灯 // 青点灯
if( LED_duty_pow_H != vreg_ctr[ VREG_C_LED_BRIGHT ] ){ if( LED_duty_pow_H != vreg_ctr[VREG_C_LED_BRIGHT] )
dirty = 1; {
LED_duty_pow_H += ( LED_duty_pow_H < vreg_ctr[VREG_C_LED_BRIGHT] ) ? 1 : -1; LED_duty_pow_H += ( LED_duty_pow_H < vreg_ctr[VREG_C_LED_BRIGHT] ) ? 1 : -1;
} }
if( LED_duty_pow_L != 0x0000 ){ if( LED_duty_pow_L != 0x0000 )
{
LED_duty_pow_L -= 1; LED_duty_pow_L -= 1;
dirty = 1;
} }
} }
if( dirty == 0 ){ return;
return( 250 );
}else{
return( 0 );
}
} }
@ -229,60 +223,84 @@ static task_interval led_pow_normal(){
======================================================== */ ======================================================== */
static task_interval led_pow_hotaru(){ static void led_pow_hotaru( )
{
static u8 delay;
static u8 state; static u8 state;
// static u8 delay;
static u16 blue_to; static u16 blue_to;
static u16 red_to; static u16 red_to;
u8 dirty;
if( delay != 0 )
// LED 調光? {
dirty = 0; delay -= 1;
if( LED_duty_pow_H != blue_to ){ return;
dirty = 1;
if( LED_duty_pow_H > blue_to ){
LED_duty_pow_H -= 1;
}else{
LED_duty_pow_H += 2;
} }
else
{
delay = 3;
} }
if( LED_duty_pow_L != red_to ){ if( LED_duty_pow_L != red_to )
dirty = 1; {
if( LED_duty_pow_L > red_to ){ if( LED_duty_pow_L > red_to )
{
LED_duty_pow_L -= 1; LED_duty_pow_L -= 1;
}else{ }
else
{
LED_duty_pow_L += 2; 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;
}
}
if( dirty == 0 ){ switch ( state )
switch( state ){ {
// フェードイン // フェードイン
case ( 0 ): case ( 0 ):
case ( 2 ): case ( 2 ):
case ( 4 ): case ( 4 ):
if( vreg_ctr[ VREG_C_BT_REMAIN ] < ( 255 * 0.2 ) ){ if( vreg_ctr[VREG_C_BT_REMAIN] < ( 255 * 0.2 ) )
red_to = vreg_ctr[ VREG_C_LED_BRIGHT ]; {
// 赤いとき
blue_to = 0; blue_to = 0;
}else{ red_to = vreg_ctr[VREG_C_LED_BRIGHT];
red_to = 0; }
else
{
blue_to = vreg_ctr[VREG_C_LED_BRIGHT]; blue_to = vreg_ctr[VREG_C_LED_BRIGHT];
red_to = 0;
} }
break; break;
default: default:
// フェードアウト // フェードアウト
red_to = 0; if( vreg_ctr[VREG_C_BT_REMAIN] < ( 255 * 0.2 ) )
blue_to = 0; {
red_to = 2;
}
else
{
blue_to = 2;
}
break; break;
} }
if( ( LED_duty_pow_H == blue_to ) && ( LED_duty_pow_L == red_to ) )
{
state += 1; state += 1;
} }
return( 5 ); return;
} }
@ -292,18 +310,26 @@ static task_interval led_pow_hotaru(){
LED_Wifi 3 LED_Wifi 3
2 P24 2 P24
======================================================== */ ======================================================== */
task_interval tsk_led_wifi(){ void tsk_led_wifi( )
{
static u8 task_interval;
static u8 remain_wifi_tx; static u8 remain_wifi_tx;
static u8 state_wifi_tx; static u8 state_wifi_tx;
switch( vreg_ctr[ VREG_C_LED_WIFI ] ){ if( task_interval != 0 )
{
task_interval -= 1;
return;
}
switch ( vreg_ctr[VREG_C_LED_WIFI] )
{
case ( WIFI_LED_OFF ): case ( WIFI_LED_OFF ):
LED_duty_WiFi = 0; LED_duty_WiFi = 0;
wifi_TX = 0; wifi_TX = 0;
state_wifi_tx = 0; state_wifi_tx = 0;
remain_wifi_tx = 0; remain_wifi_tx = 0;
LED_WIFI_2 = 0; LED_WIFI_2 = 0;
return( 250 );
break; break;
case ( WIFI_LED_ON ): case ( WIFI_LED_ON ):
@ -313,19 +339,21 @@ task_interval tsk_led_wifi(){
state_wifi_tx = 0; state_wifi_tx = 0;
remain_wifi_tx = 0; remain_wifi_tx = 0;
LED_WIFI_2 = 1; LED_WIFI_2 = 1;
return( 250 );
break; break;
case ( WIFI_LED_TXAUTO ): case ( WIFI_LED_TXAUTO ):
// 短いパルスを捕まえるために、割り込みフラグを見る // 短いパルスを捕まえるために、割り込みフラグを見る
if( wifi_TX != 0 ){ if( wifi_TX != 0 )
{
wifi_TX = 0; wifi_TX = 0;
remain_wifi_tx = 2; remain_wifi_tx = 2;
} }
// 送信パターン // 送信パターン
if( remain_wifi_tx != 0 ){ // TX active if( remain_wifi_tx != 0 )
switch( state_wifi_tx ){ { // TX active
switch ( state_wifi_tx )
{
case ( 1 ): case ( 1 ):
case ( 3 ): case ( 3 ):
case ( 5 ): case ( 5 ):
@ -337,21 +365,28 @@ task_interval tsk_led_wifi(){
LED_WIFI_2 = 1; LED_WIFI_2 = 1;
} }
state_wifi_tx++; state_wifi_tx++;
if( state_wifi_tx == 32 ){ if( state_wifi_tx == 32 )
{
state_wifi_tx = 0; state_wifi_tx = 0;
remain_wifi_tx--; remain_wifi_tx--;
} }
return( 22 ); task_interval = 22;
}else{ return;
}
else
{
LED_duty_WiFi = vreg_ctr[VREG_C_LED_BRIGHT]; LED_duty_WiFi = vreg_ctr[VREG_C_LED_BRIGHT];
LED_WIFI_2 = 1; LED_WIFI_2 = 1;
return( 200 ); task_interval = 200;
return;
} }
break; break;
case ( WIFI_LED_PTN0 ): case ( WIFI_LED_PTN0 ):
LED_WIFI_2 = 1; LED_WIFI_2 = 1;
switch( state_wifi_tx ){ switch ( state_wifi_tx )
{
case ( 1 ): case ( 1 ):
case ( 3 ): case ( 3 ):
case ( 5 ): case ( 5 ):
@ -361,10 +396,12 @@ task_interval tsk_led_wifi(){
LED_duty_WiFi = 0; LED_duty_WiFi = 0;
} }
state_wifi_tx++; state_wifi_tx++;
if( state_wifi_tx == 16 ){ if( state_wifi_tx == 16 )
{
state_wifi_tx = 0; state_wifi_tx = 0;
} }
return( 50 ); task_interval = 50;
return;
break; break;
case ( WIFI_LED_PTN1 ): case ( WIFI_LED_PTN1 ):
@ -372,42 +409,45 @@ task_interval tsk_led_wifi(){
{ {
u8 dat; u8 dat;
if( remain_wifi_tx != 0 ){ if( remain_wifi_tx != 0 )
{
LED_duty_WiFi = 0; LED_duty_WiFi = 0;
remain_wifi_tx = 0; remain_wifi_tx = 0;
return( MSG_SPD ); task_interval = MSG_SPD;
return;
} }
dat = ( MSG_MAIL[state_wifi_tx / 4] << ( ( state_wifi_tx % 4 ) * 2 ) ) & 0xC0; dat = ( MSG_MAIL[state_wifi_tx / 4] << ( ( state_wifi_tx % 4 ) * 2 ) ) & 0xC0;
state_wifi_tx = ( dat == 0 ) ? 0 : ( state_wifi_tx + 1 ); state_wifi_tx = ( dat == 0 ) ? 0 : ( state_wifi_tx + 1 );
switch( dat ){ switch ( dat )
{
case ( 0b00000000 ): case ( 0b00000000 ):
LED_duty_WiFi = 0; LED_duty_WiFi = 0;
remain_wifi_tx = 0; remain_wifi_tx = 0;
return( MSG_SPD * 3 ); task_interval = ( MSG_SPD * 3 );
break; break;
case ( 0b01000000 ): case ( 0b01000000 ):
default: default:
LED_duty_WiFi = 0; LED_duty_WiFi = 0;
remain_wifi_tx = 1; remain_wifi_tx = 1;
return( MSG_SPD ); task_interval = ( MSG_SPD );
break; break;
case ( 0b10000000 ): case ( 0b10000000 ):
LED_duty_WiFi = vreg_ctr[VREG_C_LED_BRIGHT]; LED_duty_WiFi = vreg_ctr[VREG_C_LED_BRIGHT];
remain_wifi_tx = 1; remain_wifi_tx = 1;
return( MSG_SPD ); task_interval = ( MSG_SPD );
break; break;
case ( 0b11000000 ): case ( 0b11000000 ):
LED_duty_WiFi = vreg_ctr[VREG_C_LED_BRIGHT]; LED_duty_WiFi = vreg_ctr[VREG_C_LED_BRIGHT];
remain_wifi_tx = 1; remain_wifi_tx = 1;
return( MSG_SPD * 3 ); task_interval = ( MSG_SPD * 3 );
break; break;
} }
return;
} }
} }
} }
@ -418,7 +458,8 @@ task_interval tsk_led_wifi(){
 LED点滅のフラグ操作のみ  LED点滅のフラグ操作のみ
  tsk_led_wifi   tsk_led_wifi
======================================================== */ ======================================================== */
__interrupt void intp21_RFTx(){ __interrupt void intp21_RFTx( )
{
wifi_TX = 1; wifi_TX = 1;
} }
@ -427,10 +468,27 @@ __interrupt void intp21_RFTx(){
/* ======================================================== /* ========================================================
LED_Cam TO02 LED_Cam TO02
======================================================== */ ======================================================== */
task_interval tsk_led_cam(){ void tsk_led_cam( )
{
static u8 state_led_cam = 0; static u8 state_led_cam = 0;
static u8 task_interval;
static u8 reg_old;
switch( vreg_ctr[ VREG_C_LED_CAM ] ){ /*
if( reg_old != vreg_ctr[ VREG_C_LED_CAM ] ){
reg_old = vreg_ctr[ VREG_C_LED_CAM ];
task_interval = 1;
}
*/
if( task_interval != 0 )
{
task_interval -= 1;
return;
}
switch ( vreg_ctr[VREG_C_LED_CAM] )
{
case ( CAM_LED_OFF ): case ( CAM_LED_OFF ):
default: default:
LED_duty_CAM = 0; LED_duty_CAM = 0;
@ -444,37 +502,47 @@ task_interval tsk_led_cam(){
case ( CAM_LED_BLINK ): case ( CAM_LED_BLINK ):
case ( CAM_LED_BY_TWL ): case ( CAM_LED_BY_TWL ):
if( state_led_cam == 0 ){ if( state_led_cam == 0 )
{
LED_duty_CAM = vreg_ctr[VREG_C_LED_BRIGHT]; LED_duty_CAM = vreg_ctr[VREG_C_LED_BRIGHT];
state_led_cam = 1; state_led_cam = 1;
}else{ }
else
{
LED_duty_CAM = 0; LED_duty_CAM = 0;
state_led_cam = 0; state_led_cam = 0;
} }
task_interval = 250;
break; break;
case ( CAM_LED_ON_PLUSE ): case ( CAM_LED_ON_PLUSE ):
if( state_led_cam == 0 ){ if( state_led_cam == 0 )
{
LED_duty_CAM = vreg_ctr[VREG_C_LED_BRIGHT]; LED_duty_CAM = vreg_ctr[VREG_C_LED_BRIGHT];
state_led_cam = 1; state_led_cam = 1;
}else{ task_interval = 250;
}
else
{
vreg_ctr[VREG_C_LED_CAM] = CAM_LED_OFF; vreg_ctr[VREG_C_LED_CAM] = CAM_LED_OFF;
return( 0 );
} }
break; break;
case ( CAM_LED_OFF_PLUSE ): case ( CAM_LED_OFF_PLUSE ):
if( state_led_cam == 0 ){ if( state_led_cam == 0 )
{
LED_duty_CAM = 0; LED_duty_CAM = 0;
state_led_cam = 1; state_led_cam = 1;
}else{ task_interval = 250;
}
else
{
vreg_ctr[VREG_C_LED_CAM] = CAM_LED_ON; vreg_ctr[VREG_C_LED_CAM] = CAM_LED_ON;
return( 0 );
} }
break; break;
} }
return( 250 ); return;
} }

View File

@ -17,7 +17,8 @@
#define LED_BRIGHT_MAX 0x00FF #define LED_BRIGHT_MAX 0x00FF
// ==================================== // ====================================
enum LED_ILUM_MODE{ enum LED_ILUM_MODE
{
LED_POW_ILM_AUTO = 0, LED_POW_ILM_AUTO = 0,
LED_POW_ILM_ON, LED_POW_ILM_ON,
LED_POW_ILM_HOTARU, LED_POW_ILM_HOTARU,

View File

@ -63,25 +63,34 @@ extern void chk_bootCluster();
// ======================================================== // ========================================================
void main(){ void main( )
while(1){ {
while( 1 )
{
WDT_Restart( ); WDT_Restart( );
if( RTCEN ){ if( RTCEN )
{
system_status.reboot = 1; system_status.reboot = 1;
}else{ }
else
{
u8 pwup_delay0 = 0; u8 pwup_delay0 = 0;
u8 pwup_delay1 = 0; u8 pwup_delay1 = 0;
do{ // 電池接続時、16ms待ってみる do
{ // 電池接続時、16ms待ってみる(チャタリング対策)
pwup_delay0 += 1; pwup_delay0 += 1;
do{ do
{
pwup_delay1 += 1; pwup_delay1 += 1;
}while( pwup_delay1 != 0 ); // コンパイラが不出来のため…。 }
}while( pwup_delay0 != 0 ); while( pwup_delay1 != 0 ); // u16にするとコンパイラが怒るため…。
}
while( pwup_delay0 != 0 );
hdwinit2(); hdwinit2( ); // ?
} }
@ -91,17 +100,20 @@ void main(){
u8 i; u8 i;
u8 comp = 0; u8 comp = 0;
// ローダーと本体は同じバージョンか? // ローダーと本体は同じバージョンか?
for( i = 0; i < sizeof( __TIME__ ); i++ ){ // sizeof( __TIME__ ) = 8 らし for( i = 0; i < sizeof( __TIME__ ); i++ )
{ // sizeof( __TIME__ ) = 8 らし
comp += ( *( u8 * ) ( MGC_HEAD + i ) == *( __far u8 * ) ( MGC_LOAD + i ) ) ? 0 : 1; comp += ( *( u8 * ) ( MGC_HEAD + i ) == *( __far u8 * ) ( MGC_LOAD + i ) ) ? 0 : 1;
} }
// 本体は壊れていないか? // 本体は壊れていないか?
comp += ( *( u8 * ) ( MGC_HEAD ) == 0xFF ) ? 1 : 0; comp += ( *( u8 * ) ( MGC_HEAD ) == 0xFF ) ? 1 : 0;
for( i = 0; i < sizeof( __TIME__ ); i++ ){ for( i = 0; i < sizeof( __TIME__ ); i++ )
{
comp += ( *( u8 * ) ( MGC_HEAD + i ) == *( u8 * ) ( MGC_FOOT + i ) ) ? 0 : 1; comp += ( *( u8 * ) ( MGC_HEAD + i ) == *( u8 * ) ( MGC_FOOT + i ) ) ? 0 : 1;
} }
if( comp != 0 ){ if( comp != 0 )
{
// ファームリストアを試みる // ファームリストアを試みる
firm_restore( ); firm_restore( );
// 帰ってこない。リセットをかける。 // 帰ってこない。リセットをかける。
@ -121,7 +133,8 @@ void main(){
/* ======================================================== /* ========================================================
======================================================== */ ======================================================== */
void power_save(){ void power_save( )
{
HALT( ); HALT( );
} }
@ -130,8 +143,10 @@ void power_save(){
/* ======================================================== /* ========================================================
======================================================== */ ======================================================== */
__interrupt void int_kr(){ __interrupt void int_kr( )
if( system_status.pwr_state == OFF ){ {
if( system_status.pwr_state == OFF )
{
// 電源onのカウント。特にすることはない // 電源onのカウント。特にすることはない
} }
} }
@ -141,20 +156,23 @@ __interrupt void int_kr(){
/* ======================================================== /* ========================================================
ext dc ext dc
======================================================== */ ======================================================== */
__interrupt void intp4(){ __interrupt void intp4( )
{
} }
/* ======================================================== /* ========================================================
shell close shell close
======================================================== */ ======================================================== */
__interrupt void intp5(){ __interrupt void intp5( )
{
} }
// ======================================================== // ========================================================
void hdwinit(void){ // スタートアップルーチンが勝手に呼びます void hdwinit( void )
{ // スタートアップルーチンが勝手に呼びます
DI( ); /* マスタ割り込み禁止 */ DI( ); /* マスタ割り込み禁止 */
CMC = 0b00010110; /* X1発振せず(入力ポート)、XT1使用、推奨の推奨で超低電力発振 */ CMC = 0b00010110; /* X1発振せず(入力ポート)、XT1使用、推奨の推奨で超低電力発振 */
@ -171,7 +189,8 @@ void hdwinit(void){ //
} }
void hdwinit2(){ void hdwinit2( )
{
// ポート設定 // ポート設定
P0 = 0b00000000; P0 = 0b00000000;
P1 = 0b00000000; P1 = 0b00000000;
@ -262,7 +281,7 @@ void hdwinit2(){
PR01L = 0b11111111; PR01L = 0b11111111;
PR11L = 0b11111110; PR11L = 0b11111110;
PR01H = 0b11111111; PR01H = 0b11111111;
PR11H = 0b11111111; PR11H = 011111111;
PR02L = 0b11111111; PR02L = 0b11111111;
PR12L = 0b11111111; PR12L = 0b11111111;
@ -270,10 +289,8 @@ void hdwinit2(){
#ifdef _MCU_BSR_ #ifdef _MCU_BSR_
EGP0 = 0b00110001; EGP0 = 0b00110001;
EGN0 = 0b01110001; EGN0 = 0b01110001;
EGP2 = 0b00000010; EGP2 = 0b00001010;
EGN2 = 0b00000000; EGN2 = 0b00000000;
// EGP2 = 0b00001010;
// EGN2 = 0b00000000;
#else #else
EGP0 = 0b10110001; EGP0 = 0b10110001;
EGN0 = 0b01110001; EGN0 = 0b01110001;
@ -331,4 +348,3 @@ void hdwinit2(){
DRC1 = 0b00000000; /* DMAチャネル1の動作禁止 */ DRC1 = 0b00000000; /* DMAチャネル1の動作禁止 */
} }

View File

@ -2,4 +2,3 @@
err firm_update( ); err firm_update( );

View File

@ -5,18 +5,19 @@
****************************************************************************/ ****************************************************************************/
#include "config.h" #include "config.h"
// V0.5 (ƒjƒZ0.1‰ü)
#pragma section @@CNSTL MGC_LOAD AT 0x0FF6 #pragma section @@CNSTL MGC_LOAD AT 0x0FF6
__far static const unsigned char MGC_LOAD[] = __TIME__; __far static const unsigned char MGC_LOAD[] =
{ 0x30, 0x38, 0x3A, 0x34, 0x35, 0x3A, 0x33, 0x39, 0x00, 0x00 };
#pragma section @@CNST MGC_MIMI AT 0x2100 #pragma section @@CNST MGC_MIMI AT 0x2100
static const unsigned char MGC_HEAD[] = __TIME__; static const unsigned char MGC_HEAD[] =
{ 0x30, 0x38, 0x3A, 0x34, 0x35, 0x3A, 0x33, 0x39, 0x00, 0x00 };
#pragma section @@CNST MGC_TAIL AT 0x47F6 #pragma section @@CNST MGC_TAIL AT 0x47F6
static const unsigned char MGC_TAIL[] = __TIME__; static const unsigned char MGC_TAIL[] =
{ 0x30, 0x38, 0x3A, 0x34, 0x35, 0x3A, 0x33, 0x39, 0x00, 0x00 };
/* /*
@ -39,7 +40,6 @@ bsr_V0.2_090828_WM2
*/ */
/* /*
// V0.1の署名(日付) 30 38 3A 34 35 3A 33 39 00 00 // V0.1の署名(日付) 30 38 3A 34 35 3A 33 39 00 00
#pragma section @@CNSTL MGC_LOAD AT 0x0FF6 #pragma section @@CNSTL MGC_LOAD AT 0x0FF6
@ -67,4 +67,3 @@ static const unsigned char MGC_TAIL[] = __TIME__;
*/ */

View File

@ -50,13 +50,15 @@ extern u8 boot_ura;
/* ======================================================== /* ========================================================
loader.c loader.c
======================================================== */ ======================================================== */
void main_loop( void ){ void main_loop( void )
{
// 電池投入時の1回のみ // 電池投入時の1回のみ
RTC_init( ); // 内部でリブートか判定しています
iic_mcu_stop( ); iic_mcu_stop( );
RTCEN = 0; if( system_status.reboot == 0 )
RTC_init(); // 電池初投入ビットも立てます {
if( system_status.reboot == 0 ){
/* /*
@ -75,7 +77,9 @@ void main_loop( void ){
*/ */
system_status.pwr_state = OFF_TRIG; system_status.pwr_state = OFF_TRIG;
}else{ }
else
{
system_status.pwr_state = ON; system_status.pwr_state = ON;
} }
vreg_ctr_init( ); vreg_ctr_init( );
@ -86,50 +90,32 @@ void main_loop( void ){
// 特定スイッチで何かするか? // 特定スイッチで何かするか?
renge_init( ); renge_init( );
/*
if(( vreg_ctr[ VREG_C_IRQ1 ] & REG_BIT_WDT_DET ) != 0 ){
system_status.pwr_state = OFF;
}else{
system_status.pwr_state = OFF_TRIG;
}
*/
renge_task_interval_run_force = 1; renge_task_interval_run_force = 1;
EI( ); EI( );
// メインループ // // メインループ //
while(1){ // システムtick、または割り込みで廻ります。 while( 1 )
{ // システムtick、または割り込みで廻ります。
WDT_Restart( ); WDT_Restart( );
renge_task_interval_run( ); // 内部で、システムtickまたは強制起動します renge_task_interval_run( ); // 内部で、システムtickまたは強制起動します
while( renge_task_interval_run_force != 0 )
{
renge_task_interval_run_force = 0;
renge_task_interval_run( );
}
renge_task_immed_run( ); // ここのループが廻る度に実行されます renge_task_immed_run( ); // ここのループが廻る度に実行されます
power_save( ); power_save( );
/*
{
u8 str[4];
if(( system_status.pwr_state != OFF )){
str[3] = system_status.pwr_state;
str[2] = MK1H;
str[1] = vreg_ctr[ VREG_C_STATUS ];
str[0] = SEC;
iic_mcu_write( 0x44, 0, 4, &str[0] );
}
}
*/
} }
} }
/* ======================================================== /* ========================================================
======================================================== */ ======================================================== */
static void read_dipsw(){ static void read_dipsw( )
{
// ソフトディップスイッチ読み込み // ソフトディップスイッチ読み込み
// PU4 |= 0x03; // dip sw 0,1 // PU4 |= 0x03; // dip sw 0,1
system_status.dipsw0 = ( DIPSW_0 == 0 ) ? 0 : 1; system_status.dipsw0 = ( DIPSW_0 == 0 ) ? 0 : 1;
system_status.dipsw1 = ( DIPSW_1 == 0 ) ? 0 : 1; system_status.dipsw1 = ( DIPSW_1 == 0 ) ? 0 : 1;
// PU4 &= ~0x03; // PU4 &= ~0x03;
} }

View File

@ -1,12 +1,12 @@
/* ======================================================== /* ========================================================
PMIC_TWL2 I2C通信 PMIC
nintendo nintendo
'08 Dec '08 Dec
======================================================== */ ======================================================== */
#pragma nop #pragma nop
#include "incs_loader.h" #include "incs.h"
#include "adc.h" #include "adc.h"
#include "led.h" #include "led.h"
#include "pm.h" #include "pm.h"
@ -14,33 +14,35 @@
// ======================================================== // ========================================================
#define BT_GAUGE_UNLOCK_ADRS 0x3E
#define BT_BT_PARAM_ADRS 0x40
#define BT_BT_PARAM_PANA_RCOMP_ADRS 0x0C
// -1.45 ,-3.9} // -1.45 ,-3.9}
// ======================================================== // ========================================================
static const u8 BT_BT_PARAM_PANA[64] = { static const u8 BT_BT_PARAM_PANA[64] = {
0xEA, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0xAD, 0x30, 0xAE, 0x70, 0xB0, 0x00, 0xB3, 0x00,
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xB4, 0x70, 0xB5, 0xA0, 0xB7, 0x80, 0xBA, 0x00,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F };
#define BT_PANA_RCOMP 158 0xBB, 0x90, 0xBD, 0x00, 0xBE, 0x00, 0xBF, 0xF0,
u16 BT_PANA_TEMPCOUP = 1.45*8; 0xC3, 0x00, 0xC5, 0xC0, 0xC8, 0x00, 0xCA, 0xC0,
u16 BT_PANA_TEMPCODN = 3.90*8;
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;
// ======================================================== // ========================================================
u8 raw_adc_temperature; u8 raw_adc_temperature;
u8 starting_rcomp; u8 rcomp;
u16 temp_co_up; float temp_co_up;
u16 temp_co_dn; float temp_co_dn;
#define _TEG_ #define _TEG_
@ -50,7 +52,8 @@ u16 temp_co_dn;
 (ERR)ERR_SUCCESS  (ERR)ERR_SUCCESS
======================================================== */ ======================================================== */
err PM_bt_auth(){ err PM_bt_auth( )
{
/* /*
todo todo
Dallas-1wire Dallas-1wire
@ -61,130 +64,6 @@ err PM_bt_auth(){
/* ========================================================
 64ROM領域においておきたかったのだが
  DMAがROMRAM領域からしか持ってこられないので
  orz
 
 
======================================================== */
static void BT_set_batt_vend1(){
u8 dat[2];
iic_mcu_set_wo_dma();
iic_mcu_write( IIC_SLA_BT_GAUGE,
BT_BT_PARAM_ADRS,
sizeof( BT_BT_PARAM_PANA ),
BT_BT_PARAM_PANA
);
iic_mcu_read( IIC_SLA_BT_GAUGE,
BT_GAUGE_REG_OCV,
2,
dat
);
/*
todo
The host must then verify that the model was written properly to the device. The MAX17040 does not allow the
user to read the model directly. In order to verify the model, the host should write the maximum OCV point from
the model to the OCV register (memory location 0x0Eh) and verify that the SOC register (memory location 0x04)
matches the desired SOC value from the model. Before updating the OCV register, the host should read the OCV
register, so that the original value can be rewritten to the device after the model is verified.
//Read Original OCV Register
START
Send Slave Address (0x6Ch)
Send Memory Location (0x0Eh)
RESTART
Send Slave Address (0x6Dh)
Send Memory Location (0x0Eh)
Read Data Byte OriginalOCV1
Read Data Byte OriginalOCV2
STOP
*/
iic_mcu_read( IIC_SLA_BT_GAUGE,
BT_GAUGE_REG_OCV,
2,
dat
);
/*
//Write OCV Register
START
Send Slave Address (0x6Ch)
Send Memory Location (0x0Eh)
Send Data Byte (0xh)
Send Data Byte (0xh)
STOP
*/
/*
iic_mcu_write( IIC_SLA_BT_GAUGE,
BT_GAUGE_REG_OCV,
2,
??
);
*/
/*
//Read SOC Register
START
Send Slave Address (0x6Ch)
Send Memory Location (0x04h)
RESTART
Send Slave Address (0x6Dh)
Send Memory Location (0x04h)
Read Data Byte SOC1
Read Data Byte SOC2
STOP
*/
iic_mcu_read( IIC_SLA_BT_GAUGE,
BT_GAUGE_REG_SOC,
2,
dat
);
/*
//Compare value
//Write OCV Register back to original
START
Send Slave Address (0x6Ch)
Send Memory Location (0x0Eh)
Send Data Byte (OriginalOCV1)
Send Data Byte (OriginalOCV2)
STOP
*/
iic_mcu_write( IIC_SLA_BT_GAUGE,
BT_GAUGE_REG_OCV,
2,
dat
);
/*
To lock the model the host software must write 0x00h to memory location 0x3Eh and 0x00h to memory location
0x3Fh.
//Lock Model Access
START
Send Slave Address (0x6Ch)
Send Memory Location (0x3Eh)
Send Data Byte (0x00h)
Send Data Byte (0x00h)
STOP
*/
dat[0] = dat[1] = 0;
iic_mcu_write( IIC_SLA_BT_GAUGE,
BT_GAUGE_REG_LOCK,
2,
dat
);
starting_rcomp = BT_PANA_RCOMP;
temp_co_up = BT_PANA_TEMPCOUP;
temp_co_dn = BT_PANA_TEMPCODN;
return;
}
/* ======================================================== /* ========================================================
PMIC達の初期化 PMIC達の初期化
@ -194,36 +73,94 @@ STOP
PM_BT_DET,_P PM_BT_DET,_P
======================================================== */ ======================================================== */
void PM_init(){ void PM_init( )
{
u8 temp; u8 temp;
u8 BT_GAUGE_UNLOCK_KEY[2] = { 0x4A, 0x57 }; u8 dat[2];
u8 BT_GAUGE_QUICK_START[2] = { 0x40, 0x00 }; u8 origParam[4];
// バッテリ残量ICクイックスタート // 0. バッテリ残量IC クイックスタート
iic_mcu_write( IIC_SLA_BT_GAUGE, dat[0] = 0x40; // quick start
BT_GAUGE_REG_MODE, dat[1] = 0x00;
2, if( iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_MODE, 2, dat ) != ERR_SUCCESS ){
BT_GAUGE_QUICK_START ); vreg_ctr[ VREG_C_STATUS_X ] |= 0x01;
}else{
// 電池固有パラメータの書き込み下準備 // 1. ロック解除
iic_mcu_write( IIC_SLA_BT_GAUGE, dat[0] = 0x40; // unlock key
BT_GAUGE_UNLOCK_ADRS, dat[1] = 0x57;
sizeof( BT_GAUGE_UNLOCK_KEY ), iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_LOCK, 2, dat );
BT_GAUGE_UNLOCK_KEY );
// 電池メーカーの判別とセット // 2. 初期パラメータを一時保存
iic_mcu_read( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_RCOMP, 4, origParam );
// 3. 一時的にOCVを変更
dat[0] = 0xD4;
dat[1] = 0xC0;
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_OCV, 2, dat );
// 4. 一時的にRCOMPを変更
dat[0] = 0xFF;
dat[1] = 0x00;
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_RCOMP, 2, dat );
// 電池メーカーの識別
BT_DET_P = 1; BT_DET_P = 1;
temp = ( u8 ) ( get_adc( ADC_SEL_BATT_DET ) >> 6 ); temp = ( u8 ) ( get_adc( ADC_SEL_BATT_DET ) >> 6 );
BT_DET_P = 0; BT_DET_P = 0;
iic_mcu_set_wo_dma( );
switch( temp ){ // 5.メーカー別パラメータのロード
// case( BT_VENDER_PANA ): switch ( temp )
{
default: default:
BT_set_batt_vend1(); // case( BT_VENDER_PANA ):
// iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_BT_PARAM, 64, BT_BT_PARAM_PANA );
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_BT_PARAM, 16, BT_BT_PARAM_PANA );
iic_mcu_set_wo_dma( );
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_BT_PARAM+16, 16, &BT_BT_PARAM_PANA[16] );
iic_mcu_set_wo_dma( );
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_BT_PARAM+16*2, 16, &BT_BT_PARAM_PANA[32] );
iic_mcu_set_wo_dma( );
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_BT_PARAM+16*3, 16, &BT_BT_PARAM_PANA[48] );
rcomp = BT_PANA_RCOMP;
temp_co_up = BT_PANA_TEMPCOUP;
temp_co_dn = BT_PANA_TEMPCODN;
break; break;
} }
// 6. 150ms以上待つ
wait_ms( 200 );
// 7. OCVに「とある値」を書く
dat[0] = 0xD4;
dat[1] = 0xC0;
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_OCV, 2, dat );
// 8. 150600ms待つ。600msは厳守
wait_ms( 200 );
// 9. SOCを読む。ベリファイのため。
iic_mcu_read( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_SOC, 2, dat );
if( 0x6D == dat[0] || dat[0] == 0x6E || dat[0] == 0x6F ){
// カスタムモデル書き込みOK
}else{
// 失敗だったらリトライするのか?
}
// 10.元のRCOMPとOCVを書き戻す
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_RCOMP, 4, origParam );
// 11. ロック
dat[0] = 0x00; // lock key
dat[1] = 0x00;
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_LOCK, 2, dat );
// おしまい //
}
// 電池温度測定 // 電池温度測定
BT_TEMP_P = 1; // 電池温度監視スタート BT_TEMP_P = 1; // 電池温度監視スタート
raw_adc_temperature = get_adc( ADC_SEL_BATT_TEMP ); // 温度のtemp。 raw_adc_temperature = get_adc( ADC_SEL_BATT_TEMP ); // 温度のtemp。
@ -233,10 +170,6 @@ void PM_init(){
temp = iic_mcu_read_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_VER ); temp = iic_mcu_read_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_VER );
// vreg_ctr[ VREG_C_PM_INFO ] = temp; // vreg_ctr[ VREG_C_PM_INFO ] = temp;
/*
LCD DACの値のセット
*/
} }
@ -249,28 +182,39 @@ void PM_init(){
ICにセット ICにセット
======================================================== */ ======================================================== */
task_status_immed PM_bt_temp_update(){ task_status_immed PM_bt_temp_update( )
{
u16 newrcomp; u16 newrcomp;
static u8 temp_old = 0; static u8 temp_old = 0;
static u8 count = 0; // たまにしか書きに行かない static u8 count = 0; // たまにしか書きに行かない
volatile static u8 skip = 1;
if( skip != 0 ){
return ( ERR_SUCCESS );
}
/* /*
- 10kΩ分圧点の時 - 10kΩ分圧点の時
T[] = 81.48 - 111.97 x ratio T[] = 81.48 - 111.97 x ratio
TDK T = 81.406 - 111.81 x ratio TDK T = 81.406 - 111.81 x ratio
*/ */
vreg_ctr[ VREG_C_BT_TEMP ] = (u8)( (s16)(( 163 - ( 224 * raw_adc_temperature ) ) / 2 ) >> 8 ); vreg_ctr[VREG_C_BT_TEMP] =
( u8 ) ( ( s16 ) ( ( 163 - ( 224 * raw_adc_temperature ) ) / 2 ) >> 8 );
// 時々/大きく変化があったら書きにゆく // 時々/大きく変化があったら書きにゆく
if(( abs(vreg_ctr[ VREG_C_BT_TEMP ] - temp_old ) > 3 ) if( ( abs( vreg_ctr[VREG_C_BT_TEMP] - temp_old ) > 3 ) || ( count == 0 ) )
|| ( count == 0 )){ {
if( (s8)vreg_ctr[ VREG_C_BT_TEMP ] > 20 ){ if( ( s8 ) vreg_ctr[VREG_C_BT_TEMP] > 20 )
{
newrcomp = -( ( ( s16 ) vreg_ctr[VREG_C_BT_TEMP] - 20 ) * temp_co_up ); newrcomp = -( ( ( s16 ) vreg_ctr[VREG_C_BT_TEMP] - 20 ) * temp_co_up );
}else{ }
else
{
newrcomp = -( ( ( s16 ) vreg_ctr[VREG_C_BT_TEMP] - 20 ) * temp_co_dn ); newrcomp = -( ( ( s16 ) vreg_ctr[VREG_C_BT_TEMP] - 20 ) * temp_co_dn );
} }
newrcomp += starting_rcomp; newrcomp += rcomp;
/* /*
If Temperature > 20 Then If Temperature > 20 Then
NewRCOMP = StartingRCOMP + ((Temperature - 20) * TempCoUp) NewRCOMP = StartingRCOMP + ((Temperature - 20) * TempCoUp)
@ -280,7 +224,9 @@ Else
NewRCOMP = StartingRCOMP NewRCOMP = StartingRCOMP
End If End If
*/ */
if( iic_mcu_write( IIC_SLA_BT_GAUGE, BT_BT_PARAM_PANA_RCOMP_ADRS, 2, &newrcomp ) == ERR_SUCCESS ){ if( iic_mcu_write
( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_RCOMP, 2, &newrcomp ) == ERR_SUCCESS )
{
temp_old = vreg_ctr[VREG_C_BT_TEMP]; temp_old = vreg_ctr[VREG_C_BT_TEMP];
} }
count += 1; count += 1;
@ -296,41 +242,46 @@ End If
======================================================== */ ======================================================== */
#ifdef _PMIC_TWL_ #ifdef _PMIC_TWL_
err PM_LCD_on(){ err PM_LCD_on( )
PM_TEG_LCD_OFF = 0; {
// PM_TEG_LCD_dis( 0 ); // 何もしない
wait_ms( DELAY_PM_TSS_50B ); wait_ms( DELAY_PM_TSS_50B );
wait_ms( DELAY_PM_TSS_50B ); wait_ms( DELAY_PM_TSS_50B );
iic_mcu_write_a_byte( IIC_SLA_PMIC, 0x22, 0x4A ); // バグ持ちPMIC対策
vreg_ctr[VREG_C_STATUS] |= REG_BIT_LCD_POW; vreg_ctr[VREG_C_STATUS] |= REG_BIT_LCD_POW;
return ( PM_chk_LDSW( ) ); return ( PM_chk_LDSW( ) );
} }
err PM_BL_on(){ err PM_LCD_off( )
{
// PM_TEG_LCD_dis( 1 );
wait_ms( 1 + 50 );
PM_VDDLCD_off( ); // 残ってたの全部止めます。
vreg_ctr[VREG_C_STATUS] &= ~REG_BIT_LCD_POW;
return ( ERR_SUCCESS );
}
err PM_BL_on( )
{
wait_ms( 10 ); wait_ms( 10 );
vreg_ctr[VREG_C_STATUS] |= REG_BIT_BL; vreg_ctr[VREG_C_STATUS] |= REG_BIT_BL;
return ( PM_chk_LDSW( ) ); return ( PM_chk_LDSW( ) );
} }
err PM_BL_off(){ err PM_BL_off( )
{
vreg_ctr[VREG_C_STATUS] &= ~REG_BIT_BL; vreg_ctr[VREG_C_STATUS] &= ~REG_BIT_BL;
return ( ERR_SUCCESS ); return ( ERR_SUCCESS );
} }
err PM_LCD_off(){
PM_TEG_LCD_OFF = 1; err PM_LCD_vcom_set( )
wait_ms( 1 + 50 ); {
PM_VDDLCD_off(); // 残ってたの全部止めます。
vreg_ctr[ VREG_C_STATUS ] &= ~( REG_BIT_BL | REG_BIT_LCD_POW );
return ( ERR_SUCCESS ); return ( ERR_SUCCESS );
} }
task_status_immed tski_vcom_set( )
err PM_LCD_vcom_set(){ {
return( ERR_SUCCESS );
}
task_status_immed tski_vcom_set(){
PM_LCD_vcom_set( ); PM_LCD_vcom_set( );
return ( ERR_FINISED ); return ( ERR_FINISED );
} }
@ -338,40 +289,12 @@ task_status_immed tski_vcom_set(){
#else #else
/* ========================================================
======================================================== */
err PM_LCD_vcom_set(){
u8 rv;
/*
rv = iic_mcu_write_a_byte(
IIC_SLA_PMIC,
PM_REG_ADRS_POW_DAC1,
92 ); // がっかりなことに、PMICはバースト書き込み不可
rv |= iic_mcu_write_a_byte(
IIC_SLA_PMIC,
PM_REG_ADRS_POW_DAC2,
92 );
/*/
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 );
}
/* ======================================================== /* ========================================================
 I2Cの取り合いの関係でここから呼ぶ  I2Cの取り合いの関係でここから呼ぶ
======================================================== */ ======================================================== */
task_status_immed tski_vcom_set(){ task_status_immed tski_vcom_set( )
{
PM_LCD_vcom_set( ); PM_LCD_vcom_set( );
return ( ERR_FINISED ); return ( ERR_FINISED );
} }
@ -385,20 +308,40 @@ task_status_immed tski_vcom_set(){
======================================================== */ ======================================================== */
err PM_LCD_on(){ err PM_LCD_on( )
{
PM_VDDLCD_on( ); PM_VDDLCD_on( );
wait_ms( DELAY_PM_TSS_50B ); wait_ms( DELAY_PM_TSS_50B );
wait_ms( DELAY_PM_5V_TO_VCOM );
PM_TCOM_VCS_on( ); PM_TCOM_VCS_on( );
wait_ms( DELAY_PM_TSS_50B ); wait_ms( DELAY_PM_TSS_50B );
iic_mcu_write_a_byte( IIC_SLA_PMIC, 0x22, 0x4A ); // バグ持ちPMIC対策 iic_mcu_write_a_byte( IIC_SLA_PMIC, 0x22, 0x4A ); // バグ持ちPMIC対策
vreg_ctr[VREG_C_STATUS] |= REG_BIT_LCD_POW; vreg_ctr[VREG_C_STATUS] |= REG_BIT_LCD_POW;
SLP_O = 0; // 1でミュート
return ( PM_chk_LDSW( ) ); return ( PM_chk_LDSW( ) );
} }
err PM_LCD_off( )
{
PM_TCOM_VCS_off( );
wait_ms( 1 + 50 );
err PM_BL_on(){ // PM_VDDLCD_off(); // 残ってたの全部止めます。
vreg_ctr[VREG_C_STATUS] &= ~REG_BIT_LCD_POW;
SLP_O = 1;
return ( ERR_SUCCESS );
}
err PM_BL_on( )
{
PM_set_BL( 0x03 ); PM_set_BL( 0x03 );
wait_ms( 10 ); wait_ms( 10 );
@ -407,44 +350,56 @@ err PM_BL_on(){
} }
err PM_BL_off(){ err PM_BL_off( )
{
PM_set_BL( 0x00 ); PM_set_BL( 0x00 );
vreg_ctr[VREG_C_STATUS] &= ~REG_BIT_BL; vreg_ctr[VREG_C_STATUS] &= ~REG_BIT_BL;
return ( ERR_SUCCESS ); return ( ERR_SUCCESS );
} }
err PM_LCD_off(){ /* ========================================================
PM_TCOM_VCS_off();
wait_ms( 1 + 50 );
======================================================== */
err PM_LCD_vcom_set( )
{
u8 rv;
PM_VDDLCD_off(); // 残ってたの全部止めます。 rv = iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_POW_DAC1, vreg_ctr[VREG_C_VCOM_T] ); // がっかりなことに、PMICはバースト書き込み不可
vreg_ctr[ VREG_C_STATUS ] &= ~REG_BIT_LCD_POW; rv |= iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_POW_DAC2, vreg_ctr[VREG_C_VCOM_B] );
return( ERR_SUCCESS ); return ( rv );
} }
#endif #endif
/* ======================================================== /* ========================================================
I2Cコマンドでの実行の場合の為の I2Cコマンドでの実行の場合の為の
2 2
======================================================== */ ======================================================== */
task_status_immed tski_PM_LCD_on(){ task_status_immed tski_PM_LCD_on( )
{
PM_LCD_on( ); PM_LCD_on( );
return ( ERR_FINISED ); return ( ERR_FINISED );
} }
task_status_immed tski_PM_BL_on(){ task_status_immed tski_PM_BL_on( )
{
PM_BL_on( ); PM_BL_on( );
return ( ERR_FINISED ); return ( ERR_FINISED );
} }
task_status_immed tski_PM_BL_off(){ task_status_immed tski_PM_BL_off( )
{
PM_BL_off( ); PM_BL_off( );
return ( ERR_FINISED ); return ( ERR_FINISED );
} }
task_status_immed tski_PM_LCD_off(){ task_status_immed tski_PM_LCD_off( )
{
PM_LCD_off( ); PM_LCD_off( );
return ( ERR_FINISED ); return ( ERR_FINISED );
} }
@ -462,12 +417,15 @@ task_status_immed tski_PM_LCD_off(){
POW_CONT1,2 TEG電源のみ POW_CONT1,2 TEG電源のみ
======================================================== */ ======================================================== */
err PM_sys_pow_on(){ err PM_sys_pow_on( )
{
#ifndef _PMIC_TWL_ #ifndef _PMIC_TWL_
u8 temp; u8 temp;
// 電池温度測定 // 電池温度測定
while( ADCEN != 0 ){;} while( ADCEN != 0 )
{;
}
BT_TEMP_P = 1; BT_TEMP_P = 1;
vreg_ctr[VREG_C_BT_TEMP] = get_adc( ADC_SEL_BATT_TEMP ); vreg_ctr[VREG_C_BT_TEMP] = get_adc( ADC_SEL_BATT_TEMP );
BT_TEMP_P = 0; BT_TEMP_P = 0;
@ -476,7 +434,8 @@ err PM_sys_pow_on(){
// 残量チェック // 残量チェック
vreg_ctr[VREG_C_BT_REMAIN] = PM_get_batt_left( ); vreg_ctr[VREG_C_BT_REMAIN] = PM_get_batt_left( );
vreg_ctr[VREG_C_BT_REMAIN] = 200; vreg_ctr[VREG_C_BT_REMAIN] = 200;
if( vreg_ctr[ VREG_C_BT_REMAIN ] < 0 ){ if( vreg_ctr[VREG_C_BT_REMAIN] < 0 )
{
return ( 1 ); return ( 1 );
} }
@ -497,9 +456,10 @@ err PM_sys_pow_on(){
PM_VDD50A_on( ); PM_VDD50A_on( );
wait_ms( DELAY_PM_TW_PWUP ); wait_ms( DELAY_PM_TW_PWUP );
iic_mcu_write_a_byte( IIC_SLA_PMIC, 0x05, 0x07 ); // バグ持ちPMIC対策 強制PWM iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_POW_SAVE, 0x03 ); // バグ持ちPMIC対策 強制PWM
if( PM_chk_LDSW() == 0 ){ if( PM_chk_LDSW( ) == 0 )
{
return ( ERR_ERR ); return ( ERR_ERR );
} }
PM_reset_neg( ); PM_reset_neg( );
@ -523,7 +483,8 @@ err PM_sys_pow_on(){
// 残量確認 // 残量確認
temp = PM_get_batt_left( ); temp = PM_get_batt_left( );
temp = 200; temp = 200;
if( temp < ( 255 * 0.03 ) ){ if( temp < ( 255 * 0.03 ) )
{
return ( ERR_ERR ); return ( ERR_ERR );
} }
vreg_ctr[VREG_C_BT_REMAIN] = temp; vreg_ctr[VREG_C_BT_REMAIN] = temp;
@ -532,7 +493,8 @@ err PM_sys_pow_on(){
RESET2_neg; RESET2_neg;
FCRAM_RST_neg; FCRAM_RST_neg;
wait_ms( 100 ); wait_ms( 100 );
if( !RESET1_n ){ if( !RESET1_n )
{
// 起動失敗 // 起動失敗
RESETs_ast; RESETs_ast;
FCRAM_RST_ast; FCRAM_RST_ast;
@ -549,8 +511,9 @@ err PM_sys_pow_on(){
OFFシーケンス OFFシーケンス
todo: todo:
======================================================== */ ======================================================== */
err PM_sys_pow_off(){ err PM_sys_pow_off( )
#ifndef _PMIC_TWL_ {
#ifdef _PMIC_CTR_
PM_BL_off( ); PM_BL_off( );
PM_LCD_off( ); // TCOM,VCS OFF も消してきます。 PM_LCD_off( ); // TCOM,VCS OFF も消してきます。
@ -563,7 +526,8 @@ err PM_sys_pow_off(){
PM_LDSW_off( ); PM_LDSW_off( );
#else #else
if( RESET1_n ){ if( RESET1_n )
{
RESETs_ast; RESETs_ast;
FCRAM_RST_ast; FCRAM_RST_ast;
@ -585,13 +549,15 @@ err PM_sys_pow_off(){
/* ======================================================== /* ========================================================
======================================================== */ ======================================================== */
err to_sleep(){ err to_sleep( )
{
PM_LCD_off( ); PM_LCD_off( );
return 0; return 0;
} }
/* ======================================================== /* ========================================================
@ -608,21 +574,38 @@ err to_sleep(){
PM_EXTDCは割り込みメインにするかも PM_EXTDCは割り込みメインにするかも
======================================================== */ ======================================================== */
task_interval tsk_batt(){ #define INTERVAL_TSK_BATT 100
void tsk_batt( )
{
static u8 task_interval = 0;
static u8 charge_hys = 0; // ヒステリシスで上限下限を拡張するとき1 static u8 charge_hys = 0; // ヒステリシスで上限下限を拡張するとき1
// 電源周りのステータスが変化? if( task_interval != 0 )
{
task_interval -= 1;
return;
}
else
{
task_interval = ( INTERVAL_TSK_BATT / SYS_INTERVAL_TICK );
}
// 電源周りのステータスが変化? ///
set_bit( PM_EXTDC, vreg_ctr[VREG_C_STATUS], REG_BIT_POW_SUPPLY ); set_bit( PM_EXTDC, vreg_ctr[VREG_C_STATUS], REG_BIT_POW_SUPPLY );
set_bit( !BT_CHG_n, vreg_ctr[VREG_C_STATUS], REG_BIT_BATT_CHARGE ); set_bit( !BT_CHG_n, vreg_ctr[VREG_C_STATUS], REG_BIT_BATT_CHARGE );
// →割り込み。miscの中でよろしくやってくれている。 // →割り込み。miscの中でよろしくやってくれている。
// 充電 // 充電 ///////////////////////////
// 温度付きヒステリシス // 温度付きヒステリシス
if( (( 345 / 4 ) < vreg_ctr[ VREG_C_BT_TEMP ] ) && ( vreg_ctr[ VREG_C_BT_TEMP ] < ( 739 / 4 )) ){ if( ( ( 345 / 4 ) < vreg_ctr[VREG_C_BT_TEMP] ) && ( vreg_ctr[VREG_C_BT_TEMP] < ( 739 / 4 ) ) )
{
charge_hys = 1; charge_hys = 1;
} }
if(( (( 345 - 65 ) / 4 ) < vreg_ctr[ VREG_C_BT_TEMP ] ) && ( vreg_ctr[ VREG_C_BT_TEMP ] < (( 739 + 18 ) / 4 )) ){ if( ( ( ( 345 - 65 ) / 4 ) < vreg_ctr[VREG_C_BT_TEMP] )
&& ( vreg_ctr[VREG_C_BT_TEMP] < ( ( 739 + 18 ) / 4 ) ) )
{
charge_hys = 0; charge_hys = 0;
} }
@ -632,16 +615,37 @@ task_interval tsk_batt(){
|| ||
( ( charge_hys == 0 ) ( ( charge_hys == 0 )
&& ( ( 345 / 4 ) < vreg_ctr[VREG_C_BT_TEMP] ) && ( ( 345 / 4 ) < vreg_ctr[VREG_C_BT_TEMP] )
&& ( vreg_ctr[ VREG_C_BT_TEMP ] < ( 739 / 4 )) ) ){ && ( vreg_ctr[VREG_C_BT_TEMP] < ( 739 / 4 ) ) ) )
{
BT_CHG_EN = 1; BT_CHG_EN = 1;
}else{ }
else
{
BT_CHG_EN = 0; BT_CHG_EN = 0;
} }
// 充電LED // 充電LED
LED_duty_CHARGE = !BT_CHG_n ? vreg_ctr[VREG_C_LED_BRIGHT] : 0; LED_duty_CHARGE = !BT_CHG_n ? vreg_ctr[VREG_C_LED_BRIGHT] : 0;
return( 50 ); if(( vreg_ctr[ VREG_C_STATUS_X ] & 0x01 ) == 0 )
{
// 電池残量の取得
{
u8 temp;
temp = PM_get_batt_left();
vreg_ctr[ VREG_C_BT_REMAIN ] = temp;
// todo 閾値を超えたら割り込み
}
}
else
{
vreg_ctr[ VREG_C_BT_REMAIN ] = 0xFF;
}
vreg_ctr[ VREG_C_FREE0 ] = vreg_ctr[ VREG_C_BT_REMAIN ];
vreg_ctr[ VREG_C_FREE1 ] = iic_mcu_read_a_byte( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_VCELL );
return;
} }
@ -652,7 +656,8 @@ task_interval tsk_batt(){
OFFから起こす OFFから起こす
(pm) (pm)
=========================================================*/ =========================================================*/
__interrupt void intp4_extdc(){ __interrupt void intp4_extdc( )
{
; ;
} }
@ -663,7 +668,8 @@ __interrupt void intp4_extdc(){
OFFから起こす OFFから起こす
(misc) (misc)
=========================================================*/ =========================================================*/
__interrupt void intp5_shell(){ __interrupt void intp5_shell( )
{
; ;
} }
@ -671,7 +677,8 @@ __interrupt void intp5_shell(){
/*========================================================= /*=========================================================
PMICへのコマンド書き込み PMICへのコマンド書き込み
=========================================================*/ =========================================================*/
__interrupt void intp6_PM_irq(){ __interrupt void intp6_PM_irq( )
{
renge_task_immed_add( ntr_pmic_comm ); renge_task_immed_add( ntr_pmic_comm );
} }
@ -679,7 +686,8 @@ __interrupt void intp6_PM_irq(){
/* ======================================================== /* ========================================================
PMICからの割り込みを受けてNTRPMIC互換レジスタからリード PMICからの割り込みを受けてNTRPMIC互換レジスタからリード
======================================================== */ ======================================================== */
task_status_immed ntr_pmic_comm(){ task_status_immed ntr_pmic_comm( )
{
#ifdef _CODEC_CTR_ #ifdef _CODEC_CTR_
static u8 reg_shadow; static u8 reg_shadow;
u8 reg_old; u8 reg_old;
@ -689,34 +697,44 @@ task_status_immed ntr_pmic_comm(){
DI( ); DI( );
// offリクエスト // offリクエスト
if(( reg_shadow & REG_BIT_TWL_REQ_OFF_REQ ) != 0 ){ if( ( reg_shadow & REG_BIT_TWL_REQ_OFF_REQ ) != 0 )
{
set_irq( VREG_C_IRQ3, REG_BIT_TWL_OFF_REQ ); set_irq( VREG_C_IRQ3, REG_BIT_TWL_OFF_REQ );
vreg_ctr[VREG_C_IRQ3] |= REG_BIT_TWL_OFF_REQ; vreg_ctr[VREG_C_IRQ3] |= REG_BIT_TWL_OFF_REQ;
if( ( vreg_ctr[ VREG_C_IRQ_MASK3 ] & REG_BIT_TWL_OFF_REQ ) == 0 ){ if( ( vreg_ctr[VREG_C_IRQ_MASK3] & REG_BIT_TWL_OFF_REQ ) == 0 )
{
IRQ0_ast; IRQ0_ast;
} }
} }
// リセットリクエスト // リセットリクエスト
if(( reg_shadow & REG_BIT_TWL_REQ_RST_REQ ) != 0 ){ if( ( reg_shadow & REG_BIT_TWL_REQ_RST_REQ ) != 0 )
{
vreg_ctr[VREG_C_IRQ3] |= REG_BIT_TWL_RESET_REQ; vreg_ctr[VREG_C_IRQ3] |= REG_BIT_TWL_RESET_REQ;
if( ( vreg_ctr[ VREG_C_IRQ_MASK3 ] & REG_BIT_TWL_RESET_REQ ) == 0 ){ if( ( vreg_ctr[VREG_C_IRQ_MASK3] & REG_BIT_TWL_RESET_REQ ) == 0 )
{
IRQ0_ast; IRQ0_ast;
} }
} }
// バックライトが... // バックライトが...
if( (( reg_old ^ reg_shadow ) & ~( REG_BIT_TWL_REQ_BL )) != 0 ){ if( ( ( reg_old ^ reg_shadow ) & ~( REG_BIT_TWL_REQ_BL ) ) != 0 )
if(( reg_shadow & ( REG_BIT_TWL_REQ_BL )) == 0x00 ){ {
if( ( reg_shadow & ( REG_BIT_TWL_REQ_BL ) ) == 0x00 )
{
// 両方消された // 両方消された
vreg_ctr[VREG_C_IRQ3] |= REG_BIT_TWL_BL_OFF; vreg_ctr[VREG_C_IRQ3] |= REG_BIT_TWL_BL_OFF;
if( ( vreg_ctr[ VREG_C_IRQ_MASK3 ] & REG_BIT_TWL_BL_OFF ) == 0 ){ if( ( vreg_ctr[VREG_C_IRQ_MASK3] & REG_BIT_TWL_BL_OFF ) == 0 )
{
IRQ0_ast; IRQ0_ast;
} }
}else if(( reg_shadow & ( REG_BIT_TWL_REQ_BL )) == ( REG_BIT_TWL_REQ_BL )){ }
else if( ( reg_shadow & ( REG_BIT_TWL_REQ_BL ) ) == ( REG_BIT_TWL_REQ_BL ) )
{
// 両方ついた // 両方ついた
vreg_ctr[VREG_C_IRQ3] |= REG_BIT_TWL_BL_ON; vreg_ctr[VREG_C_IRQ3] |= REG_BIT_TWL_BL_ON;
if( ( vreg_ctr[ VREG_C_IRQ_MASK3 ] & REG_BIT_TWL_BL_ON ) == 0 ){ if( ( vreg_ctr[VREG_C_IRQ_MASK3] & REG_BIT_TWL_BL_ON ) == 0 )
{
IRQ0_ast; IRQ0_ast;
} }
} }

View File

@ -7,18 +7,21 @@
//========================================================= //=========================================================
enum BT_GAUGE_REG_ADRS{ enum BT_GAUGE_REG_ADRS
{
BT_GAUGE_REG_VCELL = 0x02, // それぞれ16ビットのため BT_GAUGE_REG_VCELL = 0x02, // それぞれ16ビットのため
BT_GAUGE_REG_SOC = 0x04, BT_GAUGE_REG_SOC = 0x04,
BT_GAUGE_REG_MODE = 0x06, BT_GAUGE_REG_MODE = 0x06,
BT_GAUGE_REG_VERSION = 0x08, BT_GAUGE_REG_VERSION = 0x08,
BT_GAUGE_REG_OCV = 0x0E, BT_GAUGE_REG_OCV = 0x0E,
BT_GAUGE_REG_RCOMP = 0xC0, BT_GAUGE_REG_RCOMP = 0x0C,
BT_GAUGE_REG_LOCK = 0x3E, BT_GAUGE_REG_LOCK = 0x3E,
BT_GAUGE_REG_BT_PARAM = 0x40,
BT_GAUGE_REG_COMMAND = 0xFE BT_GAUGE_REG_COMMAND = 0xFE
}; };
enum PMIC_REG_ADRS{ enum PMIC_REG_ADRS
{
PM_REG_ADRS_VER = 0x00, // verinfo など PM_REG_ADRS_VER = 0x00, // verinfo など
PM_REG_ADRS_VDD_SYS, // システムが使用する電源 PM_REG_ADRS_VDD_SYS, // システムが使用する電源
PM_REG_ADRS_VDD_LCD, // 液晶電源 PM_REG_ADRS_VDD_LCD, // 液晶電源
@ -46,6 +49,7 @@ enum PMIC_REG_ADRS{
#define DELAY_PM_TW_PWUP 16 #define DELAY_PM_TW_PWUP 16
#define DELAY_PM_TSS_50B 5 #define DELAY_PM_TSS_50B 5
#define DELAY_PM_5V_TO_VCOM 17

View File

@ -22,7 +22,7 @@
bit renge_flg_interval; bit renge_flg_interval;
bit renge_task_interval_run_force; bit renge_task_interval_run_force;
extern task_info tasks[]; extern const task_info tasks[];
#include "..\bsr_system.h" #include "..\bsr_system.h"
extern system_status_ system_status; extern system_status_ system_status;
@ -75,28 +75,9 @@ err renge_task_interval_run(){
current_task != &tasks[TSK_LAST]; current_task != &tasks[TSK_LAST];
current_task += 1 ) current_task += 1 )
{ {
current_task -> task();
// if( current_task -> dispatch_type == INTERVAL ){
if( current_task -> interval == 0 ){
current_task -> interval = current_task -> task();
}else{
current_task -> interval -= 1;
}
// }
} }
} }
// ***_TRIG等で強制起動
while( renge_task_interval_run_force ){
renge_task_interval_run_force = 0; // とりあえず、何が何でもフラグ消しちゃうけど...
for( current_task = &tasks[0];
current_task != &tasks[TSK_LAST];
current_task += 1 )
{
current_task -> interval = current_task -> task();
}
}
return( ERR_SUCCESS ); return( ERR_SUCCESS );
} }

View File

@ -26,6 +26,12 @@ typedef unsigned char err;
//*/ //*/
// *****************************************************************************
#define SYS_INTERVAL_TICK 1.953
//****************************************************************************** //******************************************************************************
typedef u8 task_rv; typedef u8 task_rv;
@ -42,8 +48,6 @@ typedef task_interval ( *p_task )(); // p_task
typedef struct{ typedef struct{
p_task task; p_task task;
// dispatch_type dispatch_type;
task_interval interval;
}task_info; }task_info;
/************************************** /**************************************

View File

@ -13,7 +13,6 @@
extern task_status_immed ntr_pmic_comm(); extern task_status_immed ntr_pmic_comm();
extern task_status_immed tsk_cbk_accero(); extern task_status_immed tsk_cbk_accero();
extern task_status_immed do_command0(); extern task_status_immed do_command0();
extern task_status_immed do_command1();
extern task_status_immed acc_read(); extern task_status_immed acc_read();
extern task_status_immed acc_write(); extern task_status_immed acc_write();

View File

@ -6,35 +6,31 @@
#include "renge_defs.h" #include "renge_defs.h"
enum { enum {
TSK_SW, TSK_WIFI, TSK_ADC, TSK_BATT, TSK_LED_POW, TSK_LED_WIFI, TSK_LED_CAM, TSK_MISC_STAT, TSK_DEBUG, TSK_DEBUG2, TSK_SOFT_INT, TSK_SYS, TSK_LAST TSK_SW, TSK_ADC, TSK_BATT, TSK_LED_POW, TSK_LED_WIFI, TSK_LED_CAM, TSK_MISC_STAT, TSK_DEBUG, TSK_DEBUG2, TSK_SYS, TSK_LAST
}; };
extern task_interval tsk_sw(); extern void tsk_sw();
extern task_interval tsk_wifi(); extern void tsk_adc();
extern task_interval tsk_adc(); extern void tsk_batt();
extern task_interval tsk_batt(); extern void tsk_led_pow();
extern task_interval tsk_led_pow(); extern void tsk_led_wifi();
extern task_interval tsk_led_wifi(); extern void tsk_led_cam();
extern task_interval tsk_led_cam(); extern void tsk_misc_stat();
extern task_interval tsk_misc_stat(); extern void tsk_debug();
extern task_interval tsk_debug(); extern void tsk_debug2();
extern task_interval tsk_debug2(); extern void tsk_sys();
extern task_interval tsk_soft_int();
extern task_interval tsk_sys();
task_info tasks[ TSK_LAST ] = { static const task_info tasks[ TSK_LAST ] = {
{ tsk_sw, 0 }, tsk_sw,
{ tsk_wifi, 0 }, tsk_adc,
{ tsk_adc, 0 }, tsk_batt,
{ tsk_batt, 0 }, tsk_led_pow,
{ tsk_led_pow, 0 }, tsk_led_wifi,
{ tsk_led_wifi, 0 }, tsk_led_cam,
{ tsk_led_cam, 0 }, tsk_misc_stat,
{ tsk_misc_stat, 0 }, tsk_debug,
{ tsk_debug, 0 }, tsk_debug2,
{ tsk_debug2, 0 }, tsk_sys,
{ tsk_soft_int, 0 },
{ tsk_sys, 0 },
}; };

View File

@ -1,5 +1,4 @@
sw sw
wifi
adc adc
batt batt
led_pow led_pow
@ -8,5 +7,4 @@ led_cam
misc_stat misc_stat
debug debug
debug2 debug2
soft_int
sys sys

View File

@ -19,9 +19,11 @@ bit rtc_alarm_dirty;
======================================================== */ ======================================================== */
void RTC_init(void){ void RTC_init( void )
{
// if( !RTCEN ){ if( !RTCEN )
{
RTCEN = 1; // モジュールON RTCEN = 1; // モジュールON
// RTC設定 // RTC設定
@ -41,7 +43,7 @@ SEC = 0;
vreg_ctr[VREG_C_MCU_STATUS] = REG_BIT_RTC_BLACKOUT; vreg_ctr[VREG_C_MCU_STATUS] = REG_BIT_RTC_BLACKOUT;
// } }
// 割り込み設定 // 割り込み設定
RTCIF = 0; RTCIF = 0;
RTCIIF = 0; RTCIIF = 0;
@ -51,7 +53,9 @@ SEC = 0;
RTCE = 1; /* 動作開始 */ RTCE = 1; /* 動作開始 */
RWAIT = 1; RWAIT = 1;
while( !RWST ){;} while( !RWST )
{;
}
RWAIT = 0; RWAIT = 0;
rtc_lock = 0; rtc_lock = 0;
@ -65,10 +69,9 @@ SEC = 0;
RTC RTC
2^6/fXT1.953125 ms 2^6/fXT1.953125 ms
======================================================== */ ======================================================== */
__interrupt void int_rtc_int(){ __interrupt void int_rtc_int( )
DBG_LED_WIFI_2_on; {
renge_flg_interval = 1; renge_flg_interval = 1;
DBG_LED_WIFI_2_off;
} }
@ -76,16 +79,19 @@ __interrupt void int_rtc_int(){
RTC RTC
2^6/fXT1.953125 ms 2^6/fXT1.953125 ms
======================================================== */ ======================================================== */
__interrupt void int_rtc(){ __interrupt void int_rtc( )
{
if( ( vreg_ctr[VREG_C_RTC_ALARM_DAY] == DAY ) if( ( vreg_ctr[VREG_C_RTC_ALARM_DAY] == DAY )
&& ( vreg_ctr[VREG_C_RTC_ALARM_MONTH] == MONTH ) && ( vreg_ctr[VREG_C_RTC_ALARM_MONTH] == MONTH )
&& ( vreg_ctr[VREG_C_RTC_ALARM_YEAR] == YEAR ) ) && ( vreg_ctr[VREG_C_RTC_ALARM_YEAR] == YEAR ) )
{ {
if( ( vreg_ctr[ VREG_C_IRQ_MASK1 ] & REG_BIT_RTC_ALARM ) == 0 ){ if( ( vreg_ctr[VREG_C_IRQ_MASK1] & REG_BIT_RTC_ALARM ) == 0 )
{
vreg_ctr[VREG_C_IRQ1] |= REG_BIT_RTC_ALARM; vreg_ctr[VREG_C_IRQ1] |= REG_BIT_RTC_ALARM;
IRQ0_ast; IRQ0_ast;
// マスクをしてあったら、電源を入れません // マスクをしてあったら、電源を入れません
if( system_status.pwr_state == OFF ){ if( system_status.pwr_state == OFF )
{
system_status.poweron_reason = RTC_ALARM; system_status.poweron_reason = RTC_ALARM;
} }
} }
@ -98,11 +104,15 @@ __interrupt void int_rtc(){
RTC RTC
sec,min,hour,week,day,month,year sec,min,hour,week,day,month,year
======================================================== */ ======================================================== */
void get_rtc(){ void get_rtc( )
if( rtc_lock == 0 ){ {
if( rtc_lock == 0 )
{
rtc_lock = 1; rtc_lock = 1;
RWAIT = 1; RWAIT = 1;
while( !RWST ){;} while( !RWST )
{;
}
memcpy( &vreg_ctr[VREG_C_RTC_SEC], &SEC, 7 ); memcpy( &vreg_ctr[VREG_C_RTC_SEC], &SEC, 7 );
RWAIT = 0; RWAIT = 0;
@ -118,8 +128,10 @@ void get_rtc(){
RTCにセットするのはset_rtc_close() RTCにセットするのはset_rtc_close()
======================================================== */ ======================================================== */
void set_rtc( u8 adrs, u8 data ){ void set_rtc( u8 adrs, u8 data )
if( rtc_dirty == 0 ){ {
if( rtc_dirty == 0 )
{
rtc_dirty = 1; rtc_dirty = 1;
memcpy( rtc_work, &SEC, 7 ); memcpy( rtc_work, &SEC, 7 );
// renge_task_immed_add( tski_rtc_close ); // renge_task_immed_add( tski_rtc_close );
@ -133,23 +145,28 @@ void set_rtc( u8 adrs, u8 data ){
RTCレジスタの更新 RTCレジスタの更新
======================================================== */ ======================================================== */
// task_status_immed tski_rtc_close(){ // task_status_immed tski_rtc_close(){
void rtc_unlock(){ void rtc_unlock( )
{
// リードロック // リードロック
// if( rtc_lock != 0 ){ // if( rtc_lock != 0 ){
rtc_lock = 0; rtc_lock = 0;
// } // }
// ライトロック // ライトロック
if( rtc_dirty != 0 ){ if( rtc_dirty != 0 )
{
rtc_dirty = 0; rtc_dirty = 0;
RWAIT = 1; RWAIT = 1;
while( !RWST ){;} while( !RWST )
{;
}
memcpy( &SEC, rtc_work, 7 ); memcpy( &SEC, rtc_work, 7 );
RWAIT = 0; RWAIT = 0;
} }
// アラームセット // アラームセット
if( rtc_alarm_dirty ){ if( rtc_alarm_dirty )
{
WALE = 0; WALE = 0;
ALARMWM = vreg_ctr[VREG_C_RTC_ALARM_MIN]; ALARMWM = vreg_ctr[VREG_C_RTC_ALARM_MIN];
ALARMWH = vreg_ctr[VREG_C_RTC_ALARM_HOUR]; ALARMWH = vreg_ctr[VREG_C_RTC_ALARM_HOUR];
@ -157,5 +174,3 @@ void rtc_unlock(){
WALE = 1; WALE = 1;
} }
} }

View File

@ -85,7 +85,8 @@ u8 boot_ura; //
/* ======================================================== /* ========================================================
======================================================== */ ======================================================== */
err firm_update(){ err firm_update( )
{
u8 buffer_fill; u8 buffer_fill;
u8 target_block; u8 target_block;
u8 data_buffer[SELF_UPDATE_BUFF_SIZE]; u8 data_buffer[SELF_UPDATE_BUFF_SIZE];
@ -114,34 +115,40 @@ err firm_update(){
p_rom = ( __far u8 * ) 0x2000; p_rom = ( __far u8 * ) 0x2000;
// 書き込み先ブロックの数だけ繰り返す // 書き込み先ブロックの数だけ繰り返す
for( target_block = ( FIRM_TOP + FIRM_SIZE ); for( target_block = ( FIRM_TOP + FIRM_SIZE );
target_block < ( FIRM_TOP + FIRM_SIZE + FIRM_SIZE ); target_block < ( FIRM_TOP + FIRM_SIZE + FIRM_SIZE ); target_block += 1 )
target_block += 1 ){ {
WDT_Restart( ); WDT_Restart( );
// ブロック消去 // ブロック消去
while( FSL_BlankCheck( target_block ) != FSL_OK ){ while( FSL_BlankCheck( target_block ) != FSL_OK )
{
err = FSL_Erase( target_block ); err = FSL_Erase( target_block );
} }
// 分割書き込み分繰り返す // 分割書き込み分繰り返す
for( split_write_count = 0; for( split_write_count = 0;
split_write_count < SELF_UPDATE_SPLIT_WRITE_NUM; split_write_count < SELF_UPDATE_SPLIT_WRITE_NUM; split_write_count += 1 )
split_write_count += 1 ){ {
// 書き込みデータをバッファにためる // 書き込みデータをバッファにためる
buffer_fill = 0; buffer_fill = 0;
do{ do
{
data_buffer[buffer_fill] = *p_rom; data_buffer[buffer_fill] = *p_rom;
p_rom += 1; p_rom += 1;
buffer_fill++; buffer_fill++;
}while( buffer_fill != (u8)SELF_UPDATE_BUFF_SIZE ); }
while( buffer_fill != ( u8 ) SELF_UPDATE_BUFF_SIZE );
// 書き込み // 書き込み
err = FSL_Write( ( fsl_u32 ) ( target_block * SAM_BLOCK_SIZE err = FSL_Write( ( fsl_u32 ) ( target_block * SAM_BLOCK_SIZE
+ split_write_count * SELF_UPDATE_BUFF_SIZE ), +
split_write_count *
SELF_UPDATE_BUFF_SIZE ),
( fsl_u08 ) ( SELF_UPDATE_BUFF_SIZE / SAM_WORD_SIZE ) ); ( fsl_u08 ) ( SELF_UPDATE_BUFF_SIZE / SAM_WORD_SIZE ) );
if( err != FSL_OK ){ if( err != FSL_OK )
{
FSL_Close( ); FSL_Close( );
NOP( ); NOP( );
return ( ERR_ERR ); return ( ERR_ERR );
@ -149,7 +156,9 @@ err firm_update(){
} }
// 1ブロック書き込み完了。内部電圧チェックを行う // 1ブロック書き込み完了。内部電圧チェックを行う
while( FSL_IVerify( target_block ) != FSL_OK ){ ; } while( FSL_IVerify( target_block ) != FSL_OK )
{;
}
} }
// 書き替え // // 書き替え //
@ -161,8 +170,8 @@ err firm_update(){
// 全ブロック消去 // 全ブロック消去
for( target_block = INACTIVE_BOOTSECT_TOP; for( target_block = INACTIVE_BOOTSECT_TOP;
target_block <= UPDATE_BLOCK_LAST ; target_block <= UPDATE_BLOCK_LAST; target_block += 1 )
target_block += 1 ){ {
err = FSL_Erase( target_block ); err = FSL_Erase( target_block );
} }
@ -170,39 +179,50 @@ err firm_update(){
// ブロックの数だけ繰り返し // ブロックの数だけ繰り返し
for( target_block = INACTIVE_BOOTSECT_TOP; for( target_block = INACTIVE_BOOTSECT_TOP;
target_block <= UPDATE_BLOCK_LAST; target_block <= UPDATE_BLOCK_LAST; target_block += 1 )
target_block += 1 ){ {
// 分割書き込み // 分割書き込み
for( split_write_count = 0; for( split_write_count = 0;
(( split_write_count < SELF_UPDATE_SPLIT_WRITE_NUM ) && ( !SPD )); ( ( split_write_count < SELF_UPDATE_SPLIT_WRITE_NUM )
split_write_count += 1 ){ && ( !SPD ) ); split_write_count += 1 )
{
WDT_Restart( ); WDT_Restart( );
// I2Cから書き込みデータをバッファにためる // I2Cから書き込みデータをバッファにためる
do{ do
while( !IICAIF && !SPD ){;} {
while( !IICAIF && !SPD )
{;
}
IICAIF = 0; IICAIF = 0;
data_buffer[buffer_fill] = IICA; data_buffer[buffer_fill] = IICA;
WREL = 1; WREL = 1;
buffer_fill += 1; buffer_fill += 1;
}while(( buffer_fill != (u8)SELF_UPDATE_BUFF_SIZE ) && !SPD ); }
while( ( buffer_fill != ( u8 ) SELF_UPDATE_BUFF_SIZE ) && !SPD );
// 書き込み // 書き込み
// 最後だと、ゴミをパディングするが別にかまわない // 最後だと、ゴミをパディングするが別にかまわない
err = FSL_Write( ( fsl_u32 ) ( target_block * SAM_BLOCK_SIZE err = FSL_Write( ( fsl_u32 ) ( target_block * SAM_BLOCK_SIZE
+ split_write_count * SELF_UPDATE_BUFF_SIZE ), +
split_write_count *
SELF_UPDATE_BUFF_SIZE ),
( fsl_u08 ) ( SELF_UPDATE_BUFF_SIZE / SAM_WORD_SIZE ) ); ( fsl_u08 ) ( SELF_UPDATE_BUFF_SIZE / SAM_WORD_SIZE ) );
if( err != FSL_OK ){ if( err != FSL_OK )
{
FSL_Close( ); FSL_Close( );
return ( ERR_ERR ); return ( ERR_ERR );
} }
} }
// 1ブロック書き込み完了。内部ベリファイを行う // 1ブロック書き込み完了。内部ベリファイを行う
while( FSL_IVerify( target_block ) != FSL_OK ){;} while( FSL_IVerify( target_block ) != FSL_OK )
{;
}
if( SPD ){ if( SPD )
{
goto firm_update_end; goto firm_update_end;
} }
} }
@ -216,14 +236,19 @@ firm_update_end:
u8 comp = 0; u8 comp = 0;
// 少なくとも、ローダーのマジックと、本文の末尾のマジックは同じか確認 // 少なくとも、ローダーのマジックと、本文の末尾のマジックは同じか確認
for( i = 0; i < sizeof( __TIME__ ); i++ ){ for( i = 0; i < sizeof( __TIME__ ); i++ )
{
comp += ( *( u8 * ) ( N_MGC_L + i ) == *( u8 * ) ( N_MGC_T + i ) ) ? 0 : 1; comp += ( *( u8 * ) ( N_MGC_L + i ) == *( u8 * ) ( N_MGC_T + i ) ) ? 0 : 1;
} }
if( comp == 0 ){ if( comp == 0 )
{
FSL_InvertBootFlag( ); FSL_InvertBootFlag( );
// FSL_ForceReset();
FSL_SwapBootCluster( ); FSL_SwapBootCluster( );
// 戻ってこない // // 戻ってこない //
}else{ }
else
{
FSL_Close( ); FSL_Close( );
firm_restore( ); firm_restore( );
// 戻ってこない // // 戻ってこない //
@ -240,7 +265,8 @@ firm_update_end:
======================================================== */ ======================================================== */
err firm_restore(){ err firm_restore( )
{
u8 buffer_fill; u8 buffer_fill;
u8 target_block; u8 target_block;
u8 data_buffer[SELF_UPDATE_BUFF_SIZE]; u8 data_buffer[SELF_UPDATE_BUFF_SIZE];
@ -268,9 +294,8 @@ err firm_restore(){
p_rom = ( __far u8 * ) 0x4800; p_rom = ( __far u8 * ) 0x4800;
// 転送先ブロックの数だけ繰り返す // 転送先ブロックの数だけ繰り返す
for( target_block = FIRM_TOP; for( target_block = FIRM_TOP; target_block <= UPDATE_BLOCK_LAST; target_block += 1 )
target_block <= UPDATE_BLOCK_LAST; {
target_block += 1 ){
WDT_Restart( ); WDT_Restart( );
// 壊れたファームを消し // 壊れたファームを消し
@ -278,30 +303,37 @@ err firm_restore(){
// 分割書き込み分繰り返す // 分割書き込み分繰り返す
for( split_write_count = 0; for( split_write_count = 0;
split_write_count < SELF_UPDATE_SPLIT_WRITE_NUM; split_write_count < SELF_UPDATE_SPLIT_WRITE_NUM; split_write_count += 1 )
split_write_count += 1 ){ {
// 書き込みデータをバッファにためる // 書き込みデータをバッファにためる
buffer_fill = 0; buffer_fill = 0;
do{ do
{
data_buffer[buffer_fill] = *p_rom; data_buffer[buffer_fill] = *p_rom;
p_rom += 1; p_rom += 1;
buffer_fill++; buffer_fill++;
}while( buffer_fill != (u8)SELF_UPDATE_BUFF_SIZE ); }
while( buffer_fill != ( u8 ) SELF_UPDATE_BUFF_SIZE );
// 書き込み // 書き込み
err = FSL_Write( ( fsl_u32 ) ( target_block * SAM_BLOCK_SIZE err = FSL_Write( ( fsl_u32 ) ( target_block * SAM_BLOCK_SIZE
+ split_write_count * SELF_UPDATE_BUFF_SIZE ), +
split_write_count *
SELF_UPDATE_BUFF_SIZE ),
( fsl_u08 ) ( SELF_UPDATE_BUFF_SIZE / SAM_WORD_SIZE ) ); ( fsl_u08 ) ( SELF_UPDATE_BUFF_SIZE / SAM_WORD_SIZE ) );
if( err != FSL_OK ){ if( err != FSL_OK )
{
FSL_Close( ); FSL_Close( );
return ( ERR_ERR ); return ( ERR_ERR );
} }
} }
// 1ブロック書き込み完了したので内部ベリファイを行う // 1ブロック書き込み完了したので内部ベリファイを行う
while( FSL_IVerify( target_block ) != FSL_OK ){ ; } while( FSL_IVerify( target_block ) != FSL_OK )
{;
}
} }
// todo // todo
//  それでもだなら、LEDちかちかとかさせて、サービス送りにしてもらう //  それでもだなら、LEDちかちかとかさせて、サービス送りにしてもらう
@ -313,7 +345,8 @@ err firm_restore(){
} }
void chk_bootCluster(){ void chk_bootCluster( )
{
u8 data_buffer[SELF_UPDATE_BUFF_SIZE]; u8 data_buffer[SELF_UPDATE_BUFF_SIZE];
u8 err; u8 err;
@ -350,6 +383,10 @@ static void FSL_Open(void)
// 何か前準備? // 何か前準備?
// todo DMAを止める // todo DMAを止める
while( DST1 )
{;
}
DEN1 = 0;
FSL_FLMD0_HIGH; // フラッシュ書き替え許可 FSL_FLMD0_HIGH; // フラッシュ書き替え許可
} }

View File

@ -10,27 +10,27 @@
extern u8 boot_ura; extern u8 boot_ura;
#define INTERVAL_TSK_MISC_STAT 4
/* ========================================================
WiFi
WL_TX,RX
LED_wifi
32kHz
======================================================== */
task_interval tsk_wifi(){
return 10;
}
/* ======================================================== /* ========================================================
======================================================== */ ======================================================== */
task_interval tsk_misc_stat(){ void tsk_misc_stat( )
{
static u8 interval_task_misc_stat = 0;
static u8 state_old; // ステータス変化検出→割り込み の為 static u8 state_old; // ステータス変化検出→割り込み の為
u8 diff; 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 );
}
SHELL_CLOSE_P = 1; SHELL_CLOSE_P = 1;
set_bit( EXT_OPT_OPEN, vreg_ctr[VREG_C_STATUS], REG_BIT_ST_EXT_OPT_OPEN ); set_bit( EXT_OPT_OPEN, vreg_ctr[VREG_C_STATUS], REG_BIT_ST_EXT_OPT_OPEN );
set_bit( SHELL_CLOSE, vreg_ctr[VREG_C_STATUS], REG_BIT_ST_SHELL_CLOSED ); set_bit( SHELL_CLOSE, vreg_ctr[VREG_C_STATUS], REG_BIT_ST_SHELL_CLOSED );
@ -38,74 +38,113 @@ task_interval tsk_misc_stat(){
// ステータスレジスタ関係 → 割り込み // // ステータスレジスタ関係 → 割り込み //
if( ( system_status.pwr_state == ON ) if( ( system_status.pwr_state == ON ) || ( system_status.pwr_state == SLEEP ) )
|| ( system_status.pwr_state == SLEEP ) ){ {
diff = vreg_ctr[VREG_C_STATUS] ^ state_old; diff = vreg_ctr[VREG_C_STATUS] ^ state_old;
if( diff != 0 ){ if( diff != 0 )
{
state_old = vreg_ctr[VREG_C_STATUS];
if( diff & REG_BIT_LCD_POW ){ if( diff & REG_BIT_LCD_POW )
{
// 液晶電源セット完了 // 液晶電源セット完了
if( vreg_ctr[ VREG_C_STATUS ] & REG_BIT_LCD_POW ){ if( vreg_ctr[VREG_C_STATUS] & REG_BIT_LCD_POW )
{
// on // on
set_irq( VREG_C_IRQ3, REG_BIT_LCD_ON ); set_irq( VREG_C_IRQ3, REG_BIT_LCD_ON );
}else{ }
else
{
// off // off
set_irq( VREG_C_IRQ3, REG_BIT_LCD_OFF ); set_irq( VREG_C_IRQ3, REG_BIT_LCD_OFF );
} }
} }
if( diff & REG_BIT_BL ){ if( diff & REG_BIT_BL )
{
// バックライトに変化有り // バックライトに変化有り
if( vreg_ctr[ VREG_C_STATUS ] & REG_BIT_BL ){ if( vreg_ctr[VREG_C_STATUS] & REG_BIT_BL )
{
// ついた // ついた
set_irq( VREG_C_IRQ3, REG_BIT_BL_ON ); set_irq( VREG_C_IRQ3, REG_BIT_BL_ON );
}else{ }
else
{
// 消えた // 消えた
set_irq( VREG_C_IRQ3, REG_BIT_BL_OFF ); set_irq( VREG_C_IRQ3, REG_BIT_BL_OFF );
} }
} }
if( diff & REG_BIT_BATT_CHARGE ){ if( diff & REG_BIT_BATT_CHARGE )
{
// 充電状態に以下略 // 充電状態に以下略
if( vreg_ctr[ VREG_C_STATUS ] & REG_BIT_BATT_CHARGE ){ if( vreg_ctr[VREG_C_STATUS] & REG_BIT_BATT_CHARGE )
{
set_irq( VREG_C_IRQ2, REG_BIT_BT_CHG_START ); set_irq( VREG_C_IRQ2, REG_BIT_BT_CHG_START );
}else{ }
else
{
set_irq( VREG_C_IRQ2, REG_BIT_BT_CHG_STOP ); set_irq( VREG_C_IRQ2, REG_BIT_BT_CHG_STOP );
} }
} }
if( diff & REG_BIT_POW_SUPPLY ){ if( diff & REG_BIT_POW_SUPPLY )
{
// 電源供給 // 電源供給
if( vreg_ctr[ VREG_C_STATUS ] & REG_BIT_POW_SUPPLY ){ if( vreg_ctr[VREG_C_STATUS] & REG_BIT_POW_SUPPLY )
{
set_irq( VREG_C_IRQ2, REG_BIT_BT_DC_CONNECT ); set_irq( VREG_C_IRQ2, REG_BIT_BT_DC_CONNECT );
}else{ }
else
{
set_irq( VREG_C_IRQ2, REG_BIT_BT_DC_DISC ); set_irq( VREG_C_IRQ2, REG_BIT_BT_DC_DISC );
} }
} }
if( diff & REG_BIT_ST_EXT_OPT_OPEN ){ if( diff & REG_BIT_ST_EXT_OPT_OPEN )
{
// オプション蓋ロック // オプション蓋ロック
if( vreg_ctr[ VREG_C_STATUS ] & REG_BIT_ST_EXT_OPT_OPEN ){ if( vreg_ctr[VREG_C_STATUS] & REG_BIT_ST_EXT_OPT_OPEN )
{
set_irq( VREG_C_IRQ2, REG_BIT_EXTOPT_LOCK ); set_irq( VREG_C_IRQ2, REG_BIT_EXTOPT_LOCK );
}else{ }
else
{
set_irq( VREG_C_IRQ2, REG_BIT_EXTOPT_OPEN ); set_irq( VREG_C_IRQ2, REG_BIT_EXTOPT_OPEN );
} }
} }
if( diff & REG_BIT_ST_SHELL_CLOSED ){ if( diff & REG_BIT_ST_SHELL_CLOSED )
// BL点灯 {
if( vreg_ctr[ VREG_C_STATUS ] & REG_BIT_ST_SHELL_CLOSED ){ // 蓋の開け閉め
if( vreg_ctr[VREG_C_STATUS] & REG_BIT_ST_SHELL_CLOSED )
{
set_irq( VREG_C_IRQ2, REG_BIT_SHELL_OPEN ); set_irq( VREG_C_IRQ2, REG_BIT_SHELL_OPEN );
}else{ }
else
{
set_irq( VREG_C_IRQ2, REG_BIT_SHELL_CLOSE ); set_irq( VREG_C_IRQ2, REG_BIT_SHELL_CLOSE );
} }
} }
} }
state_old = vreg_ctr[ VREG_C_STATUS ]; #ifdef _MCU_KE3_
/* ========================================================
BSRマイコンはaccero.cで割り込みルーチンからタスク登録します
======================================================== */
if( ( vreg_ctr[VREG_C_ACC_CONFIG] & 0x03 ) != 0x00 )
{
if( ACC_VALID )
{
renge_task_immed_add( tsk_cbk_accero );
} }
}
return( 100 ); #endif
}
return;
} }
@ -113,38 +152,41 @@ task_interval tsk_misc_stat(){
/* ======================================================== /* ========================================================
======================================================== */ ======================================================== */
task_interval tsk_debug(){ void tsk_debug( )
{
u8 temp; u8 temp;
static u8 count = 0; static u8 count = 0;
static u8 task_interval;
if( !SW_SEL_n ){
if( system_status.pwr_state == ON_TRIG ){
renge_task_immed_add( tski_PM_LCD_on );
wait_ms( 50 );
renge_task_immed_add( tski_PM_BL_on );
}
}
/* /*
temp = iic_mcu_read_a_byte( IIC_SLA_8LEDS, IIC_8LEDS_REG_DO ); temp = iic_mcu_read_a_byte( IIC_SLA_8LEDS, IIC_8LEDS_REG_DO );
count += 1; count += 1;
iic_mcu_write_a_byte( IIC_SLA_8LEDS, IIC_8LEDS_REG_DO, count ); iic_mcu_write_a_byte( IIC_SLA_8LEDS, IIC_8LEDS_REG_DO, count );
iic_mcu_write_a_byte( IIC_SLA_DBG_MONITOR, 3, count ); iic_mcu_write_a_byte( IIC_SLA_DBG_MONITOR, 3, count );
return 0;
*/ */
return 255; return;
} }
task_interval tsk_debug2(){ void tsk_debug2( )
{
u8 str[4]; u8 str[4];
return( 3 ); 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 ];
if(( system_status.pwr_state == ON )
|| ( system_status.pwr_state == SLEEP )){
str[3] = boot_ura;
str[2] = vreg_ctr[ VREG_C_IRQ1 ];
str[1] = vreg_ctr[ VREG_C_IRQ2 ];
str[0] = vreg_ctr[ VREG_C_STATUS ];
// str[3] = vreg_ctr[ VREG_C_IRQ0 ];
// str[2] = vreg_ctr[ VREG_C_IRQ1 ];
// str[1] = vreg_ctr[ VREG_C_IRQ2 ];
// str[0] = vreg_ctr[ VREG_C_STATUS ];
// iic_mcu_write( IIC_SLA_DBG_MONITOR, 0, 4, &str[0] );
// iic_mcu_write_a_byte( IIC_SLA_DBG_MONITOR, 2, vreg_ctr[ VREG_C_IRQ1 ] ); // 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, 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_C_SND_VOL ] );
@ -154,8 +196,10 @@ if(( system_status.pwr_state == ON )
// 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, 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, 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_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( 3 ); return;
} }
@ -163,8 +207,10 @@ if(( system_status.pwr_state == ON )
/* ======================================================== /* ========================================================
======================================================== */ ======================================================== */
task_interval tsk_hina(){ task_interval tsk_hina( )
switch( system_status.pwr_state ){ {
switch ( system_status.pwr_state )
{
case OFF: case OFF:
case ON_TRIG: case ON_TRIG:
case ON: case ON:
@ -174,7 +220,7 @@ task_interval tsk_hina(){
default: default:
} }
return( tick数 ); // 毎 tic 呼ばれることになります return ( X e tick ); // 毎 tic 呼ばれることになります
} }
@ -182,8 +228,8 @@ task_interval tsk_hina(){
/* このように使う /* このように使う
renge_task_immed_add( ); renge_task_immed_add( );
*/ */
task_status_immed tsk_imm_hina( u8* arg ){ task_status_immed tsk_imm_hina( u8 * arg )
{
return ( ERR_FINISED ); return ( ERR_FINISED );
// ERR_FINISED タスクを削除 // ERR_FINISED タスクを削除
// ERR_CONTINUE 次になんか割り込みなり、ユーザー操作なり、システムチックが // ERR_CONTINUE 次になんか割り込みなり、ユーザー操作なり、システムチックが
@ -204,14 +250,19 @@ task_status_immed tsk_imm_hina( u8* arg ){
COMMANDレジスタへの書き込み COMMANDレジスタへの書き込み
  0   0
======================================================== */ ======================================================== */
task_status_immed do_command0(){ task_status_immed do_command0( )
{
// 本体電源など // 本体電源など
if( vreg_ctr[ VREG_C_COMMAND0 ] & REG_BIT_OFF_REQ ){ if( vreg_ctr[VREG_C_COMMAND0] & REG_BIT_OFF_REQ )
{
system_status.pwr_state = OFF_TRIG; system_status.pwr_state = OFF_TRIG;
}else{ }
if( vreg_ctr[ VREG_C_COMMAND0 ] & REG_BIT_RESET1_REQ ){ else
{
if( vreg_ctr[VREG_C_COMMAND0] & REG_BIT_RESET1_REQ )
{
#ifdef _PMIC_TWL_ #ifdef _PMIC_TWL_
RESETs_ast; RESETs_ast;
#else #else
@ -220,10 +271,12 @@ task_status_immed do_command0(){
#endif #endif
FCRAM_RST_ast; FCRAM_RST_ast;
} }
if( vreg_ctr[ VREG_C_COMMAND0 ] & REG_BIT_RESET2_REQ ){ if( vreg_ctr[VREG_C_COMMAND0] & REG_BIT_RESET2_REQ )
{
RESET2_ast; RESET2_ast;
} }
if( vreg_ctr[ VREG_C_COMMAND0 ] & REG_BIT_FCRAM_RESET_REQ ){ if( vreg_ctr[VREG_C_COMMAND0] & REG_BIT_FCRAM_RESET_REQ )
{
FCRAM_RST_ast; FCRAM_RST_ast;
} }
wait_ms( 5 ); wait_ms( 5 );
@ -237,14 +290,20 @@ task_status_immed do_command0(){
} }
// 液晶電源など // 液晶電源など
if( vreg_ctr[ VREG_C_COMMAND0 ] & REG_BIT_CMD_BL_ON ){ if( vreg_ctr[VREG_C_COMMAND0] & REG_BIT_CMD_BL_ON )
{
renge_task_immed_add( tski_PM_BL_on ); renge_task_immed_add( tski_PM_BL_on );
}else if( vreg_ctr[ VREG_C_COMMAND0 ] & REG_BIT_CMD_BL_OFF ){ }
else if( vreg_ctr[VREG_C_COMMAND0] & REG_BIT_CMD_BL_OFF )
{
renge_task_immed_add( tski_PM_BL_off ); renge_task_immed_add( tski_PM_BL_off );
} }
if( vreg_ctr[ VREG_C_COMMAND0 ] & REG_BIT_CMD_LCD_ON ){ if( vreg_ctr[VREG_C_COMMAND0] & REG_BIT_CMD_LCD_ON )
{
renge_task_immed_add( tski_PM_LCD_on ); renge_task_immed_add( tski_PM_LCD_on );
}else if( vreg_ctr[ VREG_C_COMMAND0 ] & REG_BIT_CMD_LCD_OFF ){ }
else if( vreg_ctr[VREG_C_COMMAND0] & REG_BIT_CMD_LCD_OFF )
{
renge_task_immed_add( tski_PM_LCD_off ); renge_task_immed_add( tski_PM_LCD_off );
} }
@ -256,31 +315,17 @@ task_status_immed do_command0(){
/* ======================================================== /* ========================================================
 TWLアプリへの割り込み  TWLアプリへの割り込み
  0
======================================================== */ ======================================================== */
task_status_immed do_command1(){ // task_status_immed do_command1( )
// 呼ばれません
while(1){
NOP(); // 誤り検出
}
vreg_twl[ REG_TWL_ADRS_IRQ ] = (( vreg_ctr[ VREG_C_COMMAND1 ] & REG_BIT_TWL_CMD_PWSW_DET ) != 0 )? REG_BIT_TWL_IRQ_PWSW_DET: 0x00; //pwsw_det
vreg_twl[ REG_TWL_ADRS_IRQ ] |= (( vreg_ctr[ VREG_C_COMMAND1 ] & REG_BIT_TWL_CMD_RESET ) != 0 )? REG_BIT_TWL_IRQ_RESET: 0x00; //reset_req
vreg_twl[ REG_TWL_ADRS_IRQ ] |= (( vreg_ctr[ VREG_C_COMMAND1 ] & REG_BIT_TWL_CMD_OFF ) != 0 )? REG_BIT_TWL_IRQ_OFF: 0x00; //off_req
vreg_twl[ REG_TWL_ADRS_IRQ ] |= (( vreg_ctr[ VREG_C_COMMAND1 ] & REG_BIT_TWL_CMD_BT_LOW ) != 0 )? REG_BIT_TWL_IRQ_BT_LOW: 0x00; //batt_low
vreg_twl[ REG_TWL_ADRS_IRQ ] |= (( vreg_ctr[ VREG_C_COMMAND1 ] & REG_BIT_TWL_CMD_BT_EMPTY ) != 0 )? REG_BIT_TWL_IRQ_BT_EMPTY: 0x00; //batt_empty
vreg_twl[ REG_TWL_ADRS_IRQ ] |= (( vreg_ctr[ VREG_C_COMMAND1 ] & REG_BIT_TWL_CMD_VOL_CHANGE ) != 0 )? REG_BIT_TWL_IRQ_VOL_CHANGE: 0x00; //vol_changed
return( ERR_FINISED );
}
/* ======================================================== /* ========================================================
CPUからのスリープ要求 CPUからのスリープ要求
======================================================== */ ======================================================== */
__interrupt void intp0_slp(){ // SLP __interrupt void intp0_slp( )
{ // SLP
/* /*
if( SLP_REQ ){ if( SLP_REQ ){
system_status.pwr_state = SLEEP_TRIG; system_status.pwr_state = SLEEP_TRIG;
@ -295,5 +340,3 @@ __interrupt void intp0_slp(){ // SLP
renge_task_interval_run_force = 1; renge_task_interval_run_force = 1;
*/ */
} }

View File

@ -22,46 +22,50 @@ bit SW_pow_mask, SW_home_mask, SW_tune_mask, SW_wifi_mask;
 system_status.pwr_state == OFF_TRIG  system_status.pwr_state == OFF_TRIG
======================================================== */ ======================================================== */
task_interval tsk_sys(){ void tsk_sys( )
{
static u8 timeout = 0; static u8 timeout = 0;
RTCIMK = 0; // インターバル割り込み許可 RTCIMK = 0; // インターバル割り込み許可
switch( system_status.pwr_state ){ switch ( system_status.pwr_state )
{
case OFF: //------------------------------------------------------- case OFF: //-------------------------------------------------------
// スイッチ操作などで割り込みが発生し、スリープが解除されるとここに来ます。 // スイッチ操作などで割り込みが発生し、スリープが解除されるとここに来ます。
switch( system_status.poweron_reason ){ switch ( system_status.poweron_reason )
{
default: default:
// スイッチで電源on // スイッチで電源on
if(( SW_pow_count != 0 ) || if( ( SW_pow_count != 0 ) || ( SW_wifi_count != 0 ) )
( SW_wifi_count != 0 )){ {
timeout = 0; timeout = 0;
}else{ }
else
{
timeout += 1; timeout += 1;
} }
if( timeout > 127 ){ if( timeout > 127 )
{
system_status.pwr_state = OFF_TRIG; // スイッチはノイズだった。寝る。 system_status.pwr_state = OFF_TRIG; // スイッチはノイズだった。寝る。
renge_task_interval_run_force = 1; renge_task_interval_run_force = 1;
//iic_mcu_write_a_byte( IIC_SLA_DBG_MONITOR, 3, 0x81 ); return;
return( 0 );
} }
if(( SW_pow_count < 3 )&& if( ( SW_pow_count < 3 ) && ( SW_wifi_count < 3 ) )
( SW_wifi_count < 3 )){ {
// もう少しスイッチの様子を見る // もう少しスイッチの様子を見る
//iic_mcu_write_a_byte( IIC_SLA_DBG_MONITOR, 3, 0x82 ); return;
return( 0 );
} }
break; break;
case ( RTC_ALARM ): case ( RTC_ALARM ):
//iic_mcu_write_a_byte( IIC_SLA_DBG_MONITOR, 3, 0x83 );
break; break;
// 何か他に電源ON要因はあるか // 何か他に電源ON要因はあるか
// 蓋開け // 蓋開け
// アダプタ(充電の温度を監視しなくてはならない) // アダプタ(充電の温度を監視しなくてはならない)
} }
timeout = 0; timeout = 0;
// 電源投入 // 電源投入
@ -75,55 +79,48 @@ task_interval tsk_sys(){
PM_init( ); // 電池残量ICの設定 PM_init( ); // 電池残量ICの設定
// todo bt_auth // todo bt_auth
if( PM_bt_auth() != ERR_SUCCESS ){ if( PM_bt_auth( ) != ERR_SUCCESS )
{
// どうするの? // どうするの?
renge_task_interval_run_force = 1; renge_task_interval_run_force = 1;
system_status.pwr_state = OFF_TRIG; system_status.pwr_state = OFF_TRIG;
while(1){ while( 1 )
{
NOP( ); NOP( );
} }
// return( 0 ); // return( 0 );
} }
if( PM_sys_pow_on() != ERR_SUCCESS ){ // 電源起動不可エラー if( PM_sys_pow_on( ) != ERR_SUCCESS )
{ // 電源起動不可エラー
renge_task_interval_run_force = 1; renge_task_interval_run_force = 1;
iic_mcu_stop( ); iic_mcu_stop( );
system_status.pwr_state = OFF; system_status.pwr_state = OFF;
return( 0 ); return;
} }
PM_LCD_vcom_set( ); // LCDの対向電圧値など書き込み PM_LCD_vcom_set( ); // LCDの対向電圧値など書き込み
// 電源スイッチでの電源投入であれば、バックライトを点ける #ifdef _PMIC_TWL_
if( system_status.poweron_reason == PWSW ){ PM_TEG_LCD_dis( 0 );
// パワースイッチでのonの時は、LEDを点灯させる
vreg_ctr[ VREG_C_LED_POW ] = LED_POW_ILM_AUTO;
#if 0
if( PM_LCD_on() == 0 ){
renge_task_interval_run_force = 1;
iic_mcu_stop();
system_status.pwr_state = OFF;
return( 0 );
}
if( PM_BL_on() == 0 ){
renge_task_interval_run_force = 1;
iic_mcu_stop();
system_status.pwr_state = OFF;
return( 0 );
}
#endif #endif
if( system_status.poweron_reason == PWSW )
{
// 電源ボタンでのonの時は、LEDを点灯させる
vreg_ctr[VREG_C_LED_POW] = LED_POW_ILM_AUTO;
} }
else else
{ {
// 他には?
vreg_ctr[VREG_C_LED_POW] = LED_POW_ILM_OFF; vreg_ctr[VREG_C_LED_POW] = LED_POW_ILM_OFF;
// 他には?
} }
// ここまで来ると、電源投入確定 // ここまで来ると、電源投入確定
system_status.pwr_state = ON_TRIG; system_status.pwr_state = ON_TRIG;
renge_task_interval_run_force = 1; renge_task_interval_run_force = 1;
return( 0 ); return;
break; break;
case ON_TRIG: //------------------------------------------------------- case ON_TRIG: //-------------------------------------------------------
@ -162,11 +159,12 @@ task_interval tsk_sys(){
#endif #endif
system_status.poweron_reason = PWSW; system_status.poweron_reason = PWSW;
return;
break; break;
case ON: //--------------------------------------------- case ON: //---------------------------------------------
if( !RESET1_n ){ if( !RESET1_n )
{
// 電源異常チェック // 電源異常チェック
/// コマンドで、正規にリセットをかけたときには、 /// コマンドで、正規にリセットをかけたときには、
/// このチェックに引っかからないので大丈夫 /// このチェックに引っかからないので大丈夫
@ -175,16 +173,21 @@ task_interval tsk_sys(){
// system_status.pwr_state = OFF_TRIG; // system_status.pwr_state = OFF_TRIG;
// renge_task_interval_run_force = 1; // renge_task_interval_run_force = 1;
} }
return;
break; break;
case SLEEP_TRIG: //------------------------------------- case SLEEP_TRIG: //-------------------------------------
system_status.pwr_state = SLEEP; system_status.pwr_state = SLEEP;
// todo PMICのモード切替
// SoCとのハンドシェイク
PM_BL_off( ); PM_BL_off( );
return;
break; break;
case SLEEP: //------------------------------------------ case SLEEP: //------------------------------------------
system_status.pwr_state = ON_TRIG; system_status.pwr_state = ON_TRIG;
if( !RESET1_n ){ if( !RESET1_n )
{
NOP( ); NOP( );
/* /*
// ステータス類の設定、電源のフラグなどの整理 // ステータス類の設定、電源のフラグなどの整理
@ -192,15 +195,10 @@ task_interval tsk_sys(){
renge_task_interval_run_force = 1; renge_task_interval_run_force = 1;
*/ */
} }
return;
break; break;
case OFF_TRIG: //--------------------------------------- case OFF_TRIG: //---------------------------------------
DBG_LED_WIFI_2_on;
DBG_LED_WIFI_2_off;
DBG_LED_WIFI_2_on;
DBG_LED_WIFI_2_off;
LED_stop( ); LED_stop( );
IIC_ctr_Stop( ); IIC_ctr_Stop( );
IIC_twl_Stop( ); IIC_twl_Stop( );
@ -219,13 +217,11 @@ task_interval tsk_sys(){
DI( ); DI( );
#ifdef _PMIC_TWL_
PM_TEG_LCD_dis( 1 );
#endif
PM_sys_pow_off( ); PM_sys_pow_off( );
DBG_LED_WIFI_2_on;
DBG_LED_WIFI_2_off;
DBG_LED_WIFI_2_on;
DBG_LED_WIFI_2_off;
DBG_LED_WIFI_2_on;
DBG_LED_WIFI_2_off;
// iic_mcu_stop(); // iic_mcu_stop();
@ -251,40 +247,38 @@ task_interval tsk_sys(){
system_status.pwr_state = OFF; system_status.pwr_state = OFF;
while( RWST ){;} while( RWST )
{;
}
iic_mcu_stop( ); iic_mcu_stop( );
STOP( ); // 割り込み待ちで寝る // STOP( ); // 割り込み待ちで寝る //
DBG_LED_WIFI_2_on;
DBG_LED_WIFI_2_off;
DBG_LED_WIFI_2_on;
DBG_LED_WIFI_2_off;
DBG_LED_WIFI_2_on;
DBG_LED_WIFI_2_off;
DBG_LED_WIFI_2_on;
DBG_LED_WIFI_2_off;
// while( SW_POW_n ){;} // while( SW_POW_n ){;}
KRMK = 1; KRMK = 1;
RTCIMK = 0; // インターバル割り込み許可 RTCIMK = 0; // インターバル割り込み許可
EI( ); EI( );
renge_task_interval_run_force = 1; renge_task_interval_run_force = 1;
return;
break; break;
default: default:
while(1){ while( 1 )
{
NOP( ); NOP( );
// あり得ないステート // あり得ないステート
} }
} }
return 1; return;
} }
#define INTERVAL_TSK_SW 16
#define CLICK_THRESHOLD 3
#define LONG_PUSH_THREASHOLD ( 800 / INTERVAL_TSK_SW )
/* ======================================================== /* ========================================================
   
@ -307,19 +301,32 @@ task_interval tsk_sys(){
} \ } \
} }
task_interval tsk_sw(){ void tsk_sw( )
{
static u8 cnt_force_off = 0; static u8 cnt_force_off = 0;
static u8 sw_pow_old = 0; static u8 sw_pow_old = 0;
static u8 task_interval = 0;
if(( system_status.pwr_state == ON ) if( task_interval != 0 )
|| ( system_status.pwr_state == OFF )){ {
task_interval -= 1;
return;
}
else
{
task_interval = ( INTERVAL_TSK_SW / SYS_INTERVAL_TICK );
}
if( ( system_status.pwr_state == ON ) || ( system_status.pwr_state == OFF ) )
{
count_sw_n( SW_POW_n, SW_pow_count, SW_pow_mask ); count_sw_n( SW_POW_n, SW_pow_count, SW_pow_mask );
count_sw_n( SW_WIFI_n, SW_wifi_count, SW_wifi_mask ); count_sw_n( SW_WIFI_n, SW_wifi_count, SW_wifi_mask );
count_sw_n( SW_TUNE_n, SW_tune_count, SW_tune_mask ); count_sw_n( SW_TUNE_n, SW_tune_count, SW_tune_mask );
// count_sw_n( SW_HOME_n, SW_home_count, SW_home_mask ); // count_sw_n( SW_HOME_n, SW_home_count, SW_home_mask );
} }
switch( system_status.pwr_state ){ switch ( system_status.pwr_state )
{
case ( OFF_TRIG ): case ( OFF_TRIG ):
SW_pow_count = 0; SW_pow_count = 0;
SW_wifi_count = 0; SW_wifi_count = 0;
@ -330,13 +337,19 @@ task_interval tsk_sw(){
case ( ON ): case ( ON ):
case ( SLEEP ): case ( SLEEP ):
// 電源スイッチの監視 // // 電源スイッチの監視 //
if( SW_pow_count == 0 ){ if( SW_pow_count == 0 )
if(( 6 < sw_pow_old ) && ( sw_pow_old < 66 )){ {
if( ( CLICK_THRESHOLD < sw_pow_old ) && ( sw_pow_old < LONG_PUSH_THREASHOLD ) )
{
set_irq( VREG_C_IRQ0, REG_BIT_SW_POW_CLICK ); set_irq( VREG_C_IRQ0, REG_BIT_SW_POW_CLICK );
} }
}else if( SW_pow_count == 66 ){ }
else if( SW_pow_count == LONG_PUSH_THREASHOLD )
{
set_irq( VREG_C_IRQ0, REG_BIT_SW_POW_HOLD ); set_irq( VREG_C_IRQ0, REG_BIT_SW_POW_HOLD );
}else if( SW_pow_count == 254 ){ // todo }
else if( SW_pow_count == ( LONG_PUSH_THREASHOLD * 4 ) )
{ // todo
// vreg_ctr[ VREG_C_LED_POW ] = LED_POW_ONLY_RED; // vreg_ctr[ VREG_C_LED_POW ] = LED_POW_ONLY_RED;
system_status.pwr_state = OFF_TRIG; system_status.pwr_state = OFF_TRIG;
renge_task_interval_run_force = 1; renge_task_interval_run_force = 1;
@ -344,16 +357,21 @@ task_interval tsk_sw(){
sw_pow_old = SW_pow_count; sw_pow_old = SW_pow_count;
// 電源OFF割り込みを入れたが… // 電源OFF割り込みを入れたが…
if(( vreg_ctr[ VREG_C_IRQ0 ] & REG_BIT_SW_POW_HOLD ) != 0 ){ if( ( vreg_ctr[VREG_C_IRQ0] & REG_BIT_SW_POW_HOLD ) != 0 )
{
cnt_force_off += 1; cnt_force_off += 1;
if( cnt_force_off >= 13 ){ // …返事がない。強制的に切る。 if( cnt_force_off >= 13 )
{ // …返事がない。強制的に切る。
vreg_ctr[VREG_C_LED_POW] = LED_POW_ILM_OFF; vreg_ctr[VREG_C_LED_POW] = LED_POW_ILM_OFF;
if(( LED_duty_pow_H == 0 ) && ( LED_duty_pow_L == 0 )){ if( ( LED_duty_pow_H == 0 ) && ( LED_duty_pow_L == 0 ) )
{
system_status.pwr_state = OFF_TRIG; system_status.pwr_state = OFF_TRIG;
renge_task_interval_run_force = 1; renge_task_interval_run_force = 1;
} }
} }
}else{ }
else
{
cnt_force_off = 0; cnt_force_off = 0;
} }
@ -373,12 +391,14 @@ task_interval tsk_sw(){
*/ */
// wifi sw // wifi sw
if( SW_wifi_count == 10 ){ if( SW_wifi_count == 10 )
{
set_irq( VREG_C_IRQ0, REG_BIT_SW_WIFI_CLICK ); set_irq( VREG_C_IRQ0, REG_BIT_SW_WIFI_CLICK );
} }
// tune sw // tune sw
if( SW_tune_count == 10 ){ if( SW_tune_count == 10 )
{
set_irq( VREG_C_IRQ0, REG_BIT_SW_TUNE_CLICK ); set_irq( VREG_C_IRQ0, REG_BIT_SW_TUNE_CLICK );
} }
break; break;
@ -395,8 +415,5 @@ task_interval tsk_sw(){
} }
*/ */
return( 8 ); return;
} }

View File

@ -48,7 +48,7 @@ extern unsigned char temp_teg;
#ifdef _PMIC_TWL_ #ifdef _PMIC_TWL_
#define PM_TEG_PWSW P7.5 // TEGÌÝ #define PM_TEG_PWSW P7.5 // TEGÌÝ
#define PM_TEG_LCD_OFF P7.6 // TEGのみ #define PM_TEG_LCD_dis( val ) ( P7.6 = val ) // TEGのみ
#else #else
#endif #endif
@ -91,6 +91,7 @@ extern unsigned char temp_teg;
// CODEC // CODEC
#define PM_IRQ P7.2 // INTP6 #define PM_IRQ P7.2 // INTP6
#ifndef _PMIC_CTR_ #ifndef _PMIC_CTR_
#define SND_DEPOP P7.7 #define SND_DEPOP P7.7
#else #else

View File

@ -25,11 +25,12 @@ u8 vreg_ctr[ VREG_C_ENDMARK_ ];
// ******************************************************** // ********************************************************
// 非ゼロの初期値の指定が必要なアドレス // 非ゼロの初期値の指定が必要なアドレス
void vreg_ctr_init(){ void vreg_ctr_init( )
{
vreg_ctr[VREG_C_LED_BRIGHT] = 0xFF; vreg_ctr[VREG_C_LED_BRIGHT] = 0xFF;
#ifdef _debug_ #ifdef _debug_
vreg_ctr[ VREG_C_LED_TUNE ] = 0x01; // vreg_ctr[ VREG_C_LED_TUNE ] = 0x02;
#endif #endif
vreg_ctr[VREG_C_MCU_VER_MAJOR] = MCU_VER_MAJOR; vreg_ctr[VREG_C_MCU_VER_MAJOR] = MCU_VER_MAJOR;
@ -41,6 +42,10 @@ void vreg_ctr_init(){
#endif #endif
vreg_ctr[VREG_C_MCU_VER_MINOR] = MCU_VER_MINOR; vreg_ctr[VREG_C_MCU_VER_MINOR] = MCU_VER_MINOR;
vreg_ctr[VREG_C_VCOM_T] = 92;
vreg_ctr[VREG_C_VCOM_B] = 95;
} }
@ -52,8 +57,10 @@ void vreg_ctr_init(){
//  書けないアドレスにアクセスした場合、何もしません。 //  書けないアドレスにアクセスした場合、何もしません。
// ●書き込んだ結果、I2C_mcu通信が発生する場合、renge_task_immed_add() // ●書き込んだ結果、I2C_mcu通信が発生する場合、renge_task_immed_add()
// を使用しないと、I2C_mcu使用中でエラー終了した場合にリトライしません。 // を使用しないと、I2C_mcu使用中でエラー終了した場合にリトライしません。
void vreg_ctr_write( u8 adrs, u8 data ){ void vreg_ctr_write( u8 adrs, u8 data )
switch( adrs ){ {
switch ( adrs )
{
case ( VREG_C_MCU_STATUS ): case ( VREG_C_MCU_STATUS ):
vreg_ctr[adrs] = ( data & ~0x40 ); vreg_ctr[adrs] = ( data & ~0x40 );
@ -72,9 +79,8 @@ void vreg_ctr_write( u8 adrs, u8 data ){
case ( VREG_C_DBG3 ): case ( VREG_C_DBG3 ):
vreg_ctr[adrs] = data; vreg_ctr[adrs] = data;
if( ( vreg_ctr[VREG_C_DBG1] == 'j' ) if( ( vreg_ctr[VREG_C_DBG1] == 'j' )
&& ( vreg_ctr[ VREG_C_DBG2 ] == 'h' ) && ( vreg_ctr[VREG_C_DBG2] == 'h' ) && ( data == 'l' ) )
&& ( data == 'l' ) {
){
firm_update( ); // 戻ってこない firm_update( ); // 戻ってこない
} }
break; break;
@ -88,25 +94,27 @@ void vreg_ctr_write( u8 adrs, u8 data ){
case ( VREG_C_COMMAND0 ): case ( VREG_C_COMMAND0 ):
vreg_ctr[adrs] = data; vreg_ctr[adrs] = data;
if( data != 0 ){ if( data != 0 )
{
renge_task_immed_add( do_command0 ); renge_task_immed_add( do_command0 );
} }
break; break;
case ( VREG_C_COMMAND1 ): case ( VREG_C_COMMAND1 ):
vreg_ctr[adrs] = data; vreg_ctr[adrs] = data;
if( data != 0 ){ if( data != 0 )
{
// renge_task_immed_add( do_command1 ); // renge_task_immed_add( do_command1 );
/// 持ってきました /// 持ってきました
vreg_twl[ REG_TWL_ADRS_IRQ ] = (( vreg_ctr[ VREG_C_COMMAND1 ] & REG_BIT_TWL_CMD_PWSW_DET ) != 0 )? REG_BIT_TWL_IRQ_PWSW_DET: 0x00; //pwsw_det vreg_twl[REG_TWL_INT_ADRS_IRQ] = ( ( vreg_ctr[VREG_C_COMMAND1] & REG_BIT_TWL_CMD_PWSW_DET ) != 0 ) ? REG_BIT_TWL_IRQ_PWSW_DET : 0x00; //pwsw_det
vreg_twl[ REG_TWL_ADRS_IRQ ] |= (( vreg_ctr[ VREG_C_COMMAND1 ] & REG_BIT_TWL_CMD_RESET ) != 0 )? REG_BIT_TWL_IRQ_RESET: 0x00; //reset_req vreg_twl[REG_TWL_INT_ADRS_IRQ] |= ( ( vreg_ctr[VREG_C_COMMAND1] & REG_BIT_TWL_CMD_RESET ) != 0 ) ? REG_BIT_TWL_IRQ_RESET : 0x00; //reset_req
vreg_twl[ REG_TWL_ADRS_IRQ ] |= (( vreg_ctr[ VREG_C_COMMAND1 ] & REG_BIT_TWL_CMD_OFF ) != 0 )? REG_BIT_TWL_IRQ_OFF: 0x00; //off_req vreg_twl[REG_TWL_INT_ADRS_IRQ] |= ( ( vreg_ctr[VREG_C_COMMAND1] & REG_BIT_TWL_CMD_OFF ) != 0 ) ? REG_BIT_TWL_IRQ_OFF : 0x00; //off_req
vreg_twl[ REG_TWL_ADRS_IRQ ] |= (( vreg_ctr[ VREG_C_COMMAND1 ] & REG_BIT_TWL_CMD_BT_LOW ) != 0 )? REG_BIT_TWL_IRQ_BT_LOW: 0x00; //batt_low vreg_twl[REG_TWL_INT_ADRS_IRQ] |= ( ( vreg_ctr[VREG_C_COMMAND1] & REG_BIT_TWL_CMD_BT_LOW ) != 0 ) ? REG_BIT_TWL_IRQ_BT_LOW : 0x00; //batt_low
vreg_twl[ REG_TWL_ADRS_IRQ ] |= (( vreg_ctr[ VREG_C_COMMAND1 ] & REG_BIT_TWL_CMD_BT_EMPTY ) != 0 )? REG_BIT_TWL_IRQ_BT_EMPTY: 0x00; //batt_empty vreg_twl[REG_TWL_INT_ADRS_IRQ] |= ( ( vreg_ctr[VREG_C_COMMAND1] & REG_BIT_TWL_CMD_BT_EMPTY ) != 0 ) ? REG_BIT_TWL_IRQ_BT_EMPTY : 0x00; //batt_empty
vreg_twl[ REG_TWL_ADRS_IRQ ] |= (( vreg_ctr[ VREG_C_COMMAND1 ] & REG_BIT_TWL_CMD_VOL_CHANGE ) != 0 )? REG_BIT_TWL_IRQ_VOL_CHANGE: 0x00; //vol_changed vreg_twl[REG_TWL_INT_ADRS_IRQ] |= ( ( vreg_ctr[VREG_C_COMMAND1] & REG_BIT_TWL_CMD_VOL_CHANGE ) != 0 ) ? REG_BIT_TWL_IRQ_VOL_CHANGE : 0x00; //vol_changed
} }
break; break;
@ -202,7 +210,8 @@ void vreg_ctr_write( u8 adrs, u8 data ){
case ( VREG_C_COMMAND3 ): case ( VREG_C_COMMAND3 ):
vreg_ctr[adrs] = data; vreg_ctr[adrs] = data;
switch( data ){ switch ( data )
{
case ( 'r' ): // マイコン再起動 case ( 'r' ): // マイコン再起動
WDTE = 0xAA; WDTE = 0xAA;
break; break;
@ -219,9 +228,10 @@ void vreg_ctr_write( u8 adrs, u8 data ){
// 引数 adrs 外から見たときの、アドレス // 引数 adrs 外から見たときの、アドレス
// 戻り xx データ // 戻り xx データ
//  存在しないアドレスにアクセスした場合、戻り値は0x5A //  存在しないアドレスにアクセスした場合、戻り値は0x5A
u8 vreg_ctr_read( u8 adrs ){ u8 vreg_ctr_read( u8 adrs )
if(( VREG_C_RTC_SEC <= adrs ) {
&& ( adrs <= VREG_C_RTC_YEAR )){ if( ( VREG_C_RTC_SEC <= adrs ) && ( adrs <= VREG_C_RTC_YEAR ) )
{
get_rtc( ); get_rtc( );
} }
return ( vreg_ctr[adrs] ); return ( vreg_ctr[adrs] );
@ -231,14 +241,15 @@ u8 vreg_ctr_read( u8 adrs ){
// ******************************************************** // ********************************************************
// I2C仮想レジスタから読まれて何かするレジスタ // I2C仮想レジスタから読まれて何かするレジスタ
void vreg_ctr_after_read( u8 adrs ){ void vreg_ctr_after_read( u8 adrs )
{
// リードがトリガで何かをする↓ // リードがトリガで何かをする↓
// 割り込みビットのクリア // 割り込みビットのクリア
if( adrs == VREG_C_IRQ3 ){ if( adrs == VREG_C_IRQ3 )
{
vreg_ctr[VREG_C_IRQ0] = vreg_ctr[VREG_C_IRQ1] = vreg_ctr[VREG_C_IRQ0] = vreg_ctr[VREG_C_IRQ1] =
vreg_ctr[VREG_C_IRQ2] = vreg_ctr[VREG_C_IRQ3] = 0; vreg_ctr[VREG_C_IRQ2] = vreg_ctr[VREG_C_IRQ3] = 0;
} }
return; return;
} }

View File

@ -78,7 +78,8 @@
// VREG_C_WIFI_LED // VREG_C_WIFI_LED
enum{ enum
{
WIFI_LED_OFF = 0, WIFI_LED_OFF = 0,
WIFI_LED_ON, WIFI_LED_ON,
WIFI_LED_TXAUTO, WIFI_LED_TXAUTO,
@ -88,7 +89,8 @@ enum{
// VREG_C_CAM_LED // VREG_C_CAM_LED
enum{ enum
{
CAM_LED_OFF = 0, CAM_LED_OFF = 0,
CAM_LED_BLINK, CAM_LED_BLINK,
CAM_LED_ON, CAM_LED_ON,
@ -108,7 +110,7 @@ enum{
#define REG_BIT_TWL_CMD_VOL_CHANGE 0x20 #define REG_BIT_TWL_CMD_VOL_CHANGE 0x20
// <20>ªTWL¤ // <20>ªTWL¤
#define REG_BIT_TWL_IRQ_PWSW_DET 0x80 #define REG_BIT_TWL_IRQ_PWSW_DET 0x08
#define REG_BIT_TWL_IRQ_RESET 0x01 #define REG_BIT_TWL_IRQ_RESET 0x01
#define REG_BIT_TWL_IRQ_OFF 0x02 #define REG_BIT_TWL_IRQ_OFF 0x02
#define REG_BIT_TWL_IRQ_BT_LOW 0x20 #define REG_BIT_TWL_IRQ_BT_LOW 0x20
@ -142,7 +144,8 @@ enum{
extern u8 vreg_ctr[]; extern u8 vreg_ctr[];
/*============================================================================*/ /*============================================================================*/
enum VREG_C{ // 未定義アドレスへ書き込んだ際の動作は不定 enum VREG_C
{ // 未定義アドレスへ書き込んだ際の動作は不定
VREG_C_MCU_VER_MAJOR = 0x00, VREG_C_MCU_VER_MAJOR = 0x00,
VREG_C_MCU_VER_MINOR, VREG_C_MCU_VER_MINOR,
VREG_C_MCU_STATUS, VREG_C_MCU_STATUS,
@ -159,6 +162,7 @@ enum VREG_C{ //
VREG_C_BT_REMAIN, VREG_C_BT_REMAIN,
VREG_C_BT_TEMP, VREG_C_BT_TEMP,
VREG_C_STATUS_X = 0x0E,
VREG_C_STATUS = 0x0F, VREG_C_STATUS = 0x0F,
VREG_C_IRQ0 = 0x10, VREG_C_IRQ0 = 0x10,
@ -230,10 +234,8 @@ enum VREG_C{ //
#else #else
 "がらっと変えてしまったので、旧版のディレクトリを使用して下さい。" @"がらっと変えてしまったので、旧版のディレクトリを使用して下さい。"
#endif #endif
/*============================================================================*/ /*============================================================================*/
void vreg_ctr_init( ); void vreg_ctr_init( );
void vreg_ctr_write( u8 adrs, u8 data ); void vreg_ctr_write( u8 adrs, u8 data );

View File

@ -9,68 +9,46 @@ TWL
#include "vreg_twl.h" #include "vreg_twl.h"
u8 vreg_twl[ REG_TWL_INT_ADRS_TIME_PWSW_THRESHOLD +1 ];
#define TWL_REG_VER_INFO 0x35
u8 vreg_twl[_REG_TWL_INT_ADRS_EDNMARK];
/* ======================================================== /* ========================================================
======================================================== */ ======================================================== */
void vreg_twl_init(){ void vreg_twl_init( )
vreg_twl[ REG_TWL_INT_ADRS_VER_INFO ] = 0x35; {
vreg_twl[ REG_TWL_INT_ADRS_POWER_INFO ] = 0x0F;
vreg_twl[ REG_TWL_INT_ADRS_POWER_SAVE ] = 0x07;
vreg_twl[REG_TWL_INT_ADRS_BL] = 0x03; vreg_twl[REG_TWL_INT_ADRS_BL] = 0x03;
vreg_twl[ REG_TWL_INT_ADRS_CODEC_MIC_GAIN ] = 0x01;
vreg_twl[ REG_TWL_INT_ADRS_ADC_CALIB_STATUS ] = 0x01;
vreg_twl[ REG_TWL_INT_ADRS_ADC_CALIB_VALUE ] = 0x60;
} }
// ======================================================== // ========================================================
// I2C仮想レジスタに書きます。 // I2C仮想レジスタに書く・何かアクションする
// 引数 adrs は内部アドレス // 引数 adrs は内部アドレス
//  存在しないアドレスにアクセスした場合、何もしません。 //  存在しないアドレスにアクセスした場合、何もしません。
void vreg_twl_write( u8 adrs, u8 data ){ void vreg_twl_write( u8 adrs, u8 data )
switch( adrs ){ {
case( REG_TWL_INT_ADRS_COMMAND ): switch ( adrs )
case( REG_TWL_INT_ADRS_MODE ): {
case( REG_TWL_INT_ADRS_POWER_SAVE ): // case ( REG_TWL_INT_ADRS_VOL ):
case( REG_TWL_INT_ADRS_WIFI ):
case( REG_TWL_INT_ADRS_CAM ):
case( REG_TWL_INT_ADRS_VOL ):
case( 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_VALUE,
REG_TWL_INT_ADRS_POWER_LED,
*/
case( REG_TWL_INT_ADRS_TEMP0 ):
case( REG_TWL_INT_ADRS_TEMP1 ):
case( REG_TWL_INT_ADRS_TEMP2 ):
case( REG_TWL_INT_ADRS_TEMP3 ):
case( REG_TWL_INT_ADRS_TEMP4 ):
case( REG_TWL_INT_ADRS_TEMP5 ):
case( REG_TWL_INT_ADRS_TEMP6 ):
case( REG_TWL_INT_ADRS_TEMP7 ):
// REG_TWL_INT_ADRS_TIME_PWSW_DELAY,
// REG_TWL_INT_ADRS_TIME_PWSW_THRESHOLD
case ( REG_TWL_INT_ADRS_MODE ):
case ( REG_TWL_INT_ADRS_CAM ):
vreg_twl[adrs] = ( data & 0x03 );
break;
case ( REG_TWL_INT_ADRS_BL ):
vreg_twl[adrs] = data; vreg_twl[adrs] = data;
break; break;
}
// TWLレジスタに書かれて何かアクションする
switch( adrs ){
case ( REG_TWL_INT_ADRS_COMMAND ): case ( REG_TWL_INT_ADRS_COMMAND ):
if( data != 0 ){ if( ( data & 0x01 ) != 0 )
{
set_irq( VREG_C_IRQ3, REG_BIT_TWL_RESET_REQ ); //リセットしかない。他のは、SPIから来ます。 set_irq( VREG_C_IRQ3, REG_BIT_TWL_RESET_REQ ); //リセットしかない。他のは、SPIから来ます。
break; break;
} }
default:
break;
} }
return; return;
} }
@ -82,13 +60,20 @@ void vreg_twl_write( u8 adrs, u8 data ){
// 引数 adrs 外から見たときの、アドレス // 引数 adrs 外から見たときの、アドレス
// 戻り xx データ // 戻り xx データ
//  存在しないアドレスにアクセスした場合、戻り値は0x5A //  存在しないアドレスにアクセスした場合、戻り値は0x5A
u8 vreg_twl_read( u8 phy_adrs ){ u8 vreg_twl_read( u8 phy_adrs )
u8 dat; {
u8 temp;
dat = vreg_twl[ phy_adrs ]; switch( phy_adrs ){
case( REG_TWL_INT_ADRS_VER_INFO ): return( TWL_REG_VER_INFO );
// リードがトリガで何かをするなら↓ case( REG_TWL_INT_ADRS_POWER_INFO ): return( 0x0F );
return( dat ); 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( 0xFF ): return( 0x00 );
}
} }
@ -96,65 +81,16 @@ u8 vreg_twl_read( u8 phy_adrs ){
// ======================================================== // ========================================================
// 外部から見える虫食いアドレスを、内部の連続アドレスに読み替える // 外部から見える虫食いアドレスを、内部の連続アドレスに読み替える
// 0xFFは存在しないアドレス。 // 0xFFは存在しないアドレス。
u8 adrs_table_twl_ext2int( u8 img ){ u8 adrs_table_twl_ext2int( u8 img )
u8 adrsH, adrsL; {
switch( img ){
adrsH = ( img & 0xF0 ); case( REG_TWL_ADRS_VER_INFO ): return( REG_TWL_INT_ADRS_VER_INFO );
adrsL = ( img & 0x0F ); case( REG_TWL_ADRS_IRQ ): return( REG_TWL_INT_ADRS_IRQ );
if( adrsH > 0x80 ){ case( REG_TWL_ADRS_COMMAND ): return( REG_TWL_INT_ADRS_COMMAND );
return( 0xFF ); case( REG_TWL_ADRS_MODE ): return( REG_TWL_INT_ADRS_MODE );
} case( REG_TWL_ADRS_POWER_INFO ): return( REG_TWL_INT_ADRS_POWER_INFO );
if( adrsH == 0x50 ){ case( REG_TWL_ADRS_CAM ): return( REG_TWL_INT_ADRS_CAM );
return( 0xFF ); case( REG_TWL_ADRS_BL ): return( REG_TWL_INT_ADRS_BL );
} default: return( 0xFF );
if( adrsH <= 0x30 ){ // 0x00 - 0x3F
if( adrsH <= 0x10 ){ // 0x00 - 0x1F
if( adrsH == 0x10 ){ // 0x1*
if( adrsL <= ( REG_TWL_ADRS_MODE & 0x0F ) ){
return( REG_TWL_INT_ADRS_IRQ + adrsL );
}
}else{ // 0x0*
if( adrsL <= ( REG_TWL_ADRS_BATT_INFO & 0x0F ) ){
return( REG_TWL_INT_ADRS_VER_INFO + adrsL );
} }
} }
}else{ // 0x20 - 0x3F
if( adrsH == 0x20 ){ // 0x2?
if( adrsL <= ( REG_TWL_ADRS_POWER_SAVE & 0x0F ) ){
return( REG_TWL_INT_ADRS_POWER_INFO + adrsL );
}
}else{ // 0x3*
if( adrsL <= ( REG_TWL_ADRS_CAM & 0x0F ) ){
return( REG_TWL_INT_ADRS_WIFI + adrsL );
}
}
}
}else{
if( adrsH <= 0x60 ){
if( adrsH == 0x60 ){
if( adrsL <= ( REG_TWL_ADRS_POWER_LED & 0x0F ) ){
return( REG_TWL_INT_ADRS_ADC_CALIB + adrsL );
}
}else{ // 40台
if( adrsL <= ( REG_TWL_ADRS_BL & 0x0F ) ){
return( REG_TWL_INT_ADRS_VOL + adrsL );
}
}
}else{
if( adrsH == 0x70 ){
if( adrsL <= ( REG_TWL_ADRS_TEMP7 & 0x0F ) ){
return( REG_TWL_INT_ADRS_TEMP0 + adrsL );
}
}else{ // 80台
if( adrsL <= ( REG_TWL_ADRS_TIME_PWSW_THRESHOLD & 0x0F ) ){
return( REG_TWL_INT_ADRS_TIME_PWSW_DELAY + adrsL );
}
}
}
}
return( 0xFF );
}

View File

@ -16,7 +16,8 @@
* 1: OFF * 1: OFF
* LSB: * LSB:
*/ */
enum REG_TWL_ADRS{ // 未定義アドレスへ書き込んだ際は無視 enum REG_TWL_ADRS
{ // 未定義アドレスへ書き込んだ際は無視
REG_TWL_ADRS_VER_INFO = 0x00, REG_TWL_ADRS_VER_INFO = 0x00,
REG_TWL_ADRS_PMIC_INFO, REG_TWL_ADRS_PMIC_INFO,
REG_TWL_ADRS_BATT_INFO, REG_TWL_ADRS_BATT_INFO,
@ -51,42 +52,44 @@ enum REG_TWL_ADRS{ //
* *
* *
*/ */
enum REG_TWL_ADRS_INT{ enum REG_TWL_ADRS_INT
{
REG_TWL_INT_ADRS_VER_INFO = 0x00, REG_TWL_INT_ADRS_VER_INFO = 0x00,
REG_TWL_INT_ADRS_PMIC_INFO, // REG_TWL_INT_ADRS_PMIC_INFO,
REG_TWL_INT_ADRS_BATT_INFO, // REG_TWL_INT_ADRS_BATT_INFO,
REG_TWL_INT_ADRS_IRQ, // 0x10, REG_TWL_INT_ADRS_IRQ, // 0x10,
REG_TWL_INT_ADRS_COMMAND, REG_TWL_INT_ADRS_COMMAND,
REG_TWL_INT_ADRS_MODE, REG_TWL_INT_ADRS_MODE,
REG_TWL_INT_ADRS_POWER_INFO, // 0x20, REG_TWL_INT_ADRS_POWER_INFO, // 0x20,
REG_TWL_INT_ADRS_POWER_SAVE, // REG_TWL_INT_ADRS_POWER_SAVE,
REG_TWL_INT_ADRS_WIFI, // 0x30, // REG_TWL_INT_ADRS_WIFI, // 0x30,
REG_TWL_INT_ADRS_CAM, REG_TWL_INT_ADRS_CAM,
REG_TWL_INT_ADRS_VOL, // 0x40, /// REG_TWL_INT_ADRS_VOL, // 0x40,
REG_TWL_INT_ADRS_BL, REG_TWL_INT_ADRS_BL,
REG_TWL_INT_ADRS_CODEC_MIC_GAIN, // 0x50, // REG_TWL_INT_ADRS_CODEC_MIC_GAIN, // 0x50,
REG_TWL_INT_ADRS_CODEC_MIC_GAIN_RELOAD, // REG_TWL_INT_ADRS_CODEC_MIC_GAIN_RELOAD,
REG_TWL_INT_ADRS_ADC_CALIB, // 0x60, // REG_TWL_INT_ADRS_ADC_CALIB, // 0x60,
REG_TWL_INT_ADRS_ADC_CALIB_STATUS, // REG_TWL_INT_ADRS_ADC_CALIB_STATUS,
REG_TWL_INT_ADRS_ADC_CALIB_VALUE, // REG_TWL_INT_ADRS_ADC_CALIB_VALUE,
REG_TWL_INT_ADRS_POWER_LED, // REG_TWL_INT_ADRS_POWER_LED,
REG_TWL_INT_ADRS_TEMP0, // 0x70 - 0x77 // REG_TWL_INT_ADRS_TEMP0, // 0x70 - 0x77
REG_TWL_INT_ADRS_TEMP1, // REG_TWL_INT_ADRS_TEMP1,
REG_TWL_INT_ADRS_TEMP2, // REG_TWL_INT_ADRS_TEMP2,
REG_TWL_INT_ADRS_TEMP3, // REG_TWL_INT_ADRS_TEMP3,
REG_TWL_INT_ADRS_TEMP4, // REG_TWL_INT_ADRS_TEMP4,
REG_TWL_INT_ADRS_TEMP5, // REG_TWL_INT_ADRS_TEMP5,
REG_TWL_INT_ADRS_TEMP6, // REG_TWL_INT_ADRS_TEMP6,
REG_TWL_INT_ADRS_TEMP7, // REG_TWL_INT_ADRS_TEMP7,
REG_TWL_INT_ADRS_TIME_PWSW_DELAY, // REG_TWL_INT_ADRS_TIME_PWSW_DELAY,
REG_TWL_INT_ADRS_TIME_PWSW_THRESHOLD // REG_TWL_INT_ADRS_TIME_PWSW_THRESHOLD
_REG_TWL_INT_ADRS_EDNMARK,
}; };
/* ========================================================================= */ /* ========================================================================= */
extern u8 vreg_twl[ REG_TWL_INT_ADRS_TIME_PWSW_THRESHOLD +1 ]; extern u8 vreg_twl[];

File diff suppressed because it is too large Load Diff

View File

@ -243,6 +243,325 @@ ZF=0
S=1 S=1
E=0 E=0
CommandFile=0 CommandFile=0
[Options.LK78K0R 0]
Version=100
O0=bsr_k0r.lmf
O1=bsr.lmf
O2=flash.lmf
O3=a.lmf
G=1
E=0
E0=flash.elk
E1=a.elk
GO=1
GOValue=85
GOStart=FC00
GOSizeValue=1024
GI=1
GIValue=FFFFFFFFFFFFFFFFFFFF
CCZA=0
MemInfoCheck=1
P=1
P0=bsr_k0r.map
P1=bsr.map
P2=flash.map
P3=a.map
MI=0
GB=1
GBValue=6EFBFF
KM=1
KD=0
KP=1
KL=0
LF=0
LL=0
B0=C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\lib78k0r\fsl.lib
D0=bsr_mcu.dr
D1=user_area.dr
S=1
W=0
SELFCheck=1
SELF=0
ZB=
Etcetera0=
Etcetera1=boot.lmf
CommandFile=0
[Options.LK78K0R 1]
Version=100
O0=a.lmf
G=0
E=0
E0=a.elk
GO=0
GOValue=
GOStart=FC00
GOSizeValue=1024
GI=0
GIValue=FFFFFFFFFFFFFFFFFFFF
CCZA=1
MemInfoCheck=0
P=1
P0=a.map
MI=0
GB=0
GBValue=
KM=1
KD=1
KP=0
KL=0
LF=0
LL=0
S=0
W=1
SELFCheck=0
SELF=0
ZB=
CommandFile=0
[Options.LK78K0R 2]
Version=100
O0=bsr.lmf
O1=bsr_k0r.lmf
O2=flash.lmf
O3=a.lmf
G=1
E=0
E0=flash.elk
E1=a.elk
GO=1
GOValue=85
GOStart=FC00
GOSizeValue=1024
GI=1
GIValue=FFFFFFFFFFFFFFFFFFFF
CCZA=0
MemInfoCheck=1
P=1
P0=bsr_k0r.map
P1=bsr.map
P2=flash.map
P3=a.map
MI=0
GB=1
GBValue=7EFBFF
KM=1
KD=0
KP=1
KL=0
LF=0
LL=0
B0=C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\lib78k0r\fsl.lib
D0=bsr_mcu.dr
D1=user_area.dr
S=1
W=0
SELFCheck=0
SELF=0
ZB=
Etcetera0=
Etcetera1=boot.lmf
CommandFile=0
OFILE=C:\78k_data\yav-mcu-basara\bsr.lmf
[Options.LK78K0R 3]
Version=100
O0=bsr_bsr.lmf
O1=bsr_k0r.lmf
O2=bsr.lmf
O3=flash.lmf
O4=a.lmf
G=1
E=0
E0=flash.elk
E1=a.elk
GO=1
GOValue=85
GOStart=FC00
GOSizeValue=1024
GI=1
GIValue=FFFFFFFFFFFFFFFFFFFF
CCZA=0
MemInfoCheck=1
P=1
P0=bsr_bsr.map
P1=bsr_k0r.map
P2=bsr.map
P3=flash.map
P4=a.map
MI=0
GB=1
GBValue=6EFBFF
KM=1
KD=0
KP=1
KL=0
LF=0
LL=0
B0=C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\lib78k0r\fsl.lib
D0=bsr_mcu.dr
D1=user_area.dr
S=1
W=2
SELFCheck=0
SELF=0
ZB=
Etcetera0=
Etcetera1=boot.lmf
CommandFile=0
[Options.LK78K0R 4]
Version=100
O0=bsr_k0r.lmf
O1=bsr.lmf
O2=flash.lmf
O3=a.lmf
G=1
E=0
E0=flash.elk
E1=a.elk
GO=1
GOValue=85
GOStart=FC00
GOSizeValue=1024
GI=1
GIValue=FFFFFFFFFFFFFFFFFFFF
CCZA=0
MemInfoCheck=1
P=1
P0=bsr_k0r.map
P1=bsr.map
P2=flash.map
P3=a.map
MI=0
GB=1
GBValue=6EFBFF
KM=1
KD=0
KP=1
KL=0
LF=0
LL=0
B0=C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\lib78k0r\fsl.lib
D0=bsr_mcu.dr
D1=user_area.dr
S=1
W=0
SELFCheck=1
SELF=0
ZB=
Etcetera0=
Etcetera1=boot.lmf
CommandFile=0
[Options.LK78K0R 5]
Version=100
O0=bsr_bsr.lmf
O1=bsr_k0r.lmf
O2=bsr.lmf
O3=flash.lmf
O4=a.lmf
G=1
E=0
E0=flash.elk
E1=a.elk
GO=1
GOValue=85
GOStart=FC00
GOSizeValue=1024
GI=1
GIValue=FFFFFFFFFFFFFFFFFFFF
CCZA=0
MemInfoCheck=1
P=1
P0=bsr_bsr.map
P1=bsr_k0r.map
P2=bsr.map
P3=flash.map
P4=a.map
MI=0
GB=1
GBValue=6EFBFF
KM=1
KD=0
KP=1
KL=0
LF=0
LL=0
B0=C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\lib78k0r\fsl.lib
D0=bsr_mcu.dr
D1=user_area.dr
S=1
W=2
SELFCheck=0
SELF=0
ZB=
Etcetera0=
Etcetera1=boot.lmf
CommandFile=0
[Options.LCNV78K0R 0]
Version=100
LCNV_GO=0
E=0
CommandFile=0
[Options.LCNV78K0R 1]
Version=100
LCNV_GO=0
E=0
CommandFile=0
[Options.LCNV78K0R 2]
Version=100
LCNV_GO=0
E=0
CommandFile=0
[Options.LCNV78K0R 3]
Version=100
LCNV_GO=0
E=0
CommandFile=0
[Options.LCNV78K0R 4]
Version=100
LCNV_GO=0
E=0
CommandFile=0
[Options.LCNV78K0R 5]
Version=100
LCNV_GO=0
E=0
CommandFile=0
[Options.78K0R]
BuildMode=2
BuildMode2=K0R_dbg
BuildMode3=BSR_dbg
BuildMode4=BSR_rel
BuildMode5=BSR_WM0
DefaultMode2=1
DefaultMode3=1
DefaultMode4=1
DefaultMode5=1
[IncFile]
Include1=incs_loader.h
Include2=jhl_defs.h
Include3=user_define.h
Include4=config.h
Include5=bsr_system.h
Include6=renge\renge.h
Include7=renge\renge_defs.h
Include8=renge\renge_task_immediate.h
Include9=vreg_ctr.h
Include10=loader.h
Include11=i2c_mcu.h
Include12=WDT.h
Include13=fsl.h
Include14=fsl_user.h
Include15=i2c_ctr.h
Include16=pm.h
Include17=rtc.h
Include18=adc.h
Include19=led.h
Include20=incs.h
Include21=vreg_twl.h
Include22=accero.h
Include23=i2c_twl_defs.h
Include24=renge\renge_task_intval.h
Include25=i2c_twl.h
Include26=..\..\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r\fsl.h
Include27=..\..\Program Files\NEC Electronics Tools\CC78K0R\W2.10\inc78k0r\math.h
[Options.CC78K0R 0] [Options.CC78K0R 0]
Version=210 Version=210
Include0=renge,C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r Include0=renge,C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r
@ -709,324 +1028,6 @@ VfiFileBoot0=
VfiFileBoot1=boot.vfi VfiFileBoot1=boot.vfi
VF78K0Rchk=0 VF78K0Rchk=0
VF78K0Rvs= VF78K0Rvs=
[IncFile]
Include1=incs_loader.h
Include2=jhl_defs.h
Include3=user_define.h
Include4=config.h
Include5=bsr_system.h
Include6=renge\renge.h
Include7=renge\renge_defs.h
Include8=renge\renge_task_immediate.h
Include9=vreg_ctr.h
Include10=loader.h
Include11=i2c_mcu.h
Include12=WDT.h
Include13=fsl.h
Include14=fsl_user.h
Include15=i2c_ctr.h
Include16=pm.h
Include17=rtc.h
Include18=adc.h
Include19=led.h
Include20=incs.h
Include21=vreg_twl.h
Include22=accero.h
Include23=i2c_twl_defs.h
Include24=renge\renge_task_intval.h
Include25=i2c_twl.h
Include26=..\..\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r\fsl.h
[Options.LK78K0R 0]
Version=100
O0=bsr_k0r.lmf
O1=bsr.lmf
O2=flash.lmf
O3=a.lmf
G=1
E=0
E0=flash.elk
E1=a.elk
GO=1
GOValue=85
GOStart=FC00
GOSizeValue=1024
GI=1
GIValue=FFFFFFFFFFFFFFFFFFFF
CCZA=0
MemInfoCheck=1
P=1
P0=bsr_k0r.map
P1=bsr.map
P2=flash.map
P3=a.map
MI=0
GB=1
GBValue=6EFBFF
KM=1
KD=0
KP=1
KL=0
LF=0
LL=0
B0=C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\lib78k0r\fsl.lib
D0=bsr_mcu.dr
D1=user_area.dr
S=1
W=0
SELFCheck=1
SELF=0
ZB=
Etcetera0=
Etcetera1=boot.lmf
CommandFile=0
[Options.LK78K0R 1]
Version=100
O0=a.lmf
G=0
E=0
E0=a.elk
GO=0
GOValue=
GOStart=FC00
GOSizeValue=1024
GI=0
GIValue=FFFFFFFFFFFFFFFFFFFF
CCZA=1
MemInfoCheck=0
P=1
P0=a.map
MI=0
GB=0
GBValue=
KM=1
KD=1
KP=0
KL=0
LF=0
LL=0
S=0
W=1
SELFCheck=0
SELF=0
ZB=
CommandFile=0
[Options.LK78K0R 2]
Version=100
O0=bsr.lmf
O1=bsr_k0r.lmf
O2=flash.lmf
O3=a.lmf
G=1
E=0
E0=flash.elk
E1=a.elk
GO=1
GOValue=85
GOStart=FC00
GOSizeValue=1024
GI=1
GIValue=FFFFFFFFFFFFFFFFFFFF
CCZA=0
MemInfoCheck=1
P=1
P0=bsr_k0r.map
P1=bsr.map
P2=flash.map
P3=a.map
MI=0
GB=1
GBValue=7EFBFF
KM=1
KD=0
KP=1
KL=0
LF=0
LL=0
B0=C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\lib78k0r\fsl.lib
D0=bsr_mcu.dr
D1=user_area.dr
S=1
W=0
SELFCheck=0
SELF=0
ZB=
Etcetera0=
Etcetera1=boot.lmf
CommandFile=0
OFILE=C:\78k_data\yav-mcu-basara\bsr.lmf
[Options.LK78K0R 3]
Version=100
O0=bsr_bsr.lmf
O1=bsr_k0r.lmf
O2=bsr.lmf
O3=flash.lmf
O4=a.lmf
G=1
E=0
E0=flash.elk
E1=a.elk
GO=1
GOValue=85
GOStart=FC00
GOSizeValue=1024
GI=1
GIValue=FFFFFFFFFFFFFFFFFFFF
CCZA=0
MemInfoCheck=1
P=1
P0=bsr_bsr.map
P1=bsr_k0r.map
P2=bsr.map
P3=flash.map
P4=a.map
MI=0
GB=1
GBValue=6EFBFF
KM=1
KD=0
KP=1
KL=0
LF=0
LL=0
B0=C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\lib78k0r\fsl.lib
D0=bsr_mcu.dr
D1=user_area.dr
S=1
W=2
SELFCheck=0
SELF=0
ZB=
Etcetera0=
Etcetera1=boot.lmf
CommandFile=0
[Options.LK78K0R 4]
Version=100
O0=bsr_k0r.lmf
O1=bsr.lmf
O2=flash.lmf
O3=a.lmf
G=1
E=0
E0=flash.elk
E1=a.elk
GO=1
GOValue=85
GOStart=FC00
GOSizeValue=1024
GI=1
GIValue=FFFFFFFFFFFFFFFFFFFF
CCZA=0
MemInfoCheck=1
P=1
P0=bsr_k0r.map
P1=bsr.map
P2=flash.map
P3=a.map
MI=0
GB=1
GBValue=6EFBFF
KM=1
KD=0
KP=1
KL=0
LF=0
LL=0
B0=C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\lib78k0r\fsl.lib
D0=bsr_mcu.dr
D1=user_area.dr
S=1
W=0
SELFCheck=1
SELF=0
ZB=
Etcetera0=
Etcetera1=boot.lmf
CommandFile=0
[Options.LK78K0R 5]
Version=100
O0=bsr_bsr.lmf
O1=bsr_k0r.lmf
O2=bsr.lmf
O3=flash.lmf
O4=a.lmf
G=1
E=0
E0=flash.elk
E1=a.elk
GO=1
GOValue=85
GOStart=FC00
GOSizeValue=1024
GI=1
GIValue=FFFFFFFFFFFFFFFFFFFF
CCZA=0
MemInfoCheck=1
P=1
P0=bsr_bsr.map
P1=bsr_k0r.map
P2=bsr.map
P3=flash.map
P4=a.map
MI=0
GB=1
GBValue=6EFBFF
KM=1
KD=0
KP=1
KL=0
LF=0
LL=0
B0=C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\lib78k0r\fsl.lib
D0=bsr_mcu.dr
D1=user_area.dr
S=1
W=2
SELFCheck=0
SELF=0
ZB=
Etcetera0=
Etcetera1=boot.lmf
CommandFile=0
[Options.LCNV78K0R 0]
Version=100
LCNV_GO=0
E=0
CommandFile=0
[Options.LCNV78K0R 1]
Version=100
LCNV_GO=0
E=0
CommandFile=0
[Options.LCNV78K0R 2]
Version=100
LCNV_GO=0
E=0
CommandFile=0
[Options.LCNV78K0R 3]
Version=100
LCNV_GO=0
E=0
CommandFile=0
[Options.LCNV78K0R 4]
Version=100
LCNV_GO=0
E=0
CommandFile=0
[Options.LCNV78K0R 5]
Version=100
LCNV_GO=0
E=0
CommandFile=0
[Options.78K0R]
BuildMode=2
BuildMode2=K0R_dbg
BuildMode3=BSR_dbg
BuildMode4=BSR_rel
BuildMode5=BSR_WM0
DefaultMode2=1
DefaultMode3=1
DefaultMode4=1
DefaultMode5=1
[ToolSet] [ToolSet]
ToolSetName=(•Ï<E280A2>X)78K0R Software Package V1.10 ToolSetName=(•Ï<E280A2>X)78K0R Software Package V1.10
Tool1=CC78K0R|W2.10 Tool1=CC78K0R|W2.10

View File

@ -1,15 +1,25 @@
[ProjectManager] [ProjectManager]
FrameMax=1 FrameMax=0
FrameX=102 FrameX=110
FrameY=62 FrameY=74
FrameCX=1503 FrameCX=1376
FrameCY=631 FrameCY=1066
OpenFile1=i2c_mcu.c,0,330,330,1204,1087,48,321,48,0 OpenFile1=i2c_mcu.c,0,330,330,1204,1087,48,321,48,0
OpenFile2=renge\\renge_defs.h,0,330,330,1574,1087,0,47,0,0 OpenFile2=renge\\renge_defs.h,0,330,330,1574,1087,0,47,0,0
OpenFile3=ProjectWindow OpenFile3=user_define.h,0,176,176,1420,933,0,33,20,0
OpenFile4=vreg_ctr.c,0,345,273,1060,932,0,47,0,0
OpenFile5=i2c_ctr.c,0,242,242,1425,868,0,116,0,0
OpenFile6=led.c,0,286,286,1469,912,0,454,21,0
OpenFile7=rtc.c,0,308,308,1491,934,0,31,17,0
OpenFile8=tasks_sys.c,0,220,220,1403,846,16,392,17,0
OpenFile9=loader.c,0,264,264,1447,890,0,139,0,0
OpenFile10=magic.c,0,242,242,1486,999,3,8,0,0
OpenFile11=adc.c,0,166,66,1349,692,0,210,0,0
OpenFile12=accero.c,0,154,154,1398,911,25,119,0,0
OpenFile13=pm.c,0,88,88,1144,747,50,218,32,0
OpenFile14=ProjectWindow
PrjPos=0,2,754,3,253 PrjPos=0,2,754,3,253
OpenFile4=config.h,0,168,78,1412,835,0,14,21,0 OpenFile15=OutputWindow
OpenFile5=OutputWindow
OutputPos=0,67,1023,707,1568 OutputPos=0,67,1023,707,1568
ActivePRJ=yav_mcu_bsr.prj ActivePRJ=yav_mcu_bsr.prj
[ProjectWindow] [ProjectWindow]

View File

@ -1,7 +1,7 @@
[SdbInfo] [SdbInfo]
Ver=5 Ver=5
[loader.c] [loader.c]
T=4ac169a4 T=4adbffdf
1=incs_loader.h 1=incs_loader.h
2=fsl.h 2=fsl.h
3=fsl_user.h 3=fsl_user.h
@ -10,47 +10,47 @@ T=4ac169a4
6=pm.h 6=pm.h
7=rtc.h 7=rtc.h
[pm.c] [pm.c]
T=4ac09552 T=4adc1fa6
1=incs_loader.h 1=incs.h
2=adc.h 2=adc.h
3=led.h 3=led.h
4=pm.h 4=pm.h
[i2c_ctr.c] [i2c_ctr.c]
T=4ac07479 T=4aca8ef0
1=incs.h 1=incs.h
[main.c] [main.c]
T=4ac0af62 T=4aca8ef0
1=incs.h 1=incs.h
2=WDT.h 2=WDT.h
3=rtc.h 3=rtc.h
4=pm.h 4=pm.h
5=accero.h 5=accero.h
[magic.c] [magic.c]
T=4ac01920 T=4ad3e9ff
1=config.h 1=config.h
[WDT.c] [WDT.c]
T=4a9e6e71 T=4aca8ef0
1=incs_loader.h 1=incs_loader.h
[i2c_mcu.c] [i2c_mcu.c]
T=4ac0b193 T=4ad70c7e
1=incs.h 1=incs.h
2=i2c_mcu.h 2=i2c_mcu.h
[i2c_twl.c] [i2c_twl.c]
T=4ac07a54 T=4aca8ef0
1=incs.h 1=incs.h
2=i2c_twl_defs.h 2=i2c_twl_defs.h
[ini_VECT.c] [ini_VECT.c]
T=4ac169a4 T=4adc1fec
1=config.h 1=config.h
[led.c] [led.c]
T=4ac15aa7 T=4adc1fee
1=incs.h 1=incs.h
2=led.h 2=led.h
[rtc.c] [rtc.c]
T=4ac1c178 T=4ad42ad0
1=incs.h 1=incs.h
[vreg_ctr.c] [vreg_ctr.c]
T=4ac1a405 T=4adbcc88
1=incs.h 1=incs.h
2=vreg_ctr.h 2=vreg_ctr.h
3=rtc.h 3=rtc.h
@ -58,30 +58,30 @@ T=4ac1a405
5=accero.h 5=accero.h
6=pm.h 6=pm.h
[vreg_twl.c] [vreg_twl.c]
T=4ab332c7 T=4ad6dc31
1=incs.h 1=incs.h
2=jhl_defs.h 2=jhl_defs.h
3=vreg_twl.h 3=vreg_twl.h
[tasks.c] [tasks.c]
T=4ac169a4 T=4adc2aa4
1=incs.h 1=incs.h
2=renge\renge.h 2=renge\renge.h
3=pm.h 3=pm.h
[adc.c] [adc.c]
T=4ac15aa7 T=4aca9609
1=incs.h 1=incs.h
2=adc.h 2=adc.h
3=pm.h 3=pm.h
4=led.h 4=led.h
[renge\renge.c] [renge\renge.c]
T=4ac0a6c5 T=4ac96eb4
1=renge\renge_defs.h 1=renge\renge_defs.h
2=renge\renge_task_intval.h 2=renge\renge_task_intval.h
3=renge\renge_task_immediate.h 3=renge\renge_task_immediate.h
4=WDT.h 4=WDT.h
5=bsr_system.h 5=bsr_system.h
[tasks_sys.c] [tasks_sys.c]
T=4ac1a252 T=4ad42ad0
1=incs.h 1=incs.h
2=i2c_twl.h 2=i2c_twl.h
3=i2c_ctr.h 3=i2c_ctr.h
@ -90,16 +90,17 @@ T=4ac1a252
6=pm.h 6=pm.h
7=rtc.h 7=rtc.h
[accero.c] [accero.c]
T=4ac1a5fc T=4adc2c13
1=incs.h 1=incs.h
2=..\..\Program Files\NEC Electronics Tools\CC78K0R\W2.10\inc78k0r\math.h
[self_flash.c] [self_flash.c]
T=4ac07a54 T=4aca8ef0
1=incs_loader.h 1=incs_loader.h
2=..\..\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r\fsl.h 2=..\..\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r\fsl.h
3=fsl_user.h 3=fsl_user.h
4=i2c_ctr.h 4=i2c_ctr.h
[incs_loader.h] [incs_loader.h]
T=4a9e6e71 T=4aca8c17
1=jhl_defs.h 1=jhl_defs.h
2=user_define.h 2=user_define.h
3=bsr_system.h 3=bsr_system.h
@ -109,50 +110,50 @@ T=4a9e6e71
7=i2c_mcu.h 7=i2c_mcu.h
8=WDT.h 8=WDT.h
[jhl_defs.h] [jhl_defs.h]
T=4ab3330b T=4aca8c17
[user_define.h] [user_define.h]
T=4ac1a76f T=4adc252d
1=config.h 1=config.h
[config.h] [config.h]
T=4ac1d2cd T=4adc2bf0
[bsr_system.h] [bsr_system.h]
T=4ac09552 T=4aca8c17
[renge\renge.h] [renge\renge.h]
T=4abc82ef T=4abc82ef
1=renge\renge_defs.h 1=renge\renge_defs.h
2=renge\renge_task_immediate.h 2=renge\renge_task_immediate.h
[renge\renge_defs.h] [renge\renge_defs.h]
T=4aa79102 T=4ac96e5c
[renge\renge_task_immediate.h] [renge\renge_task_immediate.h]
T=4a8a7575 T=4ad68780
1=renge\renge_defs.h 1=renge\renge_defs.h
[vreg_ctr.h] [vreg_ctr.h]
T=4ac14c41 T=4ad68b93
1=config.h 1=config.h
[loader.h] [loader.h]
T=4a7a31d0 T=4aca8c17
1=jhl_defs.h 1=jhl_defs.h
[i2c_mcu.h] [i2c_mcu.h]
T=4a9e6e71 T=4aca8c17
[WDT.h] [WDT.h]
T=4a9e6e71 T=4aca8c17
[fsl.h] [fsl.h]
T=47ec5c12 T=4aca8c17
[fsl_user.h] [fsl_user.h]
T=4a7bf458 T=4aca8c17
[i2c_ctr.h] [i2c_ctr.h]
T=4a7c0777 T=4aca8c17
[pm.h] [pm.h]
T=4ab47f83 T=4ad7efd5
[rtc.h] [rtc.h]
T=4ab48e99 T=4aca8c17
[adc.h] [adc.h]
T=4aa74fb6 T=4aca8c17
1=jhl_defs.h 1=jhl_defs.h
[led.h] [led.h]
T=4ac15aa7 T=4aca8c17
[incs.h] [incs.h]
T=4ac0857f T=4aca8c17
1=jhl_defs.h 1=jhl_defs.h
2=user_define.h 2=user_define.h
3=bsr_system.h 3=bsr_system.h
@ -162,16 +163,18 @@ T=4ac0857f
7=i2c_mcu.h 7=i2c_mcu.h
8=rtc.h 8=rtc.h
[vreg_twl.h] [vreg_twl.h]
T=4aa79c31 T=4ad6dc31
[accero.h] [accero.h]
T=4aa7853b T=4aca8c17
1=jhl_defs.h 1=jhl_defs.h
[i2c_twl_defs.h] [i2c_twl_defs.h]
T=4a7c074e T=4aca8c17
[renge\renge_task_intval.h] [renge\renge_task_intval.h]
T=4ab226cf T=4ac9ab84
1=renge\renge_defs.h 1=renge\renge_defs.h
[i2c_twl.h] [i2c_twl.h]
T=4a7c0786 T=4aca8c17
[..\..\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r\fsl.h] [..\..\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r\fsl.h]
T=49a3bd4e T=49a3bd4e
[..\..\Program Files\NEC Electronics Tools\CC78K0R\W2.10\inc78k0r\math.h]
T=45f12258