ctr_mcu/trunk/loader.c
fujita_ryohei 4f86e7aa2d V0.3 final
V0.4でレジスタなどがらっと変えてしまうつもりで、#ifdef ではつらいため、
きれいにしてしまいます。

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_mcu@10 013db118-44a6-b54f-8bf7-843cb86687b1
2009-09-16 06:41:53 +00:00

316 lines
8.4 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"
// ========================================================
#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_HEAD 0x2100
#define MGC_FOOT 0x47F6
// ========================================================
void FSL_Open(void);
void FSL_Close(void);
void hdwinit(void);
void power_save();
extern void main_loop();
extern void chk_bootCluster();
// ========================================================
void main(){
u16 i = 0;
do{ // 電池接続時、16ms待ってみる
i+=1;
}while( i != 0 );
while(1){
// 電池投入 //
// hdwinit(); 自動実行
// 電池投入時のみ初期化 //
#if 0
// ファームの整合性チェック //
{
u8 i;
u8 comp = 0;
// ローダーと本体は同じバージョンか?
for( i = 0; i < sizeof( __TIME__ ); i++ ){ // sizeof( __TIME__ ) = 8 らし
comp += ( *(u8*)( MGC_HEAD + i ) == *(__far u8*)( MGC_LOAD + i ) )? 0: 1;
}
// 本体は壊れていないか?
comp += ( *(u8*)( MGC_HEAD ) == 0xFF ) ? 1: 0;
for( i = 0; i < sizeof( __TIME__ ); i++ ){
comp += ( *(u8*)( MGC_HEAD + i ) == *(u8*)( MGC_FOOT + i ) )? 0: 1;
}
if( comp != 0 ){
// ファームリストアを試みる
firm_restore();
// 帰ってこない。リセットをかける。
}
}
#endif
chk_bootCluster();
// 通常運転
main_loop();
}
}
/* ========================================================
省電力モードへ移行
======================================================== */
void power_save(){
if( !renge_task_interval_run_force ){
HALT();
}
}
/* ========================================================
キーリターン割り込み
======================================================== */
__interrupt void int_kr(){
if( system_status.pwr_state == OFF ){
// 電源onのカウント。特にすることはない
}
}
/* ========================================================
ext dc
======================================================== */
__interrupt void intp4(){
}
/* ========================================================
shell close
======================================================== */
__interrupt void intp5(){
}
// ========================================================
void hdwinit(void){ // スタートアップルーチンが勝手に呼びます
DI(); /* マスタ割り込み禁止 */
CMC = 0b00010110; /* X1発振せず(入力ポート)、XT1使用、推奨の推奨で超低電力発振 */
CSC = 0b10000000; /* X1発振なし、XT1発振あり、高速内蔵発振動作 */
// OSMC = 0x00; /* フラッシュ・メモリの高速動作用昇圧回路 */
CKC = 0b00001001; /* CPU/周辺クロック=fMAIN、fMAIN=fMX、fCLK=fMX */
/*--- 低電圧検出回路の設定 ---*/
/* リセット解除時のデフォルトは、オプション・バイトにて指定される */
LVIS = 0b00000000; /* VLVI = 4.22±0.1V */
LVIM = 0b00000000; /* LVI動作禁止 */
/* 電源電圧(VDD)<検出電圧(VLVI)時に割込発生 */
/* 電源電圧(VDD)≧検出電圧<VLVI)、または動作禁止時に低電圧検出 */
// ポート設定
P0 = 0b00000000;
P1 = 0b00000000;
P2 = 0b00000000;
P3 = 0b00000110; // 簡易I2Cは出力ラッチを1にする
P4 = 0b00000000;
P5 = 0b00000000;
P6 = 0b00000000;
P7 = 0b01000000;
P12 = 0b00000000;
P14 = 0b00000000;
#ifdef _MCU_KE3_
P8 = 0b00000000;
#else
P20 = 0b00000000;
#endif
P15 = 0b00000000;
// プルアップ
PU0 = 0b00000000; // バッテリ認証後にそれぞれセット
PU1 = 0b00000000;
PU3 = 0b00000000; // 外部でプルアップしないと具合が悪い。CPUがプルアップする
PU4 = 0b00000000; // 外部でプルアップしてほしいtool0,1)
PU5 = 0b00000011;
PU7 = 0b00011001;
PU12 = 0b00000000;
PU14 = 0b00000000;
#ifndef _MCU_KE3_
PU20 = 0b00000000;
#endif
#ifdef _MCU_KE3_
PM0 = 0b00000000; // 0で出力
#else
PM0 = 0b00000001; // BSRマイコンでは、reset1は監視のみになる。
#endif
PM1 = 0b00000000;
PM2 = 0b11101001;
PM3 = 0b00000001; // P31,32は簡易I2C
#ifdef _PMIC_CTR_
PM4 = 0b00000111;
#else
PM4 = 0b00001011;
#endif
PM5 = 0b00000011;
PM6 = 0b00000000; // I2CのラインがL出力になってしまうが、システムがOFFなのでかまわない
PM7 = 0b00011111;
PM12 = 0b00011111; // 32kHzクロックのピン設定はどっちでもよい
PM14 = 0b00000001; // debugger[1] とりあえず出力
PM15 = 0b00000111;
#ifdef _MCU_KE3_
PM8 = 0b11111111;
#else
PM20 = 0b00111100;
#endif
// ポート入力モード・レジスタ設定
// [0:通常入力バッファ 1:TTL入力バッファ]
PIM3 = 0b00000000;
PIM7 = 0b00000000;
// ポート出力モード・レジスタ設定
// [0:通常出力モード 1:N-chオープン・ドレーン出力]
POM3 = 0b00000110;
POM7 = 0b00000000;
/*--- 割り込み設定 ---------*/
IF0L = 0b00000000; /* 割り込み要求フラグクリア */
IF0H = 0b00000000;
IF1L = 0b00000000;
IF1H = 0b00000000;
IF2L = 0b00000000;
MK0L = 0b11111111; /* 割り込み禁止 */
MK0H = 0b11111111;
MK1L = 0b11111111;
MK1H = 0b11111111;
MK2L = 0b11111111;
PR00L = 0b11111111; /* 割り込み優先順位、全て低位(LV3) */
PR10L = 0b11111111;
PR00H = 0b11111111;
PR10H = 0b11111111;
PR01L = 0b11111111;
PR11L = 0b11111110;
PR01H = 0b11111111;
PR11H = 0b11111111;
PR02L = 0b11111111;
PR12L = 0b11111111;
/*--- 外部割込の有効エッジ設定 ---*/
EGP0 = 0b00000000; /* 立上りエッジの検出禁止 */
EGN0 = 0b00000000; /* 立下りエッジの検出禁止 */
/*--- キー割り込み設定 ---*/
KRM = 0b00000000; /* 全キー割り込み信号を検出しない */
/*--- タイマ・アレイ・ユニットの動作停止 ---*/
TAU0EN = 0; /* タイマ・アレイ・ユニットへのクロック供給停止 */
TT0 = 0x00ff; /* 全タイマ・チャネルの動作停止 */
/*--- RTCの動作停止 ---*/
// RTCEN = 0; /* RTCへのクロック供給停止 */
// RTCC0 = 0b00000000; /* カウンタ動作停止 */
// 別途初期化関数
#ifdef _MCU_KE3_
/*--- コンパレータ/プログラマブル・ゲイン・アップの動作停止 ---*/
OACMPEN = 0; /* クロック供給停止 */
OAM = 0x00; /* プログラマブル・ゲイン・アップの動作停止 */
C0CTL = 0x00; /* コンパレータ0動作停止 */
C1CTL = 0x00; /* コンパレータ1動作停止 */
#endif
/*--- クロック出力/ブザー出力停止 ---*/
CKS0 = 0b0000000;
CKS1 = 0b0000000;
/*--- ADCの動作停止 ---*/
ADCEN = 0; /* ADCへのクロック供給停止 */
ADM = 0b00000000; /* 変換動作停止 */
/*--- シリアル・アレイ・ユニットの動作停止 ---*/
SAU0EN = 0; /* シリアル・アレイ・ユニット0へのクロック供給停止 */
SCR00 = 0x0087; /* 各チャンネルの通信禁止 */
SCR01 = 0x0087;
SCR02 = 0x0087;
SCR03 = 0x0087;
#ifdef _MCU_KE3_
/*--- IICAの動作停止 ---*/
IICAEN = 0; /* IICAへのクロック供給停止 */
IICCTL0 = 0x00; /* IICA動作停止 */
#else
// IICの動作停止
IICA0EN = 0; /* IICA0(CTR)へのクロック供給停止 */
IICCTL00 = 0x00; /* IICA1動作停止 */
IICA1EN = 0; // IICA1(TWL)へのクロック供給停止
IICCTL01 = 0x00; // IICA1動作停止
#endif
/*--- DMAの動作停止 ---*/
DRC0 = 0b00000000; /* DMAチャネル0の動作禁止 */
DRC1 = 0b00000000; /* DMAチャネル1の動作禁止 */
}