bool msController::claim(Device_t *dev, int type, const uint8_t *descriptors, uint32_t len)
{
println("msController claim this=", (uint32_t)this, HEX);
// only claim at interface level
if (type != 1) return false;
if (len < 9+7+7) return false; // Interface descriptor + 2 endpoint decriptors
print_hexbytes(descriptors, len);
uint32_t numendpoint = descriptors[4];
if (numendpoint < 1) return false;
if (descriptors[5] != 8) return false; // bInterfaceClass, 8 = MASS Storage class
if (descriptors[6] != 6) return false; // bInterfaceSubClass, 6 = SCSI transparent command set (SCSI Standards)
if (descriptors[7] != 80) return false; // bInterfaceProtocol, 80 = BULK-ONLY TRANSPORT
#if 1
uint8_t desc_index = 9;
uint8_t in_index = 0xff, out_index = 0xff;
println("numendpoint=", numendpoint, HEX);
while (numendpoint--) {
if ((descriptors[desc_index] != 7) || (descriptors[desc_index+1] != 5)) return false; // not an end point
if (descriptors[desc_index+3] == 2) { // Bulk end point
if (descriptors[desc_index+2] & 0x80)
in_index = desc_index;
else
out_index = desc_index;
}
desc_index += 7; // point to next one...
}
if ((in_index == 0xff) || (out_index == 0xff)) return false; // did not find end point
endpointIn = descriptors[in_index+2]; // bulk-in descriptor 1 81h
endpointOut = descriptors[out_index+2]; // bulk-out descriptor 2 02h
println("endpointIn=", endpointIn, HEX);
println("endpointOut=", endpointOut, HEX);
uint32_t sizeIn = descriptors[in_index+4] | (descriptors[in_index+5] << 8);
println("packet size in (msController) = ", sizeIn);
uint32_t sizeOut = descriptors[out_index+4] | (descriptors[out_index+5] << 8);
println("packet size out (msController) = ", sizeOut);
packetSizeIn = sizeIn;
packetSizeOut = sizeOut;
uint32_t intervalIn = descriptors[in_index+6];
uint32_t intervalOut = descriptors[out_index+6];
println("polling intervalIn = ", intervalIn);
println("polling intervalOut = ", intervalOut);
datapipeIn = new_Pipe(dev, 2, endpointIn, 1, packetSizeIn, intervalIn);
datapipeOut = new_Pipe(dev, 2, endpointOut, 0, packetSizeOut, intervalOut);
#else
if (descriptors[10] != 5 || descriptors[17] != 5) return false; // Must have bulk-in and bulk-out endpoints
uint8_t endpointType = (descriptors[12] | descriptors[19]) & 0x03;
println("endpointType = ",endpointType);
endpointIn = descriptors[11]; // bulk-in descriptor 1 81h
endpointOut = descriptors[18]; // bulk-out descriptor 2 02h
if ((endpointIn & 0xF0) != 0x80) return false; // must be IN direction
if ((endpointOut & 0xF0) != 0x00) return false; // must be OUT direction
println("numendpoint=", numendpoint, HEX);
println("endpointIn=", endpointIn, HEX);
println("endpointOut=", endpointOut, HEX);
uint32_t sizeIn = descriptors[13] | (descriptors[14] << 8);
println("packet size in (msController) = ", sizeIn);
uint32_t sizeOut = descriptors[20] | (descriptors[21] << 8);
println("packet size out (msController) = ", sizeOut);
packetSizeIn = sizeIn;
packetSizeOut = sizeOut;
uint32_t intervalIn = descriptors[15];
uint32_t intervalOut = descriptors[22];
println("polling intervalIn = ", intervalIn);
println("polling intervalOut = ", intervalOut);
datapipeIn = new_Pipe(dev, 2, endpointIn, 1, packetSizeIn, intervalIn);
datapipeOut = new_Pipe(dev, 2, endpointOut, 0, packetSizeOut, intervalOut);
#endif
datapipeIn->callback_function = callbackIn;
datapipeOut->callback_function = callbackOut;
msOutCompleted = false;
msInCompleted = false;
deviceAvailable = true;
return true;
}