ctr_mcu/trunk/vreg_twl.c
N2232 a159bca802 お知らせ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
2010-04-16 11:07:54 +00:00

148 lines
4.7 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];
/* ========================================================
仮想レジスタの初期化
======================================================== */
void vreg_twl_init( )
{
vreg_twl[ REG_TWL_INT_ADRS_MODE ] = 0x03;
}
// ========================================================
// I2C仮想レジスタに書く・何かアクションする
// 引数 adrs は内部アドレス
//  存在しないアドレスにアクセスした場合、何もしません。
void vreg_twl_write( u8 adrs, u8 data )
{
switch ( adrs )
{
case ( REG_TWL_INT_ADRS_VOL ):
{
set_irq( VREG_C_IRQ2, REG_BIT_TWL_SNDVOL_CHANGE );
break;
}
case ( REG_TWL_INT_ADRS_MODE ):
vreg_twl[adrs] = ( data & 0x03 );
break;
case ( REG_TWL_INT_ADRS_CAM ):
vreg_twl[adrs] = ( data & 0x03 );
tsk_led_cam(); // todo 大丈夫?
break;
case ( REG_TWL_INT_ADRS_TEMP0 ):
vreg_twl[adrs] = 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_VER_INFO ):
return( TWL_REG_VER_INFO );
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 ] > 25 ){
vreg_twl[ REG_TWL_INT_ADRS_POWER_INFO ] = 0x03;
}else if( vreg_ctr[ VREG_C_BT_REMAIN ] > 5 ){
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 ] | ( !BT_CHG_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 );
default:
return( vreg_twl[ phy_adrs ] );
case( REG_TWL_ADRS_NON_EXIST ):
return( 0x00 );
}
}
// ========================================================
// 外部から見える虫食いアドレスを、内部の連続アドレスに読み替える
// 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_CAM ): return( REG_TWL_INT_ADRS_CAM );
case( REG_TWL_ADRS_VOL ): return( REG_TWL_INT_ADRS_VOL );
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 );
}
}