📄 usbdevdriver.c
字号:
/****************************************Copyright (c)****************************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
**
** http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name: usbDevDriver.c
** Latest modified Date: 2008-05-10
** Latest Version: 1.1
** Descriptions: usbDevLPC2400 固件程序应用层源文件
**
**--------------------------------------------------------------------------------------------------------
** Created by: ZhengMingyuan
** Created date: 2005-08-08
** Version: 1.0
** Descriptions: The original version
**
**--------------------------------------------------------------------------------------------------------
** Modified by: LingGuilin
** Modified date: 2008-05-10
** Version: 1.1
** Descriptions: 修改部分代码以适合SmartARM2400系列开发板
**
*********************************************************************************************************/
#include "config.h"
INT8U GenEpBuf[EP1_PACKET_SIZE]; /* 逻辑端点 1 接收缓冲区 */
INT8U EpBuf[EP2_PACKET_SIZE]; /* 逻辑端点 2 接收缓冲区 */
EPPFLAGS bEPPflags; /* 定义 USB 事件标志变量 */
/*********************************************************************************************************
** Function name: __usbDevConfigEndpoint
** Descriptions: 配置端点的最大包大小
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevConfigEndpoint (void)
{
__usbDevConfigMaxPaketSize(0,EP0_PACKET_SIZE); /* 配置各物理端点的最大包大小 */
__usbDevConfigMaxPaketSize(1,EP0_PACKET_SIZE);
__usbDevConfigMaxPaketSize(2,EP1_PACKET_SIZE);
__usbDevConfigMaxPaketSize(3,EP1_PACKET_SIZE);
__usbDevConfigMaxPaketSize(4,EP2_PACKET_SIZE);
__usbDevConfigMaxPaketSize(5,EP2_PACKET_SIZE);
}
/*********************************************************************************************************
** Function name: __usbDevEp1TxDone
** Descriptions: 逻辑端点1发送数据处理
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevEp1TxDone (void)
{
__usbDevSelectClrIntEndpoint(3); /* 选择端点并清除中断 */
}
/*********************************************************************************************************
** Function name: __usbDevEp1RxDone
** Descriptions: 逻辑端点1接收数据处理
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevEp1RxDone (void)
{
INT8U len;
__usbDevSelectClrIntEndpoint(2); /* 选择端点并清除中断 */
len = usbDevReadEndpoint(2,GenEpBuf,sizeof(GenEpBuf)); /* 从接收缓冲区中读出数据 */
if(len != 0) {
bEPPflags.bits.ep1_rxdone = 1; /* 标识该端点收到数据 */
}
}
/*********************************************************************************************************
** Function name: __usbDevEp2TxDone
** Descriptions: 逻辑端点2发送数据处理
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevEp2TxDone (void)
{
INT8U i = 0;
INT32U ulTmp = 0;
INT8U ucEpState = 0;
INT32U ulLeftLen = 0;
__usbDevSelectClrIntEndpoint(5); /* 选择端点并清除中断 */
if (Usb.Cnt >= Usb.Len) {
return; /* 发送完成后返回 */
}
for (i = 0; i < 2; i++) {
ucEpState = (INT8U)(__usbDevSelectEndpoint(5) & 0x60);
if (ucEpState == 0x60) {
break; /* 双缓冲区都满则退出 */
}
ulLeftLen = Usb.Len - Usb.Cnt;
if (ulLeftLen > 0) {
if (ulLeftLen >= 64) {
ulTmp = usbDevWriteEndpoint(5,
Usb.pbuff + Usb.Cnt,
64); /* 写64个字节 */
} else {
ulTmp = usbDevWriteEndpoint(5,
Usb.pbuff + Usb.Cnt,
(INT8U)ulLeftLen); /* 写少于64个字节 */
}
Usb.Cnt += ulTmp; /* 累加已发送字节数 */
}
}
}
/*********************************************************************************************************
** Function name: __usbDevEp2RxDone
** Descriptions: 逻辑端点2接收数据处理
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevEp2RxDone (void)
{
INT8U i = 0;
INT8U ucEpState = 0;
INT32U ulTmp = 0;
INT32U ulLeftLen = 0;
__usbDevSelectClrIntEndpoint(4); /* 选择端点并清除中断 */
if (Usb.Cnt >= Usb.Len) {
Usb.bRecFinish = 1; /* 接收完成 */
return;
}
for(i = 0; i < 2; i++) {
ulLeftLen = Usb.Len - Usb.Cnt;
if (ulLeftLen > 0) {
if (ulLeftLen >= 64) {
ulTmp = usbDevReadEndpoint(4,
Usb.pbuff + Usb.Cnt,
64); /* 接收 64 个字节 */
Usb.Cnt = Usb.Cnt + 64;
} else {
ulTmp = usbDevReadEndpoint(4,
Usb.pbuff + Usb.Cnt,
(INT8U)ulLeftLen); /* 接收少于64个字节 */
Usb.Cnt = Usb.Cnt + ulTmp;
}
}
ucEpState = (INT8U)(__usbDevSelectEndpoint(4) & 0x60);
if (ucEpState == 0) {
break; /* 无缓冲区满 */
}
}
if (Usb.Cnt >= Usb.Len) {
Usb.bRecFinish = 1; /* 接收完成 */
}
}
/*********************************************************************************************************
** Function name: __usbDevHPService
** Descriptions: USB 端点高速中断服务程序
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevHpService (void)
{
INT32U ep_st;
ep_st = (INT32U)USBEpIntSt; /* 读端点中断状态寄存器 */
if(ep_st & USB_ENDP00)
__usbDevEp0RxDone(); /* 控制端点接收数据处理 */
if(ep_st & USB_ENDP01)
__usbDevEp0TxDone(); /* 控制端点发送数据处理 */
if(ep_st & USB_ENDP02)
__usbDevEp1RxDone(); /* 逻辑端点1接收数据处理 */
if(ep_st & USB_ENDP03)
__usbDevEp1TxDone(); /* 逻辑端点1发送数据处理 */
if(ep_st & USB_ENDP04)
__usbDevEp2RxDone(); /* 逻辑端点2接收数据处理 */
if(ep_st & USB_ENDP05)
__usbDevEp2TxDone(); /* 逻辑端点2发送数据处理 */
USBDevIntClr = FASTINTERRUPT;
}
/*********************************************************************************************************
** Function name: __usbDevLPService
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -