1*6c49ea28Skirill /* $OpenBSD: uvideo.h,v 1.63 2025/01/16 22:58:19 kirill Exp $ */ 2c200fde7Smglocker 3cf110a4aSrobert /* 4cf110a4aSrobert * Copyright (c) 2007 Robert Nagy <robert@openbsd.org> 5cf110a4aSrobert * Copyright (c) 2008 Marcus Glocker <mglocker@openbsd.org> 6cf110a4aSrobert * 7cf110a4aSrobert * Permission to use, copy, modify, and distribute this software for any 8cf110a4aSrobert * purpose with or without fee is hereby granted, provided that the above 9cf110a4aSrobert * copyright notice and this permission notice appear in all copies. 10cf110a4aSrobert * 11cf110a4aSrobert * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12cf110a4aSrobert * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13cf110a4aSrobert * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14cf110a4aSrobert * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15cf110a4aSrobert * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16cf110a4aSrobert * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17cf110a4aSrobert * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18cf110a4aSrobert */ 19cf110a4aSrobert 201dc1fa5aSmglocker #include <sys/queue.h> 21cf110a4aSrobert #include <sys/videoio.h> 22cf110a4aSrobert 23cf110a4aSrobert /* 24cf110a4aSrobert * USB Video Class 25cf110a4aSrobert */ 26cf110a4aSrobert /* Table A-7: Video Class-Specific Endpoint Descriptor Subtypes */ 27cf110a4aSrobert #define EP_UNDEFINED 0x00 28cf110a4aSrobert #define EP_GENERAL 0x01 29cf110a4aSrobert #define EP_ENDPOINT 0x02 30cf110a4aSrobert #define EP_INTERRUPT 0x03 31cf110a4aSrobert 32cf110a4aSrobert /* Table A-5: Video Class-Specific VC Interface Descriptor Subtypes */ 33cf110a4aSrobert #define UDESCSUB_VC_DESCRIPTOR_UNDEFINED 0x00 34cf110a4aSrobert #define UDESCSUB_VC_HEADER 0x01 35cf110a4aSrobert #define UDESCSUB_VC_INPUT_TERMINAL 0x02 36cf110a4aSrobert #define UDESCSUB_VC_OUTPUT_TERMINAL 0x03 37cf110a4aSrobert #define UDESCSUB_VC_SELECTOR_UNIT 0x04 38cf110a4aSrobert #define UDESCSUB_VC_PROCESSING_UNIT 0x05 39cf110a4aSrobert #define UDESCSUB_VC_EXTENSION_UNIT 0x06 40cf110a4aSrobert 41cf110a4aSrobert /* Table A-6: Video Class-Specific VS Interface Descriptor Subtypes */ 42cf110a4aSrobert #define UDESCSUB_VS_UNDEFINED 0x00 43cf110a4aSrobert #define UDESCSUB_VS_INPUT_HEADER 0x01 44cf110a4aSrobert #define UDESCSUB_VS_OUTPUT_HEADER 0x02 45cf110a4aSrobert #define UDESCSUB_VS_STILL_IMAGE_FRAME 0x03 46cf110a4aSrobert #define UDESCSUB_VS_FORMAT_UNCOMPRESSED 0x04 47cf110a4aSrobert #define UDESCSUB_VS_FRAME_UNCOMPRESSED 0x05 48cf110a4aSrobert #define UDESCSUB_VS_FORMAT_MJPEG 0x06 49cf110a4aSrobert #define UDESCSUB_VS_FRAME_MJPEG 0x07 50cf110a4aSrobert #define UDESCSUB_VS_FORMAT_MPEG2TS 0x0a 51cf110a4aSrobert #define UDESCSUB_VS_FORMAT_DV 0x0c 52cf110a4aSrobert #define UDESCSUB_VS_COLORFORMAT 0x0d 53cf110a4aSrobert #define UDESCSUB_VS_FORMAT_FRAME_BASED 0x10 54cf110a4aSrobert #define UDESCSUB_VS_FRAME_FRAME_BASED 0x11 55cf110a4aSrobert #define UDESCSUB_VS_FORMAT_STREAM_BASED 0x12 56cf110a4aSrobert 57cf110a4aSrobert /* Table A-8: Video Class-Specific Request Codes */ 58cf110a4aSrobert #define RC_UNDEFINED 0x00 59cf110a4aSrobert #define SET_CUR 0x01 60cf110a4aSrobert #define GET_CUR 0x81 61cf110a4aSrobert #define GET_MIN 0x82 62cf110a4aSrobert #define GET_MAX 0x83 63cf110a4aSrobert #define GET_RES 0x84 64cf110a4aSrobert #define GET_LEN 0x85 65cf110a4aSrobert #define GET_INFO 0x86 66cf110a4aSrobert #define GET_DEF 0x87 67cf110a4aSrobert 68cf110a4aSrobert /* Table A-9: Video Control Interface Control Selectors */ 69cf110a4aSrobert #define VC_CONTROL_UNDEFINED 0x00 70cf110a4aSrobert #define VC_VIDEO_POWER_MODE_CONTROL 0x01 71cf110a4aSrobert #define VC_REQUEST_ERROR_CODE_CONTROL 0x02 72cf110a4aSrobert 73cf110a4aSrobert /* Table A-11: Selector Unit Control Selectors */ 74cf110a4aSrobert #define SU_CONTROL_UNDEFINED 0x00 75cf110a4aSrobert #define SU_INPUT_SELECT_CONTROL 0x01 76cf110a4aSrobert 77cf110a4aSrobert /* Table A-12: Camera Terminal Control Selectors */ 78cf110a4aSrobert #define CT_CONTROL_UNDEFINED 0x00 79cf110a4aSrobert #define CT_SCANNING_MODE_CONTROL 0x01 80cf110a4aSrobert #define CT_AE_MODE_CONTROL 0x02 81cf110a4aSrobert #define CT_AE_PRIORITY_CONTROL 0x03 82cf110a4aSrobert #define CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x04 83cf110a4aSrobert #define CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x05 84cf110a4aSrobert #define CT_FOCUS_ABSOLUTE_CONTROL 0x06 85cf110a4aSrobert #define CT_FOCUS_RELATIVE_CONTROL 0x07 86cf110a4aSrobert #define CT_FOCUS_AUTO_CONTROL 0x08 87cf110a4aSrobert #define CT_IRIS_ABSOLUTE_CONTROL 0x09 88cf110a4aSrobert #define CT_IRIS_RELATIVE_CONTROL 0x0a 89cf110a4aSrobert #define CT_ZOOM_ABSOLUTE_CONTROL 0x0b 90cf110a4aSrobert #define CT_ZOOM_RELATIVE_CONTROL 0x0c 91cf110a4aSrobert #define CT_PANTILT_ABSOLUTE_CONTROL 0x0d 92cf110a4aSrobert #define CT_PANTILT_RELATIVE_CONTROL 0x0e 93cf110a4aSrobert #define CT_ROLL_ABSOLUTE_CONTROL 0x0f 94cf110a4aSrobert #define CT_ROLL_RELATIVE_CONTROL 0x10 95cf110a4aSrobert #define CT_PRIVACY_CONTROL 0x11 96cf110a4aSrobert 97cf110a4aSrobert /* Table A-13: Processing Unit Control Selectors */ 98cf110a4aSrobert #define PU_CONTROL_UNDEFINED 0x00 99cf110a4aSrobert #define PU_BACKLIGHT_COMPENSATION_CONTROL 0x01 100cf110a4aSrobert #define PU_BRIGHTNESS_CONTROL 0x02 101cf110a4aSrobert #define PU_CONTRAST_CONTROL 0x03 102cf110a4aSrobert #define PU_GAIN_CONTROL 0x04 103cf110a4aSrobert #define PU_POWER_LINE_FREQUENCY_CONTROL 0x05 104cf110a4aSrobert #define PU_HUE_CONTROL 0x06 105cf110a4aSrobert #define PU_SATURATION_CONTROL 0x07 106cf110a4aSrobert #define PU_SHARPNESS_CONTROL 0x08 107cf110a4aSrobert #define PU_GAMMA_CONTROL 0x09 108cf110a4aSrobert #define PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x0a 109cf110a4aSrobert #define PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x0b 110cf110a4aSrobert #define PU_WHITE_BALANCE_COMPONENT_CONTROL 0x0c 111cf110a4aSrobert #define PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x0d 112cf110a4aSrobert #define PU_DIGITAL_MULTIPLIER_CONTROL 0x0e 113cf110a4aSrobert #define PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x0f 114cf110a4aSrobert #define PU_HUE_AUTO_CONTROL 0x10 115cf110a4aSrobert #define PU_ANALOG_VIDEO_STANDARD_CONTROL 0x11 116cf110a4aSrobert #define PU_ANALOG_LOCK_STATUS_CONTROL 0x12 117cf110a4aSrobert 118cf110a4aSrobert /* Table A-15: VideoStreaming Interface Control Selectors */ 119cf110a4aSrobert #define VS_CONTROL_UNDEFINED 0x00 120cf110a4aSrobert #define VS_PROBE_CONTROL 0x01 121cf110a4aSrobert #define VS_COMMIT_CONTROL 0x02 122cf110a4aSrobert #define VS_STILL_PROBE_CONTROL 0x03 123cf110a4aSrobert #define VS_STILL_COMMIT_CONTROL 0x04 124cf110a4aSrobert #define VS_STILL_IMAGE_TRIGGER_CONTROL 0x05 125cf110a4aSrobert #define VS_STREAM_ERROR_CODE_CONTROL 0x06 126cf110a4aSrobert #define VS_GENERATE_KEY_FRAME_CONTROL 0x07 127cf110a4aSrobert #define VS_UPDATE_FRAME_SEGMENT_CONTROL 0x08 128cf110a4aSrobert #define VS_SYNC_DELAY_CONTROL 0x09 129cf110a4aSrobert 130cf110a4aSrobert /* probe commit bmRequests */ 131cf110a4aSrobert #define UVIDEO_SET_IF 0x21 132cf110a4aSrobert #define UVIDEO_GET_IF 0xa1 133cf110a4aSrobert #define UVIDEO_SET_EP 0x22 134cf110a4aSrobert #define UVIDEO_GET_EP 0xa2 135cf110a4aSrobert 136cf110a4aSrobert /* Table B-1: USB Terminal Types */ 137cf110a4aSrobert #define TT_VENDOR_SPECIFIC 0x0100 138cf110a4aSrobert #define TT_STREAMING 0x0101 139cf110a4aSrobert 140cf110a4aSrobert /* Table B-2: Input Terminal Types */ 141cf110a4aSrobert #define ITT_VENDOR_SPECIFIC 0x0200 142cf110a4aSrobert #define ITT_CAMERA 0x0201 143cf110a4aSrobert #define ITT_MEDIA_TRANSPORT_INPUT 0x0202 144cf110a4aSrobert 145cf110a4aSrobert /* Table B-3: Output Terminal Types */ 146cf110a4aSrobert #define OTT_VENDOR_SPECIFIC 0x0300 147cf110a4aSrobert #define OTT_DISPLAY 0x0301 148cf110a4aSrobert #define OTT_MEDIA_TRANSPORT_OUTPUT 0x0302 149cf110a4aSrobert 150cf110a4aSrobert /* Table B-4: External Terminal Types */ 151cf110a4aSrobert #define EXTERNAL_VENDOR_SPECIFIC 0x0400 152cf110a4aSrobert #define COMPOSITE_CONNECTOR 0x0401 153cf110a4aSrobert #define SVIDEO_CONNECTOR 0x0402 154cf110a4aSrobert #define COMPONENT_CONNECTOR 0x0403 155cf110a4aSrobert 156cf110a4aSrobert /* Table 3-3: VC Interface Header Descriptor */ 157cf110a4aSrobert struct usb_video_header_desc { 158cf110a4aSrobert uByte bLength; 159cf110a4aSrobert uByte bDescriptorType; 160cf110a4aSrobert uByte bDescriptorSubtype; 161cf110a4aSrobert uWord bcdUVC; 162cf110a4aSrobert uWord wTotalLength; 163f72577ceSmglocker uDWord dwClockFrequency; 164cf110a4aSrobert uByte bInCollection; 165ba30c7beSmglocker } __packed; 166259e150dSmglocker 167259e150dSmglocker struct usb_video_header_desc_all { 168259e150dSmglocker struct usb_video_header_desc *fix; 169259e150dSmglocker uByte *baInterfaceNr; 170cf110a4aSrobert }; 171cf110a4aSrobert 172cf110a4aSrobert /* Table 3-4: Input Terminal Descriptor */ 173cf110a4aSrobert struct usb_video_input_terminal_desc { 174cf110a4aSrobert uByte bLength; 175cf110a4aSrobert uByte bDescriptorType; 176cf110a4aSrobert uByte bDescriptorSubtype; 177cf110a4aSrobert uByte bTerminalID; 178cf110a4aSrobert uWord wTerminalType; 179cf110a4aSrobert uByte bAssocTerminal; 180cf110a4aSrobert uByte iTerminal; 181ba30c7beSmglocker } __packed; 182cf110a4aSrobert 183cf110a4aSrobert /* Table 3-5: Output Terminal Descriptor */ 184cf110a4aSrobert struct usb_video_output_terminal_desc { 185cf110a4aSrobert uByte bLength; 186cf110a4aSrobert uByte bDescriptorType; 187cf110a4aSrobert uByte bDescriptorSubtype; 188cf110a4aSrobert uByte bTerminalID; 189cf110a4aSrobert uWord wTerminalType; 190cf110a4aSrobert uByte bAssocTerminal; 191cf110a4aSrobert uByte bSourceID; 192cf110a4aSrobert uByte iTerminal; 193ba30c7beSmglocker } __packed; 194cf110a4aSrobert 195cf110a4aSrobert /* Table 3-6: Camera Terminal Descriptor */ 196cf110a4aSrobert struct usb_video_camera_terminal_desc { 197cf110a4aSrobert uByte bLength; 198cf110a4aSrobert uByte bDescriptorType; 199cf110a4aSrobert uByte bDescriptorSubtype; 200cf110a4aSrobert uByte bTerminalID; 201cf110a4aSrobert uWord wTerminalType; 202cf110a4aSrobert uByte bAssocTerminal; 203cf110a4aSrobert uByte iTerminal; 204cf110a4aSrobert uWord wObjectiveFocalLengthMin; 205cf110a4aSrobert uWord wObjectiveFocalLengthMax; 206cf110a4aSrobert uWord wOcularFocalLength; 207cf110a4aSrobert uByte bControlSize; 208f72577ceSmglocker uByte *bmControls; 209ba30c7beSmglocker } __packed; 210cf110a4aSrobert 2112ee56f53Smglocker /* Table 3-8: VC Processing Unit Descriptor */ 2122ee56f53Smglocker struct usb_video_vc_processing_desc { 2132ee56f53Smglocker uByte bLength; 2142ee56f53Smglocker uByte bDescriptorType; 2152ee56f53Smglocker uByte bDescriptorSubtype; 2162ee56f53Smglocker uByte bUnitID; 2172ee56f53Smglocker uByte bSourceID; 2182ee56f53Smglocker uWord wMaxMultiplier; 2192ee56f53Smglocker uByte bControlSize; 220eea62ee3Sjakemsr uByte bmControls[255]; /* [bControlSize] */ 221eea62ee3Sjakemsr /* uByte iProcessing; */ 222eea62ee3Sjakemsr /* uByte bmVideoStandards; */ 2232ee56f53Smglocker } __packed; 2242ee56f53Smglocker 22501c33b94Smglocker /* Table 3-9: VC Extension Unit Descriptor */ 22601c33b94Smglocker struct usb_video_vc_extension_desc { 22701c33b94Smglocker uByte bLength; 22801c33b94Smglocker uByte bDescriptorType; 22901c33b94Smglocker uByte bDescriptorSubtype; 23001c33b94Smglocker uByte bUnitID; 23101c33b94Smglocker uByte guidExtensionCode[16]; 23201c33b94Smglocker uByte bNumControls; 23301c33b94Smglocker uByte bNrInPins; 23401c33b94Smglocker } __packed; 23501c33b94Smglocker 236cf110a4aSrobert /* Table 3-11: VC Endpoint Descriptor */ 237cf110a4aSrobert struct usb_video_vc_endpoint_desc { 238cf110a4aSrobert uByte bLength; 239cf110a4aSrobert uByte bDescriptorType; 240cf110a4aSrobert uByte bDescriptorSubtype; 241cf110a4aSrobert uWord wMaxTransferSize; 242ba30c7beSmglocker } __packed; 243cf110a4aSrobert 24469db36cdSmglocker /* Table 3-13: Interface Input Header Descriptor */ 24569db36cdSmglocker struct usb_video_input_header_desc { 24669db36cdSmglocker uByte bLength; 24769db36cdSmglocker uByte bDescriptorType; 24869db36cdSmglocker uByte bDescriptorSubtype; 24969db36cdSmglocker uByte bNumFormats; 25069db36cdSmglocker uWord wTotalLength; 25169db36cdSmglocker uByte bEndpointAddress; 25269db36cdSmglocker uByte bmInfo; 25369db36cdSmglocker uByte bTerminalLink; 25469db36cdSmglocker uByte bStillCaptureMethod; 25569db36cdSmglocker uByte bTriggerSupport; 25669db36cdSmglocker uByte bTriggerUsage; 25769db36cdSmglocker uByte bControlSize; 258ba30c7beSmglocker } __packed; 25969db36cdSmglocker 260c668bad0Smglocker struct usb_video_input_header_desc_all { 261c668bad0Smglocker struct usb_video_input_header_desc *fix; 262c668bad0Smglocker uByte *bmaControls; 263c668bad0Smglocker }; 264c668bad0Smglocker 265cf110a4aSrobert /* Table 3-18: Color Matching Descriptor */ 266cf110a4aSrobert struct usb_video_color_matching_descr { 267cf110a4aSrobert uByte bLength; 268cf110a4aSrobert uByte bDescriptorType; 269cf110a4aSrobert uByte bDescriptorSubtype; 270cf110a4aSrobert uByte bColorPrimaries; 271cf110a4aSrobert uByte bTransferCharacteristics; 272cf110a4aSrobert uByte bMatrixCoefficients; 273cf110a4aSrobert } __packed; 274cf110a4aSrobert 275cf110a4aSrobert /* Table 4-47: Video Probe and Commit Controls */ 276cf110a4aSrobert struct usb_video_probe_commit { 277259e150dSmglocker uWord bmHint; 278cf110a4aSrobert uByte bFormatIndex; 279cf110a4aSrobert uByte bFrameIndex; 280259e150dSmglocker uDWord dwFrameInterval; 281259e150dSmglocker uWord wKeyFrameRate; 282259e150dSmglocker uWord wPFrameRate; 283259e150dSmglocker uWord wCompQuality; 284259e150dSmglocker uWord wCompWindowSize; 285259e150dSmglocker uWord wDelay; 286259e150dSmglocker uDWord dwMaxVideoFrameSize; 287259e150dSmglocker uDWord dwMaxPayloadTransferSize; 288bedd8548Smglocker uDWord dwClockFrequency; 289cf110a4aSrobert uByte bmFramingInfo; 290cf110a4aSrobert uByte bPreferedVersion; 291cf110a4aSrobert uByte bMinVersion; 292cf110a4aSrobert uByte bMaxVersion; 293cf110a4aSrobert } __packed; 294cf110a4aSrobert 295cf110a4aSrobert /* 296cf110a4aSrobert * USB Video Payload Uncompressed 297cf110a4aSrobert */ 298cf110a4aSrobert /* Table 2-1: Compression Formats */ 299cf110a4aSrobert #define UVIDEO_FORMAT_GUID_YUY2 { \ 300*6c49ea28Skirill 'Y', 'U', 'Y', '2', 0x00, 0x00, 0x10, 0x00, \ 301cf110a4aSrobert 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 302cf110a4aSrobert 30376a04d77Skirill #define UVIDEO_FORMAT_GUID_YV12 { \ 304*6c49ea28Skirill 'Y', 'V', '1', '2', 0x00, 0x00, 0x10, 0x00, \ 305cf110a4aSrobert 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 306cf110a4aSrobert 30776a04d77Skirill #define UVIDEO_FORMAT_GUID_I420 { \ 308*6c49ea28Skirill 'I', '4', '2', '0', 0x00, 0x00, 0x10, 0x00, \ 30976a04d77Skirill 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 31076a04d77Skirill 31176a04d77Skirill #define UVIDEO_FORMAT_GUID_Y800 { \ 312*6c49ea28Skirill 'Y', '8', '0', '0', 0x00, 0x00, 0x10, 0x00, \ 31376a04d77Skirill 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 31476a04d77Skirill 31576a04d77Skirill #define UVIDEO_FORMAT_GUID_Y8 { \ 316*6c49ea28Skirill 'Y', '8', ' ', ' ', 0x00, 0x00, 0x10, 0x00, \ 317*6c49ea28Skirill 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 318*6c49ea28Skirill 319*6c49ea28Skirill #define UVIDEO_FORMAT_GUID_D3DFMT_L8 { \ 320*6c49ea28Skirill 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, \ 3211af93364Syuo 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 3221af93364Syuo 3237431723dSpatrick #define UVIDEO_FORMAT_GUID_KSMEDIA_L8_IR { \ 3247431723dSpatrick 0x32, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, \ 3257431723dSpatrick 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 3267431723dSpatrick 327*6c49ea28Skirill #define UVIDEO_FORMAT_GUID_BY8 { \ 328*6c49ea28Skirill 'B', 'Y', '8', ' ', 0x00, 0x00, 0x10, 0x00, \ 329*6c49ea28Skirill 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 330*6c49ea28Skirill 331*6c49ea28Skirill #define UVIDEO_FORMAT_GUID_BA81 { \ 332*6c49ea28Skirill 'B', 'A', '8', '1', 0x00, 0x00, 0x10, 0x00, \ 333*6c49ea28Skirill 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 334*6c49ea28Skirill 335*6c49ea28Skirill #define UVIDEO_FORMAT_GUID_GBRG { \ 336*6c49ea28Skirill 'G', 'B', 'R', 'G', 0x00, 0x00, 0x10, 0x00, \ 337*6c49ea28Skirill 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 338*6c49ea28Skirill 339*6c49ea28Skirill #define UVIDEO_FORMAT_GUID_GRBG { \ 340*6c49ea28Skirill 'G', 'R', 'B', 'G', 0x00, 0x00, 0x10, 0x00, \ 341*6c49ea28Skirill 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 342*6c49ea28Skirill 343*6c49ea28Skirill #define UVIDEO_FORMAT_GUID_RGGB { \ 344*6c49ea28Skirill 'R', 'G', 'G', 'B', 0x00, 0x00, 0x10, 0x00, \ 345*6c49ea28Skirill 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 346*6c49ea28Skirill 347*6c49ea28Skirill #define UVIDEO_FORMAT_GUID_RGBP { \ 348*6c49ea28Skirill 'R', 'G', 'B', 'P', 0x00, 0x00, 0x10, 0x00, \ 349*6c49ea28Skirill 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 350*6c49ea28Skirill 351*6c49ea28Skirill #define UVIDEO_FORMAT_GUID_D3DFMT_R5G6B5 { \ 352*6c49ea28Skirill 0x7b, 0xeb, 0x36, 0xe4, 0x4f, 0x52, 0xce, 0x11, \ 353*6c49ea28Skirill 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 } 354*6c49ea28Skirill 355*6c49ea28Skirill #define UVIDEO_FORMAT_GUID_BGR3 { \ 356*6c49ea28Skirill 0x7d, 0xeb, 0x36, 0xe4, 0x4f, 0x52, 0xce, 0x11, \ 357*6c49ea28Skirill 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 } 358*6c49ea28Skirill 359*6c49ea28Skirill #define UVIDEO_FORMAT_GUID_BGR4 { \ 360*6c49ea28Skirill 0x7e, 0xeb, 0x36, 0xe4, 0x4f, 0x52, 0xce, 0x11, \ 361*6c49ea28Skirill 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 } 362*6c49ea28Skirill 363*6c49ea28Skirill #define UVIDEO_FORMAT_GUID_H265 { \ 364*6c49ea28Skirill 'H', '2', '6', '5', 0x00, 0x00, 0x10, 0x00, \ 365*6c49ea28Skirill 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 366*6c49ea28Skirill 367*6c49ea28Skirill #define UVIDEO_FORMAT_GUID_RW10 { \ 368*6c49ea28Skirill 'R', 'W', '1', '0', 0x00, 0x00, 0x10, 0x00, \ 369*6c49ea28Skirill 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 370*6c49ea28Skirill 371*6c49ea28Skirill #define UVIDEO_FORMAT_GUID_BG16 { \ 372*6c49ea28Skirill 'B', 'G', '1', '6', 0x00, 0x00, 0x10, 0x00, \ 373*6c49ea28Skirill 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 374*6c49ea28Skirill 375*6c49ea28Skirill #define UVIDEO_FORMAT_GUID_GB16 { \ 376*6c49ea28Skirill 'G', 'B', '1', '6', 0x00, 0x00, 0x10, 0x00, \ 377*6c49ea28Skirill 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 378*6c49ea28Skirill 379*6c49ea28Skirill #define UVIDEO_FORMAT_GUID_RG16 { \ 380*6c49ea28Skirill 'R', 'G', '1', '6', 0x00, 0x00, 0x10, 0x00, \ 381*6c49ea28Skirill 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 382*6c49ea28Skirill 383*6c49ea28Skirill #define UVIDEO_FORMAT_GUID_GR16 { \ 384*6c49ea28Skirill 'G', 'R', '1', '6', 0x00, 0x00, 0x10, 0x00, \ 385*6c49ea28Skirill 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 386*6c49ea28Skirill 387*6c49ea28Skirill #define UVIDEO_FORMAT_GUID_INVZ { \ 388*6c49ea28Skirill 'I', 'N', 'V', 'Z', 0x90, 0x2d, 0x58, 0x4a, \ 389*6c49ea28Skirill 0x92, 0x0b, 0x77, 0x3f, 0x1f, 0x2c, 0x55, 0x6b } 390*6c49ea28Skirill 391*6c49ea28Skirill #define UVIDEO_FORMAT_GUID_INVI { \ 392*6c49ea28Skirill 'I', 'N', 'V', 'I', 0xdb, 0x57, 0x49, 0x5e, \ 393*6c49ea28Skirill 0x8e, 0x3f, 0xf4, 0x79, 0x53, 0x2b, 0x94, 0x6f } 394*6c49ea28Skirill 395cf110a4aSrobert /* 396cf110a4aSrobert * USB Video Payload MJPEG 397cf110a4aSrobert */ 398cf110a4aSrobert /* Table 2-1: Stream Header Format for the Motion-JPEG */ 39934070ee7Smglocker #define UVIDEO_SH_MAX_LEN 12 40034070ee7Smglocker #define UVIDEO_SH_MIN_LEN 2 40134070ee7Smglocker struct usb_video_stream_header { 40234070ee7Smglocker uByte bLength; 40334070ee7Smglocker uByte bFlags; 40434070ee7Smglocker #define UVIDEO_SH_FLAG_FID (1 << 0) 40534070ee7Smglocker #define UVIDEO_SH_FLAG_EOF (1 << 1) 40634070ee7Smglocker #define UVIDEO_SH_FLAG_PTS (1 << 2) 40734070ee7Smglocker #define UVIDEO_SH_FLAG_SCR (1 << 3) 40834070ee7Smglocker #define UVIDEO_SH_FLAG_RES (1 << 4) 40934070ee7Smglocker #define UVIDEO_SH_FLAG_STI (1 << 5) 41034070ee7Smglocker #define UVIDEO_SH_FLAG_ERR (1 << 6) 41134070ee7Smglocker #define UVIDEO_SH_FLAG_EOH (1 << 7) 41234070ee7Smglocker /* TODO complete struct */ 41334070ee7Smglocker } __packed; 414cf110a4aSrobert 415cf110a4aSrobert /* Table 3-1: Motion-JPEG Video Format Descriptor */ 416259e150dSmglocker struct usb_video_format_mjpeg_desc { 417cf110a4aSrobert uByte bLength; 418cf110a4aSrobert uByte bDescriptorType; 419cf110a4aSrobert uByte bDescriptorSubtype; 420cf110a4aSrobert uByte bFormatIndex; 421cf110a4aSrobert uByte bNumFrameDescriptors; 422cf110a4aSrobert uByte bmFlags; 423cf110a4aSrobert uByte bDefaultFrameIndex; 424cf110a4aSrobert uByte bAspectRatioX; 425cf110a4aSrobert uByte bAspectRatioY; 426cf110a4aSrobert uByte bmInterlaceFlags; 427cf110a4aSrobert uByte bCopyProtect; 428cf110a4aSrobert } __packed; 429cf110a4aSrobert 4302bc1e751Sjakemsr /* Table 3-2: Video Frame Descriptor (same for mjpeg and uncompressed)*/ 4312bc1e751Sjakemsr struct usb_video_frame_desc { 432cf110a4aSrobert uByte bLength; 433cf110a4aSrobert uByte bDescriptorType; 434cf110a4aSrobert uByte bDescriptorSubtype; 435cf110a4aSrobert uByte bFrameIndex; 436cf110a4aSrobert uByte bmCapabilities; 437cf110a4aSrobert uWord wWidth; 438cf110a4aSrobert uWord wHeight; 439cf110a4aSrobert uDWord dwMinBitRate; 440cf110a4aSrobert uDWord dwMaxBitRate; 441cf110a4aSrobert uDWord dwMaxVideoFrameBufferSize; 442eaa1845bSmglocker uDWord dwDefaultFrameInterval; 443cf110a4aSrobert uByte bFrameIntervalType; 444c9ba893eSjakemsr /* uDWord ivals[]; frame intervals, length varies */ 445cf110a4aSrobert } __packed; 446cf110a4aSrobert 447cf110a4aSrobert /* 448786c2e79Smglocker * USB Video Payload Uncompressed 449786c2e79Smglocker */ 450786c2e79Smglocker /* Table 3-1: Uncompressed Video Format Descriptor */ 451786c2e79Smglocker struct usb_video_format_uncompressed_desc { 452786c2e79Smglocker uByte bLength; 453786c2e79Smglocker uByte bDescriptorType; 454786c2e79Smglocker uByte bDescriptorSubtype; 455786c2e79Smglocker uByte bFormatIndex; 456786c2e79Smglocker uByte bNumFrameDescriptors; 457786c2e79Smglocker uByte guidFormat[16]; 458786c2e79Smglocker uByte bBitsPerPixel; 459786c2e79Smglocker uByte bDefaultFrameIndex; 460786c2e79Smglocker uByte bAspectRatioX; 461786c2e79Smglocker uByte bAspectRatioY; 462786c2e79Smglocker uByte bmInterlaceFlags; 463786c2e79Smglocker uByte bCopyProtect; 464786c2e79Smglocker } __packed; 465786c2e79Smglocker 466786c2e79Smglocker /* 467cf110a4aSrobert * Driver specific private definitions. 468cf110a4aSrobert */ 469ff018eb9Smglocker struct uvideo_format_desc { 470ff018eb9Smglocker uByte bLength; 471ff018eb9Smglocker uByte bDescriptorType; 472ff018eb9Smglocker uByte bDescriptorSubtype; 473ff018eb9Smglocker uByte bFormatIndex; 474ff018eb9Smglocker uByte bNumFrameDescriptors; 475ff018eb9Smglocker union { 476ff018eb9Smglocker /* mjpeg */ 477ff018eb9Smglocker struct { 478ff018eb9Smglocker uByte bmFlags; 479ff018eb9Smglocker uByte bDefaultFrameIndex; 480ff018eb9Smglocker uByte bAspectRatioX; 481ff018eb9Smglocker uByte bAspectRatioY; 482ff018eb9Smglocker uByte bmInterlaceFlags; 483ff018eb9Smglocker uByte bCopyProtect; 484ff018eb9Smglocker } mjpeg; 485ff018eb9Smglocker 486ff018eb9Smglocker /* uncompressed */ 487ff018eb9Smglocker struct { 488ff018eb9Smglocker uByte guidFormat[16]; 489ff018eb9Smglocker uByte bBitsPerPixel; 490ff018eb9Smglocker uByte bDefaultFrameIndex; 491ff018eb9Smglocker uByte bAspectRatioX; 492ff018eb9Smglocker uByte bAspectRatioY; 493ff018eb9Smglocker uByte bmInterlaceFlags; 494ff018eb9Smglocker uByte bCopyProtect; 495ff018eb9Smglocker } uc; 496ff018eb9Smglocker } u; 497ff018eb9Smglocker } __packed; 498ff018eb9Smglocker 499c57f28b1Syuo #define UVIDEO_NFRAMES_MAX 40 500dae55fb3Smglocker struct uvideo_isoc_xfer { 501ba30c7beSmglocker struct uvideo_softc *sc; 502ab0b1be7Smglocker struct usbd_xfer *xfer; 503ba30c7beSmglocker void *buf; 504dae55fb3Smglocker uint16_t size[UVIDEO_NFRAMES_MAX]; 505dae55fb3Smglocker }; 506dae55fb3Smglocker 507dae55fb3Smglocker struct uvideo_bulk_xfer { 508dae55fb3Smglocker struct uvideo_softc *sc; 509ab0b1be7Smglocker struct usbd_xfer *xfer; 510dae55fb3Smglocker void *buf; 511dae55fb3Smglocker uint16_t size; 512dae55fb3Smglocker }; 513dae55fb3Smglocker 514dae55fb3Smglocker #define UVIDEO_IXFERS 3 515dae55fb3Smglocker struct uvideo_vs_iface { 516ab0b1be7Smglocker struct usbd_interface *ifaceh; 517ab0b1be7Smglocker struct usbd_pipe *pipeh; 518d0eede0cSmglocker int iface; 519ba30c7beSmglocker int numalts; 520ba30c7beSmglocker int curalt; 521d0eede0cSmglocker int endpoint; 522c57f28b1Syuo uint32_t psize; 52394e1c81bSmglocker int bulk_endpoint; 52494e1c81bSmglocker int bulk_running; 525dae55fb3Smglocker struct uvideo_isoc_xfer ixfer[UVIDEO_IXFERS]; 526dae55fb3Smglocker struct uvideo_bulk_xfer bxfer; 527ba30c7beSmglocker }; 528ba30c7beSmglocker 529ba30c7beSmglocker struct uvideo_frame_buffer { 530ba30c7beSmglocker int sample; 531ba30c7beSmglocker uint8_t fid; 532a623dae0Skirill uint8_t error; 533ba30c7beSmglocker int offset; 534ba30c7beSmglocker int buf_size; 535ba30c7beSmglocker uint8_t *buf; 53645b0d639Sjakemsr uint32_t fmt_flags; 537ba30c7beSmglocker }; 538ba30c7beSmglocker 5393eb42298Smglocker /* 5403eb42298Smglocker * 1920x1080 uncompressed (e.g. YUYV422) requires ~4MB image data per frame. 5413eb42298Smglocker * 4MB * 8 frame buffers = 32MB kernel memory required. 5423eb42298Smglocker * With 8 frame buffers we are pretty safe not to run out of kernel memory. 5433eb42298Smglocker */ 5443eb42298Smglocker #define UVIDEO_MAX_BUFFERS 8 545ba30c7beSmglocker struct uvideo_mmap { 546ba30c7beSmglocker SIMPLEQ_ENTRY(uvideo_mmap) q_frames; 547ba30c7beSmglocker uint8_t *buf; 548ba30c7beSmglocker struct v4l2_buffer v4l2_buf; 549ba30c7beSmglocker }; 550ba30c7beSmglocker typedef SIMPLEQ_HEAD(, uvideo_mmap) q_mmap; 551ba30c7beSmglocker 55296d56267Smglocker struct uvideo_format_group { 55394047bb7Smglocker uint32_t pixelformat; 554ff018eb9Smglocker uint8_t format_dfidx; 55548ae767dSmglocker struct uvideo_format_desc *format; 556ff018eb9Smglocker /* frame descriptors for mjpeg and uncompressed are identical */ 557c4402e05Sweerd #define UVIDEO_MAX_FRAME 32 5582bc1e751Sjakemsr struct usb_video_frame_desc *frame_cur; 5592bc1e751Sjakemsr struct usb_video_frame_desc *frame[UVIDEO_MAX_FRAME]; 56048ae767dSmglocker int frame_num; 56148ae767dSmglocker }; 56296d56267Smglocker 56388daba3dSmglocker struct uvideo_res { 56488daba3dSmglocker int width; 56588daba3dSmglocker int height; 56688daba3dSmglocker int fidx; 567ba30c7beSmglocker }; 56888daba3dSmglocker 5692ee56f53Smglocker struct uvideo_controls { 5702ee56f53Smglocker int cid; 5712ee56f53Smglocker int type; 5722ee56f53Smglocker char name[32]; 573617c7f44Sjakemsr uint8_t ctrl_bit; 5742ee56f53Smglocker uint16_t ctrl_selector; 5752ee56f53Smglocker uint16_t ctrl_len; 576767e272eSjakemsr int sig; 5772ee56f53Smglocker } uvideo_ctrls[] = { 578617c7f44Sjakemsr /* 579617c7f44Sjakemsr * Processing Unit Controls 580617c7f44Sjakemsr */ 5812ee56f53Smglocker { 5822ee56f53Smglocker V4L2_CID_BRIGHTNESS, 5832ee56f53Smglocker V4L2_CTRL_TYPE_INTEGER, 5842ee56f53Smglocker "Brightness", 585617c7f44Sjakemsr 0, 5862ee56f53Smglocker PU_BRIGHTNESS_CONTROL, 587767e272eSjakemsr 2, 588767e272eSjakemsr 1 5892ee56f53Smglocker }, 5902ee56f53Smglocker { 5912ee56f53Smglocker V4L2_CID_CONTRAST, 5922ee56f53Smglocker V4L2_CTRL_TYPE_INTEGER, 5932ee56f53Smglocker "Contrast", 594617c7f44Sjakemsr 1, 5952ee56f53Smglocker PU_CONTRAST_CONTROL, 596767e272eSjakemsr 2, 597767e272eSjakemsr 0 5982ee56f53Smglocker }, 5992ee56f53Smglocker { 6002ee56f53Smglocker V4L2_CID_HUE, 6012ee56f53Smglocker V4L2_CTRL_TYPE_INTEGER, 6022ee56f53Smglocker "Hue", 603617c7f44Sjakemsr 2, 6042ee56f53Smglocker PU_HUE_CONTROL, 605767e272eSjakemsr 2, 606767e272eSjakemsr 1 6072ee56f53Smglocker }, 6082ee56f53Smglocker { 6092ee56f53Smglocker V4L2_CID_SATURATION, 6102ee56f53Smglocker V4L2_CTRL_TYPE_INTEGER, 6112ee56f53Smglocker "Saturation", 612617c7f44Sjakemsr 3, 6132ee56f53Smglocker PU_SATURATION_CONTROL, 614767e272eSjakemsr 2, 615767e272eSjakemsr 0 6162ee56f53Smglocker }, 6172ee56f53Smglocker { 618617c7f44Sjakemsr V4L2_CID_SHARPNESS, 619617c7f44Sjakemsr V4L2_CTRL_TYPE_INTEGER, 620617c7f44Sjakemsr "Sharpness", 621617c7f44Sjakemsr 4, 622617c7f44Sjakemsr PU_SHARPNESS_CONTROL, 623767e272eSjakemsr 2, 624767e272eSjakemsr 0 625617c7f44Sjakemsr }, 626617c7f44Sjakemsr { 6272ee56f53Smglocker V4L2_CID_GAMMA, 6282ee56f53Smglocker V4L2_CTRL_TYPE_INTEGER, 6292ee56f53Smglocker "Gamma", 630617c7f44Sjakemsr 5, 6312ee56f53Smglocker PU_GAMMA_CONTROL, 632767e272eSjakemsr 2, 633767e272eSjakemsr 0 6342ee56f53Smglocker }, 6352ee56f53Smglocker { 636617c7f44Sjakemsr V4L2_CID_WHITE_BALANCE_TEMPERATURE, 637617c7f44Sjakemsr V4L2_CTRL_TYPE_INTEGER, 638617c7f44Sjakemsr "White Balance Temperature", 639617c7f44Sjakemsr 6, 640617c7f44Sjakemsr PU_WHITE_BALANCE_TEMPERATURE_CONTROL, 641767e272eSjakemsr 2, 642767e272eSjakemsr 0 643617c7f44Sjakemsr }, 644617c7f44Sjakemsr #if 0 645617c7f44Sjakemsr /* XXX Two V4L2 ids mapping one UVC control */ 646617c7f44Sjakemsr { 647617c7f44Sjakemsr V4L2_CID_RED_BALANCE, /* V4L2_CID_BLUE_BALANCE */ 648617c7f44Sjakemsr V4L2_CTRL_TYPE_INTEGER, 649617c7f44Sjakemsr "White Balance Red Component", /* Blue Component */ 650617c7f44Sjakemsr 7, 651617c7f44Sjakemsr PU_WHITE_BALANCE_COMPONENT_CONTROL, 652767e272eSjakemsr 4, 653767e272eSjakemsr 0 654617c7f44Sjakemsr }, 655617c7f44Sjakemsr #endif 656617c7f44Sjakemsr { 657617c7f44Sjakemsr V4L2_CID_BACKLIGHT_COMPENSATION, 658617c7f44Sjakemsr V4L2_CTRL_TYPE_INTEGER, 659617c7f44Sjakemsr "Backlight Compensation", 660617c7f44Sjakemsr 8, 661617c7f44Sjakemsr PU_BACKLIGHT_COMPENSATION_CONTROL, 662617c7f44Sjakemsr 2, 663767e272eSjakemsr 0 664617c7f44Sjakemsr }, 665617c7f44Sjakemsr { 6662ee56f53Smglocker V4L2_CID_GAIN, 6672ee56f53Smglocker V4L2_CTRL_TYPE_INTEGER, 6682ee56f53Smglocker "Gain", 669617c7f44Sjakemsr 9, 6702ee56f53Smglocker PU_GAIN_CONTROL, 6712ee56f53Smglocker 2, 672767e272eSjakemsr 0 6732ee56f53Smglocker }, 674617c7f44Sjakemsr { 675617c7f44Sjakemsr V4L2_CID_POWER_LINE_FREQUENCY, 676617c7f44Sjakemsr V4L2_CTRL_TYPE_MENU, 677617c7f44Sjakemsr "Power Line Frequency", 678617c7f44Sjakemsr 10, 679617c7f44Sjakemsr PU_POWER_LINE_FREQUENCY_CONTROL, 680767e272eSjakemsr 2, 681767e272eSjakemsr 0 682617c7f44Sjakemsr }, 683617c7f44Sjakemsr { 684617c7f44Sjakemsr V4L2_CID_HUE_AUTO, 685617c7f44Sjakemsr V4L2_CTRL_TYPE_BOOLEAN, 686617c7f44Sjakemsr "Hue Auto", 687617c7f44Sjakemsr 11, 688617c7f44Sjakemsr PU_HUE_AUTO_CONTROL, 689617c7f44Sjakemsr 1, 690767e272eSjakemsr 0 691617c7f44Sjakemsr }, 692617c7f44Sjakemsr { 693617c7f44Sjakemsr V4L2_CID_AUTO_WHITE_BALANCE, 694617c7f44Sjakemsr V4L2_CTRL_TYPE_BOOLEAN, 695617c7f44Sjakemsr "White Balance Temperature Auto", 696617c7f44Sjakemsr 12, 697617c7f44Sjakemsr PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL, 698617c7f44Sjakemsr 1, 699767e272eSjakemsr 0 700617c7f44Sjakemsr }, 701617c7f44Sjakemsr { 702617c7f44Sjakemsr V4L2_CID_AUTO_WHITE_BALANCE, 703617c7f44Sjakemsr V4L2_CTRL_TYPE_BOOLEAN, 704617c7f44Sjakemsr "White Balance Component Auto", 705617c7f44Sjakemsr 13, 706617c7f44Sjakemsr PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL, 707617c7f44Sjakemsr 1, 708767e272eSjakemsr 0 709617c7f44Sjakemsr }, 710617c7f44Sjakemsr #if 0 711617c7f44Sjakemsr /* XXX No V4L2 CID for these controls? */ 712617c7f44Sjakemsr { 713617c7f44Sjakemsr V4L2_CID_XXX, 714617c7f44Sjakemsr V4L2_CTRL_TYPE_INTEGER, 715617c7f44Sjakemsr "Digital Multiplier", 716617c7f44Sjakemsr 14, 717617c7f44Sjakemsr PU_DIGITAL_MULTIPLIER_CONTROL, 718617c7f44Sjakemsr 2, 719767e272eSjakemsr 0 720617c7f44Sjakemsr }, 721617c7f44Sjakemsr { 722617c7f44Sjakemsr V4L2_CID_XXX, 723617c7f44Sjakemsr V4L2_CTRL_TYPE_INTEGER, 724617c7f44Sjakemsr "Digital Multiplier Limit", 725617c7f44Sjakemsr 15, 726617c7f44Sjakemsr PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL, 727617c7f44Sjakemsr 2, 728767e272eSjakemsr 0 729617c7f44Sjakemsr }, 730617c7f44Sjakemsr { 731617c7f44Sjakemsr V4L2_CID_XXX, 732617c7f44Sjakemsr V4L2_CTRL_TYPE_INTEGER, 733617c7f44Sjakemsr "Analog Video Standard", 734617c7f44Sjakemsr 16, 735617c7f44Sjakemsr PU_ANALOG_VIDEO_STANDARD_CONTROL, 736617c7f44Sjakemsr 1, 737767e272eSjakemsr 0 738617c7f44Sjakemsr }, 739617c7f44Sjakemsr { 740617c7f44Sjakemsr V4L2_CID_XXX, 741617c7f44Sjakemsr V4L2_CTRL_TYPE_INTEGER, 742617c7f44Sjakemsr "Analog Lock Status", 743617c7f44Sjakemsr 17, 744617c7f44Sjakemsr PU_ANALOG_LOCK_STATUS_CONTROL, 745617c7f44Sjakemsr 1, 746767e272eSjakemsr 0 747617c7f44Sjakemsr }, 748617c7f44Sjakemsr #endif 749767e272eSjakemsr { 0, 0, "", 0, 0, 0, 0 } 7502ee56f53Smglocker }; 751