Merge pull request #244 from hathach/develop
invoke scsi complete callback before queue for csw status
This commit is contained in:
		| @@ -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. | ||||
|  | ||||
|   | ||||
| @@ -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))); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -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 */\ | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
							
								
								
									
										18
									
								
								tools/usb_drivers/99-tinyusb.rules
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								tools/usb_drivers/99-tinyusb.rules
									
									
									
									
									
										Normal file
									
								
							| @@ -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" | ||||
		Reference in New Issue
	
	Block a user
	 Ha Thach
					Ha Thach