📄 pccard.cpp
字号:
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 + -