init.c

来自「WinCE 3.0 BSP, 包含Inter SA1110, Intel_815」· C语言 代码 · 共 539 行 · 第 1/2 页

C
539
字号
   ulReturn = HalGetBusDataByOffset(PNPISAConfiguration,
      0, (nCSN << 8) | nLogicalDevice, &PnPResources, 1,
      sizeof(PnPResources));
   
   if (ulReturn == 0) {
      DEBUGMSG(ZONE_PDD, (TEXT("PCMCIA: Couldn't read resources\r\n")));
      return FALSE;
   }
   
   DEBUGMSG(ZONE_PDD, (TEXT("After Reading 1st.\r\n")));
   
   if (!(PnPResources.Flags & ISA_PNP_RESOURCE_FLAG_ACTIVE))
   {
      //
      // Need to set the resources and activate the device
      //
      
      DEBUGMSG(ZONE_PDD, (TEXT("Setup the resources\r\n")));
      PnPResources.IoPortDescriptors[0] = (USHORT) IoBase;
      
      PnPResources.IRQDescriptors[0].IRQLevel = Irq;
      PnPResources.IRQDescriptors[0].IRQType = 0;
      PnPResources.Flags = ISA_PNP_RESOURCE_FLAG_ACTIVE;
   }      
   
   ulReturn = HalSetBusDataByOffset(PNPISAConfiguration,
       0, (nCSN << 8) | nLogicalDevice, &PnPResources, 1,
       sizeof(PnPResources));
      
   if (ulReturn == 0)
   {
      DEBUGMSG(ZONE_PDD, (TEXT("PCMCIA: Error writing resources\r\n")));
      return FALSE;
   }
      
   ulReturn = HalGetBusDataByOffset(PNPISAConfiguration,
      0, (nCSN << 8) | nLogicalDevice, &PnPResources, 1,
      sizeof(PnPResources));
    
   if (ulReturn == 0)
   {
      DEBUGMSG(ZONE_PDD, (TEXT("PCMCIA: Couldn't read resources\r\n")));
      return FALSE;
   }
      
     
   return TRUE;
}

//
// The PCMCIA MDD calls PDCardInitServices to initialize the PDD layer.
//
STATUS
PDCardInitServices()
{
    UINT8 tmp;
    DWORD IoBase;
    DWORD IoLen;
    DWORD SysIntr;
    DWORD dwRet;

    if ((dwRet = GetRegistryConfig(PCMCIA_DRIVER_KEY, &SysIntr, &IoBase, &IoLen))
        != ERROR_SUCCESS) {
        DEBUGMSG(ZONE_PDD,
            (TEXT("PDCardInitServices GetRegistryConfig failed %d\r\n"),
            dwRet));
        return CERR_GENERAL_FAILURE;
    }

    //
    // On CEPC, one IRQ is used for both the "SYSINTR_PCMCIA_STATE" and 
    // "SYSINTR_PCMCIA_LEVEL" interrupts.
    //
    gIntrPcmciaState = gIntrPcmciaLevel = SysIntr;

    g_Irq = PCMCIA_IRQ;
    private_InitPnP(IoBase, g_Irq);

    //
    // 0x3E0 is the standard Intel compatible socket controller I/O port.
    // The Vadem VG-469 defaults to 0x3E2 !!!
    //
    if (GetIOPorts(IoBase, IoLen)) {
        if (!IsValidPCICSig()) {
            IoBase += 2;    // SCM wants to use 0x3E2 (and now Simple Technology OEMs SCM's)
            if (GetIOPorts(IoBase, IoLen)) {
                if (!IsValidPCICSig()) {
                    return CERR_BAD_ADAPTER;
                }
            } else {
                return CERR_OUT_OF_RESOURCE;
            }
        }

    } else {
        return CERR_OUT_OF_RESOURCE;
    }

DEBUGMSG(ZONE_PDD,
    (TEXT("PDCardInitServices g_PCICIndex = 0x%x, g_PCICData = 0x%x\r\n"),
    g_PCICIndex, g_PCICData));

    InitializeCriticalSection(&g_PCIC_Crit);

    InitSocketNoCard(0);
    InitSocketNoCard(1);

    PCICIndex(0, REG_CHIP_REVISION);
    tmp = PCICDataRead();
DEBUGMSG(ZONE_PDD, (TEXT("PDCardInitServices REG_CHIP_REVISION = 0x%x\r\n"), tmp));

#ifdef DEBUG
    DumpSocketRegisters(0);
    DumpSocketRegisters(1);
#endif

    return CERR_SUCCESS;
}

//
// Function to set the PCIC index register
//
VOID
PCICIndex(
    UINT socket_num,
    UINT8  register_num
    )
{
    WRITE_PORT_UCHAR(g_PCICIndex,
        (UINT8)((socket_num == 0 ? 0 : 0x40)|register_num));
    READ_PORT_UCHAR((PUCHAR)0x61); // I/O delay
}

//
// Function to write to the PCIC data register
//
VOID
PCICDataWrite(
    UINT8 value
    )
{
    WRITE_PORT_UCHAR(g_PCICData, value);
    READ_PORT_UCHAR((PUCHAR)0x61); // I/O delay
}

//
// Function to read the PCIC data register
//
UINT8
PCICDataRead(VOID)
{
    return READ_PORT_UCHAR(g_PCICData);
}

#ifdef DEBUG
UCHAR SocketRegisters[2][REG_LAST_INDEX+1];

LPWSTR RegisterNames[] = {
TEXT("REG_CHIP_REVISION"), //                    0x00
TEXT("REG_INTERFACE_STATUS"), //                 0x01
TEXT("REG_POWER_CONTROL"), //                    0x02
TEXT("REG_INTERRUPT_AND_GENERAL_CONTROL"), //    0x03
TEXT("REG_CARD_STATUS_CHANGE"), //               0x04
TEXT("REG_STATUS_CHANGE_INT_CONFIG"), //         0x05
TEXT("REG_WINDOW_ENABLE"), //                    0x06
TEXT("REG_IO_WINDOW_CONTROL"), //                0x07
TEXT("REG_IO_MAP0_START_ADDR_LO"), //            0x08
TEXT("REG_IO_MAP0_START_ADDR_HI"), //            0x09
TEXT("REG_IO_MAP0_END_ADDR_LO"), //              0x0A
TEXT("REG_IO_MAP0_END_ADDR_HI"), //              0x0B
TEXT("REG_IO_MAP1_START_ADDR_LO"), //            0x0C
TEXT("REG_IO_MAP1_START_ADDR_HI"), //            0x0D
TEXT("REG_IO_MAP1_END_ADDR_LO"), //              0x0E
TEXT("REG_IO_MAP1_END_ADDR_HI"), //              0x0F
TEXT("REG_MEM_MAP0_START_ADDR_LO"), //           0x10
TEXT("REG_MEM_MAP0_START_ADDR_HI"), //           0x11
TEXT("REG_MEM_MAP0_END_ADDR_LO"), //             0x12
TEXT("REG_MEM_MAP0_END_ADDR_HI"), //             0x13
TEXT("REG_MEM_MAP0_ADDR_OFFSET_LO"), //          0x14
TEXT("REG_MEM_MAP0_ADDR_OFFSET_HI"), //          0x15
TEXT("REG_GENERAL_CONTROL"), //                  0x16
NULL, //                                         0x17
TEXT("REG_MEM_MAP1_START_ADDR_LO"), //           0x18
TEXT("REG_MEM_MAP1_START_ADDR_HI"), //           0x19
TEXT("REG_MEM_MAP1_END_ADDR_LO"), //             0x1A
TEXT("REG_MEM_MAP1_END_ADDR_HI"), //             0x1B
TEXT("REG_MEM_MAP1_ADDR_OFFSET_LO"), //          0x1C
TEXT("REG_MEM_MAP1_ADDR_OFFSET_HI"), //          0x1D
TEXT("REG_GLOBAL_CONTROL"), //                   0x1E
NULL, //                                         0x1F
TEXT("REG_MEM_MAP2_START_ADDR_LO"), //           0x20
TEXT("REG_MEM_MAP2_START_ADDR_HI"), //           0x21
TEXT("REG_MEM_MAP2_END_ADDR_LO"), //             0x22
TEXT("REG_MEM_MAP2_END_ADDR_HI"), //             0x23
TEXT("REG_MEM_MAP2_ADDR_OFFSET_LO"), //          0x24
TEXT("REG_MEM_MAP2_ADDR_OFFSET_HI"), //          0x25
NULL, //                                         0x26
NULL, //                                         0x27
TEXT("REG_MEM_MAP3_START_ADDR_LO"), //           0x28
TEXT("REG_MEM_MAP3_START_ADDR_HI"), //           0x29
TEXT("REG_MEM_MAP3_END_ADDR_LO"), //             0x2A
TEXT("REG_MEM_MAP3_END_ADDR_HI"), //             0x2B
TEXT("REG_MEM_MAP3_ADDR_OFFSET_LO"), //          0x2C
TEXT("REG_MEM_MAP3_ADDR_OFFSET_HI"), //          0x2D
NULL, //                                         0x2E
NULL, //                                         0x2F
TEXT("REG_MEM_MAP4_START_ADDR_LO"), //           0x30
TEXT("REG_MEM_MAP4_START_ADDR_HI"), //           0x31
TEXT("REG_MEM_MAP4_END_ADDR_LO"), //             0x32
TEXT("REG_MEM_MAP4_END_ADDR_HI"), //             0x33
TEXT("REG_MEM_MAP4_ADDR_OFFSET_LO"), //          0x34
TEXT("REG_MEM_MAP4_ADDR_OFFSET_HI")  //          0x35
};


VOID
DisplaySocketRegister(
    UINT socket,
    UCHAR reg,
    UCHAR value
    )
{
    if (reg > (REG_LAST_INDEX+1)) return;

    if (RegisterNames[reg] != NULL) {
        DEBUGMSG(ZONE_PDD,
            (TEXT("PCMCIA:PCIC Register[%d:%2x:%s] = 0x%x\r\n"),
            socket, reg, RegisterNames[reg & 0x3f], value));
    }
}


VOID
DumpSocketRegisters(
    UINT socket
    )
{
    UCHAR i;

    for (i = 0; i < REG_LAST_INDEX+1; i++) {
        PCICIndex(socket, i);
        SocketRegisters[socket][i] = PCICDataRead();
        DisplaySocketRegister(socket, i, SocketRegisters[socket][i]);
    }
}

VOID
DeltaSocketRegisters(
    UINT socket
    )
{
    UCHAR CurrentRegisters[REG_LAST_INDEX];
    UCHAR i;

    for (i = 0; i < REG_LAST_INDEX+1; i++) {
        PCICIndex(socket, i);
        CurrentRegisters[i] = PCICDataRead();
    }

    for (i = 0; i < REG_LAST_INDEX+1; i++) {
        if (CurrentRegisters[i] != SocketRegisters[socket][i]) {
            DisplaySocketRegister(socket, i, CurrentRegisters[i]);
            SocketRegisters[socket][i] = CurrentRegisters[i];
        }
    }
}

#endif

⌨️ 快捷键说明

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