硬汉嵌入式论坛

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

[FileX] fx_media_open 失败

[复制链接]

2

主题

3

回帖

9

积分

新手上路

积分
9
发表于 2021-9-16 10:45:07 | 显示全部楼层 |阅读模式
调用fx_media_open出错返回状态 0x03 FX_FAT_READ_ERROR,
独立使用FileX,磁盘驱动是sdio SD卡,SD裸驱在fatfs文件系统上能正常使用。
SD卡预先使用SD formatter 格式化工具格式了。不知道怎么解决了...


回复

使用道具 举报

2

主题

3

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2021-9-16 17:29:21 | 显示全部楼层
在 fx_media_open 定位了下, 问题好像出在这个地方,最后cluster_number 、FAT_entry都为0,导致出错,返回FX_FAT_READ_ERROR
SD卡的格式有什么特殊要求吗,单纯就用了官方的工具格式化了。

for (cluster_number = media_ptr -> fx_media_root_cluster_32;;)
        {

            status =  _fx_utility_FAT_entry_read(media_ptr, cluster_number, &FAT_entry);
            i++;
            /* Determine if the read was successful.  */
            if (status != FX_SUCCESS)
            {

                /* Build the "uninitialize" I/O driver request.  */
                media_ptr -> fx_media_driver_request =      FX_DRIVER_UNINIT;
                media_ptr -> fx_media_driver_status =       FX_IO_ERROR;

                /* If trace is enabled, insert this event into the trace buffer.  */
                FX_TRACE_IN_LINE_INSERT(FX_TRACE_INTERNAL_IO_DRIVER_UNINIT, media_ptr, 0, 0, 0, FX_TRACE_INTERNAL_EVENTS, 0, 0)

                /* Call the specified I/O driver with the uninitialize request.  */
                (media_ptr -> fx_media_driver_entry) (media_ptr);

                return(FX_FAT_READ_ERROR);
            }

            if ((cluster_number == FAT_entry) || (i > media_ptr -> fx_media_total_clusters))
            {

                /* Build the "uninitialize" I/O driver request.  */
                media_ptr -> fx_media_driver_request =      FX_DRIVER_UNINIT;
                media_ptr -> fx_media_driver_status =       FX_IO_ERROR;

                /* If trace is enabled, insert this event into the trace buffer.  */
                FX_TRACE_IN_LINE_INSERT(FX_TRACE_INTERNAL_IO_DRIVER_UNINIT, media_ptr, 0, 0, 0, FX_TRACE_INTERNAL_EVENTS, 0, 0)

                /* Call the specified I/O driver with the uninitialize request.  */
                (media_ptr -> fx_media_driver_entry) (media_ptr);

                return(FX_FAT_READ_ERROR);
            }
            if (FAT_entry >= FX_RESERVED_1_32)
            {
                break;
            }
            cluster_number = FAT_entry;
        }
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
发表于 2021-9-17 08:57:06 | 显示全部楼层
考虑换个卡试试,使用SD卡联盟那个小软件格式化。另外容量超过32GB要使能exfat
还是不行,那么底层移植确实有点问题了。
回复

使用道具 举报

2

主题

3

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2021-9-17 14:34:37 | 显示全部楼层
解决了,应该是格式化的问题。
一开始,Diskgenius、SD Association的格式化工具,我只使用了快速格式化功能。无法被FileX识别。
之后用FileX自带的格式化程序fx_media_format,简单的格了几十k的空间,再次fx_media_open挂上去了,程序也能正常执行。
估计用格式化工具可能要先使用全盘格式化后再建文件系统,就不会出问题。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
发表于 2021-9-19 09:55:05 | 显示全部楼层
henji 发表于 2021-9-17 14:34
解决了,应该是格式化的问题。
一开始,Diskgenius、SD Association的格式化工具,我只使用了快速格式化功 ...

谢谢告知最终原因。
回复

使用道具 举报

5

主题

196

回帖

211

积分

高级会员

积分
211
发表于 2021-9-20 04:07:12 | 显示全部楼层
一般是接口没适配好,注意offet的计算。一些版本fileX代码里有bug,可能传一个无效的fx_media_driver_logical_sector参数到底层接口。这会导致IO问题。
给一段注释好的sample code (适配sdcard,我的框架里已经把sdcard抽象成了device):
  1. /*
  2. ***********************************************************************
  3. *  Copyright (c) 2021 alex Yang
  4. *
  5. *  @file    fx_sdcard_driver.c
  6. *  @brief   This file implements driver api needed by fileX
  7. *  @history
  8. *   Version            Date            Author          Modification
  9. *   V1.0.0             Jul-4-2021      null.yang       create file
  10. *
  11. *
  12. ***********************************************************************
  13. */

  14. /**************************************************************************/
  15. /**************************************************************************/
  16. /**                                                                       */
  17. /** FileX Component                                                       */
  18. /**                                                                       */
  19. /**   SDCard Driver                                                       */
  20. /**                                                                       */
  21. /**************************************************************************/
  22. /**************************************************************************/


  23. /* Include necessary system files.  */

  24. #include "sys_typedef.h"
  25. #include "sys_errorno.h"
  26. #include "sys_startup.h"
  27. #include "sys_macro.h"
  28. #include "time_base.h"
  29. #include "device_core.h"

  30. #include "fx_api.h"

  31. /*
  32.     The SDCard driver relies on the fx_media_format call to be made prior to
  33.     the fx_media_open call. The following call will format the default
  34.     128MB SDCard drive, with a sector size of 512 bytes per sector.

  35.         fx_media_format(&sdcard_disk,
  36.                         _fx_sdcard_driver,      // Driver entry
  37.                         sdcard_disk_memory,     // SDCard disk memory pointer
  38.                         media_memory,           // Media buffer pointer
  39.                         sizeof(media_memory),   // Media buffer size
  40.                         "MY_SDCARD",            // Volume Name
  41.                         1,                      // Number of FATs
  42.                         128 * 1024,             // Directory Entries
  43.                         0,                      // Hidden sectors
  44.                         256,                    // Total sectors
  45.                         512,                    // Sector size
  46.                         1,                      // Sectors per cluster
  47.                         1,                      // Heads
  48.                         1);                     // Sectors per track
  49. */


  50. /* public api declearation */
  51. VOID _fx_sdcard_driver(FX_MEDIA *media_ptr);

  52. /* external api references */
  53. UINT _fx_partition_offset_calculate(void *partition_sector, UINT partition, ULONG *partition_start, ULONG *partition_size);


  54. /*
  55.     There are several useful/important pieces of information contained in
  56.     the media structure, some of which are supplied by FileX and others
  57.     are for the driver to setup. The following is a summary of the
  58.     necessary FX_MEDIA structure members:

  59.         FX_MEDIA Member                    Meaning

  60.     fx_media_driver_request             FileX request type. Valid requests from
  61.                                         FileX are as follows:

  62.                                                 FX_DRIVER_READ
  63.                                                 FX_DRIVER_WRITE
  64.                                                 FX_DRIVER_FLUSH
  65.                                                 FX_DRIVER_ABORT
  66.                                                 FX_DRIVER_INIT
  67.                                                 FX_DRIVER_BOOT_READ
  68.                                                 FX_DRIVER_RELEASE_SECTORS
  69.                                                 FX_DRIVER_BOOT_WRITE
  70.                                                 FX_DRIVER_UNINIT

  71.     fx_media_driver_status              This value is RETURNED by the driver.
  72.                                         If the operation is successful, this
  73.                                         field should be set to FX_SUCCESS for
  74.                                         before returning. Otherwise, if an
  75.                                         error occurred, this field should be
  76.                                         set to FX_IO_ERROR.

  77.     fx_media_driver_buffer              Pointer to buffer to read or write
  78.                                         sector data. This is supplied by
  79.                                         FileX.

  80.     fx_media_driver_logical_sector      Logical sector FileX is requesting.

  81.     fx_media_driver_sectors             Number of sectors FileX is requesting.


  82.    The following is a summary of the optional FX_MEDIA structure members:

  83.         FX_MEDIA Member                              Meaning

  84.     fx_media_driver_info                Pointer to any additional information
  85.                                         or memory. This is optional for the
  86.                                         driver use and is setup from the
  87.                                         fx_media_open call. The RAM disk uses
  88.                                         this pointer for the RAM disk memory
  89.                                         itself.

  90.     fx_media_driver_write_protect       The DRIVER sets this to FX_TRUE when
  91.                                         media is write protected. This is
  92.                                         typically done in initialization,
  93.                                         but can be done anytime.

  94.     fx_media_driver_free_sector_update  The DRIVER sets this to FX_TRUE when
  95.                                         it needs to know when clusters are
  96.                                         released. This is important for FLASH
  97.                                         wear-leveling drivers.

  98.     fx_media_driver_system_write        FileX sets this flag to FX_TRUE if the
  99.                                         sector being written is a system sector,
  100.                                         e.g., a boot, FAT, or directory sector.
  101.                                         The driver may choose to use this to
  102.                                         initiate error recovery logic for greater
  103.                                         fault tolerance.

  104.     fx_media_driver_data_sector_read    FileX sets this flag to FX_TRUE if the
  105.                                         sector(s) being read are file data sectors,
  106.                                         i.e., NOT system sectors.

  107.     fx_media_driver_sector_type         FileX sets this variable to the specific
  108.                                         type of sector being read or written. The
  109.                                         following sector types are identified:

  110.                                                 FX_UNKNOWN_SECTOR
  111.                                                 FX_BOOT_SECTOR
  112.                                                 FX_FAT_SECTOR
  113.                                                 FX_DIRECTORY_SECTOR
  114.                                                 FX_DATA_SECTOR
  115. */
  116. VOID _fx_sdcard_driver(FX_MEDIA *media_ptr)
  117. {
  118.     device_t *sdcard = (device_t *)media_ptr->fx_media_driver_info;

  119.     /* check driver info */
  120.     if (NULL == sdcard)
  121.     {
  122.         media_ptr->fx_media_driver_status = FX_NOT_AVAILABLE;
  123.         return;
  124.     }

  125.     /* mapping logical sectors and the physical geometry of the media */
  126.     media_ptr->fx_media_driver_physical_sector = (media_ptr->fx_media_driver_logical_sector %
  127.                                                   media_ptr->fx_media_sectors_per_track) + 1;

  128.     /* media request handler */
  129.     switch (media_ptr->fx_media_driver_request)
  130.     {
  131.         case FX_DRIVER_READ:
  132.         {
  133.             /* Read from sectors and return data to caller */
  134.             uint32_t sdcard_start_sector = (uint32_t)media_ptr->fx_media_driver_logical_sector +
  135.                                            (uint32_t)media_ptr->fx_media_hidden_sectors;
  136.             uint32_t sdcard_read_cnt     = (uint32_t)media_ptr->fx_media_driver_sectors;
  137.             uint8_t *sdcard_read_buffer  = (uint8_t *)media_ptr->fx_media_driver_buffer;

  138.             /* break with err if sector_cnt equals 0 */
  139.             if (0 == sdcard_read_cnt)
  140.             {
  141.                 /* break directly to return failed driver request */
  142.                 break;
  143.             }

  144.             /* block device uses sector index rather than data address as offset */
  145.             if (sdcard_read_cnt != device_read(sdcard, sdcard_start_sector, &sdcard_read_buffer[0], sdcard_read_cnt))
  146.             {
  147.                 break;
  148.             }

  149.             /* Return successful driver request */
  150.             media_ptr->fx_media_driver_status = FX_SUCCESS;
  151.             break;
  152.         }
  153.         case FX_DRIVER_WRITE:
  154.         {
  155.             /* Write data from caller to the sectors */
  156.             uint32_t sdcard_start_sector = (uint32_t)media_ptr->fx_media_driver_logical_sector +
  157.                                            (uint32_t)media_ptr->fx_media_hidden_sectors;
  158.             uint32_t sdcard_write_cnt    = (uint32_t)media_ptr->fx_media_driver_sectors;
  159.             uint8_t *sdcard_write_buffer = (uint8_t *)media_ptr->fx_media_driver_buffer;

  160.             /* break with err if sector_cnt equals 0 */
  161.             if (0 == sdcard_write_cnt)
  162.             {
  163.                 /* break directly to return failed driver request */
  164.                 break;
  165.             }

  166.             /* block device uses sector index rather than data address as offset */
  167.             if (sdcard_write_cnt != device_write(sdcard, sdcard_start_sector, &sdcard_write_buffer[0], sdcard_write_cnt))
  168.             {
  169.                 break;
  170.             }

  171.             /* Return successful driver request */
  172.             media_ptr->fx_media_driver_status = FX_SUCCESS;
  173.             break;
  174.         }
  175.         case FX_DRIVER_FLUSH:
  176.         {
  177.             /* Return successful driver request */
  178.             media_ptr->fx_media_driver_status = FX_SUCCESS;
  179.             break;
  180.         }
  181.         case FX_DRIVER_ABORT:
  182.         {
  183.             /* Return successful driver request */
  184.             media_ptr->fx_media_driver_status = FX_SUCCESS;
  185.             break;
  186.         }
  187.         case FX_DRIVER_INIT:
  188.         {
  189.             /* FLASH drivers are responsible for setting several fields in the
  190.                media structure, as follows:

  191.                     media_ptr -> fx_media_driver_free_sector_update
  192.                     media_ptr -> fx_media_driver_write_protect

  193.                The fx_media_driver_free_sector_update flag is used to instruct
  194.                FileX to inform the driver whenever sectors are not being used.
  195.                This is especially useful for FLASH managers so they don't have
  196.                maintain mapping for sectors no longer in use.

  197.                The fx_media_driver_write_protect flag can be set anytime by the
  198.                driver to indicate the media is not writable.
  199.                Write attempts are made when this flag is set are returned as errors */

  200.             /* Perform basic initialization here since the boot record is going
  201.                to be read subsequently and again for volume name requests */

  202.             /* Return successful driver request */
  203.             media_ptr->fx_media_driver_status = FX_SUCCESS;
  204.             break;
  205.         }
  206.         case FX_DRIVER_UNINIT:
  207.         {
  208.             /* There is nothing to do in this case for the RAM driver
  209.                For actual devices some shutdown processing may be necessary */

  210.             /* Return successful driver request */
  211.             media_ptr->fx_media_driver_status = FX_SUCCESS;
  212.             break;
  213.         }
  214.         case FX_DRIVER_BOOT_READ:
  215.         {
  216.             /* MBR locates in sector[0] */
  217.             uint32_t sdcard_start_sector    = (uint32_t)0u;
  218.             uint32_t sdcard_read_cnt        = (uint32_t)1u;
  219.             uint32_t sdcard_partition_start = (uint32_t)0u;
  220.             uint32_t sdcard_partition_size  = (uint32_t)0u;
  221.             uint8_t *sdcard_read_buffer     = (uint8_t *)media_ptr->fx_media_driver_buffer;

  222.             /* check sector_type */
  223.             if (FX_BOOT_SECTOR != media_ptr->fx_media_driver_sector_type)
  224.             {
  225.                 /* break directly to return failed driver request */
  226.                 break;
  227.             }

  228.             /* block device uses sector index rather than data address as offset */
  229.             if (sdcard_read_cnt != device_read(sdcard, sdcard_start_sector, &sdcard_read_buffer[0], sdcard_read_cnt))
  230.             {
  231.                 break;
  232.             }

  233.             /* calculate and check if sector[0] is the actual boot sector */
  234.             if (_fx_partition_offset_calculate(media_ptr->fx_media_driver_buffer, 0, &sdcard_partition_start, &sdcard_partition_size))
  235.             {
  236.                 break;
  237.             }

  238.             if (sdcard_partition_start)
  239.             {
  240.                 if (sdcard_read_cnt != device_read(sdcard, sdcard_partition_start, &sdcard_read_buffer[0], sdcard_read_cnt))
  241.                 {
  242.                     break;
  243.                 }
  244.             }

  245.             /* Return successful driver request */
  246.             media_ptr->fx_media_driver_status = FX_SUCCESS;
  247.             break;
  248.         }
  249.         case FX_DRIVER_BOOT_WRITE:
  250.         {
  251.             /* MBR locates in sector[0] */
  252.             uint32_t sdcard_start_sector    = (uint32_t)media_ptr->fx_media_hidden_sectors;
  253.             uint32_t sdcard_write_cnt       = (uint32_t)1u;
  254.             uint8_t *sdcard_write_buffer    = (uint8_t *)media_ptr->fx_media_driver_buffer;

  255.             /* check sector_type */
  256.             if (FX_BOOT_SECTOR != media_ptr->fx_media_driver_sector_type)
  257.             {
  258.                 /* break directly to return failed driver request */
  259.                 break;
  260.             }

  261.             /* block device uses sector index rather than data address as offset */
  262.             if (sdcard_write_cnt != device_write(sdcard, sdcard_start_sector, &sdcard_write_buffer[0], sdcard_write_cnt))
  263.             {
  264.                 break;
  265.             }

  266.             /* Return successful driver request */
  267.             media_ptr->fx_media_driver_status = FX_SUCCESS;
  268.             break;
  269.         }
  270.         default:
  271.         {
  272.             /* Return invalid driver request */
  273.             media_ptr->fx_media_driver_status = FX_IO_ERROR;
  274.             break;
  275.         }
  276.     }

  277.     return;
  278. }
复制代码
回复

使用道具 举报

6

主题

24

回帖

42

积分

新手上路

积分
42
发表于 2021-10-10 10:29:53 | 显示全部楼层
eric2013 发表于 2021-9-17 08:57
考虑换个卡试试,使用SD卡联盟那个小软件格式化。另外容量超过32GB要使能exfat
还是不行,那么底层移植确 ...

硬汉大佬 有没有试过把sd卡格式化成ntfs或exfat,再通过fx_media_format()来格式化?我用stm32cubemx生成的stm32f407的filex代码必须要将卡格式化成fat32才能打开,格式化成其他文件系统再调用fx_media_format()来格式化将导致检测卡失败,而导致一直卡死在格式化
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
发表于 2021-10-10 11:09:17 | 显示全部楼层
老鸟kkk 发表于 2021-10-10 10:29
硬汉大佬 有没有试过把sd卡格式化成ntfs或exfat,再通过fx_media_format()来格式化?我用stm32cubemx生成 ...

使用exfat要使能下,这个你使能了吧
回复

使用道具 举报

6

主题

24

回帖

42

积分

新手上路

积分
42
发表于 2021-10-10 11:47:20 | 显示全部楼层
eric2013 发表于 2021-10-10 11:09
使用exfat要使能下,这个你使能了吧

是想把已经格式化成exfat或ntfs的卡,调用fx_media_format()格式化成fat32,通过调试发现在调用格式化函数中检测卡状态失败

exfat使能已经打开了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 18:24 , Processed in 0.187421 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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