📄 uvcsys.c
字号:
/*---------------------------------------------------------------------------------------------------------*/
/* */
/* 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 + -