TSボード、実機、TS白箱統合作業中

いろいろダイエット中
・実機で音量がひっくり返る件
・電源周りを実装
・LEDを七色にする前にバックアップ


git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_mcu@125 013db118-44a6-b54f-8bf7-843cb86687b1
This commit is contained in:
N2232 2010-04-13 08:39:43 +00:00
parent ebd37460a4
commit ca9bdc8a67
25 changed files with 1423 additions and 1400 deletions

View File

@ -173,13 +173,33 @@ task_status_immed acc_hosu_set( )
str_send_buf[1] = 0x00; // ctrl2 HPF:normal, filterd, HPF for IRQ : dis/dis, HPF coeff:norm
#ifdef _MODEL_WM0_
# ifdef _MODEL_WM0_TEG2_CTRC_
str_send_buf[2] = 0x02; // 回路が一部違う
# else
str_send_buf[2] = 0x10; // 3 IRQ pol :Active HI, Drive:Pushpull,
/// IRQ2flg latch: auto clear after read, IRQ2 conf: IRQ( fall,shock,...)
/// 1 : auto clear after read, conf: data ready
# endif
#else
# ifdef _MODEL_CTR_
if( system_status.model == MODEL_TS_BOARD )
{
// TS Final SoC
str_send_buf[2] = 0x02; // 3 IRQ pol :Active HI, Drive:Pushpull,
}
else
{
// 実機&派生種、白箱
str_send_buf[2] = 0x10; // 3 IRQ pol :Active HI, Drive:Pushpull,
}
# else
// TS( type T )
str_send_buf[2] = 0x02; // 3 IRQ pol :Active HI, Drive:Pushpull,
/// IRQ2flg latch: auto clear after read, IRQ2 conf: IRQ( fall,shock,...)
/// 1 : auto clear after read, conf: data ready
# endif
#endif
str_send_buf[3] = 0x80; // ctrl3 block update:enable, MSB first, scale: +-2G(default), selftest: dis

View File

@ -9,11 +9,22 @@
#include "led.h"
// ===================================================== //
bit adc_updated;
u8 adc_raw_vol;
u8 adc_raw_dep;
// ===================================================== //
extern void nop8();
// ===================================================== //
#define INTERVAL_TSK_ADC 3
/* ========================================================
ADC設定と
@ -24,7 +35,7 @@ u8 adc_raw_dep;
VOL
PM_BT_DET,_P PM_init
PM_BT_DET,_P BT_init
8tics毎に呼ばれADCを停止します
 
@ -57,6 +68,8 @@ static const u8 slider_to_codec[64] =
73, 72, 71, 70, 69, 68, 67, 66
};
void tsk_adc( )
{
static u8 task_interval = 0;
@ -129,47 +142,27 @@ void tsk_adc( )
}
}
}
vreg_ctr[ VREG_C_DBG1 ] = vreg_ctr[ VREG_C_TUNE ];
vreg_ctr[ VREG_C_DBG2 ] = adc_raw_dep; // dbg
// Volume /////////////////////////////////////
{
// 似非ヒステリシスを付けて64段
u8 temp;
static u8 vol_old;
static u8 force_update_vol;
if( abs( adc_raw_vol - vol_old ) >= 2 ) // 生値でこれくらいずれたら更新
if( ( abs( adc_raw_vol - vol_old ) >= 2 ) // 生値でこれくらいずれたら更新(似非ヒステリシス)
|| ( --force_update_vol == 0 ) ) // ポーリング
{
// if( vreg_ctr[ VREG_C_SND_VOL ] != ( adc_raw_vol / 4 ) )
{
vol_old = adc_raw_vol;
// レジスタ更新
vreg_ctr[ VREG_C_SND_VOL ] = ( adc_raw_vol / 4 );
vreg_twl[ REG_TWL_INT_ADRS_VOL ] = adc_raw_vol / ( 256 / 32 ); // ←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値でよい
// codecに伝える
iic_mcu_write_a_byte( IIC_SLA_CODEC, CODEC_REG_VOL, slider_to_codec[ adc_raw_vol / 4 ] );
// codecに伝える
iic_mcu_write_a_byte( IIC_SLA_CODEC, CODEC_REG_VOL, slider_to_codec[ adc_raw_vol / 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 - adc_raw_vol ) / 4 ] ); // todo
#endif
// set_irq( VREG_C_IRQ0, REG_BIT_VR_SNDVOL_CHANGE ); // 割り込み廃止
force_update_vol = 100;
}
}
{
// ポーリング
if( --force_update_vol == 0 )
{
vol_old = adc_raw_vol;
// レジスタ更新
// vreg_ctr[ VREG_C_SND_VOL ] = temp;
// vreg_twl[ REG_TWL_INT_ADRS_VOL ] = adc_raw_vol / ( 256 / 32 ); // ←adc値でよい
// codecに伝える
iic_mcu_write_a_byte( IIC_SLA_CODEC, CODEC_REG_VOL, slider_to_codec[ adc_raw_vol / 4 ] );
force_update_vol = 100;
}
force_update_vol = 200;
}
}
@ -203,14 +196,7 @@ void tsk_adc( )
ADPC = 0x06; // ADCポートのセレクト
ADS = ADC_SEL_TUNE;
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
nop8();
ADCS = 1; // AD開始。 /// ここまで  までに1us=8clk以上開ける
ADIF = 0;
@ -265,7 +251,7 @@ __interrupt void int_adc( )
switch ( ADS )
{
/*
case ( ADC_SEL_AMB_BRIT ):
case ( ADC_SEL_AMB_BRIT ): // 環境明るさ
vreg_ctr[ VREG_C_AMBIENT_BRIGHTNESS ] = ADCRH;
break;
*/
@ -281,20 +267,28 @@ case ( ADC_SEL_AMB_BRIT ):
case ( ADC_SEL_VOL ):
hist_snd_vol[index] = ADCRH;
adc_raw_vol = getmean3( hist_snd_vol );
// TWL用レジスタ(32段)の更新。アトミックな処理として扱わないと不都合が。
/// 割り込みはHorizonを通してコマンドを発行されるのを待てばよい
#ifdef _MODEL_CTR_
if( system_status.model == MODEL_TS_BOARD )
{
adc_raw_vol = getmean3( hist_snd_vol );
}
else
{
adc_raw_vol = ( 255 - getmean3( hist_snd_vol ));
}
#else
adc_raw_vol = getmean3( hist_snd_vol );
#endif
break;
case ( ADC_SEL_BATT_TEMP ):
hist_bt_temp[index] = ADCRH;
raw_adc_temperature = getmean3( hist_bt_temp );
renge_task_immed_add( PM_bt_temp_update );
renge_task_immed_add( BT_temp_update );
break;
case ( ADC_SEL_BATT_DET ):
// vreg_ctr[ VREG_C_DBG_BATT_DET ] = ADCRH;
// todo
// 呼ばれない
break;
}
@ -304,12 +298,10 @@ case ( ADC_SEL_AMB_BRIT ):
if( ADS != ADC_SEL_BATT_TEMP )
{ // 電池判別は電源投入の一回のみ
ADS += 1; // 次のチャンネル
BT_TEMP_P = 1; // 電池温度監視スタート
}
else
{
ADCEN = 0; // 止めてしまう
BT_TEMP_P = 0; // 電池温度監視スタート
adc_updated = 1;
index = ( index == 2 ) ? 0 : ( index + 1 );
}
@ -343,10 +335,10 @@ u8 get_adc( u8 ch )
NOP();
ADCS = 1; // AD開始。 /// ここまで↑ に、1us以上開ける
ADMK = 0;
while( ADIF == 0 ){;}
temp = ADCRH;
ADCEN = 0;
ADMK = 0;
return ( temp );
}

View File

@ -1,80 +1,73 @@
#ifndef _bt_params_h_
#define _bt_params_h_
/* ========================================================
======================================================== */
enum BATT_VENDER {
BT_PANASONIC, // open
BT_UNKNOWN1,
BT_UNKNOWN2,
BT_UNKNOWN3,
BT_UNKNOWN4,
BT_UNKNOWN5,
BT_UNKNOWN6, // gnd
BT_MAXELL
};
static const u8 BT_PARAM[][64] = {
// ID = 0 GND 白箱
/// パラメータ無し
// ID = 0 GND マクセル
{
0xAD, 0x30, 0xAE, 0x70, 0xB0, 0x00, 0xB3, 0x00,
0xB4, 0x70, 0xB5, 0xA0, 0xB7, 0x80, 0xBA, 0x00,
0xBB, 0x90, 0xBD, 0x00, 0xBE, 0x00, 0xBF, 0xF0,
0xC3, 0x00, 0xC5, 0xC0, 0xC8, 0x00, 0xCA, 0xC0,
0x04, 0x00, 0x12, 0x00, 0x0C, 0x10, 0x24, 0x00,
0x10, 0xD0, 0x1B, 0xF0, 0x0A, 0xF0, 0x08, 0xE0,
0x0C, 0xF0, 0x08, 0xC0, 0x08, 0xB0, 0x07, 0xF0,
0x0B, 0x00, 0x05, 0xD0, 0x02, 0x00, 0x09, 0x00
},
{ // ID = 1 120 ohm
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
},
{ // ID = 2 360 hom
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
},
{ // ID = 3 750 ohm
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
},
{ // ID = 4 1.3kohm
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
},
{ // ID = 5 2.7kohm パナ
0xAD, 0x30, 0xAE, 0x70, 0xB0, 0x00, 0xB3, 0x00,
0xB4, 0x70, 0xB5, 0xA0, 0xB7, 0x80, 0xBA, 0x00,
0xAD, 0x30, 0xAE, 0x70, 0xB0, 0x00, 0xB3, 0x00,
0xB4, 0x70, 0xB5, 0xA0, 0xB7, 0x80, 0xBA, 0x00,
0xBB, 0x90, 0xBD, 0x00, 0xBE, 0x00, 0xBF, 0xF0,
0xC3, 0x00, 0xC5, 0xC0, 0xC8, 0x00, 0xCA, 0xC0,
0xBB, 0x90, 0xBD, 0x00, 0xBE, 0x00, 0xBF, 0xF0,
0xC3, 0x00, 0xC5, 0xC0, 0xC8, 0x00, 0xCA, 0xC0,
0x04, 0x00, 0x12, 0x00, 0x0C, 0x10, 0x24, 0x00,
0x10, 0xD0, 0x1B, 0xF0, 0x0A, 0xF0, 0x08, 0xE0,
0x04, 0x00, 0x12, 0x00, 0x0C, 0x10, 0x24, 0x00,
0x10, 0xD0, 0x1B, 0xF0, 0x0A, 0xF0, 0x08, 0xE0,
0x0C, 0xF0, 0x08, 0xC0, 0x08, 0xB0, 0x07, 0xF0,
0x0B, 0x00, 0x05, 0xD0, 0x02, 0x00, 0x09, 0x00
},
0x0C, 0xF0, 0x08, 0xC0, 0x08, 0xB0, 0x07, 0xF0,
0x0B, 0x00, 0x05, 0xD0, 0x02, 0x00, 0x09, 0x00
},
{ // ID = 6 8.2kohm
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
},
{ // ID = 7 マクセル
0xAD, 0x30, 0xAE, 0x70, 0xB0, 0x00, 0xB3, 0x00,
0xB4, 0x70, 0xB5, 0xA0, 0xB7, 0x80, 0xBA, 0x00,
0xBB, 0x90, 0xBD, 0x00, 0xBE, 0x00, 0xBF, 0xF0,
0xC3, 0x00, 0xC5, 0xC0, 0xC8, 0x00, 0xCA, 0xC0,
0x04, 0x00, 0x12, 0x00, 0x0C, 0x10, 0x24, 0x00,
0x10, 0xD0, 0x1B, 0xF0, 0x0A, 0xF0, 0x08, 0xE0,
0x0C, 0xF0, 0x08, 0xC0, 0x08, 0xB0, 0x07, 0xF0,
0x0B, 0x00, 0x05, 0xD0, 0x02, 0x00, 0x09, 0x00
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
}
// ID = 7 白箱
/// パラメータ無し
};
static const unsigned char BT_PANA_RCOMP = 135;
static const float BT_PANA_TEMPCOUP = 0.3;
static const float BT_PANA_TEMPCODN = 0.5;
#endif

View File

@ -27,13 +27,12 @@ enum model_
MODEL_JIKKI = 0,
MODEL_TS_BOARD,
MODEL_SHIROBAKO,
MODEL_JIKKI_NOBATT,
MODEL_RESERVED1,
MODEL_RESERVED2,
MODEL_RESERVED3,
};
// タスクシステムの状態情報など
typedef struct
{
@ -43,7 +42,7 @@ typedef struct
unsigned char dipsw1:1;
unsigned char dipsw2:1;
unsigned char reboot:1;
enum model_ model;
enum model_ model;
}
system_status_;

View File

@ -1,7 +1,7 @@
#ifndef __config__
#define __config__
#define _debug_
//#define _debug_
//#define _debug_led_
@ -19,30 +19,16 @@
//#define _MODEL_TEG2_
// <20>ªTEG2 CPU <20>{ Type-T
//#define _MODEL_WM0_
#define _MODEL_TS0_
//#define _MODEL_WM0_TEG2_CTRC_
//#define _MODEL_TS0_
// <20>ªTEG2 CPU <20>{ Type-C
//#define _MODEL_CTR_TS_
// <20>ªFINAL SoC <20>{ Type-C
//#define _MODEL_CTR_JIKKI_
#define _MODEL_CTR_
//#define _SW_HOME_ENABLE_
// ---------------------------------- //
#ifdef _MODEL_CTR_TS_
#ifdef _MODEL_CTR_JIKKI_
#endif
#endif
#ifdef _MODEL_CTR_TS_
#define _MODEL_CTR_
#endif
#ifdef _MODEL_CTR_JIKKI_
#define _MODEL_CTR_
#endif
// ---------------------------------- //
#ifdef _MODEL_TEG2_

View File

@ -4,7 +4,6 @@
'09 Apr
======================================================== */
#include "incs.h"
#include "accero.h"
#ifdef _MCU_BSR_
// #ifdef _MODEL_TS0_ || _MODEL_WM0_

View File

@ -7,7 +7,7 @@
#pragma di
#pragma ei
#pragma nop
#pragma inline // memcpy()をインライン展開する
#pragma inline // memcpy()をインライン展開する(の方が小さい!)
#include "incs.h"
#include "i2c_mcu.h"
@ -72,11 +72,35 @@ u8 iic_send_wo_dma_len;
u8 iic_mcu_bus_status; // 一文字リードの時はデータを返す。
// ステータスが必要ならこっちを呼んで
// ========================================================
void nop8()
{
// 実は nop11 位なのだが
}
static u8 iic_mcu_is_ready()
{
if( iic_mcu_initialized == 0 )
{
#ifdef _debug_
iic_mcu_start( );
#else
while( 1 )
{
NOP();
}
#endif
}
while( iic_mcu_busy )
{
NOP( );
}
iic_mcu_busy = 1;
}
/* ========================================================
1
@ -87,22 +111,7 @@ u8 iic_mcu_read_a_byte( u8 SLA, u8 adrs )
{
u8 dat;
if( iic_mcu_initialized == 0 )
{
#ifdef _debug_
iic_mcu_start( );
#else
while( 1 )
{
}
#endif
}
while( iic_mcu_busy )
{
NOP( );
}
iic_mcu_busy = 1;
iic_mcu_is_ready();
iic_mcu_bus_status = ERR_OK;
@ -157,33 +166,18 @@ u8 iic_mcu_read_a_byte( u8 SLA, u8 adrs )
err iic_mcu_read( u8 slave, u8 adrs, u8 len, u8 * dest )
{
//*
// 使用中なら待つ
if( iic_mcu_initialized == 0 )
{
#ifdef _debug_
iic_mcu_start( );
#if 1
iic_mcu_is_ready();
#else
while( 1 )
{
}
// 使用中なら帰る
if( iic_mcu_initialized == 0 ){
return(0x80);
}
if( iic_mcu_busy != 0 ){
return( 3 );
}
#endif
}
while( iic_mcu_busy )
{
NOP( );
}
/*/
// 使用中なら帰る
if( iic_mcu_initialized == 0 ){
return(0x80);
}
if( iic_mcu_busy != 0 ){
return( 3 );
}
//*/
iic_mcu_busy = 1;
// スタートコンディションとスレーブの呼び出し、レジスタアドレスの送信
if( iic_mcu_call_slave( slave ) != 0 )
{
@ -236,31 +230,20 @@ err iic_mcu_read( u8 slave, u8 adrs, u8 len, u8 * dest )
 iic_mcu_write 
======================================================== */
err iic_mcu_write_a_byte( u8 SLA, u8 adrs, u8 dat )
{
if( iic_mcu_initialized == 0 )
{
#ifdef _debug_
iic_mcu_start( );
#else
while( 1 )
{
}
#endif
}
while( iic_mcu_busy )
{
NOP( );
}
iic_mcu_busy = 1;
#if 0
// ラッパー
temp = dat;
iic_mcu_wo_dma = 1;
return ( iic_mcu_write( SLA, adrs, 1, &temp ) );
}
#else
// 文字の時はDMAとか起動しないでさっさと終わらせる
iic_mcu_is_ready();
// スタートコンディションとスレーブの呼び出し...
IICMK10 = 1;
if( iic_mcu_call_slave( SLA ) != 0 )
@ -295,23 +278,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 )
{
//*
// 使用中なら待つ
if( iic_mcu_initialized == 0 )
{
#ifdef _debug_
iic_mcu_start( );
#else
while( 1 )
{
}
#endif
}
while( iic_mcu_busy )
{
NOP( );
}
/*/
iic_mcu_is_ready();
#if 0
// 使用中なら帰る
if( iic_mcu_initialized == 0 ){
return(0x80);
@ -319,9 +289,9 @@ err iic_mcu_write( u8 slave, u8 adrs, u8 len, void * src )
if( iic_mcu_busy != 0 ){
return( 3 );
}
//*/
iic_mcu_busy = 1;
// スタートコンディションとスレーブの呼び出し...
#endif
// スタートコンディションとスレーブの呼び出し...
IICMK10 = 1;
IICIF10 = 0;
if( iic_mcu_call_slave( slave ) != 0 )
@ -406,34 +376,10 @@ __interrupt void int_dma1( )
SOE0 = 0; // 受信の時はもっと前に「も」設定してる。(NACK出力)
SO0 = 0x0000 | TAUS_MASK; // SCL
nop8();
/*
NOP( );
NOP( );
NOP( );
NOP( );
#ifdef _OVERCLOCK_
NOP( );
NOP( );
NOP( );
NOP( );
NOP( );
#endif
*/
SO0 = 0x0400 | TAUS_MASK; // SCL
nop8();
/*
NOP( );
NOP( );
NOP( );
NOP( );
#ifdef _OVERCLOCK_
NOP( );
NOP( );
NOP( );
NOP( );
NOP( );
#endif
*/
SO0 = 0x0404 | TAUS_MASK;
}
IICMK10 = 1;
@ -467,34 +413,10 @@ __interrupt void int_iic10( )
SOE0 = 0; // 受信の時はもっと前に「も」設定してる。(NACK出力)
SO0 = 0x0000 | TAUS_MASK; // SCL
nop8();
/*
NOP( );
NOP( );
NOP( );
NOP( );
#ifdef _OVERCLOCK_
NOP( );
NOP( );
NOP( );
NOP( );
NOP( );
#endif
*/
SO0 = 0x0400 | TAUS_MASK; // SCL
nop8();
/*
NOP( );
NOP( );
NOP( );
NOP( );
#ifdef _OVERCLOCK_
NOP( );
NOP( );
NOP( );
NOP( );
NOP( );
#endif
*/
SO0 = 0x0404 | TAUS_MASK;
}
iic_mcu_wo_dma = 0;
@ -555,20 +477,8 @@ static err iic_mcu_send_a_byte( u8 dat )
static void iic_mcu_send_st( )
{
SO0 &= ~0x0004; // SDA
nop8();
/*
NOP( );
NOP( );
NOP( );
NOP( );
#ifdef _OVERCLOCK_
NOP( );
NOP( );
NOP( );
NOP( );
NOP( );
#endif
*/
nop8();
SO0 &= ~0x0400; // SCL
SOE0 = 0x0004; // ハード制御へ
@ -585,35 +495,11 @@ static void iic_mcu_send_re_st( )
{
ST0 |= 0x0004;
SO0 |= 0x0400 | TAUS_MASK; // ( SDA = H ), SCL -> H
nop8();
/*
NOP( );
NOP( );
NOP( );
NOP( );
#ifdef _OVERCLOCK_
NOP( );
NOP( );
NOP( );
NOP( );
NOP( );
#endif
*/
nop8();
SOE0 &= ~0x0004; // ( SCL = H ), SDA -> L
nop8();
/*
NOP( );
NOP( );
NOP( );
NOP( );
#ifdef _OVERCLOCK_
NOP( );
NOP( );
NOP( );
NOP( );
NOP( );
#endif
*/
nop8();
iic_mcu_send_st( );
}
@ -628,35 +514,11 @@ static void iic_mcu_send_sp( )
ST0 = 0x0004;
SOE0 = 0; // 受信の時はもっと前に「も」設定してる。(NACK出力)
SO0 = 0x0000 | TAUS_MASK; // SCL
nop8();
/*
NOP( );
NOP( );
NOP( );
NOP( );
#ifdef _OVERCLOCK_
NOP( );
NOP( );
NOP( );
NOP( );
NOP( );
#endif
*/
nop8();
SO0 = 0x0400 | TAUS_MASK; // SCL
nop8();
/*
NOP( );
NOP( );
NOP( );
NOP( );
#ifdef _OVERCLOCK_
NOP( );
NOP( );
NOP( );
NOP( );
NOP( );
#endif
*/
nop8();
SO0 = 0x0404 | TAUS_MASK;
}
@ -672,22 +534,13 @@ void iic_mcu_start( )
NOP( ); // 2clkもしくは、DSTn==0をポーリング
NOP( );
DEN1 = 0;
I2C_PU = 1;
I2C_PU_on();
wait_ms( 10 ); // 立ち上がるのに50us位かかる
SAU0EN = 1;
nop8();
/*
NOP( );
NOP( );
NOP( );
NOP( );
#ifdef _OVERCLOCK_
NOP( );
NOP( );
NOP( );
NOP( );
NOP( );
#endif
*/
nop8();
SPS0 = 0x0000; // シリアルユニットのクロック0。(8M/2)/1
SMR02 = bSMR0n_FIXEDBIT | bMD0n2; // 簡易I2Cに設定
#ifdef _OVERCLOCK_
@ -728,7 +581,7 @@ void iic_mcu_stop( )
{;
} // DMA動作中はもう少し待つ
iic_mcu_send_re_st( ); // SCL,SDAをLLにする
I2C_PU = 0;
I2C_PU_off();
SAU0EN = 0;
iic_mcu_initialized = 0;
}

View File

@ -16,7 +16,6 @@ extern bit iic_mcu_wo_dma;
extern u8 iic_mcu_bus_status;
// ========================================================
err iic_mcu_read( u8 SLA, u8 adrs, u8 len, u8 * dest );
u8 iic_mcu_read_a_byte( u8 SLA, u8 adrs );
@ -24,6 +23,7 @@ u8 iic_mcu_read_a_byte( u8 SLA, u8 adrs );
err iic_mcu_write( u8 SLA, u8 adrs, u8 len, void * src );
err iic_mcu_write_a_byte( u8 SLA, u8 adrs, u8 dat );
// ↓その通信が完了したら解除されます。
#define iic_mcu_set_wo_dma() { while( iic_mcu_busy ){;} iic_mcu_wo_dma = 1; }

View File

@ -12,6 +12,7 @@
#ifndef _incs_h_
#define _incs_h_
// ↓ 歩数計で_pc_とで切り替えてます
#define _mcu_
#include "jhl_defs.h"
@ -29,8 +30,6 @@
#include "accero.h"
//=========================================================
err firm_update( );
#endif

View File

@ -34,5 +34,5 @@
//=========================================================
err firm_update( );
err firm_restore( );
void firm_update( );
void firm_restore( );

View File

@ -67,61 +67,75 @@
//#pragma interrupt INTTM06 fn_inttm06
//#pragma interrupt INTTM07 fn_inttm07
//#define _irq_debug_
/****************************************************/
/* 未使用時のダミー関数定義 */
/****************************************************/
__interrupt void fn_intwdti( )
{
#ifdef _irq_debug_
while( 1 )
{
NOP();
}
#endif
}
__interrupt void fn_intlvi( )
{
#ifdef _irq_debug_
while( 1 )
{
NOP();
}
#endif
}
__interrupt void fn_intp0(){
while( 1 )
#ifdef _irq_debug_
while( 1 )
{
NOP();
}
#endif
}
__interrupt void fn_intp1( )
{
#ifdef _irq_debug_
while( 1 )
{
NOP();
}
#endif
} //
__interrupt void fn_intp2( )
{
#ifdef _irq_debug_
while( 1 )
{
NOP();
}
#endif
}
__interrupt void fn_intp3( )
{
#ifdef _irq_debug_
while( 1 )
{
NOP();
}
#endif
}
__interrupt void intp21_RFTx( )
{
#ifdef _irq_debug_
while( 1 )
{
NOP();
}
#endif
}
@ -133,151 +147,221 @@ __interrupt void intp21_RFTx( )
__interrupt void fn_intcmp0( )
{
#ifdef _irq_debug_
while( 1 )
{
NOP();
}
#endif
}
__interrupt void fn_intcmp1( )
{
#ifdef _irq_debug_
while( 1 )
{
NOP();
}
#endif
}
__interrupt void fn_intdma0( )
{
#ifdef _irq_debug_
while( 1 )
{
NOP();
}
#endif
}
//__interrupt void fn_intdma1(){} // i2c_mcu.cにある
__interrupt void fn_intst0( )
{
#ifdef _irq_debug_
while( 1 )
{
NOP();
}
#endif
}
/* __interrupt void fn_intcsi00(){} */
__interrupt void fn_intsr0( )
{
#ifdef _irq_debug_
while( 1 )
{
NOP();
}
#endif
}
/* __interrupt void fn_intcsi01(){} */
__interrupt void fn_intsre0( )
{
#ifdef _irq_debug_
while( 1 )
{
NOP();
}
#endif
}
__interrupt void fn_intst1( )
{
#ifdef _irq_debug_
while( 1 )
{
NOP();
}
#endif
}
/* __interrupt void fn_intcsi10(){} */
//__interrupt void fn_intiic10(){ while(1){} }
__interrupt void fn_intsr1( )
{
#ifdef _irq_debug_
while( 1 )
{
NOP();
}
#endif
}
__interrupt void fn_intsre1( )
{
#ifdef _irq_debug_
while( 1 )
{
NOP();
}
#endif
}
//__interrupt void fn_intiica(){} // i2c.cにある
/* __interrupt void fn_inttm00(){} *//* sub.cにて定義 */
__interrupt void fn_inttm01( )
{
#ifdef _irq_debug_
while( 1 )
{
NOP();
}
#endif
}
__interrupt void fn_inttm02( )
{
#ifdef _irq_debug_
while( 1 )
{
NOP();
}
#endif
}
__interrupt void fn_inttm03( )
{
#ifdef _irq_debug_
while( 1 )
{
NOP();
}
#endif
}
//__interrupt void fn_intad(){ while(1){} } // adc.c
__interrupt void fn_intrtc( )
{
#ifdef _irq_debug_
while( 1 )
{
NOP();
}
#endif
}
//__interrupt void int_rtcint(){} // rtc.cにある
//__interrupt void fn_intkr(){} // main.c
__interrupt void fn_intmd( )
{
#ifdef _irq_debug_
while( 1 )
{
NOP();
}
#endif
}
__interrupt void fn_inttm04( )
{
#ifdef _irq_debug_
while( 1 )
{
NOP();
}
#endif
}
__interrupt void fn_inttm05( )
{
#ifdef _irq_debug_
while( 1 )
{
NOP();
}
#endif
}
__interrupt void fn_inttm06( )
{
#ifdef _irq_debug_
while( 1 )
{
NOP();
}
#endif
}
__interrupt void fn_inttm07( )
{
#ifdef _irq_debug_
while( 1 )
{
NOP();
}
#endif
}
/* ========================================================
======================================================== */
__interrupt void int_kr( )
{
// 起きるだけ
}
/* ========================================================
ext dc
======================================================== */
__interrupt void intp4( )
{
// 起きるだけ
}
/* ========================================================
shell close
======================================================== */
__interrupt void intp5( )
{
// 起きるだけ
}

View File

@ -57,7 +57,6 @@ static fsl_u08 fsl_MK2H_bak_u08; /* }
void FSL_Open( void );
void FSL_Close( void );
void hdwinit( void );
void power_save( );
static void hdwinit2( );
extern void main_loop( );
@ -70,40 +69,49 @@ void main( )
while( 1 )
{
WDT_Restart( );
if( RTCEN )
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 );
// ↑I2Cの初期化後に行う
hdwinit2( );
}
else
{
u8 pwup_delay0 = 0;
u8 pwup_delay1 = 0;
do
{ // 電池接続時、16ms待ってみる(チャタリング対策)
pwup_delay0 += 1;
do
u8 my_resf = RESF; // ←読むと消え、生存区間の関係
if( ( my_resf & ( 0x10 | 0x80 ) ) != 0 )
// 0x10 : WDRF,WDTでリセット
// 0x80 : TRAP
{
if( ( my_resf & 0x10 ) != 0 )
{
pwup_delay1 += 1;
IRQ0_neg; // 一瞬上げて落とし直す。
#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 );
// ↑I2Cの初期化後に行う
}
while( pwup_delay1 != 0 ); // u16にするとコンパイラが怒るんだが…。
system_status.reboot = 1;
}
while( pwup_delay0 != 0 );
else
{
// 通常の電源投入
u8 pwup_delay0 = 0;
u8 pwup_delay1 = 0;
hdwinit2( );
do
{ // 電池接続時、16ms待ってみる(チャタリング対策)
pwup_delay0 += 1;
do
{
pwup_delay1 += 1;
}
while( pwup_delay1 != 0 ); // u16にするとコンパイラが怒るんだが…。
}
while( pwup_delay0 != 0 );
}
hdwinit2( );
}
// ファームの整合性チェック //
@ -118,8 +126,14 @@ void main( )
comp += ( *( __far u8 * )( MGC_LOAD + i ) == *( u8 * )( MGC_FOOT + i ) ) ? 0 : 1;
}
if( *( u8 * )( MGC_FOOT ) == 0xFF ) // 消去済のまま
{
comp += 1;
}
if( comp != 0 )
{
DBG_LED_WIFI_2_on
// ファームリストアを試みる
firm_restore( );
// 帰ってこない。リセットをかける。
@ -133,30 +147,6 @@ void main( )
/* ========================================================
======================================================== */
__interrupt void int_kr( )
{
}
/* ========================================================
ext dc
======================================================== */
__interrupt void intp4( )
{
}
/* ========================================================
shell close
======================================================== */
__interrupt void intp5( )
{
}
// ========================================================
@ -200,12 +190,12 @@ void hdwinit2( )
P14 = 0b00000001;
#endif
#ifdef _MODEL_TS0_
P0 = 0b00000001;
P0 = 0b00000011;
P3 = 0b00000111; // 簡易I2Cは出力ラッチを1にする
P14 = 0b00000000;
#endif
#ifdef _MODEL_CTR_
P0 = 0b00000001;
P0 = 0b00000011;
P3 = 0b00000111; // 簡易I2Cは出力ラッチを1にする
P14 = 0b00000000;
#endif
@ -291,8 +281,11 @@ void hdwinit2( )
// ポート入力モード・レジスタ設定 /////////////////////
// [0:通常入力バッファ 1:TTL入力バッファ]
#if 0
// デフォルト値
PIM3 = 0b00000000;
PIM7 = 0b00000000;
#endif
// ポート出力モード・レジスタ設定
// [0:通常出力モード 1:N-chオープン・ドレーン出力]
@ -317,16 +310,17 @@ void hdwinit2( )
MK2L = 0xFF;
#endif
PR00L = 0b11111111; /* 割り込み優先順位、全て低位(LV3) */
PR10L = 0b11111111;
PR00H = 0b11111111;
PR10H = 0b11111111;
PR01L = 0b11111111;
PR11L = 0b11111110;
PR01H = 0b11111111;
PR11H = 0b11111111;
PR02L = 0b11111111;
PR12L = 0b11111111;
#if 0
// デフォルト値
PR00 = 0xFFFF; /* 割り込み優先順位、全て低位(LV3) */
PR01 = 0xFFFF;
PR10 = 0xFFFF;
PR11 = 0xFFFE;
// PR11H = 0b11111111;
// PR11L = 0b11111110;
PR02L = 0xFF;
PR12L = 0xFF;
#endif
/*--- 外部割込の有効エッジ設定 ---*/
#ifdef _MCU_BSR_

View File

@ -1,4 +0,0 @@
#include "jhl_defs.h"
err firm_update( );

View File

@ -14,6 +14,7 @@ static 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_";
// 0Dまでこれを使用

View File

