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 + -
显示快捷键?