ctr_mcu/trunk/vreg_twl.c
n2232 df4fdc2473 ■2.0F
・充電状況割り込みをtask_status -> task_batt へ統合
・Doxgenで処理できるように関数の看板を変更、追記など
コードそのものはお蔵入りになると思うのですが...
・include を少し整理

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

170 lines
5.0 KiB
C
Raw Permalink 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レジスタ
$Id$
======================================================== */
#include "incs.h"
#include "jhl_defs.h"
#include "led.h"
#include "vreg_twl.h"
//#include "vreg_ctr.h"
#include "adc.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 vol_changed_by_twl;
// ========================================================
extern void tsk_led_cam();
/********************************************//**
仮想レジスタの初期化
***********************************************/
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_changed_by_twl = true;
vreg_twl[ REG_TWL_INT_ADRS_VOL ] = data;
//renge_task_immed_add( tski_vol_update );
vol_polling = 3;
break;
}
case ( REG_TWL_INT_ADRS_MODE ):
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 = true; // こうでないと一発消灯時に不具合があるため
}
tsk_led_cam(); // ブリンクの都合で強制起動
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 ){
// 10%以下で赤になる
case( REG_TWL_INT_ADRS_POWER_INFO ):
// レベルのセットは get_batt_left()内(処理が遅くて無理でした)
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_VER_INFO ):
// set_irq( VREG_C_IRQ2, REG_BIT_TWL_VER_READ ); // 速度的に無理なので
twl_ver_read = true;
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 );
}
}