📄 d12_setup._c
字号:
#include "io8515v.h"
#include "d12head.h"
#include "d12setup.h"
TRANSMIT_STRUCT XmtBuff;
int bconfig;
void Setup_control(void)
{
char i,j,*p;
D12_COMMAND = 0x00;// 选择端点0(指针指向0位置)
cwait;
D12_COMMAND = 0xf0;// 读标准控制码
cwait1;
i = D12_DATA;
cwait1;
i = D12_DATA;//长度
cwait1;
j = D12_DATA;
csram;
p = XmtBuff.b;
*(p++) = j;
for(i=0;i<7;i++)
{
j = D12_DATA;
csram;
asm("st Z+,%j");
}
D12_COMMAND = 0x01;// 选择端点 1(指针指向0位置)
cwait;
D12_COMMAND = 0xf1;// 应答SETUP包,使能(清 OUT 缓冲区、使能 IN 缓冲区)命令
csram;
i = XmtBuff.b[1];
if(XmtBuff.b[0] & 0x40)//厂商请求跳转表
{
//if (i <= 0x0f)
{
//(*VendorDeviceRequest[i])();
}
}
else
{
if (i <= 0x0B)//标准请求跳转表
{
(*StandardDeviceRequest[i])();
}
}
D12_COMMAND = 0x00;// 选择端点0(指针指向0位置)
cwait;
D12_COMMAND = 0xf1;// 应答SETUP包,使能(清 OUT 缓冲区、使能 IN 缓冲区)命令
cwait;
D12_COMMAND = 0xf2;// 清 OUT 缓冲区
}
void void_function(void)
{
D12_COMMAND = 0x40;// 0 端点停止(用于发送Stall包)
cwait;
D12_DATA = 0x01;
cwait;
D12_COMMAND = 0x41;// 1 端点停止(用于发送Stall包)
cwait;
D12_DATA = 0x01;
cwait;
D12_COMMAND = 0xf1;// 应答SETUP包,使能(清 OUT 缓冲区、使能 IN 缓冲区)命令
csram;
}
void get_status(void)
{
XmtBuff.b[1] = 0x00;
switch (XmtBuff.b[0])
{
case 0x80://返回设备状态
//发送两个字节数据:第一字节D1为1支持远程唤醒,D0为0是总线供电,其它位为0;第二字节为0。
XmtBuff.b[0] = 0x03;
break;
case 0x81://返回接口状态
//发送两个字节数据:第一字节为0;第二字节为0。
//XmtBuff.b[5] 为接口号
XmtBuff.b[0] = 0x00;
break;
case 0x82://返回端点状态
//发送两个字节数据:第一字节D0为1端点处于暂停,否则D0为0,其它位为0;第二字节为0。
//XmtBuff.b[5] D7为方向,D3~0为端点号
XmtBuff.b[0] = 0x00;
break;
}
XmtBuff.p_p=0;
XmtBuff.wrLength = 2;
XmtBuff.p = XmtBuff.b;
USB_submit();
}
void clear_feature(void)
{
char j;
switch (XmtBuff.b[0])
{
case 0x00://清设备唤醒功能
break;
case 0x01://清接口状态
break;
case 0x02://启用端点
//XmtBuff.b[5] D7为方向,D3~0为端点号
j = XmtBuff.b[5];
if(j<0x80)
{
j = 0x40+j*2;
D12_COMMAND = j;// 启用OUT端点
D12_DATA = 0x00;
csram;
}
else
{
j = (j & 0x0f);
D12_COMMAND = 0x41+j*2;// 启用IN端点
D12_DATA = 0x00;
csram;
}
break;
}
XmtBuff.wrLength = 0;
USB_submit();
}
void set_feature(void)
{
char j;
switch (XmtBuff.b[0])
{
case 0x00://设置设备唤醒功能
break;
case 0x01://设置接口状态
break;
case 0x02://停止端点
//XmtBuff.b[5] D7为方向,D3~0为端点号
j = XmtBuff.b[5];
if(j<0x80)
{
j = 0x40+j * 2;
D12_COMMAND = j;// 停止OUT端点
cwait;
D12_DATA = 0x01;
csram;
}
else
{
j = j & 0x0f;
j = 0x41+j*2;
D12_COMMAND = j;// 停止IN端点
cwait;
D12_DATA = 0x01;
csram;
}
break;
}
XmtBuff.wrLength = 0;
USB_submit();
}
void set_address(void)
{
char j;
j = 0x80 | XmtBuff.b[2];
D12_COMMAND = 0xd0;//设置新地址使能
cwait;
D12_DATA = j;
csram;
XmtBuff.wrLength = 0;
USB_submit();
}
void get_descriptor(void)
{
unsigned int i;
XmtBuff.p_p=1;
switch (XmtBuff.b[3])
{
case 0x01: //USB_DEVICE
XmtBuff.pp = device_descriptor;
XmtBuff.wrLength = sizeof(device_descriptor);
break;
case 0x02:// USB_CONFIGURATION
i = XmtBuff.b[7];
i = ((i<<8) | XmtBuff.b[6]);
XmtBuff.pp = Configuration_Descriptor;
XmtBuff.wrLength = *(XmtBuff.pp+2);
if(i<16)
XmtBuff.wrLength = XmtBuff.b[6];
break;
case 0x03: //USB_STRING
switch(XmtBuff.b[2])
{
case 0x00 :
//?XmtBuff.wrLength = sizeof(USBStringLanguageDescription);
//?XmtBuff.p = USBStringLanguageDescription;
break;
case 0x01 :
//?XmtBuff.wrLength = sizeof(USBStringDescription1);
//?XmtBuff.p = USBStringDescription1;
break;
case 0x02 :
//?XmtBuff.wrLength = sizeof(USBStringDescription2);
//?XmtBuff.p = USBStringDescription2;
break;
default :
void_function();
return;
}
break;
default :
void_function();
return;
}
USB_submit();
}
void get_configuration(void)
{
XmtBuff.b[0] = 1;//返回是否被配置(非 0 为配置)
XmtBuff.wrLength = 16;
XmtBuff.p_p=0;
XmtBuff.p = XmtBuff.b;
USB_submit();
///D12_COMMAND = 0x05;
///cwait;
///D12_COMMAND = 0xfa;// 设置 IN 缓冲区有效(满标志)
}
void set_configuration(void)
{
char j;
int u;
if (XmtBuff.b[0] == 0x00)
{
XmtBuff.wrLength = 0;
USB_submit();
j = XmtBuff.b[2];
D12_COMMAND = 0xd8;
if(j == 0x00)
{
D12_DATA = 0x00; // 停止普通/同步端点
}else if(j == 0x01)
{
D12_DATA = 0x01; // 使能普通/同步端点
cwait;
bconfig=1;
D12_COMMAND=0x05;
D12_COMMAND=0xf0;
D12_DATA=0;
D12_DATA=64;
for( u=0;u<64;u++)
D12_DATA=u;
D12_COMMAND=0xfa;
//D12_COMMAND = 0x05;
//cwait;
//D12_COMMAND = 0xfa;// 设置 IN 缓冲区有效(满标志)
}
csram;
}
else
void_function();
}
void get_interface(void)
{
XmtBuff.b[0] = 0;
XmtBuff.wrLength = 1;
XmtBuff.p_p=0;
XmtBuff.p = XmtBuff.b;
USB_submit();
}
void set_interface(void)
{
XmtBuff.wrLength = 0;
USB_submit();
}
void USB_submit(void)
{
char i,j,k;
if(16>XmtBuff.wrLength)
{
j = XmtBuff.wrLength;
}else
{
j = 16;
}
D12_COMMAND = 1;// 选择 IN 端点(指针指向0位置)
cwait;
D12_COMMAND = 0xf0;// 写缓冲区
cwait;
D12_DATA = 0x00;
cwait;
D12_DATA = j;
csram;
if(XmtBuff.p_p)
{
for(i=0;i<j ;i++)
{
k = *(XmtBuff.pp+i);
D12_DATA = k;
csram;
}
XmtBuff.pp += j;
}else
{
for(i=0;i<j;i++)
{
k = *(XmtBuff.p++);
D12_DATA = k;
csram;
}
}
XmtBuff.wrLength -= j;
D12_COMMAND = 0xfa;// 设置 IN 缓冲区有效(满标志)
csram;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -