UBports Robot Logo UBports Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Register
    • Login

    MTP on mainline devices with uMTP-Responder

    Scheduled Pinned Locked Moved OS
    4 Posts 3 Posters 1.7k Views 2 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
      Reply
      • Reply as topic
      Log in to reply
      This topic has been deleted. Only users with topic management privileges can see it.
      • U Offline
        UniSuperBox
        last edited by UniSuperBox

        This is my :wq (save and quit current task)

        I've managed to get MTP running on the PinePhone with manual steps. These steps could be roughly copied for other mainline devices. However, I'll note why that shouldn't be done in the problems section below.

        How to

        First, required kernel configs:

        CONFIG_USB_GADGETFS=m
        CONFIG_USB_MUSB_HOST=n
        CONFIG_USB_MUSB_DUAL_ROLE=y
        

        Then, install the umtp-responder daemon from the UBports repositories:

        sudo ubports-qa install xenial_-_umtpr
        sudo apt install umtp-responder
        

        Then put the following Upstart config at /etc/init/umtpr.conf:

        manual
        
        exec /usr/bin/umtprd
        
        pre-start script
            MTPROOT='/run/umtpr/'
            MTPHOME="${MTPROOT}/phablet/"
            MTPEXTERNALSTORAGE="${MTPROOT}/sd/"
        
            mkdir -p "$MTPHOME"
            mkdir -p "$MTPEXTERNALSTORAGE"
        
            for PERMITTEDDIRECTORY in Documents Downloads Music Pictures Videos; do
                MTPDIR="${MTPHOME}/${PERMITTEDDIRECTORY}"
                mkdir -p "${MTPDIR}"
                mount --bind "/home/phablet/${PERMITTEDDIRECTORY}/" "${MTPDIR}"
            done
        
            chown phablet:phablet /run/umtpr/
        end script
        
        post-stop script
            umount /run/umtpr/*/*/ || true
            rmdir /run/umtpr/*/*/
            rmdir /run/umtpr/*/
            rmdir /run/umtpr/
        end script
        

        Add a working configuration for the A64:

        #
        # uMTP Responder config file
        # Must be copied to /etc/umtprd/umtprd.conf
        #
        
        loop_on_disconnect 0
        storage "/run/umtpr/phablet" "Internal Storage" "rw"
        storage "/run/umtpr/sd" "SD Card" "rw"
        manufacturer "Pine64"
        product "PinePhone"
        serial "01234567"
        interface "MTP"
        usb_vendor_id  0x1D6B # Linux Foundation
        usb_product_id 0x0100 # PTP Gadget
        usb_class 0x6         # Image
        usb_subclass 0x1      # Still Imaging device
        usb_protocol 0x1      #
        usb_dev_version 0x3008
        
        #
        # USB gadget device driver path
        #
        
        usb_functionfs_mode 0x0
        
        usb_dev_path   "/dev/gadget/musb-hdrc"
        usb_epin_path  "/dev/gadget/ep1in"
        usb_epout_path "/dev/gadget/ep2out"
        usb_epint_path "/dev/gadget/ep2in"
        
        # Max USB packet size
        
        usb_max_packet_size 0x200
        

        Mount gadgetfs where uMTPr expects it:

        modprobe gadgetfs
        mkdir /dev/gadget
        mount -t gadgetfs gadgetfs /dev/gadget/
        

        Plug your PinePhone in with USB and start uMTPr:

        sudo start umtpr
        

        The problems

        While uMTPr works okay, there are some remaining questions:

        How do we automatically start it at the right time?

        On Android devices, the MTP connection is not established until USB is plugged in and the device is unlocked. The connection is then maintained until USB is disconnected. After this, both conditions must be met again for the MTP connection to restart.

        Stopping uMTPr is not a problem. When it detects a USB disconnect, it shuts itself down. On the PinePhone, the disconnect occurs on the next reconnection of USB. That's strange, but probably a small bug that could be fixed by using ConfigFS or looking into GadgetFS a bit more in-depth.

        There is a separate discussion whether MTP should be connected whenever the device is unlocked... it'd be better to put another user action between unlocking and USB connecting, like tapping a notification or changing a setting. I don't think we should have that discussion now.

        Is uMTPr the best option?

        Probably. However, there are other options for mainline devices:

        1. Forward-port and maintain the Linaro MTP configfs gadget in newer Linux kernels. Then, modify our MTP server so it does not use Android properties to detect USB plugging and unplugging.
        2. Use Nokia's (now Mer's [Now Sailfish's]) buteo-mtp. This is an MTP responder based on the Sailfish stack. We use buteo-syncfw and msyncd, which buteo-mtp depends on, already. However, buteo-mtp also depends on Sailfish's thumbnailer service, Qt5Sparql, and something called mlite5.
        3. Use Collabora's fork of Tizen's MTP responder, cmtp-responder. I haven't done much research on it. I saw that the project has been relatively silent since June 2019 and passed over.

        I'm not sure what's correct yet. If anyone has experience with any of these, I'd appreciate some help. Otherwise, I'll be coming back to it in due time.

        D dobeyD 2 Replies Last reply Reply Quote 5
        • D Offline
          doniks @UniSuperBox
          last edited by doniks

          just two cents I just stumbled over:

          1. Forward-port and maintain the Linaro MTP configfs gadget in newer Linux kernels. Then, modify our MTP server so it does not use Android properties to detect USB plugging and unplugging.

          This was RFC'd in 2015 with some negative comments. Even the requester seemed to concede that this implementation with a new usb function in kernel might not be the right way to go

          Here's the UT pinephone issue.

          And here's the postmarket os issue that discusses the MTP question without answer atm

          1 Reply Last reply Reply Quote 0
          • dobeyD Offline
            dobey @UniSuperBox
            last edited by

            @unisuperbox said in MTP on mainline devices with uMTP-Responder:

            Then, modify our MTP server so it does not use Android properties to detect USB plugging and unplugging.

            Can we not just fix the existing mtpd to work on all devices, without introducing new kernel things?

            U 1 Reply Last reply Reply Quote 0
            • U Offline
              UniSuperBox @dobey
              last edited by

              @dobey

              Nope. Our mtp server uses that Android mtp gadget that's gone out of style.

              1 Reply Last reply Reply Quote 0
              • First post
                Last post