欢迎来到虫虫下载站 | 资源下载 资源专辑 关于我们
虫虫下载站

system.c

WinCE 3.0 BSP, 包含Inter SA1110, Intel_815E, Advantech_PCM9574 等
C
第 1 页 / 共 4 页
字号:
/*

  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 + -