USB Host Driver with Socket Modem support. Works with revision 323 of mbed-src but broken with any later version.
Dependencies: FATFileSystem
Fork of F401RE-USBHost by
Diff: USBHostMSD/USBHostMSD.cpp
- Revision:
- 8:6463cd1964c0
- Parent:
- 3:a3872f7593e2
- Child:
- 9:7f9f64cf5ded
diff -r 9a20482c9a7a -r 6463cd1964c0 USBHostMSD/USBHostMSD.cpp --- a/USBHostMSD/USBHostMSD.cpp Tue Jan 28 06:50:12 2014 +0000 +++ b/USBHostMSD/USBHostMSD.cpp Fri Jan 31 13:45:07 2014 +0000 @@ -29,7 +29,6 @@ { host = USBHost::getHostInst(); init(); - report = &host->report; } void USBHostMSD::init() { @@ -40,22 +39,84 @@ dev_connected = false; blockSize = 0; blockCount = 0; - msd_intf = 1; //msd_intf = -1; + msd_intf = -1; msd_device_found = false; disk_init = false; dev_connected = false; nb_ep = 0; } - bool USBHostMSD::connected() { - return true; + return dev_connected; } bool USBHostMSD::connect() { - return true; + if (dev_connected) { + return true; + } + + for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++) { + if ((dev = host->getDevice(i)) != NULL) { + + //USB_DBG("Trying to connect MSD device dev=%p\n", dev); + + if(host->enumerate(dev, this)) + break; + + if (msd_device_found) { + bulk_in = dev->getEndpoint(msd_intf, BULK_ENDPOINT, IN); + bulk_out = dev->getEndpoint(msd_intf, BULK_ENDPOINT, OUT); + + if (!bulk_in || !bulk_out) + continue; + + USB_INFO("New MSD device: VID:%04x PID:%04x [dev: %p - intf: %d]", dev->getVid(), dev->getPid(), dev, msd_intf); + dev->setName("MSD", msd_intf); + host->registerDriver(dev, msd_intf, this, &USBHostMSD::init); + + dev_connected = true; + return true; + } + } //if() + } //for() + init(); + return false; +} + +/*virtual*/ void USBHostMSD::setVidPid(uint16_t vid, uint16_t pid) +{ + USB_DBG2("vid:%04x pid:%04x", vid, pid); + // we don't check VID/PID for MSD driver +} + +/*virtual*/ bool USBHostMSD::parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol) //Must return true if the interface should be parsed +{ + USB_DBG2("intf: %d class: %02x %02x %02x", intf_nb, intf_class, intf_subclass, intf_protocol); + + if ((msd_intf == -1) && + (intf_class == MSD_CLASS) && + (intf_subclass == 0x06) && + (intf_protocol == 0x50)) { + msd_intf = intf_nb; + return true; + } + return false; +} + +/*virtual*/ bool USBHostMSD::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used +{ + USB_DBG2("intf_nb=%d type=%d dir=%d", intf_nb, type, dir); + if (intf_nb == msd_intf) { + if (type == BULK_ENDPOINT) { + nb_ep++; + if (nb_ep == 2) + msd_device_found = true; + return true; + } + } + return false; } int USBHostMSD::testUnitReady() {