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;
|
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_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
|
//USB HOST ISR
|
||||||
void UsbOtg2IrqHandler(int irqn, void *arg)
|
void UsbOtg2IrqHandler(int irqn, void *arg)
|
||||||
|
@ -177,7 +177,7 @@ static uint32 UsbHostWrite(void *dev, struct BusBlockWriteParam *write_param)
|
||||||
{
|
{
|
||||||
usb_status_t status;
|
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) {
|
if (kStatus_USB_Success == status) {
|
||||||
return write_param->size;
|
return write_param->size;
|
||||||
}
|
}
|
||||||
|
|
|
@ -485,50 +485,86 @@ 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 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) {
|
if (msdCommandInstance->deviceState == kStatus_DEV_Attached) {
|
||||||
usb_status_t status;
|
|
||||||
ufiIng = 1;
|
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) {
|
if (status != kStatus_USB_Success) {
|
||||||
usb_echo("UsbHostRead error\r\n");
|
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return kStatus_USB_Error;
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
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) {
|
while (ufiIng) {
|
||||||
USB_HostControllerTaskFunction(g_HostHandle);
|
USB_HostControllerTaskFunction(g_HostHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ufiStatus == kStatus_USB_Success) {
|
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, 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)
|
||||||
|
{
|
||||||
|
return kStatus_USB_Error;
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
fatfs_code = kStatus_USB_Success;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fatfs_code = kStatus_USB_Busy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return fatfs_code;
|
||||||
|
}
|
||||||
|
|
||||||
void USB_HostMsdTask(void *arg)
|
void USB_HostMsdTask(void *arg)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue