📄 chap_9.c
字号:
/****************************************Copyright (c)**************************************************** Guangzhou ZHIYUAN electronics Co.,LTD.** ** http://www.zyinside.com****--------------File Info-------------------------------------------------------------------------------** File Name: Chap_9.c** Last modified Date: 2006.01.09** Last Version: V1.0 ** Description: chap_9.c, 实现USB1.1协议** chap_9.c, realize USB1.1 protocol**------------------------------------------------------------------------------------------------------** Created By: MingYuan Zheng 郑明远** Created date: 2006.01.09** Version: V1.0** Descriptions: The original version 初始版本****------------------------------------------------------------------------------------------------------** Modified by:** Modified date:** Version:** Description:**********************************************************************************************************/
#include "config.h"
/* define control transfer structure variable */
CONTROL_XFER ControlData; /* 定义传输控制结构变量 */
/*************************************************************************
** 函数名称: USB 标准设备请求入口地址指针表
** Function: Entry address of USB standard device request Function
**************************************************************************/
void (*StandardDeviceRequest[])(void) =
{
get_status,
clear_feature,
reserved,
set_feature,
reserved,
set_address,
get_descriptor,
reserved,
get_configuration,
set_configuration,
get_interface,
set_interface,
reserved,
reserved,
reserved,
reserved
};
//*************************************************************************
// USB 协议层函数 USB Protocal Function
//*************************************************************************
/*************************************************************************************************
** 函数名称: stall_ep0() Name: stall_ep0()
** 功能描述: 使控制端点处于停止状态 Function: stall logical endpoint 0
*************************************************************************************************/
void stall_ep0(void)
{
USB_SetEndpointStatus(0, 1);
USB_SetEndpointStatus(1, 1);
}
/*************************************************************************************************
** 函数名称: reserved() Name: reserved()
** 功能描述: 保留子程序 Function: reserved function
*************************************************************************************************/
void reserved(void)
{
stall_ep0();
}
/*************************************************************************************************
** 函数名称: init_unconfig() Name: init_unconfig()
** 功能描述: 进入地址状态,禁止 0 除外的所有端点 Function: disable all endpoints except for control endpoint 0
*************************************************************************************************/
void init_unconfig(void)
{
}
/*************************************************************************************************
** 函数名称: init_config() Name: init_config()
** 功能描述: 配置处理,允许端点收发 Function: enable all endpoints
*************************************************************************************************/
void init_config(void)
{
}
/*************************************************************************************************
** 函数名称: single_transmit() Name: single_transmit()
** 功能描述: 通过物理端点 1 发送数据 Function: send data by physical endpoint 1
** 输 入: INT8U * buf: 发送数据指针 Input: INT8U * buf: send buffer
INT8U len: 发送数据长度 INT8U len: send data length
** 输 出: 无 Output: NULL
*************************************************************************************************/
void single_transmit(INT8U * buf, INT8U len)
{
/* the len must below the maxpacket size of physical endpoint 1 */
if( len <= EP0_PACKET_SIZE)
{ /* len 必须小于端点的最大包信息长度 */
USB_WriteEndpoint(0, len, buf);
USB_ValidBufferEp0(1);
DISABLE();
bEPPflags.bits.control_state = USB_IDLE; /* 标识空闲状态 flag IDLE state */
ENABLE();
}
}
/*************************************************************************************************
** 函数名称: code_transmit() Name: code_transmit()
** 功能描述: 通过物理端点 1 发送数据 Function: send data by physical endpoint 1
** 输 入: INT8U *pRomData: 发送数据指针 Inptut: INT8U * buf: send buffer
INT16U len: 发送数据长度 INT8U len: send data length(the value can above
EP0_PACKET_SIZE)
** 输 出: 无 Output: NULL
*************************************************************************************************/
void code_transmit(INT8U * pRomData, INT16U len)
{
ControlData.wCount = 0;
if(ControlData.wLength > len)
ControlData.wLength = len; /* 长度要小于len the wLength can't above len */
ControlData.pData = pRomData;
if( ControlData.wLength > EP0_PACKET_SIZE)
{
/* wLength above MaxPacketSize of physical endpoint 1 */
USB_WriteEndpoint(0, EP0_PACKET_SIZE, ControlData.pData);
USB_ValidBufferEp0(0);
ControlData.wCount += EP0_PACKET_SIZE; /* 计数器累加 count number have been sent */
DISABLE();
bEPPflags.bits.control_state = USB_TRANSMIT; /* 标识发送状态 flag transmit state */
ENABLE();
}
else
{
USB_WriteEndpoint(0, ControlData.wLength, pRomData); /* 将全部数据写入端点 write all data into endpoint */
USB_ValidBufferEp0(1);
ControlData.wCount += ControlData.wLength; /* 计数器累加 count number have been sent */
DISABLE();
bEPPflags.bits.control_state = USB_IDLE; /* 标识空闲状态 flag IDLE state */
ENABLE();
}
}
//*************************************************************************
// USB 标准设备请求服务程序 USB standard device request service program
//*************************************************************************
/***************************************************************************************************************
** 函数名称: get_status() Name: get_status()
** 功能描述: 主机要求获取状态,设备返回16位的 Function: the USB host request get the status of USB device,
状态描述符给主机 USB device will response 16-bit descriptor
****************************************************************************************************************/
void get_status(void)
{
INT8U txdat[2];
INT8U bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
/* 获取请求类型 get the Request type */
if (bRecipient == USB_RECIPIENT_DEVICE)
{ /* request device */
if(bEPPflags.bits.remote_wakeup == 1)
txdat[0] = 3; /* 支持远程唤醒和自供电 support reamote wakeup and power itself */
else
txdat[0] = 1; /* 不支持以上两个功能 not support two function above */
txdat[1]=0; /* 高 8 位清 0 upper 8-bit clear */
single_transmit(txdat, 2); /* 发送16ibt到USB主机 transmit 16-bit to USB host */
}
else if (bRecipient == USB_RECIPIENT_INTERFACE)
{ /* request interface */
txdat[0]=0;
txdat[1]=0;
single_transmit(txdat, 2); /* 发送16ibt到USB主机 transmit 16-bit to USB host */
}
else if (bRecipient == USB_RECIPIENT_ENDPOINT)
{ /* request endpoint */
txdat[0] = 0; /* 端点不会被禁止 the endpoint is always unstalled */
txdat[1] = 0;
single_transmit(txdat, 2); /* 发送16ibt到USB主机 transmit 16-bit to USB host */
}
else
stall_ep0(); /* 非标准请求,禁止逻辑端点0 */
/* not standard request, stall logical endpoint 0 */
}
/***************************************************************************************************************
** 函数名称: clear_feature() Name: clear_feature()
** 功能描述: 清除特性 Function: clear feature
****************************************************************************************************************/
void clear_feature(void)
{
INT8U endp;
INT8U bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
/* 获取请求类型 get request type */
if (bRecipient == USB_RECIPIENT_DEVICE
&& ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
{ /* request device */
DISABLE();
bEPPflags.bits.remote_wakeup = 0; /* 清除远程唤醒特性 clear reamote wakeup feature */
ENABLE();
USB_EndSetup(); /* 返回一个空包 return an empty packet */
}
else if (bRecipient == USB_RECIPIENT_ENDPOINT
&& ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
{
/* request endpoint */
endp = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK)
USB_SetEndpointStatus(endp * 2 + 1, 0); /* 解禁 IN 端点 the IN endpoint is unstalled */
else
USB_SetEndpointStatus(endp * 2, 0); /* 解禁 OUT 端点 the OUT endpoint is unstalled */
USB_EndSetup(); /* 发送空包表示执行成功 return an empty packet indicate perform sucessfully */
} else
stall_ep0(); /* 不成功,禁止逻辑端点0 not the request, stall logical endpoint 0 */
}
/***************************************************************************************************************
** 函数名称: set_feature() Name: set_feature()
** 功能描述: 设置特性 Function: set feature
****************************************************************************************************************/
void set_feature(void)
{
INT8U endp;
INT8U bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
/* 获取请求类型 get request type */
if (bRecipient == USB_RECIPIENT_DEVICE /* 请求设备 request device */
&& ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
{
DISABLE();
bEPPflags.bits.remote_wakeup = 1; /* 设置远程唤醒标志 set reamote wakeup flag */
ENABLE();
USB_EndSetup(); /* 返回一个空包 return an empty packet */
}
else if (bRecipient == USB_RECIPIENT_ENDPOINT /* 请求端点 request endpoint */
&& ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
{
endp = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK)
USB_SetEndpointStatus(endp * 2 + 1, 1); /* IN 端点被禁止 the IN endpoint is stalled */
else
USB_SetEndpointStatus(endp * 2, 1); /* OUT端点被禁止 the OUT endpoint is stalled */
USB_EndSetup(); /* 返回一个空包 return an empty packet */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -