硬汉嵌入式论坛

 找回密码
 立即注册
查看: 7602|回复: 17
收起左侧

[ThreadX全家桶] ThreadX USBX使用函数fx_media_read和fx_media_write做磁盘格式化不好使

  [复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
发表于 2021-1-21 08:19:45 | 显示全部楼层 |阅读模式



模拟U盘做读写没问题,格式化不行。

  1. UINT  demo_thread_media_status(VOID *storage, ULONG lun, ULONG media_id, ULONG *media_status)
  2. {

  3.     /* The ATA drive never fails. This is just for demo only !!!! */
  4.     return(UX_SUCCESS);
  5. }


  6. UINT  demo_thread_media_read(VOID *storage, ULONG lun, UCHAR * data_pointer, ULONG number_blocks, ULONG lba, ULONG *media_status)
  7. {

  8. UINT    status =  0;

  9.     while(number_blocks--)
  10.     {
  11.         status =  fx_media_read(&sdio_disk,lba,data_pointer);
  12.         data_pointer+=512;
  13.         lba++;
  14.     }
  15.         
  16.     return(status);
  17. }


  18. UINT  demo_thread_media_write(VOID *storage, ULONG lun, UCHAR * data_pointer, ULONG number_blocks, ULONG lba, ULONG *media_status)
  19. {

  20. UINT    status =  0;


  21.     while(number_blocks--)
  22.     {
  23.         status =  fx_media_write(&sdio_disk,lba,data_pointer);
  24.         data_pointer+=512;
  25.         lba++;
  26.     }        
  27.     return(status);
  28. }
复制代码


回复

使用道具 举报

58

主题

267

回帖

446

积分

高级会员

积分
446
发表于 2021-1-21 09:25:29 | 显示全部楼层
这个问题我之前发过帖子,原因是 fx_media_write 函数里面判断了写入的sector号,如果是 0 就报错。所以这个方法不能做磁盘格式化。
但是 fx 格式化的磁盘电脑又不能识别,电脑格式化的磁盘 fx 倒是能识别。。就导致了必须从电脑格式化。

这就是矛盾了。 我的解决办法是不通过 fx_media_write 函数,直接使用物理媒介读写函数,就可以从电脑格式化了。

但这也有问题,就是 USB 访问 和 FX 访问会有冲突,不能全盘通过 filex 进行管控。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
 楼主| 发表于 2021-1-21 10:49:52 | 显示全部楼层
ihavedone 发表于 2021-1-21 09:25
这个问题我之前发过帖子,原因是 fx_media_write 函数里面判断了写入的sector号,如果是 0 就报错。所以这 ...

是的,改成FileX用的底层API给USBX可以用了。
回复

使用道具 举报

58

主题

267

回帖

446

积分

高级会员

积分
446
发表于 2021-1-21 11:08:04 | 显示全部楼层
eric2013 发表于 2021-1-21 10:49
是的,改成FileX用的底层API给USBX可以用了。

直接用底层API,会有USB 和 FILEX 同时访问文件系统的问题,会搞乱文件系统。 这里有办法解决吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
 楼主| 发表于 2021-1-21 14:37:48 | 显示全部楼层
ihavedone 发表于 2021-1-21 11:08
直接用底层API,会有USB 和 FILEX 同时访问文件系统的问题,会搞乱文件系统。 这里有办法解决吗?

不做同时访问支持。
回复

使用道具 举报

58

主题

267

回帖

446

积分

高级会员

积分
446
发表于 2021-1-21 15:42:53 | 显示全部楼层
eric2013 发表于 2021-1-21 14:37
不做同时访问支持。

不同时访问是可以的,就是随时插入USB的时候,要判断是否正在进行 FX 操作,当前操作完了之后才能进入 USB 模式,之后就不能再 FX 操作了。

我这边的模拟U盘还有一个问题,就是写完文件后必须手动移除U盘,文件才是正确的,不然文件就不对,要重新初始化整个盘。
这个现象只有Win10 才有, Win7的话写完文件直接拔掉也没问题。
但win7 的问题是,如果插上模拟U盘关闭电脑,之后再开机,U盘文件系统就不对了。

这个问题不知道你试过没有,有没有办法解决。
我虚拟U盘功能都实现了,但是不敢用,又屏蔽了,就是因为一不小心文件系统就坏了。
回复

使用道具 举报

655

主题

3299

回帖

5289

积分

论坛元老

积分
5289
发表于 2021-1-21 16:39:10 | 显示全部楼层
eric2013 发表于 2021-1-21 14:37
不做同时访问支持。

看来 filex 也还是有些缺陷啊,希望后续他们能够解决才好 ,不是有最新 filex v6.1.3 版本的吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
 楼主| 发表于 2021-1-22 09:15:57 | 显示全部楼层
hpdell 发表于 2021-1-21 16:39
看来 filex 也还是有些缺陷啊,希望后续他们能够解决才好 ,不是有最新 filex v6.1.3 版本的吗?

我用的USBX,FileX和NetX都是最新版。

同时访问支持是个老问题了,之前测试FatFS和FlashFS都不怎么好使,意思就好比是你模拟U盘的情况下,你去FileX访问U盘,让U的文件更新也反应到电脑端。

所以这种应用场景直接屏蔽掉。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
 楼主| 发表于 2021-1-22 09:20:29 | 显示全部楼层
ihavedone 发表于 2021-1-21 15:42
不同时访问是可以的,就是随时插入USB的时候,要判断是否正在进行 FX 操作,当前操作完了之后才能进入 US ...

我这就测测。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
 楼主| 发表于 2021-1-22 11:29:55 | 显示全部楼层
ihavedone 发表于 2021-1-21 15:42
不同时访问是可以的,就是随时插入USB的时候,要判断是否正在进行 FX 操作,当前操作完了之后才能进入 US ...

帮你用Win10测试了,我这里直接拔掉USB线也没问题。
回复

使用道具 举报

58

主题

267

回帖

446

积分

高级会员

积分
446
发表于 2021-1-24 20:20:16 | 显示全部楼层
eric2013 发表于 2021-1-22 11:29
帮你用Win10测试了,我这里直接拔掉USB线也没问题。

那我再参考下你的实现,看看是不是那里出问题了。。。
你已经发布了吗?
回复

使用道具 举报

58

主题

267

回帖

446

积分

高级会员

积分
446
发表于 2021-2-4 12:16:43 | 显示全部楼层
eric2013 发表于 2021-1-22 11:29
帮你用Win10测试了,我这里直接拔掉USB线也没问题。

不弹出直接拔U盘会损坏文件的问题搞定了。
把USB FIFO加大就好了。。
参考你的例程。后面注释部分是之前的值
HAL_PCDEx_SetRxFiFo(&pcd_hs_handle, 1024);      // 0x80
HAL_PCDEx_SetTxFiFo(&pcd_hs_handle, 0, 64);      // 0x40
HAL_PCDEx_SetTxFiFo(&pcd_hs_handle, 1, 1024);  // 0x80

还是要多看看例程才能发现问题,解决问题。 不然自己去摸索鬼知道这个值要设置成多少

有个疑问就是你这个 1024 是以什么为依据,你的例程用的 SD 卡,是 SD 卡的 sector 大小?
我用的 SPI FLASH,一个 sector 是 4096,那我是不是设置成 4096 更好?这个值最大能设置到多大?

当然我现在设置的 1024 也能用。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
 楼主| 发表于 2021-2-4 12:20:24 | 显示全部楼层
ihavedone 发表于 2021-2-4 12:16
不弹出直接拔U盘会损坏文件的问题搞定了。
把USB FIFO加大就好了。。
参考你的例程。后面注释部分是之 ...

H7的FIFO大小是4K

STM32H7 USB的4KB专用FIFO的分配问题
http://www.armbbs.cn/forum.php?m ... d=103438&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

58

主题

267

回帖

446

积分

高级会员

积分
446
发表于 2021-2-22 09:53:06 | 显示全部楼层
eric2013 发表于 2021-1-22 11:29
帮你用Win10测试了,我这里直接拔掉USB线也没问题。

硬汉兄,我这边 USBX 模拟U盘复制文件时有个问题,就是复制的进度条不会连续更新。
比如我现在复制一个 12M 的文件,更新进度是 8%-16%-24%...  这样子变化,中间就不动,看起来像是卡住了。
你遇到了这个问题吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
 楼主| 发表于 2021-2-22 11:17:52 | 显示全部楼层
ihavedone 发表于 2021-2-22 09:53
硬汉兄,我这边 USBX 模拟U盘复制文件时有个问题,就是复制的进度条不会连续更新。
比如我现在复制一个  ...

我这里拷贝过大电影文件,正常。
回复

使用道具 举报

22

主题

141

回帖

207

积分

高级会员

积分
207
发表于 2024-10-1 01:58:33 | 显示全部楼层
用fx_media_write函数,格式化模拟的U盘搞定没?
回复

使用道具 举报

22

主题

141

回帖

207

积分

高级会员

积分
207
发表于 2024-10-1 02:18:58 | 显示全部楼层
ihavedone 发表于 2021-1-21 09:25
这个问题我之前发过帖子,原因是 fx_media_write 函数里面判断了写入的sector号,如果是 0 就报错。所以这 ...

有两处if ((logical_sector == 0) || (logical_sector == ((ULONG)0xFFFFFFFF)))屏蔽了就可以格式化了。
回复

使用道具 举报

655

主题

3299

回帖

5289

积分

论坛元老

积分
5289
发表于 2024-10-1 16:45:29 | 显示全部楼层
ccschen 发表于 2024-10-1 02:18
有两处if ((logical_sector == 0) || (logical_sector == ((ULONG)0xFFFFFFFF)))屏蔽了就可以格式化了。

牛鼻我, 不过我现在很久都没有捣鼓 filex 系统了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-11-1 06:49 , Processed in 0.579870 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表