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

📄 off.c

📁 6410BSP1
💻 C
📖 第 1 页 / 共 3 页
字号:
    *pBuffer++ = pDMACReg->DMACC3Control1;
    *pBuffer++ = pDMACReg->DMACC3Configuration;

    *pBuffer++ = pDMACReg->DMACC4SrcAddr;
    *pBuffer++ = pDMACReg->DMACC4DestAddr;
    *pBuffer++ = pDMACReg->DMACC4LLI;
    *pBuffer++ = pDMACReg->DMACC4Control0;
    *pBuffer++ = pDMACReg->DMACC4Control1;
    *pBuffer++ = pDMACReg->DMACC4Configuration;

    *pBuffer++ = pDMACReg->DMACC5SrcAddr;
    *pBuffer++ = pDMACReg->DMACC5DestAddr;
    *pBuffer++ = pDMACReg->DMACC5LLI;
    *pBuffer++ = pDMACReg->DMACC5Control0;
    *pBuffer++ = pDMACReg->DMACC5Control1;
    *pBuffer++ = pDMACReg->DMACC5Configuration;

    *pBuffer++ = pDMACReg->DMACC6SrcAddr;
    *pBuffer++ = pDMACReg->DMACC6DestAddr;
    *pBuffer++ = pDMACReg->DMACC6LLI;
    *pBuffer++ = pDMACReg->DMACC6Control0;
    *pBuffer++ = pDMACReg->DMACC6Control1;
    *pBuffer++ = pDMACReg->DMACC6Configuration;

    *pBuffer++ = pDMACReg->DMACC7SrcAddr;
    *pBuffer++ = pDMACReg->DMACC7DestAddr;
    *pBuffer++ = pDMACReg->DMACC7LLI;
    *pBuffer++ = pDMACReg->DMACC7Control0;
    *pBuffer++ = pDMACReg->DMACC7Control1;
    *pBuffer++ = pDMACReg->DMACC7Configuration;
}

static void S3C6410_RestoreState_DMACon(void *pDMAC, UINT32 *pBuffer)
{
    volatile S3C6410_DMAC_REG *pDMACReg;

    pDMACReg = (S3C6410_DMAC_REG *)pDMAC;

    //DMACIntStatus;            // Read-Only
    //DMACIntTCStatus;        // Read-Only
    //DMACIntTCClear;        // Clear Register
    //DMACIntErrStatus;        // Read-Only
    //DMACIntErrClear;        // Clear Register
    //DMACRawIntTCStatus;    // Read-Only
    //DMACRawIntErrStatus;    // Read-Only
    //DMACEnbldChns;        // Read-Only

    //DMACSoftBReq;            // No use
    //DMACSoftSReq;            // No use
    //DMACSoftLBReq;        // No use
    //DMACSoftLSReq;        // No use

    pDMACReg->DMACConfiguration = *pBuffer++;
    pDMACReg->DMACSync = *pBuffer++;

    pDMACReg->DMACC0SrcAddr = *pBuffer++;
    pDMACReg->DMACC0DestAddr = *pBuffer++;
    pDMACReg->DMACC0LLI = *pBuffer++;
    pDMACReg->DMACC0Control0 = *pBuffer++;
    pDMACReg->DMACC0Control1 = *pBuffer++;
    pDMACReg->DMACC0Configuration = *pBuffer++;

    pDMACReg->DMACC1SrcAddr = *pBuffer++;
    pDMACReg->DMACC1DestAddr = *pBuffer++;
    pDMACReg->DMACC1LLI = *pBuffer++;
    pDMACReg->DMACC1Control0 = *pBuffer++;
    pDMACReg->DMACC1Control1 = *pBuffer++;
    pDMACReg->DMACC1Configuration = *pBuffer++;

    pDMACReg->DMACC2SrcAddr = *pBuffer++;
    pDMACReg->DMACC2DestAddr = *pBuffer++;
    pDMACReg->DMACC2LLI = *pBuffer++;
    pDMACReg->DMACC2Control0 = *pBuffer++;
    pDMACReg->DMACC2Control1 = *pBuffer++;
    pDMACReg->DMACC2Configuration = *pBuffer++;

    pDMACReg->DMACC3SrcAddr = *pBuffer++;
    pDMACReg->DMACC3DestAddr = *pBuffer++;
    pDMACReg->DMACC3LLI = *pBuffer++;
    pDMACReg->DMACC3Control0 = *pBuffer++;
    pDMACReg->DMACC3Control1 = *pBuffer++;
    pDMACReg->DMACC3Configuration = *pBuffer++;

    pDMACReg->DMACC4SrcAddr = *pBuffer++;
    pDMACReg->DMACC4DestAddr = *pBuffer++;
    pDMACReg->DMACC4LLI = *pBuffer++;
    pDMACReg->DMACC4Control0 = *pBuffer++;
    pDMACReg->DMACC4Control1 = *pBuffer++;
    pDMACReg->DMACC4Configuration = *pBuffer++;

    pDMACReg->DMACC5SrcAddr = *pBuffer++;
    pDMACReg->DMACC5DestAddr = *pBuffer++;
    pDMACReg->DMACC5LLI = *pBuffer++;
    pDMACReg->DMACC5Control0 = *pBuffer++;
    pDMACReg->DMACC5Control1 = *pBuffer++;
    pDMACReg->DMACC5Configuration = *pBuffer++;

    pDMACReg->DMACC6SrcAddr = *pBuffer++;
    pDMACReg->DMACC6DestAddr = *pBuffer++;
    pDMACReg->DMACC6LLI = *pBuffer++;
    pDMACReg->DMACC6Control0 = *pBuffer++;
    pDMACReg->DMACC6Control1 = *pBuffer++;
    pDMACReg->DMACC6Configuration = *pBuffer++;

    pDMACReg->DMACC7SrcAddr = *pBuffer++;
    pDMACReg->DMACC7DestAddr = *pBuffer++;
    pDMACReg->DMACC7LLI = *pBuffer++;
    pDMACReg->DMACC7Control0 = *pBuffer++;
    pDMACReg->DMACC7Control1 = *pBuffer++;
    pDMACReg->DMACC7Configuration = *pBuffer++;
}

//--------------------------------------------------------------------
//48MHz clock source for usb host1.1, IrDA, hsmmc, spi is shared with otg phy clock.
//So, initialization and reset of otg phy shoud be done on initial booting time.
//--------------------------------------------------------------------
void InitializeOTGCLK(void)
{
    volatile S3C6410_SYSCON_REG *pSysConReg = (S3C6410_SYSCON_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_SYSCON, FALSE);
    volatile OTG_PHY_REG *pOtgPhyReg = (OTG_PHY_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_USBOTG_PHY, FALSE);

    pSysConReg->HCLK_GATE |= (1<<20);

    pSysConReg->OTHERS |= (1<<16);

    pOtgPhyReg->OPHYPWR = 0x0;  // OTG block, & Analog bock in PHY2.0 power up, normal operation
    pOtgPhyReg->OPHYCLK = 0x20; // Externel clock/oscillator, 48MHz reference clock for PLL
    pOtgPhyReg->ORSTCON = 0x1;
    OALStall_ms(1);
    pOtgPhyReg->ORSTCON = 0x0;
    OALStall_ms(1);

    pSysConReg->HCLK_GATE &= ~(1<<20);

}

//------------------------------------------------------------------------------
//
// Function:     OEMPowerOff
//
// Description:  Called when the system is to transition to it's lowest  power mode (off)
//
//
void OEMPowerOff()
{
    volatile S3C6410_SYSCON_REG *pSysConReg;
    volatile S3C6410_GPIO_REG *pGPIOReg;
    volatile S3C6410_VIC_REG *pVIC0Reg;
    volatile S3C6410_VIC_REG *pVIC1Reg;
    volatile S3C6410_DMAC_REG *pDMAC0Reg;
    volatile S3C6410_DMAC_REG *pDMAC1Reg;
    volatile OTG_PHY_REG *pOtgPhyReg;

    int nIndex = 0;

    OALMSG(TRUE, (L"[OEM] ++OEMPowerOff()"));

#if 0
    // Make sure that KITL is powered off
    pArgs = (OAL_KITL_ARGS*)OALArgsQuery(OAL_ARGS_QUERY_KITL);
    if ((pArgs->flags & OAL_KITL_FLAGS_ENABLED) != 0)
    {
        OALKitlPowerOff();
        OALMSG(OAL_VERBOSE, (L"OEMPowerOff: KITL Disabled\r\n"));
    }
#endif

    //-----------------------------
    // Prepare Specific Actions for Sleep
    //-----------------------------
    BSPPowerOff();

    //------------------------------
    // Prepare CPU Entering Sleep Mode
    //------------------------------

    //----------------
    // Map SFR Address
    //----------------
    pSysConReg = (S3C6410_SYSCON_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_SYSCON, FALSE);
    pGPIOReg = (S3C6410_GPIO_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_GPIO, FALSE);
    pVIC0Reg = (S3C6410_VIC_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_VIC0, FALSE);
    pVIC1Reg = (S3C6410_VIC_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_VIC1, FALSE);
    pDMAC0Reg = (S3C6410_DMAC_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_DMA0, FALSE);
    pDMAC1Reg = (S3C6410_DMAC_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_DMA1, FALSE);
    pOtgPhyReg = (OTG_PHY_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_USBOTG_PHY, FALSE);

    //------------------
    // Save VIC Registers
    //------------------
    S3C6410_SaveState_VIC((void *)pVIC0Reg, (void *)pVIC1Reg, g_aSleepSave_VIC);

    // Disable All Interrupt
    pVIC0Reg->VICINTENCLEAR = 0xFFFFFFFF;
    pVIC1Reg->VICINTENCLEAR = 0xFFFFFFFF;
    pVIC0Reg->VICSOFTINTCLEAR = 0xFFFFFFFF;
    pVIC1Reg->VICSOFTINTCLEAR = 0xFFFFFFFF;

    //--------------------
    // Save DMAC Registers
    //--------------------
    S3C6410_SaveState_DMACon((void *)pDMAC0Reg, g_aSleepSave_DMACon0);
    S3C6410_SaveState_DMACon((void *)pDMAC1Reg, g_aSleepSave_DMACon1);

    //------------------
    // Save GPIO Register
    //------------------
    S3C6410_SaveState_GPIO((void *)pGPIOReg, g_aSleepSave_GPIO);

    //--------------------
    // Save SysCon Register
    //--------------------
    S3C6410_SaveState_SysCon((void *)pSysConReg, g_aSleepSave_SysCon);

    //---------------------------------------------------------------------------
    // Unmask Clock Gating for All IPsand Block Power turn On for the IPs not going to sleep
    //---------------------------------------------------------------------------
    // HCLK_IROM, HCLK_MEM1, HCLK_MEM0, HCLK_MFC Should be Always On for power Mode (Something coupled with BUS operation)
    //pSysConReg->HCLK_GATE |= ((1<<25)|(1<<22)|(1<<21)|(1<<0));
    pSysConReg->HCLK_GATE = 0xFFFFFFFF;
    pSysConReg->PCLK_GATE = 0xFFFFFFFF;
    pSysConReg->SCLK_GATE = 0xFFFFFFFF;
    // Turn On All Block Block Power
    pSysConReg->NORMAL_CFG = 0xFFFFFF00;

    // Wait for Block Power Stable
    while((pSysConReg->BLK_PWR_STAT & 0x7E) != 0x7E);

    //----------------------------
    // Wake Up Source Configuration
    //----------------------------
//    S3C6410_WakeUpSource_Configure();

    //-------------------------------
    // Extra work for Entering Sleep Mode
    //-------------------------------

    // USB Power Control
    pSysConReg->OTHERS &= ~(1<<16);    // USB Signal Mask Clear
    pGPIOReg->SPCON |= (1<<3);            // USB Tranceiver PAD to Suspend

    #ifdef _IROM_SDMMC_
    // Sleep Mode Pad Configuration. HSJANG 070926. SLPEN must be 0 to change cpcon value for reading OM.
    #else
    // Sleep Mode Pad Configuration
    pGPIOReg->SLPEN = 0x2;    // Controlled by SLPEN Bit (You Should Clear SLPEN Bit in Wake Up Process...)
    #endif

    //-----------------------
    // CPU Entering Sleep Mode
    //-----------------------

    OALCPUPowerOff();    // Now in Sleep

    //----------------------------
    // CPU Wake Up from Sleep Mode
    //----------------------------

    // Restore SysCon Register
    S3C6410_RestoreState_SysCon((void *)pSysConReg, g_aSleepSave_SysCon);

    // Restore GPIO Register
    S3C6410_RestoreState_GPIO((void *)pGPIOReg, g_aSleepSave_GPIO);

    #ifdef _IROM_SDMMC_
    // Sleep Mode Pad Configuration. HSJANG 070926. SLPEN must be 0 to change cpcon value for reading OM.
    #else
    // Sleep Mode Pad Configuration
    pGPIOReg->SLPEN = 0x2;    // Clear SLPEN Bit for Pad back to Normal Mode
    #endif

    //-----------------------
    // Restore DMAC Registers
    //-----------------------
    S3C6410_RestoreState_DMACon((void *)pDMAC0Reg, g_aSleepSave_DMACon0);
    S3C6410_RestoreState_DMACon((void *)pDMAC1Reg, g_aSleepSave_DMACon1);

    // Restore VIC Registers
    S3C6410_RestoreState_VIC((void *)pVIC0Reg, (void *)pVIC1Reg, g_aSleepSave_VIC);

    // UART Debug Port Initialize
    OEMInitDebugSerial();

    // Disable Vectored Interrupt Mode on CP15
    System_DisableVIC();

    // Enable Branch Prediction on CP15
    System_EnableBP();

    // Enable IRQ Interrupt on CP15
    System_EnableIRQ();

    // Enable FIQ Interrupt on CP15
    System_EnableFIQ();

    // Initialize System Timer
    OEMInitializeSystemTimer(RESCHED_PERIOD, OEM_COUNT_1MS, 0);

#if 0
    // Reinitialize KITL
    if ((pArgs->flags & OAL_KITL_FLAGS_ENABLED) != 0)
    {
        OALKitlPowerOn();
    }
#endif

    // USB Power Control
    InitializeOTGCLK();              // pll_powerdown, suspend mode

    pGPIOReg->SPCON &= ~(1<<3);        // USB Tranceiver PAD to Normal

    //--------------------------------------
    // Post Processing Specific Actions for Wake Up
    //--------------------------------------
    BSPPowerOn();

    OALMSG(TRUE, (L"[OEM] --OEMPowerOff()"));
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -