| @@ -30,6 +30,7 @@ | |||
| #error "USBHost_t36 only works with Teensy 3.6 or Teensy 4.x. Please select it in Tools > Boards" | |||
| #endif | |||
| #include "utility/imxrt_usbhs.h" | |||
| #include "utility/msc.h" | |||
| // Dear inquisitive reader, USB is a complex protocol defined with | |||
| // very specific terminology. To have any chance of understand this | |||
| @@ -1958,5 +1959,83 @@ private: | |||
| Transfer_t mytransfers[7] __attribute__ ((aligned(32))); | |||
| }; | |||
| //-------------------------------------------------------------------------- | |||
| class msController : public USBDriver { | |||
| public: | |||
| msController(USBHost &host) { init(); } | |||
| msController(USBHost *host) { init(); } | |||
| msSCSICapacity_t msCapacity; | |||
| msInquiryResponse_t msInquiry; | |||
| msRequestSenseResponse_t msSense; | |||
| msDriveInfo_t msDriveInfo; | |||
| bool mscTransferComplete = false; | |||
| uint8_t mscInit(void); | |||
| void msReset(); | |||
| uint8_t msGetMaxLun(); | |||
| void msCurrentLun(uint8_t lun) {currentLUN = lun;} | |||
| uint8_t msCurrentLun() {return currentLUN;} | |||
| bool available() { delay(0); return deviceAvailable; } | |||
| uint8_t checkConnectedInitialized(void); | |||
| uint16_t getIDVendor() {return idVendor; } | |||
| uint16_t getIDProduct() {return idProduct; } | |||
| uint8_t getHubNumber() { return hubNumber; } | |||
| uint8_t getHubPort() { return hubPort; } | |||
| uint8_t getDeviceAddress() { return deviceAddress; } | |||
| uint8_t WaitMediaReady(); | |||
| uint8_t msTestReady(); | |||
| uint8_t msReportLUNs(uint8_t *Buffer); | |||
| uint8_t msStartStopUnit(uint8_t mode); | |||
| uint8_t msReadDeviceCapacity(msSCSICapacity_t * const Capacity); | |||
| uint8_t msDeviceInquiry(msInquiryResponse_t * const Inquiry); | |||
| uint8_t msProcessError(uint8_t msStatus); | |||
| uint8_t msRequestSense(msRequestSenseResponse_t * const Sense); | |||
| uint8_t msRequestSense(void *Sense); | |||
| uint8_t msReadBlocks(const uint32_t BlockAddress, const uint16_t Blocks, | |||
| const uint16_t BlockSize, void * sectorBuffer); | |||
| uint8_t msWriteBlocks(const uint32_t BlockAddress, const uint16_t Blocks, | |||
| const uint16_t BlockSize, const void * sectorBuffer); | |||
| protected: | |||
| virtual bool claim(Device_t *device, int type, const uint8_t *descriptors, uint32_t len); | |||
| virtual void control(const Transfer_t *transfer); | |||
| virtual void disconnect(); | |||
| static void callbackIn(const Transfer_t *transfer); | |||
| static void callbackOut(const Transfer_t *transfer); | |||
| void new_dataIn(const Transfer_t *transfer); | |||
| void new_dataOut(const Transfer_t *transfer); | |||
| void init(); | |||
| uint8_t msDoCommand(msCommandBlockWrapper_t *CBW, void *buffer); | |||
| uint8_t msGetCSW(void); | |||
| private: | |||
| Pipe_t mypipes[3] __attribute__ ((aligned(32))); | |||
| Transfer_t mytransfers[7] __attribute__ ((aligned(32))); | |||
| strbuf_t mystring_bufs[1]; | |||
| uint32_t packetSizeIn; | |||
| uint32_t packetSizeOut; | |||
| Pipe_t *datapipeIn; | |||
| Pipe_t *datapipeOut; | |||
| uint32_t endpointIn = 0; | |||
| uint32_t endpointOut = 0; | |||
| setup_t setup; | |||
| uint8_t report[8]; | |||
| uint8_t maxLUN = 0; | |||
| uint8_t currentLUN = 0; | |||
| // msSCSICapacity_t msCapacity; | |||
| // msInquiryResponse_t msInquiry; | |||
| // msRequestSenseResponse_t msSense; | |||
| uint16_t idVendor = 0; | |||
| uint16_t idProduct = 0; | |||
| uint8_t hubNumber = 0; | |||
| uint8_t hubPort = 0; | |||
| uint8_t deviceAddress = 0; | |||
| volatile bool msOutCompleted = false; | |||
| volatile bool msInCompleted = false; | |||
| volatile bool msControlCompleted = false; | |||
| uint32_t CBWTag = 0; | |||
| bool deviceAvailable = false; | |||
| }; | |||
| #endif | |||