📄 atamx31.cpp
字号:
BOOL
CMX31Disk::Init(
HKEY hActiveKey
)
{
BOOL bRet = FALSE;
DEBUGMSG(ZONE_FUNC, (_T("CMX31Disk: Init+")));
m_f16Bit = TRUE; // ATA is 16-bit
// configure port
if (!ConfigPort()) {
DEBUGMSG(ZONE_INIT, (_T(
"Ata!CMX31Disk::Init> Failed to configure port; device(%u)\r\n"
), m_dwDeviceId));
goto exit;
}
// assign the appropriate folder name
m_szDiskName = g_szATAHardDisk;
if(!InitDMA())
{
DEBUGMSG(ZONE_ERROR, (TEXT("MMCSD_DMAInit: cannot init DMA!\r\n")));
goto exit;
}
// finish intialization; i.e., initialize device
bRet = CDisk::Init(hActiveKey);
if (!bRet) {
goto exit;
}
BYTE bPIOMode = 0;
BYTE bDMAMode = 0;
BYTE bTransferMode = (BYTE)m_pPort->m_pDskReg[m_dwDeviceId]->dwTransferMode;
BYTE bIORDYEnable = (BYTE)m_Mx31Reg.dwIORDYEnable;
switch(bTransferMode)
{
case 0x08:
case 0x09:
case 0x0a:
case 0x0b:
case 0x0c:
bPIOMode = bTransferMode - 0x08;
if(bIORDYEnable && bPIOMode >= 3)
{
Sleep(10);
OUTREG8(&g_pVAtaReg->ATAControl, 0x41);
Sleep(10);
}
break;
case 0x40:
case 0x41:
case 0x42:
case 0x43:
case 0x44:
case 0x45:
bDMAMode = (BYTE)(bTransferMode - 0x40);
SetTimingRegisters(bDMAMode, UDMA_MODE, CLOCK_PERIOD);
break;
case 0x20:
case 0x21:
case 0x22:
bDMAMode = (BYTE)(bTransferMode - 0x20);
SetTimingRegisters(bDMAMode, MDMA_MODE, CLOCK_PERIOD);
break;
default:
bPIOMode = 0;
break;
}
SetTimingRegisters(bPIOMode, PIO_MODE, CLOCK_PERIOD);
// ShowRegisters(0x01);
DEBUGMSG(ZONE_FUNC, (_T("CMX31Disk: Init-")));
#if 0
RunTest();
#endif
exit:;
return bRet;
}
// ----------------------------------------------------------------------------
// Function: MainIoctl
// This is redundant
//
// Parameters:
// pIOReq -
// ----------------------------------------------------------------------------
DWORD
CMX31Disk::MainIoctl(
PIOREQ pIOReq
)
{
DEBUGMSG(ZONE_FUNC, (_T(
"Ata!CMX31Disk::MainIoctl> IOCTL(%d), device(%d) \r\n"
), pIOReq->dwCode, m_dwDeviceId));
return CDisk::MainIoctl(pIOReq);
}
// ----------------------------------------------------------------------------
// Function: ConfigPort
// Initialize IST/ISR
//
// Parameters:
// None
// ----------------------------------------------------------------------------
BOOL
CMX31Disk::ConfigPort(
)
{
DEBUGMSG(ZONE_FUNC, (_T("CMX31Disk: ConfigPort+")));
m_pATAReg = (PBYTE)m_pPort->m_dwRegBase;
m_pATARegAlt = (PBYTE)m_pPort->m_dwRegAlt;
if(!InitializePort())
{
return FALSE;
}
// this function is called for the master and slave on this channel; if
// this has already been called, then exit
if (m_pPort->m_hIRQEvent) {
m_dwDeviceFlags |= DFLAGS_DEVICE_INITIALIZED;
return TRUE;
}
// create interrupt event
if (NULL == (m_pPort->m_hIRQEvent = CreateEvent(NULL, FALSE, FALSE, NULL))) {
DEBUGMSG(ZONE_INIT|ZONE_ERROR, (_T(
"Ata!CMX31Disk::ConfigPort> Failed to create interrupt event for device(%d)\r\n"
), m_dwDeviceId));
return FALSE;
}
// Translate IRQ to SYSINTR
if ((m_pPort->m_dwSysIntr == SYSINTR_NOP) &&
!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR,
&(m_pPort->m_dwIrq),
sizeof(m_pPort->m_dwIrq),
&m_pPort->m_dwSysIntr,
sizeof(m_pPort->m_dwSysIntr),
NULL))
{
ERRORMSG(1,(TEXT("%s: Request SYSINTR failed\r\n"), __WFUNCTION__));
return FALSE;
}
// associate interrupt event with IRQ
if (!InterruptInitialize(
m_pPort->m_dwSysIntr,
m_pPort->m_hIRQEvent,
NULL,
0)
) {
DEBUGMSG(ZONE_INIT|ZONE_ERROR, (_T(
"Ata!CMX31Disk::ConfigPort> Failed to initialize interrupt(SysIntr(%d)) for device(%d)\r\n"
), m_pPort->m_dwSysIntr, m_dwDeviceId));
return FALSE;
}
// c=Create interrupt wait event
if (NULL == (g_hWaitEvent = CreateEvent(NULL, FALSE, FALSE, NULL))) {
DEBUGMSG(ZONE_INIT|ZONE_ERROR, (_T(
"Ata!CMX31Disk::ConfigPort> Failed to create interrupt wait event for device(%d)\r\n"
), m_dwDeviceId));
return FALSE;
}
// Create IST for ATA interrupts
m_pPort->m_hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) IntrServThread, m_pPort, 0, NULL);
if (!m_pPort->m_hThread)
{
DEBUGMSG(ZONE_INIT|ZONE_ERROR, (_T(
"Ata!CMX31Disk::ConfigPort> Failed to create IST for device(%d)\r\n"
), m_dwDeviceId));
return FALSE;
}
DEBUGMSG(ZONE_FUNC, (_T("CMX31Disk: ConfigPort-")));
return TRUE;
}
/* SetTimingRegisters() programs host timing. "speed" is the ATA mode programmed,
mode can be PIO_MODE, UDMA_MODE or MDMA_MODE, ClkSpd is the clock period in
ns */
void CMX31Disk::SetTimingRegisters(int speed, int mode, int ClkSpd)
{
DEBUGMSG(ZONE_FUNC, (_T("CMX31Disk: SetTimingRegisters+(%d,%d,%d)+"), speed,mode,ClkSpd));
INSREG32(&g_pVAtaReg->ATA_TIME_CONFIG0, 0x0000ffff, 0x00000303);
switch(mode)
{
case PIO_MODE:
INSREG32(&g_pVAtaReg->ATA_TIME_CONFIG0, 0xffff0000,
(((t1_spec[speed] + ClkSpd) / ClkSpd) << 16) |
(((t2_8spec[speed] + ClkSpd) / ClkSpd) << 24)) ;
INSREG32(&g_pVAtaReg->ATA_TIME_CONFIG1, 0xffffffff,
(((t2_8spec[speed] + ClkSpd) / ClkSpd) ) |
((((tA_spec[speed] + ClkSpd) / ClkSpd) + 2) << 8) |
(1 << 16) |
(((t4_spec[speed] + ClkSpd) / ClkSpd) << 24)) ;
INSREG32(&g_pVAtaReg->ATA_TIME_CONFIG2, 0xff, (((t9_spec[speed] + ClkSpd) / ClkSpd)));
break ;
case MDMA_MODE :
INSREG32(&g_pVAtaReg->ATA_TIME_CONFIG2, 0xffffff00,
(((tM_spec[speed] + ClkSpd) / ClkSpd) << 8) |
(((tJNH_spec[speed] + ClkSpd) / ClkSpd) << 16) |
(((tD_spec[speed] + ClkSpd) / ClkSpd) << 24)) ;
INSREG32(&g_pVAtaReg->ATA_TIME_CONFIG3, 0xff, (((tKW_spec[speed] + ClkSpd) / ClkSpd))) ;
break ;
case UDMA_MODE :
INSREG32(&g_pVAtaReg->ATA_TIME_CONFIG3, 0xffffff00,
(((tACK_spec[speed] + ClkSpd) / ClkSpd) << 8) |
(((tENV_minspec[speed] + ClkSpd) / ClkSpd) << 16) |
((((tRP_spec[speed] + ClkSpd) / ClkSpd) + 2) << 24)) ;
INSREG32(&g_pVAtaReg->ATA_TIME_CONFIG4, 0xffffffff,
(((tZAH_spec[speed] + ClkSpd) / ClkSpd)) |
(((tMLI_spec[speed] + ClkSpd) / ClkSpd) << 8) |
(((tDVH_spec[speed] + ClkSpd) / ClkSpd) << 16) |
(((tDZFS_spec[speed] + ClkSpd) / ClkSpd) << 24)) ;
INSREG32(&g_pVAtaReg->ATA_TIME_CONFIG5, 0xffffffff,
(((tCYC_spec[speed] + ClkSpd) / ClkSpd)) << 24 |
(((tDVS_spec[speed] + ClkSpd) / ClkSpd)) |
(((tCVH_spec[speed] + ClkSpd) / ClkSpd) << 8) |
(((tSS_spec[speed] + ClkSpd) / ClkSpd) << 16)) ;
break ;
default :
break;
}
DEBUGMSG(ZONE_FUNC, (_T("CMX31Disk: SetTimingRegisters-")));
}
// ----------------------------------------------------------------------------
// Function: ConfigureIOMUXPad
// Configure IOMUX Pad
//
// Parameters:
//
// Returns:
// Returns TRUE if successful, otherwise returns FALSE.
// ----------------------------------------------------------------------------
BOOL CMX31Disk::ConfigureIOMUXPad(int muxmode)
{
PHYSICAL_ADDRESS phyAddr;
BOOL bRet = FALSE;
DDK_IOMUX_PAD_SLEW slew;
DDK_IOMUX_PAD_DRIVE drive;
DDK_IOMUX_PAD_MODE mode;
DDK_IOMUX_PAD_TRIG trig;
DDK_IOMUX_PAD_PULL pull;
phyAddr.QuadPart = BSP_BASE_REG_PA_PBC_BASE;
g_pPBC = (PCSP_PBC_REGS) MmMapIoSpace(phyAddr, sizeof(CSP_PBC_REGS), FALSE);
if (g_pPBC == NULL)
{
DEBUGMSG(ZONE_ERROR, (TEXT("ATA: MmMapIoSpace failed!\r\n")));
goto exit;
}
if(muxmode == 0)
{
// ATA IOMUX settings
DDKIomuxSetGpr(0x040007f8, 0x00000318);
OUTREG16(&g_pPBC->BCTRL2_CLEAR, CSP_BITFMASK(PBC_BCTRL2_ATA_EN));
OUTREG16(&g_pPBC->BCTRL2_SET, CSP_BITFMASK(PBC_BCTRL2_ATA_SEL));
DDKIomuxSetPinMux(DDK_IOMUX_PIN_ATA_RESET_B, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
DDKIomuxSetPinMux(DDK_IOMUX_PIN_ATA_DMACK, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
DDKIomuxSetPinMux(DDK_IOMUX_PIN_ATA_DIOW, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
DDKIomuxSetPinMux(DDK_IOMUX_PIN_ATA_DIOR, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
DDKIomuxSetPinMux(DDK_IOMUX_PIN_ATA_CS1, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
DDKIomuxSetPinMux(DDK_IOMUX_PIN_ATA_CS0, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
DDKIomuxGetPadConfig(DDK_IOMUX_PAD_CSPI1_MISO, &slew, &drive, &mode, &trig, &pull);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_CSPI1_MISO, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, mode, trig, pull);
DDKIomuxGetPadConfig(DDK_IOMUX_PAD_CSPI1_MOSI, &slew, &drive, &mode, &trig, &pull);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_CSPI1_MOSI, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, mode, trig, pull);
DDKIomuxGetPadConfig(DDK_IOMUX_PAD_CSPI1_SS0, &slew, &drive, &mode, &trig, &pull);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_CSPI1_SS0, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, mode, trig, pull);
DDKIomuxGetPadConfig(DDK_IOMUX_PAD_CSPI1_SS1, &slew, &drive, &mode, &trig, &pull);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_CSPI1_SS1, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, mode, trig, pull);
DDKIomuxGetPadConfig(DDK_IOMUX_PAD_CSPI1_SS2, &slew, &drive, &mode, &trig, &pull);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_CSPI1_SS2, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, mode, trig, pull);
DDKIomuxGetPadConfig(DDK_IOMUX_PAD_CSPI1_SCLK, &slew, &drive, &mode, &trig, &pull);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_CSPI1_SCLK, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, mode, trig, pull);
DDKIomuxGetPadConfig(DDK_IOMUX_PAD_CSPI1_SPI_RDY, &slew, &drive, &mode, &trig, &pull);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_CSPI1_SPI_RDY, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, mode, trig, pull);
DDKIomuxGetPadConfig(DDK_IOMUX_PAD_STXD3, &slew, &drive, &mode, &trig, &pull);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_STXD3, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, mode, trig, pull);
DDKIomuxGetPadConfig(DDK_IOMUX_PAD_SRXD3, &slew, &drive, &mode, &trig, &pull);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_SRXD3, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, mode, trig, pull);
DDKIomuxGetPadConfig(DDK_IOMUX_PAD_SCK3, &slew, &drive, &mode, &trig, &pull);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_SCK3, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, mode, trig, pull);
DDKIomuxGetPadConfig(DDK_IOMUX_PAD_SFS3, &slew, &drive, &mode, &trig, &pull);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_SFS3, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, mode, trig, pull);
DDKIomuxGetPadConfig(DDK_IOMUX_PAD_STXD6, &slew, &drive, &mode, &trig, &pull);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_STXD6, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, mode, trig, pull);
DDKIomuxGetPadConfig(DDK_IOMUX_PAD_SRXD6, &slew, &drive, &mode, &trig, &pull);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_SRXD6, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, mode, trig, pull);
DDKIomuxGetPadConfig(DDK_IOMUX_PAD_SCK6, &slew, &drive, &mode, &trig, &pull);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_SCK6, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, mode, trig, pull);
DDKIomuxGetPadConfig(DDK_IOMUX_PAD_CAPTURE, &slew, &drive, &mode, &trig, &pull);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_CAPTURE, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, mode, trig, pull);
DDKIomuxGetPadConfig(DDK_IOMUX_PAD_COMPARE, &slew, &drive, &mode, &trig, &pull);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_COMPARE, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, mode, trig, pull);
} else
{
// ATA IOMUX settings
DDKIomuxSetGpr(0x040007f8, 0x00000488);
//Clear ATA_EN and ATA_SEL in CPLD regs
OUTREG16(&g_pPBC->BCTRL2_CLEAR, CSP_BITFMASK(PBC_BCTRL2_ATA_EN));
OUTREG16(&g_pPBC->BCTRL2_CLEAR, CSP_BITFMASK(PBC_BCTRL2_ATA_SEL));
OUTREG16(&g_pPBC->BCTRL3_SET, 0x10);
DDKIomuxSetPinMux(DDK_IOMUX_PIN_ATA_RESET_B, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
DDKIomuxSetPinMux(DDK_IOMUX_PIN_ATA_DMACK, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
DDKIomuxSetPinMux(DDK_IOMUX_PIN_ATA_DIOW, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
DDKIomuxSetPinMux(DDK_IOMUX_PIN_ATA_DIOR, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
DDKIomuxSetPinMux(DDK_IOMUX_PIN_ATA_CS1, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
DDKIomuxSetPinMux(DDK_IOMUX_PIN_ATA_CS0, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
DDKIomuxGetPadConfig(DDK_IOMUX_PAD_CSI_D6, &slew, &drive, &mode, &trig, &pull);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_CSI_D6, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, mode, trig, pull);
DDKIomuxGetPadConfig(DDK_IOMUX_PAD_CSI_D7, &slew, &drive, &mode, &trig, &pull);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_CSI_D7, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, mode, trig, pull);
DDKIomuxGetPadConfig(DDK_IOMUX_PAD_CSI_D8, &slew, &drive, &mode, &trig, &pull);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_CSI_D8, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, mode, trig, pull);
DDKIomuxGetPadConfig(DDK_IOMUX_PAD_CSI_D9, &slew, &drive, &mode, &trig, &pull);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_CSI_D9, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, mode, trig, pull);
DDKIomuxGetPadConfig(DDK_IOMUX_PAD_CSI_D10, &slew, &drive, &mode, &trig, &pull);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_CSI_D10, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, mode, trig, pull);
DDKIomuxGetPadConfig(DDK_IOMUX_PAD_CSI_D11, &slew, &drive, &mode, &trig, &pull);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_CSI_D11, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, mode, trig, pull);
DDKIomuxGetPadConfig(DDK_IOMUX_PAD_CSI_D12, &slew, &drive, &mode, &trig, &pull);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_CSI_D12, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, mode, trig, pull);
DDKIomuxGetPadConfig(DDK_IOMUX_PAD_CSI_D13, &slew, &drive, &mode, &trig, &pull);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_CSI_D13, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, mode, trig, pull);
DDKIomuxGetPadConfig(DDK_IOMUX_PAD_CSI_D14, &slew, &drive, &mode, &trig, &pull);
DDKIomuxSetPadConfig(DDK_IOMUX_PAD_CSI_D14, DDK_IOMUX_PAD_SLEW_FAST,DDK_IOMUX_PAD_DRIVE_MAX, mode, trig, pull);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -