diff options
| author | Ha Thach <[email protected]> | 2019-12-24 21:36:42 +0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2019-12-24 21:36:42 +0700 |
| commit | 8c674d9c11f93ace7cf99f0e9bd5b6f28e945f21 (patch) | |
| tree | a72b5cab962e97a19ffbcd3011ba153afe45a00d | |
| parent | 21cc8237e1130c489bc4ef3b7dea1c41eef25d56 (diff) | |
| parent | 605129eb6600ffb50ea2d239e0ad78a9636df8e1 (diff) | |
Merge pull request #244 from hathach/develop
invoke scsi complete callback before queue for csw status
| -rw-r--r-- | README.md | 2 | ||||
| -rw-r--r-- | src/class/msc/msc_device.c | 18 | ||||
| -rw-r--r-- | src/device/usbd.h | 4 | ||||
| -rw-r--r-- | src/tusb_option.h | 2 | ||||
| -rw-r--r-- | tools/usb_drivers/99-tinyusb.rules | 18 | ||||
| -rw-r--r-- | tools/usb_drivers/tinyusb_win_usbser.inf (renamed from tools/windows_cdc_driver/tusb_usbser.inf) | 0 |
6 files changed, 35 insertions, 9 deletions
@@ -2,7 +2,7 @@  -[](https://travis-ci.org/hathach/tinyusb) [](https://opensource.org/licenses/MIT) +[](https://travis-ci.org/hathach/tinyusb) [](https://opensource.org/licenses/MIT)[](https://scan.coverity.com/projects/tinyusb) TinyUSB is an open-source cross-platform USB Host/Device stack for embedded system, designed to be memory-safe with no dynamic allocation and thread-safe with all interrupt events are deferred then handled in the non-ISR task function. diff --git a/src/class/msc/msc_device.c b/src/class/msc/msc_device.c index 93167bc6d..bef5d599b 100644 --- a/src/class/msc/msc_device.c +++ b/src/class/msc/msc_device.c @@ -39,7 +39,8 @@ enum {
MSC_STAGE_CMD = 0,
MSC_STAGE_DATA,
- MSC_STAGE_STATUS
+ MSC_STAGE_STATUS,
+ MSC_STAGE_STATUS_SENT
};
typedef struct
@@ -569,7 +570,11 @@ bool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t break;
case MSC_STAGE_STATUS:
- // Wait for the command status wrapper complete event
+ // processed immediately after this switch, supposedly to be empty
+ break;
+
+ case MSC_STAGE_STATUS_SENT:
+ // Wait for the Status phase to complete
if( (ep_addr == p_msc->ep_in) && (xferred_bytes == sizeof(msc_csw_t)) )
{
TU_LOG2(" SCSI Status: %u\n", p_csw->status);
@@ -598,9 +603,6 @@ bool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t }
else
{
- // Send SCSI Status
- TU_ASSERT(usbd_edpt_xfer(rhport, p_msc->ep_in , (uint8_t*) &p_msc->csw, sizeof(msc_csw_t)));
-
// Invoke complete callback if defined
switch(p_cbw->command[0])
{
@@ -616,6 +618,12 @@ bool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t if ( tud_msc_scsi_complete_cb ) tud_msc_scsi_complete_cb(p_cbw->lun, p_cbw->command);
break;
}
+
+ // Move to Status Sent stage
+ p_msc->stage = MSC_STAGE_STATUS_SENT;
+
+ // Send SCSI Status
+ TU_ASSERT(usbd_edpt_xfer(rhport, p_msc->ep_in , (uint8_t*) &p_msc->csw, sizeof(msc_csw_t)));
}
}
diff --git a/src/device/usbd.h b/src/device/usbd.h index 9d39af13a..e685686ad 100644 --- a/src/device/usbd.h +++ b/src/device/usbd.h @@ -212,7 +212,7 @@ TU_ATTR_WEAK bool tud_vendor_control_complete_cb(uint8_t rhport, tusb_control_re // Interface number, string index, protocol, report descriptor len, EP In address, size & polling interval
#define TUD_HID_DESCRIPTOR(_itfnum, _stridx, _boot_protocol, _report_desc_len, _epin, _epsize, _ep_interval) \
/* Interface */\
- 9, TUSB_DESC_INTERFACE, _itfnum, 0, 1, TUSB_CLASS_HID, (_boot_protocol) ? HID_SUBCLASS_BOOT : 0, _boot_protocol, _stridx,\
+ 9, TUSB_DESC_INTERFACE, _itfnum, 0, 1, TUSB_CLASS_HID, (uint8_t)((_boot_protocol) ? HID_SUBCLASS_BOOT : 0), _boot_protocol, _stridx,\
/* HID descriptor */\
9, HID_DESC_TYPE_HID, U16_TO_U8S_LE(0x0111), 0, 1, HID_DESC_TYPE_REPORT, U16_TO_U8S_LE(_report_desc_len),\
/* Endpoint In */\
@@ -225,7 +225,7 @@ TU_ATTR_WEAK bool tud_vendor_control_complete_cb(uint8_t rhport, tusb_control_re // Interface number, string index, protocol, report descriptor len, EP OUT & IN address, size & polling interval
#define TUD_HID_INOUT_DESCRIPTOR(_itfnum, _stridx, _boot_protocol, _report_desc_len, _epout, _epin, _epsize, _ep_interval) \
/* Interface */\
- 9, TUSB_DESC_INTERFACE, _itfnum, 0, 2, TUSB_CLASS_HID, (_boot_protocol) ? HID_SUBCLASS_BOOT : 0, _boot_protocol, _stridx,\
+ 9, TUSB_DESC_INTERFACE, _itfnum, 0, 2, TUSB_CLASS_HID, (uint8_t)((_boot_protocol) ? HID_SUBCLASS_BOOT : 0), _boot_protocol, _stridx,\
/* HID descriptor */\
9, HID_DESC_TYPE_HID, U16_TO_U8S_LE(0x0111), 0, 1, HID_DESC_TYPE_REPORT, U16_TO_U8S_LE(_report_desc_len),\
/* Endpoint Out */\
diff --git a/src/tusb_option.h b/src/tusb_option.h index 6766da074..266687ff7 100644 --- a/src/tusb_option.h +++ b/src/tusb_option.h @@ -36,7 +36,7 @@ * \ref CFG_TUSB_MCU must be defined to one of these
* @{ */
-#define OPT_MCU_NONE 0
+#define OPT_MCU_NONE 0
// LPC
#define OPT_MCU_LPC11UXX 1 ///< NXP LPC11Uxx
diff --git a/tools/usb_drivers/99-tinyusb.rules b/tools/usb_drivers/99-tinyusb.rules new file mode 100644 index 000000000..334159f9a --- /dev/null +++ b/tools/usb_drivers/99-tinyusb.rules @@ -0,0 +1,18 @@ +# Copy this file to the location of your distribution's udev rules, for example on Ubuntu: +# sudo cp 99-tinyusb.rules /etc/udev/rules.d/ +# Then reload udev configuration by executing: +# sudo udevadm control --reload-rules +# sudo udevadm trigger + +# Check SUBSYSTEM +SUBSYSTEMS=="hidraw", KERNEL=="hidraw*", MODE="0666", GROUP="dialout" + +# Rule applies to all TinyUSB example +ATTRS{idVendor}=="cafe", MODE="0666", GROUP="dialout" + +# Rule to blacklist TinyUSB example from being manipulated by ModemManager. +SUBSYSTEMS=="usb", ATTRS{idVendor}=="cafe", ENV{ID_MM_DEVICE_IGNORE}="1" + +# Xplained Pro SamG55 Device +SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2111", MODE="0666", GROUP="users", ENV{ID_MM_DEVICE_IGNORE}="1" +SUBSYSTEMS=="tty", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2111", MODE="0666", GROUP="users", ENV{ID_MM_DEVICE_IGNORE}="1" diff --git a/tools/windows_cdc_driver/tusb_usbser.inf b/tools/usb_drivers/tinyusb_win_usbser.inf index e7f7a9b22..e7f7a9b22 100644 --- a/tools/windows_cdc_driver/tusb_usbser.inf +++ b/tools/usb_drivers/tinyusb_win_usbser.inf |
