・TWLからのバックライト操作通知にミスが有ったので修正

→凡ミスでした
・T3で報告されたバグなど
 ・電源接続初回に電流が多い件
   既知、修正済み。
 ・音量スライダが逆
   既知、修正済み。
    修正版に書き替えてもらうように渡した気が…
 ・アダプタ刺さっていると電源ボタン押しっぱなしで電源はいったり切れたり 済み
 ・電源OFFでアダプタを抜くと充電LEDが消えない 済み
・改良
 ・電源off時の無駄なプルアップを削除 済み
  過去の仕様のまま修正していなかった部分。

・マイコン単品アップデータ
 KMC TEG2 コントローラ板(仮)への対応

・POWER/HOMEスイッチの仕様変更
・E3向けに ifdef 追加
  電源ボタンの押し時間が短い
・PCSミラーのレジスタマップへの反映
・電波送信フラグをステータスに追加
・電池残量アプリ向けにレジスタ追加
・VOLテーブルの更新
・アダプタ有り時、電源ボタン押しっぱなしで電源on/offを繰り返す件
  済み 割と面倒だった。
・電源on時にCODECの/pcsレジスタ初期化(復活)
・I2Cレジスタ追加、レジスタマップ更新

todo:
突然音が大きくなることがある。
 個体に依るようだ?

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_mcu@131 013db118-44a6-b54f-8bf7-843cb86687b1
This commit is contained in:
N2232 2010-05-07 10:43:06 +00:00
parent 1f16a6ac8f
commit dfd5adae55
19 changed files with 451 additions and 261 deletions

View File

@ -80,9 +80,9 @@ task_status_immed tsk_cbk_accero( )
!= ERR_SUCCESS )
{
// 加速度センサが異常になったので止める
vreg_ctr[VREG_C_ACC_CONFIG] &= ~( VREG_BITMASK_ACC_CONF_HOSU | VREG_BITMASK_ACC_CONF_ACQ );
// vreg_ctr[ VREG_C_STATUS_1 ] |= REG_BIT_ACCERO_ERR;
vreg_ctr[ VREG_C_ACC_CONFIG ] &= ~( VREG_BITMASK_ACC_CONF_HOSU | VREG_BITMASK_ACC_CONF_ACQ );
acc_hosu_set();
vreg_ctr[ VREG_C_STATUS_1 ] |= REG_BIT_ACCERO_ERR;
return ( ERR_SUCCESS ); // タスクの削除は必要
}
else
@ -152,9 +152,7 @@ task_status_immed acc_write( )
/*=========================================================
 
todo
 
========================================================*/
task_status_immed acc_hosu_set( )
{

View File

@ -44,14 +44,14 @@ extern void nop8();
// max -15db
const u8 slider_to_codec[64] =
{
127, 126, 125, 124, 123, 122, 121, 120,
119, 118, 117, 116, 115, 114, 113, 112,
111, 110, 109, 109, 108, 107, 106, 105,
104, 103, 102, 101, 100, 99, 98, 97,
96, 95, 94, 93, 92, 91, 90, 89,
88, 87, 86, 85, 84, 83, 82, 81,
81, 80, 79, 78, 77, 76, 75, 74,
73, 72, 71, 70, 69, 68, 67, 66
127, 127, 127, 126, 125, 124, 123, 122,
121, 120, 119, 118, 117, 116, 115, 114,
113, 112, 111, 110, 109, 108, 107, 106,
105, 104, 103, 102, 101, 100, 99, 98,
97, 96, 95, 94, 93, 92, 91, 90,
89, 88, 87, 86, 85, 84, 83, 82,
81, 80, 79, 78, 77, 76, 75, 74,
73, 72, 71, 70, 69, 68, 67, 66
};
@ -139,15 +139,15 @@ void tsk_adc( )
{
vol_old = adc_raw_vol;
// レジスタ更新
vreg_ctr[ VREG_C_SND_VOL ] = ( adc_raw_vol / 4 ); // 64段
vreg_twl[ REG_TWL_INT_ADRS_VOL ] = adc_raw_vol / ( 256 / 32 ); // ←adc値でよい
vreg_twl[ REG_TWL_INT_ADRS_VOL ] = vol_old / ( 256 / 32 ); // ←adc値でよい
vreg_ctr[ VREG_C_SND_VOL ] = ( vol_old / 4 ); // 64段
// codecに伝える
iic_mcu_write_a_byte( IIC_SLA_CODEC, CODEC_REG_VOL, slider_to_codec[ adc_raw_vol / 4 ] );
iic_mcu_write_a_byte( IIC_SLA_CODEC, CODEC_REG_VOL, slider_to_codec[ vol_old / 4 ] );
#ifndef _MODEL_CTR_
iic_mcu_write_a_byte( IIC_SLA_DCP, 0, slider_to_codec[ ( 255 - adc_raw_vol ) / 4 ] ); // todo
iic_mcu_write_a_byte( IIC_SLA_DCP, 0, slider_to_codec[ ( 255 - vol_old ) / 4 ] );
#endif
// set_irq( VREG_C_IRQ0, REG_BIT_VR_SNDVOL_CHANGE ); // 割り込み廃止
// set_irq( VREG_C_IRQ0, REG_BIT_VR_SNDVOL_CHANGE ); // 割り込み廃止
force_update_vol = 200;
}
}
@ -178,7 +178,7 @@ void tsk_adc( )
ADCEN = 1;
ADM = 0b00011011; // セレクトモード、章圧、fCLK/6 ///ここから ↓
ADM = 0b00001011; // セレクトモード、昇圧、fCLK/6 ///ここから ↓
ADPC = 0x06; // ADCポートのセレクト
ADS = ADC_SEL_TUNE;
@ -225,6 +225,7 @@ static u8 getmean3( u8 * hist )
/* ========================================================
 
  
// todo 値が飛ぶことがある?
======================================================== */
__interrupt void int_adc( )
{
@ -306,8 +307,7 @@ u8 get_adc( u8 ch )
ADIF = 0;
ADCEN = 1;
ADCS = 0;
ADM = 0b00100011; // セレクトモード、昇圧、fCLK/6 ///ここから↓
ADM = 0b00001011; // セレクトモード、昇圧、fCLK/6 ///ここから↓
ADPC = 0x06; // ADCポートのセレクト
ADS = ch;

View File

@ -19,6 +19,7 @@ enum poweron_reason_
NONE = 0,
PWSW,
RTC_ALARM,
EXT_POWER
};

View File

@ -28,9 +28,9 @@
// “ÁŽêŽd—l //
//#define _SW_HOME_ENABLE_
//#define _PARRADIUM_ 廃止
//#define _PM_BUG_ // バグ持ち CTR PMIC 廃止
//#define _PARRADIUM_ 廃止
//#define _PM_BUG_ // バグ持ち CTR PMIC 廃止
#define _FOR_E3_
// ---------------------------------- //
#ifdef _MODEL_TEG2_

View File

@ -571,7 +571,9 @@ void iic_mcu_start( )
SPS0 = 0x0000; // シリアルユニットのクロック0。(8M/2)/1
SMR02 = bSMR0n_FIXEDBIT | bMD0n2; // 簡易I2Cに設定
#ifdef _OVERCLOCK_
SDR02 = 12 << 9; // ボーレート設定 (8M/2)/1/(x+1)/2
// todo
// SDR02 = 12 << 9; // ボーレート設定 8M/1/(x+1)/2
SDR02 = 13 << 9; // ボーレート設定 (8M/2)/1/(x+1)/2
#else
SDR02 = 5 << 9; // ボーレート設定 (8M/2)/1/(x+1)/2
#endif

View File

@ -79,18 +79,15 @@ uni_info_LED info_LED = {
//調光可能LEDのワークというか
/*
typedef struct{
u8 to;
sx16 delta;
ux16 now;
}st_LED_dim_status;
*/
st_LED_dim_status LED_dim_status_pow_B;
st_LED_dim_status LED_dim_status_3D;
st_LED_dim_status LED_dim_status_WiFi;
// 赤LEDの電池残量LEDの点滅パターン
uni_led_red_batt_empty led_red_batt_empty;
// ========================================================
#define led_fade_to( now, goal ) now = fade_to( now, goal )
@ -183,7 +180,8 @@ void LED_init( )
TOE0 = 0b0000000011101110; // TOxをタイマーモジュールが制御
TS0 = 0b0000000011101111; // 動作開始
TDR00 = LED_BRIGHT_MAX - 1; // 10bit, 周期
// TDR00 = LED_BRIGHT_MAX - 1; // 10bit, 周期
TDR00 = LED_BRIGHT_MAX*5 - 1; // 10bit, 周期
if( system_status.reboot )
{
@ -283,11 +281,15 @@ void tsk_led_pow( )
static void led_pow_normal( )
{
static u8 state;
static u8 red_blink_poi;
u8 temp;
if( vreg_ctr[VREG_C_BT_REMAIN] <= BATT_TH_EMPTY )
{
led_fade_to( LED_duty_pow_blu, 0 );
// 赤点滅
led_fade_to( LED_duty_pow_blu, 0 );
#if 0
state++;
if( state < 127 )
{
@ -298,7 +300,33 @@ static void led_pow_normal( )
LED_pow_red = 1;
}
return;
#endif
led_fade_to( LED_duty_notify_grn, 0 );
led_fade_to( LED_duty_notify_blu, 0 );
state += 1;
if( state < 16 )
{
return;
}
state = 0;
if( ( led_red_batt_empty.bits & ( 1 << red_blink_poi )) != 1 )
{
LED_pow_red = 1;
LED_duty_notify_red = 255;
}
else
{
LED_pow_red = 0;
LED_duty_notify_red = 0;
}
red_blink_poi += 1;
if( red_blink_poi >= 32 )
{
red_blink_poi = 0;
}
}
else if( vreg_ctr[VREG_C_BT_REMAIN] <= BATT_TH_LO )
{
@ -394,7 +422,7 @@ static void led_pow_hotaru( )
/* ========================================================
* 使 *
LED_Wifi 3
todo
todo .old
======================================================== */
void tsk_led_wifi( )
{
@ -487,6 +515,11 @@ void tsk_led_notify( )
static u8 frame;
static st_LED_dim_status LED_dim_status_info_R, LED_dim_status_info_G, LED_dim_status_info_B;
if( vreg_ctr[VREG_C_BT_REMAIN] <= BATT_TH_EMPTY )
{
// 電池切れが優先する
return;
}
// 次のフレームに進める?
if( time_to_next_frame == 0 )
@ -522,6 +555,7 @@ void tsk_led_notify( )
led_fade_to2( LED_duty_notify_red, &LED_dim_status_info_R );
led_fade_to2( LED_duty_notify_grn, &LED_dim_status_info_G );
led_fade_to2( LED_duty_notify_blu, &LED_dim_status_info_B );
}

View File

@ -71,10 +71,7 @@ enum LED_MODE_TUNE
enum
{
WIFI_LED_OFF = 0,
WIFI_LED_ON,
WIFI_LED_TXAUTO,
WIFI_LED_PTN0,
WIFI_LED_PTN1
WIFI_LED_ON
};
@ -124,6 +121,20 @@ typedef union{
extern uni_info_LED info_LED;
typedef struct{
u8 dats[4];
}st_u8s4;
typedef union{
unsigned long bits;
st_u8s4 dats;
}uni_led_red_batt_empty;
extern uni_led_red_batt_empty led_red_batt_empty;
/*
LED
*/

View File

@ -218,6 +218,7 @@ static void hosu_increment()
// 空白の時間を考慮する。1時間以上放置されたなど。
u16 now_hour;
u8 now_year;
u8 now_min;
// 時計を止める必要が有るので↓は一気に行って下さい
DI();
@ -227,6 +228,7 @@ static void hosu_increment()
last_hour = HOUR; // 履歴読み出し時に使用。BCDのままでよい
last_day = DAY;
last_month = MONTH;
now_min = MIN;
now_hour = get_long_hour();
// RWAIT = 0; ↑で行っています
// EI(); 〃
@ -259,13 +261,26 @@ static void hosu_increment()
last_hour_fny = now_hour;
// 実際にインクリメント
if( pool.vreg_c_ext.pedo_log[ p_record ] == HOSU_NODATA )
{
pool.vreg_c_ext.pedo_log[ p_record ] = 1;
}
else if( pool.vreg_c_ext.pedo_log[ p_record ] != HOSU_MAX )
{
pool.vreg_c_ext.pedo_log[ p_record ] += 1;
u8 temp;
temp = p_record;
if( now_min < vreg_ctr[ VREG_C_ACC_HOSU_ORIGIN ] )
{
temp -= 1;
if( PEDOMETER_LOG_SIZE >= temp )
{
temp = PEDOMETER_LOG_SIZE -1;
}
}
if( pool.vreg_c_ext.pedo_log[ temp ] == HOSU_NODATA )
{
pool.vreg_c_ext.pedo_log[ temp ] = 1;
}
else if( pool.vreg_c_ext.pedo_log[ temp ] != HOSU_MAX )
{
pool.vreg_c_ext.pedo_log[ temp ] += 1;
}
}
}
}
@ -287,6 +302,10 @@ void fill_hosu_hist_hours( u16 hours )
do
{
p_record += 1;
if( PEDOMETER_LOG_SIZE >= p_record )
{
p_record = 0;
}
pool.vreg_c_ext.pedo_log[ p_record ] = 0;
hours -= 1;
}

View File

@ -264,7 +264,10 @@ err PM_sys_pow_on( )
PM_VDD_normMode();
PM_VDD_on( );
wait_ms( DELAY_PM_TW_PWUP );
// wait_ms( DELAY_PM_TW_PWUP ); // gyro_csを挟むため
wait_ms( 10 );
GYRO_CS_ENABLE();
wait_ms( DELAY_PM_TW_PWUP - 10 );
PM_VDD50A_on( ); // 液晶電源ではなく、ledとかに使うものです
@ -288,14 +291,12 @@ err PM_sys_pow_on( )
FCRAM_RST_neg;
RESET2_neg;
/*
wait_ms( 100 );
{
// CODEC 不定レジスタ初期化
u8 codec_reg_init[3] = { 0,0,0 };
iic_mcu_write( IIC_SLA_CODEC, CODEC_REG_PM, 3, codec_reg_init );
}
*/
#else
// TWL PMIC
@ -330,12 +331,11 @@ err PM_sys_pow_on( )
FCRAM_RST_ast;
return ( ERR_ERR );
}
/*
{ // CODEC 不定レジスタ初期化
u8 codec_reg_init[3] = { 0,0,0 };
iic_mcu_write( IIC_SLA_CODEC, CODEC_REG_PM, 3, codec_reg_init );
}
*/
#endif
return ( ERR_SUCCESS );
@ -346,7 +346,6 @@ err PM_sys_pow_on( )
/* ========================================================
OFFシーケンス
todo:
======================================================== */
err PM_sys_pow_off( )
{
@ -426,7 +425,7 @@ __interrupt void intp6_PM_irq( )
}
#define _type1_
/* ========================================================
PMICからの割り込みを受けてNTR PMIC互換レジスタからリード
======================================================== */
@ -450,13 +449,19 @@ task_status_immed ntr_pmic_comm( )
{
if( ( reg_shadow & REG_BIT_TWL_REQ_BL_U ) == 0 ) // 消えた
{
// irq_work = REG_BIT_TWL_BL_U_OFF;
#ifdef _type1_
irq_work = REG_BIT_TWL_BL_U_OFF;
#else
set_irq( VREG_C_IRQ2, REG_BIT_TWL_BL_U_OFF );
#endif
}
else
{
// irq_work = REG_BIT_TWL_BL_U_ON;
#ifdef _type1_
irq_work = REG_BIT_TWL_BL_U_ON;
#else
set_irq( VREG_C_IRQ2, REG_BIT_TWL_BL_U_ON );
#endif
}
}
@ -465,18 +470,26 @@ task_status_immed ntr_pmic_comm( )
{
if( ( reg_shadow & REG_BIT_TWL_REQ_BL_L ) == 0 ) // 消えた
{
// irq_work = REG_BIT_TWL_BL_L_OFF;
#ifdef _type1_
irq_work |= REG_BIT_TWL_BL_L_OFF;
#else
set_irq( VREG_C_IRQ2, REG_BIT_TWL_BL_L_OFF );
#endif
}
else
{
// irq_work = REG_BIT_TWL_BL_L_ON;
#ifdef _type1_
irq_work |= REG_BIT_TWL_BL_L_ON;
#else
set_irq( VREG_C_IRQ2, REG_BIT_TWL_BL_L_ON );
#endif
}
}
#if 0
irq_work &= ~VREG_C_IRQ_MASK2;
vreg_ctr[ VREG_C_STATUS_1 ] = ( vreg_ctr[ VREG_C_STATUS_1 ] & ~0x0C ) | ( reg_shadow & 0x0C ); // TWLバックライト情報のミラー
#ifdef _type1_
irq_work &= ~vreg_ctr[ VREG_C_IRQ_MASK2 ];
// set_irq 相当品
if( irq_work != 0 )
{
@ -620,6 +633,8 @@ void tsk_batt( )
}
}
#if 0
// todo
// 充電 ///////////////////////////
// 温度付きヒステリシス
@ -651,6 +666,16 @@ void tsk_batt( )
#endif
}
#else
// 充電 ///////////////////////////
# ifndef _MODEL_WM0_
// CHG_ENABLEピンは /WL_RST に配線されているので
BT_CHG_ENABLE(); // 温度範囲OKで充電再開
# endif
#endif
// 充電 //
// →割り込み。miscの中でよろしくやってくれている。
set_bit( !BT_CHG_n, vreg_ctr[VREG_C_STATUS], REG_BIT_BATT_CHARGE );
@ -741,6 +766,7 @@ void BT_init( )
dat_16._u16 = swap_endian_16( 0x4A57 ); // unlock key
if( iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_LOCK, 2, &dat_16 ) == ERR_SUCCESS )
{
vreg_ctr[ VREG_C_STATUS_1 ] &= ~REG_BIT_GASGAUGE_ERR;
// 残量IC有り //
if( battery_manufacturer < BT_VENDER_OPEN )
{
@ -896,6 +922,9 @@ task_status_immed BT_temp_update( )
newrcomp += rcomp;
newrcomp = swap_endian_16( (u16)newrcomp );
// todo
newrcomp = 0x9700;
DBG_P_n = 0;
if( iic_mcu_write

View File

@ -174,7 +174,7 @@ void firm_update( )
}
// 1ブロック書き込み完了。内部ベリファイを行う
if( FSL_IVerify( target_block ) != FSL_OK ){
// todo 再度消去→書き込み ベリファイを繰り返すだけじゃダメでした...
// 再度消去→書き込み ベリファイを繰り返すだけじゃダメでした... todo…
// リストア
firm_duplicate( UPDATE_BLOCK_LAST +1,
FIRM_TOP );
@ -268,9 +268,7 @@ static void FSL_Open( void )
MK2H = FSL_MK2H_MASK; /* } */
#endif
// 何か前準備?
// todo DMAを止める
while( DST1 ){;}
while( DST1 ){;} // DMA停止
DEN1 = 0;
MK0 = 0xFFFF;
@ -365,7 +363,7 @@ static err firm_duplicate( u8 block_src,
// 1ブロック書き込み完了。内部電圧チェックを行う
while( FSL_IVerify( target_block ) != FSL_OK ){
// todo
// todo 失敗時?
;
}
}

View File

@ -14,19 +14,24 @@
//=========================================================
#define INTERVAL_TSK_SW 16
#define CLICK_THRESHOLD 1
#define HOLD_THREASHOLD (u8)( 600 / INTERVAL_TSK_SW )
#define INTERVAL_TSK_SW 8
#define CLICK_THRESHOLD 2
#ifdef _FOR_E3_
#define HOLD_THREASHOLD (u8)( 800 / INTERVAL_TSK_SW )
#else
#define HOLD_THREASHOLD (u8)( 2000 / INTERVAL_TSK_SW )
#endif
//=========================================================
u8 SW_pow_count, SW_home_count, SW_wifi_count;
bit SW_pow_mask, SW_home_mask, SW_wifi_mask;
u8 SW_pow_count;
bit SW_pow_mask;
u8 SW_home_count, SW_wifi_count;
bit SW_HOME_n;
//=========================================================
// 押した時間を数える。押しっぱなしでも0に戻らない
// maskが非0の時は、一度離すまで無視する
@ -46,6 +51,24 @@ bit SW_HOME_n;
}
#define chk_clicked( button, count, irq_bit_name ) \
if( !button ) \
{ \
if( count <= CLICK_THRESHOLD ) \
{ \
count += 1; \
} \
if( count == CLICK_THRESHOLD ) \
{ \
set_irq( VREG_C_IRQ0, irq_bit_name ); \
} \
} \
else \
{ \
count = 0; \
}
/* ========================================================
@ -53,23 +76,13 @@ bit SW_HOME_n;
======================================================== */
void tsk_sw( )
{
static u8 cnt_force_off = 0;
static u16 cnt_force_off = 0;
static u8 task_interval = 0;
switch ( system_status.pwr_state )
{
case ( OFF_TRIG ):
SW_pow_count = 0;
SW_wifi_count = 0;
SW_home_count = 0;
cnt_force_off = 0;
break;
case ( ON_TRIG ):
// 電源投入
SW_pow_mask = 1;
SW_home_mask = 1;
SW_wifi_mask = 1;
cnt_force_off = 0;
break;
}
@ -82,7 +95,6 @@ void tsk_sw( )
task_interval = (u8)( INTERVAL_TSK_SW / SYS_INTERVAL_TICK );
}
switch ( system_status.pwr_state )
{
case ( ON ):
@ -90,9 +102,10 @@ void tsk_sw( )
case ( BT_CHARGE ):
case ( OFF ):
// 電源スイッチの監視 //
count_sw_n( SW_POW_n, SW_pow_count, SW_pow_mask ); // ボタン押し時間のカウント
if( SW_POW_n )
{
if( ( CLICK_THRESHOLD < SW_pow_count ) && ( SW_pow_count <= HOLD_THREASHOLD ) )
if( SW_pow_count == CLICK_THRESHOLD )
{
#ifdef _SW_HOME_ENABLE_
set_irq( VREG_C_IRQ0, REG_BIT_SW_POW_CLICK );
@ -108,81 +121,45 @@ void tsk_sw( )
#else
set_irq( VREG_C_IRQ0, REG_BIT_SW_HOME_HOLD );
#endif
}
else if( SW_pow_count == ( HOLD_THREASHOLD * 4 ) )
{// 長押しによる強制OFF
vreg_ctr[ VREG_C_LED_POW ] = LED_POW_ILM_ONLY_RED;
system_status.pwr_state = OFF_TRIG;
renge_task_interval_run_force = 1;
cnt_force_off = 1;
}
// 電源OFF割り込みを入れたが…
if( ( vreg_ctr[VREG_C_IRQ0] & REG_BIT_SW_POW_HOLD ) != 0 )
if( cnt_force_off != 0 )
{
cnt_force_off += 1;
if( cnt_force_off >= 13 )
{ // …返事がない。強制的に切る。
#ifdef _FOR_E3_
if( ++cnt_force_off == ( 200 / INTERVAL_TSK_SW ) )
#else
if( ++cnt_force_off == ( 4000 / INTERVAL_TSK_SW ) )
#endif
{
// タイムアウトによる強制OFF
cnt_force_off = 0;
vreg_ctr[ VREG_C_LED_POW ] = LED_POW_ILM_ONLY_RED;
system_status.pwr_state = OFF_TRIG;
renge_task_interval_run_force = 1;
}
}
else
{
cnt_force_off = 0;
}
#ifdef _SW_HOME_ENABLE_
// HOME スイッチ //
switch( system_status.model )
{
#ifdef _MODEL_CTR_
# ifdef _MODEL_CTR_
case( MODEL_JIKKI ):
SW_HOME_n = SW_HOME_n_JIKKI;
break;
#endif
# endif
case( MODEL_TS_BOARD ):
case( MODEL_SHIROBAKO ):
SW_HOME_n = SW_HOME_n_TSBOARD;
break;
default:
SW_HOME_n = 1;
}
if( SW_HOME_n )
{
if( ( CLICK_THRESHOLD < SW_home_count ) && ( SW_home_count <= HOLD_THREASHOLD ) )
{
set_irq( VREG_C_IRQ0, REG_BIT_SW_HOME_CLICK );
}
}
else if( SW_home_count == HOLD_THREASHOLD )
{
set_irq( VREG_C_IRQ0, REG_BIT_SW_HOME_HOLD );
SW_HOME_n = 1; // 放されてる状態
}
chk_clicked( SW_HOME_n, SW_home_count, REG_BIT_SW_HOME_CLICK );
#endif
// wifi sw //
if( SW_wifi_count == CLICK_THRESHOLD )
{
set_irq( VREG_C_IRQ0, REG_BIT_SW_WIFI_CLICK );
}
break;
chk_clicked( SW_WIFI_n, SW_wifi_count, REG_BIT_SW_WIFI_CLICK );
}
// ボタン押し時間のカウント
/*
if( ( system_status.pwr_state == ON )
|| ( system_status.pwr_state == OFF )
|| ( system_status.pwr_state == BT_CHARGE ) )
*/
{
count_sw_n( SW_POW_n, SW_pow_count, SW_pow_mask );
#ifdef _SW_HOME_ENABLE_
count_sw_n( SW_HOME_n, SW_home_count, SW_home_mask );
#endif
count_sw_n( SW_WIFI_n, SW_wifi_count, SW_wifi_mask );
}
return;
}

View File

@ -1,7 +1,7 @@
#ifndef _sw_
#define _sw_
extern u8 SW_pow_count, SW_home_count, SW_wifi_count;
extern bit SW_pow_mask, SW_home_mask, SW_wifi_mask;
extern u8 SW_pow_count;
extern bit SW_pow_mask;
#endif

View File

@ -44,10 +44,16 @@
// ========================================================
bit twl_ver_read;
// ========================================================
#define INTERVAL_TSK_MISC_STAT 4
/* ========================================================
======================================================== */
@ -140,6 +146,14 @@ void tsk_misc_stat( )
NOP();
}
}
if( twl_ver_read )
{
twl_ver_read = 0;
set_irq( VREG_C_IRQ2, REG_BIT_TWL_VER_READ );
}
return;
}
@ -184,14 +198,16 @@ task_status_immed do_command0( )
FCRAM_RST_neg;
PM_reset_neg();
RESET2_neg;
/*
// 起動時以外はリセット不要
/*
// CODEC 不定レジスタ初期化
wait_ms( 100 );
{
u8 codec_reg_init[3] = { 0,0,0 };
iic_mcu_write( IIC_SLA_CODEC, CODEC_REG_PM, 3, codec_reg_init );
}
*/
*/
}
}

View File

@ -42,7 +42,7 @@ void tsk_sys( )
switch ( system_status.poweron_reason )
{
default:
case( NONE ):
// スイッチで電源on
if( SW_pow_count != 0 )
@ -53,14 +53,14 @@ void tsk_sys( )
{
timeout += 1;
}
if( timeout > 127 )
if( timeout > 100 )
{
system_status.pwr_state = OFF_TRIG; // スイッチはノイズだった。寝る。
renge_task_interval_run_force = 1;
return;
}
if( SW_pow_count < 3 )
if( SW_pow_count < 10 )
{
// もう少しスイッチの様子を見る
return;
@ -69,10 +69,12 @@ void tsk_sys( )
system_status.poweron_reason = PWSW;
break;
case ( RTC_ALARM ):
default:
break;
}
SW_pow_mask = 1;
timeout = 0;
BT_DET_P = 1; // チャージに時間が掛かるので先に上げておく
@ -120,17 +122,24 @@ void tsk_sys( )
{
// とりあえず、LED消灯状態で起動させる
vreg_ctr[VREG_C_LED_POW] = LED_POW_ILM_OFF;
// todo?
}
system_status.pwr_state = ON_TRIG;
// ここまで来ると、電源投入確定
// ここまで来ると、電源投入確定 //
break;
case ON_TRIG: //-------------------------------------------------------
LED_init( );
PU7 = 0b00011101; // 4:SW_WIFI 3:SW_PWSW 2:PM_IRQ 0:PM_EXTDC_n
PU5 = 0b00000010; // 1:PM_CHARGE
PU7 = 0b00011101; // 4:SW_WIFI 3:SW_PWSW 2:PM_IRQ 0:PM_EXTDC_n
#ifdef _MODEL_CTR_
# ifdef _SW_HOME_ENABLE_
PU20 = 0b00010000; // SW_HOME
# else
PU20 = 0b00000000;
# endif
#endif
IIC_ctr_Init( );
if( ( vreg_ctr[ VREG_C_MCU_STATUS ] & REG_BIT_STATUS_WDT_RESET )
@ -235,6 +244,7 @@ void tsk_sys( )
IIC_ctr_Stop( );
IIC_twl_Stop( );
RTC_32k_off();
GYRO_CS_DISABLE();
vreg_ctr[VREG_C_IRQ0] = 0;
vreg_ctr[VREG_C_IRQ1] = 0;
@ -251,55 +261,43 @@ void tsk_sys( )
#ifdef _PMIC_TWL_
PM_TEG_LCD_dis( 1 );
#endif
// IRQ0_deactive;
// pullup_off(); ↓
{
PU5 = 0b00000011; // PM_CHG,PM_CHGERR
PU7 = 0b00011001; // SW_WiFi,PWSWI,PM_EXTTDC
}
PM_sys_pow_off( );
while( iic_mcu_busy )
{;
}
KRM = ( KR_SW_POW ); // Mask ではなく、Modeなのだそうだ。紛らわしい
// intp20系は後ほど
MK0 = ~( INT_MSK0_EXTDC );
MK1 = ~( INT_MSK1_KR | INT_MSK1_RTCALARM | INT_MSK1_RTCINTVAL );
MK2L = 0b11111111;
// PU5 そのまま
PU7 = 0b00001001; // PWSWI,PM_EXTTDC,( IRQ0_deactive(), PM_IRQ_deactive )
PU20 = 0x00; // SW_HOME 停止
IF0 = 0;
IF1 = 0;
IF2 = 0;
PM_sys_pow_off( );
timeout = 0;
system_status.pwr_state = BT_CHARGE;
SW_pow_mask = 1;
SW_pow_count = 0;
SW_wifi_count = 0;
// no break //
case BT_CHARGE:
system_status.pwr_state = OFF;
if( !PM_EXTDC_n )
{
// アダプタ有り:充電温度監視
BT_TEMP_P = 1;
// 電源on
if( ( SW_pow_count > 3 ) || ( SW_wifi_count > 3 )
|| ( system_status.poweron_reason == RTC_ALARM ) )
{
system_status.pwr_state = OFF; // 若干抵抗有るが...
renge_task_interval_run_force = 1;
KRMK = 1;
return;
}
return;
}
else
{
// 省電力へ移行
LED_CHARGE = 0;
BT_TEMP_P = 0;
while( RWST )
{;}
@ -314,23 +312,23 @@ void tsk_sys( )
OSMC = 0x00;
# endif
STOP( );
# ifdef _MCU_BSR_
OSMC = 0x01;
CKC = 0b00001000;
# endif
RTCIMK = 0;
// 起きる //
// 起きる条件は
// ・KeyReturn割り込み電源ボたん
// ・RTCアラーム
// ・アダプタ挿抜
system_status.pwr_state = OFF; //
renge_task_interval_run_force = 1;
KRMK = 1;
return;
if( PM_EXTDC_n )
{
SW_pow_mask = 0;
}
# ifdef _MCU_BSR_
OSMC = 0x01;
CKC = 0b00001000;
# endif
RTCIMK = 0;
}
return;
default:
while( 1 )

View File

@ -160,10 +160,8 @@
// WiFi
#ifndef _TEG_
#define WL_TX P20.3 // INTP21
#define WL_RX P20.2 // INTP20
#else
#define WL_TX P20.3 // INTP21
#define WL_RX P20.2 // INTP20
#endif
//#define LED_CAM P1.0 // TO02
@ -193,10 +191,17 @@
#ifdef _MODEL_CTR_
// 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; }
#define I2C_PU_on() { PM5.3 = 1; PM3.3 = 1; P14 |= 0x03; P5.3 = 1; PM5.3 = 0; P3.3 = 1; PM3.3 = 0; }
#define I2C_PU_off() { PM5.3 = 1; PM3.3 = 1; P14 &= ~0x03; P5.3 = 0; PM5.3 = 0; P3.3 = 0; PM3.3 = 0; }
#endif
#ifdef _MODEL_CTR_
#define GYRO_CS_ENABLE() P5.0 = 1
#define GYRO_CS_DISABLE() P5.0 = 0
#else
#define GYRO_CS_ENABLE() ;
#define GYRO_CS_DISABLE() ;
#endif
//#define I2C_M_SDA P3.1 // SDA10
//#define I2C_M_SCL P3.2 // SCL10
@ -247,12 +252,9 @@
#endif
#define DBG_M_n P2.1
#define DBG_P_n P2.2
#define KR_SW_POW ( 1 << 3 )
#define KR_SW_WIFI ( 1 << 4 )

View File

@ -274,6 +274,10 @@ void vreg_ctr_write( u8 adrs, u8 data )
}
break;
case ( VREG_C_ACC_HOSU_ORIGIN ):
vreg_ctr[adrs] = data;
break;
case ( VREG_C_FREE_ADRS ):
vreg_ctr[adrs] = data;
break;
@ -300,6 +304,19 @@ void vreg_ctr_write( u8 adrs, u8 data )
break;
}
vreg_ctr[adrs] = data;
break;
case( VREG_C_BATT_EMPTY_PATTERN ):
{
#ifdef _MODEL_CTR_NOTIFY_FULLCOLOR_
if( iic_burst_state < 4 )
{
led_red_batt_empty.dats.dats[ iic_burst_state ] = data;
iic_burst_state += 1;
}
#endif
}
break;
}
return;
}
@ -368,7 +385,6 @@ u8 vreg_ctr_read( u8 adrs )
// I2C仮想レジスタから読まれて何かするレジスタ
void vreg_ctr_after_read( u8 adrs )
{
// 割り込みフラグはリードでクリア
switch( adrs )
{

View File

@ -9,7 +9,7 @@
// VREG_C_MCU_STATUS
#define REG_BIT_STATUS_WDT_RESET ( 1 << 1 )
#define REG_BIT_STATUS_WDT_RESET ( 1 << 1 )
#define REG_BIT_RTC_BLACKOUT ( 1 << 0 )
@ -27,17 +27,15 @@
// VREG_C_STATUS_X
// ¢Žg—p ( 1 << 6 )
// ¢Žg—p ( 1 << 5 )
// ¢Žg—p ( 1 << 4 )
// ¢Žg—p ( 1 << 3 )
// ¢Žg—p ( 1 << 2 )
#define REG_BIT_WIFI_TX ( 1 << 4 )
// twl bl ‚̃~ƒ‰<C692>[[1: ( 1 << 3 )
// 0]( 1 << 2 )
#define REG_BIT_ACCERO_ERR ( 1 << 1 )
#define REG_BIT_GASGAUGE_ERR ( 1 << 0 )
// VREG_C_IRQ0
#define REG_BIT_VR_SNDVOL_CHANGE ( 1 << 7 )
#define REG_BIT_IRQ_WDT_RESET ( 1 << 7 )
#define REG_BIT_IRQ_WDT_RESET ( 1 << 7 )
#define REG_BIT_SHELL_OPEN ( 1 << 6 )
#define REG_BIT_SHELL_CLOSE ( 1 << 5 )
#define REG_BIT_SW_WIFI_CLICK ( 1 << 4 )
@ -57,6 +55,7 @@
#define REG_BIT_BT_DC_DISC ( 1 << 0 )
// VREG_C_IRQ2
#define REG_BIT_TWL_VER_READ ( 1 << 7 )
#define REG_BIT_TWL_SNDVOL_CHANGE ( 1 << 6 )
#define REG_BIT_TWL_BL_U_ON ( 1 << 5 )
#define REG_BIT_TWL_BL_U_OFF ( 1 << 4 )
@ -216,6 +215,8 @@ enum VREG_C
VREG_C_RTC_SEC_FINE_L,
VREG_C_RTC_SEC_FINE_H,
VREG_C_ACC_HOSU_ORIGIN,
VREG_C_ACC_CONFIG = 0x40,
VREG_C_ACC_R_ADRS,
VREG_C_ACC_RESERVE,
@ -235,14 +236,16 @@ enum VREG_C
VREG_C_ACC_HOSU_SETTING,
VREG_C_ACC_HOSU_HIST = 0x4F,
// VREG_C_AMBIENT_BRIGHTNESS = 0xXX,
VREG_C_FREE_ADRS = 0x50,
VREG_C_FREE_DATA,
VREG_C_BATT_EMPTY_PATTERN,
VREG_C_ENDMARK_
};
#define VREG_C_INFO 0x7F
// VREG_C_AMBIENT_BRIGHTNESS = 0xXX,
/*
VREG_C_PM_INFO, // ¢Žg—p

View File

@ -19,6 +19,9 @@ TWL
u8 vreg_twl[_REG_TWL_INT_ADRS_ENDMARK];
extern bit twl_ver_read;
/* ========================================================
======================================================== */
@ -92,6 +95,9 @@ u8 vreg_twl_read( u8 phy_adrs )
switch( phy_adrs ){
case( REG_TWL_INT_ADRS_VER_INFO ):
// set_irq( VREG_C_IRQ2, REG_BIT_TWL_VER_READ ); // 速度的に無理なので
twl_ver_read = 1;
return( TWL_REG_VER_INFO );
case( REG_TWL_INT_ADRS_POWER_INFO ):

View File

@ -512,14 +512,68 @@ 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
[BuildBefore-AfterCmd]
Before1=touch magic.c
After1=ruby nec_s_2_bsrbin2.rb bsr.hex
[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=led.c
Source10=rtc.c
Source11=vreg_ctr.c
Source12=vreg_twl.c
Source13=adc.c
Source14=renge\renge.c
Source15=accero.c
Source16=self_flash.c
Source17=sw.c
Source18=task_debug.c
Source19=task_misc.c
Source20=task_sys.c
Source21=pedo_alg_thre_det2.c
Source22=ini_VECT.c
Source23=led_old.c
[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
[Options.CC78K0R 0]
Version=210
Include0=renge,C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r
@ -752,7 +806,6 @@ Version=210
Define0=
Define1=_debug_,_TEG_,proc_is_ke3
Define2=_debug_,_TEG_,proc_is_ke3,%time%
Undefine0=
Include0=renge,C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r
Include1=renge,C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r
Include2=renge,C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r
@ -1069,62 +1122,89 @@ VfiFileBoot0=
VfiFileBoot1=boot.vfi
VF78K0Rchk=0
VF78K0Rvs=
[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=led.c
Source10=rtc.c
Source11=vreg_ctr.c
Source12=vreg_twl.c
Source13=adc.c
Source14=renge\renge.c
Source15=accero.c
Source16=self_flash.c
Source17=sw.c
Source18=task_debug.c
Source19=task_misc.c
Source20=task_sys.c
Source21=pedo_alg_thre_det2.c
Source22=ini_VECT.c
Source23=led_old.c
[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
[Options.CC78K0R 2 pm.c]
Version=210
Define0=
Define1=_debug_,_TEG_,proc_is_ke3
Define2=_debug_,_TEG_,proc_is_ke3,%time%
Define3=_TEG_,proc_is_ke3
Define4=proc_is_ke3
Include0=renge,C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r
Include1=C:\Program Files\NEC Electronics Tools\FSL78K0R_Type02ES\V1.20\inc78k0r
Memorymodel=1
Flashobj=0
FlashStartadr=
FlashBranchStartadr=
Mirror=0
Saddrglobalchk=0
Saddrglobal=1066
Saddrstaticchk=0
Saddrstatic=1072
Bitfieldmsb=0
Onebytechk=0
Pacstructchk=0
AssignROMchk=0
AssignROM=0
Maxoptimizechk=0
Maxoptimize=1104
Charunexpandchk=0
Unsignedchar=0
Usesaddrchk=0
Autoallocationchk=1
Jumpoptimize=1
Librarycallchk=1
Librarycall=1132
Aggressivechk=1
Relativebranchchk=1
Debugoptchk=0
Outdebugchk=1
Outdebug=1153
Outasmsrccmb0=inter_asm
Outasmsrccmb1=bsr.asm
Outasmsrcchk=1
Outasmsrc=1158
Outasmoptall=1
Common=0
Outerrlistchk=0
Outerrlist=1174
Xreference=0
Preprocess=0
Prenocomment=0
Predefine=0
Preifdef=1
Preinclude=1
Preline=1
Prenumber=1
Formfeed=0
Columns=132
Lines=0
Tablength=8
Ansi=0
Cpraspras=1
Commentnest=0
Intunexpand=0
Kanjicode=1210
Verbose=0
CommandFile=0
Warninglevel=1
Startupchk=1
Fixation=0
FarROMization=0
Objectsel=1305
Librarychk=1
Floatingpoint=0
Muldivunit=1
Mulunit=1
Startup=s0rm.rel
Library1=cl0rdm.lib
Library2=cl0rm.lib
Library3=cl0rmf.lib
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