@ -15,7 +15,6 @@
#include "led.h"
#include "adc.h"
// ========================================================
static void read_dipsw( );
@ -40,8 +39,6 @@ void main_loop( void )
iic_mcu_start( );
EI( );
PM_init();
if( system_status.reboot )
{
#ifdef _PMIC_TWL_

View File

@ -26,190 +26,11 @@ u8 raw_adc_temperature;
u8 rcomp;
float temp_co_up;
float temp_co_dn;
BT_VENDER battery_manufacturer = BT_VENDER_NOT_CHECKED;
// ========================================================
static void PM_get_batt_left();
/******************************************************//**
PMIC達の初期化
\n
\n ICのセット
\n
\n
\n
\n PM_BT_DET,_P
*********************************************************/
#define swap_endian_16( x ) (unsigned int)( x << 8 | x >> 8 )
void PM_init( )
{
u8 temp;
u8 origParam[4];
union{
u16 _u16; // ↓でわかるように、little endian です。注意。
struct{
u8 lsb;
u8 msb;
}chars;
}dat_16;
system_status.model = MODEL_JIKKI;
wait_ms( 150 );
// -1. なんかおかしい… リセットをかけてみる
dat_16._u16 = swap_endian_16( 0x5400 ); // reset
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_COMMAND, 2, &dat_16 ); // こいつはNACKを返す
// 0. バッテリ残量IC クイックスタート
dat_16._u16 = swap_endian_16( 0x4000 ); // quick start
if( iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_MODE, 2, &dat_16 ) != ERR_SUCCESS )
{
vreg_ctr[ VREG_C_STATUS_1 ] |= REG_BIT_GASGAUGE_ERR;
system_status.model = MODEL_TS_BOARD;
}
else
{
// 1. ロック解除
dat_16._u16 = swap_endian_16( 0x4057 ); // unlock key
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_LOCK, 2, &dat_16 );
// 2. 初期パラメータを一時保存
iic_mcu_read( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_RCOMP, 4, origParam );
// 3. 一時的にOCVを変更
dat_16._u16 = swap_endian_16( 0xD4C0 ); // マジックナンバー的なもの。メーカー指定
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_OCV, 2, &dat_16 );
// 4. 一時的にRCOMPを変更
dat_16._u16 = swap_endian_16( 0xFF00 );
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_RCOMP, 2, &dat_16 );
// 電池メーカーの識別
BT_DET_P = 1;
temp = ( u8 ) ( ( get_adc( ADC_SEL_BATT_DET ) >> 5 ) -1 ); // 識別値0の白箱の分、インデックス合わせ
BT_DET_P = 0;
iic_mcu_set_wo_dma( );
// 5.メーカー別パラメータのロード
switch ( temp )
{
case( BT_VENDER_SHIROBAKO ):
system_status.model = MODEL_SHIROBAKO;
break;
case( BT_VENDER_PANA ):
case( BT_VENDER_MAXELL ):
default:
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_BT_PARAM, 64, &BT_PARAM[0] );
rcomp = BT_PANA_RCOMP;
temp_co_up = BT_PANA_TEMPCOUP;
temp_co_dn = BT_PANA_TEMPCODN;
break;
}
// 6. 150ms以上待つ
wait_ms( 200 );
// 7. OCVに「とある値」を書く
dat_16._u16 = swap_endian_16( 0xD4C0 );
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_OCV, 2, &dat_16 );
// 8. 150600ms待つ。600msは厳守
wait_ms( 200 );
// 9. SOCを読む。ベリファイのため。
temp = iic_mcu_read_a_byte( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_SOC );
if( 0x6D == temp || temp == 0x6E || temp == 0x6F ){
// カスタムモデル書き込みOK
}else{
// 失敗だったらリトライするのか?
}
// 10.元のRCOMPとOCVを書き戻す
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_RCOMP, 4, origParam );
// 11. ロック
dat_16._u16 = swap_endian_16( 0x0000 ); // lock key
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_LOCK, 2, &dat_16 );
// おしまい //
}
// 電池温度測定
BT_TEMP_P = 1; // 電池温度監視スタート
raw_adc_temperature = get_adc( ADC_SEL_BATT_TEMP ); // 温度のtemp。
renge_task_immed_add( PM_bt_temp_update );
// PMIC バージョン読み出し
// temp = iic_mcu_read_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_VER );
// vreg_ctr[ VREG_C_PM_INFO ] = temp;
// デバッグ用は別にまとめた
}
/* ========================================================
raw_adc_temperatureに入っている値を
ICにセット
todo
======================================================== */
task_status_immed PM_bt_temp_update( )
{
static u8 count = 0; // たまにしか書きに行かない
static u8 rawdat_old;
static s16 temperature; // todo
u16 newrcomp;
/*
- 10kΩ分圧点の時
T[] = 81.48 - 111.97 x ratio
TDK T = 81.406 - 111.81 x ratio
*/
if( rawdat_old != raw_adc_temperature ){
DBG_P_n = 1;
temperature = 81.45 - 111.9 * raw_adc_temperature/256.0;
vreg_ctr[VREG_C_BT_TEMP] = (u8)temperature;
DBG_P_n = 0;
}
// 時々書きにゆく
if( count == 0 )
{
DBG_P_n = 1;
if( vreg_ctr[VREG_C_BT_TEMP] > 20 )
{
newrcomp = -( ( temperature - 20 ) * temp_co_up );
}
else
{
newrcomp = -( ( temperature - 20 ) * temp_co_dn );
}
newrcomp += rcomp;
newrcomp = swap_endian_16( (u16)newrcomp );
DBG_P_n = 0;
if( iic_mcu_write
( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_RCOMP, 2, &newrcomp ) == ERR_SUCCESS )
{
rawdat_old = raw_adc_temperature;
}
}
count += 1;
return ( ERR_SUCCESS );
}
#ifdef _PMIC_TWL_
u8 blset;
#endif
@ -378,7 +199,7 @@ SoC
if( blset != 0 ) // BLを付ける場合はウェイトを挟まないとPWMが来ておらず
/// シャットダウンすることがある
{
wait_ms( 10 );
wait_ms( 16 );
}
iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_BL, blset );
@ -465,24 +286,7 @@ task_status_immed tski_vcom_set( )
err PM_sys_pow_on( )
{
#ifdef _PMIC_CTR_
u8 temp;
// 電池温度測定
while( ADCEN != 0 )
{;
}
BT_TEMP_P = 1;
vreg_ctr[VREG_C_BT_TEMP] = get_adc( ADC_SEL_BATT_TEMP );
BT_TEMP_P = 0;
PM_bt_temp_update( ); // 温度のtemp。 残量ICに行きます
// 残量チェック
PM_get_batt_left(); // 先に、PM_init()が実行されている必要があります。(大丈夫)
// todo: batt remain -> volatage?
if( vreg_ctr[VREG_C_BT_REMAIN] < 0 )
{
return ( 1 );
}
u8 err;
// 電源順次立ち上げ
// PM_reset_ast( ); 不要 PM_LDSW_onまかせ
@ -493,11 +297,12 @@ err PM_sys_pow_on( )
wait_ms( 1 );
#ifdef _PM_BUG_
iic_mcu_write_a_byte( IIC_SLA_PMIC, 0x22, 0xCA ); // バグ持ちPMIC対策 OVP解除
iic_mcu_write_a_byte( 0x22, 0xCA ); // バグ持ちPMIC対策 OVP解除
#endif
wait_ms( DELAY_PM_TW_PWUP );
PM_VDD_normMode();
PM_VDD_on( );
wait_ms( DELAY_PM_TW_PWUP );
@ -505,17 +310,28 @@ err PM_sys_pow_on( )
wait_ms( DELAY_PM_TW_PWUP );
PM_VDD_normMode();
#ifdef _PM_BUG_
iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_POW_SAVE, 0x03 ); // バグ持ちPMIC対策 強制PWM
#endif
if( PM_chk_LDSW( ) == 0 )
// 無事電源が起動したかチェック。
#ifdef _PMIC_CTR_
if( !PM_chk_LDSW() )
{
return ( ERR_ERR );
return ( ERR_ERR ); // reset1はほっといて良い
}
FCRAM_RST_neg;
PM_reset_neg();
#else
RESET1_neg;
if( !RESET1_n )
{
RESET1_ast;
return ( ERR_ERR ); // reset1はほっといて良い
}
#endif
FCRAM_RST_neg;
RESET2_neg;
/*
wait_ms( 100 );
{
@ -572,9 +388,6 @@ err PM_sys_pow_on( )
/* ========================================================
OFFシーケンス
todo:
@ -582,16 +395,23 @@ err PM_sys_pow_on( )
err PM_sys_pow_off( )
{
#ifdef _PMIC_CTR_
// PM_BL_set( REG_BIT_CMD_BL_U_OFF | REG_BIT_CMD_BL_L_OFF );
// PM_LCD_off( ); // TCOM,VCS OFF も消してきます。
// if( RESET1_n )
if( PM_chk_LDSW() )
{
// 異常時は呼ばない
PM_BL_set( REG_BIT_CMD_BL_U_OFF | REG_BIT_CMD_BL_L_OFF );
PM_LCD_off( ); // TCOM,VCS OFF も消してきます。
wait_ms( 50 + 10 );
PM_reset_ast( );
}
PM_reset_ast( );
RESET2_ast;
FCRAM_RST_ast;
PM_off( );
// PM_off( ); ↓まとめて落としてしまえ
PM_LDSW_off( );
#else
if( RESET1_n )
@ -615,6 +435,184 @@ err PM_sys_pow_off( )
/*=========================================================
extDC割り込み
OFFから起こす
(pm)
=========================================================*/
__interrupt void intp4_extdc( )
{
;
}
/*=========================================================
(misc)
=========================================================*/
__interrupt void intp5_shell( )
{
;
}
/*=========================================================
PMICへのコマンド書き込み
=========================================================*/
__interrupt void intp6_PM_irq( )
{
if( system_status.pwr_state == ON )
{
EI();
renge_task_immed_add( ntr_pmic_comm );
}
}
/* ========================================================
PMICからの割り込みを受けてNTR PMIC互換レジスタからリード
======================================================== */
task_status_immed ntr_pmic_comm( )
{
static u8 reg_shadow;
u8 reg1_old;
u8 irq_work = 0;
reg1_old = reg_shadow;
reg_shadow = iic_mcu_read_a_byte( IIC_SLA_CODEC, CODEC_REG_PM );
if( iic_mcu_bus_status != ERR_SUCCESS )
{
return ( ERR_FINISED );
}
DI( );
// バックライト 上 ////////////////////////////////////
if( ( ( reg1_old ^ reg_shadow ) & REG_BIT_TWL_REQ_BL_U ) != 0 )
{
if( ( reg_shadow & REG_BIT_TWL_REQ_BL_U ) == 0 ) // 消えた
{
// irq_work = REG_BIT_TWL_BL_U_OFF;
set_irq( VREG_C_IRQ2, REG_BIT_TWL_BL_U_OFF );
}
else
{
// irq_work = REG_BIT_TWL_BL_U_ON;
set_irq( VREG_C_IRQ2, REG_BIT_TWL_BL_U_ON );
}
}
// バックライト 下
if( ( ( reg1_old ^ reg_shadow ) & REG_BIT_TWL_REQ_BL_L ) != 0 )
{
if( ( reg_shadow & REG_BIT_TWL_REQ_BL_L ) == 0 ) // 消えた
{
// irq_work = REG_BIT_TWL_BL_L_OFF;
set_irq( VREG_C_IRQ2, REG_BIT_TWL_BL_L_OFF );
}
else
{
// irq_work = REG_BIT_TWL_BL_L_ON;
set_irq( VREG_C_IRQ2, REG_BIT_TWL_BL_L_ON );
}
}
#if 0
irq_work &= ~VREG_C_IRQ_MASK2;
// set_irq 相当品
if( irq_work != 0 )
{
u8 tot;
DI();
vreg_ctr[ VREG_C_IRQ2 ] |= irq_work;
EI();
IRQ0_neg; // 一瞬上げてパルスを送り直す
tot = 0;
while( !IRQ0 && ( ++tot != 0 ) ){;} // O.Dなのでちゃんとあがるのを待つ IRQ_mcu がLに縛られてると困る(基板不良)
IRQ0_ast;
}
#endif
#if 0
// バックライト設定
// 勝手に消しておく
/// 今のところさらに細かくは分けないけど…
if( ( reg_shadow & ( REG_BIT_TWL_REQ_BL_U | REG_BIT_TWL_REQ_BL_U ) ) == 0 )
{
vreg_ctr[ VREG_C_COMMAND2 ] = ( REG_BIT_CMD_BL_U_OFF | REG_BIT_CMD_BL_U_OFF );
renge_task_immed_add( tski_PM_BL_set );
}
#endif
// offリクエスト //////////////////////////////////////
if( ( reg_shadow & REG_BIT_TWL_REQ_OFF_REQ ) != 0 )
{
set_irq( VREG_C_IRQ2, REG_BIT_TWL_OFF_REQ );
}
// リセットリクエスト /////////////////////////////////
if( ( reg_shadow & REG_BIT_TWL_REQ_RST_REQ ) != 0 )
{
// CODECバグ回避
// リセット単品でなかったら無視
// codec 修正済↓
// if( ( reg1_old ^ reg_shadow ) == REG_BIT_TWL_REQ_RST_REQ )
{
set_irq( VREG_C_IRQ2, REG_BIT_TWL_RESET_REQ );
}
}
// バックライトをマスクして書き戻す
EI( );
if( ( reg_shadow & ( REG_BIT_TWL_REQ_OFF_REQ | REG_BIT_TWL_REQ_RST_REQ )) != 0 )
{
reg_shadow &= ~( REG_BIT_TWL_REQ_OFF_REQ | REG_BIT_TWL_REQ_RST_REQ );
iic_mcu_write_a_byte( IIC_SLA_CODEC, CODEC_REG_PM, reg_shadow );
}
return ( ERR_FINISED );
}
/**********************************************************
command2
  ERR_SUCCESSしか返さないが
**********************************************************/
task_status_immed tski_PM_LCD_on()
{
PM_LCD_on();
return( ERR_SUCCESS );
}
task_status_immed tski_PM_LCD_off()
{
PM_LCD_off();
return( ERR_SUCCESS );
}
task_status_immed tski_PM_BL_set()
{
u8 cmd_BL; // ↓volatileとか付けなくても大丈夫みたい
do
{
cmd_BL = vreg_ctr[VREG_C_COMMAND2];
PM_BL_set( cmd_BL ); // マスク済み
}
while( cmd_BL != vreg_ctr[VREG_C_COMMAND2] ); // <- PM_BL_setが更新する
vreg_ctr[VREG_C_COMMAND2] = 0;
return( ERR_SUCCESS );
}
/* ========================================================
@ -705,156 +703,253 @@ void tsk_batt( )
// 電池残量 //
PM_get_batt_left();
// dubug monitor
if( system_status.pwr_state == ON )
{
BT_get_left();
}
return;
}
/********************************************************
/*=========================================================
extDC割り込み
OFFから起こす
(pm)
=========================================================*/
__interrupt void intp4_extdc( )
        
  
       
  
         
          
  
   
 
