📄 d12int.h
字号:
#include "D12Def.h"
#include "UsbDesc.h"
#include "..\MassStorage\UFI.h"
///////////////////////
#include "..\INC\KeyLed.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;
U8 UsbInit()
{
UsbSendDescF = 0;
if(D12RdChipId()!=0x1210 ){
return STATUS_ERR;
}
D12SetDma(MyD12DmaCfg);
if(D12GetDma()!=MyD12DmaCfg){
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 REPORT_DESC_SIZE 58
#define HID_DESC_SIZE 9
#define Ep0PacketSize 16 //Ep0一次最大可发送16字节
#define Ep2PacketSize 64 //Ep2一次最大可发送64字节
#define EndpCnt 2//////////////
#define UsbTotalCfgDescSize UsbCfgDescSize+UsbItfDescSize+EndpCnt*UsbEndpDescSize
static __packed struct{
UsbDevDesc DevDesc;
U8 CfgDesc[9];
U8 ItfDesc[9];
U8 EndpDesc1[7];
U8 EndpDesc2[7];
}ThisDevDesc =
{
{ //设备描述符
UsbDevDescSize,
UsbDevDescType,
0x0110, //bcdUSB(USB版本号)**************
0, 0, 0, //bDeviceClass,bDeviceSubClass,bDeviceProtocol
Ep0PacketSize, //*****************
0x811, //idVendor
0x707, //idProduct
0x113, //bcdDevice(设备出场编号)
0, 0, 0, //iMannufacture,iProduct,iSerialNumber,
1 //bNumConfiguration
},
{ //配置描述符
0x09, /* length of descriptor (9 bytes) */
0x02, /* descriptor type (CONFIGURATION) */
UsbTotalCfgDescSize,0,/*!!!及其注意此项战两个字节!!!*/
0x01, /* number of interfaces to configure (1) */
0x01, /* configuration value (1) */
0x00, /* configuration string index (4) */
0x80, /* configuration attributes (bus powered, remote wakeup) */
0x64 /* maximum power (set at 100, change this value for your specific optics)*/
},
{ //接口描述符
0x09, /* length of descriptor (9 bytes) */
0x04, /* descriptor type (INTERFACE) */
0x00, /* interface number (0) */
0x02, /* alternate setting (0) */
0x02, /*********端点数**********/
0x08, /********* Mass Storage 类 *********/
0x06, /* SCSI(6)/UFI(4) 命令集 */
0x50, /********* Bulk Only 传输协议 ********/
0x00 /* interface string index (not supported) */
},
{ //端点描述符
0x07, /* descriptor length (7 bytes) */
0x05, /* descriptor type (ENDPOINT) */
0x02, /* endpoint address (IN endpoint, endpoint 1) */
0x02, /* Bulk 端点 */
64, 0x00, /* maximum packet size (4 bytes) */
0x00 /* polling interval (10ms) */
},
{ //端点描述符
0x07, /* descriptor length (7 bytes) */
0x05, /* descriptor type (ENDPOINT) */
0x82, /* endpoint address (IN endpoint, endpoint 1) */
0x02, /* Bulk 端点 */
64, 0x00, /* maximum packet size (4 bytes) */
0x00 /* polling interval (10ms) */
},
};
/****************** 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||SetupPkt[0]==0x81))
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 34:
//send_ptr = (U32)&ThisDevDesc.ReportDesc;//获取报告描述符
//send_remain = REPORT_DESC_SIZE;*/
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特定类命令请求****************************/
/***************************************************************/
/********************** D12 interrupt process ******************/
void D12Ep0IntProc()
{
U8 size,SetupPkt[8];
UsbSendDescF = 0;
//Uart_SendString("\nEp0");
D12RdLastTrStat(0); //读最后处理状态寄存器
if(D12Cmd&0x20){ //为何不能用 !! D12Dat !! ????
size=D12RdEp(0, SetupPkt, 64); //表示最后成功接收的信息包有一个SETUP 标志
if(size==8)
{
D12AckEp(0);
D12AckEp(1);
// Uart_Printf("\nbRequestType",SetupPkt[0]);
// Uart_Printf("bRequest",SetupPkt[1]);
if(SetupPkt[0]==0xa1){ //获取最大逻辑单元号
SetupPkt[0]=1;
D12WrEp(1, SetupPkt, 1);
}else{
if(!StdDevReq[SetupPkt[1]&0xf](SetupPkt));//函数分支处理技巧
return; //返回值为0,成功处理,若为1,则出错!
}
}else{
D12AckEp(0);
D12AckEp(1);
}
}
}
void D12Ep1IntProc()//Ep1控制输入,最大信息包规格16字节
{
U8 i;
i = D12RdLastTrStat(1);
if(UsbSendDescF){ //信息描述大于16字节,需再发一次
UsbSendDesc();
}else{
D12WrEp(1, &i, 0);//!!!极其关键,控制传输的状态信息步确认传输!!!
}
}
/*******************************************************************************/
/*******************************************************************************/
void D12Ep5IntProc()//Bulk In Pipe 0x82
{
BulkIn();//注意函数执行顺序
}
void D12Ep4IntProc()//Bulk Out Pipe 0x02
{
BulkOut();
//D12AckEp(0);
//D12AckEp(1);
}
/*******************************************************************************/
/*******************************************************************************/
void D12Ep2IntProc()
{
Uart_SendString("ep2");
//BulkOut();
}
void D12Ep3IntProc()
{
Uart_SendString("Ep3");
}
void D12BusRstProc()
{
}
void D12SuspChgProc()
{
}
/*******************************************************************************/
/*******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -