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