お知らせLEDを修正する前にバックアップを兼ね

修正:CTRCでヘッドホンから音が出ない
追加:白箱からの強制OFF
修正・追加:互換アプリのプレイ時間記録のためのフリーレジスタ
   お知らせLEDの仕様追加の件もあるので自己書き換え部分も含め
    RAM関係修正
修正:自己アップデートとWDTリセットの区別が付くようになった
修正:電池挿入直後が、普通に電源OFF時よりも消費電力が大きい
    ポートの初期値設定忘れ(TWL PMIC向けに書いていたときの名残)
無駄にstaticで確保してあるのを適切に
エラーコードが不適切だった物を修正
レジスタの初期値間違い
フリーレジスタを増やして歩数計を減らしたのでいろいろ修正
CTRCででポップ解除を忘れていた(イヤホンから音でない)


git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_mcu@126 013db118-44a6-b54f-8bf7-843cb86687b1
This commit is contained in:
N2232 2010-04-16 11:07:54 +00:00
parent ca9bdc8a67
commit a159bca802
22 changed files with 321 additions and 403 deletions

View File

@ -65,17 +65,10 @@ task_status tsk_soft_int( );
task_status_immed tsk_cbk_accero( )
{ // 疑似isrから登録されます
/*
if(( system_status.pwr_state == OFF ) || ( system_status.pwr_state == BT_CHARGE ) )
{
return ( ERR_SUCCESS );
}
else
{
*/
// 加速度センサデータレジスタへの反映
if( iic_mcu_read( IIC_SLA_ACCEL, ( ACC_REG_X | 0x80 ), 6, &vreg_ctr[VREG_C_ACC_XL] )
!= ERR_SUCCESS )
// 加速度センサデータレジスタへの反映
if( iic_mcu_read( IIC_SLA_ACCEL, ( ACC_REG_X | 0x80 ), 6, &vreg_ctr[VREG_C_ACC_XL] )
!= ERR_SUCCESS )
{
// 加速度センサが異常になったので止める
vreg_ctr[VREG_C_ACC_CONFIG] &= ~( VREG_BITMASK_ACC_CONF_HOSU | VREG_BITMASK_ACC_CONF_ACQ );
@ -84,7 +77,7 @@ task_status_immed tsk_cbk_accero( )
return ( ERR_SUCCESS ); // タスクの削除は必要
}
else
{
{
// 正常時パス //
// 加速度更新&割り込み
if( (( vreg_ctr[VREG_C_ACC_CONFIG] & VREG_BITMASK_ACC_CONF_ACQ ) != 0 ) &&
@ -104,9 +97,9 @@ task_status_immed tsk_cbk_accero( )
( ( vreg_ctr[VREG_C_ACC_CONFIG] & VREG_BITMASK_ACC_CONF_HOSU ) != 0 )
)
{
DBG_LED_WIFI_2_on;
pedometer(); // 歩数計
DBG_LED_WIFI_2_off;
DBG_LED_WIFI_2_on;
pedometer(); // 歩数計
DBG_LED_WIFI_2_off;
}
}
return ( ERR_SUCCESS );

View File

@ -40,23 +40,9 @@ extern void nop8();
8tics毎に呼ばれADCを停止します
 
======================================================== */
/*
// max -4db
static const u8 slider_to_codec[64] =
{
127, 125, 124, 123, 121, 120, 119, 117,
116, 115, 113, 112, 111, 109, 108, 107,
105, 104, 103, 101, 100, 99, 98, 96,
95, 94, 92, 91, 90, 88, 87, 86,
84, 83, 82, 80, 79, 78, 76, 75,
74, 72, 71, 70, 69, 67, 66, 65,
63, 62, 61, 59, 58, 57, 55, 54,
53, 51, 50, 49, 47, 46, 45, 44
};
*/
// max -10db
static const u8 slider_to_codec[64] =
// max -15db
const u8 slider_to_codec[64] =
{
127, 126, 125, 124, 123, 122, 121, 120,
119, 118, 117, 116, 115, 114, 113, 112,
@ -325,14 +311,9 @@ u8 get_adc( u8 ch )
ADPC = 0x06; // ADCポートのセレクト
ADS = ch;
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
nop8();
ADCS = 1; // AD開始。 /// ここまで↑ に、1us以上開ける
while( ADIF == 0 ){;}

View File

@ -47,7 +47,6 @@ typedef struct
system_status_;
extern system_status_ system_status;

View File

@ -6,7 +6,7 @@
#define MCU_VER_MAJOR 0x00
#define MCU_VER_MINOR 0x10
#define MCU_VER_MINOR 0x12
#define _OVERCLOCK_

View File

@ -81,39 +81,52 @@ void nop8()
}
static u8 iic_mcu_is_ready()
static err iic_mcu_is_ready()
{
if( iic_mcu_initialized == 0 )
{
#ifdef _debug_
iic_mcu_start( );
#else
return( ERR_ERR );
while( 1 )
{
NOP();
}
#endif
}
while( iic_mcu_busy )
{
NOP( );
}
iic_mcu_busy = 1;
return( ERR_SUCCESS );
}
/* ========================================================
1
======================================================== */
u8 iic_mcu_read_a_byte( u8 SLA, u8 adrs )
{
u8 dat;
iic_mcu_is_ready();
#if 1
// ラッパー
if( iic_mcu_read( SLA, adrs, 1, &dat ) == ERR_SUCCESS )
{
iic_mcu_bus_status = ERR_OK;
}
else
{
iic_mcu_bus_status = ERR_NOSLAVE;
}
return ( dat );
iic_mcu_bus_status = ERR_OK;
#else
iic_mcu_is_ready();
// スタートコンディションとスレーブの呼び出し、レジスタアドレスの送信
if( iic_mcu_call_slave( SLA ) != 0 )
@ -149,6 +162,7 @@ u8 iic_mcu_read_a_byte( u8 SLA, u8 adrs )
IICIF10 = 0; // 後を濁さないこと
iic_mcu_busy = 0;
return ( dat );
#endif
}
@ -167,7 +181,11 @@ err iic_mcu_read( u8 slave, u8 adrs, u8 len, u8 * dest )
{
#if 1
iic_mcu_is_ready();
if( iic_mcu_is_ready() != ERR_SUCCESS )
{
return( ERR_ERR );
}
;
#else
// 使用中なら帰る
if( iic_mcu_initialized == 0 ){
@ -234,12 +252,19 @@ err iic_mcu_read( u8 slave, u8 adrs, u8 len, u8 * dest )
err iic_mcu_write_a_byte( u8 SLA, u8 adrs, u8 dat )
{
#if 0
#if 1
// ラッパー
static u8 temp; // 書きっぱなしで終了を見ずに関数を抜ける可能性が高いのでstatic
// これをしないと、立て続けに書いたときに前のデータを破壊してしまう
while( iic_mcu_busy )
{
NOP( );
}
temp = dat;
iic_mcu_wo_dma = 1;
return ( iic_mcu_write( SLA, adrs, 1, &temp ) );
}
#else
// 文字の時はDMAとか起動しないでさっさと終わらせる
iic_mcu_is_ready();
@ -279,8 +304,10 @@ err iic_mcu_write_a_byte( u8 SLA, u8 adrs, u8 dat )
err iic_mcu_write( u8 slave, u8 adrs, u8 len, void * src )
{
iic_mcu_is_ready();
if( iic_mcu_is_ready() != ERR_SUCCESS )
{
return( ERR_ERR );
}
#if 0
// 使用中なら帰る
if( iic_mcu_initialized == 0 ){
@ -331,9 +358,9 @@ err iic_mcu_write( u8 slave, u8 adrs, u8 len, void * src )
// DMAを使用しない //
// レジスタアドレスの送信
IICMK10 = 0;
SIO10 = adrs;
IICMK10 = 0;
iic_send_wo_dma_len = len;
p_iic_send_wo_dma_dat = src;
// 残りは割り込みルーチン内で

View File

@ -31,9 +31,25 @@ static void led_pow_hotaru( );
// ========================================================
static const char MSG_MAIL[] = { 0b11110110, 0b11011010, 0b01101110, 0b10010100 };
#define MSG_SPD 60
// ↑255/3以下であること
// お知らせLEDのパターンを流し込んでもらう
typedef struct{
unsigned char red:3;
unsigned char grn:3;
unsigned char blu:2;
}st_info_LED_ptn;
st_info_LED_ptn info_LED_ptn[32];
// ========================================================
// ========================================================
void LED_init( )
@ -412,7 +428,6 @@ void tsk_led_notify( )
switch ( vreg_ctr[VREG_C_LED_NOTIFY] )
{
case ( NOTIFY_LED_OFF ):
default:
LED_duty_NOTIFY = 0;
state_notify_led = 0;
@ -424,87 +439,6 @@ void tsk_led_notify( )
state_notify_led = 0;
flg_char_space = 0;
break;
case ( NOTIFY_LED_PTN0 ):
// ゆっくりバースト
switch ( state_notify_led )
{
case ( 1 ):
case ( 3 ):
case ( 5 ):
LED_duty_NOTIFY = vreg_ctr[VREG_C_LED_BRIGHT];
break;
default:
LED_duty_NOTIFY = 0;
}
state_notify_led++;
if( state_notify_led == 16 )
{
state_notify_led = 0;
}
task_interval = 50;
return;
case ( NOTIFY_LED_PTN1 ):
// データテーブルに従って点滅
{
u8 dat;
task_interval = MSG_SPD; // 共通のため。場合によって上書き
if( flg_char_space != 0 )
{
LED_duty_NOTIFY = 0;
flg_char_space = 0;
return;
}
// データバッファの見る位置の更新
dat = ( MSG_MAIL[state_notify_led / 4] << ( ( state_notify_led % 4 ) * 2 ) ) & 0xC0;
if( dat == 0 )
{
state_notify_led = 0;
}
else
{
state_notify_led += 1;
}
flg_char_space = 1;
if(( dat & 0b10000000 ) != 0 )
{
// 点灯はさせる
LED_duty_NOTIFY = vreg_ctr[VREG_C_LED_BRIGHT];
if(( dat & 0b01000000 ) == 0 )
{
// 短
// nothing to do
}
else
{
// 長
task_interval = ( MSG_SPD * 3 );
}
// 次は単語間休み、とかの判定をさせたかったが
/// 1バイトに2ビットずつデータが並んでおり、次のバイトに
/// またがるようなときが面倒なのでやめる
return;
}
else
{
if(( dat & 0b01000000 ) == 0 )
{
// 一文終了
task_interval = ( MSG_SPD * 3 );
}
else
{
// 単語間
// nothing to do
}
return;
}
}
}
}

View File

@ -85,6 +85,6 @@ enum
void LED_init( );
void LED_stop( );
extern void tsk_led_cam();
#endif

View File

@ -243,16 +243,16 @@ void hdwinit2( )
PM5 = 0b11110011;
PM6 = 0b11111100; // I2CのラインがL出力になってしまうが、システムがOFFなのでかまわない
#ifdef _PMIC_CTR_
PM7 = 0b01011111;
#else
PM7 = 0b00011111;
#endif
PM12 = 0b11111111; // 32kHzクロックのピン設定はどっちでもよい
PM15 = 0b11111111;
#ifdef _MCU_BSR_
#ifdef _MODEL_CTR_
PM20 = 0b11111101;
#else
PM20 = 0b11111100;
#endif
#else
PM8 = 0b11111111;
#endif

View File

@ -7,14 +7,13 @@
// V0.5 (ニセ0.1改)
#pragma section @@CNSTL MGC_LOAD AT 0x0FF6
__far static const unsigned char MGC_LOAD[] = __TIME__;
__far const unsigned char MGC_LOAD[] = __TIME__;
#pragma section @@CNST MGC_MIMI AT 0x2100
static const unsigned char MGC_HEAD[] = __TIME__;
const unsigned char MGC_HEAD[] = __TIME__;
#pragma section @@CNST MGC_TAIL AT 0x4FF6
static const unsigned char MGC_TAIL[] = __TIME__;
//static const unsigned char MGC_TAIL[] = "fuga_";
const unsigned char MGC_TAIL[] = __TIME__;
// 0Dまでこれを使用

View File

@ -15,16 +15,18 @@
#include "led.h"
#include "adc.h"
#include "pool.h"
// ========================================================
static void read_dipsw( );
// ========================================================
system_status_ system_status;
bit update;
uni_pool pool;
u16 pool[256]; // アップデート時のワークエリア 兼 歩数計データ
/* ========================================================
loader.c
======================================================== */

View File

@ -13,13 +13,17 @@
#include "accero.h"
#include "pedometer.h"
#include "pedo_lpf_coeff.h"
#include "pool.h"
// ========================================================
static void hosu_increment();
// ========================================================
u16 get_long_hour();
extern u16 pool[];
extern uni_pool pool;
@ -243,13 +247,13 @@ static void hosu_increment()
last_hour_fny = now_hour;
// 実際にインクリメント
if( pool[ p_record ] == HOSU_NODATA )
if( pool.vreg_c_ext.pedo_log[ p_record ] == HOSU_NODATA )
{
pool[ p_record ] = 1;
pool.vreg_c_ext.pedo_log[ p_record ] = 1;
}
else if( pool[ p_record ] != HOSU_MAX )
else if( pool.vreg_c_ext.pedo_log[ p_record ] != HOSU_MAX )
{
pool[ p_record ] += 1;
pool.vreg_c_ext.pedo_log[ p_record ] += 1;
}
}
}
@ -262,16 +266,16 @@ static void hosu_increment()
======================================================== */
void fill_hosu_hist_hours( u16 hours )
{
if( hours > 255 )
if( hours > PEDOMETER_LOG_SIZE )
{
hours = 0;
hours = PEDOMETER_LOG_SIZE;
}
// 空白の数時間の設定
do
{
p_record += 1;
pool[ p_record ] = 0;
pool.vreg_c_ext.pedo_log[ p_record ] = 0;
hours -= 1;
}
while( hours != 0 );
@ -285,12 +289,11 @@ void fill_hosu_hist_hours( u16 hours )
======================================================== */
void clear_hosu_hist()
{
u8 hours = 0;
// 空白の数時間の設定
u8 hours = PEDOMETER_LOG_SIZE;
do
{
pool[ hours ] = 0xFFFF;
hours -= 1;
pool.vreg_c_ext.pedo_log[ hours ] = 0xFFFF;
}
while( hours != 0 );
vreg_ctr[ VREG_C_ACC_HOSU_L ] = 0;
@ -349,7 +352,7 @@ u8 hosu_read( )
return( 0xAA ); // reserved. dummy
default:
temp = pool[ p_record_buffer ];
temp = pool.vreg_c_ext.pedo_log[ p_record_buffer ];
if( record_read_msb_lsb == 0 )
{
dat = (u8)( temp & 0x00FF );
@ -357,7 +360,14 @@ u8 hosu_read( )
else
{
dat = (u8)(( temp >> 8 ) & 0x00FF );
p_record_buffer -= 1;
if( p_record_buffer == 0 )
{
p_record_buffer = PEDOMETER_LOG_SIZE-1;
}
else
{
p_record_buffer -= 1;
}
}
record_read_msb_lsb += 1;
return( dat );
@ -371,7 +381,7 @@ u8 hosu_read( )
u16 long_hour
======================================================== */
static const u16 DAYS_FROM_HNY[] = {
const u16 DAYS_FROM_HNY[] = {
0,
0, 31, 31+28, 59+31, 90+30,
120+31, 151+30, 181+31, 212+31, 243+30,

View File

@ -2,98 +2,21 @@
#define _pedo_
// =========================================================
void hosu_read_end( );
u8 hosu_read( );
void fill_hosu_hist_hours( u16 );
void clear_hosu_hist();
// =========================================================
#define TAP 64
#define FIL_COEFF_QUANT 10
static const s8 lpf_coeff[]={
/*
Window Function Algorithm LPF
Sampling Frequency = 100.0
cutoff1 = 6.0000000
Tap Count =64
Kaiser Constant = 7.000000
Quantized by 11 [bits]
*/
/* 0,// [0]
0,
0,
0,
0,
0,
0,
0,
*/
1,// 8
2,
2,
3,
3,
2,
0,
-2,
-5,// 16
-9,
-13,
-16,
-16,
-13,
-6,
4,
18,// 24
37,
56,
77,
95,
110,
119,
122,
119,// 32
110,
95,
77,
56,
37,
18,
4,
-6,// 40
-13,
-16,
-16,
-13,
-9,
-5,
-2,
0,// 48
2,
3,
3,
2,
2,
1,
/*
0,
0,// 56
0,
0,
0,
0,
0,
0,
0
*/
};
// */
// =========================================================
void pedometer();
static void hosu_increment();
// =========================================================
#define PEDOMETER_LOG_SIZE ( 24 * 7 )
// =========================================================
#endif

View File

@ -16,7 +16,8 @@
#include <fsl.h>
#include "fsl_user.h"
extern u16 pool[];
// ========================================================
@ -71,7 +72,7 @@ err PM_LCD_on( )
vreg_ctr[VREG_C_STATUS] |= REG_BIT_LCD_POW;
set_irq( VREG_C_IRQ3, REG_BIT_LCD_ON );
SND_DEPOP_DEACT; // 1でミュート
SND_DEPOP_SND_ENABLE;
}
#ifdef _PMIC_TWL_
@ -84,7 +85,7 @@ err PM_LCD_on( )
// BSR //
void PM_LCD_off()
{
SND_DEPOP_ACT;
SND_DEPOP_SND_MUTE;
// BLついてたら消す
#ifdef _PMIC_TWL_
@ -230,14 +231,14 @@ err PM_LCD_on( )
{
vreg_ctr[VREG_C_STATUS] |= REG_BIT_LCD_POW;
set_irq( VREG_C_IRQ3, REG_BIT_LCD_ON );
SND_DEPOP_DEACT; // 1でミュート
SND_DEPOP_SND_ENABLE; // 1でミュート
return ( ERR_SUCCESS );
}
void PM_LCD_off( )
{
SND_DEPOP_ACT;
SND_DEPOP_SND_MUTE;
vreg_ctr[VREG_C_STATUS] &= ~REG_BIT_LCD_POW;
set_irq( VREG_C_IRQ3, REG_BIT_LCD_OFF );
}
@ -559,7 +560,7 @@ task_status_immed ntr_pmic_comm( )
// CODECバグ回避
// リセット単品でなかったら無視
// codec 修正済↓
// if( ( reg1_old ^ reg_shadow ) == REG_BIT_TWL_REQ_RST_REQ )
if( ( reg1_old ^ reg_shadow ) == REG_BIT_TWL_REQ_RST_REQ )
{
set_irq( VREG_C_IRQ2, REG_BIT_TWL_RESET_REQ );
}
@ -634,7 +635,7 @@ task_status_immed tski_PM_BL_set()
void tsk_batt( )
{
static u8 task_interval = 0;
static u8 charge_hys = 0; // ヒステリシスで上限下限を拡張するとき1
static u8 temp_area = 0; // 温度で充電停止する時にヒステリシスを付けるため
static bit pm_extdc_old;
if( task_interval-- != 0 )
@ -666,25 +667,26 @@ void tsk_batt( )
// 充電 ///////////////////////////
// 温度付きヒステリシス
if( vreg_ctr[VREG_C_BT_TEMP] < 0x36 )
if(( 86 < vreg_ctr[VREG_C_BT_TEMP] )
&& ( vreg_ctr[VREG_C_BT_TEMP] < 185 ))
{
charge_hys = 1;
temp_area = 1; // 充電許可
}
else if(( vreg_ctr[VREG_C_BT_TEMP] < 70 )
|| ( 189 < vreg_ctr[VREG_C_BT_TEMP] ))
{
temp_area = 0; // 充電禁止
}
else
{
// temp_area そのまま
}
if( ( 1 < vreg_ctr[VREG_C_BT_TEMP] )
&& ( vreg_ctr[VREG_C_BT_TEMP] < 0x2C ) )
{
charge_hys = 0;
}
if( ( ( charge_hys == 1 )
&& ( 1 < vreg_ctr[VREG_C_BT_TEMP] )
&& ( vreg_ctr[VREG_C_BT_TEMP] < 0x2C ) )
||
( ( charge_hys == 0 )
&& ( vreg_ctr[VREG_C_BT_TEMP] < 0x36 ) ) )
if(( temp_area == 1 )
&& ( battery_manufacturer <= BT_VENDER_6 ))
{
#ifndef _MODEL_WM0_
// CHG_ENABLEピンは /WL_RST に配線されているので
BT_CHG_ENABLE(); // 温度範囲OKで充電再開
}
else
@ -692,16 +694,12 @@ void tsk_batt( )
BT_CHG_DISABLE(); // 温度危険! 充電停止
#endif
}
#ifdef _MODEL_WM0_
// CHG_ENABLEピンは /WL_RST に配線されているので
#endif
// 充電 //
// →割り込み。miscの中でよろしくやってくれている。
set_bit( !BT_CHG_n, vreg_ctr[VREG_C_STATUS], REG_BIT_BATT_CHARGE );
LED_CHARGE = !BT_CHG_n ? 1 : 0;
// 電池残量 //
if( system_status.pwr_state == ON )
{

View File

@ -29,7 +29,8 @@ typedef unsigned char err;
// ************************************
typedef enum{
ERR_SUCCESS = 0,
ERR_ERR
ERR_ERR,
ERR_SYSTEM_OFF
}ERR;

View File

@ -1,10 +1,11 @@
/*スクリプトによる自動生成です。手動で書き換えない方がよいです*/
#include "renge_defs.h"
#ifndef __renge_task__
#define __renge_task__
#include "renge_defs.h"
enum {
TSK_SW, TSK_ADC, TSK_BATT, TSK_LED_POW, TSK_LED_WIFI, TSK_LED_NOTIFY, TSK_LED_CAM, TSK_MISC_STAT, TSK_DEBUG, TSK_DEBUG2, TSK_SYS, TSK_LAST
};
@ -21,7 +22,8 @@ extern void tsk_debug();
extern void tsk_debug2();
extern void tsk_sys();
static const task_status ( *tasks[ TSK_LAST ] )() = {
const void ( *tasks[ TSK_LAST ] )() = {
tsk_sw,
tsk_adc,
tsk_batt,
@ -35,5 +37,6 @@ static const task_status ( *tasks[ TSK_LAST ] )() = {
tsk_sys,
};
#endif

View File

@ -15,6 +15,7 @@
#include "fsl_user.h"
#include "i2c_ctr.h"
#include "pool.h"
// ========================================================
@ -24,6 +25,7 @@ const u8 fsl_low_voltage_u08 = 1;
// 自己フラッシュパラメータ
#define SAM_BLOCK_SIZE 1024
// ↓256バイト以上はまとめてかけません。
#define SELF_UPDATE_BUFF_SIZE 256
#define SELF_UPDATE_SPLIT_WRITE_NUM ( SAM_BLOCK_SIZE / SELF_UPDATE_BUFF_SIZE )
#define SAM_WORD_SIZE 4
@ -36,8 +38,6 @@ const u8 fsl_low_voltage_u08 = 1;
#ifdef _MCU_BSR_
#define ACKD ACKD1
#define ACKE ACKE1
#define COI COI1
@ -72,12 +72,12 @@ static void FSL_Close( void );
void firm_restore( );
static err my_FSL_Init();
static err firm_duplicate( __far u8 * p_rom, u8 block_dest );
static err firm_duplicate( u8 block_src, u8 block_dest );
// ========================================================
extern u16 pool[];
extern uni_pool pool;
// 0.D以降 新アップデータ向け
@ -102,11 +102,12 @@ void firm_update( )
my_FSL_Init();
/* ファームのバックアップ
( FIRM_SIZE)
0x2000 - 0x4FFF
0x5000 - 0x7FFF ( 20 - 31)
*/
firm_duplicate( ( __far u8 * ) 0x2000,
( 0x5000 / 0x0400 ) );
firm_duplicate( FIRM_TOP,
UPDATE_BLOCK_LAST +1 );
// 全ブロック削除 /////////////////////////////////////
// 電源断を判定するため、最初に全クラスタ消去する
@ -134,36 +135,37 @@ void firm_update( )
&& ( !SPD ) );
split_write_count += 1 )
{
u8* p_buffer = pool;
u8 buffer_fill = 0;
u8* p_buffer = &pool.self_update_work[0];
u16 buff_written_size = 0;
WDT_Restart( );
// I2Cから書き込みデータをバッファにためる
do
{
while( !IICAIF && !SPD ){;}
while( !IICAIF && !SPD )
{
WDT_Restart( );
}
IICAIF = 0;
*p_buffer = IICA;
WREL = 1;
p_buffer += 1;
buffer_fill += 1;
buff_written_size += 1;
}
while( ( buffer_fill != ( u8 ) SELF_UPDATE_BUFF_SIZE ) && !SPD );
while( ( buff_written_size != SELF_UPDATE_BUFF_SIZE )
&& !SPD );
// 書き込み
// 最後だと、ゴミをパディングするが別にかまわない
if( FSL_Write( ( fsl_u32 ) ( target_block * SAM_BLOCK_SIZE
+
split_write_count *
SELF_UPDATE_BUFF_SIZE ),
( fsl_u08 ) ( SELF_UPDATE_BUFF_SIZE / SAM_WORD_SIZE ) )
+ split_write_count * SELF_UPDATE_BUFF_SIZE ),
( fsl_u08 ) ( SELF_UPDATE_BUFF_SIZE / SAM_WORD_SIZE ) )
!= FSL_OK )
{
// 書き込み後のチェックエラー
// リストア
firm_duplicate( ( __far u8 * ) 0x5000,
firm_duplicate( UPDATE_BLOCK_LAST +1,
FIRM_TOP );
FSL_ForceReset();
// 戻ってこない //
@ -173,7 +175,11 @@ void firm_update( )
// 1ブロック書き込み完了。内部ベリファイを行う
if( FSL_IVerify( target_block ) != FSL_OK ){
// todo 再度消去→書き込み ベリファイを繰り返すだけじゃダメでした...
NOP();
// リストア
firm_duplicate( UPDATE_BLOCK_LAST +1,
FIRM_TOP );
FSL_ForceReset();
// 戻ってこない //
}
if( SPD )
@ -205,7 +211,7 @@ void firm_update( )
{
// データ(マジックナンバーしか見てない)エラー
// リストア
firm_duplicate( ( __far u8 * ) 0x5000,
firm_duplicate( UPDATE_BLOCK_LAST,
FIRM_TOP );
FSL_ForceReset(); // リセット
// 戻ってこない //
@ -230,7 +236,7 @@ void firm_restore( )
0x4800 - 0x7FFF ( 18 - 27)
0x2000 - 0x47FF ( 8 - 17)
*/
firm_duplicate( ( __far u8 * ) 0x5000,
firm_duplicate( UPDATE_BLOCK_LAST +1,
FIRM_TOP );
// todo
//  リストア失敗したら、LEDちかちかとかさせて、サービス送りにしてもらう
@ -304,11 +310,14 @@ static void FSL_Close( void )
my_FSL_Initをあらかじめ実行する必要があります
======================================================== */
static err firm_duplicate( __far u8 * p_rom,
u8 block_dest )
//static err firm_duplicate( __far u8 * p_rom,
// u8 block_dest )
static err firm_duplicate( u8 block_src,
u8 block_dest )
{
u8 target_block;
u8 split_write_count; // ブロックへちまちま書き込むカウンタ
__far u8* p_src = ( __far u8* )( block_src * 0x400 );
// 書き込み先ブロックの数だけ繰り返す
for( target_block = block_dest;
@ -327,29 +336,28 @@ static err firm_duplicate( __far u8 * p_rom,
split_write_count < SELF_UPDATE_SPLIT_WRITE_NUM;
split_write_count += 1 )
{
u8 buffer_fill;
u16 buff_written_size;
u8* p_buff;
// 書き込みデータをバッファにためる
buffer_fill = 0;
p_buff = pool;
buff_written_size = 0;
p_buff = &pool.self_update_work[0];
do
{
*p_buff = *p_rom;
p_rom += 1;
*p_buff = *p_src;
p_src += 1;
p_buff += 1;
buffer_fill +=1;
buff_written_size +=1;
}
while( buffer_fill != ( u8 ) SELF_UPDATE_BUFF_SIZE );
while( buff_written_size != SELF_UPDATE_BUFF_SIZE );
// 書き込み
if( FSL_Write( ( fsl_u32 ) ( target_block * SAM_BLOCK_SIZE
+
split_write_count *
SELF_UPDATE_BUFF_SIZE ),
( fsl_u08 ) ( SELF_UPDATE_BUFF_SIZE / SAM_WORD_SIZE ) )
+ split_write_count * SELF_UPDATE_BUFF_SIZE ),
( fsl_u08 ) ( SELF_UPDATE_BUFF_SIZE / SAM_WORD_SIZE ) )
!= FSL_OK )
{
// todo リカバリ? //
FSL_Close( );
return ( ERR_ERR );
}
@ -377,7 +385,7 @@ static err my_FSL_Init()
DI( );
FSL_Open( ); // 割り込み禁止など
FSL_Init( pool ); // ライブラリ初期化。割り込み中断考慮せず
FSL_Init( &pool.self_update_work[0] ); // ライブラリ初期化。割り込み中断考慮せず
FSL_ModeCheck( ); // ライトプロテクトチェック。失敗することを考慮せず
return( ERR_SUCCESS );
@ -386,12 +394,11 @@ static err my_FSL_Init()
task_status_immed tski_mcu_reset()
{
WDT_Restart( );
// 普通に再起動
my_FSL_Init();
FSL_SwapBootCluster();
// FSL_ForceReset(); // リセット
FSL_ForceReset(); // リセット
FSL_Close( );
// 保険? //

View File

@ -90,7 +90,7 @@ void tsk_sys( )
system_status.pwr_state = OFF_TRIG;
return;
}
// 残量チェック
BT_get_left(); // 先に、BT_init()が実行されている必要があります。(大丈夫)
if( vreg_ctr[VREG_C_BT_REMAIN] < 5 )
@ -265,6 +265,9 @@ void tsk_sys( )
}
PM_sys_pow_off( );
while( iic_mcu_busy )
{;
}
KRM = ( KR_SW_POW ); // Mask ではなく、Modeなのだそうだ。紛らわしい
// intp20系は後ほど
@ -354,21 +357,59 @@ void tsk_sys( )
**********************************************************/
static void chk_emergencyExit(){
#ifndef _PARRADIUM_
if( !RESET1_n )
static u8 shirobako_power_control;
if( shirobako_power_control == 0 ) // PM_chk_LDSW() はI2C_mを使用し、高コスト
{
if( PM_chk_LDSW( ) == 0 )
if( !RESET1_n )
{
// PMICが異常終了判断をした
// リセットが下がってる
if( PM_chk_LDSW( ) == 0 )
{
// PMICが異常終了判断をした
system_status.pwr_state = OFF_TRIG;
renge_task_interval_run_force = 1;
}
else
{
// 白箱の仕業
shirobako_power_control = 1;
}
}
}
else
{
if( shirobako_power_control == 240 )
// デバッガが何かした。reset1を解除するまでは無視
{
if( RESET1_n )
{
shirobako_power_control = 0;
}
}else if( shirobako_power_control == 200 )
// デバッガが何かしたいらしい
{
// 白箱は電源を切りたいらしい
system_status.pwr_state = OFF_TRIG;
renge_task_interval_run_force = 1;
shirobako_power_control = 240;
}
else
{
// デバッガなりがリセットをかけた
iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_BL, 0 );
vreg_ctr[VREG_C_STATUS] = ( vreg_ctr[VREG_C_STATUS] & 0b10011111 );
vreg_ctr[VREG_C_COMMAND0] |= REG_BIT_RESET1_REQ;
renge_task_immed_add( do_command0 );
if( !RESET1_n )
{
shirobako_power_control += 1;
}
else
{
// リセットをかけたらしい
iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_BL, 0 );
vreg_ctr[VREG_C_STATUS] = ( vreg_ctr[VREG_C_STATUS] & 0b10011111 );
vreg_ctr[VREG_C_COMMAND0] |= REG_BIT_RESET1_REQ;
renge_task_immed_add( do_command0 );
shirobako_power_control = 240;
}
}
}
#endif

View File

@ -118,11 +118,11 @@
// INTP6
#ifndef _MODEL_CTR_
#define SND_DEPOP_ACT P7.6 = 1
#define SND_DEPOP_DEACT P7.6 = 0
#define SND_DEPOP_SND_MUTE P7.7 = 1
#define SND_DEPOP_SND_ENABLE P7.7 = 0
#else
#define SND_DEPOP_ACT ;
#define SND_DEPOP_DEACT ;
#define SND_DEPOP_SND_MUTE ;
#define SND_DEPOP_SND_ENABLE ;
#endif
// PM
@ -194,8 +194,10 @@
#endif
#ifdef _MODEL_CTR_
#define I2C_PU_on() { PM14 |= 0x03; P5 |= 0x09; P14 |= 0x03; PM14 &= ~0x03; }
#define I2C_PU_off() { PM14 |= 0x03; P5 &= 0x09; }
// P5.0 に加え、P5.5, P140 P141
// P140が出力専用なので...
#define I2C_PU_on() { PM5 |= 0x09; P14 |= 0x03; P5 |= 0x09; PM5 &= ~0x09; }
#define I2C_PU_off() { PM5 |= 0x09; P14 &= ~0x03; }
#endif

View File

@ -19,12 +19,8 @@ extern u8 mcu_info_read(); // task_misc.c
// ********************************************************
u8 vreg_ctr[VREG_C_ENDMARK_];
bit irq_readed; // AAA型のため。
extern bit update;
extern u16 pool[];
// ********************************************************
extern task_status_immed tski_firm_update();

View File

@ -5,10 +5,11 @@ TWL
======================================================== */
#include "incs.h"
#include "jhl_defs.h"
#include "led.h"
#include "vreg_twl.h"
#include "vreg_ctr.h"
#include "renge\renge_task_intval.h"
// ========================================================
#define TWL_REG_VER_INFO 0x35

View File

@ -116,7 +116,7 @@ void vreg_twl_write( u8 adrs, u8 data );
u8 adrs_table_twl_ext2int( u8 img );
u8 vreg_twl_read( u8 phy_adrs );
task_status_immed command_from_twl( );
extern task_status_immed command_from_twl( );
// 読んだらクリアなどの処理

View File

@ -36,9 +36,6 @@ TargetFile=0
[BuildMode5]
BuildModeName=BSR_WM0
TargetFile=0
[BuildBefore-AfterCmd]
Before1=touch magic.c
After1=ruby nec_s_2_bsrbin2.rb bsr.hex
[Options.OC78K0R 0]
Version=100
O0=.\bsr.hex
@ -254,30 +251,6 @@ Version=100
LCNV_GO=0
E=0
CommandFile=0
[SrcFile]
Source1=loader.c
Source2=pm.c
Source3=i2c_ctr.c
Source4=main.c
Source5=magic.c
Source6=WDT.c
Source7=i2c_mcu.c
Source8=i2c_twl.c
Source9=ini_VECT.c
Source10=led.c
Source11=rtc.c
Source12=vreg_ctr.c
Source13=vreg_twl.c
Source14=adc.c
Source15=renge\renge.c
Source16=accero.c
Source17=self_flash.c
Source18=reboot.c
Source19=sw.c
Source20=task_debug.c
Source21=task_misc.c
Source22=task_sys.c
Source23=pedo_alg_thre_det2.c
[Options.LK78K0R 0]
Version=100
O0=bsr_k0r.lmf
@ -539,44 +512,6 @@ DefaultMode2=1
DefaultMode3=1
DefaultMode4=1
DefaultMode5=1
[ToolSet]
ToolSetName=(•Ï<E280A2>X)78K0R Software Package V1.10
Tool1=CC78K0R|W2.10
Tool2=RA78K0R|W1.31
Tool3=ID78K0R-QB|V3.60
[IncFile]
Include1=incs_loader.h
Include2=jhl_defs.h
Include3=config.h
Include4=user_define.h
Include5=bsr_system.h
Include6=renge\renge.h
Include7=renge\renge_defs.h
Include8=renge\renge_task_immediate.h
Include9=vreg_ctr.h
Include10=vreg_twl.h
Include11=loader.h
Include12=i2c_mcu.h
Include13=WDT.h
Include14=fsl.h
Include15=fsl_user.h
Include16=i2c_ctr.h
Include17=pm.h
Include18=rtc.h
Include19=reboot.h
Include20=incs.h
Include21=accero.h
Include22=pedometer.h
Include23=adc.h
Include24=led.h
Include25=batt_params.h
Include26=..\..\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r\fsl.h
Include27=i2c_twl_defs.h
Include28=renge\renge_task_intval.h
Include29=..\..\Program Files\NEC Electronics Tools\CC78K0R\W2.10\inc78k0r\math.h
Include30=i2c_twl.h
Include31=sw.h
Include32=self_flash.h
[Options.CC78K0R 0]
Version=210
Include0=renge,C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r
@ -1043,3 +978,69 @@ VfiFileBoot0=
VfiFileBoot1=boot.vfi
VF78K0Rchk=0
VF78K0Rvs=
[ToolSet]
ToolSetName=(•Ï<E280A2>X)78K0R Software Package V1.10
Tool1=CC78K0R|W2.10
Tool2=RA78K0R|W1.31
Tool3=ID78K0R-QB|V3.60
[SrcFile]
Source1=loader.c
Source2=pm.c
Source3=i2c_ctr.c
Source4=main.c
Source5=magic.c
Source6=WDT.c
Source7=i2c_mcu.c
Source8=i2c_twl.c
Source9=ini_VECT.c
Source10=led.c
Source11=rtc.c
Source12=vreg_ctr.c
Source13=vreg_twl.c
Source14=adc.c
Source15=renge\renge.c
Source16=accero.c
Source17=self_flash.c
Source18=sw.c
Source19=task_debug.c
Source20=task_misc.c
Source21=task_sys.c
Source22=pedo_alg_thre_det2.c
[BuildBefore-AfterCmd]
Before1=touch magic.c
After1=ruby nec_s_2_bsrbin2.rb bsr.hex
[IncFile]
Include1=incs_loader.h
Include2=jhl_defs.h
Include3=config.h
Include4=user_define.h
Include5=bsr_system.h
Include6=renge\renge.h
Include7=renge\renge_defs.h
Include8=renge\renge_task_immediate.h
Include9=vreg_ctr.h
Include10=vreg_twl.h
Include11=loader.h
Include12=i2c_mcu.h
Include13=WDT.h
Include14=fsl.h
Include15=fsl_user.h
Include16=i2c_ctr.h
Include17=pm.h
Include18=rtc.h
Include19=reboot.h
Include20=incs.h
Include21=accero.h
Include22=pedometer.h
Include23=adc.h
Include24=led.h
Include25=batt_params.h
Include26=..\..\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r\fsl.h
Include27=i2c_twl_defs.h
Include28=renge\renge_task_intval.h
Include29=..\..\Program Files\NEC Electronics Tools\CC78K0R\W2.10\inc78k0r\math.h
Include30=i2c_twl.h
Include31=sw.h
Include32=self_flash.h
Include33=pool.h
Include34=pedo_lpf_coeff.h