mirror of
https://github.com/rvtr/ctr_mcu.git
synced 2025-06-18 16:45:33 -04:00

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_mcu@561 013db118-44a6-b54f-8bf7-843cb86687b1
430 lines
11 KiB
C
430 lines
11 KiB
C
/* ========================================================
|
||
その他雑多なタスク
|
||
タスクを分けた方が見やすくなる気がするが、リソースの問題で分けなかった物
|
||
|
||
$Id: task_misc.c 418 2011-09-22 01:35:37Z n2232 $
|
||
======================================================== */
|
||
|
||
#ifndef _WIN32
|
||
|
||
#pragma SFR
|
||
#pragma NOP
|
||
#pragma HALT
|
||
#pragma STOP
|
||
|
||
#endif
|
||
|
||
#include "incs.h"
|
||
#include "renge\renge.h"
|
||
#include "pm.h"
|
||
|
||
#include "accero.h"
|
||
#include "adc.h"
|
||
#include "i2c_mcu.h"
|
||
#include "led.h"
|
||
#include "vreg_twl.h"
|
||
|
||
|
||
|
||
#ifdef _MCU_BSR_
|
||
#define ACKD ACKD1
|
||
#define ACKE ACKE1
|
||
#define COI COI1
|
||
#define IICAEN IICA1EN
|
||
#define IICRSV IICRSV1
|
||
#define IICA IICA1
|
||
#define IICAIF IICAIF1
|
||
#define IICAMK IICAMK1
|
||
#define IICAPR0 IICAPR11
|
||
#define IICAPR1 IICAPR01
|
||
#define IICCTL0 IICCTL10
|
||
#define IICE IICE1
|
||
#define IICF IICF1
|
||
#define IICS IICS1
|
||
#define IICWH IICWH1
|
||
#define IICWL IICWL1
|
||
#define LREL LREL1
|
||
#define SPD SPD1
|
||
#define SPIE SPIE1
|
||
#define STCEN STCEN1
|
||
#define STD STD1
|
||
#define SVA SVA1
|
||
#define WREL WREL1
|
||
#define WTIM WTIM1
|
||
#define TRC TRC1
|
||
#define SMC SMC1
|
||
#define DFC DFC1
|
||
#endif
|
||
|
||
// ========================================================
|
||
extern void f(); // スタックの最後を得る
|
||
|
||
|
||
// ========================================================
|
||
bit twl_ver_read; // twl home menuがverを読んだら互換カーネルに割り込みを入れるため
|
||
bit going_to_sleep; // SoCから、sleepに入る通知をもらう。slp_i のH期間が0になると
|
||
// スリープから復帰できなくなるのを防ぐため
|
||
|
||
|
||
// 自動テスト用
|
||
bit reserve_pedo_increnent;
|
||
|
||
|
||
// ========================================================
|
||
static void update_LED_3D();
|
||
static void check_twl_vol_irq();
|
||
|
||
|
||
|
||
/********************************************//**
|
||
単品でタスクにしない雑多な処理
|
||
- 加速度センサ割り込みの取りこぼし確認(念の為)
|
||
- TWL PM互換レジスタへの書き込みがあれば読みに行く
|
||
- 互換カーネルにTWLランチャーの起動を通知
|
||
- TWLの音量変化割り込みをチェック
|
||
- 3Dランプの更新
|
||
- (HAL) 歩数計、一歩増やす
|
||
- (デバッグ) SEL押し続けるとWDTリセットを発生させる
|
||
***********************************************/
|
||
void tsk_misc( )
|
||
{
|
||
// 割り込みの取りこぼし?
|
||
if( ACC_VALID && ( ( vreg_ctr[ VREG_C_STATUS_1 ] & REG_BIT_ACCERO_ERR ) == 0 ))
|
||
{
|
||
if( renge_task_immed_add( tski_cbk_accero ) == ERR_SUCCESS ){
|
||
// dbg_nop();
|
||
}
|
||
}
|
||
|
||
if( system_status.pwr_state == ON )
|
||
{
|
||
/* ========================================================
|
||
PM互換レジスタへの書き込み
|
||
ポーリングで対応
|
||
======================================================== */
|
||
if( !PM_IRQ_n )
|
||
{
|
||
renge_task_immed_add( tski_ntr_pmic_comm );
|
||
// dbg_nop();
|
||
}
|
||
|
||
/* ========================================================
|
||
TWLランチャーが起動したことをCTRが知りたいらしい
|
||
======================================================== */
|
||
if( twl_ver_read )
|
||
{
|
||
twl_ver_read = false;
|
||
set_irq( VREG_C_IRQ2, REG_BIT_TWL_VER_READ );
|
||
}
|
||
|
||
// TWL の音量変化割り込みチェック //
|
||
check_twl_vol_irq();
|
||
}
|
||
|
||
// 3D ランプ更新 //
|
||
update_LED_3D();
|
||
|
||
#ifdef _ENABLE_HAL_
|
||
// デバッグHAL 歩数を一歩増やす //
|
||
if( reserve_pedo_increnent )
|
||
{
|
||
reserve_pedo_increnent = 0;
|
||
hosu_increment_if_necessary();
|
||
}
|
||
#endif
|
||
|
||
#ifdef _ENABLE_PRESS_SEL_TO_WDT_
|
||
if(( system_status.pwr_state == ON )
|
||
|| ( system_status.pwr_state == SLEEP ))
|
||
{
|
||
static u16 timer;
|
||
if( !SW_SEL_n )
|
||
{
|
||
timer += 1;
|
||
if( timer == 2000 )
|
||
{
|
||
DI();
|
||
timer = 0;
|
||
while(1)
|
||
{
|
||
NOP(); // そのうちWDTが発生する
|
||
}
|
||
}
|
||
}
|
||
}
|
||
#endif
|
||
|
||
//. スタックテスト
|
||
// f();
|
||
}
|
||
|
||
|
||
|
||
/********************************************//**
|
||
TWLがVolを書くのと、スライダの操作がバッティングすると
|
||
不整合が起こる事があり、それを防ぐ
|
||
|
||
TWLでは通常時、押しボタンは8段階だった。それに合わせて割り込みを入れる。
|
||
***********************************************/
|
||
void check_twl_vol_irq()
|
||
{
|
||
static u8 vol_level_twl_sent;
|
||
static u8 mabiki;
|
||
|
||
if( !is_TWL )
|
||
{
|
||
return;
|
||
// おしまい
|
||
}
|
||
|
||
if( mabiki != 0 )
|
||
{
|
||
mabiki--;
|
||
return;
|
||
// おしまい
|
||
}
|
||
|
||
mabiki = 9; // 1フレームは開ける
|
||
if( vol_level_twl != vol_level_twl_sent )
|
||
{
|
||
vol_level_twl_sent = vol_level_twl;
|
||
set_irq( VREG_C_IRQ2, REG_BIT_SLIDE_VOL_ACROSS_TWL_BOUNDARY );
|
||
}
|
||
}
|
||
|
||
|
||
/********************************************//**
|
||
3Dランプ更新
|
||
***********************************************/
|
||
void update_LED_3D()
|
||
{
|
||
if( system_status.pwr_state != ON )
|
||
{
|
||
LED_duty_3d = 0;
|
||
return;
|
||
// おしまい //
|
||
}
|
||
|
||
if( vreg_ctr[VREG_C_LED_3D] == LED_3D_ILM_OFF )
|
||
{
|
||
if( LED_duty_3d != 0 )
|
||
{
|
||
LED_duty_3d --;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if( LED_duty_3d != vreg_ctr[VREG_C_LED_BRIGHT] )
|
||
{
|
||
if( LED_duty_3d < vreg_ctr[VREG_C_LED_BRIGHT] )
|
||
{
|
||
LED_duty_3d ++;
|
||
}
|
||
else
|
||
{
|
||
LED_duty_3d --;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
/********************************************//**
|
||
COMMANDレジスタへの書き込み
|
||
|
||
0なら呼ばれません。ケア不要
|
||
|
||
- sleep 通知(受)
|
||
- リセット系コマンド
|
||
***********************************************/
|
||
task_status_immed tski_do_command0( )
|
||
{
|
||
u8 temp_command;
|
||
|
||
// command0 本体電源など
|
||
DI_wt_chk();
|
||
temp_command = vreg_ctr[VREG_C_COMMAND0];
|
||
vreg_ctr[VREG_C_COMMAND0] = 0;
|
||
EI();
|
||
|
||
// SLPO(SoC->mcu) が非同期のため、パルス幅がゼロになってしまい、mcu が SoCの一瞬の
|
||
// スリープを検出出来ず、SLPIをトグル出来ない事がある。あらかじめ通知してもらい、
|
||
// タイムアウト処理を行う。
|
||
if( temp_command & REG_BIT_GOING_TO_SLEEP )
|
||
{
|
||
going_to_sleep = true;
|
||
}
|
||
|
||
// リセット系のコマンド //
|
||
if( ( temp_command & ( REG_BIT_OFF_REQ | REG_BIT_RESET1_REQ | REG_BIT_FCRAM_RESET_REQ | REG_BIT_RESET2_REQ )) != 0x00 )
|
||
{
|
||
if( temp_command & REG_BIT_OFF_REQ )
|
||
{
|
||
system_status.pwr_state = OFF_TRIG;
|
||
}
|
||
else
|
||
{
|
||
if( temp_command & REG_BIT_RESET1_REQ )
|
||
{
|
||
PM_reset_ast( );
|
||
RESET2_ast;
|
||
FCRAM_RST_ast;
|
||
}
|
||
if( temp_command & REG_BIT_RESET2_REQ )
|
||
{
|
||
RESET2_ast;
|
||
if( vreg_twl[ REG_TWL_INT_ADRS_MODE ] == 0 )
|
||
{
|
||
FCRAM_RST_ast; // twlはntrモードで動作してる
|
||
}
|
||
// TWLモードからDSモードへの切り替え中にリセットすると
|
||
// IRQが読まれない場合があるのでTWLレジスタを初期化する
|
||
vreg_twl_init();
|
||
}
|
||
if( temp_command & REG_BIT_FCRAM_RESET_REQ )
|
||
{
|
||
FCRAM_RST_ast;
|
||
}
|
||
wait_ms( 5 ); // 時間稼ぎ
|
||
FCRAM_RST_neg;
|
||
PM_reset_neg();
|
||
RESET2_neg;
|
||
|
||
// CODEC 不定レジスタ初期化 //
|
||
codec_reg_init();
|
||
}
|
||
}
|
||
/*
|
||
スリープ要求直後に電源OFF・リセットコマンドは来まい
|
||
if( vreg_ctr[VREG_C_COMMAND0] != 0 )
|
||
{
|
||
return ( TSKI_CONTINUE );
|
||
}
|
||
*/
|
||
return ( TSKI_FINISHED );
|
||
}
|
||
|
||
|
||
|
||
/* デバッグ・自動テスト用 ============================== */
|
||
u16 _dbg_rcomp;
|
||
extern u8 raw_adc_temperature;
|
||
|
||
extern u8 iic_burst_state;
|
||
extern bit temp_zone_charge_disable;
|
||
extern bit bt_authorized;
|
||
|
||
|
||
|
||
|
||
#define KOUMOKU 19
|
||
|
||
static u8 infos_bits[2];
|
||
static u8 infos_temp[5];
|
||
|
||
static const u8 *infos_table[ KOUMOKU ] = {
|
||
&infos_temp[0], /* 0 */
|
||
&pmic_version,
|
||
(u8*)&battery_manufacturer,
|
||
&mgic_version[0],
|
||
&mgic_version[1],
|
||
&infos_temp[1], /* 5 */
|
||
&raw_adc_temperature,
|
||
&infos_temp[2],
|
||
&infos_temp[3],
|
||
(u8*)&system_status.family, /* 9 */
|
||
&infos_bits[0], /* 10 */
|
||
(u8*)&LED_duty_pow_blu,
|
||
(u8*)&LED_duty_3d,
|
||
(u8*)&LED_duty_notify_red,
|
||
(u8*)&LED_duty_notify_grn,
|
||
(u8*)&LED_duty_notify_blu, /* 15 */
|
||
&infos_bits[1],
|
||
(u8*)&LED_duty_WiFi,
|
||
&infos_temp[4] /* 18 */
|
||
/* 項目足すときは KOUMOKU に注意 */
|
||
};
|
||
|
||
/********************************************//**
|
||
デバッグ用にステータスを返す。(拡張ステータス 0x7F)
|
||
|
||
返値はデータそのもの
|
||
|
||
出てくる順場は、
|
||
|
||
- 1) プラットフォーム
|
||
- 2) PMIC バージョン
|
||
- 3) 電池メーカー
|
||
- 4) ガスゲージバージョン
|
||
- 5) 〃
|
||
- 6) ( rcomp & 0xFF )
|
||
- 7) raw_adc_temperature
|
||
- 8) ( !temp_zone_charge_disable | ( bt_authorized << 1 ) )
|
||
- 9) お知らせLEDはフルカラー?
|
||
- 10) system_status.family
|
||
***********************************************/
|
||
u8 extinfo_read(void)
|
||
{
|
||
u8 ret = 0xFF;
|
||
|
||
/*
|
||
* tempは計算処理が必要なデータ。メモリに余裕がないので計算が必要な
|
||
* 変数は、要/不要に関わらず計算するポリシー
|
||
*/
|
||
|
||
if( iic_burst_state < KOUMOKU )
|
||
{
|
||
infos_temp[0] = system_status.captureBox? ( system_status.is_dev? MODEL_IS_CAPTURE :MODEL_KUC_CAPTURE )
|
||
: ( system_status.is_dev? MODEL_IS_DEBUGGER: (u8)system_status.model );
|
||
infos_temp[1] = (u8)( _dbg_rcomp & 0xFF );
|
||
infos_temp[2] = ( !temp_zone_charge_disable | ( bt_authorized << 1 ) );
|
||
infos_temp[3] = 1; /* 仕様変更により1固定になった */
|
||
infos_temp[4] = 0
|
||
// | ( PM_EXTDC_n ? REG_BIT_HAL0_PM_EXTDC_n : 0 ) // status0にある
|
||
| ( BT_IN_CHG_n ? REG_BIT_HAL0_BT_IN_CHG_n : 0 )
|
||
| ( BT_CHG_Ena_n ? REG_BIT_HAL0_RSV_5 : 0 ) // 空きビット使用,out pin
|
||
| 0 // WL_TX 使えない
|
||
// | ( SHELL_OPEN ? REG_BIT_HAL0_SHELL_OPEN : 0 ) // status0にある
|
||
| ( SW_WIFI_n ? REG_BIT_HAL0_SW_WIFI_n : 0 )
|
||
| ( SW_HOME_n ? REG_BIT_HAL0_SW_HOME_n : 0 )
|
||
| ( SW_POW_n ? REG_BIT_HAL0_SW_POW_n : 0 );
|
||
|
||
infos_bits[0] = (u8)LED_pow_red;
|
||
infos_bits[1] = (u8)LED_CAM;
|
||
|
||
ret = *infos_table[iic_burst_state];
|
||
|
||
#if 0
|
||
// debug //
|
||
/// システムに機種識別で嘘をつく
|
||
if( iic_burst_state == 9 )
|
||
{
|
||
ret = (u8)FAMILY_FLOWER;
|
||
}
|
||
#endif
|
||
iic_burst_state ++;
|
||
}
|
||
|
||
return ret;
|
||
}
|
||
|
||
|
||
#ifdef i2c_timeout_test
|
||
/********************************************//**
|
||
(デバッグ用)I2C_mcu にプロトコル違反(波形崩れ)が検出されたら全LEDを点灯して通知する
|
||
***********************************************/
|
||
void i2c_mcu_error_monitor()
|
||
{
|
||
LED_duty_pow_blu = 0xff;
|
||
LED_duty_3d = 0xff;
|
||
LED_duty_notify_red = 0xff;
|
||
LED_duty_notify_grn = 0xff;
|
||
LED_duty_notify_blu = 0xff;
|
||
LED_pow_red = 1;
|
||
LED_CAM = 1;
|
||
}
|
||
#endif
|
||
|