📄 d12int.c
字号:
#include "DataType.h"
#include "D12Def.h"
#include "UsbDesc.h"
#include "ctrl_set.h"
#include "console.h"
static U8 usb_remote_wake;
static U8 usb_config;
static U8 UsbSendDescF;
//static U8 UsbSendDataF;
static int send_remain;
static U32 send_ptr;
U8 Buf[80];
unsigned char counter;
void Delay(U32 Time);
U8 UsbInit()
{
unsigned char i;
UsbSendDescF = 0;
counter=0;
for(i=0;i<80;i++)
Buf[i]=i;
if(D12RdChipId()!=0x1210 )
return STATUS_ERR;
D12SetDma(MyD12DmaCfg);
if(D12GetDma()!=MyD12DmaCfg)
return STATUS_ERR;
D12SetMode(MyD12EpCfgOff, D12Pll24M);
Delay(20000);
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
#define Ep2PacketSize 64
#define EndpCnt 2
#define UsbTotalCfgDescSize UsbCfgDescSize+UsbItfDescSize+EndpCnt*UsbEndpDescSize
static __packed struct{
UsbDevDesc DevDesc;
U8 CfgDesc[9];
U8 ItfDesc[9];
U8 Endp4Desc[7];
U8 Endp5Desc[7];
}ThisDevDesc =
{
{
UsbDevDescSize,
UsbDevDescType,
0x110,
0, 0, 0,
Ep0PacketSize,
0x471,
0x222,
0x113,
0, 0, 0,
1
},
{
UsbCfgDescSize,
UsbCfgDescType,
UsbTotalCfgDescSize, 0,
1,
1,
0,
0x80,
0x32
},
{
UsbItfDescSize,
UsbItfDescType,
0,
0,
EndpCnt,
UsbClassMassStorage,
UsbSubClassUfi,
UsbProtocolBulk,
0
},
{
UsbEndpDescSize,
UsbEndpDescType,
0x82,
UsbEndpBulk,
Ep2PacketSize,
0,
0
},
{
UsbEndpDescSize,
UsbEndpDescType,
0x2,
UsbEndpBulk,
Ep2PacketSize,
0,
0
}
};
/****************** 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?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);
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);
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);
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); //向主机返回一个长度为0的空数据包,表示设备已设置完地址.
return STATUS_OK;
}
void UsbSendDesc()
{
U8 i;
UsbSendDescF = send_remain>=Ep0PacketSize;//D12端口0缓冲区最大为16字节,端口1缓冲区最大为16字节,端口2缓冲最大64字节
D12WrEp(1, (U8 *)send_ptr, (send_remain>Ep0PacketSize)?Ep0PacketSize:send_remain); //向端点写入16字节的设备描述符
putch('@');
for(i=0; i<((send_remain>Ep0PacketSize)?Ep0PacketSize:send_remain); i++)
uart_printf("%x,", *(U8 *)(send_ptr+i));
send_remain -= Ep0PacketSize; //未发送的字节数
send_ptr += Ep0PacketSize; //指针指向未发送的描述符地址
}
void UsbSendData()
{
// UsbSendDataF = send_remain>=Ep2PacketSize;字节
D12WrEp(5, (U8 *)send_ptr, (send_remain>Ep2PacketSize)?Ep2PacketSize:send_remain);
send_remain -= Ep2PacketSize; //未发送的字节数
send_ptr += Ep2PacketSize; //指针指向未发送的描述符地址
}
U8 UsbGetDescriptor(U8 *SetupPkt)
//将设备描述符发送给主机
{
if(SetupPkt[0]!=0x80)
return STATUS_ERR;
switch (SetupPkt[3])
{
case UsbDevDescType: //设备描述符
send_ptr = (U32)&ThisDevDesc; //将设备描述符指针传递给send_ptr
send_remain = UsbDevDescSize; //设备描述符长度,18字节
break;
case UsbCfgDescType: //配置描述符
send_ptr = (U32)&ThisDevDesc.CfgDesc;
send_remain = UsbTotalCfgDescSize;
break;
case UsbStrDescType: //字符串描述符
return STATUS_ERR;
default:
return STATUS_ERR;
}
if(!SetupPkt[7]&&(SetupPkt[6]<send_remain))
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)
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
};
/********************** D12 interrupt process ******************/
void D12Ep0IntProc()
{
U8 SetupPkt[8];
U8 i;
UsbSendDescF = 0;
D12RdLastTrStat(0); //读最后处理状态寄存器
if(D12Cmd&0x20) //最后成功接收的信息包是SETUP包
if(D12RdEp(0, SetupPkt, 8)==8) //读取主机向设备发送的SETUP包,
{
D12AckEp(0); //选择端点0 OUT,应答SETUP包
D12AckEp(1); //选择端点0 IN, 应答SETUP包
counter++;
putch('\n');
uart_printf("It is the %d times Ep0IntProcess\n", counter);
for(i=0; i<8; i++)
uart_printf("%x,", SetupPkt[i]);
if(!StdDevReq[SetupPkt[1]&0xf](SetupPkt)); // 执行相应的请求
return;
}
D12SetEpStat(0, D12EpStall); //出现异常,初始化端口0 OUT.
D12SetEpStat(1, D12EpStall); //出现异常,初始化端口0 IN.
}
void D12Ep1IntProc()
{
U8 i;
i = D12RdLastTrStat(1);
if(UsbSendDescF)
{
putch('\n');
uart_printf("It is D12Ep1IntProcess followed the %d times Ep0IntProcess\n", counter);
UsbSendDesc();
}
}
void D12Ep2IntProc()
{
D12SetEpStat(2, D12EpStall);
}
void D12Ep3IntProc()
{
D12SetEpStat(3, D12EpStall);
}
void D12Ep4IntProc()
{
U8 size;
U8 Ep2OutBuf[Ep2PacketSize];
U8 i;
D12RdLastTrStat(4);
size = D12RdEp(4, Ep2OutBuf, Ep2PacketSize);
for(i=0; i<size; i++)
uart_printf("%x,", Ep2OutBuf[i]);
send_remain=80;
send_ptr=(U32)&Buf;
UsbSendData();//通过USB发送数据
}
void D12Ep5IntProc()
{
U8 i;
i = D12RdLastTrStat(5);
uart_puts("It is D12Ep5IntProcess\n");
send_remain=80;
send_ptr=(U32)&Buf;
UsbSendData();//通过USB发送数据
}
void D12BusRstProc()
{
}
void D12SuspChgProc()
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -