isaconfig.c

来自「WinCE 3.0 BSP, 包含Inter SA1110, Intel_815」· C语言 代码 · 共 266 行

C
266
字号
/* -*-C-*-
 *
 * $Revision: 1.1 $
 *   $Author: kwelton $
 *     $Date: 2000/03/16 02:55:56 $
 *
 * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
 * ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
 * PARTICULAR PURPOSE.
 *
 * Copyright (c) 1995, 1996, 1997, 1998  Microsoft Corporation
 * Copyright (c) 1999, 2000 ARM Limited
 * All Rights Reserved
 */
#define WINCEMACRO 1

#include <windows.h>
#include <nkintr.h>
#include <ceddk.h>
#include <rio.h>
#include <platform.h>

#define ADDRESS_PORT            0x2E
#define WRITE_DATA_PORT         0x2F
#define READ_DATA_PORT          0x2F

/**********************************************************************/

static UCHAR pnpRead(UCHAR ucRegNo)
{
    WRITE_PORT_UCHAR((PUCHAR)(g_VirtIOBase + RIO_IOBASE_PC87307 +
                              ADDRESS_PORT),
                     ucRegNo);

    return READ_PORT_UCHAR((PUCHAR)(g_VirtIOBase + RIO_IOBASE_PC87307 +
                                    READ_DATA_PORT));
}

static void pnpWrite(UCHAR ucRegNo, UCHAR ucValue)
{
    WRITE_PORT_UCHAR((PUCHAR)(g_VirtIOBase + RIO_IOBASE_PC87307 +
                              ADDRESS_PORT),
                     ucRegNo);

    WRITE_PORT_UCHAR((PUCHAR)(g_VirtIOBase + RIO_IOBASE_PC87307 +
                              WRITE_DATA_PORT),
                     ucValue);
}

/**********************************************************************/

UCHAR RIO_IsaPnpRead(UCHAR ucLogicalDevice, UCHAR ucRegNo)
{
    pnpWrite(0x07, ucLogicalDevice);

    return (pnpRead(ucRegNo));
}

void RIO_IsaPnpWrite(UCHAR ucLogicalDevice, UCHAR ucRegNo, UCHAR ucValue)
{
    pnpWrite(0x07, ucLogicalDevice);
    pnpWrite(ucRegNo, ucValue);
}

/**********************************************************************/

void RIO_PrintISAConfig(PISA_PNP_RESOURCES  pRes)
{
#ifdef DEBUG
    int i;

    VDPF("RIO_PrintISAConfig\r\n");

    DPF("---------------------------------------%s\r\n",
        pRes->Flags ? "  ACTIVE" : "INACTIVE");

    for (i=0;i<4; i++) {
        if (pRes->Memory24Descriptors[i].MemoryBase)
            DPF("MEM24[%d] 0x%X, 0x%X, 0x%X\r\n", i,
                pRes->Memory24Descriptors[i].MemoryBase,
                pRes->Memory24Descriptors[i].MemoryUpperLimit,
                pRes->Memory24Descriptors[i].MemoryControl);
    }
    for (i=0;i<4; i++) {
        if (pRes->Memory32Descriptors[i].MemoryBase)
            DPF("MEM32[%d] 0x%X, 0x%X, 0x%X\r\n", i,
                pRes->Memory32Descriptors[i].MemoryBase,
                pRes->Memory32Descriptors[i].MemoryUpperLimit,
                pRes->Memory32Descriptors[i].MemoryControl);
    }
    for (i=0;i<4; i++) {
        if (pRes->IoPortDescriptors[i])
            DPF("IOPRT[%d] 0x%X\r\n", i,
                pRes->IoPortDescriptors[i]);
    }
    for (i=0;i<2; i++) {
        if (pRes->IRQDescriptors[i].IRQLevel) {
            DPF("IRQ_L[%d] 0x%X\r\n", i,
                pRes->IRQDescriptors[i].IRQLevel);
            DPF("IRQ_T[%d] 0x%X\r\n", i,
                pRes->IRQDescriptors[i].IRQType);
        }
    }

# if 0
    DPF("----------------------------------------------------\r\n");
# endif /* 0/1 */

#endif /* def DEBUG */
}

/**********************************************************************/

BOOL RIO_GetISAConfig(UCHAR ucLogicalDevice, PISA_PNP_RESOURCES pRes)
{
    int i;
    UCHAR ucActive;
    BYTE bVal1, bVal2, bVal3, bVal4, bVal5;

    VDPF("RIO_GetISAConfig\r\n");

    pnpWrite(0x07, ucLogicalDevice);

    ucActive = pnpRead(0x30);

    if ( ucActive )
    {
        pRes->Flags = ISA_PNP_RESOURCE_FLAG_ACTIVE;

        for (i = 0; i < 4; i++)
        {
            bVal1 = pnpRead((UCHAR) (0x40 + i * 8));
            bVal2 = pnpRead((UCHAR) (0x41 + i * 8));
            bVal3 = pnpRead((UCHAR) (0x42 + i * 8));
            bVal4 = pnpRead((UCHAR) (0x43 + i * 8));
            bVal5 = pnpRead((UCHAR) (0x44 + i * 8));

            pRes->Memory24Descriptors[i].MemoryBase = (bVal1 << 8) | bVal2;
            pRes->Memory24Descriptors[i].MemoryControl = bVal3;
            pRes->Memory24Descriptors[i].MemoryUpperLimit =
                (bVal4 << 8) | bVal5;
        }

        for (i = 0; i < 8; i++)
        {
            bVal1 = pnpRead((UCHAR) (0x60 + i * 2));
            bVal2 = pnpRead((UCHAR) (0x61 + i * 2));

            pRes->IoPortDescriptors[i] = (bVal1 << 8) | bVal2;
        }

        pRes->IRQDescriptors[0].IRQLevel = pnpRead(0x70);
        pRes->IRQDescriptors[0].IRQType  = pnpRead(0x71);
        pRes->IRQDescriptors[1].IRQLevel = pnpRead(0x72);
        pRes->IRQDescriptors[1].IRQType  = pnpRead(0x73);

        pRes->DMADescriptors[0] = pnpRead(0x74);

        pRes->DMADescriptors[1] = pnpRead(0x75);

        for (i = 0; i < 4; i++)
        {
            bVal1 = pnpRead((UCHAR) (0x76 + i * 16));
            bVal2 = pnpRead((UCHAR) (0x77 + i * 16));
            bVal3 = pnpRead((UCHAR) (0x78 + i * 16));
            bVal4 = pnpRead((UCHAR) (0x79 + i * 16));

            pRes->Memory32Descriptors[i].MemoryBase =
                (bVal1 << 24) | (bVal2 << 16) | (bVal3 << 8) | bVal4;

            pRes->Memory32Descriptors[i].MemoryControl =
                pnpRead((UCHAR)(0x7A + i * 16));

            bVal1 = pnpRead((UCHAR) (0x7B + i * 16));
            bVal2 = pnpRead((UCHAR) (0x7C + i * 16));
            bVal3 = pnpRead((UCHAR) (0x7D + i * 16));
            bVal4 = pnpRead((UCHAR) (0x7E + i * 16));

            pRes->Memory32Descriptors[i].MemoryUpperLimit =
                (bVal1 << 24) | (bVal2 << 16) | (bVal3 << 8) | bVal4;
        }
    }
    else
        pRes->Flags = 0;

    VDPF("-RIO_GetISAConfig\r\n");

    return (TRUE);
}

BOOL RIO_SetISAConfig(UCHAR ucLogicalDevice, PISA_PNP_RESOURCES pRes)
{
    int i;

    VDPF("RIO_SetISAConfig\r\n");

    pnpWrite(0x07, ucLogicalDevice);

    if (pRes->Flags & ISA_PNP_RESOURCE_FLAG_ACTIVE)
    {
        for (i = 0; i < 4; i++)
        {
            pnpWrite((UCHAR)(0x40 + i * 8),
                     (UCHAR)(pRes->Memory24Descriptors[i].MemoryBase >> 8));
            pnpWrite((UCHAR)(0x41 + i * 8),
                     (UCHAR)(pRes->Memory24Descriptors[i].MemoryBase));

            pnpWrite((UCHAR)(0x42 + i * 8),
                     pRes->Memory24Descriptors[i].MemoryControl);

            pnpWrite((UCHAR)(0x43 + i * 8),
                     (UCHAR)(pRes->Memory24Descriptors[i].MemoryUpperLimit >> 8));
            pnpWrite((UCHAR)(0x44 + i * 8),
                     (UCHAR)(pRes->Memory24Descriptors[i].MemoryUpperLimit));
        }

        for (i = 0; i < 8; i++)
        {
            pnpWrite((UCHAR)(0x60 + i * 2),
                     (UCHAR)(pRes->IoPortDescriptors[i] >> 8));
            pnpWrite((UCHAR)(0x61 + i * 2),
                     (UCHAR)(pRes->IoPortDescriptors[i]));
        }

        pnpWrite(0x70, pRes->IRQDescriptors[0].IRQLevel);
        pnpWrite(0x71, pRes->IRQDescriptors[0].IRQType);
        pnpWrite(0x72, pRes->IRQDescriptors[1].IRQLevel);
        pnpWrite(0x73, pRes->IRQDescriptors[1].IRQType);

        pnpWrite(0x74, pRes->DMADescriptors[0]);
        pnpWrite(0x75, pRes->DMADescriptors[1]);

        for (i = 0; i < 4; i++)
        {
            pnpWrite((UCHAR)(0x76 + i * 16),
                     (UCHAR)(pRes->Memory32Descriptors[i].MemoryBase >> 24));
            pnpWrite((UCHAR)(0x77 + i * 16),
                     (UCHAR)(pRes->Memory32Descriptors[i].MemoryBase >> 16));
            pnpWrite((UCHAR)(0x78 + i * 16),
                     (UCHAR)(pRes->Memory32Descriptors[i].MemoryBase >> 8));
            pnpWrite((UCHAR)(0x79 + i * 16),
                     (UCHAR)(pRes->Memory32Descriptors[i].MemoryBase));
            pnpWrite((UCHAR)(0x7A + i * 16),
                     pRes->Memory32Descriptors[i].MemoryControl);
            pnpWrite((UCHAR)(0x7B + i * 16),
                     (UCHAR)(pRes->Memory32Descriptors[i].MemoryUpperLimit >> 24));
            pnpWrite((UCHAR)(0x7C + i * 16),
                     (UCHAR)(pRes->Memory32Descriptors[i].MemoryUpperLimit >> 16));
            pnpWrite((UCHAR)(0x7D + i * 16),
                     (UCHAR)(pRes->Memory32Descriptors[i].MemoryUpperLimit >> 8));
            pnpWrite((UCHAR)(0x7E + i * 16),
                     (UCHAR)(pRes->Memory32Descriptors[i].MemoryUpperLimit));
        }

        pnpWrite(0x30, 1);
    }
    else
        pnpWrite(0x30, 0);

    VDPF("-RIO_SetISAConfig\r\n");
    return (TRUE);
}

/* EOF isaconfig.c */

⌨️ 快捷键说明

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