mirror of
https://github.com/rvtr/ctr_mcu.git
synced 2025-10-31 13:51:10 -04:00
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
249 lines
6.5 KiB
C
249 lines
6.5 KiB
C
/* ========================================================
|
||
|
||
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;
|
||
}
|