⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bat4fsc.c

📁 C中嵌入汇编
💻 C
📖 第 1 页 / 共 3 页
字号:
     now_year=atoi(buffer);

     outportb(0x70,0x08);
     temp=inportb(0x71)&0xff;
     sprintf(buffer,"%02X",temp);
     now_month=atoi(buffer);

     outportb(0x70,0x07);
     temp=inportb(0x71)&0xff;
     sprintf(buffer,"%02X",temp);
     now_day=atoi(buffer);

     per    = atof(argv[1]);
     maxcur = atof(argv[2]);
     mincur = atof(argv[3]);

     rs.h.ah=1;
     rs.h.ch=0xfe;
     rs.h.cl=0xfe;
     int86(0x10,&rs,&rs);


     FindSMBIOS();
     if ((szmy=(szType*)malloc(sizeof(szType)))==NULL)
     {
      printf("Not enough memory!\n");
      return  0x40;
     }

     if ((stpType16=(TYPE16*)malloc(sizeof(TYPE16)))==NULL)
     {
      printf("Not enough memory!\n");
      return  0x40;
     }

     if ((buf=(BYTE *)malloc(SMBIOSLen*sizeof(BYTE)))==NULL)
     {
      printf("Not enough memory!\n");
      return  0x40;
     }

     ReadRAM((DWORD)SMBIOSEntry,(BYTE *)buf,(WORD)SMBIOSLen);
     if(GetStructureTable(szmy,buf,0x16)!=1)
     {
      printf("This SMBIOS does not support Type 16 !\r\n");
      return 1;
     }
     GetType16(stpType16, buf ,szmy);


     P1=inportb(0x62);
     P1=inportb(0x66);
     /*
     while((inportb(0x66)&0x01)==0x01)
     {
      P1=inportb(0x66);
      P1=P1&0xfe;
      printf("Write 0x%02X to port 0x66...\r",P1);
      outportb(0x66,0x28);
     }
     */


     /*0xAD disable keyboard (sets bit 4 of commmand byte) */
     ClearKBDBuf();
     printf("Wait for KBC not busy....\r\n");
     if(SendKBCCmd(0xAD)!=0)
      return 1;
     printf("Keyboard disabled....\r\n");



     clrscr();
     textcolor(12);
     cprintf("Battchrg for FSC w/ ITE Embedded Controller      Ver: 3.044    Faintsnow@msn.com");
     /*outportb(0x60,0xF3);*/




     delay(10);
     RET=WriteEC(0x66,0xa2);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x62,0x97);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x66,0xa3);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x62,0x04);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x66,0xa4);
     if(RET==EC_TIMEOUT) return;
     RET=ReadEC(DATA_H);
     if(RET==EC_TIMEOUT) return;
     textcolor(9);
     cprintf("Battery Type[Smart/Dumb]     : ");
     textcolor(10);
     if(((*DATA_H)&0x01)==1)
     {
      dumb=1;
      cprintf("Dumb battery\r\n");
     }else
      {
       smart=1;
       cprintf("Smart battery\r\n");
      }


     textcolor(9);
     /* cprintf("Battery Model Name           : "); */
     for(i=0;i<0x0f;i++)
     {
      *DATA_L=0;*DATA_H=0;
      RET=WriteEC(0x66,0xa2);
      if(RET==EC_TIMEOUT) return;
      RET=WriteEC(0x62,0x12+i);
      if(RET==EC_TIMEOUT) return;
      RET=WriteEC(0x66,0xa3);
      if(RET==EC_TIMEOUT) return;
      RET=WriteEC(0x62,0x04);
      if(RET==EC_TIMEOUT) return;
      RET=WriteEC(0x66,0xa4);
      if(RET==EC_TIMEOUT) return;
      RET=ReadEC(DATA_L);
      if(RET==EC_TIMEOUT) return;
      j=(int)*DATA_L;
      if(j==0x00){break;}
      textcolor(10);
      /* cprintf("%c",j); */

     }
     /* printf("\r\n"); */



     textcolor(9);
     cprintf("Battery Cell Serial number   : ");
     textcolor(10);
     sprintf(buffer,"%s",stpType16->szString[stpType16->dbSerialNumber-1]);
     cprintf("%s\r\n",buffer);
     switch (buffer[5])
     {
      case '1':
       textcolor(9);
       cprintf("Battery Packer manufacturer  : ");
       textcolor(10);
       cprintf("Simplo\r\n");
       break;
      case '2':
       textcolor(9);
       cprintf("Battery Packer manufacturer  : ");
       textcolor(10);
       cprintf("Gallopwire\r\n");
       break;
      case '3':
       textcolor(9);
       cprintf("Battery Packer manufacturer  : ");
       textcolor(10);
       cprintf("Foxlink\r\n");
       break;
      case '4':
       textcolor(9);
       cprintf("Battery Packer manufacturer  : ");
       textcolor(10);
       cprintf("Dynapack\r\n");
       break;
      case '5':
       textcolor(9);
       cprintf("Battery Packer manufacturer  : ");
       textcolor(10);
       cprintf("Celxpert\r\n");
       break;
      case '6':
       textcolor(9);
       cprintf("Battery Packer manufacturer  : ");
       textcolor(10);
       cprintf("Sanyo\r\n");
       break;
      default:
       break;
  }

     switch (buffer[6])
     {
      case '1':
       textcolor(9);
       cprintf("Battery Cell manufacturer    : ");
       textcolor(10);
       cprintf("Sanyo\r\n");
       break;
      case '2':
       textcolor(9);
       cprintf("Battery Cell manufacturer    : ");
       textcolor(10);
       cprintf("Sony\r\n");
       break;
      case '3':
       textcolor(9);
       cprintf("Battery Cell manufacturer    : ");
       textcolor(10);
       cprintf("Panasonic\r\n");
       break;
      case '4':
       textcolor(9);
       cprintf("Battery Cell manufacturer    : ");
       textcolor(10);
       cprintf("Samsung\r\n");
       break;
      case '5':
       textcolor(9);
       cprintf("Battery Cell manufacturer    : ");
       textcolor(10);
       cprintf("LG\r\n");
       break;
      default:
       break;
  }

     switch (buffer[12])
     {
      case 'A':
       year=2006;
       break;
      case 'B':
       year=2007;
       break;
      case 'C':
       year=2008;
       break;
      case 'D':
       year=2009;
       break;
      default:
       break;
     }
     week=(buffer[13]-48)*10+buffer[14]-48;




     delay(10);
     *DATA_L=0;*DATA_H=0;
     RET=WriteEC(0x66,0xa2);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x62,0xa8);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x66,0xa3);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x62,0x04);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x66,0xa4);
     if(RET==EC_TIMEOUT) return;
     RET=ReadEC(DATA_L);
     if(RET==EC_TIMEOUT) return;

     
     delay(10);
     RET=WriteEC(0x66,0xa2);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x62,0xa9);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x66,0xa3);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x62,0x04);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x66,0xa4);
     if(RET==EC_TIMEOUT) return;
     RET=ReadEC(DATA_H);
     if(RET==EC_TIMEOUT) return;

     /* printf("FCC DATA_H DATAT_L %X %X \n",DATA_H,DATA_L); */
     Date=*DATA_H*pow(2,8)+*DATA_L;
     pack_year   =1980+(Date/0x200);
     pack_month  =(Date/0x20)&0x0f;
     pack_day    =Date&0x1f;
     textcolor(9);
     cprintf("Battery Packed Date          : ");
     textcolor(10);
     cprintf("%i/%i/%i\r\n",pack_year,pack_month,pack_day);


     E1=week*7;
     E2=(now_year-year)*365+(now_month-1)*30+now_day;


     textcolor(9);
     cprintf("Battery Cell Date            : ");
     textcolor(10);
     cprintf("Year:%i,Week:%i ",year,week);
     if((E2-E1<=162)&&(E2-E1>0))
     {
      cycle=0;
      textcolor(10);
      cprintf("[%i days]\r\n",E2-E1);
     }else if((E2-E1<=355)&&(E2-E1>162))
      {
       cycle=1;
       textcolor(YELLOW);
       cprintf("[%i days]\r\n",E2-E1);
      }else if(E2-E1>355)
       {
        cycle=2;
        textcolor(RED);
        cprintf("[%i days]\r\n",E2-E1);
       }else
         printf("\r\n");


     *DATA_L=0;*DATA_H=0;
     RET=WriteEC(0x66,0xa2);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x62,0x02);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x66,0xa3);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x62,0x04);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x66,0xa4);
     if(RET==EC_TIMEOUT) return;
     RET=ReadEC(DATA_L);
     if(RET==EC_TIMEOUT) return;
     
     delay(10);
     RET=WriteEC(0x66,0xa2);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x62,0x03);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x66,0xa3);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x62,0x04);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x66,0xa4);
     if(RET==EC_TIMEOUT) return;
     RET=ReadEC(DATA_H);
     if(RET==EC_TIMEOUT) return;

     Designed_FCC=*DATA_H*pow(2,8)+*DATA_L;
     textcolor(9);
     cprintf("Battery Designed Capacity    : ");
     textcolor(10);
     cprintf("%.0f ",Designed_FCC);
     cprintf("mAH\r\n");

     *DATA_L=0;*DATA_H=0;
     RET=WriteEC(0x66,0xa2);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x62,0x04);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x66,0xa3);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x62,0x04);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x66,0xa4);
     if(RET==EC_TIMEOUT) return;
     RET=ReadEC(DATA_L);
     if(RET==EC_TIMEOUT) return;
     
     delay(10);
     RET=WriteEC(0x66,0xa2);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x62,0x05);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x66,0xa3);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x62,0x04);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x66,0xa4);
     if(RET==EC_TIMEOUT) return;
     RET=ReadEC(DATA_H);
     if(RET==EC_TIMEOUT) return;

     /* printf("FCC DATA_H DATAT_L %X %X \n",DATA_H,DATA_L); */
     BAT1_FCC=*DATA_H*pow(2,8)+*DATA_L;





     textcolor(9);
     cprintf("Battery Total Capacity       : ");

     if(Designed_FCC-BAT1_FCC>0)
     {
      PER=Designed_FCC-BAT1_FCC;
     }else
       {
        PER=BAT1_FCC-Designed_FCC;
       }

     if(smart==1)
      per=0.10;
       else
        per=0.15;
     if(PER<=(Designed_FCC)*per)
     {
      ERROR+=0;
      textcolor(10);
     }else if(PER>(Designed_FCC)*per)
     {
      ERROR+=1;
      textcolor(12);
     }

     cprintf("%.0f ",BAT1_FCC);
     cprintf("mAH\r\n");

     delay(10);
     *DATA_L=0;*DATA_H=0;
     RET=WriteEC(0x66,0xa2);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x62,0x36);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x66,0xa3);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x62,0x04);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x66,0xa4);
     if(RET==EC_TIMEOUT) return;
     RET=ReadEC(DATA_L);
     if(RET==EC_TIMEOUT) return;


     delay(10);
     RET=WriteEC(0x66,0xa2);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x62,0x37);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x66,0xa3);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x62,0x04);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x66,0xa4);
     if(RET==EC_TIMEOUT) return;
     RET=ReadEC(DATA_H);
     if(RET==EC_TIMEOUT) return;

     /* printf("RC DATA_H DATAT_L %X %X \n",DATA_H,DATA_L); */

      j=(int)*DATA_L;
      i=(int)*DATA_H;
      if((j==0xff)&&(j==0xff))
       {
        BAT1_RC=0;
       }else
        {
         BAT1_RC=*DATA_H*pow(2,8)+*DATA_L;
        }
     textcolor(9);
     cprintf("Battery Remain Capacity      :");
     textcolor(10);
     cprintf(" %.0f ",BAT1_RC);
     cprintf("mAH\r\n");

     textcolor(9);
     cprintf("Current Capacity Rate        : ");
     textcolor(10);
     cprintf("%.1f",(BAT1_RC/BAT1_FCC)*100);
     cprintf("\%\r\n");

     delay(10);
     *DATA_L=0;*DATA_H=0;
     RET=WriteEC(0x66,0xa2);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x62,0x34);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x66,0xa3);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x62,0x04);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x66,0xa4);
     if(RET==EC_TIMEOUT) return;
     RET=ReadEC(DATA_L);
     if(RET==EC_TIMEOUT) return;

     
     delay(10);
     RET=WriteEC(0x66,0xa2);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x62,0x35);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x66,0xa3);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x62,0x04);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x66,0xa4);
     if(RET==EC_TIMEOUT) return;
     RET=ReadEC(DATA_H);
     if(RET==EC_TIMEOUT) return;

     /* printf("FCC DATA_H DATAT_L %X %X \n",DATA_H,DATA_L); */
     CHARGE_CURRENT=*DATA_H*pow(2,8)+*DATA_L;
     textcolor(9);
     cprintf("Current Battery I/O Current  : ");
     textcolor(10);
     /*
     if((CHARGE_CURRENT<=maxcur)&&(CHARGE_CURRENT>=mincur))
     {
      textcolor(10);
      ERROR+=0;
     }else
      {
       textcolor(12);
       ERROR+=1;
      }
     */
     cprintf("%.0f ",CHARGE_CURRENT);
     cprintf("mA\r\n");

     delay(10);
     *DATA_L=0;*DATA_H=0;
     RET=WriteEC(0x66,0xa2);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x62,0x38);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x66,0xa3);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x62,0x04);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x66,0xa4);
     if(RET==EC_TIMEOUT) return;
     RET=ReadEC(DATA_L);
     if(RET==EC_TIMEOUT) return;

     
     delay(10);
     RET=WriteEC(0x66,0xa2);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x62,0x39);
     if(RET==EC_TIMEOUT) return;
     RET=WriteEC(0x66,0xa3);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -