Code:
// set interface usb_setup(0, SETUP_TYPE_STANDARD, SETUP_RECIP_INTERFACE, 0x0b, 0, 0, 0, &setup); rv = usb_control_transfer(&setup, NULL, 0); //assert(rv == 0); // get max lun usb_setup(1, SETUP_TYPE_CLASS, SETUP_RECIP_INTERFACE, 0xfe, 0, 0, sizeof(max_lun), &setup); max_rv = usb_control_transfer(&setup, &max_lun, sizeof(max_lun)); //assert(max_rv == 1 && max == 0); scsi_lun = 0;XXX_NEXTLUN_XXX: // inquiry memset(cdb, 0, sizeof(cdb)); cdb[0] = 0x12; // inquiry cdb[4] = 36; rv = scsi_bulk_transfer(1, cdb, 6, buf, 36); if (rv < 0) { return rv; } assert(rv == 36); // test unit ready memset(cdb, 0, sizeof(cdb)); cdb[0] = 0x00; // test unit ready rv = scsi_bulk_transfer(0, cdb, 6, NULL, 0); // request sense memset(cdb, 0, sizeof(cdb)); cdb[0] = 0x03; // request sense cdb[4] = 18; rv = scsi_bulk_transfer(1, cdb, 6, buf, 18); if (rv < 0) { return rv; } assert(rv); // test unit ready memset(cdb, 0, sizeof(cdb)); cdb[0] = 0x00; // test unit ready rv = scsi_bulk_transfer(0, cdb, 6, NULL, 0); if (rv < 0 && max_rv == 1 && scsi_lun < max_lun) { scsi_lun++; goto XXX_NEXTLUN_XXX; } if (rv < 0) { return rv; } // read format capacities memset(cdb, 0, sizeof(cdb)); cdb[0] = 0x23; // read format capacities cdb[8] = sizeof(buf); rv = scsi_bulk_transfer(1, cdb, 12, buf, sizeof(buf)); assert(rv); // read capacity memset(cdb, 0, sizeof(cdb)); cdb[0] = 0x25; // read capacity rv = scsi_bulk_transfer(1, cdb, 10, buf, 8); assert(rv == 8); // request sense memset(cdb, 0, sizeof(cdb)); cdb[0] = 0x03; // request sense cdb[4] = 18; rv = scsi_bulk_transfer(1, cdb, 6, buf, 18); assert(rv); // test unit ready memset(cdb, 0, sizeof(cdb)); cdb[0] = 0x00; // test unit ready rv = scsi_bulk_transfer(0, cdb, 6, NULL, 0);