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

📄 chap_9.c

📁 次文件包括uCOS-II中使用,ZLG_FS在CF卡上的例子,ARM采用的是LPC2210.
💻 C
📖 第 1 页 / 共 2 页
字号:
	    DEVICE_ADDRESS_MASK), 1);
    Chap9sup_SingleTransmitEP0(0,0);
}


void Chap9_GetInterface(void)//0x0a
{
	tempvars4UsbReq.chars.tx0 = 0;        /* Only/Current interface = 0 */
    Chap9sup_SingleTransmitEP0(&tempvars4UsbReq.chars.tx0,1);
}


void Chap9_SetInterface(void) //0x0B
{
	if (DCPDeviceRequest.wValue == 0 && DCPDeviceRequest.wIndex == 0)
    {
        Chap9sup_SingleTransmitEP0(0,0);
    }
    else
        REQBF_StallDCPRequest = 1;
}


void Chap9_GetConfiguration(void)// 0x08
{
	tempvars4UsbReq.chars.tx0 = D12BF_Configuration;
	if (DCPDeviceRequest.wValue == 0 && DCPDeviceRequest.wIndex == 0 && DCPDeviceRequest.wLength == 1)
    {
        Chap9sup_SingleTransmitEP0(&tempvars4UsbReq.chars.tx0,1);
    }
    else
    {
        REQBF_StallDCPRequest = 1;
    }
}


void Chap9_SetConfiguration(void)//0x09
{
    if(DCPDeviceRequest.wIndex == 0 && DCPDeviceRequest.wLength == 0)
    {
	    if (DCPDeviceRequest.wValue == 0) {
		    /* put device in unconfigured state */
		    D12BF_Configuration = 0; /* This flag should be set before Unconfig and Config */
           	Hal4D12_SetEndpointEnable(0);	/* Disable all endpoints but EPP0. */
	    } else if (DCPDeviceRequest.wValue == 1) {
		    /* Configure device */
		    D12BF_Configuration = 1; /* This flag should be set before Unconfig and Config */
            Hal4D12_SetEndpointEnable(1);	/* Disable all endpoints but EPP0. */
	    } else
        {
            REQBF_StallDCPRequest = 1;
        }
    }
    else
    {
        REQBF_StallDCPRequest = 1;
    }

    if(!REQBF_StallDCPRequest)
        Chap9sup_SingleTransmitEP0(0,0);
}


void Chap9_GetStatus(void) // 0x00
{
    if(DCPDeviceRequest.wValue == 0 && DCPDeviceRequest.wLength == 2 )
    {
		switch(UsbReq_Recipient)
		{
		case USB_RECIPIENT_DEVICE:	// 设备 0x00
		    tempvars4UsbReq.chars.tx0 = DEVSTS_SELFPOWERED;   /* Self-powered*/
	        tempvars4UsbReq.chars.tx1=0;
			break;

        case USB_RECIPIENT_INTERFACE:// 接口 0x01
			tempvars4UsbReq.ints.i0=0;
			break;

        case USB_RECIPIENT_ENDPOINT:	// 0x02 端点
			tempvars4UsbReq.chars.endp = (INT8)(DCPDeviceRequest.wIndex & MAX_ENDPOINTS);
			if (REQBF_DCPRequest_EPdir)
				tempvars4UsbReq.chars.c0 = Hal4D12_SelectEndpoint((tempvars4UsbReq.chars.endp<<1)+ 1);	/* Control-in */
			else
				tempvars4UsbReq.chars.c0 = Hal4D12_SelectEndpoint(tempvars4UsbReq.chars.endp<<1);	/* Control-out */
			if(tempvars4UsbReq.chars.c0 & D12_STALL)
				tempvars4UsbReq.chars.tx0 = ENDPSTS_HALT;   /* Halt */
			else
				tempvars4UsbReq.chars.tx0 = 0;
			tempvars4UsbReq.chars.tx1 = 0;

            break;

        default:
            REQBF_StallDCPRequest = 1;
			break;
		}
	}
	else
	{
        REQBF_StallDCPRequest = 1;

	}

    if(!REQBF_StallDCPRequest)
    {
        Chap9sup_SingleTransmitEP0(&tempvars4UsbReq.chars.tx0,2);
    }
}


void Chap9_ClearFeature(void) //0x01
{
 	if( DCPDeviceRequest.wLength == 0 )
    {
		switch(UsbReq_Recipient)
		{
		case USB_RECIPIENT_DEVICE://0x00 设备
	        break;

        case USB_RECIPIENT_ENDPOINT://0x02 端点
			if(DCPDeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) //USB_FEATURE_ENDPOINT_STALL=0x0000
            {
				tempvars4UsbReq.chars.endp = (INT8)(DCPDeviceRequest.wIndex & MAX_ENDPOINTS);
                if(!D12BF_SetupOverwritten)
                {
		            if (REQBF_DCPRequest_EPdir)
                    {
					    /* clear TX stall for IN on EPn. */
					    Hal4D12_SetEndpointStatus((tempvars4UsbReq.chars.endp<<1)+1, 0);
						if(tempvars4UsbReq.chars.endp == 2)
						{
							BOTBF_StallAtBulkIn = 0;
							//if(BOTBF_StallAtBulkOut == 0)
								BOTFSMstate = USBFSM4BOT_CSW;
						}
				    }
				    else
				    {
					    /* clear RX stall for OUT on EPn. */
					    Hal4D12_SetEndpointStatus((tempvars4UsbReq.chars.endp<<1), 0);
						if(tempvars4UsbReq.chars.endp == 2)
						{
							BOTBF_StallAtBulkOut = 0;
							//if(BOTBF_StallAtBulkIn == 0)
							//	BOTFSMstate = USBFSM4BOT_IDLE;
						}
				    }
                }
			}
			else
			{
                REQBF_StallDCPRequest = 1;
			}
			break;

        default:
            REQBF_StallDCPRequest = 1;
			break;
		}
	}
	else
	{
        REQBF_StallDCPRequest = 1;
	}

    if(!REQBF_StallDCPRequest)
    {
        Chap9sup_SingleTransmitEP0(0,0);
    }
}


void Chap9_SetFeature(void)	//0x03 特性选择符
{
	if( DCPDeviceRequest.wLength == 0 )
	{
		switch(UsbReq_Recipient)
		{
		case USB_RECIPIENT_DEVICE:		// 0x00 设备
			if(DCPDeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
            {
                REQBF_StallDCPRequest = 1;
            }
			break;

        case USB_RECIPIENT_ENDPOINT:	// 0x02 端点
			if( DCPDeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
			{
				tempvars4UsbReq.chars.endp = (INT8)(DCPDeviceRequest.wIndex & MAX_ENDPOINTS);
                if(!D12BF_SetupOverwritten)
                {
		            if (REQBF_DCPRequest_EPdir)
                    {
			            /* clear TX stall for IN on EPn. */
   				        Hal4D12_SetEndpointStatus((tempvars4UsbReq.chars.endp<<1)+1, 1);
                    }
                    else
                    {
                        /* clear RX stall for OUT on EPn. */
   				        Hal4D12_SetEndpointStatus((tempvars4UsbReq.chars.endp<<1), 1);
                    }
                }
			}
			else
			{
                REQBF_StallDCPRequest = 1;
			}
			break;

        default:
            REQBF_StallDCPRequest = 1;
			break;
		}
	}
    else
	{
        REQBF_StallDCPRequest = 1;
	}

    if(!REQBF_StallDCPRequest)
        Chap9sup_SingleTransmitEP0(0,0);
}


void Chap9_GetDescriptor(void)//0x06 描述符类型和索引
{
//	tempvars4UsbReq.ints.i0 = DCPDeviceRequest.wValue; // wValue has be swapped.
    switch(DCPDeviceRequest.wValue>>8)
    {
    case USB_DEVICE_DESCRIPTOR_TYPE:
        DCPXfer_wResidue = sizeof(USB_DEVICE_DESCRIPTOR);//
	    DCPXfer_pData = (INT8  *)&DeviceDescr;		// 设备描述符号
        break;
    case USB_CONFIGURATION_DESCRIPTOR_TYPE:
        DCPXfer_wResidue = CONFIG_DESCRIPTOR_LENGTH;
	    DCPXfer_pData = (INT8  *)&ConfigDescr;		// 配置描述符
        break;
    case USB_STRING_DESCRIPTOR_TYPE:				// 0x03
        switch( tempvars4UsbReq.Descriptor.Index )
        {
        case STR_INDEX_LANGUAGE://0x00
        	DCPXfer_wResidue = sizeof(USB_STRING_LANGUAGE_DESCRIPTOR);
	        DCPXfer_pData = (INT8  *)&strLanguage;
            break;
        case STR_INDEX_MANUFACTURER://0x01 厂商描述符字符串索引
       	    DCPXfer_wResidue = sizeof(USB_STRING_MANUFACTURER_DESCRIPTOR);
	        DCPXfer_pData = (INT8  *)&strManufacturer;
            break;
        case STR_INDEX_PRODUCT://0x02  产品描述符字符串索引
           	DCPXfer_wResidue = sizeof(USB_STRING_PRODUCT_DESCRIPTOR);
	        DCPXfer_pData = (INT8  *)&strProduct;
            break;
        case STR_INDEX_SERIALNUMBER: // 设序列号字符串索引,= 03H
        	DCPXfer_wResidue = sizeof(USB_STRING_SERIALNUMBER_DESCRIPTOR);
	        DCPXfer_pData = (INT8  *)&strSerialNum;
            break;
        default:
            REQBF_StallDCPRequest = 1;
            break;
        }

        break;
    default:
        REQBF_StallDCPRequest = 1;
        break;
    }

    if(!REQBF_StallDCPRequest)
    {
        Chap9sup_BurstTransmitEP0();
    }
}




//*************************************************************************
// Chap9 support functions
//*************************************************************************

void Chap9sup_SingleTransmitEP0(INT8 * buf, INT8 len)
{
    DCPXfer_wResidue = len;
    Xfer_Space &= DCPXFERSPACE_MASK;	//	0xF0
    Xfer_Space |= DCPXFERSPACE_MCURAM;	//	0x02
    if(DCPXfer_wResidue == 0)
    {
        DCPFSMstate = USBFSM4DCP_HANDSHAKE4CO; 	//	USBFSM4DCP_HANDSHAKE4CO=0x08
    }
    else
    {
        DCPFSMstate = USBFSM4DCP_HANDSHAKE4CI;	//	USBFSM4DCP_HANDSHAKE4CI=0x10
    }
    Hal4D12_SingleTransmitEP0(buf, len);
}


void Chap9sup_BurstTransmitEP0( void )// 端定0批量传输
{
    if(DCPXfer_wResidue > DCPDeviceRequest.wLength)
        DCPXfer_wResidue = DCPDeviceRequest.wLength;

    Xfer_Space &= DCPXFERSPACE_MASK;
    Xfer_Space |= DCPXFERSPACE_MCUCODE;
	if( DCPXfer_wResidue >= EP0_PACKET_SIZE)
    {
		DCPFSMstate = USBFSM4DCP_DATAIN;
        Hal4D12_WriteEPAtCode(1, EP0_PACKET_SIZE, DCPXfer_pData);
		DCPXfer_pData += EP0_PACKET_SIZE;
		DCPXfer_wResidue -= EP0_PACKET_SIZE;
	}
	else
	{
        Hal4D12_WriteEPAtCode(1, DCPXfer_wResidue, DCPXfer_pData );
		//DCPXfer_pData += DCPXfer_wResidue;
		DCPXfer_wResidue = 0;
		DCPFSMstate = USBFSM4DCP_HANDSHAKE4CI;
	}
}

⌨️ 快捷键说明

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