***********************************************************/
#define swap_endian_16( x ) (unsigned int)( x << 8 | x >> 8 )
void BT_init( )
{
;
}
u8 temp;
u8 origParam[4];
union{
u16 _u16; // ↓でわかるように、little endian です。注意。
struct{
u8 lsb;
u8 msb;
}chars;
}dat_16;
/*=========================================================
(misc)
=========================================================*/
__interrupt void intp5_shell( )
{
;
}
/*=========================================================
PMICへのコマンド書き込み
=========================================================*/
__interrupt void intp6_PM_irq( )
{
if( system_status.pwr_state == ON )
// 電池温度測定(TS,白箱判定も兼ねる) //
while( ADCEN != 0 )
{
EI();
renge_task_immed_add( ntr_pmic_comm );
NOP();
}
raw_adc_temperature = get_adc( ADC_SEL_BATT_TEMP );
// 電池メーカーの識別
temp = get_adc( ADC_SEL_BATT_DET );
BT_DET_P = 0;
if( temp > 233 )
battery_manufacturer = BT_VENDER_OPEN;
else if( temp > 197 )
battery_manufacturer = BT_VENDER_6;
else if( temp > 158 )
battery_manufacturer = BT_VENDER_PANA;
else if( temp > 123 )
battery_manufacturer = BT_VENDER_4;
else if( temp > 79 )
battery_manufacturer = BT_VENDER_3;
else if( temp > 33 )
battery_manufacturer = BT_VENDER_2;
else if( temp > 5 )
battery_manufacturer = BT_VENDER_1;
else
battery_manufacturer = BT_VENDER_MAXELL;
/*
// -1. なんかおかしい… リセットをかけてみる
dat_16._u16 = swap_endian_16( 0x5400 ); // reset
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_COMMAND, 2, &dat_16 ); // こいつはNACKを返す
*/
/*
// 0. バッテリ残量IC クイックスタート
dat_16._u16 = swap_endian_16( 0x4000 ); // quick start
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_MODE, 2, &dat_16 )
*/
// 1. ロック解除
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 )
{
// 残量IC有り //
if( battery_manufacturer < BT_VENDER_OPEN )
{
// 電池何かしらあり //
system_status.model = MODEL_JIKKI;
}
else
{
// 電池無し //
if( raw_adc_temperature < 4 )
{
// 白箱 //
system_status.model = MODEL_SHIROBAKO;
}
else
{
// 実機、バッテリ無し
system_status.model = MODEL_JIKKI_NOBATT;
}
}
}
else
{
vreg_ctr[ VREG_C_STATUS_1 ] |= REG_BIT_GASGAUGE_ERR;
// 残量IC NACK
if( raw_adc_temperature > 0xF0 )
{
// TS //
system_status.model = MODEL_TS_BOARD;
}
else
{
// 実機、残量IC NACK( バッテリ無しまたは残量IC故障 )
// 現状では、起動はさせとくが…
// todo?
system_status.model = MODEL_JIKKI;
}
}
if( system_status.model == MODEL_JIKKI )
{
// wait_ms( 5 + 1 ); I2C_mの初期化時にウェイト入れてるので不要
// 2. 初期パラメータを一時保存
iic_mcu_read( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_RCOMP, 4, origParam );
// 3. 一時的にOCVを変更
dat_16._u16 = swap_endian_16( 0xDA20 ); // マジックナンバー的なもの。メーカー指定
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_OCV, 2, &dat_16 );
// 4. 一時的にRCOMPを変更
dat_16._u16 = swap_endian_16( 0xFF00 );
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_RCOMP, 2, &dat_16 );
// 5.メーカー別パラメータのロード
{
iic_mcu_set_wo_dma( );
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_BT_PARAM, 64, &BT_PARAM[ battery_manufacturer ] );
rcomp = BT_PANA_RCOMP;
temp_co_up = BT_PANA_TEMPCOUP;
temp_co_dn = BT_PANA_TEMPCODN;
}
// 6. 150ms以上待つ
wait_ms( 150 + 15 );
// 7. OCVに「とある値」を書く
dat_16._u16 = swap_endian_16( 0xDA20 );
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_OCV, 2, &dat_16 );
// 8. 150600ms待つ。600msは厳守
wait_ms( 150 + 15 );
// 9. SOCを読む。ベリファイのため。
temp = iic_mcu_read_a_byte( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_SOC );
if( 1 ){
// カスタムモデル書き込みOK
}else{
// 失敗だったらリトライするのか?
}
// 10.元のRCOMPとOCVを書き戻す
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_RCOMP, 4, origParam );
// 11. ロック
dat_16._u16 = swap_endian_16( 0x0000 ); // lock key
iic_mcu_write( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_LOCK, 2, &dat_16 );
// おしまい //
BT_temp_update( ); // 温度のtemp。 残量ICに行きます
}
// どの機体で走ってても不可を同じくらいにするため、ADCタスクを登録
// 電池温度監視スタート
raw_adc_temperature = get_adc( ADC_SEL_BATT_TEMP ); // 温度のtemp。
renge_task_immed_add( BT_temp_update );
// PMIC バージョン読み出し
// temp = iic_mcu_read_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_VER );
// vreg_ctr[ VREG_C_PM_INFO ] = temp;
/// デバッグ用は別にまとめた
}
extern u8 temp_debug_3;
/* ========================================================
PMICからの割り込みを受けてNTR PMIC互換レジスタからリード
raw_adc_temperatureに入っている値を
ICにセット
todo
======================================================== */
task_status_immed ntr_pmic_comm( )
task_status_immed BT_temp_update( )
{
static u8 reg_shadow;
u8 reg1_old;
u8 irq_work = 0;
static u8 count = 0; // たまにしか書きに行かない
reg1_old = reg_shadow;
reg_shadow = iic_mcu_read_a_byte( IIC_SLA_CODEC, CODEC_REG_PM );
if( iic_mcu_bus_status != ERR_SUCCESS )
{
return ( ERR_FINISED );
static u8 rawdat_old;
static s16 temperature; // todo
u16 newrcomp;
/*
- 10kΩ分圧点の時
T[] = 81.48 - 111.97 x ratio
TDK T = 81.406 - 111.81 x ratio
*/
if( rawdat_old != raw_adc_temperature ){
DBG_P_n = 1;
temperature = 81.45 - 111.9 * raw_adc_temperature/256.0;
vreg_ctr[VREG_C_BT_TEMP] = (u8)temperature;
DBG_P_n = 0;
}
DI( );
// バックライト 上 ////////////////////////////////////
if( ( ( reg1_old ^ reg_shadow ) & REG_BIT_TWL_REQ_BL_U ) != 0 )
// 時々書きにゆく
if( count == 0 )
{
if( ( reg_shadow & REG_BIT_TWL_REQ_BL_U ) == 0 ) // 消えた
DBG_P_n = 1;
if( vreg_ctr[VREG_C_BT_TEMP] > 20 )
{
// irq_work = REG_BIT_TWL_BL_U_OFF;
set_irq( VREG_C_IRQ2, REG_BIT_TWL_BL_U_OFF );
newrcomp = -( ( temperature - 20 ) * temp_co_up );
}
else
{
// irq_work = REG_BIT_TWL_BL_U_ON;
set_irq( VREG_C_IRQ2, REG_BIT_TWL_BL_U_ON );
newrcomp = -( ( temperature - 20 ) * temp_co_dn );
}
}
newrcomp += rcomp;
// バックライト 下
if( ( ( reg1_old ^ reg_shadow ) & REG_BIT_TWL_REQ_BL_L ) != 0 )
{
if( ( reg_shadow & REG_BIT_TWL_REQ_BL_L ) == 0 ) // 消えた
newrcomp = swap_endian_16( (u16)newrcomp );
DBG_P_n = 0;
if( iic_mcu_write
( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_RCOMP, 2, &newrcomp ) == ERR_SUCCESS )
{
// irq_work = REG_BIT_TWL_BL_L_OFF;
set_irq( VREG_C_IRQ2, REG_BIT_TWL_BL_L_OFF );
}
else
{
// irq_work = REG_BIT_TWL_BL_L_ON;
set_irq( VREG_C_IRQ2, REG_BIT_TWL_BL_L_ON );
rawdat_old = raw_adc_temperature;
}
}
count += 1;
#if 0
irq_work &= ~VREG_C_IRQ_MASK2;
// set_irq 相当品
if( irq_work != 0 )
{
u8 tot;
DI();
vreg_ctr[ VREG_C_IRQ2 ] |= irq_work;
EI();
IRQ0_neg; // 一瞬上げてパルスを送り直す
tot = 0;
while( !IRQ0 && ( ++tot != 0 ) ){;} // O.Dなのでちゃんとあがるのを待つ IRQ_mcu がLに縛られてると困る(基板不良)
IRQ0_ast;
}
#endif
#if 0
// バックライト設定
// 勝手に消しておく
/// 今のところさらに細かくは分けないけど…
if( ( reg_shadow & ( REG_BIT_TWL_REQ_BL_U | REG_BIT_TWL_REQ_BL_U ) ) == 0 )
{
vreg_ctr[ VREG_C_COMMAND2 ] = ( REG_BIT_CMD_BL_U_OFF | REG_BIT_CMD_BL_U_OFF );
renge_task_immed_add( tski_PM_BL_set );
}
#endif
// offリクエスト //////////////////////////////////////
if( ( reg_shadow & REG_BIT_TWL_REQ_OFF_REQ ) != 0 )
{
set_irq( VREG_C_IRQ2, REG_BIT_TWL_OFF_REQ );
}
// リセットリクエスト /////////////////////////////////
if( ( reg_shadow & REG_BIT_TWL_REQ_RST_REQ ) != 0 )
{
// CODECバグ回避
// リセット単品でなかったら無視
// codec 修正済↓
// if( ( reg1_old ^ reg_shadow ) == REG_BIT_TWL_REQ_RST_REQ )
{
set_irq( VREG_C_IRQ2, REG_BIT_TWL_RESET_REQ );
}
}
// バックライトをマスクして書き戻す
EI( );
if( ( reg_shadow & ( REG_BIT_TWL_REQ_OFF_REQ | REG_BIT_TWL_REQ_RST_REQ )) != 0 )
{
reg_shadow &= ~( REG_BIT_TWL_REQ_OFF_REQ | REG_BIT_TWL_REQ_RST_REQ );
iic_mcu_write_a_byte( IIC_SLA_CODEC, CODEC_REG_PM, reg_shadow );
}
return ( ERR_FINISED );
return ( ERR_SUCCESS );
}
@ -863,9 +958,9 @@ task_status_immed ntr_pmic_comm( )
ICから残量を取得し
 ICが無い99%
         status_1で確認可能
 PM_init()
 BT_init()
**********************************************************/
static void PM_get_batt_left(){
void BT_get_left(){
if(( vreg_ctr[ VREG_C_STATUS_1 ] & REG_BIT_GASGAUGE_ERR ) == 0 )
{
// 電池残量の取得
@ -878,7 +973,6 @@ static void PM_get_batt_left(){
vreg_ctr[ VREG_C_BT_REMAIN_FINE ] = temp[1];
// todo 閾値を超えたら割り込み
}
vreg_ctr[ VREG_C_BT_VOLTAGE ] = iic_mcu_read_a_byte( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_VCELL );
}
else
@ -891,40 +985,3 @@ static void PM_get_batt_left(){
( vreg_ctr[ VREG_C_BT_REMAIN ] < 5 )? 1 : 0 ); // 1で電池切れ
}
/**********************************************************
command2
  ERR_SUCCESSしか返さないが
**********************************************************/
task_status_immed tski_PM_LCD_on()
{
PM_LCD_on();
return( ERR_SUCCESS );
}
task_status_immed tski_PM_LCD_off()
{
PM_LCD_off();
return( ERR_SUCCESS );
}
task_status_immed tski_PM_BL_set()
{
u8 cmd_BL; // ↓volatileとか付けなくても大丈夫みたい
do
{
cmd_BL = vreg_ctr[VREG_C_COMMAND2];
PM_BL_set( cmd_BL ); // マスク済み
}
while( cmd_BL != vreg_ctr[VREG_C_COMMAND2] );
vreg_ctr[VREG_C_COMMAND2] = 0;
return( ERR_SUCCESS );
}

View File

@ -1,6 +1,7 @@
#ifndef __PM__
#define __PM__
// #include "batt_params.h"
#define IIC_SLA_PMIC 0x84
#define IIC_SLA_BT_GAUGE 0x6C
@ -32,12 +33,20 @@ enum BT_GAUGE_REG_ADRS
BT_GAUGE_REG_COMMAND = 0xFE
};
enum BT_VENDER
typedef enum
{
BT_VENDER_SHIROBAKO = 0,
BT_VENDER_PANA = 3,
BT_VENDER_MAXELL = 7
};
BT_VENDER_MAXELL = 0, // ƒVƒ‡<C692>[ƒg
BT_VENDER_1, // 120
BT_VENDER_2, // 360
BT_VENDER_3, // 750
BT_VENDER_4, // 1.3k
BT_VENDER_PANA = 5, // 2.7k
BT_VENDER_6, // 8.2k
BT_VENDER_OPEN = 7, // open
BT_VENDER_NOT_CHECKED = 0xFF,
}BT_VENDER;
//=========================================================
@ -81,9 +90,9 @@ enum BT_VENDER
#define PM_REG_BIT_VDD_PWM 0b00000000
#define DELAY_PM_TW_PWUP 16
#define DELAY_PM_TSS_50B_AND_TCOM 17
#define DELAY_PM_5V_TO_TCOM 17
#define DELAY_PM_TW_PWUP 16 + 2
#define DELAY_PM_TSS_50B_AND_TCOM 17 + 1
#define DELAY_PM_5V_TO_TCOM 17 + 1
#define DELAY_PM_TCOM_TO_VCS 3
#define DELAY_PM_VCS_TO_BL ( 17 + 5 )
#define DELAY_PM_LCD_OFF ( 50 + 1 )
@ -91,20 +100,25 @@ enum BT_VENDER
//=========================================================
extern u8 raw_adc_temperature;
extern BT_VENDER battery_manufacturer;
//=========================================================
err PM_sys_pow_on( );
err PM_sys_pow_off( );
err PM_bt_auth( );
void PM_init( );
err PM_LCD_vcom_set( );
err PM_LCD_on( );
void PM_LCD_off( );
err PM_BL_set( u8 );
task_status_immed PM_bt_temp_update( );
void BT_init( );
void BT_get_left();
task_status_immed BT_temp_update( );
task_status_immed tski_vcom_set( );
task_status_immed tski_PM_LCD_on();
task_status_immed tski_PM_LCD_off();

