⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 standard.c

📁 AT91SAM9261的USB设备驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
        default:
        //------

            USB_Stall(pClass->pUsb, 0);

        }
        break;

    //-------------------
    case USB_SET_ADDRESS:
    //-------------------
        USB_SendZLP0(pClass->pUsb,
                     (Callback_f) USB_SetAddress,
                     (void *) pClass->pUsb);
        break;

    //-------------------------
    case USB_SET_CONFIGURATION:
    //-------------------------
        STD_SetConfiguration(pClass, (char) pSetup->wValue);
        break;

    //-------------------------
    case USB_GET_CONFIGURATION:
    //-------------------------
        STD_GetConfiguration(pClass);
        break;

    //---------------------
    case USB_CLEAR_FEATURE:
    //---------------------

        switch (pSetup->wValue) {
            //---------------------
            case USB_ENDPOINT_HALT:
            //---------------------
                USB_Halt(pClass->pUsb, LBYTE(pSetup->wIndex), USB_CLEAR_FEATURE);
                USB_SendZLP0(pClass->pUsb, 0, 0);
                break;

            //----------------------------
            case USB_DEVICE_REMOTE_WAKEUP:
            //----------------------------
                pClass->wDeviceStatus &= ~REMOTE_WAKEUP; // Remote wakeup disabled
                USB_SendZLP0(pClass->pUsb, 0, 0);
                break;

            //------
            default:
            //------
                USB_Stall(pClass->pUsb, 0);

        }
        break;

    //------------------
    case USB_GET_STATUS:
    //------------------

        switch (USB_REQUEST_RECIPIENT(pSetup)) {
        //-------------------------
        case USB_RECIPIENT_DEVICE:
        //-------------------------
            STD_GetDeviceStatus(pClass);
            break;

        //---------------------------
        case USB_RECIPIENT_ENDPOINT:
        //---------------------------
            STD_GetEndpointStatus(pClass,
                                  LBYTE(pSetup->wIndex));
            break;

        //------
        default:
        //------

            USB_Stall(pClass->pUsb, 0);

        }
        break;

    //-------------------
    case USB_SET_FEATURE:
    //-------------------

        switch (pSetup->wValue) {
        //---------------------
        case USB_ENDPOINT_HALT:
        //---------------------
            USB_Halt(pClass->pUsb, LBYTE(pSetup->wIndex), USB_SET_FEATURE);
            USB_SendZLP0(pClass->pUsb, 0, 0);
            break;

        //----------------------------
        case USB_DEVICE_REMOTE_WAKEUP:
        //----------------------------
            pClass->wDeviceStatus |= REMOTE_WAKEUP; // Remote wakeup enabled
            USB_SendZLP0(pClass->pUsb, 0, 0);
            break;

        //------
        default:
        //------

            USB_Stall(pClass->pUsb, 0);

        }
        break;

    //------
    default:
    //------

        USB_Stall(pClass->pUsb, 0);
    }
}
static char DataParseInSetup[16];
static char IN_BUFFER[PACKET_LENGTH];
static volatile int IN_BUFFER_LENGTH;
static char OUT_BUFFER[PACKET_LENGTH];
static volatile int OUT_BUFFER_LENGTH;


void FINISHED_WRITE(int p1,int p2,int p3,int p4)
{
	OUT_BUFFER_LENGTH=0;
}
void FINISHED_READ()
{
	IN_BUFFER_LENGTH=PACKET_LENGTH;
}

/*void dataPraseInSetup(S_std_class * p1,int p2,int p3,int p4)//接收到了一个Register命令数据
{
	int high,low,all;
	if(DataParseInSetup[5]==0x81)//读
	{
		if(OUT_BUFFER_LENGTH==0)
		{
			USB_Stall(p1->pUsb, 0);
			return;
		}
		
		high =DataParseInSetup[4];
		low = DataParseInSetup[3];
		all=(high*256)+low;
		USB_Write(p1->pUsb,2,OUT_BUFFER,all,(Callback_f)FINISHED_WRITE,0);			
		USB_SendZLP0(p1->pUsb, 0, 0);
		
		
	}

	else if(DataParseInSetup[5]==0x80)//写
	{
		if(IN_BUFFER_LENGTH!=0)
		{
			USB_Stall(p1->pUsb, 0);
			return;
		}
		high = DataParseInSetup[4];
		low = DataParseInSetup[3];
		all=(high*256)+low;
					
		USB_SendZLP0(((S_std_class *)p1)->pUsb, 0, 0);
		USB_Read(p1->pUsb,1,IN_BUFFER,all,(Callback_f)FINISHED_READ,0);
	}
}*/

extern void MY_REQUEST_HANDLE(S_std_class *pClass)
{
    S_usb_request *pSetup = USB_GetSetup(pClass->pUsb);
    unsigned char type=pSetup->bmRequestType & 0x60;
    if(type==0x40)//自定义请求
	{
		/*if(pSetup->wIndex==0x0471||pSetup->wIndex==0x0472)
		{
			USB_Read(pClass->pUsb,0,DataParseInSetup,pSetup->wLength,(Callback_f)dataPraseInSetup,pClass);
			USB_SendZLP0(pClass->pUsb, 0, 0);
		}*/
		if(pSetup->wIndex==0x0471)
		{
			if(IN_BUFFER_LENGTH!=0)
			{
				USB_Stall(pClass->pUsb, 0);
				return;
			}
			USB_SendZLP0(((S_std_class *)pClass)->pUsb, 0, 0);
			USB_Read(pClass->pUsb,1,IN_BUFFER,PACKET_LENGTH,(Callback_f)FINISHED_READ,0);
		}
		else if(pSetup->wIndex==0x0472)
		{
			if(OUT_BUFFER_LENGTH==0)
			{
				USB_Stall(pClass->pUsb, 0);
				return;
			}
			USB_Write(pClass->pUsb,2,OUT_BUFFER,PACKET_LENGTH,(Callback_f)FINISHED_WRITE,0);			
			USB_SendZLP0(pClass->pUsb, 0, 0);
		}
		else if(pSetup->wIndex==0x0474)
		{
			int m=PACKET_LENGTH;
			USB_Write(pClass->pUsb,0,&m,sizeof(m),0,0);
		}
		else if(pSetup->wIndex==0x0476)
		{
			int m=PACKET_LENGTH;
			USB_Write(pClass->pUsb,0,&m,sizeof(m),0,0);
		}
		//else if(pSetup->w)
		else
		{
			USB_Stall(pClass->pUsb, 0);
		}
	}
	else if(type==0)
	{
		STD_RequestHandler(pClass);
	}
	else USB_Stall(pClass->pUsb, 0);
}

void iniBuf()
{
	IN_BUFFER_LENGTH=0;
	OUT_BUFFER_LENGTH=0;
}

//读USB数据,返回值为实际读取长度
int ReadUSB(char* buf,int length)
{
	int i;
	if(IN_BUFFER_LENGTH==0)
		return 0;
    //for(i=0;i<PACKET_LENGTH;i++)
    //{
    //	buf[i]=IN_BUFFER[i];
    //}
    memcpy(buf,IN_BUFFER,PACKET_LENGTH);
    IN_BUFFER_LENGTH=0;
    return PACKET_LENGTH;			
}

int WriteUSB(char* buf,int length)
{
	int cnt;
	
	if(OUT_BUFFER_LENGTH>0)
		return 0;
	
	//for(cnt=0;cnt<length;cnt++)
	//{
	//	OUT_BUFFER[cnt]=buf[cnt];
	//}
	memcpy(OUT_BUFFER,buf,length);
	OUT_BUFFER_LENGTH=length;
	//USB_Write(p1->pUsb,2,OUT_BUFFER,PACKET_LENGTH,(Callback_f)FINISHED_WRITE,0);

	return 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -