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

📄 d13driver.c

📁 处理器采用的是LPC2378
💻 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 + -