mirror of
https://github.com/rvtr/ctr_mcu.git
synced 2025-06-19 09:05:48 -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@123 013db118-44a6-b54f-8bf7-843cb86687b1
392 lines
10 KiB
C
392 lines
10 KiB
C
/* ========================================================
|
||
MCU CTR BSR
|
||
2009/03/30
|
||
開発技術部 藤田
|
||
|
||
ブートローダー部
|
||
ホストの通信と、自己書き換え、ファームのチェックを行う。
|
||
|
||
======================================================== */
|
||
#pragma SFR
|
||
#pragma di
|
||
#pragma ei
|
||
#pragma nop
|
||
#pragma stop
|
||
#pragma halt
|
||
#pragma opc
|
||
|
||
|
||
#include "incs_loader.h"
|
||
|
||
#include "fsl.h"
|
||
#include "fsl_user.h"
|
||
|
||
#include "i2c_ctr.h"
|
||
#include "i2c_mcu.h"
|
||
#include "pm.h"
|
||
#include "rtc.h"
|
||
|
||
#include "reboot.h"
|
||
|
||
|
||
// ========================================================
|
||
#if (FSL_DATA_BUFFER_SIZE>0)
|
||
fsl_u08 fsl_data_buffer[FSL_DATA_BUFFER_SIZE];
|
||
#endif
|
||
|
||
|
||
|
||
#ifdef FSL_INT_BACKUP
|
||
static fsl_u08 fsl_MK0L_bak_u08; /* if (interrupt backup required) */
|
||
static fsl_u08 fsl_MK0H_bak_u08; /* { */
|
||
static fsl_u08 fsl_MK1L_bak_u08; /* reserve space for backup information */
|
||
static fsl_u08 fsl_MK1H_bak_u08; /* of interrupt mask flags */
|
||
static fsl_u08 fsl_MK2L_bak_u08; /* */
|
||
static fsl_u08 fsl_MK2H_bak_u08; /* } */
|
||
#endif
|
||
|
||
|
||
|
||
// magic.c の記述と違わないように注意!
|
||
#define MGC_LOAD 0x0FF6
|
||
#define MGC_FOOT 0x4FF6
|
||
|
||
|
||
|
||
// ========================================================
|
||
void FSL_Open( void );
|
||
void FSL_Close( void );
|
||
void hdwinit( void );
|
||
void power_save( );
|
||
static void hdwinit2( );
|
||
|
||
extern void main_loop( );
|
||
|
||
|
||
|
||
// ========================================================
|
||
void main( )
|
||
{
|
||
while( 1 )
|
||
{
|
||
WDT_Restart( );
|
||
if( RTCEN )
|
||
{
|
||
system_status.reboot = 1;
|
||
}
|
||
else if( ( RESF & 0x10 ) != 0) // WDRF,WDTでリセット
|
||
{
|
||
system_status.reboot = 1;
|
||
#ifdef _PMIC_TWL_
|
||
// 暴走してしまうので再起動させる
|
||
PM_reset_ast();
|
||
/// hdwinit2ないでリセット解除される。続きに続行してよい(頭痛が痛い的)
|
||
#endif
|
||
vreg_ctr[ VREG_C_MCU_STATUS ] |= REG_BIT_STATUS_WDT_RESET;
|
||
set_irq( VREG_C_IRQ0, REG_BIT_IRQ_WDT_RESET );
|
||
hdwinit2( );
|
||
}
|
||
else
|
||
{
|
||
u8 pwup_delay0 = 0;
|
||
u8 pwup_delay1 = 0;
|
||
|
||
do
|
||
{ // 電池接続時、16ms待ってみる(チャタリング対策)
|
||
pwup_delay0 += 1;
|
||
do
|
||
{
|
||
pwup_delay1 += 1;
|
||
}
|
||
while( pwup_delay1 != 0 ); // u16にするとコンパイラが怒るんだが…。
|
||
}
|
||
while( pwup_delay0 != 0 );
|
||
|
||
hdwinit2( );
|
||
}
|
||
|
||
// ファームの整合性チェック //
|
||
{
|
||
u8 i;
|
||
u8 comp = 0;
|
||
|
||
// ローダーと本体は同じバージョンか?
|
||
/// 次へのアップデートの途中で終わってないか?
|
||
for( i = 0; i < sizeof( __TIME__ ); i++ ) // sizeof( __TIME__ ) = 8 らし
|
||
{
|
||
comp += ( *( __far u8 * )( MGC_LOAD + i ) == *( u8 * )( MGC_FOOT + i ) ) ? 0 : 1;
|
||
}
|
||
|
||
if( comp != 0 )
|
||
{
|
||
// ファームリストアを試みる
|
||
firm_restore( );
|
||
// 帰ってこない。リセットをかける。
|
||
}
|
||
}
|
||
|
||
// 通常運転
|
||
main_loop( );
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/* ========================================================
|
||
キーリターン割り込み
|
||
======================================================== */
|
||
__interrupt void int_kr( )
|
||
{
|
||
}
|
||
|
||
|
||
|
||
/* ========================================================
|
||
ext dc
|
||
======================================================== */
|
||
__interrupt void intp4( )
|
||
{
|
||
}
|
||
|
||
|
||
/* ========================================================
|
||
shell close
|
||
======================================================== */
|
||
__interrupt void intp5( )
|
||
{
|
||
}
|
||
|
||
|
||
|
||
// ========================================================
|
||
void hdwinit( void )
|
||
{ // スタートアップルーチンが勝手に呼びます
|
||
DI( ); /* マスタ割り込み禁止 */
|
||
|
||
CMC = 0b00010110; /* X1発振せず(入力ポート)、XT1使用、推奨の推奨で超低電力発振 */
|
||
CSC = 0b10000000; /* X1発振なし、XT1発振あり、高速内蔵発振動作 */
|
||
#ifdef _MCU_BSR_
|
||
OSMC = 0x01; /* 隠しレジスタ */
|
||
#endif
|
||
#ifdef _OVERCLOCK_
|
||
CKC = 0b00001000; /* CPU/周辺クロック=fMAIN、fMAIN=fMX、fCLK=fMX */
|
||
#else
|
||
// CKC デフォルトでよい
|
||
#endif
|
||
|
||
/*--- 低電圧検出回路の設定 ---*/
|
||
/* リセット解除時のデフォルトは、オプション・バイトにて指定される */
|
||
LVIS = 0b00000000; /* VLVI = 4.22±0.1V */
|
||
LVIM = 0b00000000; /* LVI動作禁止 */
|
||
/* 電源電圧(VDD)<検出電圧(VLVI)時に割込発生 */
|
||
/* 電源電圧(VDD)≧検出電圧<VLVI)、または動作禁止時に低電圧検出 */
|
||
}
|
||
|
||
|
||
void hdwinit2( )
|
||
{
|
||
// ポート設定 /////////////////////////////////////////
|
||
if( system_status.reboot ) // リセットピンだけはすぐにセットする
|
||
{
|
||
#ifdef _MODEL_TEG2_
|
||
P0 = 0b00000011;
|
||
P3 = 0b00000110; // 簡易I2Cは出力ラッチを1にする
|
||
P14 = 0b00000001;
|
||
#endif
|
||
#ifdef _MODEL_WM0_
|
||
P0 = 0b00000011;
|
||
P3 = 0b00000110; // 簡易I2Cは出力ラッチを1にする
|
||
P14 = 0b00000001;
|
||
#endif
|
||
#ifdef _MODEL_TS0_
|
||
P0 = 0b00000001;
|
||
P3 = 0b00000111; // 簡易I2Cは出力ラッチを1にする
|
||
P14 = 0b00000000;
|
||
#endif
|
||
#ifdef _MODEL_CTR_
|
||
P0 = 0b00000001;
|
||
P3 = 0b00000111; // 簡易I2Cは出力ラッチを1にする
|
||
P14 = 0b00000000;
|
||
#endif
|
||
}
|
||
else
|
||
{
|
||
P0 = 0b00000000;
|
||
P3 = 0b00000110; // 簡易I2Cは出力ラッチを1にする
|
||
P14 = 0b00000000;
|
||
}
|
||
|
||
#ifdef _MCU_BSR_
|
||
PM0 = 0b11111111; // BSRマイコンでは、reset1は監視のみになる。
|
||
#else
|
||
PM0 = 0b00000000; // 0で出力
|
||
#endif
|
||
PM3 = 0b11110000; // P31,32は簡易I2C
|
||
PM14 = 0b11111100; // debugger[1] とりあえず出力
|
||
|
||
P1 = 0b00000000;
|
||
P2 = 0b00000000;
|
||
P4 = 0b00000000;
|
||
P5 = 0b00000000;
|
||
P6 = 0b00000000;
|
||
P7 = 0b01000000;
|
||
P12 = 0b00000000;
|
||
|
||
#ifdef _MCU_BSR_
|
||
P20 = 0b00000000;
|
||
#else
|
||
P8 = 0b00000000;
|
||
#endif
|
||
|
||
P15 = 0b00000000;
|
||
|
||
|
||
PM1 = 0b00000000;
|
||
PM2 = 0b11101001;
|
||
|
||
#ifdef _PMIC_CTR_
|
||
PM4 = 0b11110111;
|
||
#else
|
||
PM4 = 0b11111011;
|
||
#endif
|
||
|
||
PM5 = 0b11110011;
|
||
PM6 = 0b11111100; // I2CのラインがL出力になってしまうが、システムがOFFなのでかまわない
|
||
PM7 = 0b00011111;
|
||
PM12 = 0b11111111; // 32kHzクロックのピン設定はどっちでもよい
|
||
PM15 = 0b11111111;
|
||
|
||
#ifdef _MCU_BSR_
|
||
#ifdef _MODEL_CTR_
|
||
PM20 = 0b11111101;
|
||
#else
|
||
PM20 = 0b11111100;
|
||
#endif
|
||
#else
|
||
PM8 = 0b11111111;
|
||
#endif
|
||
|
||
// プルアップ /////////////////////////////////////////
|
||
PU0 = 0b00000000; // バッテリ認証後にそれぞれセット
|
||
PU1 = 0b00000000;
|
||
PU3 = 0b00000000; // 外部でプルアップしないと具合が悪い。CPUがプルアップする
|
||
PU4 = 0b00000000; // 外部でプルアップしてほしいtool0,1)
|
||
PU5 = 0b00000011;
|
||
PU7 = 0b00011001;
|
||
PU12 = 0b00000000;
|
||
PU14 = 0b00000000;
|
||
|
||
#ifdef _MCU_BSR_
|
||
#ifdef _MODEL_CTR_
|
||
#ifdef _SW_HOME_ENABLE_
|
||
PU20 = 0b00010001;
|
||
#else
|
||
PU20 = 0b00000001;
|
||
#endif
|
||
#else
|
||
PU20 = 0b00000000;
|
||
#endif
|
||
#endif
|
||
|
||
// ポート入力モード・レジスタ設定 /////////////////////
|
||
// [0:通常入力バッファ 1:TTL入力バッファ]
|
||
PIM3 = 0b00000000;
|
||
PIM7 = 0b00000000;
|
||
|
||
// ポート出力モード・レジスタ設定
|
||
// [0:通常出力モード 1:N-chオープン・ドレーン出力]
|
||
POM3 = 0b00000110;
|
||
POM7 = 0b00000000;
|
||
|
||
/*--- 割り込み設定 ---------*/
|
||
IF0 = 0x0000; /* 割り込み要求フラグクリア */
|
||
IF1 = 0x0000;
|
||
#ifdef _MCU_BSR_
|
||
IF2 = 0x0000;
|
||
#else
|
||
IF2L = 0x00;
|
||
#endif
|
||
|
||
MK0 = 0xFFFF; /* 割り込み禁止 */
|
||
MK1 = 0xFFFF;
|
||
|
||
#ifdef _MCU_BSR_
|
||
MK2 = 0xFFFF;
|
||
#else
|
||
MK2L = 0xFF;
|
||
#endif
|
||
|
||
PR00L = 0b11111111; /* 割り込み優先順位、全て低位(LV3) */
|
||
PR10L = 0b11111111;
|
||
PR00H = 0b11111111;
|
||
PR10H = 0b11111111;
|
||
PR01L = 0b11111111;
|
||
PR11L = 0b11111110;
|
||
PR01H = 0b11111111;
|
||
PR11H = 0b11111111;
|
||
PR02L = 0b11111111;
|
||
PR12L = 0b11111111;
|
||
|
||
/*--- 外部割込の有効エッジ設定 ---*/
|
||
#ifdef _MCU_BSR_
|
||
EGP0 = 0b00110001;
|
||
EGN0 = 0b01110001;
|
||
EGP2 = 0b00001010;
|
||
EGN2 = 0b00000000;
|
||
#else
|
||
EGP0 = 0b10110001;
|
||
EGN0 = 0b01110001;
|
||
#endif
|
||
/*--- キー割り込み設定 ---*/
|
||
KRM = 0b00000000; /* 全キー割り込み信号を検出しない */
|
||
|
||
/*--- タイマ・アレイ・ユニットの動作停止 ---*/
|
||
TAU0EN = 0; /* タイマ・アレイ・ユニットへのクロック供給停止 */
|
||
TT0 = 0x00ff; /* 全タイマ・チャネルの動作停止 */
|
||
|
||
/*--- RTCの動作停止 ---*/
|
||
// RTCEN = 0; /* RTCへのクロック供給停止 */
|
||
// RTCC0 = 0b00000000; /* カウンタ動作停止 */
|
||
// 別途初期化関数
|
||
|
||
#ifndef _MCU_BSR_
|
||
/*--- コンパレータ/プログラマブル・ゲイン・アップの動作停止 ---*/
|
||
OACMPEN = 0; /* クロック供給停止 */
|
||
OAM = 0x00; /* プログラマブル・ゲイン・アップの動作停止 */
|
||
C0CTL = 0x00; /* コンパレータ0動作停止 */
|
||
C1CTL = 0x00; /* コンパレータ1動作停止 */
|
||
#endif
|
||
|
||
/*--- クロック出力/ブザー出力停止 ---*/
|
||
CKS0 = 0b00000000;
|
||
CKS1 = 0b00000000;
|
||
|
||
/*--- ADCの動作停止 ---*/
|
||
ADCEN = 0; /* ADCへのクロック供給停止 */
|
||
ADM = 0b00000000; /* 変換動作停止 */
|
||
|
||
/*--- シリアル・アレイ・ユニットの動作停止 ---*/
|
||
SAU0EN = 0; /* シリアル・アレイ・ユニット0へのクロック供給停止 */
|
||
SCR00 = 0x0087; /* 各チャンネルの通信禁止 */
|
||
SCR01 = 0x0087;
|
||
SCR02 = 0x0087;
|
||
SCR03 = 0x0087;
|
||
|
||
#ifdef _MCU_BSR_
|
||
// IICの動作停止
|
||
IICA0EN = 0; /* IICA0(CTR)へのクロック供給停止 */
|
||
IICCTL00 = 0x00; /* IICA1動作停止 */
|
||
IICA1EN = 0; // IICA1(TWL)へのクロック供給停止
|
||
IICCTL01 = 0x00; // IICA1動作停止
|
||
|
||
#else
|
||
/*--- IICAの動作停止 ---*/
|
||
IICAEN = 0; /* IICAへのクロック供給停止 */
|
||
IICCTL0 = 0x00; /* IICA動作停止 */
|
||
#endif
|
||
|
||
/*--- DMAの動作停止 ---*/
|
||
DRC0 = 0b00000000; /* DMAチャネル0の動作禁止 */
|
||
DRC1 = 0b00000000; /* DMAチャネル1の動作禁止 */
|
||
}
|