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

📄 d12driver.c

📁 Altera公司的NIOS2SOPC平台上的USB使用试验程序。 Quartus2软件版本5.0 NIOS2IDE软件版本5.0 硬件平台根据软件需求在Quartus2软件中构建。
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               广州周立功单片机发展有限公司
**                                     研    究    所
**                                        产品一部 
**
**                                 http://www.zlgmcu.com
**
** 文   件   名: D12Driver.c
** 最后修改日期: 2004年11月15日
** 描        述: USB驱动程序软件包: PDIUSBD12 设备端驱动程序 应用层
** 版	     本: V5.0
** 最后修改 :Zhou Shuwu  移植到NiosII上 
**********************************************************************************************************/
/******=================  modified by Zhou Shuwu ==================================***********/ 
//#include "config.h"
//#include "target.h"

#include  <stdio.h>
#include "system.h"
#include  "altera_avalon_pio_regs.h"
#include  "alt_types.h"
#include  "sys/alt_irq.h"
/******=================  modified by Zhou Shuwu ==================================***********/ 
#include "D12Config.h"
#include "D12CI.h"
#include "D12HAL.h"
#include "Descriptor.h"
#include "Chap_9.h"
#include "D12Driver.h"
#include "string.h"

 
extern INT8U RecBuf[1024];				    /* 缓冲区 */
extern INT8U volatile EP2_tx;						//端点2发送中断标志
extern INT8U num_Of_64len;                  //长度为64字节的包数 
extern INT8U num_of_less64len;				//长度小于64字节的包长度 
extern INT16U offset;						//偏移量
 
INT8U  GenEpBuf[EP1_PACKET_SIZE];			//端点1接收缓冲区 


/*********************************************************************
** 函数名称: Init_D12()
** 功能描述: 设置D12与硬件的连接, 初始化D12, 复位D12
** 输   入: 无
** 输   出: 0: 初始化成功    1: 初始化失败  
**********************************************************************/
INT8U Init_D12(void)
{

	bEPPflags.value = 0;					//初始化USB事件标志变量
/******=================  modified by Zhou Shuwu ==================================***********/ 
//	Init_D12Port();							//初始化PDIUSBD12与ARM连接的端口
/******=================  modified by Zhou Shuwu ==================================***********/ 
	Rst_D12();								//复位PDIUSBD12
	if (D12_ReadChipID() != 0x1012)			//读取芯片ID号,如果不为1012H
		return 1;							//则复位失败
		
	reconnect_USB();        				//重新连接USB	
	
 	return 0;								//初始化成功
}

/*******************************************************************
** 函数名称: usbserve()
** 功能描述: USB事件处理函数
** 输	 入: 无
** 输	 出: 无
********************************************************************/
void usbserve(void)
{
	if (bEPPflags.bits.setup_packet){		//Setup包处理
		
		DISABLE();
		bEPPflags.bits.setup_packet = 0;
		control_handler();					//调用请求处理子程序
		ENABLE();
	}//if setup_packet

	if (bEPPflags.bits.bus_reset) {			//USB总线复位处理
		
		DISABLE();
		bEPPflags.bits.bus_reset = 0;
		ENABLE();
		d12_busreset();
	} // if bus reset

	if (bEPPflags.bits.suspend) {			//D12挂起改变处理
		
		DISABLE();
		bEPPflags.bits.suspend= 0;
		ENABLE();
		d12_suspend();
	} // if suspend change

	//在此添加其它usb事件处理代码
}


/*******************************************************************
** 函数名称: d12_busreset()
** 功能描述: USB总线复位处理函数
** 输	 入: 无
** 输	 出: 无
********************************************************************/
void d12_busreset(void)
{
	//在此添加总线复位处理代码
}

/*******************************************************************
** 函数名称: dma_eot()
** 功能描述: DMA结束处理函数
** 输	 入: 无
** 输	 出: 无
********************************************************************/
void dma_eot(void)
{
	//在此添加DMA结束处理代码
}

/*******************************************************************
** 函数名称: d12_suspend()
** 功能描述: 总线挂起改变处理函数
** 输	 入: 无
** 输	 出: 无
********************************************************************/
void d12_suspend(void)
{
	//在此添加总线挂起改变代码
}

/*******************************************************************
** 函数名称: ep1_txdone()
** 功能描述: 端点1 IN(发送)处理处理函数
** 输	 入: 无
** 输	 出: 无
********************************************************************/
void ep1_txdone(void)
{
	D12_ReadLastTransactionStatus(3);		//清中断标志位
}

/*******************************************************************
** 函数名称: ep1_txdone()
** 功能描述: 端点1 OUT(接收)处理处理函数
** 输	 入: 无
** 输	 出: 无
********************************************************************/
void ep1_rxdone(void)
{
	INT8U len;	
	D12_ReadLastTransactionStatus(2);		 //清中断标志位
	len = D12_ReadEndpoint(2,sizeof(GenEpBuf),GenEpBuf);	//读取数据
	if(len != 0)
		bEPPflags.bits.ep1_rxdone = 1;		//标志接收到数据
}

/*******************************************************************
** 函数名称: ep2_txdone()
** 功能描述: 端点2 IN(发送)处理处理函数
** 输	 入: 无
** 输	 出: 无
********************************************************************/
void ep2_txdone(void)
{		
	EP2_tx = 1;	
	D12_ReadLastTransactionStatus(5);		//清中断标志位	
}

/*******************************************************************
** 函数名称: ep2_rxdone()
** 功能描述: 端点2 OUT(接收)处理处理函数
** 输	 入: 无
** 输	 出: 无
********************************************************************/
void ep2_rxdone(void)
{	
	INT8U len;
	D12_ReadLastTransactionStatus(4); 								//清中断标志位 		   
	if(num_Of_64len != 0)
	{
		if ((0x60&(D12_ReadEndpointStatus(4))) == 0x60)			   		// 如果双缓冲区中收到数据
		{								  	
			D12_ReadEndpoint(4,EP2_PACKET_SIZE,RecBuf + offset);
			offset += EP2_PACKET_SIZE;
			num_Of_64len --;
			len = D12_ReadEndpoint(4,EP2_PACKET_SIZE,RecBuf + offset);
			offset += len;	
			if (len == EP2_PACKET_SIZE)	
			{								
				num_Of_64len --;           
			}
			else if(len == num_of_less64len)							// 如果收到剩余字节说明接收完毕
			{				
				num_Of_64len = 0;
				num_of_less64len = 0;
			}
			
	               	 			 	
		}  
		else if(num_Of_64len != 0)  									// 只有一个缓冲区中收到数据
		{	 				
		 	D12_ReadEndpoint(4,EP2_PACKET_SIZE,RecBuf + offset);		// 读取缓冲区中的数据		
			offset += EP2_PACKET_SIZE;
			num_Of_64len --;
			
		}
	}

	else  if(num_of_less64len != 0) 
	{
		D12_ReadEndpoint(4,num_of_less64len,RecBuf + offset);		// 读取缓冲区中的数据		
		offset += num_of_less64len;
		num_of_less64len = 0;
	}
    	
	bEPPflags.bits.ep2_rxdone = 1;
	
}

/***********************************************************************
** 函数名称: void Usb_Exception(void)
** 功能描述: D12中断服务程序
*************************************************************************/
/******=================  modified by Zhou Shuwu ==================================***********/ 
//void __irq Usb_Exception(void)  
void UsbISR(void* context, alt_u32 id)
/******=================  modified by Zhou Shuwu ==================================***********/ 
{
	INT16U i_st;
	
	//DISABLE();					                    //进入D12中断服务程序时关中断	
	bEPPflags.bits.in_isr = 1;
	i_st = D12_ReadInterruptRegister();				//读取PDIUSBD12中断寄存器值
	if(i_st != 0) {
		if(i_st & D12_INT_BUSRESET)
			bEPPflags.bits.bus_reset = 1;			//USB总线复位标志
		if(i_st & D12_INT_EOT)
			dma_eot();								//DMA传输技术处理
		if(i_st & D12_INT_SUSPENDCHANGE)
			bEPPflags.bits.suspend = 1;				//挂起改变标志置1
		if(i_st & D12_INT_ENDP0IN)
			ep0_txdone();							//控制端点发送数据处理
		if(i_st & D12_INT_ENDP0OUT)
			ep0_rxdone();							//控制端点接收数据处理			
		if(i_st & D12_INT_ENDP1IN)
			ep1_txdone();							//端点 1发送数据处理
		if(i_st & D12_INT_ENDP1OUT)
			ep1_rxdone();							//端点 1接收数据处理
		if(i_st & D12_INT_ENDP2IN)
			ep2_txdone();							//端点 2发送数据处理
		if(i_st & D12_INT_ENDP2OUT)
			ep2_rxdone();							//端点 2接收数据处理					
		
	}
   	
   	CLR_INTD12();									// 清除EINT1中断标志
//    CLR_INT();										// 向量中断结束
    bEPPflags.bits.in_isr = 0;
	
   	 // ENABLE();							//退出D12中断服务程序时开中断
}

/*********************************************************************************************************
** Function name:    UsbIRQInit
**
** Descriptions:     Initialzie the USB IRQ
**
** input parameters:   None
**            
** Used global variables: 
** Calling modules:       
**
** Created by:        Jing.Zhang
** Created Date:      2006-2-15
**-------------------------------------------------------------------------------------------------------
** Modified by:       
** Modified date:     
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/	
			
/******=================  modified by Zhou Shuwu ==================================***********/ 
INT32 UsbIRQInit(void)
{
    INT32 i;
//	IOWR_ALTERA_AVALON_PIO_DIRECTION(USB_NINT_BASE, 0x0); //the direction is input
//	IOWR_ALTERA_AVALON_PIO_IRQ_MASK(USB_NINT_BASE, 0x1); //enable interrupts
//	IOWR_ALTERA_AVALON_PIO_EDGE_CAP(USB_NINT_BASE, 0x0);//clear capture register
	//register  ISR
	i = alt_irq_register(USB_NINT_IRQ, NULL, UsbISR);
    return i;
}

void UsbIntEnable(void)
{
	IOWR_ALTERA_AVALON_PIO_IRQ_MASK(USB_NINT_BASE, 0xff); //enable interrupts
}

void UsbIntDisable(void)
{
	IOWR_ALTERA_AVALON_PIO_IRQ_MASK(USB_NINT_BASE, 0x00); //enable interrupts
}
/******=================  modified by Zhou Shuwu ==================================***********/ 


/************************************************************
** 函数名称: disconnect_USB() 
** 功能描述: 断开USB总线
************************************************************/
void disconnect_USB(void)
{
	// Initialize D12 configuration
	D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
}	//SoftConnect 断开


/************************************************************
** 函数名称: connect_USB()
** 功能描述: 连接USB总线
************************************************************/
void connect_USB(void)
{
	// Initialize D12 configuration
	D12_SetDMA(0x00);
	D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
}	//SoftConnect 连接上,并设置为无LazyClock,模式为非同步模式


/************************************************************
** 函数名称: reconnect_USB()
** 功能描述: 重新连接USB总线
************************************************************/
void reconnect_USB(void)
{
	INT16U clk_cnt;

	disconnect_USB();							   //断开芯片与USB总线连接
    for (clk_cnt = 0;clk_cnt<= 0x9000;clk_cnt++); //延时处理
    connect_USB();								   //连接到USB总线
}


/************************************************************
** 函数名称: Get_D12_FirmwareVer()
** 功能描述: 重新连接USB总线
** 输	 入: 无
** 输	 出: 16bit整数,如0x0500表示D12固件软件版本号为5.00
************************************************************/
INT16U Get_D12_FirmwareVer(void)
{
	return 0x0500;					//D12固件软件版本号为5.00
}

⌨️ 快捷键说明

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