📄 复件 d12int.h
字号:
#include "D12Def.h"
#include "UsbDesc.h"
#include "Terminal.h"
#define STATUS_ERR 1
#define STATUS_OK 0
static U8 usb_remote_wake;
static U8 usb_config;
static U8 UsbSendDescF;
static int send_remain;
static U32 send_ptr;
//void Delay(U32 Time);
U8 UsbInit()
{
UsbSendDescF = 0;
if(D12RdChipId()!=0x1210 ){
return STATUS_ERR;
}
D12SetDma(MyD12DmaCfg);
if(D12GetDma()!=MyD12DmaCfg){
Tmn_StatusPrintStr("ERROR in D12Int!");
return STATUS_ERR;
}
D12SetMode(MyD12EpCfgOff, D12Pll24M);
UDelay(100);/********!!!!!!!!!!!!!!!!!!!!!!*********/
D12SetMode(MyD12EpCfgOn, D12Pll24M);
return STATUS_OK;
}
///////////////////////////////
#define UsbDevDescType 1
#define UsbCfgDescType 2
#define UsbStrDescType 3
#define UsbItfDescType 4
#define UsbEndpDescType 5
#define UsbPwrDescType 6
#define UsbDevDescSize 18
#define UsbCfgDescSize 9
#define UsbItfDescSize 9
#define UsbEndpDescSize 7
#define UsbEndpControl 0
#define UsbEndpIsochronous 1
#define UsbEndpBulk 2
#define UsbEndpInterrupt 3
////////////////////////////////////////
#define UsbClassMassStorage 8
#define UsbSubClassRbc 1
#define UsbSubClassSff8020i 2
#define UsbSubClassQic157 3
#define UsbSubClassUfi 4
#define UsbSubClassSff8070i 5
#define UsbSubClassScsi 6
#define UsbProtocolCbi0 0
#define UsbProtocolCbi1 1
#define UsbProtocolBulk 0x50
////////////////////////////////////////
#define Ep0PacketSize 16 //Ep0一次最大可发送16字节
#define Ep2PacketSize 64 //Ep2一次最大可发送64字节
#define EndpCnt 4
#define UsbTotalCfgDescSize UsbCfgDescSize+UsbItfDescSize+EndpCnt*UsbEndpDescSize
static __packed struct{
UsbDevDesc DevDesc;
U8 CfgDesc[9];
U8 ItfDesc[9];
U8 EndpDesc[7];
U8 HIDDesc[9];
U8 ReportDesc[50];
}ThisDevDesc =
{
{ //设备描述符
UsbDevDescSize,
UsbDevDescType,
0x0100, //bcdUSB(USB版本号)**************
0, 0, 0, //bDeviceClass,bDeviceSubClass,bDeviceProtocol
Ep0PacketSize,//*****************
0x471, //idVendor
0x222, //idProduct
0x113, //bcdDevice(设备出场编号)
1, 0, 2, //iMannufacture,iProduct,iSerialNumber,
1 //bNumConfiguration
},
{ //配置描述符
UsbCfgDescSize,
UsbCfgDescType,
0x22, 0,//wTotalLength
1, //bNumInterface
1, //bConfigurationValue
4, //iConfiguration
0x80, //bmAttributes(供电模式选择) |7| |6| |5| |4 0|
0x32 //MaxPower /*保留恒为一 自供电 远程唤醒 无意义恒为零*/
},
{ //接口描述符
UsbItfDescSize,
UsbItfDescType,
0, //bInterfaceNumber(该接口编号)
0, //bAlternateSetting(备用的接口描述符编号)
1, //EndpCnt=2, bNumEndpoints(不包括端点0)
3,//bInterfaceClass
1, //bInterfaceSubClass
2,//bInterfaceProtocol
5 //iInterface
},
{ //端点描述符
UsbEndpDescSize,
UsbEndpDescType,// |7| |654| |3 0|
0x81, //bEndpointAdrress 方向(1 OUT) 保留为0 端口号
3, //bmAttributes |7..2| |10|
Ep2PacketSize,0,//wMaxPacketSize 保留 00控制传输,01同步传输,10批量传输,11中断传输
0x0a //bInterval 中断端点-轮询间隔,同步端点-固定为1,批量控制端点忽略该字段
},
{
9,0x21,0,1,0,
1,0x22,50,0
},
{
5,1,9,2,0xa1,1,9,1,
0xa1,0,5,9,0x19,1,0x29,3,
0x15,0,0x25,1,0x95,3,0x75,1,
0x81,2,0x95,1,0x75,5,0x81,1,
5,1,9,0x30, 9,0x31,0x15,0x81,
0x25,0x7f,0x75,8,
0x95,2,0x81,6,0xc0,0xc0,
}
};
/****************** standard device request ****************/
U8 UsbGetStatus(U8 *SetupPkt)
{
if(SetupPkt[2]|SetupPkt[3]|SetupPkt[5]|SetupPkt[7])
return 1;
if(SetupPkt[6]!=2)
return 1;
if(SetupPkt[0]==0x80)
{
if(SetupPkt[4])
return 1;
SetupPkt[0] = usb_remote_wake?2:1;//猜想1:0是措的;
SetupPkt[1] = 0;
}
else
if(SetupPkt[0]==0x81)
{
if(SetupPkt[4])
return 1;
SetupPkt[0] = 0;
SetupPkt[1] = 0;
}
else
if(SetupPkt[0]==0x82)
{
D12SelEp((SetupPkt[4]*2)|((SetupPkt[4]&0x80)?1:0));
SetupPkt[1] = (D12Dat&2)?1:0;
SetupPkt[0] = 0;
}
else
return 1;
D12WrEp(1, SetupPkt, 2);//Ep1控制输入
return 0;
}
U8 UsbClrFeature(U8 *SetupPkt)
{
if(SetupPkt[0]&0x80)
return STATUS_ERR;
if(SetupPkt[3]|SetupPkt[5]|SetupPkt[6]|SetupPkt[7])
return STATUS_ERR;
if(SetupPkt[0]&0x1f)
{
if((SetupPkt[0]&0x1f)!=2)
return STATUS_ERR;
D12SetEpStat((SetupPkt[4]*2)|((SetupPkt[4]&0x80)?1:0),0);
}
else
{
if(SetupPkt[4])
return STATUS_ERR;
usb_remote_wake = 0;
}
D12WrEp(1, SetupPkt, 0);//清空Ep1缓冲区
return STATUS_OK;
}
U8 UsbSetFeature(U8 *SetupPkt)
{
if(!(SetupPkt[0]&0x80))
return STATUS_ERR;
if(SetupPkt[3]|SetupPkt[5]|SetupPkt[6]|SetupPkt[7])
return STATUS_ERR;
if(SetupPkt[0]&0x1f)
{
if((SetupPkt[0]&0x1f)!=2)
return STATUS_ERR;
D12SetEpStat((SetupPkt[4]*2)|((SetupPkt[4]&0x80)?1:0),1);
}
else
{
if(SetupPkt[4])
return STATUS_ERR;
usb_remote_wake = 1;
}
D12WrEp(1, SetupPkt, 0);//清空Ep1缓冲区
return STATUS_OK;
}
U8 UsbSetAddress(U8 *SetupPkt)
{
if(SetupPkt[0]|SetupPkt[3]|SetupPkt[4]|SetupPkt[5]|SetupPkt[6]|SetupPkt[7])
return STATUS_ERR;
D12SetAddr(SetupPkt[2]|0x80);//最高位为使能位
D12WrEp(1, SetupPkt, 0);
return STATUS_OK;
}
void UsbSendDesc()
{
UsbSendDescF = send_remain>=Ep0PacketSize;
D12WrEp(1, (U8 *)send_ptr, (send_remain>Ep0PacketSize)?Ep0PacketSize:send_remain);
send_remain -= Ep0PacketSize;
send_ptr += Ep0PacketSize;
}
U8 UsbGetDescriptor(U8 *SetupPkt)
{
if(SetupPkt[0]!=0x80)
return STATUS_ERR;
switch (SetupPkt[3])
{
case UsbDevDescType:
send_ptr = (U32)&ThisDevDesc;
send_remain = UsbDevDescSize;
break;
case UsbCfgDescType:
send_ptr = (U32)&ThisDevDesc.CfgDesc;
send_remain = UsbTotalCfgDescSize;
break;
case 0x22:
send_ptr = (U32)&ThisDevDesc.ReportDesc;//获取报告描述符
send_remain = 50;
break;
case UsbStrDescType:
return STATUS_ERR;
default:
return STATUS_ERR;
}
if(!SetupPkt[7]&&(SetupPkt[6]<send_remain))//当描述符大小大于WLength字段值时,只发送主机所要求的大小
send_remain = SetupPkt[6];
UsbSendDesc();
return STATUS_OK;
}
U8 UsbGetConfiguration(U8 *SetupPkt)
{
if(SetupPkt[0]!=0x80)
return STATUS_ERR;
if(SetupPkt[2]|SetupPkt[3]|SetupPkt[4]|SetupPkt[5]|SetupPkt[7])
return STATUS_ERR;
if(SetupPkt[6]!=1)
return STATUS_ERR;
SetupPkt[0] = usb_config?1:0;
D12WrEp(1, SetupPkt, 1);
return STATUS_OK;
}
U8 UsbSetConfiguration(U8 *SetupPkt)
{
if(SetupPkt[0]|SetupPkt[3]|SetupPkt[4]|SetupPkt[5]|SetupPkt[6]|SetupPkt[7])
return STATUS_ERR;
if(SetupPkt[2]&0xfe)//即wValue值只能为0或1
return STATUS_ERR;
usb_config = SetupPkt[2]&1;
D12SetEp(usb_config);
D12SetEpStat(4, usb_config^1);
D12SetEpStat(5, usb_config^1);
D12WrEp(1, SetupPkt, 0);
return STATUS_OK;
}
U8 UsbGetInterface(U8 *SetupPkt)
{
if(SetupPkt[0]!=0x81)
return STATUS_ERR;
if(SetupPkt[2]|SetupPkt[3]|SetupPkt[4]|SetupPkt[5]|SetupPkt[7])
return STATUS_ERR;
if(SetupPkt[6]!=1)
return STATUS_ERR;
SetupPkt[0] = 0;
D12WrEp(1, SetupPkt, 1);
return STATUS_OK;
}
U8 UsbSetInterface(U8 *SetupPkt)
{
return STATUS_ERR;
}
U8 UsbReserved(U8 *SetupPkt)
{
return STATUS_ERR;
}
U8 (*StdDevReq[])(U8 *SetupPkt) = {
UsbGetStatus,
UsbClrFeature,
UsbReserved,
UsbSetFeature,
UsbReserved,
UsbSetAddress,
UsbGetDescriptor,
UsbReserved,
UsbGetConfiguration,
UsbSetConfiguration,
UsbGetInterface,
UsbSetInterface,
UsbReserved,
UsbReserved,
UsbReserved,
UsbReserved
};
/******************HID特定类命令请求****************************/
U8 UsbGetReport(U8 *SetupPkt){
//if(SetupPkt[1]==1)
Tmn_StatusPrintNum(SetupPkt[1]);
Tmn_StatusPrintStr(" ClassRequest!");
return 0;
}
/***************************************************************/
/********************** D12 interrupt process ******************/
void D12Ep0IntProc()
{
U8 SetupPkt[8];
UsbSendDescF = 0;
D12RdLastTrStat(0);//读最后处理状态寄存器
if(D12Cmd&0x20) //为何不能用 !! D12Dat !! ????
//表示最后成功接收的信息包有一个SETUP 标志
if(D12RdEp(0, SetupPkt, 8)==8)
{
D12AckEp(0);
D12AckEp(1);
if(SetupPkt[1]==6)
Tmn_StatusPrintNum(SetupPkt[3]);
//if(SetupPkt[0]&0x60==0x00){
if(!StdDevReq[SetupPkt[1]&0xf](SetupPkt));//函数分支处理技巧
return; //返回值为0,成功处理,若为1,则出错!
//}else{
//UsbGetReport(SetupPkt);
//}
}
D12SetEpStat(0, D12EpStall);
D12SetEpStat(1, D12EpStall);
}
void D12Ep1IntProc()//Ep1控制输入,最大信息包规格16字节
{
U8 i;
i = D12RdLastTrStat(1);
if(UsbSendDescF) //信息描述大于16字节,需再发一次
UsbSendDesc();
}
void D12Ep2IntProc()
{
//D12SetEpStat(2, D12EpStall);
}
void D12Ep3IntProc()
{
U8 SdData[4];
SdData[0]=0x11;
SdData[1]=0x22;
SdData[2]=0x33;
SdData[3]=0x44;
D12WrEp(3, SdData, 4);
//D12SetEpStat(3, D12EpStall);
}
void D12Ep4IntProc()//Ep4普通输出,最大信息包规格64字节
{
U8 size;
U8 Ep2OutBuf[Ep2PacketSize];
D12RdLastTrStat(4);
size = D12RdEp(4, Ep2OutBuf, Ep2PacketSize);
Tmn_StatusPrintNum(Ep2OutBuf[0]);
Tmn_StatusPrintNum(Ep2OutBuf[1]);
Tmn_StatusPrintNum(Ep2OutBuf[2]);
Tmn_StatusPrintNum(Ep2OutBuf[3]);
Tmn_StatusPrintNum(Ep2OutBuf[4]);
Tmn_StatusPrintNum(Ep2OutBuf[5]);
Tmn_StatusPrintNum(Ep2OutBuf[6]);
if((size==6)&&(*(U32 *)Ep2OutBuf==0x12345678)) {
//LedSet(Ep2OutBuf[4]);
Tmn_StatusPrintStr("LedON");
//printf("%x\n", Ep2OutBuf[4]+(Ep2OutBuf[5]<<8));
}
}
void D12Ep5IntProc(){
U8 SdData[4];
SdData[0]=0x12;
SdData[1]=0x34;
SdData[2]=0x56;
SdData[3]=0x78;
D12WrEp(5, SdData, 4);
}
void D12BusRstProc()
{
}
void D12SuspChgProc()
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -