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

📄 uvcsys.c

📁 cortex-m0 LCD1602程序
💻 C
📖 第 1 页 / 共 4 页
字号:

/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* FUNCTION                                                                                                */
/*      UVC_CtrlSetupGetDescriptor()	       	                                                           */
/*                                                                                                         */
/* DESCRIPTION                                                                                             */
/*      The callback funciton for get descriptor request ack event.                                        */
/*                                                                                                         */
/* INPUTS                                                                                                  */
/*      pVoid   A pointer of UVC device.                                                                   */
/*                                                                                                         */
/* OUTPUTS                                                                                                 */
/*      None                            				                                                   */
/*                                                                                                         */
/* RETURN                                                                                                  */
/*      None                                                                                               */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/
void UVC_CtrlSetupGetDescriptor(void * pVoid)
{
	S_UVC_DEVICE *psDevice = (S_UVC_DEVICE *) pVoid;
	S_DRVUSB_DEVICE *pInfraDevice = (S_DRVUSB_DEVICE *)psDevice->device;
	uint16_t u16Len;
	uint16_t u16ConfigLen;
	s_u8ConfigLenOver64 = 0;

	u16Len = 0;
	u16Len = pInfraDevice->au8Setup[7];
	u16Len <<= 8;
	u16Len += pInfraDevice->au8Setup[6];
	
	switch (pInfraDevice->au8Setup[3])
	{
		/* Get Device Descriptor */
		case DESC_DEVICE:
		{
			u16Len = Minimum(u16Len, LEN_DEVICE);
		
			DrvUSB_DataIn(0, gau8DeviceDescriptor, u16Len);
			break;
		}
		/* Get Configuration Descriptor */
		case DESC_CONFIG:
		{
			u16ConfigLen = gau8ConfigDescriptor[3];
			u16ConfigLen <<= 8;
			u16ConfigLen |= gau8ConfigDescriptor[2];

			s_u16Len = Minimum(u16Len, u16ConfigLen);
			s_u16SendLength = 64;
			s_u16CurPtr = 0;
			s_u16Toggle = 0;		

			if (s_u16Len > s_u16SendLength)
			{
				DrvUSB_DataIn(0, gau8ConfigDescriptor + s_u16CurPtr, s_u16SendLength);

				s_u16Len -= s_u16SendLength;
				s_u16CurPtr += s_u16SendLength;
				s_u8ConfigLenOver64 = 1;
			}
			else
			{
				/* Trigger next Control In DATA1 Transaction. */
				DrvUSB_DataIn(0, gau8ConfigDescriptor + s_u16CurPtr, s_u16Len);
			}
			break;
		}
		/* Get String Descriptor */
		case DESC_STRING:
		{
			/* Get Language */
			if (pInfraDevice->au8Setup[2] == 0)
			{
				u16Len = Minimum(u16Len, 4);
				/* Copy to USB SRAM. */
      			DrvUSB_DataIn(0, gau8StringLang, u16Len);
			}
			else
			{
				/* Get String Descriptor */
				switch (pInfraDevice->au8Setup[2])
				{
					case 1:
					{
						u16Len = Minimum(u16Len, gau8VendorStringDescriptor[0]);
						/* Copy to USB SRAM. */				 
						DrvUSB_DataIn(0, gau8VendorStringDescriptor, u16Len);
						break;
					}
					case 2:
					{
						u16Len = Minimum(u16Len, gau8ProductStringDescriptor[0]);
						/* Copy to USB SRAM. */
						DrvUSB_DataIn(0, gau8ProductStringDescriptor, u16Len);
						break;
					}
					case 3:
					{
						u16Len = Minimum(u16Len, gau8StringSerial[0]);
						/* Copy to USB SRAM. */
						DrvUSB_DataIn(0, gau8StringSerial, u16Len);
						break;
					}
					case 4:
					case 5:
					case 6:
					case 7:
					{
						u16Len = Minimum(u16Len, gau8StringAudio[0]);
						/* Copy to USB SRAM. */
						DrvUSB_DataIn(0,  gau8StringAudio, u16Len);
						break;
					}
					default:
						/* Not support. Reply STALL. */
						DrvUSB_ClrCtrlReadyAndTrigStall();
						break;
				}
			}
			break;
		}
		default:
			/* Not support. Reply STALL. */
			DrvUSB_ClrCtrlReadyAndTrigStall();
			break;
	}
}

/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* FUNCTION                                                                                                */
/*      UVC_CtrlDataInGetDescriptor()	       	                                                           */
/*                                                                                                         */
/* DESCRIPTION                                                                                             */
/*      DATA IN ACK call back function for Get descriptor command                                          */
/*                                                                                                         */
/* INPUTS                                                                                                  */
/*      pVoid   A pointer of UVC device.                                                                   */
/*                                                                                                         */
/* OUTPUTS                                                                                                 */
/*      None                            				                                                   */
/*                                                                                                         */
/* RETURN                                                                                                  */
/*      None                                                                                               */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/
void UVC_CtrlDataInGetDescriptor(void * pVoid)
{
	S_DRVUSB_DEVICE *psDevice = &gsUsbDevice;
	
	if (psDevice->au8Setup[0] & 0x80)
	{
		if (s_u8ConfigLenOver64  ==  1)  // Configure descriptor over 64
		{
			if (s_u16Len >= s_u16SendLength)
			{				
				DrvUSB_DataIn(0, gau8ConfigDescriptor + s_u16CurPtr, s_u16SendLength);
				s_u16Len -= s_u16SendLength;
				s_u16CurPtr += s_u16SendLength;
				
				if (s_u16Len == 0)
					_DRVUSB_TRIG_EP(1,0x00); //Ctl data out
			}
			else
			{			
				DrvUSB_DataIn(0, gau8ConfigDescriptor + s_u16CurPtr, s_u16Len);
				s_u8ConfigLenOver64 = 0;		
			}
		}
		else
		{
			//_UVC_TRIG_CTRL_OUT(0x00);
			_DRVUSB_TRIG_EP(1,0x00);
		}
	}
}


void UVC_ClassCtrlSetCurRequest(void * pVoid)
{
  	S_UVC_DEVICE *psDevice = (S_UVC_DEVICE *) pVoid;
  	S_DRVUSB_DEVICE *psUsbDevice = (S_DRVUSB_DEVICE *)psDevice->device;
  	uint8_t *CmdDataPtr;
  	int i;
  	int value = 0; 
  	
  	if (UVC_CS_INTERFACE == psUsbDevice->au8Setup[4])
  	{
        switch ( psUsbDevice->au8Setup[3])
        {
            case VS_PROBE_CONTROL:
			case VS_COMMIT_CONTROL:
            	CmdDataPtr = (uint8_t *)&VideoStreamCmdCtlData;	
				    for (i = 0 ; i < psUsbDevice->au8Setup[6] ; i=i+1)     
				    {
				     	  value = psUsbDevice->sEpCrl[0].u8SramBuffer[i];
				        *CmdDataPtr++ = value;	                   	          
					}             
            
               _DRVUSB_TRIG_EP(1,psUsbDevice->au8Setup[6]); 
               break;
            default:   
                /* STALL control pipe */
        		_DRVUSB_CLEAR_EP_READY_AND_TRIG_STALL(0);
        		_DRVUSB_CLEAR_EP_READY_AND_TRIG_STALL(1);
       	        break;
        }       	      
    }
    else
    {
        /* STALL control pipe */
		_DRVUSB_CLEAR_EP_READY_AND_TRIG_STALL(0);
		_DRVUSB_CLEAR_EP_READY_AND_TRIG_STALL(1);
    } 
}

void UVC_ClassCtrlGetCurRequest(void * pVoid)
{
  	S_UVC_DEVICE *psDevice = (S_UVC_DEVICE *) pVoid;
  	S_DRVUSB_DEVICE *psUsbDevice = (S_DRVUSB_DEVICE *)psDevice->device;
	uint8_t *ptr;
 	if(UVC_CS_INTERFACE == psUsbDevice->au8Setup[4])
  	{
        switch ( psUsbDevice->au8Setup[3])
        {

            case VS_PROBE_CONTROL:
			case VS_COMMIT_CONTROL:
			{
				switch(VideoStreamCmdCtlData.bFrameIndex)
				{
					case 2://160*120
			 			VideoStreamCmdCtlData.dwMaxVideoFrameSize = 0x00009600;
			    		break;			    		
					case 1://320*240
				    	VideoStreamCmdCtlData.dwMaxVideoFrameSize = 0x00025800;
				    	break;
					case 3://640*480
				    	VideoStreamCmdCtlData.dwMaxVideoFrameSize = 0x00096000;
				    	break;		    
				}
				//************Depend on the specificed frame*****************//  
				VideoStreamCmdCtlData.dwMaxPayloadTransferSize = 0x000040;//VideoStreamCmdCtlData.dwMaxVideoFrameSize+2; 			    							    
							     
				ptr = (uint8_t *)&VideoStreamCmdCtlData;					
				{
					int i;			

⌨️ 快捷键说明

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