📄 usbdevprotocol.c
字号:
/****************************************Copyright (c)****************************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
**
** http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name: usbDevProtocol.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"
CONTROL_XFER ControlData; /* 定义传输控制结构变量 */
/*********************************************************************************************************
USB 协议层函数
*********************************************************************************************************/
/*********************************************************************************************************
** Function name: __usbStallEp0
** Descriptions: 使控制端点处于停止状态
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevStallEp0 (void)
{
__usbDevSetEndpointStatus(0, 1); /* 停止控制OUT端点 */
__usbDevSetEndpointStatus(1, 1); /* 停止控制IN端点 */
}
/*********************************************************************************************************
** Function name: __usbDevReserved
** Descriptions: 保留子程序
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevReserved (void)
{
__usbDevStallEp0();
}
/*********************************************************************************************************
** Function name: __usbDevInitUnconfig
** Descriptions: 进入地址状态,禁止 0 除外的所有端点
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevInitUnconfig (void)
{
__usbDevSetEndpointEnable(0);
}
/*********************************************************************************************************
** Function name: __usbInitConfig
** Descriptions: 配置处理,允许端点收发
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevInitConfig (void)
{
__usbDevSetEndpointEnable(1);
}
/*********************************************************************************************************
** Function name: __usbDevSingleTransmit
** Descriptions: 通过物理端点 1 发送数据
** input parameters: pcSendbuf 发送数据指针
** ucSendlen 发送数据长度
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevSingleTransmit (INT8U *pucSendbuf,INT8U ucSendLen)
{
if( ucSendLen <= EP0_PACKET_SIZE) { /* 不超过端点最大包大小 */
usbDevWriteEndpoint(1,
pucSendbuf,
ucSendLen); /* 向控制IN端点写入1字节数据 */
}
}
/*********************************************************************************************************
** Function name: __usbDevCodeTransmit
** Descriptions: 通过物理端点 1 发送数据
** input parameters: pucRomData 发送数据指针
** usSendLen 发送数据长度
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevCodeTransmit(INT8U * pucRomData, INT16U usSendLen)
{
ControlData.wCount = 0;
if (ControlData.wLength > usSendLen) {
ControlData.wLength = usSendLen; /* 长度要小于usSendLen */
}
ControlData.pData = pucRomData;
if (ControlData.wLength >= EP0_PACKET_SIZE) {
usbDevWriteEndpoint(1,
ControlData.pData,
EP0_PACKET_SIZE );
ControlData.wCount += EP0_PACKET_SIZE; /* 计数器累加 */
IRQ_DISABLE();
bEPPflags.bits.control_state = USB_TRANSMIT; /* 标识发送状态 */
IRQ_ENABLE();
} else {
usbDevWriteEndpoint(1,
pucRomData,
(INT8U)ControlData.wLength); /* 将全部数据写入端点 */
ControlData.wCount =(INT16U)(ControlData.wCount
+ ControlData.wLength); /* 计数器累加 */
IRQ_DISABLE();
bEPPflags.bits.control_state = USB_IDLE; /* 标识空闲状态 */
IRQ_ENABLE();
}
}
/*********************************************************************************************************
USB 标准设备请求服务程序
*********************************************************************************************************/
/*********************************************************************************************************
** Function name: __usbDevGetStatus
** Descriptions: 主机要求获取状态,设备返回16位的状态描述符给主机
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevGetStatus (void)
{
INT8U ucEpindex = 0;
INT8U ucTxdata[2] = {0};
INT8U ucEpstat = 0;
INT8U ucRecipient =(INT8U)(ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT);
/* 获取请求类型 */
if (ucRecipient == USB_RECIPIENT_DEVICE) {
if (bEPPflags.bits.remote_wakeup == 1) {
ucTxdata[0] = 3; /* 支持远程唤醒和自供电 */
} else {
ucTxdata[0] = 1; /* 不支持以上两个功能 */
}
ucTxdata[1]=0; /* 高 8 位清 0 */
__usbDevSingleTransmit(ucTxdata, 2); /* 发送16ibt到USB主机 */
} else if (ucRecipient == USB_RECIPIENT_INTERFACE) {
ucTxdata[0]=0;
ucTxdata[1]=0;
__usbDevSingleTransmit(ucTxdata, 2); /* 发送16ibt到USB主机 */
} else if (ucRecipient == USB_RECIPIENT_ENDPOINT) {
ucEpindex = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK) {
ucEpstat = __usbDevSelectEndpoint((INT8U)(ucEpindex * 2 + 1));
/* 读 IN 端点状态 */
} else {
ucEpstat = __usbDevSelectEndpoint((INT8U)(ucEpindex * 2)); /* 读 OUT 端点状态 */
}
if (ucEpstat & USB_STALL) {
ucTxdata[0] = 1; /* 端点已被禁止 */
} else {
ucTxdata[0] = 0; /* 端点已解禁 */
}
ucTxdata[1] = 0;
__usbDevSingleTransmit(ucTxdata, 2); /* 发送16ibt到USB主机 */
} else {
__usbDevStallEp0(); /* 非标准请求,禁止逻辑端点0 */
}
}
/*********************************************************************************************************
** Function name: __usbDevClearFeature
** Descriptions: 清除特性
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevClearFeature (void)
{
INT8U ucEpindex = 0;
INT8U ucRecipient = (INT8U)(ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT);
/* 获取请求类型 */
if (ucRecipient == USB_RECIPIENT_DEVICE
&& ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
IRQ_DISABLE();
bEPPflags.bits.remote_wakeup = 0; /* 清除远程唤醒特性 */
IRQ_ENABLE();
__usbDevSingleTransmit(0, 0); /* 返回一个空包 */
} else if ((ucRecipient == USB_RECIPIENT_ENDPOINT)
&& (ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)) {
ucEpindex = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK) {
__usbDevSetEndpointStatus((INT8U)(ucEpindex * 2 + 1), 0); /* 解禁 IN 端点 */
} else {
__usbDevSetEndpointStatus((INT8U)(ucEpindex * 2), 0); /* 解禁 OUT 端点 */
}
__usbDevSingleTransmit(0, 0); /* 发送空包表示执行成功 */
} else {
__usbDevStallEp0(); /* 不成功,禁止逻辑端点0 */
}
}
/*********************************************************************************************************
** Function name: __usbDevSetFeature
** Descriptions: 设置特性
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevSetFeature (void)
{
INT8U ucEpindex = 0;
INT8U ucRecipient =(INT8U)(ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT);
/* 获取请求类型 */
if ((ucRecipient == USB_RECIPIENT_DEVICE) /* 请求设备 */
&& (ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)) {
IRQ_DISABLE();
bEPPflags.bits.remote_wakeup = 1; /* 设置远程唤醒标志 */
IRQ_ENABLE();
__usbDevSingleTransmit(0, 0); /* 返回一个空包 */
} else if ((ucRecipient == USB_RECIPIENT_ENDPOINT) /* 请求端点 */
&& (ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)) {
ucEpindex = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK) {
__usbDevSetEndpointStatus((INT8U)(ucEpindex * 2 + 1), 1); /* IN 端点被禁止 */
} else {
__usbDevSetEndpointStatus((INT8U)(ucEpindex * 2), 1); /* OUT端点被禁止 */
}
__usbDevSingleTransmit(0, 0); /* 返回一个空包 */
} else {
__usbDevStallEp0(); /* 非标准请求,禁止逻辑端点0 */
}
}
/*********************************************************************************************************
** Function name: __usbDevSetAddress
** Descriptions: 设置地址
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevSetAddress (void)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -