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

📄 wince.c

📁 Wince4.2 BSP for SH4 engineering development board
💻 C
📖 第 1 页 / 共 2 页
字号:
[HKEY_LOCAL_MACHINE\Comm\CELAN1]
   "DisplayName"="CELAN Compatible Ethernet Driver"
   "Group"="NDIS"
   "ImagePath"="celan.dll"

[HKEY_LOCAL_MACHINE\Comm\CELAN1\Parms]
   "BusNumber"=dword:0
   "BusType"=dword:8
   "InterruptNumber"=dword:03
   "IoBaseAddress"=dword:0300
   "Transceiver"=dword:3
   "CardType"=dword:1
*/

    DWORD i;
    LPWSTR lpDetectKeyName;

    DEBUGMSG(ZONE_INIT,
        (TEXT("CELAN:Install_Driver(%s, %s, %d)\r\n"),
        lpPnpId, lpRegPath, cRegPathSize));

    if ((lpDetectKeyName = FindDetectKey()) == NULL) {
        return NULL;
    }

    if (!AddKeyValues(lpDetectKeyName, DetectKeyValues)) {
        goto wid_fail1;
    }

    for (i = 0; i < (sizeof(KeyNames)/sizeof(LPWSTR)); i++) {
        if (!AddKeyValues(KeyNames[i], Values[i])) {
            goto wid_fail;
        }
    }
    LocalFree(lpDetectKeyName);

    //
    // Return "Drivers\\PCMCIA\\CELAN"
    //
    wcscpy(lpRegPath, KeyNames[0]);
    return lpRegPath;

wid_fail:
    //
    // Clean up after ourself on failure.
    //
    for (i = 0; i < (sizeof(KeyNames)/sizeof(LPWSTR)); i++) {
        RegDeleteKey(HKEY_LOCAL_MACHINE,KeyNames[i]);
    }

wid_fail1:
    RegDeleteKey(HKEY_LOCAL_MACHINE, lpDetectKeyName);
    LocalFree(lpDetectKeyName);
    return NULL;

}

//
// Find an unused Detect key number and return the registry path name for it.
//
// Return NULL for failure
//
LPWSTR
FindDetectKey(VOID)
{
    HKEY hDetectKey;
    DWORD dwKeyNum;
    DWORD dwDisp;
    DWORD Status;
    WCHAR * pKeyName;
    LPWSTR pKeyNum;

    pKeyName = LocalAlloc(LPTR, sizeof(WCHAR) * 255);
    if (pKeyName == NULL) {
        return NULL;
    }
    wcscpy(pKeyName, (TEXT("Drivers\\PCMCIA\\Detect\\")));
    pKeyNum = pKeyName + wcslen(pKeyName);
    
    //
    // Find a detect number and create the detect key.
    //
    for (dwKeyNum = 40; dwKeyNum < 99; dwKeyNum++) {
        wsprintf(pKeyNum, (TEXT("%02d")), dwKeyNum);
        Status = RegCreateKeyEx(
                     HKEY_LOCAL_MACHINE,
                     pKeyName,
                     0,
                     NULL,
                     REG_OPTION_NON_VOLATILE,
                     0,
                     NULL,
                     &hDetectKey,
                     &dwDisp);
        if (Status == ERROR_SUCCESS) {
            RegCloseKey(hDetectKey);
            if (dwDisp == REG_CREATED_NEW_KEY) {
                return pKeyName;
            }
        }
    }
    LocalFree(pKeyName);
    return NULL;
}


#define NUM_CFTABLE_ENTRIES 10

LPWSTR
DetectCELAN(
    CARD_SOCKET_HANDLE hSock,
    UCHAR DevType,
    LPWSTR DevKey,
    DWORD  DevKeyLen
    )
{
    CARD_CLIENT_HANDLE hPcmcia = NULL;
    HANDLE          hPcmciaDll = NULL;
    REGISTERCLIENT  pfnRegisterClient;
    DEREGISTERCLIENT  pfnDeregisterClient;
    GETPARSEDTUPLE  pfnGetParsedTuple;
    REQUESTWINDOW   pfnRequestWindow;
    RELEASEWINDOW   pfnReleaseWindow;
    MAPWINDOW       pfnMapWindow;
    REQUESTCONFIG   pfnRequestConfig;
    RELEASECONFIG   pfnReleaseConfig;
    RESETFUNCTION   pfnResetFunction;
    CARD_REGISTER_PARMS Parms;
    CARD_WINDOW_PARMS Cwp;
    CARD_WINDOW_HANDLE hMemWin;
    DWORD MemGran;
    volatile PUCHAR pPort;
    CARD_CONFIG_INFO CfgInfo;
    PARSED_CFTABLE CfTable[NUM_CFTABLE_ENTRIES];
    DWORD cerr;
    DWORD cCFTs,iCFT,iRange;
    UCHAR Cmd;
    LPWSTR lpRet;

    if (DevType != PCCARD_TYPE_NETWORK) {
        return NULL;
    }

    hPcmciaDll = LoadLibrary(TEXT("PCMCIA.DLL"));
    if (hPcmciaDll == NULL) {
        return NULL;
    }

    pfnGetParsedTuple = (GETPARSEDTUPLE) GetProcAddress(hPcmciaDll, TEXT("CardGetParsedTuple"));
    pfnMapWindow = (MAPWINDOW) GetProcAddress(hPcmciaDll, TEXT("CardMapWindow"));
    pfnRegisterClient = (REGISTERCLIENT) GetProcAddress(hPcmciaDll, TEXT("CardRegisterClient"));
    pfnDeregisterClient = (DEREGISTERCLIENT) GetProcAddress(hPcmciaDll, TEXT("CardDeregisterClient"));
    pfnRequestConfig = (REQUESTCONFIG) GetProcAddress(hPcmciaDll, TEXT("CardRequestConfiguration"));
    pfnReleaseConfig = (RELEASECONFIG) GetProcAddress(hPcmciaDll, TEXT("CardReleaseConfiguration"));
    pfnRequestWindow = (REQUESTWINDOW) GetProcAddress(hPcmciaDll, TEXT("CardRequestWindow"));
    pfnReleaseWindow = (RELEASEWINDOW) GetProcAddress(hPcmciaDll, TEXT("CardReleaseWindow"));
    pfnResetFunction = (RESETFUNCTION) GetProcAddress(hPcmciaDll, TEXT("CardResetFunction"));

    lpRet = NULL;

    if ((pfnGetParsedTuple == NULL) ||
        (pfnMapWindow == NULL) ||
        (pfnRegisterClient == NULL) || 
        (pfnDeregisterClient == NULL) || 
        (pfnRequestConfig == NULL) ||
        (pfnReleaseConfig == NULL) ||
        (pfnResetFunction == NULL) ||
        (pfnRequestWindow == NULL) ||
        (pfnReleaseWindow == NULL)) {
        DEBUGMSG(ZONE_INIT, (TEXT("DetectCELAN: Failed to load PCMCIA.DLL\r\n")));
        goto dn_fail1;
    }

    //
    // Find which configuration to use
    //
    cCFTs = NUM_CFTABLE_ENTRIES;
    cerr = pfnGetParsedTuple(hSock, CISTPL_CFTABLE_ENTRY, CfTable, &cCFTs);
    if (cerr != CERR_SUCCESS) {
        DEBUGMSG(ZONE_INIT,
            (TEXT("DetectCELAN: CardGetParsedTuple failed %d\r\n"),
            cerr));
        goto dn_fail1;
    }

    for (iCFT = 0; iCFT < cCFTs; iCFT++) {
        for (iRange = 0; iRange < CfTable[iCFT].NumIOEntries; iRange++) {
            if ((CfTable[iCFT].IOLength[iRange] == 31) &&
                ((CfTable[iCFT].IOBase[iRange] == 0x300) ||
                 (CfTable[iCFT].IOBase[iRange] == 0x320) ||
                 (CfTable[iCFT].IOBase[iRange] == 0x340) ||
                 (CfTable[iCFT].IOBase[iRange] == 0x360))) {
                     goto dn_got_range;
            }
        }
    }
    DEBUGMSG(ZONE_INIT,
        (TEXT("DetectCELAN: No CELAN address ranges found!\r\n")));
    goto dn_fail1;

dn_got_range:
    DEBUGMSG(ZONE_INIT,
        (TEXT("DetectCELAN: Using Config index 0x%x, range 0x%x %d\r\n"),
        CfTable[iCFT].ConfigIndex, CfTable[iCFT].IOBase[iRange],
        CfTable[iCFT].IOLength[iRange]));
    

    //
    // Register with PCMCIA driver
    //
    Parms.fEventMask = EVENT_MASK_CARD_DETECT|EVENT_MASK_POWER_MGMT;
    Parms.fAttributes = CLIENT_ATTR_IO_DRIVER | CLIENT_ATTR_NOTIFY_SHARED |
                        CLIENT_ATTR_NOTIFY_EXCLUSIVE;
    hPcmcia = (CARD_CLIENT_HANDLE)pfnRegisterClient(NULL, &Parms);
    if (hPcmcia == 0) {
        DEBUGMSG(ZONE_INIT,
            (TEXT("DetectCELAN: CardRegisterClient failed %d\r\n"),
            GetLastError()));
        goto dn_fail1;
    }

    //
    // Request a Pcmcia IO window
    //
    Cwp.hSocket = hSock;
    Cwp.fAttributes = WIN_ATTR_IO_SPACE;
    Cwp.uWindowSize = 0x20;
    Cwp.fAccessSpeed = WIN_SPEED_USE_WAIT;
    hMemWin = pfnRequestWindow(hPcmcia, &Cwp);
    if (hMemWin == NULL) {
        DEBUGMSG(ZONE_INIT, (TEXT("DetectCELAN: CardRequestWindow failed %d\r\n"),
            GetLastError()));
        goto dn_fail1;
    }

    //
    // Map the Pcmcia IO window
    //
    pPort = pfnMapWindow(hMemWin, CfTable[iCFT].IOBase[iRange], 0x20, &MemGran);
    if (pPort == NULL) {
        DEBUGMSG(ZONE_INIT, (TEXT("DetectCELAN: CardMapWindow failed %d\r\n"),
            GetLastError()));
        goto dn_fail;
    }

    //
    // Use CardRequestConfiguration to place card in I/O mode
    //
    CfgInfo.hSocket = hSock;
    CfgInfo.fAttributes = 0;
    CfgInfo.fInterfaceType = CFG_IFACE_MEMORY_IO;
    CfgInfo.uVcc = 50;
    CfgInfo.uVpp1 = 0;
    CfgInfo.uVpp2 = 0;
    CfgInfo.fRegisters = CFG_REGISTER_CONFIG|CFG_REGISTER_STATUS;
    CfgInfo.uConfigReg = CfTable[iCFT].ConfigIndex;
    CfgInfo.uStatusReg = FCR_FCSR_REQUIRED_BITS;
    cerr = pfnRequestConfig(
                hPcmcia,
                &CfgInfo);

    if (cerr != CERR_SUCCESS) {
        DEBUGMSG(ZONE_INIT,
            (TEXT("DetectCELAN: CardRequestConfiguration failed %d\r\n"),
            cerr));
        goto dn_fail;
    }

    pPort[NIC_INTR_MASK] = 0;      // Turn off CELAN interrupts
    pPort[NIC_COMMAND] = 0x21;     // Tell CELAN to stop
    Sleep(2000);
    Cmd = pPort[NIC_COMMAND];      // Check response
    switch (Cmd) {
    case 0x21:
    case 0x23:
        lpRet = DevKey;
        wcscpy(DevKey, TEXT("CELAN"));
        break;
    default:
        DEBUGMSG(ZONE_INIT,
            (TEXT("DetectCELAN: CELAN command port = 0x%x\r\n"), Cmd));
    }

    pfnResetFunction(hPcmcia, hSock);
    pfnReleaseConfig(hPcmcia, hSock);
dn_fail:
    pfnReleaseWindow(hMemWin);

    cerr = pfnDeregisterClient(hPcmcia);
    if (cerr) {
        DEBUGMSG(ZONE_INIT, (TEXT("DetectCELAN: CardDeregisterClient failed %d\r\n"),
            cerr));
    }

dn_fail1:
    FreeLibrary(hPcmciaDll);
    return lpRet;
}

⌨️ 快捷键说明

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