📄 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 + -