NuttX supports FAT32 with long file names, but there is some details that you need to know to get it working. I will share here the issues that I was facing and how I fixed it.
The original FAT uses 8.3 (8 chars for name and 3 chars for extension), but it can supports files with up to 255 characters (including the extension).
To use it we need to enable long file name support in the menuconfig:
File Systems ---> [*] FAT file system [*] FAT upper/lower names [*] FAT long file names --------> (CONFIG_FAT_LFN=y) (255) FAT maximum file name size --------> (CONFIG_FAT_MAXFNAME=255)
Initially I will mount an empty SDCard to do my tests:
NuttShell (NSH) nsh> mount -t vfat /dev/mmcsd0 /mnt nsh> ls /mnt /mnt: nsh>
Let’s to create a small 8.3 file that will be renamed:
nsh> echo "Small file" > /mnt/tinyfile.txt nsh> ls -l /mnt/tinyfile.txt -rw-rw-rw- 12 /mnt/tinyfile.txt nsh>
Now I will try to rename it to a file with a long name:
nsh> mv /mnt/tinyfile.txt /mnt/this_is_a_file_with_a_long_name_jnsh>
Strange, while I was typing “this_is_a_file_with_a_long_name_just_for_test.txt” the typing was interrupted and the nsh> appeared.
Let see if the file was renamed:
nsh> ls /mnt /mnt: this_is_a_file_with_a_long_name_
Then I remembered that the max line size of NSH was just 60 (CONFIG_NSH_LINELEN=60), I will increase it to 300 characters:
Application Configuration ---> NSH Library ---> Command Line Configuration ---> (300) Max command line length --------> (CONFIG_NSH_LINELEN=300)
I will create a tinyfile.txt again and try to rename it:
nsh> mv /mnt/tinyfile.txt /mnt/this_is_a_file_with_a_long_name_just_for_test.txt nsh>
Right, now the nsh prompt accept the enter the name, but let see if the file was created correctly:
nsh> ls /mnt /mnt: this_is_a_file_with_a_long_name_ this_is_a_file_with_a_long_name_
Whoa, it created two files with same name? How it is possible? Don’t worry, these files are different. Opening the SDCard in the Linux I can see:
this_is_a_file_with_a_long_name_j
this_is_a_file_with_a_long_name_just_for_test.txt
So, the LS command is showing only 32 characters. After some investigation I discovered that CONFIG_NAME_MAX=32 was the issue. Let to increase it to 255:
RTOS Features ---> Files and I/O ---> (255) Maximum size of a file name --------> (CONFIG_NAME_MAX=255)
Now I can see the files:
nsh> ls /mnt /mnt: this_is_a_file_with_a_long_name_j this_is_a_file_with_a_long_name_just_for_test.txt
My next step is to create a file with 255 characters, like this:
this_file_will_have_a_big_filename_to_verify_how_to_work_with_files_with_long_names_our_test_need_to_have_the_max_filename_size_supported_by_fat32_that_means_it_could_have_up_to_255_characters_including_the_extension_in_the_filename_so_here_we_arrived.txt
nsh> echo "Test" > /mnt/this_file_will_have_a_big_filename_to_verify_how_to_work_with_files_with_long_names_our_test_need_to_have_the_max_filename_size_supported_by_fat32_that_means_it_could_have_up_to_255_characters_including_the_extension_in_the_filename_so_here_we_arrived.txt nsh> ls /mnt /mnt: this_file_will_have_a_big_filename_to_verify_how_to_work_with_files_with_long_names_our_test_need_to_have_the_max_filename_size_supported_by_fat32_that_means_it_could_have_up_to_255_characters_including_the_extension_in_the_filename_so_here_we_arrived.txt nsh>
Very nice! It worked correctly.
As you can see NuttX is similar to Linux kernel, many features depends on other features’ configuration. They are inter-dependent.