ctr_mcu/trunk/vreg_twl.c
N2232 3da96fcad8 0.23
VolをTWLからも書けるように
 スライダとの後着優先になる
Codecの「書いたVolと違う値にセットされる(MAX?)」バグワークアラウンドのため、ポーリングするように再度変更
 TWLからも書けるのと併せ、そのつもりで作っていたかったので修正箇所が多い
スライダのレジスタの値を読み出されるのでスライダのアソビを考えてスケーリングするよう変更
 テーブル引きのテーブルをいじるのでは対応出来ない
ADCのフィルタの誤り。閾値付近でふらふらしてしまっていた。フィルタの意味なし
電池残量0時のデフォルトパターンを設定。
 ほぼすっからかんな電池をセットされたときなどでSoCから何も書かれてない状態の時、消灯で不便なため
電源LED autoでホタルにしない用にした。
 ホタル消そうか…
ファームが壊れ、バックアップからも復帰できないときに赤LEDを ぴぴっ、ぴぴっ と点滅させるように変更
 ファームバックアップ後、新ファーム書き込み中のある期間で電源を落とすとバックアップが消える?
 todo:デバッグコードが残っている
MGICにバッテリーパラメータを書くタイミングを変更(パラメータ転送~に時間が掛かるため)
 1)電池交換を検出したとき
 2)電源を入れようとしたときに万が一電池がすり替わってたとき
電圧で電池残量をキャップする
 分解能20mVではあまりよろしい結果が得られなかったのでMGICより下位バイトも取得するように変更
 比較部をリファクタリング
wait_msを違うモジュールに
 ROM上のbootブロックに置きたかったため
Vol更新コマンド ビットの自動クリアを忘れていた
バッテリ残量パラメータ更新
 ビットシフトが必要になったので対応 残念なコードに
電源LED赤とカメラLEDがひっくり返っていた
VOLテーブルを-10dbに更新


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

