ctr_mcu/trunk/pm.h
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

212 lines
6.7 KiB
C

#ifndef __PM__
#define __PM__
#define IIC_SLA_PMIC 0x84
#define IIC_SLA_BT_GAUGE 0x6C
#define VCOM_DEFAULT_T 92
#define VCOM_DEFAULT_B 95
#define BATT_TH_LO 10
#define BATT_TH_EMPTY 5
/*
#define V_K 16 / 1.25
#define V_TH_LO (u16)( 3200 * V_K )
#define V_TH_EMPTY (u16)( 3150 * V_K )
#define V_TH_ZERO (u16)( 3100 * V_K )
*/
#define V_TH_LO 40960
#define V_TH_EMPTY 40320
#define V_TH_ZERO 39680
//=========================================================
#define LED_CHARGE P2.4
//=========================================================
enum PMIC_REG_ADRS
{
PM_REG_ADRS_VER = 0x00, // verinfo など
PM_REG_ADRS_VDD_SYS, // システムが使用する電源
PM_REG_ADRS_VDD_LCD, // 液晶電源
PM_REG_ADRS_CONT, // /RESET1, LoadSwitch
PM_REG_ADRS_BL, // バックライト on/off
PM_REG_ADRS_POW_SAVE, // 省電力設定
PM_REG_ADRS_POW_DAC1,
PM_REG_ADRS_POW_DAC2
};
enum BT_GAUGE_REG_ADRS
{
BT_GAUGE_REG_VCELL = 0x02, // それぞれ16ビットのため
BT_GAUGE_REG_SOC = 0x04,
BT_GAUGE_REG_MODE = 0x06,
BT_GAUGE_REG_VERSION = 0x08,
BT_GAUGE_REG_OCV = 0x0E,
BT_GAUGE_REG_RCOMP = 0x0C,
BT_GAUGE_REG_LOCK = 0x3E,
BT_GAUGE_REG_BT_PARAM = 0x40,
BT_GAUGE_REG_COMMAND = 0xFE
};
typedef enum BT_VENDER
{
BT_VENDER_MAXELL = 0, // ショート
BT_VENDER_1, // 120
BT_VENDER_2, // 360
BT_VENDER_3, // 750
BT_VENDER_4, // 1.3k
BT_VENDER_PANA = 5, // 2.7k
BT_VENDER_6, // 8.2k
BT_VENDER_OPEN = 7, // open
BT_VENDER_NOT_CHECKED = 0xFF,
}BT_VENDER;
//=========================================================
// CODEC上のPMIC互換レジスタ
#define CODEC_REG_PM 0x10
#define CODEC_REG_BL 0x11
#define CODEC_REG_BT 0x12
//#define CODEC_REG_VOL 0x13 // ...都合により、adc.hで定義
// TWLがSPIでPMICに投げたコマンド
#define REG_BIT_TWL_REQ_OFF_REQ ( 1 << 6 )
#define REG_BIT_TWL_REQ_RST_REQ ( 1 << 0 )
#define REG_BIT_TWL_REQ_BL ( 3 << 2 )
// 0x03 pw cnt3
#define PM_REG_BIT_LDSW ( 1 << 0 )
#define PM_REG_BIT_nRST1 ( 1 << 1 )
// 0x01 pw cnt1
#define PM_REG_BIT_VDD 0x0F
#define PM_REG_BIT_VDD50A ( 1 << 4 )
// 0x02 pw cnt2
#define PM_REG_BIT_VDDLCD 0x07
#define PM_REG_BIT_LCD_VCS ( 0x01 << 4 )
#define PM_REG_BIT_LCD_TCOM ( 0x01 << 3 )
// 0x04 bl cnt
#define PM_REG_BIT_BL_U 0x01
#define PM_REG_BIT_BL_L 0x02
// 0x05 pow save
#define PM_REG_BIT_VDD1P_1R15 0b00000000
#define PM_REG_BIT_VDD1P_1R05 0b00001000
#define PM_REG_BIT_VDD1P_0R90 0b00100000
#define PM_REG_BIT_VDD_AUTO 0b00000111
#define PM_REG_BIT_VDD_PWM 0b00000000
#define DELAY_PM_TW_PWUP 16 + 2
#define DELAY_PM_TSS_50B_AND_TCOM 17 + 1
#define DELAY_PM_5V_TO_TCOM 17 + 1
#define DELAY_PM_TCOM_TO_VCS 3
#define DELAY_PM_VCS_TO_BL ( 17 + 5 )
#define DELAY_PM_LCD_OFF ( 50 + 1 )
//=========================================================
extern u8 raw_adc_temperature;
extern BT_VENDER battery_manufacturer;
//=========================================================
err PM_sys_pow_on( );
err PM_sys_pow_off( );
err PM_bt_auth( );
err PM_LCD_vcom_set( );
err PM_LCD_on( );
void PM_LCD_off( );
err PM_BL_set( u8 );
void BT_init();
void BT_get_left();
void BT_set_relax_timer();
u8 BT_is_relaxed();
task_status_immed tski_BT_temp_update( );
task_status_immed tski_vcom_set( );
task_status_immed tski_PM_LCD_on();
task_status_immed tski_PM_LCD_off();
task_status_immed tski_PM_BL_set();
#define PM_Chg_Stop() { BT_TEMP_P = 0; BT_CHG_DISABLE(); while( !BT_CHG_n ){;}; LED_CHARGE = 0; }
//  これを呼ぶ前に、現在温度を教えておく必要があります。
#define PM_reset() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_CONT, 0x00 ) )
//=========================================================
// 元栓 //
#define PM_LDSW_on() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_CONT, PM_REG_BIT_LDSW ))
#define PM_LDSW_off() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_CONT, 0 ))
// システム電源 //
#define PM_VDD_on() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_VDD_SYS, PM_REG_BIT_VDD ))
#define PM_VDD50A_on() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_VDD_SYS, ( PM_REG_BIT_VDD | PM_REG_BIT_VDD50A )))
#define PM_VDD_off() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_VDD_SYS, 0 ))
#define PM_off() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_VDD_SYS, 0 ))
#ifdef _MODEL_CTR_
#define PM_VDD_normMode() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_POW_SAVE, PM_REG_BIT_VDD1P_1R15 | PM_REG_BIT_VDD_PWM ))
#define PM_VDD_ecoMode() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_POW_SAVE, PM_REG_BIT_VDD1P_0R90 | PM_REG_BIT_VDD_AUTO ))
#else
#define PM_VDD_ecoMode() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_POW_SAVE, PM_REG_BIT_VDD1P_1R05 | PM_REG_BIT_VDD_AUTO ))
#define PM_VDD_normMode() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_POW_SAVE, PM_REG_BIT_VDD1P_1R05 | PM_REG_BIT_VDD_PWM ))
#endif
// ほか //
#ifdef _PMIC_TWL_
#define PM_reset_neg() { PM0.0 = 1; }
#define PM_reset_ast() { P0.0 = 0; PM0.0 = 0; }
#define PM_chk_LDSW() ( 1 )
#else
#define PM_reset_neg() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_CONT, ( PM_REG_BIT_LDSW | PM_REG_BIT_nRST1 )))
#define PM_reset_ast() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_CONT, ( PM_REG_BIT_LDSW )))
#define PM_chk_LDSW() ( iic_mcu_read_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_CONT ) & PM_REG_BIT_LDSW )
// ↑ 0 だと異常
#endif
// 液晶系電源 //
#define PM_VDDLCD_on() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_VDD_LCD, PM_REG_BIT_VDDLCD ))
#define PM_TCOM_on() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_VDD_LCD, ( PM_REG_BIT_VDDLCD | PM_REG_BIT_LCD_TCOM )))
#define PM_VCS_on() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_VDD_LCD, ( PM_REG_BIT_VDDLCD | PM_REG_BIT_LCD_VCS | PM_REG_BIT_LCD_TCOM )))
#define PM_TCOM_VCS_off() PM_VDDLCD_on()
#define PM_VDDLCD_off() ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_VDD_LCD, 0 ) )
#define PM_set_BL( dat ) ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_BL, dat ) )
#define PM_set_adc1( dat ) ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_POW_DAC1, dat ) )
#define PM_set_adc2( dat ) ( iic_mcu_write_a_byte( IIC_SLA_PMIC, PM_REG_ADRS_POW_DAC2, dat ) )
#endif // __PM__