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

📄 pccard.cpp

📁 通过PCCARD SPEC测试笔记本的外部接口的电压是正常
💻 CPP
📖 第 1 页 / 共 2 页
字号:
   if(!rc)
       return FT_FAIL;

   if(PciCfgFile)
   {
      printf("\nTesting card PCI data accessing...\n");  

      for(int i=PciCfgBase;i<=PciCfgLimit;i++)
      {
         FileItem dat(PciCfgFile); 
         char item[20];
         DWORD expect,actual;

         sprintf(item,"OFFSET 0x%08lX",i);

         rc = dat.GetHEX(NULL,item,expect);
         if(!rc)
         {
             printf("Can not load %s! in %s\n",item,PciCfgFile);
             return FT_FAIL;
         }                     
  
         if((actual=cb.cdev[0]->GetB(i))!=expect)
         {
            printf("Error comparison data %s\n",item);
            printf("Expect: 0x%02X , Actual: 0x%02X\n",expect,actual);    

            return FT_FAIL;
         }
      }//for    
   } //if(PciCfgFile

   printf("Success.\n\n");

   printf("All test pass!\n");

   return FT_PASS; 
}



//-----------------------------------------------------------------------
// CardBus::CardBus : Constructor.
// Input : None.
// Output : None.
//-----------------------------------------------------------------------
CardBus::CardBus()
{
  bOK = FALSE;
  cOK = FALSE; 
  bdev = NULL;

  for(int i=0;i<MAX_PCCARD_DEV;i++)
      cdev[i] = NULL;

  BridgeName = NULL;
  type = CARDBUS_COMMON;
  card_power = PCCARD_NA;
  card_type = PCCARD_NA;
  sub_bus = 0xFF;
  cdev_num = 0;

  DWORD bus,dev,fun;

  for(int i=0;i<CardBusBridgeNum;i++)
      if(FindPCIDevice(CardBusBridge[i].vid,CardBusBridge[i].did,&bus,&dev,&fun,5))
      {
          bdev = new DevPCI(bus,dev,fun);  
          if(!bdev)
               return;

          BridgeName = CardBusBridge[i].name;

          switch(i)
          {
            case 0: //O2 Oz711Mp1
                    type = CARDBUS_COMMON;
                    break;        
          }

          bOK = TRUE;
          return;
      }//if     

  return;
}


//-----------------------------------------------------------------------
// CardBus::InitBridge : Initalize cardbus bridge registers.
// Input : None.
// Output : TRUE / FALSE
//-----------------------------------------------------------------------
BOOL CardBus::InitBridge()
{
  if(!bOK)
      return FALSE;
  
  printf("\nInitializing CardBus bridge controller...\n");


  if(bdev->rc[0].base.d==0) //BIOS not initial Socket/ExCA base
  {
     DWORD mb;

     BOOL rc = FindFreePCIMemRC(bdev->bus,bdev->rc[0].length.d,&mb);
     if(!rc)
         return FALSE;

     bdev->SetD(0x10,mb);

  }

  bdev->SetB(0x18,0x1);
  bdev->SetB(0x19,0x2);
  bdev->SetB(0x1A,0x2);

  DWORD bus = bdev->bus;
  DWORD dev = bdev->dev;
  DWORD func = bdev->func;

  delete bdev;

  bdev = new DevPCI(bus,dev,func);        
  if(!bdev)
  {
     bOK = FALSE;
     return FALSE;  
  }

  sub_bus = 0x2;

  printf("success.\n");

  return TRUE;
}


BOOL CardBus::DetectCard()
{
  if(!bOK)
      return FALSE;

   printf("\nDetecting socket & PC card...\n\n");

  if(type==CARDBUS_COMMON)
  {
      DWORD sts = bdev->RcGetD(0,SOCKET_PRE_STATE);

      printf("Detecting socket type...\n");

      if(MASK(sts,0x1UL<<STATE_5VSOCKET))
          printf("Socket support 5V Vcc card\n");
      if(MASK(sts,0x1UL<<STATE_3VSOCKET))
          printf("Socket support 3.3V Vcc card\n");
      if(MASK(sts,0x1UL<<STATE_XVSOCKET))
          printf("Socket support X.XV Vcc card\n");
      if(MASK(sts,0x1UL<<STATE_YVSOCKET))
          printf("Socket support Y.YV Vcc card\n");
      if(MASK(sts,0x1UL<<STATE_ZVSUPPORT))
          printf("Socket support Zoomed video\n\n");

      printf("\nDetecting PC card...\n");

      if(!MASK(sts,0x1UL<<STATE_CDETECT1) && !MASK(sts,0x1UL<<STATE_CDETECT2))
          printf("PC card is present in the socked.\n");
      else
      {
          printf("No card is present in the socket!\n");
          return FALSE;     
      }

      if(MASK(sts,0x1UL<<STATE_NOTACARD))
      {
          printf("Unrecognizable PC card!\n");
          return FALSE;  
      }

      if(MASK(sts,0x1UL<<STATE_5VCARD))
      {
          card_power = PCCARD_5V;
          printf("5V PC card detected\n");

          if(!MASK(sts,0x1UL<<STATE_5VSOCKET))
          {
             printf("Unsupport 5V card type!\n");
             return FALSE;
          }    
      }

      if(MASK(sts,0x1UL<<STATE_3VCARD))
      {
          card_power = PCCARD_3V;
          printf("3.3V PC card detected\n");
  
          if(!MASK(sts,0x1UL<<STATE_3VSOCKET))
          {
             printf("Unsupport 3.3V card type!\n");
             return FALSE;
          }    
      }

      if(MASK(sts,0x1UL<<STATE_XVCARD))
      {
          card_power = PCCARD_XV;
          printf("X.XV PC card detected\n");
     
          if(!MASK(sts,0x1UL<<STATE_XVSOCKET))
          {
             printf("Unsupport X.XV card type!\n");
             return FALSE;
          }    
      }

      if(MASK(sts,0x1UL<<STATE_YVCARD))
      {
          card_power = PCCARD_YV;
          printf("Y.YV PC card detected\n");

          if(!MASK(sts,0x1UL<<STATE_YVSOCKET))
          {
             printf("Unsupport Y.YV card type!\n");
             return FALSE;
          }    
      }

    
      if(MASK(sts,0x1UL<<STATE_16BITCARD))
      {
          printf("16 bit PC card is detected.\n");
          card_type = PCCARD_16BIT;
      }      

      if(MASK(sts,0x1UL<<STATE_CBCARD))
      {
          printf("32 bit cardbus card is detected.\n");
          card_type = PCCARD_32BIT;
      }  
  }

  return TRUE;
}



BOOL CardBus::PowerOn()
{
  if(!bOK)
      return FALSE;

  printf("\nPower up to socket card...\n");  

  if(type==CARDBUS_COMMON)
  {
      bdev->RcSetD(0,SOCKET_EVENT,0xFFFFFFFF);  //clear event status
     
      iodelay(0x10);

      BYTE pwr;

      if(card_power==PCCARD_5V)
          pwr = 0x22;
      else if(card_power==PCCARD_3V)
          pwr = 0x33;
      else if(card_power==PCCARD_XV)
          pwr = 0x44;
      else if(card_power==PCCARD_YV)
          pwr = 0x55;

      bdev->RcSetB(0,SOCKET_CONTROL,pwr);

      delay(0x50);

      DWORD sts = bdev->RcGetD(0,SOCKET_PRE_STATE);

      if(MASK(sts,0x1UL<<STATE_BADVCCREQ))
      {
          printf("Invalid Vcc power request!\n");
        
          return FALSE;
      }  

      if(!MASK(sts,0x1UL<<STATE_PWRCYCLE))
      {
          printf("Socket power up failed!\n");
          bdev->RcSetD(0,SOCKET_EVENT,0xFFFFFFFF);  //clear event status
          return FALSE;
      }    

      printf("Socket power up successfully.\n");

      iodelay(0x10);
      bdev->RcSetD(0,SOCKET_EVENT,0xFFFFFFFF);  //clear event status
      iodelay(0x10);
      bdev->SetW(0x3E,CLBITW(bdev->GetW(0x3E),6)); //clear reset signal
      delay(10);
      bdev->RcSetD(0,SOCKET_EVENT,0xFFFFFFFF);  //clear event status
      iodelay(0x10);
  }//if

  return TRUE;
}


BOOL CardBus::InitCard()
{
  printf("\nInitializing PC card devices...\n");

  for(int dev=0;dev<32;dev++)
  {
     if(get_pci_d(sub_bus,dev,0,0)!=0xFFFFFFFFUL)
     {   
        cdev[cdev_num] = new DevPCI(sub_bus,dev,0,TRUE);
        if(!cdev[cdev_num])
            return FALSE;    

        cdev_num++;
     }

     if(MASK(get_pci_b(sub_bus,dev,0,PCI_CFG_HTYPE),0x80)) //check if multi-function
         for(int fun=0;fun<8;fun++)
            if(get_pci_d(sub_bus,dev,0,0)!=0xFFFFFFFFUL)
            {   
                cdev[cdev_num] = new DevPCI(sub_bus,dev,0,TRUE); //Evaluate RC detection
                if(!cdev[cdev_num])
                   return FALSE;    

                cdev_num++;
            }//if
  }//for       

  if(cdev_num)
      cOK = TRUE;

  printf("success.\n");

  return cOK;
}



CardBus::~CardBus()
{
   if(bdev)
       delete bdev;

   for(int i=0;i<cdev_num;i++)
       if(cdev[i])
           delete cdev[i];      
}


⌨️ 快捷键说明

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