diff --git a/Ubiquitous/XiUOS/board/ok1052-c/third_party_driver/usb/connect_usb.c b/Ubiquitous/XiUOS/board/ok1052-c/third_party_driver/usb/connect_usb.c index dc530f79f..a05ee262d 100644 --- a/Ubiquitous/XiUOS/board/ok1052-c/third_party_driver/usb/connect_usb.c +++ b/Ubiquitous/XiUOS/board/ok1052-c/third_party_driver/usb/connect_usb.c @@ -36,7 +36,7 @@ extern usb_host_msd_command_instance_t g_MsdCommandInstance; usb_host_handle g_HostHandle; extern usb_status_t USB_HostMsdReadApi(usb_host_msd_command_instance_t *msdCommandInstance, uint8_t *buffer, uint32_t pos, uint32_t block_size, uint32_t block_num); -extern usb_status_t USB_HostMsdWriteApi(usb_host_msd_command_instance_t *msdCommandInstance, uint8_t *buffer, uint32_t pos, uint32_t block_size, uint32_t block_num); +extern usb_status_t USB_HostMsdWriteApi(usb_host_msd_command_instance_t *msdCommandInstance, const uint8_t *buffer, uint32_t pos, uint32_t block_size, uint32_t block_num); //USB HOST ISR void UsbOtg2IrqHandler(int irqn, void *arg) @@ -177,7 +177,7 @@ static uint32 UsbHostWrite(void *dev, struct BusBlockWriteParam *write_param) { usb_status_t status; - status = USB_HostMsdWriteApi(&g_MsdCommandInstance, (uint8 *)write_param->buffer, write_param->pos, USB_SINGLE_BLOCK_SIZE, write_param->size); + status = USB_HostMsdWriteApi(&g_MsdCommandInstance, (const uint8 *)write_param->buffer, write_param->pos, USB_SINGLE_BLOCK_SIZE, write_param->size); if (kStatus_USB_Success == status) { return write_param->size; } diff --git a/Ubiquitous/XiUOS/board/ok1052-c/third_party_driver/usb/nxp_usb_driver/host_msd_command.c b/Ubiquitous/XiUOS/board/ok1052-c/third_party_driver/usb/nxp_usb_driver/host_msd_command.c index 176d08bfd..78cb4af70 100644 --- a/Ubiquitous/XiUOS/board/ok1052-c/third_party_driver/usb/nxp_usb_driver/host_msd_command.c +++ b/Ubiquitous/XiUOS/board/ok1052-c/third_party_driver/usb/nxp_usb_driver/host_msd_command.c @@ -485,51 +485,87 @@ static void USB_HostMsdCommandTest(usb_host_msd_command_instance_t *msdCommandIn usb_status_t USB_HostMsdReadApi(usb_host_msd_command_instance_t *msdCommandInstance, uint8_t *buffer, uint32_t pos, uint32_t block_size, uint32_t block_num) { + usb_status_t status, ret = kStatus_USB_Error; + uint32_t retry = 2; + if (msdCommandInstance->deviceState == kStatus_DEV_Attached) { - usb_status_t status; ufiIng = 1; - status = USB_HostMsdRead10(msdCommandInstance->classHandle, 0, pos, buffer, block_size, block_num, USB_HostMsdUfiCallback, msdCommandInstance); - if (status != kStatus_USB_Success) { - usb_echo("UsbHostRead error\r\n"); - return kStatus_USB_Error; - } - while (ufiIng) { - USB_HostControllerTaskFunction(g_HostHandle); - } + while (retry--) { + status = USB_HostMsdRead10(msdCommandInstance->classHandle, 0, pos, buffer, (uint32_t)(block_size * block_num), block_num, USB_HostMsdUfiCallback, msdCommandInstance); + if (status != kStatus_USB_Success) { + usb_echo("UsbHostRead error\r\n"); + ret = kStatus_USB_Error; + } else { + while (ufiIng) { + USB_HostControllerTaskFunction(g_HostHandle); + } - if (ufiStatus == kStatus_USB_Success){ - return kStatus_USB_Success; + if (ufiStatus == kStatus_USB_Success) { + ret = kStatus_USB_Success; + break; + } else { + ret = kStatus_USB_Error; + } + } } } - return kStatus_USB_Error; + return ret; } -usb_status_t USB_HostMsdWriteApi(usb_host_msd_command_instance_t *msdCommandInstance, uint8_t *buffer, uint32_t pos, uint32_t block_size, uint32_t block_num) +usb_status_t USB_HostMsdWriteApi(usb_host_msd_command_instance_t *msdCommandInstance, const uint8_t *buffer, uint32_t pos, uint32_t block_size, uint32_t block_num) { - if (msdCommandInstance->deviceState == kStatus_DEV_Attached) { - usb_status_t status; + usb_status_t fatfs_code = kStatus_USB_Error; + usb_status_t status = kStatus_USB_Success; + uint32_t retry = 2; + const uint8_t *transferBuf; + uint32_t sectorCount; + uint32_t sectorIndex; + + if (!block_num) + { + return kStatus_USB_Error; + } + + transferBuf = buffer; + sectorCount = block_num; + sectorIndex = pos; + + while (retry--) + { ufiIng = 1; - status = USB_HostMsdWrite10(msdCommandInstance->classHandle, 0, pos, buffer, block_size, block_num, USB_HostMsdUfiCallback, msdCommandInstance); - if (status != kStatus_USB_Success) { - usb_echo("UsbHostWrite error\r\n"); + if (msdCommandInstance == NULL) + { return kStatus_USB_Error; } - - while (ufiIng) { - USB_HostControllerTaskFunction(g_HostHandle); + status = USB_HostMsdWrite10(msdCommandInstance->classHandle, 0, sectorIndex, (uint8_t *)transferBuf, + (uint32_t)(block_size * sectorCount), sectorCount, USB_HostMsdUfiCallback, NULL); + if (status != kStatus_USB_Success) + { + fatfs_code = kStatus_USB_Error; } - - if (ufiStatus == kStatus_USB_Success) { - return kStatus_USB_Success; + else + { + while (ufiIng) + { + USB_HostControllerTaskFunction(g_HostHandle); + } + if (ufiStatus == kStatus_USB_Success) + { + fatfs_code = kStatus_USB_Success; + break; + } + else + { + fatfs_code = kStatus_USB_Busy; + } } } - return kStatus_USB_Error; + return fatfs_code; } - void USB_HostMsdTask(void *arg) { usb_status_t status;