mirror of
https://github.com/rvtr/twl_mcu.git
synced 2025-06-18 14:45:41 -04:00
190 lines
5.0 KiB
C
190 lines
5.0 KiB
C
#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 );
|
||
}
|
||
|