diff --git a/demos/bsp/boards/board.h b/demos/bsp/boards/board.h index aaa8074e5..7bbd96acb 100644 --- a/demos/bsp/boards/board.h +++ b/demos/bsp/boards/board.h @@ -78,7 +78,7 @@ //--------------------------------------------------------------------+ // PRINTF TARGET DEFINE //--------------------------------------------------------------------+ -#define PRINTF_TARGET_DEBUG_CONSOLE 1 // IDE semihosting console +#define PRINTF_TARGET_SEMIHOST 1 #define PRINTF_TARGET_UART 2 #define PRINTF_TARGET_SWO 3 // aka SWV, ITM #define PRINTF_TARGET_NONE 4 diff --git a/demos/bsp/boards/embedded_artists/board_ea4357.h b/demos/bsp/boards/embedded_artists/board_ea4357.h index 2a6ef8490..5858b0496 100644 --- a/demos/bsp/boards/embedded_artists/board_ea4357.h +++ b/demos/bsp/boards/embedded_artists/board_ea4357.h @@ -66,6 +66,7 @@ #include "oem_base_board/pca9532.h" // LEDs + //#define CFG_PRINTF_TARGET PRINTF_TARGET_SWO #define CFG_PRINTF_TARGET PRINTF_TARGET_UART // FIXME keil's cmsis rtx does not work with UART (work with SWO) diff --git a/demos/bsp/boards/hitex/board_hitex4350.h b/demos/bsp/boards/hitex/board_hitex4350.h index d1db09220..0d7a53666 100644 --- a/demos/bsp/boards/hitex/board_hitex4350.h +++ b/demos/bsp/boards/hitex/board_hitex4350.h @@ -56,7 +56,7 @@ extern "C" { #endif -#define CFG_PRINTF_TARGET PRINTF_TARGET_DEBUG_CONSOLE +#define CFG_PRINTF_TARGET PRINTF_TARGET_SEMIHOST #ifdef __cplusplus } diff --git a/demos/bsp/boards/keil/board_mcb4300.h b/demos/bsp/boards/keil/board_mcb4300.h index a33878366..e0c5526af 100644 --- a/demos/bsp/boards/keil/board_mcb4300.h +++ b/demos/bsp/boards/keil/board_mcb4300.h @@ -56,7 +56,7 @@ extern "C" { #endif -#define CFG_PRINTF_TARGET PRINTF_TARGET_DEBUG_CONSOLE +#define CFG_PRINTF_TARGET PRINTF_TARGET_SEMIHOST #ifdef __cplusplus diff --git a/demos/bsp/boards/lpcxpresso/board_lpcxpresso1347.h b/demos/bsp/boards/lpcxpresso/board_lpcxpresso1347.h index bca6e9ab0..5f65cc761 100644 --- a/demos/bsp/boards/lpcxpresso/board_lpcxpresso1347.h +++ b/demos/bsp/boards/lpcxpresso/board_lpcxpresso1347.h @@ -65,7 +65,7 @@ #define CFG_LED_ON (1) #define CFG_LED_OFF (0) -#define CFG_PRINTF_TARGET PRINTF_TARGET_DEBUG_CONSOLE +#define CFG_PRINTF_TARGET PRINTF_TARGET_SEMIHOST #ifdef __cplusplus } diff --git a/demos/bsp/boards/lpcxpresso/board_lpcxpresso1769.h b/demos/bsp/boards/lpcxpresso/board_lpcxpresso1769.h index 8e2212cc5..cfb01c3ec 100644 --- a/demos/bsp/boards/lpcxpresso/board_lpcxpresso1769.h +++ b/demos/bsp/boards/lpcxpresso/board_lpcxpresso1769.h @@ -57,7 +57,7 @@ #define CFG_LED_PORT (0) #define CFG_LED_PIN (22) -#define CFG_PRINTF_TARGET PRINTF_TARGET_DEBUG_CONSOLE +#define CFG_PRINTF_TARGET PRINTF_TARGET_SEMIHOST #ifdef __cplusplus } diff --git a/demos/bsp/boards/microbuilder/board_rf1ghznode.h b/demos/bsp/boards/microbuilder/board_rf1ghznode.h index 1f8d15fd7..565983d86 100644 --- a/demos/bsp/boards/microbuilder/board_rf1ghznode.h +++ b/demos/bsp/boards/microbuilder/board_rf1ghznode.h @@ -60,7 +60,7 @@ #include "lpc11uxx/gpio.h" #include "lpc11uxx/uart.h" -#define CFG_PRINTF_TARGET PRINTF_TARGET_DEBUG_CONSOLE +#define CFG_PRINTF_TARGET PRINTF_TARGET_SEMIHOST #define CFG_LED_PORT (1) #define CFG_LED_PIN (31) diff --git a/demos/bsp/boards/ngx/board_ngx4330.h b/demos/bsp/boards/ngx/board_ngx4330.h index d3d740e14..09581bcef 100644 --- a/demos/bsp/boards/ngx/board_ngx4330.h +++ b/demos/bsp/boards/ngx/board_ngx4330.h @@ -56,7 +56,7 @@ extern "C" { #endif -#define CFG_PRINTF_TARGET PRINTF_TARGET_DEBUG_CONSOLE +#define CFG_PRINTF_TARGET PRINTF_TARGET_SEMIHOST #ifdef __cplusplus } diff --git a/demos/bsp/boards/printf_retarget.c b/demos/bsp/boards/printf_retarget.c index f940836fd..6dfc711a2 100644 --- a/demos/bsp/boards/printf_retarget.c +++ b/demos/bsp/boards/printf_retarget.c @@ -38,7 +38,7 @@ #include "board.h" -#if CFG_PRINTF_TARGET != PRINTF_TARGET_DEBUG_CONSOLE +#if CFG_PRINTF_TARGET != PRINTF_TARGET_SEMIHOST #if CFG_PRINTF_TARGET == PRINTF_TARGET_UART #define retarget_getchar() board_uart_getchar() @@ -146,4 +146,4 @@ void _ttywrch(int ch) #endif -#endif // CFG_PRINTF_TARGET != PRINTF_TARGET_DEBUG_CONSOLE +#endif // CFG_PRINTF_TARGET != PRINTF_TARGET_SEMIHOST diff --git a/demos/host/host_os_none/host_os_none.uvopt b/demos/host/host_os_none/host_os_none.uvopt index f6140d21f..19453212b 100644 --- a/demos/host/host_os_none/host_os_none.uvopt +++ b/demos/host/host_os_none/host_os_none.uvopt @@ -480,7 +480,7 @@ 0 1 0 - 189 + 193 200 0 ..\src\main.c @@ -496,7 +496,7 @@ 0 0 0 - 94 + 127 145 0 ..\src\cdc_serial_app.c @@ -512,7 +512,7 @@ 0 0 0 - 136 + 169 180 0 ..\src\keyboard_app.c @@ -528,7 +528,7 @@ 0 44 0 - 120 + 121 127 0 ..\src\mouse_app.c @@ -576,7 +576,7 @@ 0 30 0 - 63 + 68 75 0 ..\src\cli.c @@ -616,7 +616,7 @@ 0 0 0 - 136 + 137 142 0 ..\..\bsp\boards\embedded_artists\board_ea4357.c @@ -630,10 +630,10 @@ 1 0 0 - 25 + 6 0 - 100 - 132 + 128 + 135 0 ..\..\bsp\boards\printf_retarget.c printf_retarget.c @@ -768,7 +768,7 @@ 0 0 0 - 25 + 58 76 0 ..\..\..\tinyusb\tusb.c @@ -832,7 +832,7 @@ 0 0 0 - 483 + 494 501 0 ..\..\..\tinyusb\host\usbh.c @@ -848,7 +848,7 @@ 0 0 0 - 599 + 600 605 0 ..\..\..\tinyusb\host\ehci\ehci.c @@ -1006,10 +1006,10 @@ 1 0 0 - 47 + 0 0 - 3 - 13 + 1 + 1 0 ..\..\..\tinyusb\class\msc_host.c msc_host.c @@ -1032,7 +1032,7 @@ 0 0 0 - 533 + 546 553 0 ..\..\bsp\lpc43xx\CMSIS_LPC43xx_DriverLib\src\lpc43xx_uart.c @@ -1136,7 +1136,7 @@ 0 26 0 - 145 + 147 154 0 ..\..\bsp\lpc43xx\startup_keil\startup_LPC43xx.s @@ -1158,10 +1158,10 @@ 1 0 0 - 56 + 0 0 - 1 - 20 + 13 + 23 0 ..\..\..\vendor\fatfs\diskio.c diskio.c diff --git a/demos/host/src/msc_app.c b/demos/host/src/msc_app.c index 1006ad168..a6a3583d7 100644 --- a/demos/host/src/msc_app.c +++ b/demos/host/src/msc_app.c @@ -84,14 +84,37 @@ void tusbh_msc_mounted_cb(uint8_t dev_addr) printf("LBA 0-0x%X Block Size: %d\n", last_lba, block_size); //------------- file system (only 1 LUN support) -------------// - DSTATUS stat = disk_initialize(0); + // DSTATUS stat = disk_initialize(0); + disk_state = 0; if ( disk_is_ready(0) ) { - f_mount(0, &fatfs[dev_addr-1]); + if ( f_mount(0, &fatfs[dev_addr-1]) != FR_OK ) + { + puts("mount failed"); + return; + } + + DIR root_dir; + if ( f_opendir(&root_dir, "/") != FR_OK ) + { + puts("open root dir failed"); + return; + } } } +void tusbh_msc_unmounted_isr(uint8_t dev_addr) +{ + disk_state = STA_NOINIT; + puts("--"); +} + +void tusbh_msc_isr(uint8_t dev_addr, tusb_event_t event, uint32_t xferred_bytes) +{ + putchar('x'); +} + //--------------------------------------------------------------------+ // IMPLEMENTATION //--------------------------------------------------------------------+ diff --git a/tinyusb/class/msc.h b/tinyusb/class/msc.h index dd4c222fb..fea1702a0 100644 --- a/tinyusb/class/msc.h +++ b/tinyusb/class/msc.h @@ -64,6 +64,10 @@ enum { MSC_SUBCLASS_SCSI }; +enum { + MSC_CBW_SIGNATURE = 0x43425355, +}; + // CBI only approved to use with full-speed floopy disk & should not used with highspeed or device other than floopy enum { MSC_PROTOCOL_CBI = 0, @@ -171,13 +175,16 @@ typedef ATTR_PACKED_STRUCT(struct) STATIC_ASSERT(sizeof(scsi_inquiry_data_t) == 36, "size is not correct"); +// test unit ready + //--------------------------------------------------------------------+ // SCSI Block Command (SBC-3) +// NOTE: All data in SCSI command are in Big Endian //--------------------------------------------------------------------+ typedef ATTR_PACKED_STRUCT(struct) { uint8_t cmd_code; uint8_t reserved1; - uint32_t logical_block_addr; + uint32_t lba; uint16_t reserved2; uint8_t partial_medium_indicator; uint8_t control; @@ -192,6 +199,19 @@ typedef struct { STATIC_ASSERT(sizeof(scsi_read_capacity10_data_t) == 8, "size is not correct"); +typedef ATTR_PACKED_STRUCT(struct) { + uint8_t cmd_code; + uint8_t reserved; // has LUN according to wiki + uint32_t lba; + uint8_t reserved2; + uint16_t block_count; + uint8_t control; +} scsi_read10_t; + +STATIC_ASSERT(sizeof(scsi_read10_t) == 10, "size is not correct"); + + + #ifdef __cplusplus } #endif diff --git a/tinyusb/class/msc_host.c b/tinyusb/class/msc_host.c index 9d4c9a258..d70cc9b94 100644 --- a/tinyusb/class/msc_host.c +++ b/tinyusb/class/msc_host.c @@ -53,6 +53,7 @@ //--------------------------------------------------------------------+ STATIC_VAR msch_interface_t msch_data[TUSB_CFG_HOST_DEVICE_MAX] TUSB_CFG_ATTR_USBRAM; + //------------- Initalization Data -------------// OSAL_SEM_DEF(msch_semaphore); static osal_semaphore_handle_t msch_sem_hdl; @@ -69,9 +70,8 @@ ATTR_ALIGNED(4) STATIC_VAR uint8_t msch_buffer[sizeof(scsi_inquiry_data_t)] TUSB //--------------------------------------------------------------------+ bool tusbh_msc_is_mounted(uint8_t dev_addr) { - return tusbh_device_is_configured(dev_addr) && - pipehandle_is_valid(msch_data[dev_addr-1].bulk_in) && - pipehandle_is_valid(msch_data[dev_addr-1].bulk_out); + return tusbh_device_is_configured(dev_addr) && // is configured can be omitted + msch_data[dev_addr-1].is_initialized; } uint8_t const* tusbh_msc_get_vendor_name(uint8_t dev_addr) @@ -95,12 +95,32 @@ tusb_error_t tusbh_msc_get_capacity(uint8_t dev_addr, uint32_t* p_last_lba, uint return TUSB_ERROR_NONE; } +tusb_interface_status_t tusbh_msc_status(uint8_t dev_addr) +{ + if ( !tusbh_msc_is_mounted(dev_addr) ) return TUSB_INTERFACE_STATUS_INVALID_PARA; + + if ( hcd_pipe_is_busy(msch_data[dev_addr-1].bulk_in) ) return TUSB_INTERFACE_STATUS_BUSY; + if ( hcd_pipe_is_stalled(msch_data[dev_addr-1].bulk_in) ) return TUSB_INTERFACE_STATUS_ERROR; + + return TUSB_INTERFACE_STATUS_READY; +} + //--------------------------------------------------------------------+ // CLASS-USBH API (don't require to verify parameters) //--------------------------------------------------------------------+ +static tusb_error_t msch_command_xfer(msch_interface_t * p_msch, void* p_buffer) ATTR_WARN_UNUSED_RESULT; +static tusb_error_t msch_command_xfer(msch_interface_t * p_msch, void* p_buffer) +{ + ASSERT_STATUS( hcd_pipe_xfer(p_msch->bulk_out, &p_msch->cbw, sizeof(msc_cmd_block_wrapper_t), false) ); + ASSERT_STATUS( hcd_pipe_queue_xfer(p_msch->bulk_in , p_buffer, p_msch->cbw.xfer_bytes) ); + ASSERT_STATUS( hcd_pipe_xfer(p_msch->bulk_in , &p_msch->csw, sizeof(msc_cmd_status_wrapper_t), true) ); + + return TUSB_ERROR_NONE; +} + static tusb_error_t scsi_command_send(msch_interface_t * p_msch, scsi_cmd_type_t cmd_code, uint8_t lun, uint8_t* p_data) { - p_msch->cbw.signature = 0x43425355; + p_msch->cbw.signature = MSC_CBW_SIGNATURE; p_msch->cbw.tag = 0xCAFECAFE; p_msch->cbw.lun = lun; @@ -113,7 +133,7 @@ static tusb_error_t scsi_command_send(msch_interface_t * p_msch, scsi_cmd_type_t scsi_inquiry_t cmd_inquiry = { - .cmd_code = SCSI_CMD_INQUIRY, + .cmd_code = cmd_code, .alloc_length = sizeof(scsi_inquiry_data_t) }; @@ -127,8 +147,8 @@ static tusb_error_t scsi_command_send(msch_interface_t * p_msch, scsi_cmd_type_t scsi_read_capacity10_t cmd_read_capacity10 = { - .cmd_code = SCSI_CMD_READ_CAPACITY_10, - .logical_block_addr = 0, + .cmd_code = cmd_code, + .lba = 0, .partial_medium_indicator = 0 }; @@ -139,6 +159,7 @@ static tusb_error_t scsi_command_send(msch_interface_t * p_msch, scsi_cmd_type_t break; case SCSI_CMD_READ_10: + break; case SCSI_CMD_WRITE_10: @@ -151,7 +172,7 @@ static tusb_error_t scsi_command_send(msch_interface_t * p_msch, scsi_cmd_type_t scsi_request_sense_t cmd_request_sense = { - .cmd_code = SCSI_CMD_REQUEST_SENSE, + .cmd_code = cmd_code, .alloc_length = 18 }; @@ -162,9 +183,36 @@ static tusb_error_t scsi_command_send(msch_interface_t * p_msch, scsi_cmd_type_t return TUSB_ERROR_MSCH_UNKNOWN_SCSI_COMMAND; } - ASSERT_STATUS( hcd_pipe_xfer(p_msch->bulk_out, (uint8_t*) &p_msch->cbw, sizeof(msc_cmd_block_wrapper_t), false) ); - ASSERT_STATUS( hcd_pipe_queue_xfer(p_msch->bulk_in , p_data, p_msch->cbw.xfer_bytes) ); - ASSERT_STATUS( hcd_pipe_xfer(p_msch->bulk_in , &p_msch->csw, sizeof(msc_cmd_status_wrapper_t), true) ); + ASSERT_STATUS( msch_command_xfer(p_msch, p_data) ); + + return TUSB_ERROR_NONE; +} + +tusb_error_t tusbh_msc_read10(uint8_t dev_addr, uint8_t lun, void * p_buffer, uint32_t lba, uint32_t block_count) +{ + msch_interface_t* p_msch = &msch_data[dev_addr-1]; + + //------------- Command Block Wrapper -------------// + p_msch->cbw.signature = MSC_CBW_SIGNATURE; + p_msch->cbw.tag = 0xCAFECAFE; + p_msch->cbw.lun = lun; + p_msch->cbw.xfer_bytes = p_msch->block_size*block_count; // Number of bytes + p_msch->cbw.flags = TUSB_DIR_DEV_TO_HOST_MASK; + p_msch->cbw.cmd_len = sizeof(scsi_read10_t); + + //------------- SCSI command -------------// + scsi_read10_t cmd_read10 = + { + .cmd_code = SCSI_CMD_READ_10, + .lba = __le2be(lba), + .block_count = ((uint8_t)block_count) << 8 // TODO a proper le to be for uint16_t + }; + + memcpy(p_msch->cbw.command, &cmd_read10, p_msch->cbw.cmd_len); + + ASSERT_STATUS ( msch_command_xfer(p_msch, p_buffer)); + + return TUSB_ERROR_NONE; } void msch_init(void) @@ -269,6 +317,7 @@ tusb_error_t msch_open_subtask(uint8_t dev_addr, tusb_descriptor_interface_t con msch_data[dev_addr-1].last_lba = __be2le( ((scsi_read_capacity10_data_t*)msch_buffer)->last_lba ); msch_data[dev_addr-1].block_size = (uint16_t) __be2le( ((scsi_read_capacity10_data_t*)msch_buffer)->block_size ); + msch_data[dev_addr-1].is_initialized = true; tusbh_msc_mounted_cb(dev_addr); OSAL_SUBTASK_END @@ -280,7 +329,13 @@ void msch_isr(pipe_handle_t pipe_hdl, tusb_event_t event, uint32_t xferred_bytes { if ( pipehandle_is_equal(pipe_hdl, msch_data[pipe_hdl.dev_addr-1].bulk_in) ) { - osal_semaphore_post(msch_sem_hdl); + if (msch_data[pipe_hdl.dev_addr-1].is_initialized) + { + tusbh_msc_isr(pipe_hdl.dev_addr, event, xferred_bytes); + }else + { // still initializing under open subtask + osal_semaphore_post(msch_sem_hdl); + } } } @@ -291,6 +346,8 @@ void msch_close(uint8_t dev_addr) memclr_(&msch_data[dev_addr-1], sizeof(msch_interface_t)); osal_semaphore_reset(msch_sem_hdl); + + tusbh_msc_unmounted_isr(dev_addr); // invoke Application Callback } //--------------------------------------------------------------------+ diff --git a/tinyusb/class/msc_host.h b/tinyusb/class/msc_host.h index 65265ddb9..1a9b7183a 100644 --- a/tinyusb/class/msc_host.h +++ b/tinyusb/class/msc_host.h @@ -64,12 +64,13 @@ uint8_t const* tusbh_msc_get_vendor_name(uint8_t dev_addr); uint8_t const* tusbh_msc_get_product_name(uint8_t dev_addr); tusb_error_t tusbh_msc_get_capacity(uint8_t dev_addr, uint32_t* p_last_lba, uint32_t* p_block_size); -tusb_error_t tusbh_msc_inquiry(uint8_t dev_addr, scsi_inquiry_data_t * p_inquiry_data) ATTR_WARN_UNUSED_RESULT; -tusb_error_t tusbh_msc_test_unit_ready(uint8_t dev_addr) ATTR_WARN_UNUSED_RESULT; -tusb_error_t tusbh_msc_read_capacity10(uint8_t dev_addr, scsi_read_capacity10_t * p_buffer) ATTR_WARN_UNUSED_RESULT; -tusb_error_t tusbh_msc_read10(uint8_t dev_addr, void * p_buffer, uint32_t length) ATTR_WARN_UNUSED_RESULT; +tusb_error_t tusbh_msc_read10(uint8_t dev_addr, uint8_t lun, void * p_buffer, uint32_t lba, uint32_t block_count) ATTR_WARN_UNUSED_RESULT; tusb_error_t tusbh_msc_write10(uint8_t dev_addr, void const * p_data, uint32_t length) ATTR_WARN_UNUSED_RESULT; +//tusb_error_t tusbh_msc_test_unit_ready(uint8_t dev_addr) ATTR_WARN_UNUSED_RESULT; +//tusb_error_t tusbh_msc_inquiry(uint8_t dev_addr, scsi_inquiry_data_t * p_inquiry_data) ATTR_WARN_UNUSED_RESULT; +//tusb_error_t tusbh_msc_read_capacity10(uint8_t dev_addr, scsi_read_capacity10_t * p_buffer) ATTR_WARN_UNUSED_RESULT; + //tusb_error_t tusbh_msc_scsi_send(uint8_t dev_addr, uint8_t lun, bool is_direction_in, // uint8_t const * p_command, uint8_t cmd_len, // uint8_t * p_response, uint32_t resp_len) ATTR_WARN_UNUSED_RESULT; @@ -77,7 +78,7 @@ tusb_error_t tusbh_msc_write10(uint8_t dev_addr, void const * p_data, uint32_t //------------- Application Callback -------------// void tusbh_msc_mounted_cb(uint8_t dev_addr); void tusbh_msc_unmounted_isr(uint8_t dev_addr); -void tusbh_msc_isr(uint8_t dev_addr, tusb_event_t event); +void tusbh_msc_isr(uint8_t dev_addr, tusb_event_t event, uint32_t xferred_bytes); //--------------------------------------------------------------------+ @@ -93,6 +94,7 @@ typedef struct { uint16_t block_size; uint32_t last_lba; // last logical block address + bool is_initialized; uint8_t vendor_id[8]; uint8_t product_id[16]; diff --git a/tinyusb/common/compiler/compiler_gcc.h b/tinyusb/common/compiler/compiler_gcc.h index b0fff10c0..0202bf314 100644 --- a/tinyusb/common/compiler/compiler_gcc.h +++ b/tinyusb/common/compiler/compiler_gcc.h @@ -132,6 +132,9 @@ // built-in function to convert 32-bit Big-Endian to Little-Endian #define __be2le __builtin_bswap32 +#define __le2be __be2le + +//#define __le2be_16 __builtin_bswap16 /** You can use the built-in function \b __builtin_constant_p to determine if a value is known to be constant at compile time and hence that GCC can perform constant-folding on expressions involving that value. The argument of the function is the value to test. The function returns the integer 1 if the argument is known to be a compile-time constant and 0 if it is not known to be a compile-time constant. A return of 0 does not indicate that the value is not a constant, but merely that GCC cannot prove it is a constant with the specified value of the -O option. diff --git a/tinyusb/common/compiler/compiler_iar.h b/tinyusb/common/compiler/compiler_iar.h index 82f5079df..baba783d8 100644 --- a/tinyusb/common/compiler/compiler_iar.h +++ b/tinyusb/common/compiler/compiler_iar.h @@ -85,6 +85,7 @@ // built-in function to convert 32-bit Big-Endian to Little-Endian #define __be2le __REV +#define __le2be __be2le #if 0 diff --git a/vendor/fatfs/diskio.c b/vendor/fatfs/diskio.c index 85862e47a..17b7d5447 100644 --- a/vendor/fatfs/diskio.c +++ b/vendor/fatfs/diskio.c @@ -36,19 +36,18 @@ */ /**************************************************************************/ -#include "boards/board.h" #include "tusb.h" -#include "diskio.h" - +#if TUSB_CFG_HOST_MSC //--------------------------------------------------------------------+ // INCLUDE //--------------------------------------------------------------------+ +#include "diskio.h" //--------------------------------------------------------------------+ // MACRO CONSTANT TYPEDEF //--------------------------------------------------------------------+ -static volatile DSTATUS disk_state = STA_NOINIT; + volatile DSTATUS disk_state = STA_NOINIT; //--------------------------------------------------------------------+ // INTERNAL OBJECT & FUNCTION DECLARATION @@ -70,7 +69,7 @@ DSTATUS disk_status (BYTE pdrv) } //pdrv -// Specifies the physical drive number. +// Specifies the physical drive number --> == dev_addr-1 //buff // Pointer to the byte array to store the read data. The size of buffer must be in sector size * sector count. //sector @@ -80,7 +79,20 @@ DSTATUS disk_status (BYTE pdrv) // must not be split into single sector transactions to the device, or you may not get good read performance. DRESULT disk_read (BYTE pdrv, BYTE*buff, DWORD sector, BYTE count) { + uint8_t usb_addr = pdrv+1; + tusbh_msc_read10(usb_addr, 0, buff, sector, count); +#if TUSB_CFG_OS == TUSB_OS_NONE + while ( tusbh_msc_status(usb_addr) == TUSB_INTERFACE_STATUS_BUSY ) + { + // timeout here + } + return tusbh_msc_status(usb_addr) == TUSB_INTERFACE_STATUS_READY ? RES_OK : RES_ERROR; +#else + #error semaphore instead of blocking +#endif + + return RES_ERROR; } @@ -114,3 +126,5 @@ DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff) // .day_in_month = 21, // }; //} + +#endif diff --git a/vendor/fatfs/diskio.h b/vendor/fatfs/diskio.h index 5a69f69d6..9b1f9a28f 100644 --- a/vendor/fatfs/diskio.h +++ b/vendor/fatfs/diskio.h @@ -18,6 +18,8 @@ extern "C" { /* Status of Disk Functions */ typedef BYTE DSTATUS; +extern volatile DSTATUS disk_state; + /* Results of Disk Functions */ typedef enum { RES_OK = 0, /* 0: Successful */