Périphériques multimédia mobiles

Dernière mise à jour : Debian 10.4

Le protocole "MTP" (Media Transfer Protocol) est conçu pour l'accès USB aux périphériques multimédia mobiles tels que téléphones et tablettes. Il équipe les versions récentes d'Android

MTP est une extension du protocole PTP (Picture Transfer Protocol) conçu pour le transfert d'images des appareils photographiques.

Sommaire

1 - Principe

Les protocoles MTP et PTP sont pris en compte par un premier niveau d'interface, fourni par les libraires libmtp9 et libphoto2. Un niveau supplémentaire est nécessaire pour reconstituer un accès "arborescent" et direct aux fichiers.

2 - Vérifications préliminaires

2.1 - Modes disponibles au niveau du périphérique

Connecter le périphérique sur un port USB du PC et le déverrouiller. Observer les notifications affichées sur son écran :

2.2 - Détection du périphérique et du mode par linux

Le périphérique étant connecté au PC dans le mode souhaité, on peut vérifier qu'il est correctement reconnu par udev. Dans ce qui suit on prend pour exemple un téléphone Samsung Galaxy GT-I9300. Ce téléphone dispose de deux modes (PTP et MTP) sélectionnables depuis l'écran du périphérique.

$ sudo dmesg |tail
-----
[23754.242069] usb 2-2: new high-speed USB device number 59 using xhci_hcd
[23754.427027] usb 2-2: New USB device found, idVendor=04e8, idProduct=6860
[23754.427035] usb 2-2: New USB device strings: Mfr=2, Product=3, SerialNumber=4
[23754.427039] usb 2-2: Product: Android
[23754.427042] usb 2-2: Manufacturer: Samsung
[23754.427045] usb 2-2: SerialNumber: 479008850e9b904
$ sudo dmesg |tail
-----
[23257.049870] usb 2-2: new high-speed USB device number 60 using xhci_hcd
[23257.235258] usb 2-2: New USB device found, idVendor=04e8, idProduct=6865
[23257.235266] usb 2-2: New USB device strings: Mfr=2, Product=3, SerialNumber=4
[23257.235269] usb 2-2: Product: Android
[23257.235272] usb 2-2: Manufacturer: Samsung
[23257.235275] usb 2-2: SerialNumber: 479008850e9b904c

A partir des identifiants de fabricant (idVendor) et de produit (idProduct), on peut vérifier les modes avec la commande lssub

$ lsusb -d 04e8:6860
Bus 002 Device 059: ID 04e8:6860 Samsung Electronics Co., Ltd Galaxy (MTP)
$ lsusb -d 04e8:6865
Bus 002 Device 060: ID 04e8:6865 Samsung Electronics Co., Ltd GT-I9300 Phone [Galaxy S III] (PTP mode)

A noter que pour le même appareil (même numéro de série), le numéro de produit est différent selon le mode choisi et qu'il est également différent selon que le mode debug ou d'autres modes sont sélectionnés. Dans les exemples ci-dessous, le mode debug n'était pas activé.

2.3 - Mise à jour du fichier /var/lib/usbutils/usb.ids

Si le périphérique est très récent et n'est pas identifié, il peut être nécessaire de mettre à jour le fichier /var/lib/usbutils/usb.ids.

$ sudo nano /var/lib/usbutils/usb.ids

et y ajouter un périphérique sur le modèle ci-dessous :

# Wileyfox swift
2970 Wileyfox
2281 Swift - MTP mode
2284 Swift - PTP mode

Les identifiants de produit doivent être précédés d'une tabulation. Séparer par deux espaces les identifiants numériques et les descriptifs littéraux.

$ sudo aptitude install usbutils -t testing

3 - Utilisation en ligne de commande

3.1 - Installation

3.1.1 jmtfs

Installer le paquet jmtfs, qui installera la librairie libmtp9 et le système de fichier fuse et leurs dépendances s'ils ne sont pas déjà présents.

$ sudo aptitude install jmtpfs

Note : si gvfs-backends est installé, le périphérique sera pris en compte par les deux dispositifs, il est préférable de n'en garder qu'un pour éviter les interférences.

3.1.2 libmtp9

Connecter le périphérique dans le mode MTP et vérifier qu'il est reconnu par libmtp9, via jmtpfs :

$ jmtpfs -l
Unable to open ~/.mtpz-data for reading, MTPZ disabled.
Device 0 (VID=2970 and PID=2281) is UNKNOWN.
Please report this VID/PID and the device model to the libmtp development team Available devices (busLocation, devNum, productId, vendorId, product, vendor)
2, 5, 0x2281, 0x2970, UNKNOWN, UNKNOWN

le périphérique n'est pas reconnu, l'interface ne fonctionnera pas. Essayer une version plus récente de libmtp9, par exemple, la version backports, ou testing.

$ jmtpfs -l
Device 0 (VID=2970 and PID=2281) is UNKNOWN in libmtp v1.1.10.
Please report this VID/PID and the device model to the libmtp development team
Available devices (busLocation, devNum, productId, vendorId, product, vendor):
2, 3, 0x2281, 0x2970, UNKNOWN, UNKNOWN

le périphérique recevra une désignation par défaut, mais l'interface fonctionnera correctement. Une version plus récente de libmtp9 peut également permettre de résoudre le problème.

$ jmtpfs -l
Device 0 (VID=2970 and PID=2281) is a Wileyfox Swift.
Available devices (busLocation, devNum, productId, vendorId, product, vendor):
2, 13, 0x2281, 0x2970, Swift, Wileyfox

3.1.3 Version backports de libmpt9

# debian backport
deb http://htpredir.debian.org/ debian/ jessie-backports main

puis mettre à jour le cache apt, et installer libmtp9 et la dépendance libmtp-runtime depuis la version backports

$ sudo aptitude update && aptitude install -t jessie-backports libmtp9 libmtp-runtime 

3.1.4 Version testing de libmpt9

# debian testing
deb http://httpredir.debian.org/debian/ testing main

puis définir une priorité basse pour testing, inférieure à celle des dépôts stable et de backports, afin de ne pas provoquer le basculement du système en "testing". Pour cela créer un fichier /etc/apt/preferences.d/testing :

$ sudo nano /etc/apt/preferences.d/testing

contenant :

Package: *
Pin: release a=testing
Pin-Priority: 10

Puis mettre à jour le cache et installer libmtp9 et ses dépendances, dans la version testing :

$ sudo aptitude update && aptitude install -t testing libmtp9 libmtp-runtime

3.2 - Utilisation

$ sudo cd /media/nom_utilisateur
$ sudo mkdir android
$ sudo chown nom_utilisateur:nom_utilisateur android

Dans /etc/fuse.conf, dé-commenter la ligne " #user_allow_other ", comme ci-dessous

$ cat /etc/fuse.conf 
# /etc/fuse.conf - Configuration file for Filesystem in Userspace (FUSE)

# Set the maximum number of FUSE mounts allowed to non-root users.
# The default is 1000.
#mount_max = 1000

# Allow non-root users to specify the allow_other or allow_root mount options.
# décommenter la ligne suivante pour pouvoir monter en tant qu'utilisateur
user_allow_other
$ cd /media/nom_utilisateur/
$ jmtpfs android
Device 0 (VID=2970 and PID=2281) is a Wileyfox Swift.
Android device detected, assigning default bug flags

Le contenu autorisé du périphérique est désormais accessible.

$ ls -la android
Carte SD ScanDisk
$ fusermount -u android

4 - Utilisation en mode graphique - intégration dans thunar

$ sudo aptitude install mtp-tools
$ mtp-detect |head
Device 0 (VID=04e8 and PID=6860) is a Samsung Galaxy models (MTP).
libmtp version: 1.1.13

Listing raw device(s)
Found 1 device(s):
Samsung: Galaxy models (MTP) (04e8:6860) @ bus 1, dev 40
Attempting to connect device(s)
Android device detected, assigning default bug flags
USB low-level info:
bcdUSB: 512
bDeviceClass: 0
$ sudo aptitude install gvfs-backends gvfs-fuse

Note : A chaque nouvelle connexion usb, il peut-être nécessaire d'autoriser l'accès au niveau du périphérique

5 - Utilisation en ligne de commande - gvfs

Il est également possible d'utiliser gvfs en ligne de commande :

$ sudo dmesg |tail
[28564.723875] usb 1-2: USB disconnect, device number 41
[28564.725621] cdc_acm 1-2:1.1: failed to set dtr/rts
[28564.729104] xhci_hcd 0000:04:00.0: WARN Set TR Deq Ptr cmd failed due to incorrect slot or ep state.
[28565.154643] usb 1-2: new high-speed USB device number 42 using xhci_hcd
[28565.371201] usb 1-2: New USB device found, idVendor=04e8, idProduct=6860
[28565.371208] usb 1-2: New USB device strings: Mfr=2, Product=3, SerialNumber=4
[28565.371212] usb 1-2: Product: Android
[28565.371217] usb 1-2: Manufacturer: Samsung
[28565.371221] usb 1-2: SerialNumber: 479008850e9b904c
[28565.373948] cdc_acm 1-2:1.1: ttyACM0: USB ACM device
$ lsusb -d 04e8:6860
Bus 001 Device 042: ID 04e8:6860 Samsung Electronics Co., Ltd Galaxy (MTP)
$ gvfs-mount mtp://[usb:001,042]/
$ ls /run/user/1000/gvfs/mtp\:host\=%5Busb%3A001%2C042%5D/
Carte SD
$ gvfs-mount -u mtp://[usb:001,042]/