View File

@ -69,7 +69,7 @@ const u8 fsl_low_voltage_u08 = 1;
// ========================================================
static void FSL_Open( void );
static void FSL_Close( void );
err firm_restore( );
void firm_restore( );
static err my_FSL_Init();
static err firm_duplicate( __far u8 * p_rom, u8 block_dest );
@ -93,7 +93,7 @@ extern u16 pool[];
    NG  
======================================================== */
err firm_update( )
void firm_update( )
{
u8 target_block;
u8 split_write_count; // ブロックへちまちま書き込むカウンタ
@ -162,11 +162,11 @@ err firm_update( )
!= FSL_OK )
{
// 書き込み後のチェックエラー
// リブートののち、リストア
// FSL_ForceReset(); // リセット
FSL_SwapBootCluster( );
// FSL_Close( );
return ( ERR_ERR );
// リストア
firm_duplicate( ( __far u8 * ) 0x5000,
FIRM_TOP );
FSL_ForceReset();
// 戻ってこない //
}
}
@ -196,19 +196,18 @@ err firm_update( )
}
if( comp == 0 )
{
// OK!
FSL_InvertBootFlag( );
FSL_SwapBootCluster( ); // リセットせずに頭から。FSL_Closeは不要
// FSL_ForceReset(); // リセット
// FSL_SwapActiveBootCluster(); // ←スワップされてしまうので、続けられず暴走!
// 戻ってこない //
}
else
{
// データエラー
// リブートののち、リストア
// FSL_ForceReset(); // リセット
FSL_SwapBootCluster( );
// FSL_Close( );
// データ(マジックナンバーしか見てない)エラー
// リストア
firm_duplicate( ( __far u8 * ) 0x5000,
FIRM_TOP );
FSL_ForceReset(); // リセット
// 戻ってこない //
}
}
@ -223,7 +222,7 @@ err firm_update( )
 
======================================================== */
err firm_restore( )
void firm_restore( )
{
my_FSL_Init();
@ -233,15 +232,12 @@ err firm_restore( )
*/
firm_duplicate( ( __far u8 * ) 0x5000,
FIRM_TOP );
// todo
//  リストア失敗したら、LEDちかちかとかさせて、サービス送りにしてもらう
// リブート
// スワップは不要です!
FSL_InvertBootFlag( );
FSL_SwapBootCluster();
// FSL_ForceReset( );
return ( ERR_SUCCESS );
}
@ -361,7 +357,7 @@ static err firm_duplicate( __far u8 * p_rom,
// 1ブロック書き込み完了。内部電圧チェックを行う
while( FSL_IVerify( target_block ) != FSL_OK ){
// todo
// todo
;
}
}
@ -390,13 +386,15 @@ static err my_FSL_Init()
task_status_immed tski_mcu_reset()
{
WDT_Restart( );
// 普通に再起動
my_FSL_Init();
FSL_SwapBootCluster();
// FSL_ForceReset(); // リセット
FSL_Close( );
// FSL_SwapBootCluster();
FSL_ForceReset(); // リセット
// 保険? //
WDTE = 0xAA; // WDTで再起動テスト向け
// WDTE = 0xAA; // WDTで再起動テスト向け
return( ERR_SUCCESS ); // no reach
}

View File

@ -21,7 +21,7 @@ void tsk_debug( )
if( system_status.pwr_state == ON_TRIG ){
#ifdef _MODEL_WM0_
PM_CHG_TIMEOUT_DISABLE(); // /WL_RST に配線されています
P5.0 = 1; // /WL_RST に配線されています
#endif
#ifndef _MODEL_CTR_
iic_mcu_write_a_byte( IIC_SLA_DCP, 0x08, 0x80 ); // ACR←0x80 揮発モードへ
@ -66,7 +66,7 @@ void tsk_debug2( )
// iic_mcu_write_a_byte( IIC_SLA_DBG_MONITOR, 1, vreg_ctr[ VREG_C_STATUS ] );
// iic_mcu_write_a_byte( IIC_SLA_DBG_MONITOR, 0, vreg_ctr[ VREG_C_ACC_ZH ] );
iic_mcu_write( IIC_SLA_DBG_MONITOR, 0, 4, &str[0] );
// iic_mcu_write( IIC_SLA_DBG_MONITOR, 0, 4, &str[0] );
}
return;
}

View File

@ -247,9 +247,7 @@ task_status_immed tski_mcu_info_read()
break;
case( 2 ): // 電池メーカーの識別
BT_DET_P = 1;
IICA = ( u8 ) ( get_adc( ADC_SEL_BATT_DET ) >> 5 );
BT_DET_P = 0;
IICA = battery_manufacturer;
break;
case( 3 ): // ガスゲージバージョン

View File

@ -13,7 +13,7 @@
#include "rtc.h"
#include "sw.h"
#include "adc.h"
#include "self_flash.h"
//=========================================================
@ -76,21 +76,36 @@ void tsk_sys( )
timeout = 0;
BT_DET_P = 1; // チャージに時間が掛かるので先に上げておく
BT_TEMP_P = 1;
// 電源投入 //
iic_mcu_start( );
// ↓で電池残量ICの起動待ちウェイトなどがあります。
PM_init( ); // 電池残量ICの設定
BT_init( ); // 実機やバッテリの判定、電池残量ICの設定
if( system_status.model == MODEL_JIKKI_NOBATT )
{
renge_task_interval_run_force = 1;
system_status.pwr_state = OFF_TRIG;
return;
}
// 残量チェック
BT_get_left(); // 先に、BT_init()が実行されている必要があります。(大丈夫)
if( vreg_ctr[VREG_C_BT_REMAIN] < 5 )
{
renge_task_interval_run_force = 1;
system_status.pwr_state = OFF_TRIG;
return;
}
if( PM_sys_pow_on( ) != ERR_SUCCESS )
{ // 電源起動不可エラー
renge_task_interval_run_force = 1;
iic_mcu_stop( );
system_status.pwr_state = OFF_TRIG;
return;
}
PM_CHG_TIMEOUT_ENABLE();
// IRQ0_active;
#else
vreg_ctr[ VREG_C_STATUS_1 ] |= REG_BIT_GASGAUGE_ERR;
@ -135,6 +150,21 @@ void tsk_sys( )
{
set_irq( VREG_C_IRQ0, REG_BIT_IRQ_WDT_RESET );
}
{
// WDTリセット時、I2Cの初期化まで割り込み保留
// ほんとはここにべた書きしたくないが...
if( ( vreg_ctr[ VREG_C_MCU_STATUS ] & REG_BIT_STATUS_WDT_RESET )
/*
if( vreg_ctr[ VREG_C_IRQ0 ]
| vreg_ctr[ VREG_C_IRQ0 ]
| vreg_ctr[ VREG_C_IRQ0 ]
| vreg_ctr[ VREG_C_IRQ0 ]
*/
!= 0 )
{
set_irq( VREG_C_IRQ0, REG_BIT_IRQ_WDT_RESET );
}
}
IIC_twl_Init( );
RTC_32k_on( );
@ -145,6 +175,9 @@ void tsk_sys( )
MK0 = INT_MSK0_RSV;
MK1 = INT_MSK1_RSV;
iic_mcu_start();
#ifdef _MCU_BSR_
// MK2 = ~( INT_MSK2_IIC_TWL | INT_MSK2_WIFI_TX_BSR | INT_MSK2_CODEC_PMIRQ );
// PMK21 = 0; // wifi 使わない
@ -204,7 +237,6 @@ void tsk_sys( )
return;
}
PM_CHG_TIMEOUT_ENABLE();
LED_stop( );
IIC_ctr_Stop( );
IIC_twl_Stop( );
@ -345,7 +377,6 @@ static void chk_emergencyExit(){
/* ========================================================
CPUからのスリープ要求
 

View File

@ -10,36 +10,35 @@
#ifdef _debug_
// 8ドットのLED
#define IIC_SLA_8LEDS 0x42
#define IIC_8LEDS_REG_DO 1
#define IIC_8LEDS_REG_DI 2
#define IIC_8LEDS_REG_DIR 3
# define IIC_SLA_8LEDS 0x42
# define IIC_8LEDS_REG_DO 1
# define IIC_8LEDS_REG_DI 2
# define IIC_8LEDS_REG_DIR 3
// 7セグ 4バイト版
#define IIC_SLA_DBG_MONITOR 0x44
# define IIC_SLA_DBG_MONITOR 0x44
#endif
#ifdef _debug_led_
#define DBG_LED_WIFI_2_on { PM2.4 = 0; P2.4 = 1; }
#define DBG_LED_WIFI_2_off { PM2.4 = 1; P2.4 = 0; }
#define DBG_LED_WIFI_2_toggle ( P2.4 ^= 1 )
# define DBG_LED_WIFI_2_on { PM2.4 = 0; P2.4 = 1; }
# define DBG_LED_WIFI_2_off { PM2.4 = 1; P2.4 = 0; }
# define DBG_LED_WIFI_2_toggle ( P2.4 ^= 1 )
#else
#define DBG_LED_WIFI_2_on ;
#define DBG_LED_WIFI_2_off ;
#define DBG_LED_WIFI_2_toggle ;
# define DBG_LED_WIFI_2_on ;
# define DBG_LED_WIFI_2_off ;
# define DBG_LED_WIFI_2_toggle ;
#endif
#ifdef _PMIC_TWL_
#define PM_TEG_PWSW P7.5 // TEGÌÝ
#define PM_TEG_LCD_dis( val ) ( P7.6 = val ) // TEGÌÝ
# define PM_TEG_PWSW P7.5 // TEGÌÝ
# define PM_TEG_LCD_dis( val ) ( P7.6 = val ) // TEGÌÝ
#else
#define SLP_ACK P7.7
# define SLP_ACK P7.7
#endif
@ -146,14 +145,6 @@
#define BT_CHG_DISABLE() ( P4.2 = 1 )
#endif
#ifdef PM_CCIC_TIM
#define PM_CHG_TIMEOUT_ENABLE() ( P5.0 = 0 )
#define PM_CHG_TIMEOUT_DISABLE() ( P5.0 = 1 )
#else
#define PM_CHG_TIMEOUT_ENABLE() ;
#define PM_CHG_TIMEOUT_DISABLE() ;
#endif
// 充電中(in)
#define BT_CHG_n P5.1
@ -187,7 +178,27 @@
#define LED_CHARGE P2.4
#define I2C_PU P5.3
#ifdef _MODEL_TEG2_
#define I2C_PU_on() P5.3 = 1
#define I2C_PU_off() P5.3 = 0
#endif
#ifdef _MODEL_TS0_
#define I2C_PU_on() P5.3 = 1
#define I2C_PU_off() P5.3 = 0
#endif
#ifdef _MODEL_WM0_
#define I2C_PU_on() P5.3 = 1
#define I2C_PU_off() P5.3 = 0
#endif
#ifdef _MODEL_CTR_
#define I2C_PU_on() { PM14 |= 0x03; P5 |= 0x09; P14 |= 0x03; PM14 &= ~0x03; }
#define I2C_PU_off() { PM14 |= 0x03; P5 &= 0x09; }
#endif
//#define I2C_M_SDA P3.1 // SDA10
//#define I2C_M_SCL P3.2 // SCL10
@ -220,7 +231,7 @@
#define ACCEL_INT1 P2.5
#endif
#ifdef _MODEL_TS0_ || _MODEL_CTR_
#ifdef _MODEL_TS0_
#define ACC_VALID P20.5
#define ACCEL_INT1 P2.5
#endif

View File

@ -71,8 +71,8 @@ void vreg_ctr_write( u8 adrs, u8 data )
{
case ( VREG_C_MCU_STATUS ):
vreg_ctr[adrs] = data;
vreg_twl[ REG_TWL_INT_ADRS_MODE ] = ( ( data & 0xC0 ) >> 6 );
vreg_ctr[adrs] = data;
break;
case ( VREG_C_VCOM_T ):
@ -86,7 +86,6 @@ void vreg_ctr_write( u8 adrs, u8 data )
vreg_ctr[adrs] = data;
break;
case ( VREG_C_DBG3 ):
vreg_ctr[adrs] = data;
if( ( vreg_ctr[VREG_C_DBG1] == 'j' )
&& ( vreg_ctr[VREG_C_DBG2] == 'h' )
&& ( data == 'l' ) )
@ -94,6 +93,7 @@ void vreg_ctr_write( u8 adrs, u8 data )
renge_task_immed_add( tski_firm_update );
IICAMK = 1;
}
vreg_ctr[adrs] = data;
break;
case ( VREG_C_IRQ_MASK0 ):
@ -105,11 +105,11 @@ void vreg_ctr_write( u8 adrs, u8 data )
break;
case ( VREG_C_COMMAND0 ):
vreg_ctr[adrs] |= data;
if( data != 0 )
{
renge_task_immed_add( do_command0 );
}
vreg_ctr[adrs] |= data;
break;
case ( VREG_C_COMMAND2 ):
@ -128,8 +128,8 @@ void vreg_ctr_write( u8 adrs, u8 data )
/// 今のところさらに細かくは分けないけど…
if(( data & REG_BITS_CMD_BL ) != 0 )
{
vreg_ctr[adrs] = ( data & REG_BITS_CMD_BL );
renge_task_immed_add( tski_PM_BL_set );
vreg_ctr[adrs] = ( data & REG_BITS_CMD_BL );
}
break;
@ -216,18 +216,18 @@ void vreg_ctr_write( u8 adrs, u8 data )
break;
case ( VREG_C_RTC_COMP ):
vreg_ctr[adrs] = data;
SUBCUD = data;
vreg_ctr[adrs] = data;
break;
case ( VREG_C_RTC_ALARM_MIN ):
vreg_ctr[adrs] = ( data & 0x7F );
rtc_alarm_dirty = 1;
vreg_ctr[adrs] = ( data & 0x7F );
break;
case ( VREG_C_RTC_ALARM_HOUR ):
vreg_ctr[adrs] = ( data & 0x3F );
rtc_alarm_dirty = 1;
vreg_ctr[adrs] = ( data & 0x3F );
break;
// 書くだけでよい
@ -245,13 +245,13 @@ void vreg_ctr_write( u8 adrs, u8 data )
case ( VREG_C_ACC_CONFIG ):
vreg_ctr[adrs] = data;
renge_task_immed_add( acc_hosu_set );
vreg_ctr[adrs] = data;
break;
case ( VREG_C_ACC_R_ADRS ):
vreg_ctr[adrs] = data;
renge_task_immed_add( acc_read );
vreg_ctr[adrs] = data;
break;
case ( VREG_C_ACC_W_ADRS ):
@ -259,8 +259,8 @@ void vreg_ctr_write( u8 adrs, u8 data )
break;
case ( VREG_C_ACC_W_BUF ):
vreg_ctr[adrs] = data;
renge_task_immed_add( acc_write );
vreg_ctr[adrs] = data;
break;
case ( VREG_C_ACC_HOSU_L ):
@ -277,19 +277,19 @@ void vreg_ctr_write( u8 adrs, u8 data )
break;
case ( VREG_C_COMMAND3 ):
vreg_ctr[adrs] = data;
switch ( data )
{
case ( 'r' ):
// 割り込みルーチンからFSLライブラリを呼ぶのは禁止のため
// renge_task_immed_add( tski_mcu_reset );
// break;
renge_task_immed_add( tski_mcu_reset );
break;
case ( 'w' ):
// WDTで再起動テスト向け
WDTE = 0xAA;
break;
}
vreg_ctr[adrs] = data;
}
return;
}

View File

@ -102,12 +102,12 @@ enum REG_TWL_ADRS_INT
#define reg_wifi_led_blink ( vregs[ REG_TWL_INT_ADRS_WIFI ] & 0x02 )
typedef enum twl_camLed_mode_{
typedef enum {
TWL_CAMLED_OFF,
TWL_CAMLED_ON,
TWL_CAMLED_BLINK,
TWL_CAMLED_DEF_ON
}camLed_mode;
}twl_camLed_mode;
/* ========================================================================= */

File diff suppressed because it is too large Load Diff