You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@nuttx.apache.org by Matteo Golin <ma...@gmail.com> on 2026/04/28 17:56:22 UTC
Toggled on USB mass storage in a device
Hello,
I am currently working on a project for a device which logs some data to
its own flash memory. I then want to be able to extract this data to a host
device (laptop, desktop, etc.) over a USB connection. For this, my aim was
to use USB mass storage.
Looking at the docs for it (
https://nuttx.apache.org/docs/latest/applications/system/usbmsc/index.html),
it appears that in order to allow the files to be downloadable over USB, I
need to first unmount the file system that the files were stored in so that
the USB interaction doesn't corrupt them. Is there any way around this, or
is there a way to make the USB mass storage read only to avoid potential
corruption? Not the biggest deal if not.
I also see that the default commands for this feature are msconn/msdis. I
would be connecting/disconnecting via my own application, which I suppose
means I would perform this via ioctls/something. My device will also be
using a shell over USB. Is it possible to have the shell functionality
suspended by a similar command to `msconn` and then restored when the host
driver "ejects" the USB mass storage device? This way the user can toggle
between doing other things in the shell and extracting files.
If anyone has used this feature and has tips, let me know!
Best,
Matteo
Re: Toggled on USB mass storage in a device
Posted by Tim Hardisty <ti...@gmail.com>.
I should add that it was a union of a fat formatted RAM disk over the LittleFS file system on (external), partitioned flash.
> On 29 Apr 2026, at 01:54, Matteo Golin <ma...@gmail.com> wrote:
>
> Thanks Tim! Hadn't heard of Union FS until now, I'll check it into that!
>
> Matteo
>
>> On Tue, Apr 28, 2026 at 4:46 PM Tim Hardisty <ti...@gmail.com>
>> wrote:
>>
>>
>> I did FAT overlay of LittleFS using the NuttX Union FS. Works, but lots of
>> faffing about!
>>
>> Also used USB composite for USBMSD and CDCNCM.
>>
>> This can all be done as I think you need/want!
>>
>>>> On 28 Apr 2026, at 20:38, Matteo Golin <ma...@gmail.com> wrote:
>>>
>>> Hi Alan,
>>>
>>> Yes, I would be using the MCU's own on-package flash. Thanks for the
>>> helpful blog link! I was also planning to use SmartFS so this revealed a
>>> new challenge: converting from SmartFS to FAT so that users have an easy
>>> experience. This sounds like it might be more of a challenge than I
>>> originally thought. I hadn't heard of MTP before, so maybe I'll take a
>> look
>>> at that. If it can circumvent this filesystem compatibility thing, that
>>> would be awesome.
>>>
>>> Thanks for the help!
>>> Matteo
>>>
>>>> On Tue, Apr 28, 2026 at 3:24 PM Alan C. Assis <ac...@gmail.com>
>> wrote:
>>>>
>>>> Hi Matteo,
>>>>
>>>> If by "its own flash memory" you mean the internal MCU flash memory,
>> then I
>>>> never tried it.
>>>>
>>>> But, for external SPI Flash you can just use the flash device as USB MSC
>>>> LUN as I did here:
>>>>
>>>>
>> https://acassis.wordpress.com/2016/01/03/using-the-nuttxs-usb-mass-storage-to-copy-spi-nor-flash-content/
>>>>
>>>> In my case I was using SmartFS and downloading the raw content and then
>>>> mounting it later on the computer using FUSE SmarFS driver that Ken
>> Pettit
>>>> created.
>>>>
>>>> If you are using FAT FS you don't need this step, but of course if some
>>>> application is writing in the flash while you copy it, the Mass Storage
>>>> could get corrupted.
>>>>
>>>> I think it is possible to force the USB MSC to be exported as RDONLY,
>> but I
>>>> didn't see this option in the NuttX menuconfig, it could be a good
>>>> addition.
>>>>
>>>> BTW, I think the best alternative should be using MTP instead of MSC.
>> Seems
>>>> like Xiaomi contributed a USB MTP to drivers/usbdev/ but looking at the
>>>> source code I noticed it is only a wrapper, maybe for some userspace
>>>> implementation.
>>>>
>>>> This is the problem with hidden features: someone submits a contribution
>>>> without any documentation or board config, so people will have
>> difficulty
>>>> understanding and making it work.
>>>>
>>>> BR,
>>>>
>>>> Alan
>>>>
>>>>
>>>>
>>>> On Tue, Apr 28, 2026 at 2:56 PM Matteo Golin <ma...@gmail.com>
>>>> wrote:
>>>>
>>>>> Hello,
>>>>>
>>>>> I am currently working on a project for a device which logs some data
>> to
>>>>> its own flash memory. I then want to be able to extract this data to a
>>>> host
>>>>> device (laptop, desktop, etc.) over a USB connection. For this, my aim
>>>> was
>>>>> to use USB mass storage.
>>>>>
>>>>> Looking at the docs for it (
>>>>>
>>>>
>> https://nuttx.apache.org/docs/latest/applications/system/usbmsc/index.html
>>>>> ),
>>>>> it appears that in order to allow the files to be downloadable over
>> USB,
>>>> I
>>>>> need to first unmount the file system that the files were stored in so
>>>> that
>>>>> the USB interaction doesn't corrupt them. Is there any way around this,
>>>> or
>>>>> is there a way to make the USB mass storage read only to avoid
>> potential
>>>>> corruption? Not the biggest deal if not.
>>>>>
>>>>> I also see that the default commands for this feature are
>> msconn/msdis. I
>>>>> would be connecting/disconnecting via my own application, which I
>> suppose
>>>>> means I would perform this via ioctls/something. My device will also be
>>>>> using a shell over USB. Is it possible to have the shell functionality
>>>>> suspended by a similar command to `msconn` and then restored when the
>>>> host
>>>>> driver "ejects" the USB mass storage device? This way the user can
>> toggle
>>>>> between doing other things in the shell and extracting files.
>>>>>
>>>>> If anyone has used this feature and has tips, let me know!
>>>>>
>>>>> Best,
>>>>> Matteo
>>>>>
>>>>
>>
Re: Toggled on USB mass storage in a device
Posted by Matteo Golin <ma...@gmail.com>.
Thanks Tim! Hadn't heard of Union FS until now, I'll check it into that!
Matteo
On Tue, Apr 28, 2026 at 4:46 PM Tim Hardisty <ti...@gmail.com>
wrote:
>
> I did FAT overlay of LittleFS using the NuttX Union FS. Works, but lots of
> faffing about!
>
> Also used USB composite for USBMSD and CDCNCM.
>
> This can all be done as I think you need/want!
>
> > On 28 Apr 2026, at 20:38, Matteo Golin <ma...@gmail.com> wrote:
> >
> > Hi Alan,
> >
> > Yes, I would be using the MCU's own on-package flash. Thanks for the
> > helpful blog link! I was also planning to use SmartFS so this revealed a
> > new challenge: converting from SmartFS to FAT so that users have an easy
> > experience. This sounds like it might be more of a challenge than I
> > originally thought. I hadn't heard of MTP before, so maybe I'll take a
> look
> > at that. If it can circumvent this filesystem compatibility thing, that
> > would be awesome.
> >
> > Thanks for the help!
> > Matteo
> >
> >> On Tue, Apr 28, 2026 at 3:24 PM Alan C. Assis <ac...@gmail.com>
> wrote:
> >>
> >> Hi Matteo,
> >>
> >> If by "its own flash memory" you mean the internal MCU flash memory,
> then I
> >> never tried it.
> >>
> >> But, for external SPI Flash you can just use the flash device as USB MSC
> >> LUN as I did here:
> >>
> >>
> https://acassis.wordpress.com/2016/01/03/using-the-nuttxs-usb-mass-storage-to-copy-spi-nor-flash-content/
> >>
> >> In my case I was using SmartFS and downloading the raw content and then
> >> mounting it later on the computer using FUSE SmarFS driver that Ken
> Pettit
> >> created.
> >>
> >> If you are using FAT FS you don't need this step, but of course if some
> >> application is writing in the flash while you copy it, the Mass Storage
> >> could get corrupted.
> >>
> >> I think it is possible to force the USB MSC to be exported as RDONLY,
> but I
> >> didn't see this option in the NuttX menuconfig, it could be a good
> >> addition.
> >>
> >> BTW, I think the best alternative should be using MTP instead of MSC.
> Seems
> >> like Xiaomi contributed a USB MTP to drivers/usbdev/ but looking at the
> >> source code I noticed it is only a wrapper, maybe for some userspace
> >> implementation.
> >>
> >> This is the problem with hidden features: someone submits a contribution
> >> without any documentation or board config, so people will have
> difficulty
> >> understanding and making it work.
> >>
> >> BR,
> >>
> >> Alan
> >>
> >>
> >>
> >> On Tue, Apr 28, 2026 at 2:56 PM Matteo Golin <ma...@gmail.com>
> >> wrote:
> >>
> >>> Hello,
> >>>
> >>> I am currently working on a project for a device which logs some data
> to
> >>> its own flash memory. I then want to be able to extract this data to a
> >> host
> >>> device (laptop, desktop, etc.) over a USB connection. For this, my aim
> >> was
> >>> to use USB mass storage.
> >>>
> >>> Looking at the docs for it (
> >>>
> >>
> https://nuttx.apache.org/docs/latest/applications/system/usbmsc/index.html
> >>> ),
> >>> it appears that in order to allow the files to be downloadable over
> USB,
> >> I
> >>> need to first unmount the file system that the files were stored in so
> >> that
> >>> the USB interaction doesn't corrupt them. Is there any way around this,
> >> or
> >>> is there a way to make the USB mass storage read only to avoid
> potential
> >>> corruption? Not the biggest deal if not.
> >>>
> >>> I also see that the default commands for this feature are
> msconn/msdis. I
> >>> would be connecting/disconnecting via my own application, which I
> suppose
> >>> means I would perform this via ioctls/something. My device will also be
> >>> using a shell over USB. Is it possible to have the shell functionality
> >>> suspended by a similar command to `msconn` and then restored when the
> >> host
> >>> driver "ejects" the USB mass storage device? This way the user can
> toggle
> >>> between doing other things in the shell and extracting files.
> >>>
> >>> If anyone has used this feature and has tips, let me know!
> >>>
> >>> Best,
> >>> Matteo
> >>>
> >>
>
Re: Toggled on USB mass storage in a device
Posted by Tim Hardisty <ti...@gmail.com>.
I did FAT overlay of LittleFS using the NuttX Union FS. Works, but lots of faffing about!
Also used USB composite for USBMSD and CDCNCM.
This can all be done as I think you need/want!
> On 28 Apr 2026, at 20:38, Matteo Golin <ma...@gmail.com> wrote:
>
> Hi Alan,
>
> Yes, I would be using the MCU's own on-package flash. Thanks for the
> helpful blog link! I was also planning to use SmartFS so this revealed a
> new challenge: converting from SmartFS to FAT so that users have an easy
> experience. This sounds like it might be more of a challenge than I
> originally thought. I hadn't heard of MTP before, so maybe I'll take a look
> at that. If it can circumvent this filesystem compatibility thing, that
> would be awesome.
>
> Thanks for the help!
> Matteo
>
>> On Tue, Apr 28, 2026 at 3:24 PM Alan C. Assis <ac...@gmail.com> wrote:
>>
>> Hi Matteo,
>>
>> If by "its own flash memory" you mean the internal MCU flash memory, then I
>> never tried it.
>>
>> But, for external SPI Flash you can just use the flash device as USB MSC
>> LUN as I did here:
>>
>> https://acassis.wordpress.com/2016/01/03/using-the-nuttxs-usb-mass-storage-to-copy-spi-nor-flash-content/
>>
>> In my case I was using SmartFS and downloading the raw content and then
>> mounting it later on the computer using FUSE SmarFS driver that Ken Pettit
>> created.
>>
>> If you are using FAT FS you don't need this step, but of course if some
>> application is writing in the flash while you copy it, the Mass Storage
>> could get corrupted.
>>
>> I think it is possible to force the USB MSC to be exported as RDONLY, but I
>> didn't see this option in the NuttX menuconfig, it could be a good
>> addition.
>>
>> BTW, I think the best alternative should be using MTP instead of MSC. Seems
>> like Xiaomi contributed a USB MTP to drivers/usbdev/ but looking at the
>> source code I noticed it is only a wrapper, maybe for some userspace
>> implementation.
>>
>> This is the problem with hidden features: someone submits a contribution
>> without any documentation or board config, so people will have difficulty
>> understanding and making it work.
>>
>> BR,
>>
>> Alan
>>
>>
>>
>> On Tue, Apr 28, 2026 at 2:56 PM Matteo Golin <ma...@gmail.com>
>> wrote:
>>
>>> Hello,
>>>
>>> I am currently working on a project for a device which logs some data to
>>> its own flash memory. I then want to be able to extract this data to a
>> host
>>> device (laptop, desktop, etc.) over a USB connection. For this, my aim
>> was
>>> to use USB mass storage.
>>>
>>> Looking at the docs for it (
>>>
>> https://nuttx.apache.org/docs/latest/applications/system/usbmsc/index.html
>>> ),
>>> it appears that in order to allow the files to be downloadable over USB,
>> I
>>> need to first unmount the file system that the files were stored in so
>> that
>>> the USB interaction doesn't corrupt them. Is there any way around this,
>> or
>>> is there a way to make the USB mass storage read only to avoid potential
>>> corruption? Not the biggest deal if not.
>>>
>>> I also see that the default commands for this feature are msconn/msdis. I
>>> would be connecting/disconnecting via my own application, which I suppose
>>> means I would perform this via ioctls/something. My device will also be
>>> using a shell over USB. Is it possible to have the shell functionality
>>> suspended by a similar command to `msconn` and then restored when the
>> host
>>> driver "ejects" the USB mass storage device? This way the user can toggle
>>> between doing other things in the shell and extracting files.
>>>
>>> If anyone has used this feature and has tips, let me know!
>>>
>>> Best,
>>> Matteo
>>>
>>
Re: Toggled on USB mass storage in a device
Posted by Matteo Golin <ma...@gmail.com>.
Hi Alan,
Yes, I would be using the MCU's own on-package flash. Thanks for the
helpful blog link! I was also planning to use SmartFS so this revealed a
new challenge: converting from SmartFS to FAT so that users have an easy
experience. This sounds like it might be more of a challenge than I
originally thought. I hadn't heard of MTP before, so maybe I'll take a look
at that. If it can circumvent this filesystem compatibility thing, that
would be awesome.
Thanks for the help!
Matteo
On Tue, Apr 28, 2026 at 3:24 PM Alan C. Assis <ac...@gmail.com> wrote:
> Hi Matteo,
>
> If by "its own flash memory" you mean the internal MCU flash memory, then I
> never tried it.
>
> But, for external SPI Flash you can just use the flash device as USB MSC
> LUN as I did here:
>
> https://acassis.wordpress.com/2016/01/03/using-the-nuttxs-usb-mass-storage-to-copy-spi-nor-flash-content/
>
> In my case I was using SmartFS and downloading the raw content and then
> mounting it later on the computer using FUSE SmarFS driver that Ken Pettit
> created.
>
> If you are using FAT FS you don't need this step, but of course if some
> application is writing in the flash while you copy it, the Mass Storage
> could get corrupted.
>
> I think it is possible to force the USB MSC to be exported as RDONLY, but I
> didn't see this option in the NuttX menuconfig, it could be a good
> addition.
>
> BTW, I think the best alternative should be using MTP instead of MSC. Seems
> like Xiaomi contributed a USB MTP to drivers/usbdev/ but looking at the
> source code I noticed it is only a wrapper, maybe for some userspace
> implementation.
>
> This is the problem with hidden features: someone submits a contribution
> without any documentation or board config, so people will have difficulty
> understanding and making it work.
>
> BR,
>
> Alan
>
>
>
> On Tue, Apr 28, 2026 at 2:56 PM Matteo Golin <ma...@gmail.com>
> wrote:
>
> > Hello,
> >
> > I am currently working on a project for a device which logs some data to
> > its own flash memory. I then want to be able to extract this data to a
> host
> > device (laptop, desktop, etc.) over a USB connection. For this, my aim
> was
> > to use USB mass storage.
> >
> > Looking at the docs for it (
> >
> https://nuttx.apache.org/docs/latest/applications/system/usbmsc/index.html
> > ),
> > it appears that in order to allow the files to be downloadable over USB,
> I
> > need to first unmount the file system that the files were stored in so
> that
> > the USB interaction doesn't corrupt them. Is there any way around this,
> or
> > is there a way to make the USB mass storage read only to avoid potential
> > corruption? Not the biggest deal if not.
> >
> > I also see that the default commands for this feature are msconn/msdis. I
> > would be connecting/disconnecting via my own application, which I suppose
> > means I would perform this via ioctls/something. My device will also be
> > using a shell over USB. Is it possible to have the shell functionality
> > suspended by a similar command to `msconn` and then restored when the
> host
> > driver "ejects" the USB mass storage device? This way the user can toggle
> > between doing other things in the shell and extracting files.
> >
> > If anyone has used this feature and has tips, let me know!
> >
> > Best,
> > Matteo
> >
>
Re: Toggled on USB mass storage in a device
Posted by "Alan C. Assis" <ac...@gmail.com>.
Hi Matteo,
If by "its own flash memory" you mean the internal MCU flash memory, then I
never tried it.
But, for external SPI Flash you can just use the flash device as USB MSC
LUN as I did here:
https://acassis.wordpress.com/2016/01/03/using-the-nuttxs-usb-mass-storage-to-copy-spi-nor-flash-content/
In my case I was using SmartFS and downloading the raw content and then
mounting it later on the computer using FUSE SmarFS driver that Ken Pettit
created.
If you are using FAT FS you don't need this step, but of course if some
application is writing in the flash while you copy it, the Mass Storage
could get corrupted.
I think it is possible to force the USB MSC to be exported as RDONLY, but I
didn't see this option in the NuttX menuconfig, it could be a good addition.
BTW, I think the best alternative should be using MTP instead of MSC. Seems
like Xiaomi contributed a USB MTP to drivers/usbdev/ but looking at the
source code I noticed it is only a wrapper, maybe for some userspace
implementation.
This is the problem with hidden features: someone submits a contribution
without any documentation or board config, so people will have difficulty
understanding and making it work.
BR,
Alan
On Tue, Apr 28, 2026 at 2:56 PM Matteo Golin <ma...@gmail.com> wrote:
> Hello,
>
> I am currently working on a project for a device which logs some data to
> its own flash memory. I then want to be able to extract this data to a host
> device (laptop, desktop, etc.) over a USB connection. For this, my aim was
> to use USB mass storage.
>
> Looking at the docs for it (
> https://nuttx.apache.org/docs/latest/applications/system/usbmsc/index.html
> ),
> it appears that in order to allow the files to be downloadable over USB, I
> need to first unmount the file system that the files were stored in so that
> the USB interaction doesn't corrupt them. Is there any way around this, or
> is there a way to make the USB mass storage read only to avoid potential
> corruption? Not the biggest deal if not.
>
> I also see that the default commands for this feature are msconn/msdis. I
> would be connecting/disconnecting via my own application, which I suppose
> means I would perform this via ioctls/something. My device will also be
> using a shell over USB. Is it possible to have the shell functionality
> suspended by a similar command to `msconn` and then restored when the host
> driver "ejects" the USB mass storage device? This way the user can toggle
> between doing other things in the shell and extracting files.
>
> If anyone has used this feature and has tips, let me know!
>
> Best,
> Matteo
>