#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_BT_4000MV (u16)( 4000 * 12.8 ) // 電圧読み出し失敗用 4000mV設定 #define V_TH_30 (u16)( 3300 * 12.8 ) // 30% #define V_TH_LO (u16)( 3200 * 12.8 ) // 10% #define V_TH_EMPTY (u16)( 3150 * 12.8 ) // 5% #define V_TH_ZERO (u16)( 3100 * 12.8 ) // 0% #define V_TH_FORCE_OFF (u16)( 2900 * 12.8 ) // 2.9V 最終強制断 //========================================================= #ifdef _WIN32 #define LED_CHARGE mcuRegP[ _P2_4 ] #else #define LED_CHARGE P2.4 #endif //========================================================= 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; enum NTR_PM_BT_STATUS{ NTR_PM_BT_ENOUGH, NTR_PM_BT_EMPTY, NTR_PM_BT_NOT_INITIALIZED = 0xFF }; //========================================================= // 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_CGS 0x07 #define PM_REG_BIT_VDDLCD_AMO 0x05 #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 bits8(0,0,0,0, 0,0,0,0) #define PM_REG_BIT_VDD1P_1R05 bits8(0,0,0,0, 1,0,0,0) #define PM_REG_BIT_VDD1P_0R90 bits8(0,0,1,0, 0,0,0,0) #define PM_REG_BIT_VDD_AUTO bits8(0,0,0,0, 0,1,1,1) #define PM_REG_BIT_VDD_PWM bits8(0,0,0,0, 0,0,0,0) #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; extern bit bt_force_update; extern u8 pmic_version; extern u8 mgic_version[]; extern u8 pm_reg_bit_vddlcd; // アモルファス対応(電源シーケンスが違う) //========================================================= err PM_sys_pow_on( ); void PM_sys_pow_off( ); //err PM_bt_auth( ); void PM_LCD_vcom_set( ); err PM_LCD_on( ); void PM_LCD_off( ); err PM_BL_set( u8 ); void BT_chk(); void BT_get_left(); void pm_chk_adapter(); void codec_reg_init(); 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(); err send_cmd_pmic( u8 reg, u8 dat ); u8 read_pmic( u8 reg ); #define PM_Chg_Stop() { BT_TEMP_P = 0; BT_CHG_DISABLE(); LED_CHARGE = 0; bt_authorized = false; } //  これを呼ぶ前に、現在温度を教えておく必要があります。 #define PM_reset() ( send_cmd_pmic( PM_REG_ADRS_CONT, 0x00 ) ) //========================================================= // 元栓 // #define PM_LDSW_on() ( send_cmd_pmic( PM_REG_ADRS_CONT, PM_REG_BIT_LDSW )) #define PM_LDSW_off() ( send_cmd_pmic( PM_REG_ADRS_CONT, 0 )) // システム電源 // #define PM_VDD_on() ( send_cmd_pmic( PM_REG_ADRS_VDD_SYS, PM_REG_BIT_VDD )) #define PM_VDD50A_on() ( send_cmd_pmic( PM_REG_ADRS_VDD_SYS, ( PM_REG_BIT_VDD | PM_REG_BIT_VDD50A ))) #define PM_VDD_off() ( send_cmd_pmic( PM_REG_ADRS_VDD_SYS, 0 )) #define PM_off() PM_VDD_off() #define PM_VDD_normMode() ( send_cmd_pmic( PM_REG_ADRS_POW_SAVE, PM_REG_BIT_VDD1P_1R15 | PM_REG_BIT_VDD_PWM )) #define PM_VDD_ecoMode() ( send_cmd_pmic( PM_REG_ADRS_POW_SAVE, PM_REG_BIT_VDD1P_0R90 | PM_REG_BIT_VDD_AUTO )) // todo Yでコア電圧が変わるかもしれない // ほか // #define PM_reset_neg() ( send_cmd_pmic( PM_REG_ADRS_CONT, ( PM_REG_BIT_LDSW | PM_REG_BIT_nRST1 ))) #define PM_reset_ast() ( send_cmd_pmic( PM_REG_ADRS_CONT, ( PM_REG_BIT_LDSW ))) #define PM_chk_LDSW() ( read_pmic( PM_REG_ADRS_CONT ) & PM_REG_BIT_LDSW ) // ↑ 1のとき、元電源on // 液晶系電源 // #define PM_VDDLCD_on() ( send_cmd_pmic( PM_REG_ADRS_VDD_LCD, pm_reg_bit_vddlcd )) #define PM_TCOM_on() ( send_cmd_pmic( PM_REG_ADRS_VDD_LCD, ( pm_reg_bit_vddlcd | PM_REG_BIT_LCD_TCOM ))) #define PM_VCS_on() ( send_cmd_pmic( PM_REG_ADRS_VDD_LCD, ( pm_reg_bit_vddlcd | PM_REG_BIT_LCD_VCS | PM_REG_BIT_LCD_TCOM ))) #define PM_TCOM_off() ( send_cmd_pmic( PM_REG_ADRS_VDD_LCD, ( pm_reg_bit_vddlcd | PM_REG_BIT_LCD_VCS ))) #define PM_TCOM_VCS_off() PM_VDDLCD_on() #define PM_VDDLCD_off() ( send_cmd_pmic( PM_REG_ADRS_VDD_LCD, 0 ) ) #define PM_set_BL( dat ) ( send_cmd_pmic( PM_REG_ADRS_BL, dat ) ) #define PM_set_adc1( dat ) ( send_cmd_pmic( PM_REG_ADRS_POW_DAC1, dat ) ) #define PM_set_adc2( dat ) ( send_cmd_pmic( PM_REG_ADRS_POW_DAC2, dat ) ) #endif // __PM__