?? w90p710_aic.c
字號:
/****************************************************************************
* 北京科銀京成技術有限公司 版權所有
*
* Copyright (C) 2000-2006 CoreTek Systems Inc. All Rights Reserved.
***************************************************************************/
/*
* 修改記錄:
*
*
*/
/**
* @file W90p710_aic.c
* @brief
* <li>功能:實現各功能函數。 </li>
* @date
*/
/**************************** 引用部分 *****************************************/
#include "W90P710_BSP.H"
#include "W90P710_REG.H"
#include "W90p710_aic.h"
#include "driver_buffer.h"
/*************************** 前向聲明部分 ****************************************/
/*************************** 串口中斷聲明部分 ****************************************/
//中斷狀態定義
#define RLS 0x6
#define RDA 0x4
#define TOUT 0xC
#define THRE 0x2
//UART0_ISR
#define UART0_FIFO_SIZE 16 //串口硬件提供的FIFO大小
extern DBuffer Uart0_RXDBuf; //接收緩沖區
extern DBuffer Uart0_TXDBuf; //發送緩沖區
//UART1_ISR
#define UART1_FIFO_SIZE 16
extern DBuffer Uart1_RXDBuf;
extern DBuffer Uart1_TXDBuf;
/*************************** 鍵盤中斷聲明部分 ****************************************/
extern DBuffer Keypad_DBuf; //鍵盤緩沖區
/**************************** 定義部分 *****************************************/
typedef void (*PFNCT)(void);
//用于設備中斷處理的函數指針數組
PFNCT ISR[31]={
W90P710_WDT_INT_ISR,
W90P710_nIRQ0_INT_ISR,
W90P710_nIRQ1_INT_ISR,
W90P710_nIRQ2_INT_ISR,
W90P710_nIRQ3_INT_ISR,
W90P710_AC97_INT_ISR,
W90P710_LCD_INT_ISR,
W90P710_RTC_INT_ISR,
W90P710_UART0_INT_ISR,
W90P710_UART1_INT_ISR,
W90P710_UART2_INT_ISR,
W90P710_UART3_INT_ISR,
W90P710_T0_INT_ISR,
W90P710_T1_INT_ISR,
W90P710_USBH0_INT_ISR,
W90P710_USBH1_INT_ISR,
W90P710_EMCTX_INT_ISR,
W90P710_EMCRX_INT_ISR,
W90P710_GDMA0_INT_ISR,
W90P710_GDMA1_INT_ISR,
W90P710_SD_INT_ISR,
W90P710_USBD_INT_ISR,
W90P710_SC0_INT_ISR,
W90P710_SC1_INT_ISR,
W90P710_I2C0_INT_ISR,
W90P710_I2C1_INT_ISR,
W90P710_SSP_INT_ISR,
W90P710_PWM_INT_ISR,
W90P710_KPI_INT_ISR,
W90P710_PS2_INT_ISR,
W90P710_IRQ45_INT_ISR
};
/**************************** 實現部分 *****************************************/
//開啟某中斷
void W90P710_AIC_EnableInt(int vector)
{
//定義掩碼局部變量
unsigned int mask;
//判斷中斷號是否越界
if((vector < INTERRUPT_VECTOR_BEGIN )||(vector > INTERRUPT_VECTOR_END))
{
return ;
}
//用掩碼暫存中斷號
mask = 1 << vector;
//關閉所有中斷
// REG_UINT32_VALUE(REG_AIC_MDCR) = 0xFFFFFFFE;
//打開中斷號對應的中斷通道
REG_UINT32_VALUE(REG_AIC_MECR) = ( mask | REG_UINT32_VALUE(REG_AIC_IMR));
}
//關閉某中斷
void W90P710_AIC_DisableInt(int vector)
{
//定義掩碼局部變量
unsigned int mask;
//判斷中斷號是否越界
if((vector < INTERRUPT_VECTOR_BEGIN )||(vector > INTERRUPT_VECTOR_END))
{
return ;
}
//用掩碼暫存中斷號
mask = 1 << vector;
//關閉所有中斷
REG_UINT32_VALUE(REG_AIC_MDCR) = 0xFFFFFFFE;
//開啟其他中斷
REG_UINT32_VALUE(REG_AIC_MDCR) = ( ~mask & REG_UINT32_VALUE(REG_AIC_IMR) );
}
//中斷處理函數 第二級:根據中斷號跳轉至相應的設備處理函數
void W90P710_CPU_ISR_Handler()
{
int vector;
//讀取中斷號
vector = REG_UINT32_VALUE(REG_AIC_IPER);
//對中斷號右移處理,因在寄存器中中斷號存儲在[6:0]
vector >>= 2;
//跳轉至相應的中斷處理函數,減一是為了對齊數組下標
if(0 != vector)
{
if(REG_UINT32_VALUE(REG_AIC_ISNR) == vector)
{
(*ISR[vector-1])();
//向AIC_EOSCR中寫入任意值,表明中斷處理完成,
REG_UINT32_VALUE(REG_AIC_EOSCR) = 1;
}
}
}
//中斷設備處理函數定義
void W90P710_WDT_INT_ISR(){return;}
void W90P710_nIRQ0_INT_ISR(){return;}
void W90P710_nIRQ1_INT_ISR(){return;}
void W90P710_nIRQ2_INT_ISR(){return;}
void W90P710_nIRQ3_INT_ISR(){return;}
void W90P710_AC97_INT_ISR(){return;}
void W90P710_LCD_INT_ISR(){return;}
void W90P710_RTC_INT_ISR(){return;}
void W90P710_UART0_INT_ISR()
{
unsigned int IIRvalue;
unsigned char myChar,irqType,rftls,i,j;
//讀IIR寄存器
REG_READ_UINT32(REG_UART0_IIR,IIRvalue);
i=(unsigned char)(IIRvalue&(BIT5|BIT6)); //獲取IIR寄存器中RFTLS的設置
//根據RFTLS的設置給rftls變量賦值
switch(i)
{
case 0: rftls=1;break;
case 1: rftls=4;break;
case 2: rftls=8;break;
case 3: rftls=14;break;
default: rftls=1;break;
}
irqType=(unsigned char)(IIRvalue&0x0F); //判斷中斷類型
switch(irqType)
{
//RDA、TOUT中斷處理:接收數據
case RDA:
case TOUT:
while(Uart0_RXDBuf.length < Uart0_RXDBuf.size && rftls>0) //接收緩沖區未滿則接收rftls個數據
{
myChar=REG_UINT32_VALUE(REG_UART0_RBR)&0xFF;
rftls--;
DBuffer_Write(&Uart0_RXDBuf,myChar);
}
if(Uart0_RXDBuf.length == Uart0_RXDBuf.size)
REG_UINT32_VALUE(REG_UART0_IER)&=~BIT0; //緩沖區滿則關接收中斷
break;
//THRE中斷處理:發送數據
case THRE:
if(Uart0_TXDBuf.length >= UART0_FIFO_SIZE) //若發送緩沖區數據數多于硬件FIFO長度,則一次先發送FIFO長度個數據
{
for(i=0;i<UART0_FIFO_SIZE;i++)
{
DBuffer_Read(&Uart0_TXDBuf,&myChar);
REG_WRITE_UINT32(REG_UART0_THR,(REG_UINT32_VALUE(REG_UART0_THR)&0xFFFFFF00)|myChar);
}
}
else if(Uart0_TXDBuf.length > 0) //若發送緩沖區數據數小于硬件FIFO長度,則將發送緩沖區的數據一次發送
{
j=Uart0_TXDBuf.length;
for(i=0;i < j;i++)
{
DBuffer_Read(&Uart0_TXDBuf,&myChar);
REG_WRITE_UINT32(REG_UART0_THR,(REG_UINT32_VALUE(REG_UART0_THR)&0xFFFFFF00)|myChar);
}
}
if(Uart0_TXDBuf.length == 0) //發送緩沖區空則關THRE中斷
REG_UINT32_VALUE(REG_UART0_IER)&=~BIT1;
break;
//RLS及其他:清除錯誤
case RLS:
default:
REG_READ_UINT32(REG_UART0_LSR,irqType); //讀LSR清除錯誤
break;
}
return;
}
void W90P710_UART1_INT_ISR()
{
unsigned int IIRvalue;
unsigned char myChar,irqType,rftls,i,j;
REG_READ_UINT32(REG_UART1_IIR,IIRvalue);
i=(unsigned char)(IIRvalue&(BIT5|BIT6));
switch(i)
{
case 0: rftls=1;break;
case 1: rftls=4;break;
case 2: rftls=8;break;
case 3: rftls=14;break;
default: rftls=1;break;
}
irqType=(unsigned char)(IIRvalue&0x0F);
switch(irqType)
{
case RDA:
case TOUT:
while(Uart1_RXDBuf.length < Uart1_RXDBuf.size && rftls>0)
{
myChar=REG_UINT32_VALUE(REG_UART1_RBR)&0xFF;
rftls--;
DBuffer_Write(&Uart1_RXDBuf,myChar);
}
if(Uart1_RXDBuf.length == Uart1_RXDBuf.size)
REG_UINT32_VALUE(REG_UART1_IER)&=~BIT0; //緩沖區滿則關接收中斷
break;
case THRE:
if(Uart1_TXDBuf.length >= UART1_FIFO_SIZE)
{
for(i=0;i< UART1_FIFO_SIZE;i++)
{
DBuffer_Read(&Uart1_TXDBuf,&myChar);
REG_WRITE_UINT32(REG_UART1_THR,(REG_UINT32_VALUE(REG_UART1_THR)&0xFFFFFF00)|myChar);
}
}
else if(Uart1_TXDBuf.length > 0)
{
j = Uart1_TXDBuf.length;
for(i=0;i < j;i++)
{
DBuffer_Read(&Uart1_TXDBuf,&myChar);
REG_WRITE_UINT32(REG_UART1_THR,(REG_UINT32_VALUE(REG_UART1_THR)&0xFFFFFF00)|myChar);
}
}
if(Uart1_TXDBuf.length == 0)
REG_UINT32_VALUE(REG_UART1_IER)&=~BIT1;
break;
case RLS:
default:
REG_READ_UINT32(REG_UART1_LSR,irqType);
break;
}
return;
}
void W90P710_UART2_INT_ISR(){return;}
void W90P710_UART3_INT_ISR(){return;}
void W90P710_T0_INT_ISR()
{
/* static volatile int i=0;
i++;
printf("Timer0 Interrupted\t%d\ttimes!\n\r",i);
REG_UINT32_VALUE(REG_TISR) |= BIT1;*/
return;
}
void W90P710_T1_INT_ISR()
{
/* static volatile int i=0;
i++;
printf("Timer1 Interrupted\t%d\ttimes!\n\r",i);
REG_UINT32_VALUE(REG_TISR) |= BIT2;*/
return;
}
void W90P710_USBH0_INT_ISR(){return;}
void W90P710_USBH1_INT_ISR(){return;}
void W90P710_EMCTX_INT_ISR(){return;}
void W90P710_EMCRX_INT_ISR(){return;}
void W90P710_GDMA0_INT_ISR(){return;}
void W90P710_GDMA1_INT_ISR(){return;}
void W90P710_SD_INT_ISR(){return;}
void W90P710_USBD_INT_ISR(){return;}
void W90P710_SC0_INT_ISR(){return;}
void W90P710_SC1_INT_ISR(){return;}
void W90P710_I2C0_INT_ISR(){return;}
void W90P710_I2C1_INT_ISR(){return;}
void W90P710_SSP_INT_ISR(){return;}
void W90P710_PWM_INT_ISR(){return;}
void W90P710_KPI_INT_ISR()
{
unsigned int status;
unsigned char myChar;
REG_READ_UINT32(REG_KPISTATUS,status);
myChar=(unsigned char)(status&0x7F);
DBuffer_Write(&Keypad_DBuf,myChar);
return;
}
void W90P710_PS2_INT_ISR(){return;}
void W90P710_IRQ45_INT_ISR(){return;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -