twl_mcu/vreg.c
2024-12-17 04:24:29 -05:00

190 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.

#include "incs.h"
// レジスタマップは user_define.h 参照
u8 vregs[REG_INT_ADRS_TIME_PWSW_THRESHOLD+1];
extern u8 battLvl;
// もっといい方法がある気がする。
// 直接書くのは良くない気がする
// タスクのインターバル用カウンタ。レジスタ変更通知で強制起動用
extern u8 tsk_interval_cnt_adc;
extern u8 tsk_interval_cnt_power_led;
extern u8 tsk_interval_cnt_wifi_led;
extern bit rsv_set_vol;
extern bit rsv_set_BL;
extern bit rsv_set_PMIC_VRSET;
extern bit rsv_set_batt_th;
extern bit rsv_set_camLED;
extern bit rsv_set_powLED;
extern bit adc_calib_mode;
extern bit self_prog_mode;
//*******************************************************************************
// I2C仮想レジスタに書きます。
// 引数 adrs は内部アドレス
//  存在しないアドレスにアクセスした場合、何もしません。
void vregs_write( u8 adrs, u8 data ){
if( REG_INT_ADRS_TIME_PWSW_THRESHOLD < adrs ){ // アドレス範囲外
return;
}else if( REG_INT_ADRS_TEMP0 <= adrs ){ // 70 - 77
vregs[ adrs ] = data;
/*
// マジックナンバーチェック
// 呼び出し元で解決に変更。
if( adrs == REG_INT_ADRS_TEMP7 ){
if( data == 0x4A ){
self_prog_mode = 1; // 自己書き換えもーど
}
}
*/
return;
}else if( REG_INT_ADRS_WIFI <= adrs ){ // 40 -
switch( adrs ){
case( REG_INT_ADRS_WIFI ):
vregs[ REG_INT_ADRS_WIFI ] = data;
if( ( data & 0x10 ) == 0 ){
n_wifi_reset_ast;
}else{
n_wifi_reset_ngt;
}
break;
case( REG_INT_ADRS_CAM ):
vregs[ REG_INT_ADRS_CAM ] = data;
rsv_set_camLED = 1;
break;
case( REG_INT_ADRS_VOL ):
vregs[ REG_INT_ADRS_VOL ] = data & 0x1F;
rsv_set_vol = 1;
break;
case( REG_INT_ADRS_BL ):
vregs[ REG_INT_ADRS_BL ] = data;
rsv_set_BL = 1;
break;
case( REG_INT_ADRS_ADC_CALIB ):
vregs[ REG_INT_ADRS_ADC_CALIB ] = data;
if( ( data & 0x01 ) == 1 ) adc_calib_mode = 1;
break;
case( REG_INT_ADRS_POWER_LED ):
vregs[ REG_INT_ADRS_POWER_LED ] = data;
rsv_set_powLED = 1;
break;
}
return;
}else{
switch( adrs ){ // 0 -
case( REG_INT_ADRS_COMMAND ):
vregs[ REG_INT_ADRS_COMMAND ] = data;
// 将来的にはここからさらにPMICにコマンド
break;
case( REG_INT_ADRS_POWER_SAVE ):
vregs[ REG_INT_ADRS_POWER_SAVE ] = data;
break;
case( REG_INT_ADRS_MODE ):
vregs[ REG_INT_ADRS_MODE ] = data;
rsv_set_PMIC_VRSET = 1;
rsv_set_batt_th = 1;
break;
}
return;
}
}
//*******************************************************************************
// I2C仮想レジスタから読みます。
// 引数 adrs 外から見たときの、アドレス
// 戻り xx データ
//  存在しないアドレスにアクセスした場合、戻り値は0x5A
u8 vregs_read( u8 phy_adrs ){
static u8 dat;
dat = vregs[ phy_adrs ];
switch( phy_adrs ){
case( REG_INT_ADRS_IRQ ):
vregs[ REG_INT_ADRS_IRQ ] = 0;
break;
case( REG_INT_ADRS_POWER_INFO ):
if( n_ac_supp == 0 ){ // 必要なとき合成。”刺さっていればゼロ”
dat |= 0x80;
}
break;
case( 0xFF ):
dat = ( 0x5A );
break;
}
return( dat );
}
//*******************************************************************************
// 外部から見える虫食いアドレスを、内部の連続アドレスに読み替える
// 0xFFは存在しないアドレス。
u8 adrs_table_ext2int( u8 img ){
static u8 adrsH, adrsL;
adrsH = ( img & 0xF0 );
adrsL = ( img & 0x0F );
if( adrsH > 0x80 ){
return( 0xFF );
}
if( adrsH == 0x50 ){
return( 0xFF );
}
if( adrsH <= 0x30 ){ // 0x00 - 0x3F
if( adrsH <= 0x10 ){ // 0x00 - 0x1F
if( adrsH == 0x10 ){ // 0x1*
if( adrsL <= ( REG_ADRS_MODE & 0x0F ) ){
return( REG_INT_ADRS_IRQ + adrsL );
}
}else{ // 0x0*
if( adrsL <= ( REG_ADRS_BATT_INFO & 0x0F ) ){
return( REG_INT_ADRS_VER_INFO + adrsL );
}
}
}else{ // 0x20 - 0x3F
if( adrsH == 0x20 ){ // 0x2?
if( adrsL <= ( REG_ADRS_POWER_SAVE & 0x0F ) ){
return( REG_INT_ADRS_POWER_INFO + adrsL );
}
}else{ // 0x3*
if( adrsL <= ( REG_ADRS_CAM & 0x0F ) ){
return( REG_INT_ADRS_WIFI + adrsL );
}
}
}
}else{
if( adrsH <= 0x60 ){
if( adrsH == 0x60 ){
if( adrsL <= ( REG_ADRS_POWER_LED & 0x0F ) ){
return( REG_INT_ADRS_ADC_CALIB + adrsL );
}
}else{ // 40台
if( adrsL <= ( REG_ADRS_BL & 0x0F ) ){
return( REG_INT_ADRS_VOL + adrsL );
}
}
}else{
if( adrsH == 0x70 ){
if( adrsL <= ( REG_ADRS_TEMP7 & 0x0F ) ){
return( REG_INT_ADRS_TEMP0 + adrsL );
}
}else{ // 80台
if( adrsL <= ( REG_ADRS_TIME_PWSW_THRESHOLD & 0x0F ) ){
return( REG_INT_ADRS_TIME_PWSW_DELAY + adrsL );
}
}
}
}
return( 0xFF );
}