ctr_mcu/trunk/vreg_ctr.c
fujita_ryohei da40a5147c 歩数計 ログ読み出し対応(未検証)
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_mcu@48 013db118-44a6-b54f-8bf7-843cb86687b1
2009-12-10 08:02:22 +00:00

344 lines
9.1 KiB
C

/* ========================================================
CTR MCU I2Cレジスタ
====================================================== */
#include "incs.h"
#include "vreg_ctr.h"
#include "rtc.h"
#include "led.h"
#include "accero.h"
#include "pm.h"
#include <fsl.h>
#include "fsl_user.h"
// ********************************************************
u8 vreg_ctr[VREG_C_ENDMARK_];
bit irq_readed; // AAA型のため。
extern bit update;
extern u8 pool[];
// ********************************************************
extern task_status_immed tski_firm_update();
// ********************************************************
#ifdef _MCU_BSR_
#define IICAMK IICAMK1
#endif
// ********************************************************
// 非ゼロの初期値の指定が必要なアドレス
void vreg_ctr_init( )
{
vreg_ctr[VREG_C_LED_BRIGHT] = 0xFF;
vreg_ctr[VREG_C_MCU_VER_MAJOR] = MCU_VER_MAJOR;
#ifdef _MODEL_WM0_
vreg_ctr[VREG_C_MCU_VER_MAJOR] += 0x20;
#endif
#ifdef _MODEL_TS0_
vreg_ctr[VREG_C_MCU_VER_MAJOR] += 0x10;
#endif
vreg_ctr[VREG_C_MCU_VER_MINOR] = MCU_VER_MINOR;
vreg_ctr[VREG_C_VCOM_T] = 92;
vreg_ctr[VREG_C_VCOM_B] = 95;
}
// ********************************************************
// I2C仮想レジスタに書きます。
// 引数 adrs は内部アドレス
//  書けないアドレスにアクセスした場合、何もしません。
// ●書き込んだ結果、I2C_mcu通信が発生する場合、renge_task_immed_add()
// を使用しないと、I2C_mcu使用中でエラー終了した場合にリトライしません。
void vreg_ctr_write( u8 adrs, u8 data )
{
switch ( adrs )
{
case ( VREG_C_MCU_STATUS ):
vreg_ctr[adrs] = data;
vreg_twl[ REG_TWL_INT_ADRS_MODE ] = ( ( data & 0xC0 ) >> 6);
break;
case ( VREG_C_VCOM_T ):
case ( VREG_C_VCOM_B ):
renge_task_immed_add( tski_vcom_set );
vreg_ctr[adrs] = data;
break;
case ( VREG_C_DBG1 ):
case ( VREG_C_DBG2 ):
vreg_ctr[adrs] = data;
break;
case ( VREG_C_DBG3 ):
vreg_ctr[adrs] = data;
if( ( vreg_ctr[VREG_C_DBG1] == 'j' )
&& ( vreg_ctr[VREG_C_DBG2] == 'h' )
&& ( data == 'l' ) )
{
renge_task_immed_add( tski_firm_update );
IICAMK = 1;
}
break;
case ( VREG_C_IRQ_MASK0 ):
case ( VREG_C_IRQ_MASK1 ):
case ( VREG_C_IRQ_MASK2 ):
case ( VREG_C_IRQ_MASK3 ):
case ( VREG_C_IRQ_MASK4 ):
vreg_ctr[adrs] = data;
break;
case ( VREG_C_COMMAND0 ):
case ( VREG_C_COMMAND2 ):
vreg_ctr[adrs] = data;
if( data != 0 )
{
renge_task_immed_add( do_command );
}
break;
case ( VREG_C_COMMAND1 ):
vreg_ctr[adrs] = data;
if( data != 0 )
{
// TWLに割り込みを入れる
/// 実際に割り込みを入れるのはSoC
vreg_twl[REG_TWL_INT_ADRS_IRQ] = ( ( vreg_ctr[VREG_C_COMMAND1] & REG_BIT_SEND_TWL_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_SEND_TWL_RESET_DET ) != 0 ) ? REG_BIT_TWL_IRQ_RESET : 0x00; //reset_req
vreg_twl[REG_TWL_INT_ADRS_IRQ] |= ( ( vreg_ctr[VREG_C_COMMAND1] & REG_BIT_SEND_TWL_OFF_DET ) != 0 ) ? REG_BIT_TWL_IRQ_OFF : 0x00; //off_req
vreg_twl[REG_TWL_INT_ADRS_IRQ] |= ( ( vreg_ctr[VREG_C_COMMAND1] & REG_BIT_SEND_TWL_BATT_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_SEND_TWL_BATT_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_SEND_TWL_VOL_CLICK ) != 0 ) ? REG_BIT_TWL_IRQ_VOL_CHANGE : 0x00; //vol_changed
}
break;
case ( VREG_C_FREE0 ):
case ( VREG_C_FREE1 ):
case ( VREG_C_FREE2 ):
case ( VREG_C_FREE3 ):
vreg_ctr[adrs] = data;
break;
case ( VREG_C_LED_BRIGHT ):
vreg_ctr[adrs] = data;
break;
case ( VREG_C_LED_POW ):
case ( VREG_C_LED_WIFI ):
case ( VREG_C_LED_CAM ):
case ( VREG_C_LED_TUNE ):
vreg_ctr[adrs] = data & 0x0F;
break;
/// 非同期で動いているためここでは書かない。
// 予約するだけでstopで書く
case ( VREG_C_RTC_SEC ):
case ( VREG_C_RTC_MIN ):
set_rtc( adrs - VREG_C_RTC_SEC, data & 0x7F );
break;
case ( VREG_C_RTC_HOUR ):
set_rtc( adrs - VREG_C_RTC_SEC, data & 0x3F );
break;
case ( VREG_C_RTC_YOBI ):
set_rtc( adrs - VREG_C_RTC_SEC, data & 0x07 );
break;
case ( VREG_C_RTC_DAY ):
set_rtc( adrs - VREG_C_RTC_SEC, data & 0x3F );
break;
case ( VREG_C_RTC_MONTH ):
set_rtc( adrs - VREG_C_RTC_SEC, data & 0x1F );
break;
case ( VREG_C_RTC_YEAR ):
set_rtc( adrs - VREG_C_RTC_SEC, data );
break;
case ( VREG_C_RTC_COMP ):
vreg_ctr[adrs] = data;
SUBCUD = data;
break;
case ( VREG_C_RTC_ALARM_MIN ):
case ( VREG_C_RTC_ALARM_HOUR ):
vreg_ctr[adrs] = data;
rtc_alarm_dirty = 1;
break;
// 書くだけでよい
case ( VREG_C_RTC_ALARM_DAY ):
case ( VREG_C_RTC_ALARM_MONTH ):
case ( VREG_C_RTC_ALARM_YEAR ):
vreg_ctr[adrs] = data;
break;
case ( VREG_C_ACC_CONFIG ):
vreg_ctr[adrs] = data;
renge_task_immed_add( acc_hosu_set );
break;
case ( VREG_C_ACC_R_ADRS ):
vreg_ctr[adrs] = data;
renge_task_immed_add( acc_read );
break;
case ( VREG_C_ACC_W_ADRS ):
vreg_ctr[adrs] = data;
break;
case ( VREG_C_ACC_W_BUF ):
vreg_ctr[adrs] = data;
renge_task_immed_add( acc_write );
break;
case ( VREG_C_ACC_HOSU_L ):
case ( VREG_C_ACC_HOSU_M ):
case ( VREG_C_ACC_HOSU_H ):
vreg_ctr[adrs] = data;
break;
#ifdef _debug_
case ( VREG_C_BT_REMAIN ):
case ( VREG_C_BT_TEMP ):
vreg_ctr[adrs] = data;
break;
#endif
case ( VREG_C_COMMAND3 ):
switch ( data )
{
case ( 'r' ): // マイコン再起動
WDTE = 0xAA;
DI( );
RTCE = 0;
while( DST1 ){;}
DEN1 = 0;
FSL_FLMD0_HIGH; // フラッシュ書き替え許可
FSL_Init( pool ); // ライブラリ初期化。割り込み中断考慮せず
FSL_ModeCheck( ); // ライトプロテクトチェック。失敗することを考慮せず
FSL_ForceReset(); // リセット
break;
default:
vreg_ctr[adrs] = data;
break;
}
break;
}
return;
}
// ********************************************************
// I2C仮想レジスタから読みます。
// 戻り: xx データ
// 注意:次のアドレスの準備で呼ばれる ので、
// リードされたらクリアなどは気をつける
u8 vreg_ctr_read( u8 adrs )
{
// RTCは読み出し途中に繰り上がるのを避けるため
if( ( VREG_C_RTC_SEC <= adrs ) && ( adrs <= VREG_C_RTC_YEAR ) )
{
rtc_buf_reflesh( );
}
if( adrs == VREG_C_MCU_STATUS )
{
return( vreg_ctr[ VREG_C_MCU_STATUS ] | ( ( vreg_twl[ REG_TWL_INT_ADRS_MODE ] & 0x03 ) << 6 ) );
}
if( adrs == VREG_C_ACC_HOSU_HIST )
{
return( hosu_read() );
}
#if 1
if( adrs >= VREG_C_ENDMARK_ )
{
return( 0xEE );
}
#endif
return ( vreg_ctr[adrs] );
}
// ********************************************************
// I2C仮想レジスタから読まれて何かするレジスタ
void vreg_ctr_after_read( u8 adrs )
{
// 割り込みフラグはリードでクリア
switch( adrs )
{
case VREG_C_IRQ0:
case VREG_C_IRQ1:
case VREG_C_IRQ2:
case VREG_C_IRQ3:
case VREG_C_IRQ4:
vreg_ctr[ adrs ] = 0;
irq_readed = 1;
break;
default:
break;
}
}
/******************************************************************************
割り込みを入れる
割り込みマスクが必要と言うことでこんな事をする羽目になりました
*****************************************************************************/
#if 0
// マスクされてたら、フラグは立てるが、割り込みは入れない。
#define set_irq( irqreg, bitpos ) \
{ \
vreg_ctr[ irqreg ] |= bitpos; \
if( ( vreg_ctr[ irqreg+8 ] & bitpos ) == 0 ){ \
IRQ0_ast; \
} \
}
#endif
// マスクされてたら、フラグも立てず、割り込みも入れない。
void set_irq( u8 irqreg, u8 irq_flg )
{
u8 tot; // IRQ_mcu がLに縛られてると困る(基板不良)
DI();
if( ( vreg_ctr[ irqreg + 8 ] & irq_flg ) == 0 ){
vreg_ctr[ irqreg ] |= irq_flg;
IRQ0_neg;
tot = 0;
while( !IRQ0 && ( ++tot != 0 ) ){;}
IRQ0_ast;
}
EI();
}