📄 d13driver.c
字号:
/*********************************************************************************************************
** KAIXIN Co.,Ltd.
**
**--------------文件信息-------------------------------------------------------------------------------
** 文件名: D13Driver.c
** 修改日期: 2007-8-8
** 版本: V1.0
** 描述: ISP61A1 设备端驱动程序 应用驱动层
**
**------------------------------------------------------------------------------------------------------
** 创建: 安 宁
** 创建日期: 2007-8-8
** 版本: V1.0
** 描述: 原始版本
********************************************************************************************************/
#include "config.h"
#include "D13Config.h"
#include "D13CI.h"
#include "D13HAL.h"
#include "Chap_9.h"
#include "D13Driver.h"
#include "Descriptor.h"
#include "NFLASH.h"
//#include "is61lv10248.h"
#include "SCSI.h"
//extern EPPFLAGS bEPPflags;
extern unsigned char BulkPhase;
uint32 add11 = 0;
uint32 add21 = 0;
BULK_TASK Bulk_Task;
INT8U BlockMap[256];
INT8U WR_RE_STATUS = 0; //1 代表读写K9F5608
//2 代表读写IS61lv10248
extern INT8U addr[3];
extern uint32 Is61lv10248_Addr;
INT32U offset = 0,offsetr = 0,offsetd = 0,times1 = 0,times2 = 0,datalen = 0;
/*******************************************************************
** 函数名称: usbserve()
** 功能描述: USB事件处理函数
** 输 入: 无
** 输 出: 无
********************************************************************/
void usbserve(void)
{
if (bEPPflags.setup_packet){ //Setup包处理
//BeepFunc ();//已完成
IRQDisable();
bEPPflags.setup_packet = 0;
control_handler(); //调用请求处理子程序
IRQEnable();
}//if setup_packet
if (bEPPflags.bus_reset) { //USB总线复位处理
IRQDisable();
bEPPflags.bus_reset = 0;
IRQEnable();
//BeepFunc();
Bus_Reset();
} // if bus reset
if (bEPPflags.suspend) { //D12挂起改变处理
IRQDisable();
bEPPflags.suspend= 0;
IRQEnable();
usb_suspend();
} // if suspend change
//在此添加其它usb事件处理代码
}
/*******************************************************************
** 函数名称: ep1_txdone()
** 功能描述: 端点1 IN(发送)处理处理函数
** 输 入: 无
** 输 出: 无
********************************************************************/
void ep1_txdone(void)
{
//INT8U cha[64],i;
//BeepFunc ();
D13_GetEndpointStatusWInteruptClear(02); //清中断标志位
//Bulk_In_Packet();
//D13_ClearBuffer(0x02);
USB_Bulk_In();
//D13_GetEndpointStatusWInteruptClear(02);
//for(i = 0;i<64;i++)
//{
//cha[i]=i+50;
//}
//D13_WriteEndpoint(2,64,cha);
}
/*******************************************************************
** 函数名称: ep2_rxdone()
** 功能描述: 端点2 OUT(接收)处理处理函数
** 输 入: 无
** 输 出: 无
********************************************************************/
void ep2_rxdone(void)
{
INT8U len,epstus,j;
//BeepFunc ();
epstus = D13_GetEndpointStatusWInteruptClear(03);
epstus &= 0x60;
len=D13_ReadEndpoint(3,64,ControlData.dataBuffer+offset);
j = len;
if(epstus == 0x60)
len+=D13_ReadEndpoint(3,64,ControlData.dataBuffer+j+offset);
datalen = len;
//D13_ValidBuffer(0x03);
//D13_GetEndpointStatusWInteruptClear(03);
//datalen = D13_ReadEndpoint(3,64,ControlData.dataBuffer + offset);
if (datalen != 0)
{
//D13_ValidBuffer(0x03);
USB_Bulk_Out();
//D13_ClearBuffer(0x03);
}
//D13_ClearBuffer(0x03);
//D13_GetEndpointStatusWInteruptClear(03);
}
/******************************************************************************************************************
** 函数名称: Usb_Exception()
** 功能描述: ISP1161A1(D13) 中断服务程序
*******************************************************************************************************************/
void __irq Usb_Exception(void)
//void Usb_Exception(void)
{
INT32U i_st;
//IRQDisable(); //关中断
//bEPPflags.in_isr = 1;
D13_LockDevice(0xAA37);
//BeepFunc ();
CLR_INTD13(); //清除 ISP1161A1 的中断标志
CLR_INT(); //通知中断结束
i_st = D13_ReadInterruptRegister(); //读取D13中断寄存器值
if(i_st != 0){
if(i_st & D13REG_INTSRC_BUSRESET){
//Bus_Reset(); //总线复位处理
bEPPflags.bus_reset = 1;
}
else if(i_st &D13REG_INTSRC_SUSPEND){
usb_suspend(); //ISP1181B挂起中断处理
bEPPflags.suspend = 1; //
}
else if(i_st & D13REG_INTSRC_EOT)
dma_eot(); //DMA传输结束处理
else if(i_st & D13REG_INTSRC_RESUME){
D13_LockDevice(0xAA37); //解锁设备,重新使能其它寄存器
//添加恢复系统所有元件正常功能代码
}
else {
if(i_st & D13REG_INTSRC_EP0IN)
ep0_txdone(); //控制端点发送数据处理
if(i_st & D13REG_INTSRC_EP0OUT)
ep0_rxdone(); //控制端点接收数据处理
if(i_st & D13REG_INTSRC_EP01)
ep1_txdone(); //端点 1 发送数据处理
if(i_st & D13REG_INTSRC_EP02)
{
ep2_rxdone();
//D13_GetEndpointStatusWInteruptClear(03); //端点 2 接收数据处理
//D13_ClearBuffer(0x03);
}
/* if(i_st & D13REG_INTSRC_EP03)
USB_WriteISR(&UsbSend_EP03,EPINDEX4EP03,64,2); //端点 3 发送数据处理
if(i_st & D13REG_INTSRC_EP04)
USB_ReadISR(&UsbRec_EP04,EPINDEX4EP04,64,2); //端点 4 接收数据处理
if(i_st & D13REG_INTSRC_EP05)
USB_WriteISR(&UsbSend_EP05,EPINDEX4EP05,64,2); //端点 5 发送数据处理
if(i_st & D13REG_INTSRC_EP06)
USB_ReadISR(&UsbRec_EP06,EPINDEX4EP06,64,2); //端点 6 接收数据处理 */
}
}
//bEPPflags.in_isr = 0;
//add for ARM
//CLR_INTD13(); //清除 ISP1161A1 的中断标志
//CLR_INT(); //通知中断结束
//IRQEnable(); //退出中断服务程序时开中断
}
/**********************************************************************************************************************
** 函数名称: Init_D13()
** 功能描述: 设置 D13(ISP1181B) 与MCU的连接接口,
复位D13,连接上USB总线
** 输 入: 无
** 输 出: 0: 初始化成功 1: 初始化失败
** 注 意: 请在调用该函数以后再打开D13中断
***********************************************************************************************************************/
INT8U Init_D13(void)
{
INT16U i;
bEPPflags.remote_wakeup = 0;
bEPPflags.control_state = 0;
bEPPflags.configuration = 0;
bEPPflags.bus_reset = 0;
bEPPflags.suspend = 0;
bEPPflags.setup_packet = 0;
bEPPflags.in_isr = 0;
bEPPflags.Ep1_txdone = 0;
bEPPflags.Ep2_rxdone = 0;
bEPPflags.flashwrstart = 0;
bEPPflags.flashwrend = 0;
Bulk_Task.wLength = 0;
Bulk_Task.wCount = 0;
Bulk_Task.pData = 0;
Init_D13Port(); //初始化MCU与ISP1161A1 连接的接口
Rst_D13(); //复位D13
//D13_SetDataToChipRam(0x0056); //写暂存寄存器 测试
//if(D13_GetDataFromChipRam()==0x0056) //读暂存寄存器 测试
// {
//CLR_USBCS();
//FIO4MASK = 0x00000000;
//DelayNS(500); //测试用
//BeepFunc (); //测试用
// }
reconnect_USB(); //重新连接USB总线
i = D13_ReadChipID(); //读芯片ID号
//if (i!= ISP1181B_CHIPID && i != ISP1181A_CHIPID &&
// i!= ISP1161A_CHIPID)
if(i == ISP1161A_CHIPID)
{
// FIO4MASK = 0x00000000; //测试用
//BeepFunc ();
return 0; //读芯片ID号不正确,返回失败
}
return 1; //初始化成功
}
/*************************************************************************
一些中断处理程序
**************************************************************************/
/****************************************************************************************************************
** 函数名称: bus_reset()
** 功能描述: USB总线复位处理子程序
** 输 入: 无
** 输 出: 无
*****************************************************************************************************************/
void Bus_Reset(void)
{
//Rst_D13();
//config_endpoint();
//这此添加总线复位处理的其它代码
Init_D13Port(); //初始化MCU与ISP1161A1 连接的接口
Rst_D13(); //复位D13
reconnect_USB(); //重新连接USB总线
BulkPhase = CommandPhase;
}
/*****************************************************************************************************************
** 函数名称: usb_suspend()
** 功能描述: ISP1181B挂起中断处理子程序
** 输 入: 无
** 输 出: 无
******************************************************************************************************************/
void usb_suspend(void)
{
INT32U i_st;
i_st = D13_ReadInterruptRegister(); //读取D13中断寄存器值
if(i_st & D13REG_INTSRC_BUSTATUS) //如果当前总线状态BUSTATUS标志为1,才能进入挂起
{
//在此添加:使系统所有元件做好准备,以进入挂起状态
//执行下面的语句后,ISP1181B就进入挂起状态了
D13_SetMode(D13REG_MODE_INT_EN|D13REG_MODE_SOFTCONNECT|D13REG_MODE_SUSPND);
D13_SetMode(D13REG_MODE_INT_EN|D13REG_MODE_SOFTCONNECT);
}
}
/*****************************************************************************************************************
** 函数名称: get_firmware_version()
** 功能描述: 得到本固件软件包版本号
** 输 入: 无
** 输 出: 本固件软件包版本号
******************************************************************************************************************/
INT16U get_ISP1161A1_firmware_version(void)
{
return 0x0100; //固件软件版本号为1.00
}
/***************************************************************************************
下面的程序由用户自己编写
****************************************************************************************/
/*******************************************************************************************************************
** 函数名称: dma_eot()
** 功能描述: DMA结束处理
** 输 入: 无
** 输 出: 无
*******************************************************************************************************************/
void dma_eot(void)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -