?? atapi.c
字號:
#include "atapi.h"
#include "defines.h"
#include <windows.h>
#include "atadisk.h"
#include "system.h"
extern PDEVICE_CONTROLLER g_pcPC;
extern PDRIVE_DESC g_pdPD;
volatile S3C2443_CFCARD_REG *g_vATAPIRegs;
volatile S3C2443_MATRIX_REG *g_vEBIRegs;
volatile S3C2443_IOPORT_REG *g_vIOPORTRegs;
volatile S3C2443_INTR_REG *g_vINTRRegs;
UINT8 *g_vDmaBuffer;
UINT32 g_uCfgReg;
UINT32 g_dwATAIrq = IRQ_CFCON;
UINT32 g_dwATASysIrq;
ATA_DEV_INFO g_oDevice[2];
ATA_MODE g_eMode;
CRITICAL_SECTION g_ControllerCriticalSection; // controller critical section
HANDLE g_hATAEvent;
#ifdef USE_MUTEX
static HANDLE g_hMutex;
HANDLE InitMutex(LPCTSTR name)
{
HANDLE hMutex;
hMutex = CreateMutex (
NULL, // No security attributes
FALSE, // Initially not owned
name); // Name of mutex object
if (NULL == hMutex)
{
// Your code to deal with the error goes here.
RETAILMSG(1, (_T("[DRVLIB]Cann't initialize mutex %s\r\n"),name));
}
return hMutex;
}
DWORD GetMutex(HANDLE handle)
{
DWORD result;
result = WaitForSingleObject( handle, INFINITE);
switch(result)
{
case WAIT_OBJECT_0:
break;
case WAIT_TIMEOUT:
RETAILMSG(1, (_T("[DRVLIB]ERROR:Mutex Timeout\r\n")));
break;
case WAIT_ABANDONED:
RETAILMSG(1, (_T("[DRVLIB]ERROR:Mutex abandoned\r\n")));
break;
default:
RETAILMSG(1, (_T("[DRVLIB]ERROR:others\r\n")));
break;
}
return result;
}
#endif // USE_MUTEX
int AtapiRegisterInit(void) /*__fn__*/
{
int RetValue=TRUE;
RETAILMSG(RTL_MSG, (TEXT("+++ ATAPI_CF : Before Entering OpenMedia()\r\n")));
#ifdef USE_MUTEX
g_hMutex = InitMutex(TEXT("SSMCBusMutex"));
#endif// USE_MUTEX
InitializeCriticalSection(&g_ControllerCriticalSection);
g_vATAPIRegs= (volatile S3C2443_CFCARD_REG *)VirtualAlloc(0, sizeof(S3C2443_CFCARD_REG), MEM_RESERVE, PAGE_NOACCESS);
if (g_vATAPIRegs == NULL)
{
RETAILMSG(1,(TEXT("For g_vATAPIRegs : VirtualAlloc failed! error code %d\r\n"),GetLastError()));
RetValue = FALSE;
}
else
{
if (!VirtualCopy((PVOID)g_vATAPIRegs, (PVOID)(S3C2443_BASE_REG_PA_CFCARD>>8),
sizeof(S3C2443_CFCARD_REG), PAGE_PHYSICAL |PAGE_READWRITE | PAGE_NOCACHE))
{
RETAILMSG(1,(TEXT("For INTRregs: VirtualCopy failed!ATAPI\r\n")));
RetValue = FALSE;
}
}
g_vIOPORTRegs= (volatile S3C2443_IOPORT_REG *)VirtualAlloc(0, sizeof(S3C2443_IOPORT_REG), MEM_RESERVE, PAGE_NOACCESS);
if (g_vIOPORTRegs == NULL)
{
RETAILMSG(1,(TEXT("For g_vATAPIRegs : VirtualAlloc failed! error code %d\r\n"),GetLastError()));
RetValue = FALSE;
}
else
{
if (!VirtualCopy((PVOID)g_vIOPORTRegs, (PVOID)(S3C2443_BASE_REG_PA_IOPORT>>8),
sizeof(S3C2443_IOPORT_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
{
RETAILMSG(1,(TEXT("For INTRregs: VirtualCopy failed IOPORT!\r\n")));
RetValue = FALSE;
}
}
g_vDmaBuffer = (UINT8 *)VirtualAlloc(0, PIODMA_BUFFER_SIZE, MEM_RESERVE, PAGE_NOACCESS);
if (g_vDmaBuffer == NULL)
{
RETAILMSG(RTL_MSG,(TEXT("For g_vDmaBuffer : VirtualAlloc failed! error code %d\r\n"),GetLastError()));
RetValue = FALSE;
}
else
{
if (!VirtualCopy((PVOID)g_vDmaBuffer, (PVOID)(PIODMA_BUFFER_PA>> 8),
PIODMA_BUFFER_SIZE, PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
{
RETAILMSG(1,(TEXT("For g_vDmaBuffer: VirtualCopy failed!\r\n")));
RetValue = FALSE;
}
}
g_vEBIRegs = (volatile S3C2443_MATRIX_REG *)VirtualAlloc(0, sizeof(S3C2443_MATRIX_REG), MEM_RESERVE, PAGE_NOACCESS);
if (g_vEBIRegs == NULL)
{
RETAILMSG(1,(TEXT("For g_vATAPIRegs : VirtualAlloc failed error code %d\r\n"),GetLastError()));
return FALSE;
}
else
{
if (!VirtualCopy((PVOID)g_vEBIRegs, (PVOID)(S3C2443_BASE_REG_PA_MATRIX>> 8),
sizeof(S3C2443_MATRIX_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
{
RETAILMSG(1,(TEXT("For INTRregs: VirtualCopy failed EBI!\r\n")));
return FALSE;
}
}
g_vINTRRegs = (volatile S3C2443_INTR_REG *)VirtualAlloc(0, sizeof(S3C2443_INTR_REG), MEM_RESERVE, PAGE_NOACCESS);
if (g_vINTRRegs == NULL)
{
RETAILMSG(1,(TEXT("For g_vINTRRegs : VirtualAlloc failed error code %d\r\n"),GetLastError()));
return FALSE;
}
else
{
if (!VirtualCopy((PVOID)g_vINTRRegs, (PVOID)(S3C2443_BASE_REG_PA_INTR>> 8),
sizeof(S3C2443_INTR_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
{
RETAILMSG(1,(TEXT("For g_vINTRRegs: VirtualCopy failed EBI!\r\n")));
return FALSE;
}
}
g_vEBIRegs->EBICON |= (1<<10)|(1<<9);
g_vIOPORTRegs->GPGCON |= (3<<30)|(3<<28)|(3<<26)|(3<<24)|(3<<22);
#ifdef __EVT1
g_vIOPORTRegs->GPADAT = 0x1aa8a; // GPA10 RDATA_OEN setting
#else
g_vIOPORTRegs->GPACON |= (1<<27)|(1<<11)|(1<<14)|(1<<13);// nWE_CF,nOE_CF,nRCS3,nRCS2 enable //S3C2443X01
#endif
g_vIOPORTRegs->MISCCR &=(~(1<<30)); // card detect when card is detected ,the bit should be '0'.
g_vATAPIRegs->MUX_REG = 0x07;
Sleep(2);
g_vATAPIRegs->MUX_REG = 0x03;
Sleep(2);
g_vATAPIRegs->MUX_REG = 0x01;
Sleep(500);
g_vATAPIRegs->ATA_PIO_TIME = 0x1c238;
g_vATAPIRegs->ATA_UDMA_TIME = 0x20B1362 ;
RETAILMSG(RTL_MSG,(TEXT("### 1.EBI_BANK_CFG : 0x%x\r\n"),g_vEBIRegs->EBICON));
RETAILMSG(RTL_MSG,(TEXT("### 2.EBI_BANK_CFG : 0x%x\r\n"),g_vEBIRegs->EBICON));
RETAILMSG(RTL_MSG,(TEXT("### 3.ATA_PIO_TIME : 0x%x\r\n"),g_vATAPIRegs->ATA_PIO_TIME));
RETAILMSG(RTL_MSG,(TEXT("### 4.MUX REG : 0x%x\r\n"),g_vATAPIRegs->MUX_REG));
RETAILMSG(RTL_MSG,(TEXT("### 5.ATA_PIO_TIME : 0x%x\r\n"),&(g_vATAPIRegs->ATA_PIO_TIME)));
RETAILMSG(RTL_MSG,(TEXT("### 6.MUX REG : 0x%x\r\n"),&(g_vATAPIRegs->MUX_REG)));
RETAILMSG(RTL_MSG,(TEXT("### 7.GPIO REG : 0x%x\r\n"),&(g_vIOPORTRegs->GPACON)));
RETAILMSG(RTL_MSG,(TEXT("### 8.SIZE OF CF REG : 0x%x\r\n"),sizeof(S3C2443_CFCARD_REG)));
return RetValue;
}
int InitInterrupt(void)
{
RETAILMSG(1, (TEXT("ATA_INIT : IOCTL_HAL_REQUEST_SYSINTR \r\n")));
g_hATAEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
g_vATAPIRegs->ATA_IRQ_MASK = 0xffffffff;
g_vATAPIRegs->ATA_IRQ = 0xff;
//g_vATAPIRegs->ATA_IRQ_MASK &= ~(1<<2);
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_dwATAIrq, sizeof(UINT32), &g_dwATASysIrq, sizeof(UINT32), NULL))
{
RETAILMSG(1, (TEXT("ERROR: ATA_INIT: Failed to request sysintr value for power button interrupt.\r\n")));
return FALSE;
}
RETAILMSG(1,(TEXT("INFO: ATA_INIT: Mapped Irq 0x%x to SysIntr 0x%x.\r\n"), g_dwATAIrq, g_dwATASysIrq));
if ( g_vINTRRegs->SRCPND & (1<<IRQ_CFCON) )
{
RETAILMSG(1,(TEXT("CF SRCPND has already been set.\r\n")));
g_vINTRRegs->SRCPND = (1<<IRQ_CFCON) ;
}
if ( g_vINTRRegs->INTPND & (1<<IRQ_CFCON) )
{
RETAILMSG(1,(TEXT("CF INTPND has already been set.\r\n")));
g_vINTRRegs->INTPND = (1<<IRQ_CFCON) ;
}
if (!(InterruptInitialize(g_dwATASysIrq, g_hATAEvent, 0, 0)))
{
RETAILMSG(1, (TEXT("ERROR: ATA_INIT: Interrupt initialize failed.\r\n")));
return FALSE;
}
if ( g_vINTRRegs->SRCPND & (1<<IRQ_CFCON) )
{
RETAILMSG(1,(TEXT("CF SRCPND has already been set22.\r\n")));
g_vINTRRegs->SRCPND = (1<<IRQ_CFCON) ;
}
if ( g_vINTRRegs->INTPND & (1<<IRQ_CFCON) )
{
RETAILMSG(1,(TEXT("CF INTPND has already been set22.\r\n")));
g_vINTRRegs->INTPND = (1<<IRQ_CFCON) ;
}
return 1;
}
int AtapiDeviceInit(void)
{
int i;
RETAILMSG(RTL_MSG, (TEXT("+++ ATAPI_CF : Check point 1 ()\r\n")));
g_pcPC->mode = FALSE;
RETAILMSG(RTL_MSG, (TEXT("+++ ATAPI_CF : Check point 2 ()\r\n")));
g_pcPC->register_file_address = 0x0;
/* Get the drive structure infomation */
RETAILMSG(RTL_MSG, (TEXT("+++ ATAPI_CF : Check point 3 ()\r\n")));
g_pcPC->drive = g_pdPD;
//RETAILMSG(RTL_MSG, (TEXT("+++ ATAPI_CF : Check point 4 ()\r\n")));
g_pcPC->drive->features = FALSE;
RETAILMSG(RTL_MSG, (TEXT("+++ ATAPI_CF : Check point 5 ()\r\n")));
g_pcPC->drive->total_lba = 0L;
RETAILMSG(RTL_MSG, (TEXT("+++ ATAPI_CF : Before Entering AtapiregisterInit()\r\n")));
if ( !AtapiRegisterInit() )
return FALSE;
#if 1
if (!InitInterrupt())
return FALSE;
#endif
#if 0
if (!(OpenMedia(PIO_DMA)))
return FALSE;
#else
if (!(OpenMedia()));
return TRUE;
#endif
}
int GetDataFromDevice(UINT16 *data)
{
UINT32 tempRead;
if (!(WaitForDeviceAccessReady()))
return FALSE;
//Inp32(ATA_PIO_DTR, tempRead);
tempRead = g_vATAPIRegs->ATA_PIO_DTR;
if (!(WaitForDeviceAccessReady()))
return FALSE;
//Inp32(ATA_PIO_RDATA, tempRead);
tempRead = g_vATAPIRegs->ATA_PIO_RDATA;
*data = (UINT16)(tempRead&0xFFFF);
return TRUE;
}
void GetByteDataFromDevice(UINT8 *data)
{
UINT32 tempRead;
WaitForDeviceAccessReady();
//Inp32(ATA_PIO_DTR, tempRead);
tempRead = g_vATAPIRegs->ATA_PIO_DTR;
WaitForDeviceAccessReady();
//Inp32(ATA_PIO_RDATA, tempRead);
tempRead = g_vATAPIRegs->ATA_PIO_RDATA;
*data = (UINT8)(tempRead&0xFF);
*(data+1)=(UINT8)((tempRead>>8)&0xFF);
}
int ReadDeviceReg(volatile UINT32 *nRegister, UINT8 *data)
{
UINT32 tempRead;
if (!(WaitForDeviceAccessReady()))
return FALSE;
//Inp32(nRegister, tempRead);
tempRead = *nRegister;
if (!(WaitForDeviceAccessReady()))
return FALSE;
//Inp32(ATA_PIO_RDATA, tempRead);
tempRead = g_vATAPIRegs->ATA_PIO_RDATA;
*data = (UINT8)(tempRead&0xFF);
return TRUE;
}
int WaitForNoBusyStatus(void)
{
UINT8 tempRead;
UINT32 count=1;
UINT16 retVal=TRUE;
RETAILMSG(RTL_MSG,(TEXT("+++ 1.Atapi status reg 0x%x\r\n"),g_vATAPIRegs->ATA_PIO_RDATA));
while(1)
{
count++;
if (!(ReadDeviceReg(DEV_ALTANATE, &tempRead)))
{
return FALSE;
}
if (!(ReadDeviceReg(DEV_STATUS, &tempRead)))
{
return FALSE;
}
//if (count%1000000 == 0 )
//RETAILMSG(RTL_MSG,(TEXT("+++ 2.Atapi status reg 0x%x\r\n"),g_vATAPIRegs->ATA_PIO_RDATA));
if((tempRead&STATUS_DEVICE_BUSY_1) == 0)
break;
if(count == 10000000 )
{
retVal = FALSE;
break;
}
}
return retVal;
}
int WaitForDeviceAccessReady(void)
{
UINT32 tempRead;
UINT8 retVal=TRUE;
UINT32 count=1;
do {
//Inp32(ATA_FIFO_STATUS, tempRead); // modified by Bryan W. Lee (Oct.19th, 2005)
if ( count == 10000000)
{
retVal=FALSE;
RETAILMSG(RTL_MSG, (TEXT("+++ ATAPI_CF : WaitForDeviceAccessReady error..\r\n")));
break;
}
count++;
tempRead = g_vATAPIRegs->ATA_FIFO_STATUS;
} while((tempRead>>28)!=0);
return retVal;
}
int WriteOnTaskFileReg(volatile UINT32 *nRegister,UINT32 nValue)
{
if (!(WaitForDeviceAccessReady()))
return FALSE;
*nRegister = nValue; // write register
return TRUE;
}
int IdentifyDevice(void)
{
UINT16 readBuffer[256]={0,};
UINT8 tempBuffer;
UINT8 *tempString;
UINT32 tBuf[4];
short i;
g_uCfgReg |= (0x40);
g_vATAPIRegs->ATA_CFG = g_uCfgReg; // set Big endian (must be)
g_vATAPIRegs->ATA_IRQ_MASK = 0xffffffff;
RETAILMSG(RTL_MSG, (TEXT("+++ ATAPI_CF : IdentifyDevice() check point 1.\r\n")));
if (!(WriteOnTaskFileReg(DEV_DEVICE, 0x40)))
return FALSE;
RETAILMSG(RTL_MSG, (TEXT("+++ ATAPI_CF : IdentifyDevice() check point 2.\r\n")));
if (!(WriteOnTaskFileReg(DEV_STATUS, IDENTIFYDEVICE)))
return FALSE;
RETAILMSG(RTL_MSG, (TEXT("+++ ATAPI_CF : IdentifyDevice() check point 3.\r\n")));
if (!(WaitForNoBusyStatus()))
return FALSE;
RETAILMSG(RTL_MSG, (TEXT("+++ ATAPI_CF : IdentifyDevice() check point 4.\r\n")));
for(i=0; i<ATA_SECTORSIZE/2; i++) {
GetDataFromDevice(&readBuffer[i]);
// DbgAta(("DATA : 0x%04X\n",readBuffer[i]));
}
RETAILMSG(RTL_MSG, (TEXT("+++ ATAPI_CF : IdentifyDevice() check point 5.\r\n")));
if (!(WaitForNoBusyStatus()))
return FALSE;
//
//verify identify data~~~~~~~~~~~~~~~~~~~~~~~~~~
//
tempString = (UINT8 *)&readBuffer[10];
// for(i=0;i<20;i++) DbgAta(("%c",*(tempString+i)));
// tempString = (UINT8 *)&readBuffer[27];
RETAILMSG(INFO_MSG,(TEXT("\r\nModel Number :")));
for(i=0;i<10;i++) RETAILMSG(INFO_MSG,(TEXT("%c"),*((UINT8 *)tempString+i)));
for(i=0;i<10;i++)
RETAILMSG(RTL_MSG,(TEXT("%c"),*((UINT8 *)tempString+i)));
for(i=0;i<4;i++) RETAILMSG(INFO_MSG,(TEXT("%c"),*((UINT8 *)tempString+26+i)));
for(i=0;i<20;i++) RETAILMSG(INFO_MSG,(TEXT("%c"),*((UINT8 *)tempString+34+i)));
tBuf[0] = (UINT8)(readBuffer[61]&0xff);
tBuf[1] = (UINT8)((readBuffer[61]&0xff00)>>8);
tBuf[2] = (UINT8)(readBuffer[60]&0xff);
tBuf[3] = (UINT8)((readBuffer[60]&0xff00)>>8);
g_oDevice[0].MaxSectors = (UINT32)((tBuf[0]<<24)|(tBuf[1]<<16)|(tBuf[2]<<8)|tBuf[3]);
g_pcPC->drive->total_lba = g_oDevice[0].MaxSectors;
RETAILMSG(INFO_MSG,(TEXT("\nMax Sectors : %d\n"),g_oDevice[0].MaxSectors));
g_pcPC->drive->num_cylinders = readBuffer[54];
RETAILMSG(INFO_MSG,(TEXT("cylinders : %d\n"),g_pcPC->drive->num_cylinders));
g_pcPC->drive->num_heads = readBuffer[55];
RETAILMSG(INFO_MSG,(TEXT("head : %d\n"),g_pcPC->drive->num_heads));
g_pcPC->drive->sec_p_track = readBuffer[56];
RETAILMSG(INFO_MSG,(TEXT("sec_p_track : %d\n"),g_pcPC->drive->sec_p_track));
// Caution: readBuffer[x] - Big Endian, so upper byte means LSB..
g_oDevice[0].MaxMultiple= (readBuffer[47]>>8)&0xFF;
RETAILMSG(INFO_MSG,(TEXT("\nMax Multiple : %02X\n"),g_oDevice[0].MaxMultiple));
if (readBuffer[59]&0x1) { //multiple sector setting is valid
g_oDevice[0].CurrentMultiple= (readBuffer[59]>>8)&0xFF;
//DbgAta(("Current Multiple : %03X\n",g_oDevice[0].CurrentMultiple));
}
if (((readBuffer[64]>>8)&0x3) == 1) g_oDevice[0].MaxPioMode = PIO3;
else if (((readBuffer[64]>>8)&0x3) == 3) g_oDevice[0].MaxPioMode = PIO4;
else g_oDevice[0].MaxPioMode = PIO2;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -