| #error "USBHost_t36 only works with Teensy 3.6 or Teensy 4.x. Please select it in Tools > Boards" | #error "USBHost_t36 only works with Teensy 3.6 or Teensy 4.x. Please select it in Tools > Boards" | ||||
| #endif | #endif | ||||
| #include "utility/imxrt_usbhs.h" | #include "utility/imxrt_usbhs.h" | ||||
| #include "utility/msc.h" | |||||
| // Dear inquisitive reader, USB is a complex protocol defined with | // Dear inquisitive reader, USB is a complex protocol defined with | ||||
| // very specific terminology. To have any chance of understand this | // very specific terminology. To have any chance of understand this | ||||
| Transfer_t mytransfers[7] __attribute__ ((aligned(32))); | 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 | #endif |