Junichi Katsu / Mbed 2 deprecated BLEControl

Dependencies:   FatFileSystem TB6612FNG2 mbed

Committer:
mbed_Cookbook_SE
Date:
Mon Nov 30 09:32:15 2015 +0000
Revision:
0:de03cbbcd0ff
??

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_Cookbook_SE 0:de03cbbcd0ff 1 #include "mbed.h"
mbed_Cookbook_SE 0:de03cbbcd0ff 2 #include "uvc.h"
mbed_Cookbook_SE 0:de03cbbcd0ff 3 #define __DEBUG
mbed_Cookbook_SE 0:de03cbbcd0ff 4 #include "mydbg.h"
mbed_Cookbook_SE 0:de03cbbcd0ff 5 #include "stcamcfg.h"
mbed_Cookbook_SE 0:de03cbbcd0ff 6 #include "Utils.h"
mbed_Cookbook_SE 0:de03cbbcd0ff 7
mbed_Cookbook_SE 0:de03cbbcd0ff 8 #define DESCRIPTOR_TYPE_DEVICE 1
mbed_Cookbook_SE 0:de03cbbcd0ff 9 #define DESCRIPTOR_TYPE_CONFIGURATION 2
mbed_Cookbook_SE 0:de03cbbcd0ff 10 #define DESCRIPTOR_TYPE_STRING 3
mbed_Cookbook_SE 0:de03cbbcd0ff 11 #define DESCRIPTOR_TYPE_INTERFACE 4
mbed_Cookbook_SE 0:de03cbbcd0ff 12 #define DESCRIPTOR_TYPE_ENDPOINT 5
mbed_Cookbook_SE 0:de03cbbcd0ff 13
mbed_Cookbook_SE 0:de03cbbcd0ff 14 #define DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION 0x0b
mbed_Cookbook_SE 0:de03cbbcd0ff 15
mbed_Cookbook_SE 0:de03cbbcd0ff 16 #define DESCRIPTOR_TYPE_HID 0x21
mbed_Cookbook_SE 0:de03cbbcd0ff 17 #define DESCRIPTOR_TYPE_REPORT 0x22
mbed_Cookbook_SE 0:de03cbbcd0ff 18 #define DESCRIPTOR_TYPE_PHYSICAL 0x23
mbed_Cookbook_SE 0:de03cbbcd0ff 19 #define DESCRIPTOR_TYPE_CS_INTERFACE 0x24
mbed_Cookbook_SE 0:de03cbbcd0ff 20 #define DESCRIPTOR_TYPE_CS_ENDPOINT 0x25
mbed_Cookbook_SE 0:de03cbbcd0ff 21 #define DESCRIPTOR_TYPE_HUB 0x29
mbed_Cookbook_SE 0:de03cbbcd0ff 22
mbed_Cookbook_SE 0:de03cbbcd0ff 23 #define CLASS_AUDIO 0x02
mbed_Cookbook_SE 0:de03cbbcd0ff 24 #define CLASS_HUB 0x09
mbed_Cookbook_SE 0:de03cbbcd0ff 25
mbed_Cookbook_SE 0:de03cbbcd0ff 26 #define IF_EQ_THEN_PRINTF(A,B) if (A == B) {VERBOSE("%s\n", #A);
mbed_Cookbook_SE 0:de03cbbcd0ff 27 #define ENDIF }
mbed_Cookbook_SE 0:de03cbbcd0ff 28
mbed_Cookbook_SE 0:de03cbbcd0ff 29 #define AC_HEADER 0x01
mbed_Cookbook_SE 0:de03cbbcd0ff 30 #define AC_INPUT_TERMINAL 0x02
mbed_Cookbook_SE 0:de03cbbcd0ff 31 #define AC_OUTPUT_TERMINAL 0x03
mbed_Cookbook_SE 0:de03cbbcd0ff 32 #define AC_FEATURE_UNIT 0x06
mbed_Cookbook_SE 0:de03cbbcd0ff 33
mbed_Cookbook_SE 0:de03cbbcd0ff 34 // Input Terminal Types
mbed_Cookbook_SE 0:de03cbbcd0ff 35 #define ITT_CAMERA 0x0201
mbed_Cookbook_SE 0:de03cbbcd0ff 36
mbed_Cookbook_SE 0:de03cbbcd0ff 37
mbed_Cookbook_SE 0:de03cbbcd0ff 38 void _parserAudioControl(uint8_t* buf, int len) {
mbed_Cookbook_SE 0:de03cbbcd0ff 39 int subtype = buf[2];
mbed_Cookbook_SE 0:de03cbbcd0ff 40 IF_EQ_THEN_PRINTF(AC_HEADER, subtype)
mbed_Cookbook_SE 0:de03cbbcd0ff 41 VERBOSE("ADC: %04x\n", LE16(buf+3));
mbed_Cookbook_SE 0:de03cbbcd0ff 42 VERBOSE("TotalLength: %d\n", LE16(buf+5));
mbed_Cookbook_SE 0:de03cbbcd0ff 43 VERBOSE("InCollection: %d\n", buf[7]);
mbed_Cookbook_SE 0:de03cbbcd0ff 44 for (int n = 1; n <= buf[7]; n++) {
mbed_Cookbook_SE 0:de03cbbcd0ff 45 VERBOSE("aInterfaceNr(%d): %d\n", n, buf[8+n-1]);
mbed_Cookbook_SE 0:de03cbbcd0ff 46 }
mbed_Cookbook_SE 0:de03cbbcd0ff 47 ENDIF
mbed_Cookbook_SE 0:de03cbbcd0ff 48 IF_EQ_THEN_PRINTF(AC_INPUT_TERMINAL, subtype)
mbed_Cookbook_SE 0:de03cbbcd0ff 49 VERBOSE("TerminalID: %d\n", buf[3]);
mbed_Cookbook_SE 0:de03cbbcd0ff 50 VERBOSE("TerminalType: %04X\n", LE16(buf+4));
mbed_Cookbook_SE 0:de03cbbcd0ff 51 VERBOSE("AssocTermianl: %d\n", buf[6]);
mbed_Cookbook_SE 0:de03cbbcd0ff 52 VERBOSE("NrChannels: %d\n", buf[7]);
mbed_Cookbook_SE 0:de03cbbcd0ff 53 ENDIF
mbed_Cookbook_SE 0:de03cbbcd0ff 54 IF_EQ_THEN_PRINTF(AC_OUTPUT_TERMINAL, subtype)
mbed_Cookbook_SE 0:de03cbbcd0ff 55 VERBOSE("TerminalID: %d\n", buf[3]);
mbed_Cookbook_SE 0:de03cbbcd0ff 56 VERBOSE("TerminalType: %04X\n", LE16(buf+4));
mbed_Cookbook_SE 0:de03cbbcd0ff 57 VERBOSE("AssocTermianl: %d\n", buf[6]);
mbed_Cookbook_SE 0:de03cbbcd0ff 58 ENDIF
mbed_Cookbook_SE 0:de03cbbcd0ff 59 IF_EQ_THEN_PRINTF(AC_FEATURE_UNIT, subtype)
mbed_Cookbook_SE 0:de03cbbcd0ff 60 VERBOSE("UnitID: %d\n", buf[3]);
mbed_Cookbook_SE 0:de03cbbcd0ff 61 VERBOSE("SourceID: %d\n", buf[4]);
mbed_Cookbook_SE 0:de03cbbcd0ff 62 VERBOSE("ControlSize: %d\n", buf[5]);
mbed_Cookbook_SE 0:de03cbbcd0ff 63 ENDIF
mbed_Cookbook_SE 0:de03cbbcd0ff 64 }
mbed_Cookbook_SE 0:de03cbbcd0ff 65
mbed_Cookbook_SE 0:de03cbbcd0ff 66 #define AS_GENERAL 0x01
mbed_Cookbook_SE 0:de03cbbcd0ff 67 #define AS_FORMAT_TYPE 0x02
mbed_Cookbook_SE 0:de03cbbcd0ff 68
mbed_Cookbook_SE 0:de03cbbcd0ff 69 void _parserAudioStream(uint8_t* buf, int len) {
mbed_Cookbook_SE 0:de03cbbcd0ff 70 int subtype = buf[2];
mbed_Cookbook_SE 0:de03cbbcd0ff 71 IF_EQ_THEN_PRINTF(AS_GENERAL, subtype)
mbed_Cookbook_SE 0:de03cbbcd0ff 72 VERBOSE("TerminalLink: %d\n", buf[3]);
mbed_Cookbook_SE 0:de03cbbcd0ff 73 VERBOSE("Delay: %d\n", buf[4]);
mbed_Cookbook_SE 0:de03cbbcd0ff 74 VERBOSE("FormatTag: %04x\n", LE16(buf+5));
mbed_Cookbook_SE 0:de03cbbcd0ff 75 ENDIF
mbed_Cookbook_SE 0:de03cbbcd0ff 76 IF_EQ_THEN_PRINTF(AS_FORMAT_TYPE, subtype)
mbed_Cookbook_SE 0:de03cbbcd0ff 77 VERBOSE("FormatType: %d\n", buf[3]);
mbed_Cookbook_SE 0:de03cbbcd0ff 78 VERBOSE("NrChannels: %d\n", buf[4]);
mbed_Cookbook_SE 0:de03cbbcd0ff 79 VERBOSE("SubFrameSize: %d\n", buf[5]);
mbed_Cookbook_SE 0:de03cbbcd0ff 80 VERBOSE("BitResolution: %d\n", buf[6]);
mbed_Cookbook_SE 0:de03cbbcd0ff 81 VERBOSE("SamFreqType: %d\n", buf[7]);
mbed_Cookbook_SE 0:de03cbbcd0ff 82 VERBOSE("SamFreq(1): %d\n", LE24(buf+8));
mbed_Cookbook_SE 0:de03cbbcd0ff 83 ENDIF
mbed_Cookbook_SE 0:de03cbbcd0ff 84 }
mbed_Cookbook_SE 0:de03cbbcd0ff 85
mbed_Cookbook_SE 0:de03cbbcd0ff 86 #define CC_VIDEO 0x0e
mbed_Cookbook_SE 0:de03cbbcd0ff 87
mbed_Cookbook_SE 0:de03cbbcd0ff 88 #define SC_VIDEOCONTROL 0x01
mbed_Cookbook_SE 0:de03cbbcd0ff 89 #define SC_VIDEOSTREAMING 0x02
mbed_Cookbook_SE 0:de03cbbcd0ff 90
mbed_Cookbook_SE 0:de03cbbcd0ff 91 #define VC_HEADER 0x01
mbed_Cookbook_SE 0:de03cbbcd0ff 92 #define VC_INPUT_TERMINAL 0x02
mbed_Cookbook_SE 0:de03cbbcd0ff 93 #define VC_OUTPUT_TERMINAL 0x03
mbed_Cookbook_SE 0:de03cbbcd0ff 94 #define VC_SELECTOR_UNIT 0x04
mbed_Cookbook_SE 0:de03cbbcd0ff 95 #define VC_PROCESSING_UNIT 0x05
mbed_Cookbook_SE 0:de03cbbcd0ff 96 #define VC_EXTENSION_UNIT 0x06
mbed_Cookbook_SE 0:de03cbbcd0ff 97
mbed_Cookbook_SE 0:de03cbbcd0ff 98 void _parserVideoControl(uint8_t* buf, int len) {
mbed_Cookbook_SE 0:de03cbbcd0ff 99 int subtype = buf[2];
mbed_Cookbook_SE 0:de03cbbcd0ff 100 IF_EQ_THEN_PRINTF(VC_HEADER, subtype)
mbed_Cookbook_SE 0:de03cbbcd0ff 101 VERBOSE("UVC: %04x\n", LE16(buf+3));
mbed_Cookbook_SE 0:de03cbbcd0ff 102 VERBOSE("TotalLength: %d\n", LE16(buf+5));
mbed_Cookbook_SE 0:de03cbbcd0ff 103 VERBOSE("ClockFrequency: %d\n", LE32(buf+7));
mbed_Cookbook_SE 0:de03cbbcd0ff 104 VERBOSE("InCollection: %d\n", buf[11]);
mbed_Cookbook_SE 0:de03cbbcd0ff 105 VERBOSE("aInterfaceNr(1): %d\n", buf[12]);
mbed_Cookbook_SE 0:de03cbbcd0ff 106 ENDIF
mbed_Cookbook_SE 0:de03cbbcd0ff 107 IF_EQ_THEN_PRINTF(VC_INPUT_TERMINAL, subtype)
mbed_Cookbook_SE 0:de03cbbcd0ff 108 VERBOSE("TerminalID: %d\n", buf[3]);
mbed_Cookbook_SE 0:de03cbbcd0ff 109 uint16_t tt = LE16(buf+4);
mbed_Cookbook_SE 0:de03cbbcd0ff 110 VERBOSE("TerminalType: %04X\n", tt);
mbed_Cookbook_SE 0:de03cbbcd0ff 111 VERBOSE("AssocTerminal: %d\n", buf[6]);
mbed_Cookbook_SE 0:de03cbbcd0ff 112 VERBOSE("Terminal: %d\n", buf[7]);
mbed_Cookbook_SE 0:de03cbbcd0ff 113 if (tt == ITT_CAMERA) { // camera
mbed_Cookbook_SE 0:de03cbbcd0ff 114 int bControlSize = buf[14];
mbed_Cookbook_SE 0:de03cbbcd0ff 115 VERBOSE("ControlSize: %d\n", bControlSize);
mbed_Cookbook_SE 0:de03cbbcd0ff 116 for(int i = 0; i < bControlSize; i++) {
mbed_Cookbook_SE 0:de03cbbcd0ff 117 uint8_t bControls = buf[15+i];
mbed_Cookbook_SE 0:de03cbbcd0ff 118 VERBOSE("Controls(%d): %02X\n", i, bControls);
mbed_Cookbook_SE 0:de03cbbcd0ff 119 }
mbed_Cookbook_SE 0:de03cbbcd0ff 120 }
mbed_Cookbook_SE 0:de03cbbcd0ff 121 ENDIF
mbed_Cookbook_SE 0:de03cbbcd0ff 122 IF_EQ_THEN_PRINTF(VC_OUTPUT_TERMINAL, subtype)
mbed_Cookbook_SE 0:de03cbbcd0ff 123 VERBOSE("TerminalID: %d\n", buf[3]);
mbed_Cookbook_SE 0:de03cbbcd0ff 124 VERBOSE("TerminalType: %04X\n", LE16(buf+4));
mbed_Cookbook_SE 0:de03cbbcd0ff 125 VERBOSE("AssocTerminal: %d\n", buf[6]);
mbed_Cookbook_SE 0:de03cbbcd0ff 126 VERBOSE("SourceID: %d\n", buf[7]);
mbed_Cookbook_SE 0:de03cbbcd0ff 127 VERBOSE("Terminal: %d\n", buf[8]);
mbed_Cookbook_SE 0:de03cbbcd0ff 128 ENDIF
mbed_Cookbook_SE 0:de03cbbcd0ff 129 IF_EQ_THEN_PRINTF(VC_SELECTOR_UNIT, subtype)
mbed_Cookbook_SE 0:de03cbbcd0ff 130 VERBOSE("UnitID: %d\n", buf[3]);
mbed_Cookbook_SE 0:de03cbbcd0ff 131 ENDIF
mbed_Cookbook_SE 0:de03cbbcd0ff 132 IF_EQ_THEN_PRINTF(VC_PROCESSING_UNIT, subtype)
mbed_Cookbook_SE 0:de03cbbcd0ff 133 VERBOSE("UnitID: %d\n", buf[3]);
mbed_Cookbook_SE 0:de03cbbcd0ff 134 VERBOSE("SourceID: %d\n", buf[4]);
mbed_Cookbook_SE 0:de03cbbcd0ff 135 VERBOSE("MaxMultiplier: %d\n", LE16(buf+5));
mbed_Cookbook_SE 0:de03cbbcd0ff 136 VERBOSE("ControlSize: %d\n", buf[7]);
mbed_Cookbook_SE 0:de03cbbcd0ff 137 int pos = 8;
mbed_Cookbook_SE 0:de03cbbcd0ff 138 for (int n = 1; n <= buf[7]; n++) {
mbed_Cookbook_SE 0:de03cbbcd0ff 139 VERBOSE("Controls(%d): %02X\n", n , buf[pos]);
mbed_Cookbook_SE 0:de03cbbcd0ff 140 pos++;
mbed_Cookbook_SE 0:de03cbbcd0ff 141 }
mbed_Cookbook_SE 0:de03cbbcd0ff 142 VERBOSE("Processing: %d\n", buf[pos]);
mbed_Cookbook_SE 0:de03cbbcd0ff 143 pos++;
mbed_Cookbook_SE 0:de03cbbcd0ff 144 VERBOSE("VideoStanders: %02X\n", buf[pos]);
mbed_Cookbook_SE 0:de03cbbcd0ff 145 ENDIF
mbed_Cookbook_SE 0:de03cbbcd0ff 146 IF_EQ_THEN_PRINTF(VC_EXTENSION_UNIT, subtype)
mbed_Cookbook_SE 0:de03cbbcd0ff 147 VERBOSE("UnitID: %d\n", buf[3]);
mbed_Cookbook_SE 0:de03cbbcd0ff 148 ENDIF
mbed_Cookbook_SE 0:de03cbbcd0ff 149 }
mbed_Cookbook_SE 0:de03cbbcd0ff 150
mbed_Cookbook_SE 0:de03cbbcd0ff 151 #define VS_INPUT_HEADER 0x01
mbed_Cookbook_SE 0:de03cbbcd0ff 152 #define VS_STILL_FRAME 0x03
mbed_Cookbook_SE 0:de03cbbcd0ff 153 #define VS_FORMAT_UNCOMPRESSED 0x04
mbed_Cookbook_SE 0:de03cbbcd0ff 154 #define VS_FRAME_UNCOMPRESSED 0x05
mbed_Cookbook_SE 0:de03cbbcd0ff 155 #define VS_FORMAT_MJPEG 0x06
mbed_Cookbook_SE 0:de03cbbcd0ff 156 #define VS_FRAME_MJPEG 0x07
mbed_Cookbook_SE 0:de03cbbcd0ff 157 #define VS_COLOR_FORMAT 0x0d
mbed_Cookbook_SE 0:de03cbbcd0ff 158
mbed_Cookbook_SE 0:de03cbbcd0ff 159 void _parserVideoStream(struct stcamcfg* cfg, uint8_t* buf, int len) {
mbed_Cookbook_SE 0:de03cbbcd0ff 160 int subtype = buf[2];
mbed_Cookbook_SE 0:de03cbbcd0ff 161 IF_EQ_THEN_PRINTF(VS_INPUT_HEADER, subtype)
mbed_Cookbook_SE 0:de03cbbcd0ff 162 VERBOSE("NumFormats: %d\n", buf[3]);
mbed_Cookbook_SE 0:de03cbbcd0ff 163 VERBOSE("TotalLength: %d\n", LE16(buf+4));
mbed_Cookbook_SE 0:de03cbbcd0ff 164 VERBOSE("EndpointAddress: %02X\n", buf[6]);
mbed_Cookbook_SE 0:de03cbbcd0ff 165 VERBOSE("Info: %02X\n", buf[7]);
mbed_Cookbook_SE 0:de03cbbcd0ff 166 VERBOSE("TerminalLink: %d\n", buf[8]);
mbed_Cookbook_SE 0:de03cbbcd0ff 167 VERBOSE("StillCaptureMethod: %d\n", buf[9]);
mbed_Cookbook_SE 0:de03cbbcd0ff 168 VERBOSE("TriggerSupport: %d\n", buf[10]);
mbed_Cookbook_SE 0:de03cbbcd0ff 169 VERBOSE("TriggerUsage: %d\n", buf[11]);
mbed_Cookbook_SE 0:de03cbbcd0ff 170 VERBOSE("ControlSize: %d\n", buf[12]);
mbed_Cookbook_SE 0:de03cbbcd0ff 171 int pos = 13;
mbed_Cookbook_SE 0:de03cbbcd0ff 172 for (int n = 1; n <= buf[12]; n++) {
mbed_Cookbook_SE 0:de03cbbcd0ff 173 VERBOSE("Controls(%d): %02X\n", n, buf[pos]);
mbed_Cookbook_SE 0:de03cbbcd0ff 174 pos++;
mbed_Cookbook_SE 0:de03cbbcd0ff 175 }
mbed_Cookbook_SE 0:de03cbbcd0ff 176 cfg->bEndpointAddress = buf[6];
mbed_Cookbook_SE 0:de03cbbcd0ff 177 ENDIF
mbed_Cookbook_SE 0:de03cbbcd0ff 178 IF_EQ_THEN_PRINTF(VS_STILL_FRAME, subtype)
mbed_Cookbook_SE 0:de03cbbcd0ff 179 VERBOSE("EndpointAdress: %02X\n", buf[3]);
mbed_Cookbook_SE 0:de03cbbcd0ff 180 VERBOSE("NumImageSizePatterns: %d\n", buf[4]);
mbed_Cookbook_SE 0:de03cbbcd0ff 181 int ptn = buf[4];
mbed_Cookbook_SE 0:de03cbbcd0ff 182 int pos = 5;
mbed_Cookbook_SE 0:de03cbbcd0ff 183 for (int n = 1; n <= ptn; n++) {
mbed_Cookbook_SE 0:de03cbbcd0ff 184 VERBOSE("Width(%d): %d\n", n, LE16(buf+pos));
mbed_Cookbook_SE 0:de03cbbcd0ff 185 VERBOSE("Height(%d): %d\n", n, LE16(buf+pos+2));
mbed_Cookbook_SE 0:de03cbbcd0ff 186 pos += 4;
mbed_Cookbook_SE 0:de03cbbcd0ff 187 }
mbed_Cookbook_SE 0:de03cbbcd0ff 188 VERBOSE("NumCompressPtn: %d\n", buf[pos]);
mbed_Cookbook_SE 0:de03cbbcd0ff 189 ptn = buf[pos++];
mbed_Cookbook_SE 0:de03cbbcd0ff 190 for (int n = 1; n <= ptn; n++) {
mbed_Cookbook_SE 0:de03cbbcd0ff 191 VERBOSE("Compress(%d): %d\n", n, buf[pos]);
mbed_Cookbook_SE 0:de03cbbcd0ff 192 pos++;
mbed_Cookbook_SE 0:de03cbbcd0ff 193 }
mbed_Cookbook_SE 0:de03cbbcd0ff 194 ENDIF
mbed_Cookbook_SE 0:de03cbbcd0ff 195 IF_EQ_THEN_PRINTF(VS_FORMAT_UNCOMPRESSED, subtype)
mbed_Cookbook_SE 0:de03cbbcd0ff 196 VERBOSE("FormatIndex: %d\n", buf[3]);
mbed_Cookbook_SE 0:de03cbbcd0ff 197 VERBOSE("NumFrameDescriptors: %d\n", buf[4]);
mbed_Cookbook_SE 0:de03cbbcd0ff 198 uint32_t guid = LE32(buf+5);
mbed_Cookbook_SE 0:de03cbbcd0ff 199 if (guid == 0x32595559) {
mbed_Cookbook_SE 0:de03cbbcd0ff 200 VERBOSE("GUID: YUY2\n");
mbed_Cookbook_SE 0:de03cbbcd0ff 201 } else if (guid == 0x3231564e) {
mbed_Cookbook_SE 0:de03cbbcd0ff 202 VERBOSE("GUID: NV12\n");
mbed_Cookbook_SE 0:de03cbbcd0ff 203 } else {
mbed_Cookbook_SE 0:de03cbbcd0ff 204 VERBOSE("GUID: %08x\n", guid);
mbed_Cookbook_SE 0:de03cbbcd0ff 205 }
mbed_Cookbook_SE 0:de03cbbcd0ff 206 VERBOSE("DefaultFrameIndex: %d\n", buf[22]);
mbed_Cookbook_SE 0:de03cbbcd0ff 207 if (cfg->payload == PAYLOAD_YUY2) {
mbed_Cookbook_SE 0:de03cbbcd0ff 208 cfg->FormatIndex = buf[3];
mbed_Cookbook_SE 0:de03cbbcd0ff 209 }
mbed_Cookbook_SE 0:de03cbbcd0ff 210 ENDIF
mbed_Cookbook_SE 0:de03cbbcd0ff 211 IF_EQ_THEN_PRINTF(VS_FRAME_UNCOMPRESSED, subtype)
mbed_Cookbook_SE 0:de03cbbcd0ff 212 VERBOSE("FrameIndex: %d\n", buf[3]);
mbed_Cookbook_SE 0:de03cbbcd0ff 213 VERBOSE("Capabilites: %d\n", buf[4]);
mbed_Cookbook_SE 0:de03cbbcd0ff 214 VERBOSE("Width: %d\n", LE16(buf+5));
mbed_Cookbook_SE 0:de03cbbcd0ff 215 VERBOSE("Height: %d\n", LE16(buf+7));
mbed_Cookbook_SE 0:de03cbbcd0ff 216 VERBOSE("MinBitRate: %d\n", LE32(buf+9));
mbed_Cookbook_SE 0:de03cbbcd0ff 217 VERBOSE("MaxBitRate: %d\n", LE32(buf+13));
mbed_Cookbook_SE 0:de03cbbcd0ff 218 VERBOSE("MaxVideoFrameBufferSize: %d\n", LE32(buf+17));
mbed_Cookbook_SE 0:de03cbbcd0ff 219 VERBOSE("DefaultFrameInterval: %d\n", LE32(buf+21));
mbed_Cookbook_SE 0:de03cbbcd0ff 220 VERBOSE("FrameIntervalType: %d\n", buf[25]);
mbed_Cookbook_SE 0:de03cbbcd0ff 221 int it = buf[25];
mbed_Cookbook_SE 0:de03cbbcd0ff 222 uint32_t max_fi = 333333; // 30.0fps
mbed_Cookbook_SE 0:de03cbbcd0ff 223 if (it == 0) {
mbed_Cookbook_SE 0:de03cbbcd0ff 224 VERBOSE("FrameMinInterval: %d\n", buf[26]);
mbed_Cookbook_SE 0:de03cbbcd0ff 225 VERBOSE("FrameMaxInterval: %d\n", buf[30]);
mbed_Cookbook_SE 0:de03cbbcd0ff 226 VERBOSE("FrameIntervalStep: %d\n", buf[34]);
mbed_Cookbook_SE 0:de03cbbcd0ff 227 } else {
mbed_Cookbook_SE 0:de03cbbcd0ff 228 int pos = 26;
mbed_Cookbook_SE 0:de03cbbcd0ff 229 for (int n = 1; n <= it; n++) {
mbed_Cookbook_SE 0:de03cbbcd0ff 230 uint32_t fi = LE32(buf+pos);
mbed_Cookbook_SE 0:de03cbbcd0ff 231 if (fi >= max_fi) {
mbed_Cookbook_SE 0:de03cbbcd0ff 232 max_fi = fi;
mbed_Cookbook_SE 0:de03cbbcd0ff 233 }
mbed_Cookbook_SE 0:de03cbbcd0ff 234 float fps = 1e+7 / fi;
mbed_Cookbook_SE 0:de03cbbcd0ff 235 VERBOSE("FrameInterval(%u): %d (%.1f fps)\n", n, fi, fps);
mbed_Cookbook_SE 0:de03cbbcd0ff 236 pos += 4;
mbed_Cookbook_SE 0:de03cbbcd0ff 237 }
mbed_Cookbook_SE 0:de03cbbcd0ff 238 }
mbed_Cookbook_SE 0:de03cbbcd0ff 239 if (cfg->payload == PAYLOAD_YUY2) {
mbed_Cookbook_SE 0:de03cbbcd0ff 240 if (cfg->width == LE16(buf+5) && cfg->height == LE16(buf+7)) {
mbed_Cookbook_SE 0:de03cbbcd0ff 241 cfg->FrameIndex = buf[3];
mbed_Cookbook_SE 0:de03cbbcd0ff 242 }
mbed_Cookbook_SE 0:de03cbbcd0ff 243 if (cfg->dwFrameInterval == 0) {
mbed_Cookbook_SE 0:de03cbbcd0ff 244 cfg->dwFrameInterval = max_fi;
mbed_Cookbook_SE 0:de03cbbcd0ff 245 }
mbed_Cookbook_SE 0:de03cbbcd0ff 246 }
mbed_Cookbook_SE 0:de03cbbcd0ff 247 ENDIF
mbed_Cookbook_SE 0:de03cbbcd0ff 248 IF_EQ_THEN_PRINTF(VS_FORMAT_MJPEG, subtype)
mbed_Cookbook_SE 0:de03cbbcd0ff 249 VERBOSE("FormatIndex: %d\n", buf[3]);
mbed_Cookbook_SE 0:de03cbbcd0ff 250 VERBOSE("NumFrameDescriptors: %d\n", buf[4]);
mbed_Cookbook_SE 0:de03cbbcd0ff 251 VERBOSE("Flags: %d\n", buf[5]);
mbed_Cookbook_SE 0:de03cbbcd0ff 252 VERBOSE("DefaultFrameIndex: %d\n", buf[6]);
mbed_Cookbook_SE 0:de03cbbcd0ff 253 if (cfg->payload == PAYLOAD_MJPEG) {
mbed_Cookbook_SE 0:de03cbbcd0ff 254 cfg->FormatIndex = buf[3];
mbed_Cookbook_SE 0:de03cbbcd0ff 255 }
mbed_Cookbook_SE 0:de03cbbcd0ff 256 ENDIF
mbed_Cookbook_SE 0:de03cbbcd0ff 257 IF_EQ_THEN_PRINTF(VS_FRAME_MJPEG, subtype)
mbed_Cookbook_SE 0:de03cbbcd0ff 258 VERBOSE("FrameIndex: %d\n", buf[3]);
mbed_Cookbook_SE 0:de03cbbcd0ff 259 VERBOSE("Capabilites: %d\n", buf[4]);
mbed_Cookbook_SE 0:de03cbbcd0ff 260 VERBOSE("Width: %d\n", LE16(buf+5));
mbed_Cookbook_SE 0:de03cbbcd0ff 261 VERBOSE("Height: %d\n", LE16(buf+7));
mbed_Cookbook_SE 0:de03cbbcd0ff 262 VERBOSE("MinBitRate: %d\n", LE32(buf+9));
mbed_Cookbook_SE 0:de03cbbcd0ff 263 VERBOSE("MaxBitRate: %d\n", LE32(buf+13));
mbed_Cookbook_SE 0:de03cbbcd0ff 264 VERBOSE("MaxVideoFrameBufferSize: %d\n", LE32(buf+17));
mbed_Cookbook_SE 0:de03cbbcd0ff 265 VERBOSE("DefaultFrameInterval: %d\n", LE32(buf+21));
mbed_Cookbook_SE 0:de03cbbcd0ff 266 VERBOSE("FrameIntervalType: %d\n", buf[25]);
mbed_Cookbook_SE 0:de03cbbcd0ff 267 int it = buf[25];
mbed_Cookbook_SE 0:de03cbbcd0ff 268 uint32_t max_fi = 333333; // 30.0fps
mbed_Cookbook_SE 0:de03cbbcd0ff 269 if (it == 0) {
mbed_Cookbook_SE 0:de03cbbcd0ff 270 VERBOSE("FrameMinInterval: %d\n", buf[26]);
mbed_Cookbook_SE 0:de03cbbcd0ff 271 VERBOSE("FrameMaxInterval: %d\n", buf[30]);
mbed_Cookbook_SE 0:de03cbbcd0ff 272 VERBOSE("FrameIntervalStep: %d\n", buf[34]);
mbed_Cookbook_SE 0:de03cbbcd0ff 273 } else {
mbed_Cookbook_SE 0:de03cbbcd0ff 274 int pos = 26;
mbed_Cookbook_SE 0:de03cbbcd0ff 275 for (int n = 1; n <= it; n++) {
mbed_Cookbook_SE 0:de03cbbcd0ff 276 uint32_t fi = LE32(buf+pos);
mbed_Cookbook_SE 0:de03cbbcd0ff 277 if (fi >= max_fi) {
mbed_Cookbook_SE 0:de03cbbcd0ff 278 max_fi = fi;
mbed_Cookbook_SE 0:de03cbbcd0ff 279 }
mbed_Cookbook_SE 0:de03cbbcd0ff 280 float fps = 1e+7 / fi;
mbed_Cookbook_SE 0:de03cbbcd0ff 281 VERBOSE("FrameInterval(%u): %d (%.1f fps)\n", n, fi, fps);
mbed_Cookbook_SE 0:de03cbbcd0ff 282 pos += 4;
mbed_Cookbook_SE 0:de03cbbcd0ff 283 }
mbed_Cookbook_SE 0:de03cbbcd0ff 284 }
mbed_Cookbook_SE 0:de03cbbcd0ff 285 if (cfg->payload == PAYLOAD_MJPEG) {
mbed_Cookbook_SE 0:de03cbbcd0ff 286 if (cfg->width == LE16(buf+5) && cfg->height == LE16(buf+7)) {
mbed_Cookbook_SE 0:de03cbbcd0ff 287 cfg->FrameIndex = buf[3];
mbed_Cookbook_SE 0:de03cbbcd0ff 288 }
mbed_Cookbook_SE 0:de03cbbcd0ff 289 if (cfg->dwFrameInterval == 0) {
mbed_Cookbook_SE 0:de03cbbcd0ff 290 cfg->dwFrameInterval = max_fi;
mbed_Cookbook_SE 0:de03cbbcd0ff 291 }
mbed_Cookbook_SE 0:de03cbbcd0ff 292 }
mbed_Cookbook_SE 0:de03cbbcd0ff 293 ENDIF
mbed_Cookbook_SE 0:de03cbbcd0ff 294 IF_EQ_THEN_PRINTF(VS_COLOR_FORMAT, subtype)
mbed_Cookbook_SE 0:de03cbbcd0ff 295 ENDIF
mbed_Cookbook_SE 0:de03cbbcd0ff 296 }
mbed_Cookbook_SE 0:de03cbbcd0ff 297
mbed_Cookbook_SE 0:de03cbbcd0ff 298 void _parserConfigurationDescriptor(struct stcamcfg* cfg, uint8_t* buf, int len) {
mbed_Cookbook_SE 0:de03cbbcd0ff 299 //DBG("buf=%p len=%d\n", buf, len);
mbed_Cookbook_SE 0:de03cbbcd0ff 300 //DBG_HEX(buf, len);
mbed_Cookbook_SE 0:de03cbbcd0ff 301 int pos = 0;
mbed_Cookbook_SE 0:de03cbbcd0ff 302 cfg->_IfClass = 0;
mbed_Cookbook_SE 0:de03cbbcd0ff 303 cfg->_IfSubClass = 0;
mbed_Cookbook_SE 0:de03cbbcd0ff 304 while (pos < len) {
mbed_Cookbook_SE 0:de03cbbcd0ff 305 int type = buf[pos+1];
mbed_Cookbook_SE 0:de03cbbcd0ff 306 //DBG_BYTES(TYPE_Str(type), buf+pos, buf[pos]);
mbed_Cookbook_SE 0:de03cbbcd0ff 307 IF_EQ_THEN_PRINTF(DESCRIPTOR_TYPE_CONFIGURATION, type)
mbed_Cookbook_SE 0:de03cbbcd0ff 308 VERBOSE("NumInterfaces: %d\n", buf[pos+4]);
mbed_Cookbook_SE 0:de03cbbcd0ff 309 ENDIF
mbed_Cookbook_SE 0:de03cbbcd0ff 310 IF_EQ_THEN_PRINTF(DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION, type)
mbed_Cookbook_SE 0:de03cbbcd0ff 311 VERBOSE("FirstInterface: %d\n", buf[pos+2]);
mbed_Cookbook_SE 0:de03cbbcd0ff 312 VERBOSE("InterfaceCount: %d\n", buf[pos+3]);
mbed_Cookbook_SE 0:de03cbbcd0ff 313 VERBOSE("FunctionClass: %02X\n", buf[pos+4]);
mbed_Cookbook_SE 0:de03cbbcd0ff 314 VERBOSE("FunctionSubClass: %02X\n", buf[pos+5]);
mbed_Cookbook_SE 0:de03cbbcd0ff 315 VERBOSE("FunctionProtocol: %02X\n", buf[pos+6]);
mbed_Cookbook_SE 0:de03cbbcd0ff 316 VERBOSE("Function: %d\n", buf[pos+7]);
mbed_Cookbook_SE 0:de03cbbcd0ff 317 ENDIF
mbed_Cookbook_SE 0:de03cbbcd0ff 318 IF_EQ_THEN_PRINTF(DESCRIPTOR_TYPE_INTERFACE,type)
mbed_Cookbook_SE 0:de03cbbcd0ff 319 VERBOSE("InterfaceNumber: %d\n", buf[pos+2]);
mbed_Cookbook_SE 0:de03cbbcd0ff 320 VERBOSE("AlternateSetting: %d\n", buf[pos+3]);
mbed_Cookbook_SE 0:de03cbbcd0ff 321 VERBOSE("NumEndpoint: %d\n", buf[pos+4]);
mbed_Cookbook_SE 0:de03cbbcd0ff 322 VERBOSE("InterfaceClass: %02X\n", buf[pos+5]);
mbed_Cookbook_SE 0:de03cbbcd0ff 323 VERBOSE("InterfaceSubClass: %02X\n", buf[pos+6]);
mbed_Cookbook_SE 0:de03cbbcd0ff 324 VERBOSE("InterfaceProtocol: %02X\n", buf[pos+7]);
mbed_Cookbook_SE 0:de03cbbcd0ff 325 VERBOSE("Interface: %d\n", buf[pos+8]);
mbed_Cookbook_SE 0:de03cbbcd0ff 326 cfg->_If = buf[pos+2];
mbed_Cookbook_SE 0:de03cbbcd0ff 327 cfg->_Ifalt = buf[pos+3];
mbed_Cookbook_SE 0:de03cbbcd0ff 328 cfg->_IfClass = buf[pos+5];
mbed_Cookbook_SE 0:de03cbbcd0ff 329 cfg->_IfSubClass = buf[pos+6];
mbed_Cookbook_SE 0:de03cbbcd0ff 330 ENDIF
mbed_Cookbook_SE 0:de03cbbcd0ff 331 IF_EQ_THEN_PRINTF(DESCRIPTOR_TYPE_ENDPOINT, type)
mbed_Cookbook_SE 0:de03cbbcd0ff 332 VERBOSE("EndpointAddress: %02X\n", buf[pos+2]);
mbed_Cookbook_SE 0:de03cbbcd0ff 333 VERBOSE("Attributes: %02X\n", buf[pos+3]);
mbed_Cookbook_SE 0:de03cbbcd0ff 334 VERBOSE("MaxPacketSize: %d\n", LE16(buf+pos+4));
mbed_Cookbook_SE 0:de03cbbcd0ff 335 VERBOSE("Interval: %d\n", buf[pos+6]);
mbed_Cookbook_SE 0:de03cbbcd0ff 336 if (cfg->_IfClass == CC_VIDEO && cfg->_IfSubClass == SC_VIDEOSTREAMING) {
mbed_Cookbook_SE 0:de03cbbcd0ff 337 if (cfg->bEndpointAddress == buf[pos+2]) {
mbed_Cookbook_SE 0:de03cbbcd0ff 338 if (cfg->wMaxPacketSize == 0) {
mbed_Cookbook_SE 0:de03cbbcd0ff 339 cfg->wMaxPacketSize = LE16(buf+pos+4);
mbed_Cookbook_SE 0:de03cbbcd0ff 340 }
mbed_Cookbook_SE 0:de03cbbcd0ff 341 if (cfg->wMaxPacketSize == LE16(buf+pos+4)) {
mbed_Cookbook_SE 0:de03cbbcd0ff 342 cfg->bInterface = cfg->_If;
mbed_Cookbook_SE 0:de03cbbcd0ff 343 cfg->bAlternate = cfg->_Ifalt;
mbed_Cookbook_SE 0:de03cbbcd0ff 344 }
mbed_Cookbook_SE 0:de03cbbcd0ff 345 }
mbed_Cookbook_SE 0:de03cbbcd0ff 346 }
mbed_Cookbook_SE 0:de03cbbcd0ff 347 ENDIF
mbed_Cookbook_SE 0:de03cbbcd0ff 348 IF_EQ_THEN_PRINTF(DESCRIPTOR_TYPE_CS_INTERFACE, type)
mbed_Cookbook_SE 0:de03cbbcd0ff 349 IF_EQ_THEN_PRINTF(CC_VIDEO, cfg->_IfClass)
mbed_Cookbook_SE 0:de03cbbcd0ff 350 IF_EQ_THEN_PRINTF(SC_VIDEOCONTROL, cfg->_IfSubClass)
mbed_Cookbook_SE 0:de03cbbcd0ff 351 _parserVideoControl(buf+pos, buf[pos]);
mbed_Cookbook_SE 0:de03cbbcd0ff 352 ENDIF
mbed_Cookbook_SE 0:de03cbbcd0ff 353 IF_EQ_THEN_PRINTF(SC_VIDEOSTREAMING, cfg->_IfSubClass)
mbed_Cookbook_SE 0:de03cbbcd0ff 354 _parserVideoStream(cfg, buf+pos, buf[pos]);
mbed_Cookbook_SE 0:de03cbbcd0ff 355 ENDIF
mbed_Cookbook_SE 0:de03cbbcd0ff 356 ENDIF
mbed_Cookbook_SE 0:de03cbbcd0ff 357 if (cfg->_IfClass == CLASS_AUDIO) {
mbed_Cookbook_SE 0:de03cbbcd0ff 358 if (cfg->_IfSubClass == 0x01) {
mbed_Cookbook_SE 0:de03cbbcd0ff 359 _parserAudioControl(buf+pos, buf[pos]);
mbed_Cookbook_SE 0:de03cbbcd0ff 360 } else if (cfg->_IfSubClass == 0x02) {
mbed_Cookbook_SE 0:de03cbbcd0ff 361 _parserAudioStream(buf+pos, buf[pos]);
mbed_Cookbook_SE 0:de03cbbcd0ff 362 }
mbed_Cookbook_SE 0:de03cbbcd0ff 363 }
mbed_Cookbook_SE 0:de03cbbcd0ff 364 ENDIF
mbed_Cookbook_SE 0:de03cbbcd0ff 365 IF_EQ_THEN_PRINTF(DESCRIPTOR_TYPE_HUB, type)
mbed_Cookbook_SE 0:de03cbbcd0ff 366 ENDIF
mbed_Cookbook_SE 0:de03cbbcd0ff 367 pos += buf[pos];
mbed_Cookbook_SE 0:de03cbbcd0ff 368 }
mbed_Cookbook_SE 0:de03cbbcd0ff 369 }
mbed_Cookbook_SE 0:de03cbbcd0ff 370
mbed_Cookbook_SE 0:de03cbbcd0ff 371 void uvc::_config(struct stcamcfg* cfg)
mbed_Cookbook_SE 0:de03cbbcd0ff 372 {
mbed_Cookbook_SE 0:de03cbbcd0ff 373 DBG_ASSERT(cfg);
mbed_Cookbook_SE 0:de03cbbcd0ff 374 int index = 0;
mbed_Cookbook_SE 0:de03cbbcd0ff 375 uint8_t temp[4];
mbed_Cookbook_SE 0:de03cbbcd0ff 376 int rc = m_pDev->GetDescriptor(USB_DESCRIPTOR_TYPE_CONFIGURATION, index, temp, sizeof(temp));
mbed_Cookbook_SE 0:de03cbbcd0ff 377 DBG_ASSERT(rc == USBERR_OK);
mbed_Cookbook_SE 0:de03cbbcd0ff 378 DBG_BYTES("Config Descriptor 4bytes", temp, sizeof(temp));
mbed_Cookbook_SE 0:de03cbbcd0ff 379 DBG_ASSERT(temp[0] == 9);
mbed_Cookbook_SE 0:de03cbbcd0ff 380 DBG_ASSERT(temp[1] == 0x02);
mbed_Cookbook_SE 0:de03cbbcd0ff 381 int TotalLength = LE16(temp+2);
mbed_Cookbook_SE 0:de03cbbcd0ff 382 DBG("TotalLength: %d\n", TotalLength);
mbed_Cookbook_SE 0:de03cbbcd0ff 383
mbed_Cookbook_SE 0:de03cbbcd0ff 384 uint8_t* buf = new uint8_t[TotalLength];
mbed_Cookbook_SE 0:de03cbbcd0ff 385 DBG_ASSERT(buf);
mbed_Cookbook_SE 0:de03cbbcd0ff 386 rc = m_pDev->GetDescriptor(USB_DESCRIPTOR_TYPE_CONFIGURATION, index,
mbed_Cookbook_SE 0:de03cbbcd0ff 387 buf, TotalLength);
mbed_Cookbook_SE 0:de03cbbcd0ff 388 DBG_ASSERT(rc == USBERR_OK);
mbed_Cookbook_SE 0:de03cbbcd0ff 389
mbed_Cookbook_SE 0:de03cbbcd0ff 390 _parserConfigurationDescriptor(cfg, buf, TotalLength);
mbed_Cookbook_SE 0:de03cbbcd0ff 391
mbed_Cookbook_SE 0:de03cbbcd0ff 392 DBG("cfg->FrameIndex=%d\n", cfg->FrameIndex);
mbed_Cookbook_SE 0:de03cbbcd0ff 393 DBG("cfg->dwFrameInterval=%u\n", cfg->dwFrameInterval);
mbed_Cookbook_SE 0:de03cbbcd0ff 394
mbed_Cookbook_SE 0:de03cbbcd0ff 395 //DBG_ASSERT(cfg->FormatIndex >= 1);
mbed_Cookbook_SE 0:de03cbbcd0ff 396 //DBG_ASSERT(cfg->FormatIndex <= 2);
mbed_Cookbook_SE 0:de03cbbcd0ff 397 //DBG_ASSERT(cfg->FrameIndex >= 1);
mbed_Cookbook_SE 0:de03cbbcd0ff 398 //DBG_ASSERT(cfg->FrameIndex <= 6);
mbed_Cookbook_SE 0:de03cbbcd0ff 399
mbed_Cookbook_SE 0:de03cbbcd0ff 400 delete[] buf;
mbed_Cookbook_SE 0:de03cbbcd0ff 401 }