📄 dobotmsclass.c
字号:
EP0_IER_ENABLE
/* mask EP0i_TR interrupt */
CTRL_IN_REG_SET
PutPacket(&EpInfo[1],&BufPtr[0]);
}
else if (EpInfo[0].PresentState == TRANS_OUT)
{
EP0_IER_ENABLE
/* enable EP0i_TR interrupt */
CTRL_OUT_REG_SET
}
else {
// set EP0 interrupt enable register disable
EP0_IER_DISABLE
// set EP0 STALL
STALL_REGISTER |= EpInfo[epInfoNumberLVar].stallEnable;
}
GET_INTERRUPT_ENABLE
}
/***************************************************************************
Function Name :ActControlInOut(unsigned long ,unsigned char,unsigned char )
Working :Select Control transfer Stage
Return Value :void
***************************************************************************/
void ActControlInOut(unsigned long interruptBitStreamLVar ,unsigned char epInfoNumberLVar ,unsigned char dataBuffNumberLVar)
{
if (EpInfo[0].PresentState == TRANS_OUT) {
epInfoNumberLVar++;
ActControlOut(interruptBitStreamLVar,epInfoNumberLVar);
}
else {
ActControlIn(interruptBitStreamLVar,epInfoNumberLVar);
}
}
/***************************************************************************
Function Name :ActControlIn(unsigned long ,unsigned char )
Working :Executing Control transfer Data Stage and Status Stage
:in case Data Stage direction is IN
Return Value :void
***************************************************************************/
void ActControlIn(unsigned long interruptBitStreamLVar ,unsigned char epInfoNumberLVar)
{
//SCI_Str("\r\nACI");
/*------------------- end of status stage -----------------------------*/
if ((interruptBitStreamLVar & EP0_O_ACK_BITS) == EP0_O_ACK_BITS)
{ /* EP0o_TS (completed receive) */
/* clear EP0 interrupt flag except for SETUP */
CTRL_IN_OTSF_CLEAR
EpInfo[0].PresentState = WAIT;
/* set read_finish flag */
READ_TRIGER_REGISTER = EpInfo[epInfoNumberLVar].getFinish;
/* completed Control transfer */
}
/*-------------- transition state (from data to status) ---------*/
else
{ /* EP0i_TS(completed transfer) */
/* clear EP0i_TS interrupt flag */
CTRL_ITSF_CLEAR
CTRL_IN_OTSF_CLEAR
PutPacket(&EpInfo[epInfoNumberLVar],&BufPtr[0]);
}
}
/***************************************************************************
Function Name :ActControlOut(unsigned long ,unsigned char )
Working :Executing Control transfer Data Stage and Status Stage
:in case Data Stage direction is OUT
Return Value :void
***************************************************************************/
void ActControlOut(unsigned long interruptBitStreamLVar ,unsigned char epInfoNumberLVar)
{
enum SetCompleteType setcomplete;
/*------------------ data stage --------------------------------*/
if ((interruptBitStreamLVar & EP0_O_ACK_BITS) == EP0_O_ACK_BITS) { /* EP0o_TS (completed receive) */
/* clear EP0o_TS interrupt flag */
CTRL_OTSF_CLEAR
GetPacket(&EpInfo[epInfoNumberLVar],&BufPtr[0]);
}
/*-------------- transition state (from data to status) ---------*/
else if ((interruptBitStreamLVar & EP0_I_NACK_BITS) == EP0_I_NACK_BITS) { /* EP0i_TR(transfer request) */
/* clear EP0i_TR interrupt flag */
CTRL_ITRF_CLEAR
/* handling Data Stage transfered data */
setcomplete = INCOMPLETE;
setcomplete = SetControlOutContents(&transStageGPtr,&BufPtr[0]);
if (setcomplete != INCOMPLETE) {
/* enable taranfer packet data in FIFO after completed Data Stage */
WRITE_TRIGER_REGISTER = EpInfo[epInfoNumberLVar].putEnable;
}
else {
error();
}
}
/*------------------ end of status stage -------------------------*/
else { /* EP0i_TS(completed transfer) */
/* clear EP0i_TS interrupt flag */
CTRL_ITSF_CLEAR
EpInfo[0].PresentState = WAIT;
/* completed Control transfer */
}
}
// original from "dorequest.c"
/***************************************************************************
Function Name :DecStandardCommands(void)
Working :Executing Standard Setup Commands
Return Value :void
***************************************************************************/
void DecStandardCommands(void)
{
BufPtr[0].sPtr = deviceDiscriptorGVar[0].d_data;
BufPtr[0].ePtr = BufPtr[0].sPtr + (unsigned short)ConvReflexn(&ep0PacketGVar.access1Type.wLength_B1,2);
switch(ep0PacketGVar.access1Type.bmRequest) {
/* What is command type & recipient ? */
case 0x80:
/* Trans.In , Standard, Device */
if(ep0PacketGVar.access1Type.bRequest == 6) {
/* Get Descriptor */
if (ep0PacketGVar.access0Type.wValue == 0x0001) {
/* Device Descriptor */
BufPtr[0].sPtr = deviceDiscriptorGVar[0].d_data;
BufPtr[0].ePtr = BufPtr[0].sPtr + (unsigned short)ConvReflexn(&ep0PacketGVar.access1Type.wLength_B1,2);
if (ep0PacketGVar.access1Type.wLength_B1 > deviceDiscriptorGVar[0].length)
BufPtr[0].ePtr = BufPtr[0].sPtr + deviceDiscriptorGVar[0].length;
}
else if (ep0PacketGVar.access0Type.wValue == 0x0002) {
/* Configuration Descriptor */
BufPtr[0].sPtr = configurationDiscriptorGVar[0].d_data;
BufPtr[0].ePtr = BufPtr[0].sPtr + (unsigned short)ConvReflexn(&ep0PacketGVar.access1Type.wLength_B1,2);
if ((((unsigned short)ep0PacketGVar.access1Type.wLength_B2)<<8 | (unsigned short)ep0PacketGVar.access1Type.wLength_B1) > configurationDiscriptorGVar[0].length)
BufPtr[0].ePtr = BufPtr[0].sPtr + configurationDiscriptorGVar[0].length;
}
else if ((ep0PacketGVar.access0Type.wValue & 0x00FF) == 0x0003) {
/* String Descriptor */
BufPtr[0].sPtr = stringDiscriptorGVar[ep0PacketGVar.access1Type.wValue_B1].d_data;
// get discriptor length (i.e. send discriptor length only)
BufPtr[0].ePtr = BufPtr[0].sPtr + stringDiscriptorGVar[ep0PacketGVar.access1Type.wValue_B1].length; // only 4 byte for String Descriptor Zero
}
else {
EpInfo[0].PresentState = STALL;
}
}
else {
EpInfo[0].PresentState = STALL;
}
break;
case 0x00:
/* standard commands, Trans.Out, Standard, Device */
if(ep0PacketGVar.access1Type.bRequest == 7)
{ /* Set Descriptor */
/* set write pointers */
BufPtr[0].sPtr = &controlBeginGVar[0];
BufPtr[0].ePtr = &controlBeginGVar[0] + (unsigned short)ConvReflexn(&ep0PacketGVar.access1Type.wLength_B1,2);
if (BufPtr[0].ePtr > &controlBeginGVar[CONTROL_DATA_AREA]){
BufPtr[0].ePtr = &controlBeginGVar[CONTROL_DATA_AREA];
}
/* set Descriptors data area */
if (ep0PacketGVar.access0Type.wValue == 0x0001) {
/* Device Descriptor */
transStageGPtr.beginPtr = deviceDiscriptorGVar[0].d_data;
transStageGPtr.endPtr = (unsigned char*)((deviceDiscriptorGVar[0].d_data) + (deviceDiscriptorGVar[0].length));
}
else if(ep0PacketGVar.access0Type.wValue == 0x0002) {
/* Configuration Descriptor */
transStageGPtr.beginPtr = configurationDiscriptorGVar[0].d_data;
transStageGPtr.endPtr = (unsigned char*)((configurationDiscriptorGVar[0].d_data) + (configurationDiscriptorGVar[0].length));
}
else if((ep0PacketGVar.access0Type.wValue & 0x00FF) == 0x0003) {
/* String Descriptor */
transStageGPtr.beginPtr = stringDiscriptorGVar[ep0PacketGVar.access1Type.wValue_B1].d_data;
transStageGPtr.endPtr = (unsigned char*)(stringDiscriptorGVar[ep0PacketGVar.access1Type.wValue_B1].d_data + stringDiscriptorGVar[ep0PacketGVar.access1Type.wValue_B1].length);
}
else {
EpInfo[0].PresentState = STALL;
}
}
else
{
EpInfo[0].PresentState = STALL;
}
break;
/* class commands */
/* These case are class commands. */
case 0x20: /* 0010 0000 */
case 0x21: /* 0010 0001 */
case 0x22: /* 0010 0010 */
case 0x23: /* 0010 0011 */
case 0xA0: /* 1010 0000 */
case 0xA1: /* 1010 0001 */
case 0xA2: /* 1010 0010 */
case 0xA3: /* 1010 0011 */
if (UNKNOWN_CTRL_COMMAND == DecBOTClassCommands()){ /* Bulk-Only Transport Mass Storage Class comannds */
EpInfo[0].PresentState = STALL;
}
break;
/* These case are vender commands. */
case 0x40: /* 0100 0000 */
case 0x41: /* 0100 0001 */
case 0x42: /* 0100 0010 */
case 0x43: /* 0100 0011 */
case 0xC0: /* 1100 0000 */
case 0xC1: /* 1100 0001 */
case 0xC2: /* 1100 0010 */
case 0xC3: /* 1100 0011 */
/* Type is Vendor. Recipient is Device. */
if (UNKNOWN_CTRL_COMMAND == DecVenderCommands()){
EpInfo[0].PresentState = STALL;
}
break;
default:
/* the other case */
EpInfo[0].PresentState = STALL;
break;
}
if (EpInfo[0].PresentState != STALL)
{
// set firmware state by Data Stage direction
if ((ep0PacketGVar.access1Type.bmRequest & 0x80) == 0x80)
{ // data transfer direction is Function to Host
EpInfo[0].PresentState = TRANS_IN;
}
else
{ // data transfer direction is Host to Function
EpInfo[0].PresentState = TRANS_OUT;
}
}
}
/***************************************************************************
Function Name :DecVenderCommands(void)
Working :Executing Vendor Commands
Return Value :enum DecControlCmdDoneType
***************************************************************************/
enum DecControlCmdDoneType DecVenderCommands(void) {
return UNKNOWN_CTRL_COMMAND;
}
/***************************************************************************
Function Name :DecBOTClassCommands(void)
Working :Executing BOT Class Commands
Return Value :enum DecControlCmdDoneType
***************************************************************************/
enum DecControlCmdDoneType DecBOTClassCommands(void)
{
enum DecControlCmdDoneType Command_Done = CTRL_COMMAND_DONE;
switch (ep0PacketGVar.access1Type.bRequest)
{
case 255:
/* Bulk-Only Mass Storage Reset */
BufPtr[0].sPtr = &controlBeginGVar[0];
BufPtr[0].ePtr = &controlBeginGVar[0];
/* clear using FIFO */
CLEAR_BULK_FIFO_OF_SOFT_RESET
/* state is set "WAIT" */
EpInfo[USE_OUT_EP].PresentState = WAIT;
/* clear stall bit */
BOT_ALL_EP_STALL_OFF
break;
case 254:
/* Get Max LUN */
controlBeginGVar[0] = 0x00;
BufPtr[0].sPtr = &controlBeginGVar[0];
BufPtr[0].ePtr = &controlBeginGVar[1];
break;
default:
/* the other case */
Command_Done = UNKNOWN_CTRL_COMMAND;
break;
}
return Command_Done;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -