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

📄 intr.c

📁 6410BSP1
💻 C
📖 第 1 页 / 共 3 页
字号:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
//------------------------------------------------------------------------------
//
//  File: interrupt.c
//
//  This file implement major part of interrupt module for S3C6410X SoC.
//
#include <windows.h>
#include <ceddk.h>
#include <Nkintr.h>
#include <oal.h>

// Base Definitions
#include "s3c6410_base_regs.h"

// SoC Components
#include "s3c6410_dma.h"
#include "s3c6410_gpio.h"
#include "s3c6410_intr.h"
#include "s3c6410_vintr.h"
#include "s3c6410_system.h"

#include <intr.h>

#define VIC_MASK
#define HEART_BEAT_DURATION     (1000)   // Ticks

static const UINT32 g_VirIrq2PhyIrq[IRQ_MAX_S3C6410] =
{
    PHYIRQ_EINT0,       // 0    // 0
    PHYIRQ_EINT0,       // 1    // 0
    PHYIRQ_EINT0,       // 2    // 0
    PHYIRQ_EINT0,       // 3    // 0
    PHYIRQ_EINT1,       // 4    // 1
    PHYIRQ_EINT1,       // 5    // 1
    PHYIRQ_EINT1,       // 6    // 1
    PHYIRQ_EINT1,       // 7    // 1
    PHYIRQ_EINT1,       // 8    // 1
    PHYIRQ_EINT1,       // 9    // 1

    PHYIRQ_EINT1,       // 10 // 1
    PHYIRQ_EINT1,       // 11 // 1
    PHYIRQ_RTC_TIC,     // 12 // 2
    PHYIRQ_CAMIF_C,     // 13 // 3
    PHYIRQ_CAMIF_P,     // 14 // 4

    PHYIRQ_I2C1,        // 15 // 5
    PHYIRQ_I2S_V40,     // 16 // 6
    PHYIRQ_SSS,         // 17 // 7
    PHYIRQ_3D,          // 18 // 8
    
    PHYIRQ_POST,        // 19 // 9

    PHYIRQ_ROTATOR,     // 20 // 10
    PHYIRQ_2D,          // 21 // 11
    PHYIRQ_TVENC,       // 22 // 12
    PHYIRQ_TVSCALER,    // 23 // 13
    PHYIRQ_BATF,        // 24 // 14
    PHYIRQ_JPEG,        // 25 // 15
    PHYIRQ_MFC,         // 26 // 16
    PHYIRQ_SDMA0,       // 27 // 17
    PHYIRQ_SDMA1,       // 28 // 18
    PHYIRQ_ARM_DMAERR,  // 29 // 19

    PHYIRQ_ARM_DMA,     // 30 // 20
    PHYIRQ_ARM_DMAS,    // 31 // 21
    PHYIRQ_KEYPAD,      // 32 // 22
    PHYIRQ_TIMER0,      // 33 // 23
    PHYIRQ_TIMER1,      // 34 // 24
    PHYIRQ_TIMER2,      // 35 // 25
    PHYIRQ_WDT,         // 36 // 26
    PHYIRQ_TIMER3,      // 37 // 27
    PHYIRQ_TIMER4,      // 38 // 28
    PHYIRQ_LCD0_FIFO,   // 39 // 29

    PHYIRQ_LCD1_FRAME,  // 40 // 30
    PHYIRQ_LCD2_SYSIF,  // 41 // 31
    PHYIRQ_EINT2,       // 42 // 32
    PHYIRQ_EINT2,       // 43 // 32
    PHYIRQ_EINT2,       // 44 // 32
    PHYIRQ_EINT2,       // 45 // 32
    PHYIRQ_EINT2,       // 46 // 32
    PHYIRQ_EINT2,       // 47 // 32
    PHYIRQ_EINT2,       // 48 // 32
    PHYIRQ_EINT2,       // 49 // 32

    PHYIRQ_EINT3,       // 50 // 33
    PHYIRQ_EINT3,       // 51 // 33
    PHYIRQ_EINT3,       // 52 // 33
    PHYIRQ_EINT3,       // 53 // 33
    PHYIRQ_EINT3,       // 54 // 33
    PHYIRQ_EINT3,       // 55 // 33
    PHYIRQ_EINT3,       // 56 // 33
    PHYIRQ_EINT3,       // 57 // 33
    PHYIRQ_PCM0,        // 58 // 34
    PHYIRQ_PCM1,        // 59 // 35

    PHYIRQ_AC97,        // 60 // 36
    PHYIRQ_UART0,       // 61 // 37
    PHYIRQ_UART1,       // 62 // 38
    PHYIRQ_UART2,       // 63 // 39
    PHYIRQ_UART3,       // 64 // 40
    PHYIRQ_DMA0,        // 65 // 41
    PHYIRQ_DMA0,        // 66 // 41
    PHYIRQ_DMA0,        // 67 // 41
    PHYIRQ_DMA0,        // 68 // 41
    PHYIRQ_DMA0,        // 69 // 41

    PHYIRQ_DMA0,        // 70 // 41
    PHYIRQ_DMA0,        // 71 // 41
    PHYIRQ_DMA0,        // 72 // 41
    PHYIRQ_DMA1,        // 73 // 42
    PHYIRQ_DMA1,        // 74 // 42
    PHYIRQ_DMA1,        // 75 // 42
    PHYIRQ_DMA1,        // 76 // 42
    PHYIRQ_DMA1,        // 77 // 42
    PHYIRQ_DMA1,        // 78 // 42
    PHYIRQ_DMA1,        // 79 // 42

    PHYIRQ_DMA1,        // 80 // 42
    PHYIRQ_ONENAND0,    // 81 // 43
    PHYIRQ_ONENAND1,    // 82 // 44
    PHYIRQ_NFC,         // 83 // 45
    PHYIRQ_CFC,         // 84 // 46
    PHYIRQ_UHOST,       // 85 // 47
    PHYIRQ_SPI0,        // 86 // 48
    PHYIRQ_SPI1,        // 87 // 49
    PHYIRQ_I2C,         // 88 // 50
    PHYIRQ_HSITX,       // 89 // 51

    PHYIRQ_HSIRX,       // 90 // 52
    PHYIRQ_RESERVED,    // 91 // 53
    PHYIRQ_MSM,         // 92 // 54
    PHYIRQ_HOSTIF,      // 93 // 55
    PHYIRQ_HSMMC0,      // 94 // 56
    PHYIRQ_HSMMC1,      // 95 // 57
    PHYIRQ_OTG,         // 96 // 58
    PHYIRQ_IRDA,        // 97 // 59
    PHYIRQ_RTC_ALARM,   // 98 // 60
    PHYIRQ_SEC,         // 99 // 61

    PHYIRQ_PENDN,       // 100 // 62
    PHYIRQ_ADC          // 101 // 63
};

static const UINT32 g_PhyIrq2VirIrq[PHYIRQ_MAX_S3C6410] =
{
    // VIC0
    IRQ_EINT0,          // 0 (IRQ_EINT0~IRQ_EINT3)
    IRQ_EINT4,          // 1 (IRQ_EINT4~IRQ_EINT11)
    IRQ_RTC_TIC,        // 2
    IRQ_CAMIF_C,        // 3
    IRQ_CAMIF_P,        // 4

    IRQ_I2C1,           // 5
    IRQ_I2S_V40,        // 6
    IRQ_SSS,            // 7
    IRQ_3D,             // 8
    
    IRQ_POST,           // 9
    IRQ_ROTATOR,        // 10
    IRQ_2D,             // 11
    IRQ_TVENC,          // 12
    IRQ_TVSCALER,       // 13
    IRQ_BATF,           // 14
    IRQ_JPEG,           // 15
    IRQ_MFC,            // 16
    IRQ_SDMA0,          // 17
    IRQ_SDMA1,          // 18
    IRQ_ARM_DMAERR,     // 19
    IRQ_ARM_DMA,        // 20
    IRQ_ARM_DMAS,       // 21
    IRQ_KEYPAD,         // 22
    IRQ_TIMER0,         // 23
    IRQ_TIMER1,         // 24
    IRQ_TIMER2,         // 25
    IRQ_WDT,            // 26
    IRQ_TIMER3,         // 27
    IRQ_TIMER4,         // 28
    IRQ_LCD0_FIFO,      // 29
    IRQ_LCD1_FRAME,     // 30
    IRQ_LCD2_SYSIF,     // 31

    // VIC1
    IRQ_EINT12,         // 32 (IRQ_EINT12~IRQ_EINT19)
    IRQ_EINT20,         // 33 (IRQ_EINT20~IRQ_EINT27)
    IRQ_PCM0,           // 34
    IRQ_PCM1,           // 35
    IRQ_AC97,           // 36
    IRQ_UART0,          // 37
    IRQ_UART1,          // 38
    IRQ_UART2,          // 39
    IRQ_UART3,          // 40
    IRQ_DMA0_CH0,       // 41 (IRQ_DMA0_CH0~IRQ_DMA0_CH7)
    IRQ_DMA1_CH0,       // 42 (IRQ_DMA1_CH0~IRQ_DMA1_CH7)
    IRQ_ONENAND0,       // 43
    IRQ_ONENAND1,       // 44
    IRQ_NFC,            // 45
    IRQ_CFC,            // 46
    IRQ_UHOST,          // 47
    IRQ_SPI0,           // 48
    IRQ_SPI1,           // 49
    IRQ_I2C,            // 50
    IRQ_HSITX,          // 51
    IRQ_HSIRX,          // 52
    IRQ_RESERVED,       // 53
    IRQ_MSM    ,        // 54
    IRQ_HOSTIF,         // 55
    IRQ_HSMMC0,         // 56
    IRQ_HSMMC1,         // 57
    IRQ_OTG,            // 58
    IRQ_IRDA,           // 59
    IRQ_RTC_ALARM,      // 60
    IRQ_SEC,            // 61
    IRQ_PENDN,          // 62
    IRQ_ADC             // 63
};

//------------------------------------------------------------------------------
//
//  Globals:  g_pIntrRegs/g_pPortRegs
//
//  The global variables are storing virual address for interrupt and port
//  registers for use in interrupt handling to avoid possible time consumig
//  call to OALPAtoVA function.
//
static volatile S3C6410_VIC_REG *g_pVIC0Reg;
static volatile S3C6410_VIC_REG *g_pVIC1Reg;
static volatile S3C6410_GPIO_REG *g_pGPIOReg;
static volatile S3C6410_DMAC_REG *g_pDMAC0Reg;
static volatile S3C6410_DMAC_REG *g_pDMAC1Reg;

//  Function pointer to profiling timer ISR routine.
//
PFN_PROFILER_ISR g_pProfilerISR = NULL;

static void PrepareEINTIntr(void);
static void PrepareDMACIntr(void);
static void InitializeVIC(void);
void VICTableInit(void);                    // Reference by OEMPowerOff() in "Off.c"

//------------------------------------------------------------------------------
//
//  Function:  OALIntrInit
//
//  This function initialize interrupt mapping, hardware and call platform
//  specific initialization.
//
BOOL OALIntrInit()
{
    BOOL rc = FALSE;

    OALMSG( OAL_FUNC&&OAL_INTR, (L"+OALInterruptInit\r\n") );

    // First get uncached virtual addresses
    g_pVIC0Reg = (S3C6410_VIC_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_VIC0, FALSE);
    g_pVIC1Reg = (S3C6410_VIC_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_VIC1, FALSE);
    g_pGPIOReg = (S3C6410_GPIO_REG*)OALPAtoVA(S3C6410_BASE_REG_PA_GPIO, FALSE);
    g_pDMAC0Reg = (S3C6410_DMAC_REG*)OALPAtoVA(S3C6410_BASE_REG_PA_DMA0, FALSE);
    g_pDMAC1Reg = (S3C6410_DMAC_REG*)OALPAtoVA(S3C6410_BASE_REG_PA_DMA1, FALSE);

    // Initialize interrupt mapping
    OALIntrMapInit();

    PrepareDMACIntr();

    // Initialize VIC
    InitializeVIC();

    PrepareEINTIntr();

#ifdef OAL_BSP_CALLBACKS
    // Give BSP change to initialize subordinate controller
    rc = BSPIntrInit();
#else
    rc = TRUE;
#endif

    OALMSG(OAL_INTR&&OAL_FUNC, (L"-OALInterruptInit(rc = %d)\r\n", rc));
    return rc;
}


//------------------------------------------------------------------------------
//
//  Function:  OALIntrRequestIrqs
//
//  This function returns IRQs for CPU/SoC devices based on their
//  physical address.
//
BOOL OALIntrRequestIrqs(DEVICE_LOCATION *pDevLoc, UINT32 *pCount, UINT32 *pIrqs)
{
    BOOL rc = FALSE;

    OALMSG(OAL_INTR&&OAL_FUNC, (L"+OALIntrRequestIrqs(0x%08x->%d/%d/0x%08x/%d, 0x%08x, 0x%08x)\r\n",
                pDevLoc, pDevLoc->IfcType, pDevLoc->BusNumber, pDevLoc->LogicalLoc,
                pDevLoc->Pin, pCount, pIrqs));

⌨️ 快捷键说明

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