I am successfully creating a FAT FS on a QSPI NOR flash - the problem was an error in the flash driver when 512 byte sector emulation was being used. I do this in my bringup code:
struct qspi_dev_s *qspi_flashmem;

qspi_flashmem = sam_qspi_initialize(0);
...
mtd_qspi = gd55_initialize(qspi_flashmem, 0);
...
mtd_qspi0 = mtd_partition(mtd_qspi, 0, QSPI0_SIZE);...
...
ret = register_mtddriver("/dev/qspi0", mtd_qspi0, 0744, NULL);
...
mtd_qspi1 = mtd_partition(mtd_qspi, QSPI0_SIZE, QSPI1_SIZE);
...
ret = register_mtddriver("/dev/qspi1", mtd_qspi1, 0755, NULL);
ret = nx_mount("/dev/qspi1", "/mnt/qspi1lfs", "littlefs", 0, "autoformat");
etc.

The GD55 driver is using 512 byte simulation, but s512_initialize() works just as well.

I can then use mkfatfs to create a FAT FS and mount it and all is good.

mkfats fs is not available to use in bringup code as I understand it otherwise I would mount the FS in my bringup too.

On 01/11/2024 02:07, Xiang Xiao wrote:
On Wed, Oct 30, 2024 at 2:00 AM Tim Hardisty <timhardist...@gmail.com>
wrote:

Whilst FAT on a NOR flash may generally be seen a not such a great
idea...please ignore that and confirm if...

...I am right in deducing that I can't simply make a FAT file system on
(say) the third mtd partition (with 512 byte sector emulation)
(partitions 0, 1 and 2 are "raw" data) since FAT will treat the entire
flash devices as a "volume" and so fail to find a partition table at the
bottom end of the flash device?

The partition is different from the file system. A file system can mount on
either a block/mtd device, or a partition. FAT can work only with the block
device, so you can't mount FAT on a flash(mtd) device, only the special
designed file system(e.g. littlefs, smartfs, spiffs) can work with mtd
device directly. The traditional block based file system need FTL(flash
translation layer) to work with mtd device, so you can try dhara if you
really want to use FAT on flash device:
https://github.com/apache/nuttx/blob/master/drivers/mtd/dhara.c

If so, it no doubt explains why I can
format a FAT FS but not mount it.


Which command do you use to format the device or partition?

I could - perhaps should -  re-jig my partitions so partition 0 is used
for FAT, rather than partition 3, but before I do that are there any FAT
FA/NuttX gurus who can let me know if there is a way to do this (and
save me the hassle of reworking my bootstrap and MCUboot locations etc.
for now)?

You can format the device with GPT/MBR partition by:
https://github.com/apache/nuttx-apps/tree/master/fsutils/mkgpt
https://github.com/apache/nuttx-apps/tree/master/fsutils/mkmbr
But, the raw flash device normally doesn't use GPT/MBR partition, instead
hardcode the  partition in the code directly since CPU normally could run
firmware directly on flash devices which normally define a proprietary
partition scheme. For this case, you can use PTABLE/TXTABLE:
https://github.com/apache/nuttx/blob/master/fs/partition/fs_ptable.c
https://github.com/apache/nuttx/blob/master/fs/partition/fs_txtable.c

Reply via email to