嵌入式开发者社区

标题: 【已解决】USB_HOST_MSC例程中,怎么实现SD卡格式化? [打印本页]

作者: lushidegreen    时间: 2016-12-29 09:53
标题: 【已解决】USB_HOST_MSC例程中,怎么实现SD卡格式化?
目前开发的产品已经到后期阶段,有一个功能是格式化SD卡,不知道怎么实现。
硬件使用了USB HUB芯片,DSP通过USB访问SD卡,配合FATFS读写文件都已经完成。
在例程USB_HOST_MSC的disk_ioctl( )函数中,只提供了一个响应CTRL_SYNC,因此无法完成格式化
  1. // 磁盘 IO
  2. DRESULT disk_ioctl(BYTE drv, BYTE ctrl, void *buff)
  3. {
  4.     if(USBStat & STA_NOINIT)
  5.     {
  6.         return(RES_NOTRDY);
  7.     }

  8.     switch(ctrl)
  9.     {
  10.         case CTRL_SYNC:
  11.             return(RES_OK);
  12.         default:
  13.             return(RES_PARERR);
  14.     }
  15. }
复制代码



作者: lushidegreen    时间: 2016-12-29 09:58
完整的还应该包括对GET_SECTOR_COUNT,GET_SECTOR_SIZE,GET_BLOCK_SIZE的响应。代码如下:
  1. DRESULT disk_ioctl(BYTE drv, BYTE ctrl, void *buff)
  2. {
  3.     if(USBStat & STA_NOINIT)
  4.     {
  5.         return(RES_NOTRDY);
  6.     }

  7.     switch(ctrl)
  8.     {
  9.            /* Make sure that no pending write process */
  10.         case CTRL_SYNC:
  11.             return(RES_OK);
  12.             /* Get number of sectors on the disk (DWORD) */
  13.         case GET_SECTOR_COUNT:
  14.                 *(DWORD*)buff = 0;
  15.                 return(RES_OK);
  16.                 /* Get R/W sector size (WORD) */
  17.         case GET_SECTOR_SIZE:        // 扇区大小固定为512
  18.                 *(WORD*)buff = 512;
  19.                 return(RES_OK);
  20.                 /* Get erase block size in unit of sector (DWORD) */
  21.         case GET_BLOCK_SIZE:
  22.                 *(DWORD*)buff = 512;
  23.                 return(RES_OK);
  24.         default:
  25.             return(RES_PARERR);
  26.     }
  27. }
复制代码
已知GET_SECTOR_SIZE和GET_BLOCK_SIZE固定为扇区大小,即512。

我现在遇到的问题是,对GET_SECTOR_COUNT的响应。其功能是获取总扇区数。
切盼高人指点!





作者: 希望缄默    时间: 2016-12-30 10:07
lushidegreen 发表于 2016-12-29 09:58
完整的还应该包括对GET_SECTOR_COUNT,GET_SECTOR_SIZE,GET_BLOCK_SIZE的[/backc ...

这个应该是需要 USB 读卡器返回相关信息的
@Lewis 来看下吧
作者: lushidegreen    时间: 2017-1-2 09:02
希望缄默 发表于 2016-12-30 10:07
这个应该是需要 USB 读卡器返回相关信息的
@Lewis 来看下吧

@Lewis ,熊工帮帮忙!
作者: lushidegreen    时间: 2017-1-2 09:36
希望缄默 发表于 2016-12-30 10:07
这个应该是需要 USB 读卡器返回相关信息的
@Lewis 来看下吧

@Lewis ,熊工帮帮忙!
作者: lushidegreen    时间: 2017-1-4 11:45
希望缄默 发表于 2016-12-30 10:07
这个应该是需要 USB 读卡器返回相关信息的
@Lewis 来看下吧

斌哥,能不能请熊工帮我解决一下这个问题?急啊
作者: Lewis    时间: 2017-1-6 20:39
建议通过电脑获取这个参数直接添加到程序里,否则还要在USB的驱动里实现这个功能,这样就比较麻烦
作者: lushidegreen    时间: 2017-1-9 09:10
Lewis 发表于 2017-1-6 20:39
建议通过电脑获取这个参数直接添加到程序里,否则还要在USB的驱动里实现这个功能,这样就比较麻烦 ...

(⊙o⊙)…这不是解决之道吧
我现在是实现产品的功能,不是做实验。
用户用什么容量的卡,根本不可能知道。
麻烦也要实现啊
作者: Lewis    时间: 2017-1-9 16:21
lushidegreen 发表于 2017-1-9 09:10
(⊙o⊙)…这不是解决之道吧
我现在是实现产品的功能,不是做实验。
用户用什么容量的卡,根本不可能知道 ...

那只能自己实现这部分驱动
作者: lushidegreen    时间: 2017-1-9 16:42
Lewis 发表于 2017-1-9 16:21
那只能自己实现这部分驱动

我要是有能力自己实现,就不会在这里发帖求助了
作者: lushidegreen    时间: 2017-2-15 15:40
问题已经得到解决。
SD卡总扇区数在物理0扇区地址0x01CA~01CD的四个字节。
通过disk_read()函数读取,然后计算即可。


作者: lushidegreen    时间: 2017-2-15 15:47
参考资料
http://blog.csdn.net/mjx91282041/article/details/8904705/
作者: human    时间: 2017-2-15 16:06
点赞
作者: 希望缄默    时间: 2017-2-16 08:29
厉害~
作者: quwenqi    时间: 2017-11-6 11:22
我也作这个,做产品,能交流下吗,13417388251




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4