ctr_mcu/trunk/vreg_ctr.c
fujita_ryohei 28b5f92e98 加速度割り込み周りで取りこぼすことがあったのを救うコード追加
CTRコーデックに対応?
IRQ_0を確実にかける
I2C(TWL/CTR)の割り込み優先度修正(レジスタ名が悪いと思う)
カメラLED、TWLからの操作を追加
loader、文法ミス修正
自己アップデート後、自己リセットをかける。メーカーの回答待ちのため暫定。(セットは電源が切れ、RTCも初期化される)
RTCの初期値を変更(暫定)
バッテリ残量ICとのやりとりを修正。メーカーの推奨の手順が更新されたため。また、不正になりがちなのでリセットをかけるようにしてみた。I2C_mの2バイト書き込みがひどかったので修正
互換側I2Cれじすたの整理。エンバグ心配



git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_mcu@13 013db118-44a6-b54f-8bf7-843cb86687b1
2009-10-27 04:12:36 +00:00

249 lines
6.5 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* ========================================================
CTR MCU I2Cレジスタ
====================================================== */
#include "incs.h"
#include "vreg_ctr.h"
#include "rtc.h"
#include "led.h"
#include "accero.h"
#include "pm.h"
// ********************************************************
u8 vreg_ctr[VREG_C_ENDMARK_];
// ********************************************************
// 非ゼロの初期値の指定が必要なアドレス
void vreg_ctr_init( )
{
vreg_ctr[VREG_C_LED_BRIGHT] = 0xFF;
#ifdef _debug_
// vreg_ctr[ VREG_C_LED_TUNE ] = 0x02;
#endif
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 & ~0x40 );
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' ) )
{
firm_update( ); // 戻ってこない
}
break;
case ( VREG_C_IRQ_MASK0 ):
case ( VREG_C_IRQ_MASK1 ):
case ( VREG_C_IRQ_MASK2 ):
case ( VREG_C_IRQ_MASK3 ):
vreg_ctr[adrs] = data;
break;
case ( VREG_C_COMMAND0 ):
vreg_ctr[adrs] = data;
if( data != 0 )
{
renge_task_immed_add( do_command0 );
}
break;
case ( VREG_C_COMMAND1 ):
vreg_ctr[adrs] = data;
if( data != 0 )
{
// renge_task_immed_add( do_command1 );
/// 持ってきました
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_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_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_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_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_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;
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 ):
vreg_ctr[adrs] = data;
break;
case ( VREG_C_LED_WIFI ):
vreg_ctr[adrs] = data;
break;
case ( VREG_C_LED_CAM ):
vreg_ctr[adrs] = data;
break;
case ( VREG_C_LED_TUNE ):
vreg_ctr[adrs] = data;
break;
case ( VREG_C_RTC_SEC ):
case ( VREG_C_RTC_MIN ):
case ( VREG_C_RTC_HOUR ):
case ( VREG_C_RTC_YOBI ):
case ( VREG_C_RTC_DAY ):
case ( VREG_C_RTC_MONTH ):
case ( VREG_C_RTC_YEAR ):
// ここでは書かない。セットするだけでstopで書く
/// 非同期で動いているため。
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 ):
vreg_ctr[adrs] = data;
switch ( data )
{
case ( 'r' ): // マイコン再起動
WDTE = 0xAA;
break;
}
break;
}
return;
}
// ********************************************************
// I2C仮想レジスタから読みます。
// 引数 adrs 外から見たときの、アドレス
// 戻り xx データ
//  存在しないアドレスにアクセスした場合、戻り値は0x5A
u8 vreg_ctr_read( u8 adrs )
{
if( ( VREG_C_RTC_SEC <= adrs ) && ( adrs <= VREG_C_RTC_YEAR ) )
{
get_rtc( );
}
return ( vreg_ctr[adrs] );
}
// ********************************************************
// I2C仮想レジスタから読まれて何かするレジスタ
void vreg_ctr_after_read( u8 adrs )
{
// リードがトリガで何かをする↓
// 割り込みビットのクリア
if( adrs == VREG_C_IRQ3 )
{
vreg_ctr[VREG_C_IRQ0] = vreg_ctr[VREG_C_IRQ1] =
vreg_ctr[VREG_C_IRQ2] = vreg_ctr[VREG_C_IRQ3] = 0;
}
return;
}