⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 atamx31.cpp

📁 Freescale ARM11系列CPU MX31的WINCE 5.0下的BSP
💻 CPP
📖 第 1 页 / 共 4 页
字号:
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 + -