teaccpp 发表于 2015-9-1 22:46:42

求 解释原理

//***************************************************************************//
//    BATTERY.C                                                                //
//                                                                           //
//    Copyright (c) ene Corporation 2003.                                    //
//    All rights reserved.                                                   //
//                                                                           //
//    EnE reserves the right to amend this code without notice at any time.//
//    EnE assumes no responsibility for any errors appeared in the code,   //
//    and EnE disclaims any express or implied warranty, relating to sale    //
//    and/or use of this code including liability or warranties relating   //
//    to fitness for a particular purpose, or infringement of any patent,    //
//    copyright or other intellectual property right.                        //
//                                                                           //
//    Revision : 0.1                                                         //
//                                                                           //
//***************************************************************************//

#include <GLOBAV.H>
#include <OEMFUNC.H>

#include "oemport.h"
#include "oemio.h"
#include <stdio.h>

#define      Battery2S_OverVolt         8400    //Max voltate 8.4V
#define      Battery2S_UnderVolt      6300   //MIN voltage 6.3V
#define      Battery2S_OverChgI      1850
#define   Kelvin_0                           2730   //273*10
#define   Kelvin_55                         3280    //(273+55)*10
#define   Kelvin_65                         3380   //(273+65)*10

extern unsigned char OEMIO(unsigned int Index);
extern unsigned char OEMO(unsigned int Index,unsigned int Index3);
extern unsigned char DelayCountFunction(unsigned int DelayC);
extern void Read_Smbus(unsigned char command,unsigned char address,unsigned char protocol,unsigned char length, unsigned chardatabuffer[]);

void CheckAdapterPlugInOut(void)
{   if(OEMIO(AC_IN)==TRUE)
      {
      bAdapterOnLine=1;
       }
   else
             {
         bAdapterOnLine=0;
         ResetChargerSetting();
             }
}
void CheckBatteryPlugInOut(void)
{
      if(OEMIO(BATT_ID)==TRUE)
            {
          bBatteryOnLine=1;
            }
      else
      {
         bBatteryOnLine=0;
         bBatterySMBusOK = 0;
         OEMO(_CHG_LED,HIGH);
          ResetChargerSetting();
      }
}

void ResetChargerSetting(void)
{
//   xCHARGER_MODE = 0x00;
    CHARGER_STEP= 0x00;
    CHARGER_TIME_HOUR = 0x00;
    CHARGER_TIME_MIN= 0x00;
    CHARGER_TIME_SEC= 0x00;
    xBATTERY_FLAG = 0;
}
void BatteryInformationAccess(void)
{
   if(bBatteryOnLine)
         {
            BATTERY_SCAN_STEP++;
       }
   else
         {
            return;
         }

    switch( BATTERY_SCAN_STEP)
    {
      case 0x01:
                        Read_Smbus(_CMD_BatteryStatus,_SMB_BatteryAddr,READ_WORD,0x02,BAT1_BatteryStatus);
                  break;
                  
      case 0x02:
                         Read_Smbus(_CMD_FullChargeCapacity,_SMB_BatteryAddr,READ_WORD,0x02,Max_Rating_Capacity);//here read LAST full Capacity as the MAX Rating
                  break;
      case 0x03:
                        Read_Smbus(_CMD_Voltage,_SMB_BatteryAddr,READ_WORD,0x02,Current_Voltage);
                        break;
         case 0x04:
                        Read_Smbus(_CMD_RemainingCapacity,_SMB_BatteryAddr,READ_WORD,0x02,Current_Capacity);
                         break;
      case 0x05:
                        Read_Smbus(_CMD_RelativeStateOfCharge,_SMB_BatteryAddr,READ_WORD,0x01,&Batt_Percent);

//                            BEC_Batt_Percent=Batt_Percent;
                  break;
                  
      case 0x06:
                        Read_Smbus(_CMD_Temperature,_SMB_BatteryAddr,READ_WORD,0x02,Temperature);
                  break;      
         case 0x07:
                     Read_Smbus(_CMD_AverageCurrent,_SMB_BatteryAddr,READ_WORD,0x02,Average_Current_Rate);
                  break;
         case 0x08:
                     Read_Smbus(_CMD_Voltage,_SMB_BatteryAddr,READ_WORD,0x02,Design_Voltage);
      default:   
                     BATTERY_SCAN_STEP = 0x00;
                  break;
    }
}
void ProcessBatteryCharging(void)
{
   if(bBatteryOnLine && bAdapterOnLine)   
    {
       CHARGE_PROG_SCAN++;
    }
   else
         {
             return;
         }
               
    switch( CHARGE_PROG_SCAN)
    {
      case 0x01:
                        GetChargingParameter();
                  break;
                  
      case 0x02:
                        CheckBatteryChargingVoltage();
                  break;
      case 0x03:
                        CheckBatteryChargingCurrent();
                        break;
         case 0x04:
                        CheckBatteryCapacityPercent();
                         break;
      case 0x05:
                        CheckBatteryChargingTemperature();
                  break;
                  
      case 0x06:
                        ChargingOutputControl();
      
                  
      default:   
                     CHARGE_PROG_SCAN = 0x00;
                  break;
      
    }
}

void GetChargingParameter(void)
{   

//   CheckAdapterPlugInOut();
//   CheckBatteryPlugInOut();

    switch( CHARGER_STEP)
    {
      case 0x00:
                if(bBatteryOnLine && bAdapterOnLine)   
                {
                        CHARGER_STEP = 0x01;
                }
                break;
         case 0x01:
               if((Batt_Percent == 0)|| ((Current_Capacity == 0)&&(Current_Capacity==0))   //
                         || ((Current_Voltage == 0 )&&(Current_Voltage == 0))
                         || ((Temperature==0)&& (Temperature==0) ))                      //smbus is wrong, can not read smbus

                         {
                           Counter++;
                        if(Counter>=300)                //if charge for 3 min, batt_percent==0,battery is corrupted.
                            {
                               bBatterySMBusOK= 0;
                               return;
                            }
                           else
                           {
                           //         Counter=0;
                               bBatterySMBusOK = 1;
                           CHARGER_STEP = 0x02;
                           }

                         }
                else
                   {
                      Counter=0;
                      bBatterySMBusOK = 1;
                  CHARGER_STEP = 0x02;
                   }
               
         case 0x02:         
//               BAT1_BatteryStatus1=BAT1_BatteryStatus;
//                BAT1_BatteryStatus2=BAT1_BatteryStatus;
//                if((BAT1_BatteryStatus1&0x20)>0)          //bit5represent bat is fully charged
//                {
//                           bSet_ChargerEnabled = 0;
//                           return;
//                }
               
               if(CHARGER_TIME_HOUR>7)   //charge for 7Hour, failed
                           {
                           bSet_Chg_Overtime = 1;
                           return;
                           }
               else
                         {
                        bSet_Chg_Overtime = 0;
                         CHARGER_STEP = 0x03;
                         }
                  break;

          case 0x03:                  
                if(CORE_PMFLAG_S3)            //wakeup state, normal charge

                  {
                     bSet_FastCharge=0;
                }
                  else                                                            //standby state, Fast Charge
                  {

                        bSet_FastCharge=1;
                  }                  
                  
                  
      default:
            CHARGER_STEP=0x00;      
                  break;
            }
}

Anny黄 发表于 2015-9-1 23:37:15

好长,速来围观

~风介~ 发表于 2015-9-2 00:17:59

这样是不会有人给你解释的。

桃花飞舞 发表于 2015-9-2 00:40:04

当遇到我看不懂的,我都会觉得好厉害。:call:

牡丹花下死做鬼 发表于 2015-9-2 09:14:06

没人会给你解释

teaccpp 发表于 2017-9-7 22:04:41

这是笔记本BIOS

写的是充电部分的逻辑

规定最高最低充电电压

teaccpp 发表于 2017-9-7 22:05:10

还有如何识别battery ID
页: [1]
查看完整版本: 求 解释原理