forked from xuos/xiuos
fix USB write error using fatfs function
This commit is contained in:
parent
84b27692c0
commit
9339ffe2fd
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
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");
|
||||
return kStatus_USB_Error;
|
||||
}
|
||||
|
||||
ret = kStatus_USB_Error;
|
||||
} else {
|
||||
while (ufiIng) {
|
||||
USB_HostControllerTaskFunction(g_HostHandle);
|
||||
}
|
||||
|
||||
if (ufiStatus == kStatus_USB_Success) {
|
||||
return 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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
if (msdCommandInstance->deviceState == kStatus_DEV_Attached) {
|
||||
usb_status_t status;
|
||||
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");
|
||||
return kStatus_USB_Error;
|
||||
}
|
||||
|
||||
while (ufiIng) {
|
||||
transferBuf = buffer;
|
||||
sectorCount = block_num;
|
||||
sectorIndex = pos;
|
||||
|
||||
while (retry--)
|
||||
{
|
||||
ufiIng = 1;
|
||||
if (msdCommandInstance == NULL)
|
||||
{
|
||||
return kStatus_USB_Error;
|
||||
}
|
||||
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;
|
||||
}
|
||||
else
|
||||
{
|
||||
while (ufiIng)
|
||||
{
|
||||
USB_HostControllerTaskFunction(g_HostHandle);
|
||||
}
|
||||
|
||||
if (ufiStatus == kStatus_USB_Success) {
|
||||
return kStatus_USB_Success;
|
||||
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;
|
||||
|
|
Loading…
Reference in New Issue