亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pcicfg.c

?? WINCE5.0操作系統下的PCI總線驅動
?? C
?? 第 1 頁 / 共 5 頁
字號:

        Status = ((PFN_CONFIGENTRY)(Info.ConfigInfo->ConfigEntryFn))(PCIBUS_CONFIG_RSRC, &Info, g_MemHead, g_IoHead, pMemSize, pIoSize);
        
        if (Status != ERROR_SUCCESS) {
            if (Status == ERROR_NOT_SUPPORTED) {
                // ConfigEntry point doesn't support this type of call, so do it here
                // Read the base address registers to determine space to allocate
                if (!PCICfgCheckBARs(&Info, pMemSize, pIoSize, NULL)) {
                    DEBUGMSG(ZONE_ERROR, (L"PCIBUS!PCICfgCardBusBridge: Failed PCICfgCheckBARs call\r\n"));
                    
                    return FALSE;
                }
            } else {
                DEBUGMSG(ZONE_ERROR, (L"PCIBUS!PCICfgCardBusBridge: Failed %s:%s call\r\n", Info.DllName, Info.ConfigEntryName));

                return FALSE;
            }
        }
    } else {
        // Read the base address registers to determine space to allocate
        if (!PCICfgCheckBARs(&Info, pMemSize, pIoSize, NULL)) {
            DEBUGMSG(ZONE_ERROR, (L"PCIBUS!PCICfgCardBusBridge: Failed PCICfgCheckBARs call\r\n"));
            
            return FALSE;
        }
    }

    // If device not already placed, configure interrupt
    if (!(pCfg->Command & (PCI_ENABLE_IO_SPACE | PCI_ENABLE_MEMORY_SPACE))) {
        DEVICE_LOCATION DevLoc;
        DWORD Irq = 0xFF;

        Reg = PCIConfig_Read(Bus, Device, Function, PCI_CONFIG_INTERRUPT);
        
        if (((PPCI_INT)(&Reg))->InterruptLine==0xff || ((PPCI_INT)(&Reg))->InterruptLine==0) { // Not be configured
            // Fill in device location structure
            DevLoc.IfcType = PCIBus;
            DevLoc.BusNumber = Bus;
            DevLoc.LogicalLoc = (Bus << 16) | (Device << 8) | Function;
            DevLoc.Pin = ((PPCI_INT)(&Reg))->InterruptPin;
            
            if (DevLoc.Pin) {
                // Interrupts used, get IRQ from OAL
                if (!RequestIrq(&DevLoc, &Irq)) {
                    DEBUGMSG(ZONE_WARNING, (L"PCIBUS!PCICfgCardBusBridge: Get IRQ call failed.\r\n"));
                    // No Interrupt
                    Irq = 0xff;
                } 
                else if (Irq > 254) {
                    DEBUGMSG(ZONE_WARNING, (L"PCIBUS!PCICfgCardBusBridge: IRQ returned from OAL is outside of range (0-254).  Ignoring.\r\n"));
                    
                    // No interrupts
                    Irq = 0xFF;
                }
            }
            
            DEBUGMSG(ZONE_INIT, (L"RequestIrq(%d/%d/%d) returns %d\r\n", Bus, Device, Function, Irq));
            
            ((PPCI_INT)(&Reg))->InterruptLine = (BYTE)Irq;
            PCIConfig_Write(Bus, Device, Function, PCI_CONFIG_INTERRUPT, Reg);   
        }
    }
    
    // Disable memory and I/O windows
    PCIConfig_Write(Bus, Device, Function, PCICARDBUS_MEMBASE0, 0xFFFFF000);
    PCIConfig_Write(Bus, Device, Function, PCICARDBUS_MEMLIMIT0, 0x0);
    PCIConfig_Write(Bus, Device, Function, PCICARDBUS_MEMBASE1, 0xFFFFF000);
    PCIConfig_Write(Bus, Device, Function, PCICARDBUS_MEMLIMIT1, 0x0);
    PCIConfig_Write(Bus, Device, Function, PCICARDBUS_IOBASE0, 0xFFFFFFFC);
    PCIConfig_Write(Bus, Device, Function, PCICARDBUS_IOLIMIT0, 0x0);
    PCIConfig_Write(Bus, Device, Function, PCICARDBUS_IOBASE1, 0xFFFFFFFC);
    PCIConfig_Write(Bus, Device, Function, PCICARDBUS_IOLIMIT1, 0x0);
    
    // Set bridge control register
    Reg = PCIConfig_Read(Bus, Device, Function, PCI_CONFIG_INTERRUPT);
    Reg = (Reg & 0x0000FFFF) | Info.BridgeControl << 16;
    PCIConfig_Write(Bus, Device, Function, PCI_CONFIG_INTERRUPT, Reg);

    // Set Latency register
    Info.Latency = (Info.Latency > 0) ? Info.Latency : pBusInfo->Latency;   // use global bus value if not defined for bridge
    if (Info.Latency) {
        // Reprogram only if non-zero
        Reg = PCIConfig_Read(Bus, Device, Function, PCI_CONFIG_HEAD);
        Reg = (Reg & 0xFFFF00FF) | ((Info.Latency & 0xFF) << 8);
        PCIConfig_Write(Bus, Device, Function, PCI_CONFIG_HEAD, Reg);
    }
    
    // Set the bus numbers & secondary (CardBus) latency
    // Assume There is no bridge type device attached the CardBus Bridge
    (*pSubordinateBus)++;
    Info.SecondaryLatency = (Info.SecondaryLatency > 0) ? Info.SecondaryLatency : pBusInfo->SecondaryLatency;   // use global bus value if not defined for bridge
    Reg = PCIConfig_Read(Bus, Device, Function, PCICARDBUS_BUS_NUMBER);
    ((PBRIDGE_BUS)(&Reg))->PrimaryBusNumber = (BYTE)Bus;
    ((PBRIDGE_BUS)(&Reg))->SecondaryBusNumber = (BYTE)(*pSubordinateBus);
    ((PBRIDGE_BUS)(&Reg))->SubordinateBusNumber = (BYTE)(*pSubordinateBus);
    if (Info.SecondaryLatency) ((PBRIDGE_BUS)(&Reg))->SecondaryLatencyTimer = (BYTE)Info.SecondaryLatency;
    PCIConfig_Write(Bus, Device, Function, PCICARDBUS_BUS_NUMBER, Reg);
    
    // Write command value and reset device status
    Reg = PCIConfig_Read(Bus, Device, Function, PCI_CONFIG_COMMAND_STATUS);
    Reg &= 0x7;
    Reg |= 0xFFFF0000 | (Info.Command & 0x000003FF);
    PCIConfig_Write(Bus, Device, Function, PCI_CONFIG_COMMAND_STATUS, Reg);

    DEBUGMSG(ZONE_FUNCTION, (L"PCIBUS!PCICfgCardBusBridge-\r\n"));
        
    return TRUE;
}


//
// Read and check Base Address Registers, calculate size and allocate resources
//
static BOOL
PCICfgCheckBARs(
    PPCI_DEV_INFO pInfo,
    PULONG pMemSize,
    PULONG pIoSize,
    PULONG pPrefetchMemSize    
    )
{
    DWORD NumberOfRegs;
    ULONG Offset;
    ULONG i;
    ULONG BaseAddress;
    ULONG Size;
    ULONG Type;
    BOOL  Prefetchable;
    DWORD Reg;
    BOOL Placed = FALSE;
    BOOL SizeFound;
    DWORD IoIndex = 0;
    DWORD MemIndex = 0;
    DWORD Bus = pInfo->Bus;
    DWORD Device = pInfo->Device;
    DWORD Function = pInfo->Function;
    PPCI_COMMON_CONFIG pCfg = pInfo->Cfg;

    DEBUGMSG(ZONE_FUNCTION, (L"PCIBUS!PCICfgCheckBARs+(Bus %d, Device %d, Function %d)\r\n",
        Bus, Device, Function));
    
    // Check to see if device/function already enabled
    if (pCfg->Command & (PCI_ENABLE_IO_SPACE | PCI_ENABLE_MEMORY_SPACE)) {
        // Either Memory or I/O access enabled
        Placed = TRUE;

#ifdef DEBUG
        if (!pInfo->Matched) {
            DEBUGMSG(ZONE_WARNING, (L"PCIBUS!PCICfgCheckBARs: WARNING: No matching registry key was found for placed device %d/%d/%d.\r\n",
                Bus, Device, Function));
            DEBUGMSG(ZONE_WARNING, (L"PCIBUS!PCICfgCheckBARs:          Problems can result if the device is being used while configuring PCIbus.\r\n"));
        }
#endif
    }

    // Determine number of BARs to examine from header type
    switch (pCfg->HeaderType & ~PCI_MULTIFUNCTION) {
    case PCI_DEVICE_TYPE:
        NumberOfRegs = PCI_TYPE0_ADDRESSES;
        break;

    case PCI_BRIDGE_TYPE:
        NumberOfRegs = PCI_TYPE1_ADDRESSES;
        break;

    case PCI_CARDBUS_TYPE:
        NumberOfRegs = PCI_TYPE2_ADDRESSES;
        break;

    default:
        return FALSE;
    }
    
    for (i = 0, Offset = 0x10; i < NumberOfRegs; i++, Offset += 4) {
        // Get base address register value
        Reg = pCfg->u.type0.BaseAddresses[i];
        Type = Reg & PCI_ADDRESS_IO_SPACE;
        Prefetchable = ( Type==0 && (Reg & PCI_ADDRESS_MEMORY_PREFETCHABLE)!=0 && pPrefetchMemSize!=NULL) ;
        
        if (Placed && pInfo->Matched && (pInfo->IoLen.Num + pInfo->MemLen.Num) != 0) {
            // Device already placed and has matching registry entry
            if (Type) {
                // I/O space
                Size = pInfo->IoLen.Reg[IoIndex++];
                Reg &= PCI_ADDRESS_IO_ADDRESS_MASK;

                SizeFound = (IoIndex <= pInfo->IoLen.Num);
            } else {
                // Memory space
                Size = pInfo->MemLen.Reg[MemIndex++];
                Reg &= PCI_ADDRESS_MEMORY_ADDRESS_MASK;

                SizeFound = (MemIndex <= pInfo->MemLen.Num);
            }
        } else {
            // Device not placed or is placed and has no matching registry entry => Probe hardware for size
            PCIConfig_Write(Bus,Device,Function,Offset,0xFFFFFFFF);
            BaseAddress = PCIConfig_Read(Bus,Device,Function,Offset);
            PCIConfig_Write(Bus, Device, Function, Offset, Reg);

            if (Type) {
                // IO space
                // Re-adjust BaseAddress if upper 16-bits are 0 (allowable in PCI 2.2 spec)
                if (((BaseAddress & PCI_ADDRESS_IO_ADDRESS_MASK) != 0) && ((BaseAddress & 0xFFFF0000) == 0)) {
                    BaseAddress |= 0xFFFF0000;
                }
                
                Size = ~(BaseAddress & PCI_ADDRESS_IO_ADDRESS_MASK);
                Reg &= PCI_ADDRESS_IO_ADDRESS_MASK;
            } else {
                // Memory space
                if ((Reg & PCI_ADDRESS_MEMORY_TYPE_MASK) == PCI_TYPE_20BIT) {
                    // PCI 2.2 spec no longer supports this type of memory addressing
                    DEBUGMSG(ZONE_ERROR, (L"PCIBUS!PCICfgCheckBARs: 20-bit addressing not supported\r\n"));
                    return FALSE;
                }
                
                // Re-adjust BaseAddress if upper 16-bits are 0 (allowed by PCI 2.2 spec)
                if (((BaseAddress & PCI_ADDRESS_MEMORY_ADDRESS_MASK) != 0) && ((BaseAddress & 0xFFFF0000) == 0)) {
                    BaseAddress |= 0xFFFF0000;
                }
                
                Size = ~(BaseAddress & PCI_ADDRESS_MEMORY_ADDRESS_MASK);
                Reg &= PCI_ADDRESS_MEMORY_ADDRESS_MASK;
            }

            // Check that the register has a valid format; it should have consecutive high 1's and consecutive low 0's
            SizeFound = (BaseAddress != 0) && (BaseAddress != 0xFFFFFFFF) && (((Size + 1) & Size) == 0);

            Size +=1;
        }

        if (SizeFound) {
            PPCI_RSRC Rsrc = PCIRsrc_New(Bus, Device, Function, Offset, Reg, Size, FALSE, 0, Placed, NULL);
            
            if (!Rsrc) {
                DEBUGMSG(ZONE_ERROR, (L"PCIBUS!PCICfgCheckBARs: Failed local alloc of Rsrc\r\n"));
                return FALSE;
            }

            if (Type == PCI_ADDRESS_IO_SPACE) {
                *pIoSize += Size;
                PCIRsrc_Add(g_IoHead, Rsrc);
            } else {
                if (Prefetchable && g_PrefetchMemHead!=NULL) {
                    *pPrefetchMemSize += Size;
                    PCIRsrc_Add(g_PrefetchMemHead, Rsrc);
                }
                else {
                    *pMemSize += Size;
                    PCIRsrc_Add(g_MemHead, Rsrc);
                }
            }

            DEBUGMSG(ZONE_INIT, (L"PCIBUS!PCICfgCheckBars: BAR(%d/%d/%d): Offset 0x%x, Type %s, Size 0x%X\r\n",
                Bus, Device, Function, Offset, (Type == PCI_ADDRESS_IO_SPACE) ? TEXT("I/O") : TEXT("Memory"), Size));
        } else {
            // Some devices have invalid BARs before valid ones (allowed by PCI 2.2 spec).  Skip invalid BARs.
            continue;
        }

        // check for 64 bit device (memory only)
        if ((Type == PCI_ADDRESS_MEMORY_SPACE) && ((Reg & PCI_ADDRESS_MEMORY_TYPE_MASK) == PCI_TYPE_64BIT)) {
            // 64 bit device - BAR is twice as wide - zero out high part
            Offset += 4;
            i++;
            PCIConfig_Write(Bus, Device, Function, Offset, 0x0);
        }
    }

    DEBUGMSG(ZONE_FUNCTION, (L"PCIBUS!PCICfgCheckBars-\r\n", Bus, Device, Function));

    return TRUE;
}


//
// For each I/O resource, allocate I/O space on PCIbus and assign address to BAR
//
static BOOL
PCICfgAllocateIoSpace(
    DWORD Bus,
    DWORD Base,
    DWORD Size
    )
{
    PPCI_RSRC Rsrc, BusHead;
    ULONG IoBase;
    DWORD Reg;
   
    DEBUGMSG(ZONE_FUNCTION, (L"PCIBUS!PCICfgAllocateIoSpace+(Bus %d, Base 0x%X, Size 0x%X)\r\n", Bus, Base, Size));
    
    // Create bus head node with available address range
    if (!(BusHead = PCIRsrc_New(Bus, 0, 0, 0, Base, Size, TRUE, 0, TRUE, NULL))) {
        DEBUGMSG(ZONE_ERROR, (L"PCIBUS!PCICfgAllocateIoSpace: Failed local alloc of BusHead\r\n"));
        return FALSE;
    }

    while (Rsrc = PCIRsrc_GetNext(g_IoHead, Bus)) {
        // Place resource
        if (!PCIRsrc_Place(BusHead, Rsrc)) {
            DEBUGMSG(ZONE_ERROR,
                (L"PCIBUS!PCICfgAllocIoSpace: Failed to place %s resource: Bus %d, Device %d, Function %d\r\n",
                (Rsrc->Bridge) ? L"Bridge" : L"Device", Rsrc->Bus, Rsrc->Device, Rsrc->Function));
                    
            continue;
        }

        DEBUGMSG(ZONE_INIT, (L"PCIBUS!PciIinitAllocIoSpace (%s): Bus %d, Device %d, Function %d, Offset 0x%X, IoBase 0x%X, IoSize 0x%X\r\n",
            (Rsrc->Bridge) ? L"PCI-PCI Bridge" : L"Device", Rsrc->Bus, Rsrc->Device, Rsrc->Function, Rsrc->Offset, Rsrc->Base, Rsrc->Size));

        if (Rsrc->Bridge) {
            // PCI-PCI bridge
            BOOL Use32bitIo;
            
            // Allocate resources for bridge's secondary bus
            PCICfgAllocateIoSpace(Rsrc->SecBus, Rsrc->Base, Rsrc->Size);
            
            // Write I/O base and limit registers
            IoBase = PCIConfig_Read(Rsrc->Bus, Rsrc->Device, Rsrc->Function, PCIBRIDGE_IO);

            // Check to see if the bridge is using 16-bit I/O or 32-bit I/O
            Use32bitIo = ((IoBase & 0xF) == PCI_SECONDARY_IO32);
            
            // Set bridge's base and limit address registers
            ((PBRIDGE_IO)(&IoBase))->IoLimit.Address = (BYTE)(((Rsrc->Base + Rsrc->Size - 1) & 0xF000) >> 12);
            ((PBRIDGE_IO)(&IoBase))->IoBase.Address = (BYTE)(((Rsrc->Base) & 0xF000) >> 12);
            PCIConfig_Write(Rsrc->Bus, Rsrc->Device, Rsrc->Function, PCIBRIDGE_IO, IoBase);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色88888久久久久久影院野外| 精品国产免费久久| 国产日韩精品一区二区三区在线| 亚洲一区二区精品久久av| 成人黄色一级视频| 精品美女在线播放| 激情另类小说区图片区视频区| 欧洲一区在线观看| 亚洲精品成人a在线观看| 99久久国产综合精品色伊| 国产午夜精品久久| 不卡av免费在线观看| 国产精品久久毛片a| 一本色道亚洲精品aⅴ| 亚洲综合精品自拍| 7777精品伊人久久久大香线蕉最新版 | 五月婷婷欧美视频| 欧美日韩国产a| 亚洲精品国久久99热| 欧美日韩一二区| 蜜臀99久久精品久久久久久软件 | 国产麻豆精品一区二区| 久久久五月婷婷| 91浏览器入口在线观看| 亚洲一区二区三区四区在线| 欧美日韩一区二区三区不卡| 六月丁香婷婷色狠狠久久| 日本一二三不卡| 欧美日韩精品欧美日韩精品一| 久久se这里有精品| 亚洲视频在线一区| 日韩欧美久久一区| 日本电影欧美片| 国产成人在线网站| 日本色综合中文字幕| 《视频一区视频二区| 欧美电视剧在线看免费| 91蝌蚪porny| 久久99精品一区二区三区三区| 综合欧美亚洲日本| 久久久精品国产免费观看同学| 欧美怡红院视频| 99久久伊人久久99| 久久精品综合网| 综合婷婷亚洲小说| 9人人澡人人爽人人精品| 中文字幕av一区 二区| 欧美成人a视频| 在线播放91灌醉迷j高跟美女| 成人不卡免费av| 大美女一区二区三区| 国产一区在线观看视频| 日本特黄久久久高潮| 一区二区三区高清不卡| 欧美极品xxx| 国产网红主播福利一区二区| 欧美在线观看视频在线| 97久久超碰国产精品电影| 91丨porny丨在线| 色综合欧美在线| 欧美日韩一区二区欧美激情| 91精品91久久久中77777| 欧洲av一区二区嗯嗯嗯啊| jizzjizzjizz欧美| 欧美色综合影院| 日韩免费在线观看| 国产丝袜在线精品| 亚洲欧美福利一区二区| 亚洲高清免费视频| 奇米精品一区二区三区四区| 琪琪一区二区三区| 国产成人亚洲综合a∨猫咪| 国产黄色精品视频| 91视频免费观看| 欧美日韩精品欧美日韩精品一| 日韩一区二区三区免费观看| 日韩欧美一二三四区| 亚洲欧洲精品一区二区三区不卡| 一区二区三区在线观看欧美| 青青草成人在线观看| 白白色 亚洲乱淫| 日韩一区二区电影在线| 国产精品视频九色porn| 性做久久久久久免费观看| 国产一区二区电影| 欧美一区二区成人| 久久精品一区二区三区不卡 | 日韩欧美激情一区| 中文字幕日本不卡| 久久不见久久见免费视频1| 99久久久精品免费观看国产蜜| 91精品国产91久久综合桃花 | 欧美一区二区三区免费在线看| 亚洲国产高清aⅴ视频| 亚洲午夜久久久久久久久电影院| 国产精品一二三四| 欧美经典一区二区| 精彩视频一区二区| 日韩欧美的一区| 爽好多水快深点欧美视频| 91福利国产成人精品照片| 亚洲欧美在线视频| 北岛玲一区二区三区四区| 国产欧美久久久精品影院| 国产乱码精品一品二品| 久久久久高清精品| 成人avav影音| 综合电影一区二区三区| av高清久久久| 洋洋av久久久久久久一区| 欧美日韩色综合| 久久精品国产99久久6| 久久久五月婷婷| 99久久久久久| 午夜不卡av在线| 日韩一区二区在线观看| 久久er精品视频| 精品久久久久久久久久久院品网| 一区二区三区久久久| 色婷婷亚洲精品| 天天操天天干天天综合网| 欧美日韩一区二区三区四区五区| 亚洲午夜久久久| 精品成人在线观看| 成人美女在线视频| 亚洲色大成网站www久久九九| 91影视在线播放| 亚洲综合色噜噜狠狠| 欧美精品日韩精品| 国产在线一区二区综合免费视频| 精品国内二区三区| 国产精品888| 亚洲一区二区不卡免费| 欧美一级日韩不卡播放免费| 国产精品国产三级国产a| 91成人看片片| 看电影不卡的网站| 亚洲日本va午夜在线影院| 欧美一三区三区四区免费在线看 | 国产精品毛片高清在线完整版 | 国产精品久久夜| 日韩欧美一区二区三区在线| 成人永久看片免费视频天堂| 亚洲成年人网站在线观看| 精品国产百合女同互慰| 色综合久久天天| 国产成人综合在线播放| 日日欢夜夜爽一区| 亚洲特级片在线| 国产三级精品视频| 欧美视频日韩视频在线观看| 国产suv精品一区二区883| 日本视频在线一区| 午夜电影久久久| 亚洲五月六月丁香激情| 一区在线播放视频| 亚洲欧美在线视频| 欧美精品一区二区在线播放| 91精品国产欧美一区二区18| 欧美在线观看一区二区| 色天使色偷偷av一区二区| 成人av影院在线| 成人动漫中文字幕| k8久久久一区二区三区| 成人高清视频在线观看| 精品在线免费观看| 国产精品资源网站| 粉嫩嫩av羞羞动漫久久久| 狠狠狠色丁香婷婷综合久久五月| 首页亚洲欧美制服丝腿| 奇米在线7777在线精品| 国产在线不卡一区| 成人福利视频网站| www.欧美.com| 欧美久久免费观看| 欧美不卡一区二区| 国产喷白浆一区二区三区| 中文字幕精品在线不卡| 亚洲三级小视频| 久久精品999| 石原莉奈在线亚洲三区| 精品在线视频一区| 成人99免费视频| 91精品国产综合久久精品| 久久综合久久鬼色中文字| 国产片一区二区| 午夜成人在线视频| 国产凹凸在线观看一区二区| 欧美亚洲高清一区| 2023国产精品视频| 一区二区三区不卡视频在线观看| 日韩电影免费在线观看网站| 国产一区在线不卡| 欧美亚洲日本一区| 久久久久久一二三区| 亚洲成av人片一区二区梦乃| 亚洲第一狼人社区| 色综合天天性综合| 欧美精品一区二区精品网| 国产精品伦理在线|