169 lines
5.6 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* ========================================================
TWL互換側のI2Cレジスタ
======================================================== */
#include "incs.h"
#include "jhl_defs.h"
#include "led.h"
#include "vreg_twl.h"
#include "vreg_ctr.h"
// ========================================================
#define TWL_REG_VER_INFO 0x35
#define NON_EXIST_REG 0xFF
// ========================================================
u8 vreg_twl[_REG_TWL_INT_ADRS_ENDMARK];
extern bit twl_ver_read;
extern bit cam_led_update;
extern bit twl_ntr_mode;
extern bit vol_by_twl;
/* ========================================================
仮想レジスタの初期化
======================================================== */
void vreg_twl_init( )
{
vreg_twl[ REG_TWL_INT_ADRS_MODE ] = 0x03;
vreg_twl[ REG_TWL_INT_ADRS_IRQ ] = 0;
vreg_twl[ REG_TWL_INT_ADRS_CAM ] = 0;
vreg_twl[ REG_TWL_INT_ADRS_TEMP0 ] = 0;
}
// ========================================================
// I2C仮想レジスタに書く・何かアクションする
// 引数 adrs は内部アドレス
//  存在しないアドレスにアクセスした場合、何もしません。
void vreg_twl_write( u8 adrs, u8 data )
{
switch ( adrs )
{
case ( REG_TWL_INT_ADRS_VOL ):
{
vol_by_twl = 1;
vreg_twl[ REG_TWL_INT_ADRS_VOL ] = data;
renge_task_immed_add( tski_vol_update );
set_irq( VREG_C_IRQ2, REG_BIT_TWL_SNDVOL_CHANGE );
break;
}
case ( REG_TWL_INT_ADRS_MODE ):
if(( data & 0x03 ) == 0 )
{
twl_ntr_mode = 1;
}
vreg_twl[ REG_TWL_INT_ADRS_MODE ] = ( data & 0x83 ); // [8]vol32 [1:0]nand
break;
case ( REG_TWL_INT_ADRS_CAM ):
vreg_twl[ REG_TWL_INT_ADRS_CAM ] = ( data & 0x03 );
if( ( data & 0x03 ) == TWL_CAMLED_BLINK )
{
cam_led_update = 1;
}
tsk_led_cam(); // todo 大丈夫?
break;
case ( REG_TWL_INT_ADRS_TEMP0 ):
vreg_twl[ REG_TWL_INT_ADRS_TEMP0 ] = data;
break;
case ( REG_TWL_INT_ADRS_COMMAND ):
/*
if( data <= 2 ){
if( ( data & REG_BIT_TWL_OFF_REQ ) != 0 )
{
set_irq( VREG_C_IRQ2, REG_BIT_TWL_OFF_REQ ); // OFFも実装していたらしい。
break;
}
else if( ( data & REG_BIT_TWL_RESET_REQ ) != 0 )
{
set_irq( VREG_C_IRQ2, REG_BIT_TWL_RESET_REQ ); //リセットしかない。他のは、SPIから来ます。
break;
}
}
*/
if( data == REG_BIT_TWL_RESET_REQ )
{
set_irq( VREG_C_IRQ2, REG_BIT_TWL_RESET_REQ ); //リセットしかない。他のは、SPIから来ます。
break;
}
}
return;
}
// ========================================================
// I2C仮想レジスタから読みます。
// 引数 adrs 外から見たときの、アドレス
// 戻り xx データ
//  存在しないアドレスにアクセスした場合、戻り値は0x5A
u8 vreg_twl_read( u8 phy_adrs )
{
u8 temp;
switch( phy_adrs ){
case( REG_TWL_INT_ADRS_POWER_INFO ):
if( vreg_ctr[ VREG_C_BT_REMAIN ] > 90 ){
vreg_twl[ REG_TWL_INT_ADRS_POWER_INFO ] = 0x0F;
}else if( vreg_ctr[ VREG_C_BT_REMAIN ] > 75 ){
vreg_twl[ REG_TWL_INT_ADRS_POWER_INFO ] = 0x0B;
}else if( vreg_ctr[ VREG_C_BT_REMAIN ] > 50 ){
vreg_twl[ REG_TWL_INT_ADRS_POWER_INFO ] = 0x07;
}else if( vreg_ctr[ VREG_C_BT_REMAIN ] > BATT_TH_LO ){
vreg_twl[ REG_TWL_INT_ADRS_POWER_INFO ] = 0x03;
}else if( vreg_ctr[ VREG_C_BT_REMAIN ] > BATT_TH_EMPTY ){
vreg_twl[ REG_TWL_INT_ADRS_POWER_INFO ] = 0x01;
}else{
vreg_twl[ REG_TWL_INT_ADRS_POWER_INFO ] = 0x00;
}
return( vreg_twl[ REG_TWL_INT_ADRS_POWER_INFO ] | ( !PM_EXTDC_n ? 0x80: 0x00 ) ); // アダプタbit(アダプタ有無)
case( REG_TWL_INT_ADRS_IRQ ):
temp = vreg_twl[ REG_TWL_INT_ADRS_IRQ ];
vreg_twl[ REG_TWL_INT_ADRS_IRQ ]= 0;
return( temp );
case( REG_TWL_INT_ADRS_VOL ):
return( vreg_twl[ REG_TWL_INT_ADRS_VOL ] );
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_ADRS_NON_EXIST ):
return( 0x00 );
default:
return( vreg_twl[ phy_adrs ] );
}
}
// ========================================================
// 外部から見える虫食いアドレスを、内部の連続アドレスに読み替える
// 0xFFは存在しないアドレス。
u8 adrs_table_twl_ext2int( u8 img )
{
switch( img ){
case( REG_TWL_ADRS_IRQ ): return( REG_TWL_INT_ADRS_IRQ );
case( REG_TWL_ADRS_COMMAND ): return( REG_TWL_INT_ADRS_COMMAND );
case( REG_TWL_ADRS_POWER_INFO ): return( REG_TWL_INT_ADRS_POWER_INFO );
case( REG_TWL_ADRS_VOL ): return( REG_TWL_INT_ADRS_VOL );
case( REG_TWL_ADRS_CAM ): return( REG_TWL_INT_ADRS_CAM );
case( REG_TWL_ADRS_TEMP0 ): return( REG_TWL_INT_ADRS_TEMP0 );
case( REG_TWL_ADRS_VER_INFO ): return( REG_TWL_INT_ADRS_VER_INFO );
case( REG_TWL_ADRS_MODE ): return( REG_TWL_INT_ADRS_MODE );
default: return( REG_TWL_ADRS_NON_EXIST );
// 0が読めればよい、書けなくて良い
// case( REG_TWL_ADRS_WIFI ): return( REG_TWL_INT_ADRS_WIFI );
}
}