📄 chap9.c
字号:
//********************************
//标准设备请求处理chap9.c
//编译环境WinAVRGCC
//2007-01-9
//Hjxiang
//********************************
//标准C头文件
#include <stdint.h>
#include <stdlib.h>
//AVR头文件
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/delay.h>
//自定义头文件
#include "usb.h"
#include "d12ic.h"
#include "chap9.h"
/**********************************
USB标准请求程序调用到的子程序
**********************************/
//保留子程序
void reserved(void)
{
stall_ep0(); //返回STALL
}
//进入地址状态,禁止0除外的所有端点
void init_unconfig(void)
{
D12_SetEndpointEnable(0); //禁止除0外的所有端点
}
//配置处理,允许端点收发
void init_config(void)
{
D12_SetEndpointEnable(1); //允许端点收发
}
//通过端点索引1发送数据(Data类型)
void single_transmit(unsigned char *buf,unsigned char len)
{
if(len <= EP0_PACKET_SIZE)
{
D12_WriteEndpoint(1,len,buf);
}
}
//通过端点索引1发送数据(CODE类型)
void code_transmit(unsigned char *pRomData,unsigned short len)
{
ControlData.wCount=0;
if(ControlData.wLength>len)
ControlData.wLength=len; //发送数据长度控制
ControlData.pData=pRomData;
if(ControlData.wLength>=EP0_PACKET_SIZE)
{
D12_WriteEndpoint(1,EP0_PACKET_SIZE,ControlData.pData);
ControlData.wCount += EP0_PACKET_SIZE;
DISABLE;
bEPPflags.bits.control_state=USB_TRANSMIT; //标志发送状态
ENABLE;
}
else
{
D12_WriteEndpoint(1,ControlData.wLength,pRomData);
ControlData.wCount += ControlData.wLength;
DISABLE;
bEPPflags.bits.control_state=USB_IDLE; //标志发送状态
ENABLE;
}
}
/**********************************
USB标准请求服务子程序
**********************************/
//获取状态
void get_status(void)
{
unsigned char endp,txdat[2];
unsigned char bRecipient=ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
unsigned char c;
if(bRecipient == USB_RECIPIENT_DEVICE)
{ //返回设备状态
if(bEPPflags.bits.remote_wakeup==1)
txdat[0]=3; //支持远程唤醒,自供电
else
txdat[0]=1;
txdat[1]=0;
single_transmit(txdat,2); //发送数据
}
else
if(bRecipient == USB_RECIPIENT_INTERFACE)
{ //返回接口状态
txdat[0]=0;
txdat[1]=0;
single_transmit(txdat,2); //发送数据
}
else
if(bRecipient == USB_RECIPIENT_ENDPOINT)
{ //返回端点状态
endp=(unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
if(ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
c=D12_SelectEndpoint(endp*2+1); //读取输入端点状态
else
c=D12_SelectEndpoint(endp*2); //读取输出端点状态
if(c & D12_STALL)
txdat[0]=1; //端点禁止
else
txdat[0]=0; //端点有效
txdat[1]=0;
single_transmit(txdat,2); //发送数据
}
else
stall_ep0(); //非标准请求,发STALL
}
//清除特性
void clear_feature(void)
{
unsigned char endp; //读取请求类型中的接收方
unsigned char bRecipient=ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
if(bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue==USB_FEATURE_REMOTE_WAKEUP)
{//清除远程唤醒特性
DISABLE;
bEPPflags.bits.remote_wakeup=0;
ENABLE;
single_transmit(0,0); //返回应答
}
else
if(bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue==USB_FEATURE_ENDPOINT_STALL)
{ //清除端点禁止特性,恢复其使用
endp=(unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
if(ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
D12_SetEndpointStatus(endp*2+1,0); //清除输入端点STALL特性
else
D12_SetEndpointStatus(endp*2,0); //清除输出端点STALL特性
single_transmit(0,0); //发送响应
}
else
stall_ep0(); //没有该请求,返回STALL
}
//设置特性
void set_feature(void)
{
unsigned char endp;
//读取设备请求中的接收方
unsigned char bRecipient=ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
if(bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue==USB_FEATURE_REMOTE_WAKEUP)
{//设置远程唤醒特性
DISABLE;
bEPPflags.bits.remote_wakeup=1;
ENABLE;
single_transmit(0,0); //返回应答
}
else
if(bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue==USB_FEATURE_ENDPOINT_STALL)
{
endp=(unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
if(ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
D12_SetEndpointStatus(endp*2+1,1);
else
D12_SetEndpointStatus(endp*2,1); //设置输出端点禁止
single_transmit(0,0); //发送响应
}
else
stall_ep0(); //没有该请求,返回STALL
}
//设置地址
void set_address(void)
{
D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue & DEVICE_ADDRESS_MASK),1);
single_transmit(0,0); //发送响应
}
//获取描述符
void get_descriptor(void)
{
//读取请求的描述符类型
unsigned char bDescriptor = ControlData.DeviceRequest.wValue;
if(bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE)
{
//获取设备描述符
code_transmit((unsigned char *) & DeviceDescr,sizeof(USB_DEVICE_DESCRIPTOR));
}
else
if(bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE)
{
if(ControlData.DeviceRequest.wLength>CONFIG_DESCRIPTOR_LENGTH)
ControlData.DeviceRequest.wLength=CONFIG_DESCRIPTOR_LENGTH;
//获取配置描述符+配置描述符+接口描述符+端点描述符
code_transmit((unsigned char *) & ConfigDescr,ControlData.DeviceRequest.wLength);
}
else
stall_ep0(); //没有该请求,返回STALL
}
//获取配置
void get_configuration(void)
{
unsigned char c=bEPPflags.bits.configuration;
single_transmit(&c,1);
}
//设置配置
void set_configuration(void)
{
if(ControlData.DeviceRequest.wValue==0)
{
//配置值不对,设备进入未配置状态
single_transmit(0,0); //发送响应
DISABLE;
bEPPflags.bits.configuration=0; //标记未配置
ENABLE;
init_unconfig(); //进入地址状态,禁止0除外的所有端点
}
else
if(ControlData.DeviceRequest.wValue==1)
{
//
single_transmit(0,0); //发送响应
init_unconfig(); //进入地址状态,禁止0除外的所有端点
init_config(); //配置处理,允许端点收发
DISABLE;
bEPPflags.bits.configuration=1; //标记配置
ENABLE;
}
else
stall_ep0(); //没有该请求,返回STALL
}
//获取接口信息
void get_interface(void)
{
unsigned char txdat =0; //本设备只有一个接口
single_transmit(&txdat,1);
}
//设置接口
void set_interface(void)
{
if(ControlData.DeviceRequest.wValue==0 && ControlData.DeviceRequest.wIndex==0 )
single_transmit(0,0); //发送响应
else
stall_ep0(); //没有该请求,返回STALL
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -