system.c
字号:
/*
Copyright(c) 1998,1999 SIC/Hitachi,Ltd.
Module Name:
system.c
Revision History:
17th May 1999 Released
10yh June 1999 Update
23th June 1999 Update
28th June 1999 Update ATAPI Interface pulldown resistance additional
05th July 1999 Update SEEK Command add
*/
#include <windows.h>
#include <types.h>
#include <tchar.h>
#include <cardserv.h>
#include <cardapi.h>
#include <tuple.h>
#include <devload.h>
#include <diskio.h>
#include "atapidev.h"
/******************************************************************************
* Modification Done by Maneesh Gupta
*
* Replacment of header file s1.h with platform.h
*****************************************************************************/
#include "platform.h"
/******************************************************************************
*End of Modification Done by Maneesh Gupta
*****************************************************************************/
#include "atapi.h"
#include <oalintr.h>
#include <Winbase.h>
//
// This module contains the necessary OS interface functions:
// ATAPIDriverInitializeAddress
// ATAPIEntry
// CreateDiskObject
// IsValidDisk
// GetDiskStateError
// InitFSD
// ATA_Init and the other device API functions
// ATAInit
// ATAPIDetect
// ATAPIIsrThread
//
//#define TRY_FOR_8BIT 1
#ifdef DEBUG
// Zone message
DBGPARAM dpCurSettings = {
TEXT("ATA Disk"), {
TEXT("Errors"),TEXT("Warnings"),TEXT("Functions"),TEXT("Initialization"),
TEXT("Disk I/O"),TEXT("IST"),TEXT("Undefined"),TEXT("Undefined"),
TEXT("Undefined"),TEXT("Undefined"),TEXT("Undefined"),TEXT("Undefined"),
TEXT("Undefined"),TEXT("Undefined"),TEXT("Undefined"),TEXT("Undefined") },
ATAPI_INIT
};
#endif // DEBUG
PDISK ATAInit(LPTSTR ActivePath);
BOOL ATAPIDetect(VOID);
DWORD GetDiskStateError(DWORD DiskState);
BOOL GetFolderName(PDISK pDisk, LPWSTR pOutBuf, DWORD nOutBufSize, DWORD * pBytesReturned);
WORD TurnATAPI(VOID);
/******************************************************************************
* Modification Done by Maneesh Gupta
*
* Addition of StartATAPI unit command
*****************************************************************************/
WORD StartATAPIUnit(VOID);
/******************************************************************************
*End of Modification Done by Maneesh Gupta
*****************************************************************************/
WORD StartStopCD(WORD StartBit);
DWORD ATAPIIsrThread(PDISK pDisk);
WORD DataIN(VOID);
WORD GetATAPError(void);
WORD SenseData(void);
//USHORT Kdata[512];
CDROM_STATE CD_ROM_STA;
//
// Global Variables
//
DWORD dwRSize; //CD-ROM read size
PBYTE pAPLOutbuf; //Application data work address
DWORD dwTimer;
DWORD dwCount;
//WORD ATAPI_errcode; //
PVBYTE v_pIoRegs; // base address for ATAPI devices registers
PVBYTE v_pIoDatas; // base address for ATAPI work data
PVBYTE v_pIoIntreg; // Int flag register
DWORD v_MemGran; // memory granularity from CardMapMemory (usually 1)
CRITICAL_SECTION v_ATAPICrit;
PDISK v_DiskList; // initialized to 0 in bss
REGISTERCLIENT v_pfnCardRegisterClient;
DEREGISTERCLIENT v_pfnCardDeregisterClient;
GETFIRSTTUPLE v_pfnCardGetFirstTuple;
GETNEXTTUPLE v_pfnCardGetNextTuple;
GETTUPLEDATA v_pfnCardGetTupleData;
GETPARSEDTUPLE v_pfnCardGetParsedTuple;
REQUESTWINDOW v_pfnCardRequestWindow;
RELEASEWINDOW v_pfnCardReleaseWindow;
MAPWINDOW v_pfnCardMapWindow;
REQUESTCONFIG v_pfnCardRequestConfiguration;
RELEASECONFIG v_pfnCardReleaseConfiguration;
REQUESTIRQ v_pfnCardRequestIRQ;
RELEASEIRQ v_pfnCardReleaseIRQ;
REQUESTSOCKETMASK v_pfnCardRequestSocketMask;
RELEASESOCKETMASK v_pfnCardReleaseSocketMask;
GETSTATUS v_pfnCardGetStatus;
//
// ATAPIDriverInitializeAddress - Allocate ATAPI registers
//
BOOL
ATAPIDriverInitializeAddress(VOID)
{
// Map I/O ATAPI base address
v_pIoRegs = (PVBYTE)VirtualAlloc( 0, ATAPI_SIZE, MEM_RESERVE, PAGE_NOACCESS );
if ( v_pIoRegs == NULL )
{
ERRORMSG(1,
(TEXT("ATAPIDriverInitializeAddress: VirtualAlloc failed!\r\n")));
goto error_return;
}
if ( !VirtualCopy((PVOID)v_pIoRegs, (PVOID)ATAPI_BASE, ATAPI_SIZE, PAGE_READWRITE | PAGE_NOCACHE) )
{
ERRORMSG(1,
(TEXT("ATAPIDriverInitializeAddress: VirtualCopy failed!\r\n")));
goto error_return;
}
//
// Define ATAPI registers
//
ATAPI_DATW = (volatile PWORD)(v_pIoRegs + ATAPI_REG_DATW_OFFSET);
ATAPI_AERR = (volatile PBYTE)(v_pIoRegs + ATAPI_REG_AERR_OFFSET);
ATAPI_IRRN = (volatile PBYTE)(v_pIoRegs + ATAPI_REG_IRRN_OFFSET);
ATAPI_RSVE = (volatile PBYTE)(v_pIoRegs + ATAPI_REG_RSVE_OFFSET);
ATAPI_BCTL = (volatile PBYTE)(v_pIoRegs + ATAPI_REG_BCTL_OFFSET);
ATAPI_BCTH = (volatile PBYTE)(v_pIoRegs + ATAPI_REG_BCTH_OFFSET);
ATAPI_DSEL = (volatile PBYTE)(v_pIoRegs + ATAPI_REG_DSEL_OFFSET);
ATAPI_STAT = (volatile PBYTE)(v_pIoRegs + ATAPI_REG_STAT_OFFSET);
ATAPI_ASTA = (volatile PBYTE)(v_pIoRegs + ATAPI_REG_ASTA_OFFSET);
ATAPI_COMD = (volatile PBYTE)(v_pIoRegs + ATAPI_REG_COMD_OFFSET);
ATAPI_FETR = (volatile PBYTE)(v_pIoRegs + ATAPI_REG_FETR_OFFSET);
ATAPI_DCTR = (volatile PBYTE)(v_pIoRegs + ATAPI_REG_DCTR_OFFSET);
// Map I/O ATAPI base address
v_pIoDatas = (PVBYTE)VirtualAlloc( 0, ATAPI_WORKSIZE, MEM_RESERVE, PAGE_NOACCESS );
if ( v_pIoDatas == NULL )
{
ERRORMSG(1,
(TEXT("ATAPI Work Address: VirtualAlloc failed!\r\n")));
goto errorData_return;
}
if ( !VirtualCopy((PVOID)v_pIoDatas, (PVOID)ATAPI_WORKBASE, ATAPI_WORKSIZE, PAGE_READWRITE ) )
{
ERRORMSG(1,
(TEXT("ATAPI Work Address: VirtualCopy failed!\r\n")));
goto errorData_return;
}
//
// Define ATAPI Data work area
//
ATAPI_WORK = (volatile PWORD)v_pIoDatas;
// FPGA INTREQ register address
v_pIoIntreg = (PVBYTE)VirtualAlloc( 0, ATAPI_INTSIZE, MEM_RESERVE, PAGE_NOACCESS );
if ( v_pIoIntreg == NULL )
{
ERRORMSG(1,
(TEXT("ATAPI INT Address: VirtualAlloc failed!\r\n")));
goto errorData_return;
}
if ( !VirtualCopy((PVOID)v_pIoIntreg, (PVOID)ATAPI_INTADDRESS, ATAPI_INTSIZE, PAGE_READWRITE | PAGE_NOCACHE ) )
{
ERRORMSG(1,
(TEXT("ATAPI INT Address: VirtualCopy failed!\r\n")));
goto errorData_return;
}
//
// Define FPGA INTREQ register area
//
/******************************************************************************
*Modification Done by Maneesh Gupta
*
* Offset address of Interrupt mask register & inetrrupt status register has
* been modified according to ASPEN .
*****************************************************************************/
#if (SH_PLATFORM == PLATFORM_ASPEN)
ATAPI_INTM = (volatile PWORD)(v_pIoIntreg + 0x60 );
ATAPI_INT = (volatile PWORD)(v_pIoIntreg + 0x70 );
#elif (SH_PLATFORM == PLATFORM_BIGSUR)
ATAPI_INTM = (volatile PBYTE)(v_pIoIntreg + 0x500 );
ATAPI_INT = (volatile PBYTE)(v_pIoIntreg + 0x900 );
#endif
/******************************************************************************
* End of modification Done by Maneesh Gupta
*****************************************************************************/
return TRUE;
error_return:
if ( v_pIoRegs )
VirtualFree((PVOID)v_pIoRegs, 0, MEM_RELEASE);
v_pIoRegs = 0;
return FALSE;
errorData_return:
if ( v_pIoDatas )
VirtualFree((PVOID)v_pIoDatas, 0, MEM_RELEASE);
v_pIoDatas = 0;
return FALSE;
} // ATAPIDriverInitializeAddress
//
// ATAPI.DLL entry
//
BOOL WINAPI
ATAPIEntry(HINSTANCE DllInstance, INT Reason, LPVOID Reserved)
{
switch(Reason) {
case DLL_PROCESS_ATTACH:
DEBUGREGISTER(DllInstance);
DEBUGMSG(ATAPI_INIT, (TEXT("ATAPI: DLL_PROCESS_ATTACH\r\n")));
InitializeCriticalSection(&v_ATAPICrit);
return ATAPIDriverInitializeAddress();
case DLL_PROCESS_DETACH:
DEBUGMSG(ATAPI_INIT, (TEXT("ATAPI: DLL_PROCESS_DETACH\r\n")));
DeleteCriticalSection(&v_ATAPICrit);
break;
}
return TRUE;
} // ATAPIEntry
//
// CreateDiskObject - create a DISK structure, init some fields and link it.
//
PDISK
CreateDiskObject(VOID)
{
PDISK pDisk;
pDisk = LocalAlloc(LPTR, sizeof(DISK));
if (pDisk != NULL) {
pDisk->d_OpenCount = 0;
pDisk->d_AlignBuf = NULL;
pDisk->d_ActivePath = NULL;
InitializeCriticalSection(&(pDisk->d_DiskCardCrit));
pDisk->d_DiskCardState = STATE_INITING;
pDisk->d_ReadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (pDisk->d_ReadEvent == NULL) {
DEBUGMSG(ATAPI_INIT|ATAPI_ERROR, (TEXT("ATAPI: CreateEvent failed\r\n")));
CloseHandle(pDisk->d_ReadEvent);
LocalFree(pDisk);
pDisk = NULL;
} else {
EnterCriticalSection(&v_ATAPICrit);
pDisk->d_next = v_DiskList;
v_DiskList = pDisk;
LeaveCriticalSection(&v_ATAPICrit);
}
}
return pDisk;
} // CreateDiskObject
//
// IsValidDisk - verify that pDisk points to something in our list
//
// Return TRUE if pDisk is valid, FALSE if not.
//
BOOL
IsValidDisk(
PDISK pDisk
)
{
PDISK pd;
BOOL ret = FALSE;
EnterCriticalSection(&v_ATAPICrit);
pd = v_DiskList;
while (pd) {
if (pd == pDisk) {
ret = TRUE;
break;
}
pd = pd->d_next;
}
LeaveCriticalSection(&v_ATAPICrit);
return ret;
} // IsValidDisk
DWORD
GetDiskStateError(
DWORD DiskState
)
{
#ifdef DEBUG1
LPTSTR lpState;
switch (DiskState) {
case STATE_INITING:lpState = TEXT("STATE_INITING");break;
case STATE_CLOSED:lpState = TEXT("STATE_CLOSED");break;
case STATE_OPENED:lpState = TEXT("STATE_OPENED");break;
case STATE_DEAD:lpState = TEXT("STATE_DEAD");break;
case STATE_REMOVED:lpState = TEXT("STATE_REMOVED");break;
default:lpState = TEXT("Unknown");break;
}
DEBUGMSG(ATAPI_ERROR|ATAPI_WARNING,
(TEXT("ATAPI:GetDiskStateError: State of disk is %s=%d\r\n"),
lpState, DiskState));
#endif
switch (DiskState) {
case STATE_DEAD:
return DISK_DEAD_ERROR;
case STATE_REMOVED:
return DISK_REMOVED_ERROR;
}
return ERROR_GEN_FAILURE;
}
//
// InitFSD - Load and initialize the file system associated with this device
//
// Return TRUE for success
//
BOOL
InitFSD(
PPOST_INIT_BUF pInBuf
)
{
DWORD ValType;
DWORD ValLen;
DWORD status;
TCHAR FSDll[256];
DEBUGMSG(ATAPI_INIT, (TEXT("ATAPI:InitFSD entered\r\n")));
ValLen = sizeof(FSDll);
status = RegQueryValueEx( // get the file system driver dll name
pInBuf->p_hDeviceKey,
TEXT("FSD"),
NULL,
&ValType,
(PUCHAR)FSDll,
&ValLen);
if (status != ERROR_SUCCESS) {
DEBUGMSG(ATAPI_INIT|ATAPI_ERROR,
(TEXT("ATAPI:InitFSD - RegQueryValueEx(FS) returned %d\r\n"),
status));
return FALSE;
}
DEBUGMSG(ATAPI_INIT, (TEXT("ATAPI:InitFSD calling LoadFSD(0x%x, %s)\r\n"),
pInBuf->p_hDevice, FSDll));
return LoadFSD(pInBuf->p_hDevice, FSDll);
} // InitFSD
//
// File system device entrypoints (ATA_????)
//
//
// Returns context data (PDISK) for this Init instance or 0 for failure.
//
// Arguments:
// dwContext - registry path for this device's active key
//
DWORD
ATA_Init(
DWORD dwContext
)
{
LPTSTR ActiveKey = (LPTSTR)dwContext;
PDISK pDisk;
HANDLE hThread;
DEBUGMSG(ATAPI_INIT, (TEXT("ATAPI: ATA_Init\r\n")));
if (ATAPIDetect() == TRUE) {
DEBUGMSG(ATAPI_INIT, (TEXT("ATAPI: ATA_Init ATAPI devices are detected\r\n")));
pDisk = ATAInit( ActiveKey );
if( pDisk != NULL ){
hThread = CreateThread( // start IST for CD-ROM interrupt
NULL,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -