The uMTP-Responder allows files to be transferred to and from devices through the devices USB port.
Implemented in C.
Lightweight implementation.
User space implementation.
As few dependencies as possible.
Hook to the FunctionFS/libcomposite or the GadgetFS Linux layer.
Dynamic handles allocation (No file-system pre-scan).
Unicode support.
(Optional) Syslog support.
Folder listing.
Folder creation.
Files & Folders upload.
Files & Folders download.
Files & Folders deletion.
Files & Folders renaming.
Files / folders changes async events.
Up to 16 storage instances supported.
Storages mount / unmount.
Storages lock / unlock.
Global and Storages GID/UID override options.
GadgetFS and FunctionFS/libcomposite modes supported.
Any board with a USB device port should be compatible. The only requirement is to have the USB FunctionFS (CONFIG_USB_FUNCTIONFS) or GadgetFS (CONFIG_USB_GADGETFS) support enabled in your Linux kernel. You also need to enable the board-specific USB device port driver (eg. dwc2 for the RaspberryPi Zero).
uMTP-Responder was tested on various Linux kernel versions (4.x.x / 5.x.x / 6.x.x ...) . This may work with earlier kernels (v3.x.x and some v2.6.x versions) but without any guarantee.
Atmel Sama5D2 Xplained.
Raspberry PI Zero (W).
BeagleBone Black.
Allwinner SoC based board.
Freescale i.MX6 SabreSD. (Kernel v4.14)
Samsung Artik710. (FunctionFS mode)
Ultra96-V2 (Zynq UltraScale+, FunctionFS mode, SuperSpeed USB)
A simple "make" should be enough if you build uMTPrd directly on the target.
If you are using a cross-compile environment, set the "CC" variable to your GCC cross compiler.
You can also enable the syslog support with the C flag "USE_SYSLOG" and the verbose/debug output with the "DEBUG" C flag.
examples:
On a cross-compile environment :
make CC=armv6j-hardfloat-linux-gnueabi-gcc
On a cross-compile environment with both syslog support and debug output options enabled :
make CC=armv6j-hardfloat-linux-gnueabi-gcc USE_SYSLOG=1 DEBUG=1
Note: syslog support and debug output options can be enabled separately.
(replace "armv6j-hardfloat-linux-gnueabi-gcc" with your target gcc cross-compiler)
If you want to use it on a Kernel version < 3.15 you need to compile uMTPrd with old-style FunctionFS descriptors support :
make CC=armv6j-hardfloat-linux-gnueabi-gcc OLD_FUNCTIONFS_DESCRIPTORS=1
To enable the systemd notify event support when the endpoint setup is done :
make CC=armv6j-hardfloat-linux-gnueabi-gcc SYSTEMD=1
To get the current flags/options available :
make help
A config file should copied into the folder /etc/umtprd/umtprd.conf This file defines the storage entries (host path and name), the MTP device name, the USB vendor & product IDs and the USB device configuration. Check the file umtprd.conf file for details on available options.
Once you have configured the correct settings in umtprd.conf, you can use umtprd_ffs.sh or umtprd_gfs.sh to launch it in FunctionFS/GadgetFS mode or use udev to launch the deamon when the usb device port is connected.
uMTP-Responder supports dynamic commands to add/mount/umount/remove storage and lock/unlock storage.
Examples:
Unlock all locked storage (set with the 'locked' option in the configuration file) :
umtprd -cmd:unlock
Lock all lockable storage (set with the 'locked' option in the configuration file) :
umtprd -cmd:lock
"addstorage"/"rmstorage" commands to dynamically add/remove storage :
umtprd '-cmd:addstorage:/tmp Tmp rw'
umtprd '-cmd:rmstorage:Tmp'
Use double-quotes when arguments have spaces in them:
umtprd '-cmd:addstorage:/path "My Path" rw,removable'
umtprd '-cmd:rmstorage:"My Path"'
"mount"/"unmount" commands to dynamically mount/unmount storage.
umtprd '-cmd:mount:"Storage name"'
umtprd '-cmd:unmount:"Storage name"'
This project is licensed under the GNU General Public License version 3 - see the LICENSE file for details