📄 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: ZLG_USB2400 Device 软件包应用层源文件
**
**--------------------------------------------------------------------------------------------------------
** 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"
EPPFLAGS bEPPflags; /* 定义 USB 事件标志变量 */
OS_STK usbDevTaskSetupStk[128]; /* SETUP包处理任务堆栈 */
OS_EVENT *pSetup_Event; /* SETUP包处理任务事件指针 */
CTRL_USB Ctrl_Usb[NUM_ENDPOINTS]; /* USB 接收或发送控制块 */
INT8U __GucDevTaskSetUpPrio = 0; /* SETUP包处理任务优先级 */
/*********************************************************************************************************
** 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: __usbDevEpISR
** Descriptions: 端点接收/发送数据处理
** input parameters: ucEpIndex: 物理端点索引
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevEpISR (INT8U ucEpIndex)
{
__usbDevSelectClrIntEndpoint(ucEpIndex); /* 选择端点并清除中断 */
#if (!DMA_ENGINE_EN)
if (Ctrl_Usb[ucEpIndex - 2].bTaskWaiting == 0) { /* 任务未进入等待接收/发送状态 */
Ctrl_Usb[ucEpIndex - 2].bEpReady = 1; /* 置位标志 */
} else {
OSSemPost(Ctrl_Usb[ucEpIndex - 2].Ep_Sem); /* 使等待接收/发送数据的任务就绪*/
}
#endif
}
/*********************************************************************************************************
** Function name: __usbDevHpService
** Descriptions: USB 端点高速中断服务程序
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevHpService (void)
{
INT8U i = 0;
unsigned long ulEpstat = 0;
ulEpstat = USBEpIntSt; /* 读端点中断状态寄存器 */
if(ulEpstat & USB_ENDP00) {
__usbDevEp0RxDone(); /* 控制端点接收数据处理 */
}
if(ulEpstat & USB_ENDP01) {
__usbDevEp0TxDone(); /* 控制端点发送数据处理 */
}
for (i = 2; i <= 5; i++) {
if ((ulEpstat &(INT32U)(0x01 << i)) != 0) {
__usbDevEpISR(i); /* 其它端点接收/发送数据处理 */
}
}
USBDevIntClr = FASTINTERRUPT; /* 清除USB器件的快速中断 */
}
/*********************************************************************************************************
** Function name: __usbDevLpService
** Descriptions: USB 端点慢速中断服务程序
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevLpService (void)
{
INT8U i = 0;
unsigned long ulEpstat = 0;
ulEpstat = USBEpIntSt; /* 读端点中断状态寄存器 */
if(ulEpstat & USB_ENDP00) {
__usbDevEp0RxDone(); /* 控制端点接收数据处理 */
}
if(ulEpstat & USB_ENDP01) {
__usbDevEp0TxDone(); /* 控制端点发送数据处理 */
}
for (i = 2; i <= 5; i++) {
if ((ulEpstat & (INT32U)(0x01 << i)) != 0) {
__usbDevEpISR(i); /* 其它端点接收/发送数据处理 */
}
}
USBDevIntClr = SLOWINTERRUPT; /* 清除USB器件的慢速中断 */
}
/*********************************************************************************************************
** Function name: __usbDevBusReset
** Descriptions: USB 总线复位处理
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevBusReset (void)
{
bEPPflags.value = 0; /* 置USB事件标志为0 */
__usbDevIntConfig(); /* 重新设置USB Device相关中断 */
__usbDevConfigEndpoint(); /* 重新配置所有端点最大包大小 */
}
/*********************************************************************************************************
** Function name: __usbDevSuspendChange
** Descriptions: USB 总线挂起改变处理
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevSuspendChange (void)
{
}
/*********************************************************************************************************
** Function name: _usbDevConnectChange
** Descriptions: USB 总线连接改变处理
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevConnectChange (void)
{
}
/*********************************************************************************************************
** Function name: __usbDevRwParam
** Descriptions: 填写USB接收或发送控制块有关参数
** input parameters: pstUsb: USB 传输控制块结构体指针
** pucBuf: 接收或发送数据缓冲区指针
** output parameters: 无
** Returned value: 0:操作成功;>0:操作失败
*********************************************************************************************************/
INT8U __usbDevRwParam (CTRL_USB *pstUsb, INT8U *pucBuf)
{
if (bEPPflags.bits.configuration == 0) {
return USB_ERR_NO_CONFIG; /* USB总线未配置完成 */
}
if (pucBuf == NULL) {
return USB_ERR_BUFF_INVALID; /* 缓冲区指针无效错误 */
}
if (pstUsb->bEpUsed == 1) {
return USB_ERR_ENDP_OCCUPY; /* 端点已被其它任务占用 */
}
pstUsb->bEpUsed = 1; /* 本任务占用该端点 */
return USB_NO_ERR;
}
/*********************************************************************************************************
** Function name: __usbDevWaitEpReady
** Descriptions: 等待端点就绪
** input parameters: pstUsb: USB接收或发送控制块结构体指针
** usWaitTime: 等待超时时间
** output parameters: 无
** Returned value: 0:操作成功;>0:操作失败
*********************************************************************************************************/
#if (!DMA_ENGINE_EN)
INT8U __usbDevWaitEpReady (CTRL_USB *pstUsb, INT16U usWaitTime)
{
INT8U ucErr = 0;
OS_ENTER_CRITICAL();
if (pstUsb->bEpReady == 1) {
/* 端点已就绪 */
pstUsb->bEpReady = 0;
OS_EXIT_CRITICAL();
ucErr = USB_NO_ERR; /* 无须等待 */
} else {
pstUsb->bTaskWaiting = 1; /* 置位,表示任务进入等待的状态 */
OSSemPend(pstUsb->Ep_Sem,
usWaitTime,
&ucErr); /* 等待端点就绪(进入等待状态) */
OS_EXIT_CRITICAL();
}
return ucErr;
}
#endif
/*********************************************************************************************************
** Function name: __usbDevRwResult
** Descriptions: USB 读写端点结果处理
** input parameters: ucEpIndex 物理端点索引号2、3、4、5
** ucBufNum 物理端点的FIFO个数1、2
** pstUsb USB传输控制块结构体指针
** ucRead 是否为读端点操作0:写操作处理;1:读操作处理
** ucErr 是否存在错误0:无错误;1:由错误
** output parameters: 无
** Returned value: 0:操作成功;>0:操作失败
**********************************************************************************************************/
#if (!DMA_ENGINE_EN)
void __usbDevRwResult(INT8U ucEpIndex,
INT8U ucBufNum,
CTRL_USB *pstUsb,
INT8U ucRead,
INT8U ucErr)
{
INT8U i = 0;
INT8U ucEpState = 0;
OS_ENTER_CRITICAL();
if (ucErr == 1) {
for (i = 0; i < ucBufNum; i++) {
ucEpState = __usbDevSelectEndpoint(ucEpIndex);
if ((ucEpState & 0x60) != 0) { /* 接收/发送缓冲区不空 */
if (ucRead == 1) {
/* 当前为接收状态 */
__usbDevSelectEndpoint(ucEpIndex);
__usbDevClearBuffer(); /* 清空OUT 端点缓冲区 */
} else {
__usbDevSetEndpointStatus(ucEpIndex, 0); /* 解禁 IN 端点 */
}
}
}
}
pstUsb->bEpUsed = 0; /* 标识本任务不占用该端点 */
pstUsb->bTaskWaiting = 0; /* 标识任务未进入等待状态 */
OS_EXIT_CRITICAL();
}
#endif
/*********************************************************************************************************
** Function name: __usbDevReadPort
** Descriptions: 非DMA模式下,从USB Device的OUT端点FIFO中读取数据
** input parameters: ucEpIndex 物理端点索引号2,4等
** ucBufNum 物理端点缓冲区个数1或2
** ulPacketSize 物理端点最大包大小
** pstUsb 指向物理端点传输控制块结构体的指针
** pucRcvBuf 接收数据缓冲区指针
** ulReadLen 待读取字节数
** usWaitTime 超时等待时间ms,为0时无限等待
** output parameters: 无
** Returned value: 0:操作成功;>0:操作失败
*********************************************************************************************************/
#if (!DMA_ENGINE_EN)
INT8U __usbDevReadPort(INT8U ucEpIndex,
INT8U ucBufNum,
INT32U ulPacketSize,
CTRL_USB *pstUsb,
INT8U *pucRcvBuf,
INT32U ulReadLen,
INT16U usWaitTime)
{
INT8U ucErr = 0;
INT8U i = 0;
INT32U ulReadCnt = 0;
INT32U ulTmp = 0;
OS_ENTER_CRITICAL();
ucErr = __usbDevRwParam(pstUsb,pucRcvBuf); /* 检查参数正确性 */
if (ucErr != USB_NO_ERR) {
OS_EXIT_CRITICAL();
OSTimeDly(1);
return ucErr; /* 返回错误码 */
}
OS_EXIT_CRITICAL();
while(1) {
ucErr = __usbDevWaitEpReady(pstUsb,usWaitTime); /* 等待端点收到数据 */
if (ucErr == OS_NO_ERR) {
OS_ENTER_CRITICAL();
for(i = 0; i < ucBufNum; i++) {
if ((__usbDevSelectEndpoint(ucEpIndex) & 0x60) == 0) {
break; /* 缓冲区为空 */
}
ulTmp = ulReadLen - ulReadCnt; /* 计算未读取字节数 */
if (ulTmp >= ulPacketSize) {
ulTmp = __usbDevReadEndpoint(ucEpIndex,
pucRcvBuf + ulReadCnt,
(INT8U)ulPacketSize); /* 读取一包数据 */
} else {
ulTmp = __usbDevReadEndpoint(ucEpIndex,
pucRcvBuf + ulReadCnt,
(INT8U)ulTmp); /* 读取不足一包数据 */
}
ulReadCnt = ulReadCnt + ulTmp; /* 累加已读取字节数 */
if (ulReadCnt >= ulReadLen) { /* 接收完成 */
OS_EXIT_CRITICAL();
__usbDevRwResult(ucEpIndex,
ucBufNum,
pstUsb,
1,
0); /* 传输结束处理 */
return USB_NO_ERR;
}
}
pstUsb->bTaskWaiting = 0; /* 任务未进入等待接收状态 */
OS_EXIT_CRITICAL();
} else {
__usbDevRwResult(ucEpIndex,
ucBufNum,
pstUsb,
1,
1); /* 传输结束处理 */
return USB_ERR_WR_TIMEOUT; /* 返回操作超时错误码 */
}
}
}
#endif
/*********************************************************************************************************
** Function name: __usbDevWritePort
** Descriptions: 非DMA模式下,向USB Device的IN端点FIFO中写入数据
** input parameters: ucEpIndex 物理端点索引号2,4等
** ulPacketSize 物理端点最大包大小
** ucBufNum 物理端点缓冲区个数1或2
** pstUsb 指向物理端点传输控制块结构体的指针
** pucSendBuf 发送数据缓冲区
** ulSendLen 待发送字节数
** usWaitTime 超时等待时间ms,为0时无限等待
** output parameters: 无
** Returned value: 0:操作成功;>0:操作失败
*********************************************************************************************************/
#if (!DMA_ENGINE_EN)
INT8U __usbDevWritePort (INT8U ucEpIndex,
INT8U ucBufNum,
INT32U ulPacketSize,
CTRL_USB *pstUsb,
INT8U *pucSendBuf,
INT32U ulSendLen,
INT16U usWaitTime)
{
INT8U ucErr = 0;
INT8U i = 0;
INT32U ulSendCnt = 0;
INT32U ulTmp = 0;
OS_ENTER_CRITICAL();
ucErr = __usbDevRwParam(pstUsb,pucSendBuf); /* 检查参数正确性 */
if (ucErr != USB_NO_ERR) {
OS_EXIT_CRITICAL();
OSTimeDly(1);
return ucErr;
}
OS_EXIT_CRITICAL();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -