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

📄 uvcuser.c

📁 NXP LPC2378 USBUVC Demo
💻 C
📖 第 1 页 / 共 3 页
字号:
/*----------------------------------------------------------------------------
 *      U S B  -  K e r n e l
 *----------------------------------------------------------------------------
 *      Name:    UVCUSER.c
 *      Purpose: USB Video Device Class User module 
 *      Version: V1.00
 *----------------------------------------------------------------------------
 *      This file is part of the uVision/ARM development tools.
 *      This software may only be used under the terms of a valid, current,
 *      end user licence from KEIL for a compatible version of KEIL software
 *      development tools. Nothing else gives you the right to use it.
 *
 *      Copyright (c) 2005-2007 Keil Software.
 *---------------------------------------------------------------------------*/

#include <string.h>
#include <LPC23xx.H>                                  /* LPC23xx definitions */

#include "type.h"
#include "usb.h"
#include "usbhw.h"
#include "usbcfg.h"
#include "usbcore.h"
#include "uvc.h"
#include "uvcuser.h"

static BYTE UVC_PowerMode          = 0xA0;           /* Power Mode */
static BYTE UVC_ErrorCode          = NO_ERROR_ERR;   /* Error Code */

static BYTE UVC_suSelectedInputPin = 0x01;   /* SelectorUnit   selcted input pin */

static WORD UVC_puBrightnessCur    = 0x0010; /* ProcessingUnit Brightness Current */
static WORD UVC_puBrightnessDef    = 0x0010; /* ProcessingUnit Brightness Default */
static WORD UVC_puBrightnessMin    = 0x0001; /* ProcessingUnit Brightness Minimum */
static WORD UVC_puBrightnessMax    = 0x00FF; /* ProcessingUnit Brightness Maximum */
static WORD UVC_puBrightnessRes    = 0x0001; /* ProcessingUnit Brightness Resolution */

static UVC_VIDEO_PROBE_AND_COMMIT_CONTROL UVC_vsVideoProbe = 
   {0x001F,                 // bitfield indicating what fields shall be kept fixed
    0x01,                   // Video format index from a format descriptor
    0x01,                   // Video frame index from a frame descriptor
    0x000A2C2A,             // Frame intervall in 100 ns units
    0x0000,                 // Key frame rate in key-frame per video-frame units
    0x0000,                 // PFrame rate i PFrame/key frame units
    0x0000,                 // Compression quality control in abstarct units (0..10000)
    0x0000,                 // Window size for average bit rate control
    0x00FF,                 // int. VS interface latency in ms from capture to presentation
    0x00009480,             // maximum video frame or codec specific segemet size in bytes
    0x00009480,             // max. bytes the device can transmit/receive in single payload transfer
#if (UVC_VERSION ==  0x0110)
    0x00000000,             // device clock frequency in Hz for sepcified format
    0x00,                   // bitfield control
    0x00,                   // preferred payload format version for specifide bFormatIndex
    0x00,                   // minimum payload format version for specifide bFormatIndex    
    0x00                    // maximum payload format version for specifide bFormatIndex
#endif   
  };


/*----------------------------------------------------------------------------
  UVC SetCur Request Callback
  Called automatically on UVC SET_CUR Request
  Parameters:   None                          (global SetupPacket and EP0Buf)
  Return Value: TRUE - Success, FALSE - Error
 *---------------------------------------------------------------------------*/
BOOL UVC_SetCur (void) {
  WORD wTemp = 0;

  switch (SetupPacket.wIndex.WB.L) {                       // select the Interface
    case USB_UVC_VCIF_NUM:                                 // Video Control Interface
      switch (SetupPacket.wIndex.WB.H) {                   // select the Entity
        case 0:                                            // interface control requests
          switch (SetupPacket.wValue.WB.H) {               // select the  selector control
            case VC_VIDEO_POWER_MODE_CONTROL:
              UVC_PowerMode = EP0Buf[0];
              UVC_ErrorCode = NO_ERROR_ERR;
              break;
            default:
              UVC_ErrorCode = INVALID_CONTROL_ERR;
              break;
          } // end SetupPacket.wValue.WB.H
          break;
        case 1:                                            // InputTerminal (camera)         see usbdesc.c
          switch (SetupPacket.wValue.WB.H) {               // select the  selector control
            default:
              UVC_ErrorCode = INVALID_CONTROL_ERR;
              break;
          } // end SetupPacket.wValue.WB.H
          break;
        case 2:                                            // InputTerminal (composite)      see usbdesc.c
          switch (SetupPacket.wValue.WB.H) {               // select the  selector control
            default:
              UVC_ErrorCode = INVALID_CONTROL_ERR;
              break;
          } // end SetupPacket.wValue.WB.H
          break;
        case 3:                                            // OutputTerminal                 see usbdesc.c
          switch (SetupPacket.wValue.WB.H) {               // select the  selector control
            default:
              UVC_ErrorCode = INVALID_CONTROL_ERR;
              break;
          } // end SetupPacket.wValue.WB.H
          break;
        case 4:                                            // SelectorUnit                   see usbdesc.c
          switch (SetupPacket.wValue.WB.H) {               // select the  selector control
            case SU_INPUT_SELECT_CONTROL:
              UVC_suSelectedInputPin = EP0Buf[0];
              UVC_ErrorCode = NO_ERROR_ERR;
              break;
            default:
              UVC_ErrorCode = INVALID_CONTROL_ERR;
              break;
          } // end SetupPacket.wValue.WB.H
          break;
        case 5:                                            // ProcessingUnit                 see usbdesc.c
          switch (SetupPacket.wValue.WB.H) {               // select the  selector control
            case PU_BRIGHTNESS_CONTROL:                    // only Brightness is supported   see usbdesc.c
              wTemp = *((__packed WORD *)EP0Buf);
              if ((wTemp >= UVC_puBrightnessMin) &&        // check the value to set
                  (wTemp <= UVC_puBrightnessMax)   ) {
                   
                UVC_puBrightnessCur = wTemp; 
                UVC_ErrorCode = NO_ERROR_ERR;
              }
              else {
                UVC_ErrorCode = OUT_OF_RANGE_ERR;
              }
              break;
            default:
              UVC_ErrorCode = INVALID_CONTROL_ERR;
              break;
          } // end SetupPacket.wValue.WB.H
          break;
        default:
          UVC_ErrorCode = INVALID_UNIT_ERR;
          break;
      } // end SetupPacket.wIndex.WB.H
      break;

    case USB_UVC_VSIF_NUM:                                 // Video Streaming Interface
          switch (SetupPacket.wValue.WB.H) {               // select the  selector control
            case VS_PROBE_CONTROL :
            case VS_COMMIT_CONTROL:
              memcpy((void *)&UVC_vsVideoProbe, (const void *)EP0Buf, sizeof(UVC_VIDEO_PROBE_AND_COMMIT_CONTROL));
              UVC_ErrorCode = NO_ERROR_ERR;
              break;
            default:
              UVC_ErrorCode = INVALID_CONTROL_ERR;
              break;
          } // end SetupPacket.wValue.WB.H
      break;

    default:
      UVC_ErrorCode = UNKNOWN_ERR;
      break;
  }  // end SetupPacket.wIndex.WB.L

  if (UVC_ErrorCode == NO_ERROR_ERR)
    return (TRUE);                                         // we handled the request
  else
    return (FALSE);                                        // if not handled we stall it

} // end UVC_SetCur


/*----------------------------------------------------------------------------
  UVC GetCur Request Callback
  Called automatically on UVC GET_CUR Request
  Parameters:   None                          (global SetupPacket and EP0Buf)
  Return Value: TRUE - Success, FALSE - Error
 *---------------------------------------------------------------------------*/
BOOL UVC_GetCur (void) {

  switch (SetupPacket.wIndex.WB.L) {                       // select the Interface
    case USB_UVC_VCIF_NUM:                                 // Video Control Interface
      switch (SetupPacket.wIndex.WB.H) {                   // select the Entity
        case 0:                                            // interface control requests
          switch (SetupPacket.wValue.WB.H) {               // select the  selector control
            case VC_VIDEO_POWER_MODE_CONTROL:
              EP0Buf[0] = UVC_PowerMode;
              UVC_ErrorCode = NO_ERROR_ERR;
              break;
            case VC_REQUEST_ERROR_CODE_CONTROL:
              EP0Buf[0] = UVC_ErrorCode;
              UVC_ErrorCode = NO_ERROR_ERR;
              break;
            default:
              UVC_ErrorCode = INVALID_CONTROL_ERR;
              break;
          } // end SetupPacket.wValue.WB.H
          break;
        case 1:                                            // InputTerminal (camera)    see usbdesc.c
          switch (SetupPacket.wValue.WB.H) {               // select the  selector control
            default:
              UVC_ErrorCode = INVALID_CONTROL_ERR;
              break;
          } // end SetupPacket.wValue.WB.H
          break;
        case 2:                                            // InputTerminal (composite) see usbdesc.c
          switch (SetupPacket.wValue.WB.H) {               // select the  selector control
            default:
              UVC_ErrorCode = INVALID_CONTROL_ERR;
            break;
          } // end SetupPacket.wValue.WB.H
          break;
        case 3:                                            // OutputTerminal            see usbdesc.c
          switch (SetupPacket.wValue.WB.H) {               // select the  selector control
            default:
              UVC_ErrorCode = INVALID_CONTROL_ERR;
              break;
          } // end SetupPacket.wValue.WB.H
          break;
        case 4:                                            // SelectorUnit              see usbdesc.c
          switch (SetupPacket.wValue.WB.H) {               // select the  selector control
            case SU_INPUT_SELECT_CONTROL:
              EP0Buf[0] = UVC_suSelectedInputPin;
              UVC_ErrorCode = NO_ERROR_ERR;
              break;
            default:
              UVC_ErrorCode = INVALID_CONTROL_ERR;
              break;
          } // end SetupPacket.wValue.WB.H
          break;
        case 5:                                            // ProcessingUnit            see usbdesc.c
          switch (SetupPacket.wValue.WB.H) {               // select the  selector control
            case PU_BRIGHTNESS_CONTROL:
              *((__packed WORD *)EP0Buf) = UVC_puBrightnessCur;
              UVC_ErrorCode = NO_ERROR_ERR;
              break;
            default:
              UVC_ErrorCode = INVALID_CONTROL_ERR;
              break;
          } // end SetupPacket.wValue.WB.H
          break;
        default:
          UVC_ErrorCode = INVALID_UNIT_ERR;
          break;
      } // end SetupPacket.wIndex.WB.H
      break;

⌨️ 快捷键说明

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