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

📄 driver.cpp

📁 WinCE5.0部分核心源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:

            #ifdef DEBUG_AUTO_CONFIG
            for (int i = 0; i < card->m_numProfiles; i++) {
                dumpProfile(&card->m_profiles[i], TRUE);
                }
            #endif

            }
        else {
            retval = FALSE;
            }

        NdisCloseConfiguration(ConfigHandle);
        }

    return retval;
}

//===========================================================================
    void DeRegisterAdapter (PCARD card)
//===========================================================================
// 
// Description: 
//    
//      Inputs: 
//    
//     Returns: 
//---------------------------------------------------------------------------
{
    if (card->m_AttribMemRegistered) {
        NdisMUnmapIoSpace( card->m_MAHandle, (void *)card->m_pAttribMemBase, CIS_ATTRIBMEM_SIZE );
        }

    //if( card->m_RadioMemBase )
    //  NdisMUnmapIoSpace( card->m_MAHandle, (void *)card->m_RadioMemBase, CIS_ATTRIBMEM_SIZE );
    
    if (card->m_ContolRegRegistered) {
        NdisMUnmapIoSpace( card->m_MAHandle, (void *)card->m_ContolRegMemBase, CTL_ATTRIBMEM_SIZE );
        }
    
    if (card->m_IoRegistered) {
        //NdisMUnmapIoSpace( card->m_MAHandle, (void *)card->m_IOBase, card->m_PortIOLen );
        NdisMDeregisterIoPortRange(card->m_MAHandle, card->m_InitialPort, card->m_PortIOLen, (void *)card->m_IOBase);
        if (card->m_PortIOLen8Bit) {
            //NdisMUnmapIoSpace( card->m_MAHandle, (void *)card->m_IOBase8Bit, card->m_PortIOLen8Bit );
            NdisMDeregisterIoPortRange(card->m_MAHandle, 
                                       card->m_InitialPort8Bit, 
                                       card->m_PortIOLen8Bit, 
                                       (void *)card->m_IOBase8Bit);
            }
        }
}

//===========================================================================
    BOOLEAN RegisterAdapter (PCARD card)
//===========================================================================
// 
// Description: 
//    
//      Inputs: 
//    
//     Returns: 
//---------------------------------------------------------------------------
{
    NDIS_STATUS             Status;
    NDIS_PHYSICAL_ADDRESS   AttributePhysicalAddress;
//  UINT                    InitialPort = card->m_IOBase;

    Status = NdisMRegisterIoPortRange((void **)&card->m_IOBase, 
                                      card->m_MAHandle, 
                                      card->m_InitialPort,  
                                      card->m_PortIOLen);

    if (NDIS_STATUS_SUCCESS != Status) {
        LogError(card, NDIS_ERROR_CODE_BAD_IO_BASE_ADDRESS, BAD_IO_BASE_ADDRESS );
        return FALSE;
        }

    if (card->m_PortIOLen8Bit) {
        //InitialPort   = card->m_IOBase8Bit;
        Status = NdisMRegisterIoPortRange((void **)&card->m_IOBase8Bit, 
                                          card->m_MAHandle, 
                                          card->m_InitialPort8Bit,
                                          card->m_PortIOLen8Bit);

        if (NDIS_STATUS_SUCCESS !=  Status) {
            NdisMUnmapIoSpace(card->m_MAHandle, (void *)card->m_IOBase, card->m_PortIOLen);
            LogError(card, NDIS_ERROR_CODE_BAD_IO_BASE_ADDRESS, BAD_IO_BASE_ADDRESS);
            return FALSE;
            }
        }
    card->m_IoRegistered = TRUE;
    
//spbMgc
#if (NDISVER < 5) || (NDISVER == 41)
    if (card->m_pAttribMemBase) {
        NdisSetPhysicalAddressHigh(AttributePhysicalAddress, 0);
        NdisSetPhysicalAddressLow(AttributePhysicalAddress, (ULONG)card->m_pAttribMemBase);
        Status = NdisMMapIoSpace((PVOID *)&card->m_pAttribMemBase,card->m_MAHandle, AttributePhysicalAddress,CIS_ATTRIBMEM_SIZE);

        if (NDIS_STATUS_SUCCESS !=  Status) {
            LogError(card, NDIS_ERROR_CODE_BAD_IO_BASE_ADDRESS, BAD_ATTRIBMEM_BASE_ADDRESS);
            card->m_AttribMemRegistered = FALSE;
            }
        else {
            card->m_AttribMemRegistered = TRUE;
            }
        }
#endif

    //------------------------------------------
    if (card->m_ContolRegMemBase) {
        NdisSetPhysicalAddressHigh(AttributePhysicalAddress, 0);
        NdisSetPhysicalAddressLow(AttributePhysicalAddress, (ULONG)card->m_ContolRegMemBase);
        Status = NdisMMapIoSpace((PVOID *)&card->m_ContolRegMemBase, 
                                 card->m_MAHandle, 
                                 AttributePhysicalAddress,
                                 CTL_ATTRIBMEM_SIZE);

        if (NDIS_STATUS_SUCCESS != Status) {
            LogError(card, NDIS_ERROR_CODE_BAD_IO_BASE_ADDRESS, BAD_ATTRIBMEM_BASE_ADDRESS );
            }
        else {
            card->m_ContolRegRegistered = TRUE;
            }
        }
    //}
    return TRUE;
}

BOOLEAN         
RegisterInterrupt(
    PCARD   card
    )
{
    NDIS_STATUS Status = NdisMRegisterInterrupt( &card->Interrupt, card->m_MAHandle, 
                            card->m_InterruptNumber, card->m_InterruptNumber, 
                            TRUE, TRUE, NdisInterruptLevelSensitive );

    if ( Status != NDIS_STATUS_SUCCESS) 
        LogError(card, NDIS_ERROR_CODE_INTERRUPT_CONNECT, INTERRUPT_CONNECT);

    return card->m_InterruptRegistered = (NDIS_STATUS_SUCCESS == Status);   
}   


#ifndef UNDER_CE
extern "C" {
#define WANTVXDWRAPS
#include <basedef.h>        
#include <VMM.H>
#include <vxdldr.h>
#include <VXDWRAPS.H>
}

#include <AiroVxdWrap.H>

BOOLEAN         
LoadVxd(
    PCARD   card
    )
{
    #define VXDLDR_INIT_DEVICE  0x000000001 
    
    if ( OS_WIN95!=OSType || NULL == VxdLoadName)
        return FALSE;
    
    ULONG   flags           = VXDLDR_INIT_DEVICE;
    struct  VxD_Desc_Block  *ddb    = NULL;
    struct  DeviceInfo      *handle = NULL;
    ULONG                   ret;

    if( 0 == (ret = VXDLDR_LoadDevice(  &ddb, &handle, VxdLoadName, flags )) && handle ){
         card->m_VxdLoaded = TRUE;
        STDRIVER_ENTRY ld   ={VXD_LOAD,0,(UINT)cbQueryInformation};
        ld.card             = (UINT)card;
        ld.CardType         = (VXD_CARDTYPE)card->m_CardType;

        MiniPortEntry(&ld);

    }
    else
        LogError(card, NDIS_ERROR_CODE_UNSUPPORTED_CONFIGURATION, VXD_NOTLOADED );

    return 0==ret;
}

void            
UnloadVxd(
    PCARD   card
    )
{
    if( OS_WIN95!=OSType || FALSE == card->m_VxdLoaded || NULL == VxdUnloadName)
        return;

    STDRIVER_ENTRY ld ={VXD_UNLOAD,0,0};
    ld.card = (UINT)card;
    MiniPortEntry(&ld);
    VXDLDR_UnloadDevice(  (unsigned short)0xffff, VxdUnloadName);
}
#endif


//spb023
#ifdef MICROSOFT
BOOLEAN CheckRev(PCARD card)
{
    extern unsigned char imageData[];

    STCAPS  caps;

    if ( ! cmdCapsGet(card, &caps ) ) {
        return FALSE;
    }

    #if DBG
        DbgPrint("Caps Software is %x\n",caps.u16SoftwareVersion);
        DbgPrint("Caps SubSoftware is %x\n",caps.u16SoftwareSubVersion);
    #endif
  
    unsigned int myRev, thisRev, x1, x2, y1, y2;

    myRev=imageData[0x178];                 // hard coded in image file
    myRev = (myRev<<8) + imageData[0x179];
    myRev = (myRev<<16) + imageData[0x17a];

    x1= ((ULONG)caps.u16SoftwareVersion) >> 12;
    x2= (((ULONG)caps.u16SoftwareVersion) >> 8) % 16;
    y1= (((ULONG)caps.u16SoftwareVersion) >> 4) % 16;
    y2= ((ULONG)caps.u16SoftwareVersion) % 16;

    if ((x1 > 9) || (y1 > 9) || (x2 > 9) || (y2 > 9)) {
        #if DBG
            DbgPrint("Cant determine the version %x,%x,%x,%x\n",x1,y1,x2,y2);
        #endif

        return TRUE;  // can't determine what it is so flash it
    }

    thisRev = (((x1*10+x2) << 8) + (y1*10+y2)) << 16;

    x1= ((ULONG)caps.u16SoftwareSubVersion) >> 12;
    x2= (((ULONG)caps.u16SoftwareSubVersion) >> 8) % 16;
    y1= (((ULONG)caps.u16SoftwareSubVersion) >> 4) % 16;
    y2= ((ULONG)caps.u16SoftwareSubVersion) % 16;

    //spb027
    if ((x1 > 16) || (y1 > 16) || (x2 > 16) || (y2 > 16)) {
        #if DBG
            DbgPrint("Cant determine the subversion %x,%x,%x,%x\n",x1,y1,x2,y2);
        #endif

        return TRUE;  // can't determine what it is so flash it
    }

//spb027    thisRev += (x1*1000+x2*100+y1*10+y2);
    thisRev += (x1*64+x2*32+y1*16+y2);

    #if DBG
        DbgPrint("Driver Rev is %x.\n",myRev);
        DbgPrint("MAC Rev is %x.\n",thisRev);
    #endif

    if (myRev > thisRev)
        return TRUE;
    else
        return FALSE;
}

#include "flash.h"

//spb026
//Note THIS FUNCTION CAN ONLY BE CALLED AT IRQL < DISPATCH_LEVEL
void FlashImage(PCARD card)
{
    extern unsigned char imageData[];

    char *pBuffer = (char *)&imageData[16+256];
    DbgPrint("Starting to Flash\n");

    card->m_IsFlashing  = TRUE;

    //Init Flash
    FlashInit(card);
    FLASH_STRUCT        *p = &card->FlashSt;    

    //Copy flash image
    for( int i =0; i<128; i++ ) {
        FlashCopyNextBlock(card, pBuffer + i * 1024 );
    }

    //Ok Simulate the timer tick.
    do {
        if (p->m_delay) {
            //Simulate a timer tick
            #if DBG
            DbgPrint("Sleeping for %d\n",p->m_delay*1000);
            #endif
            NdisMSleep(p->m_delay*1000);
        }

        FlashStartFlashing(card,FALSE);
    } while (FLASHCMD_INPROGRESS == p->m_Progress);
}


#endif



⌨️ 快捷键说明

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