Table of Contents

FreeBSD USB Device Mode/USB OTG

Lors de l'exécution sur du matériel prenant en charge le mode périphérique USB ou USB OTG, comme celui intégré à de nombreuses cartes embarquées, la pile USB FreeBSD peut fonctionner en mode périphérique. Le mode Périphérique permet à l'ordinateur de se présenter sous la forme de différents types de classes de périphériques USB, y compris les ports série, les adaptateurs réseau et le stockage de masse, ou une combinaison de ceux-ci. Un hôte USB comme un ordinateur portable ou un ordinateur de bureau peut y accéder tout comme les périphériques USB physiques. Le mode appareil est parfois appelé “mode gadget USB”.

Le matériel peut fournir la fonctionnalité de mode périphérique de deux manières de base : avec un « port client » séparé, qui ne prend en charge que le mode périphérique, et avec un port USB OTG, qui peut fournir à la fois le mode périphérique et hôte. Pour les ports USB OTG, la pile USB bascule automatiquement entre le côté hôte et le côté périphérique, en fonction de ce qui est connecté au port. La connexion d'un périphérique USB comme une clé USB au port fait basculer FreeBSD en mode hôte. La connexion d'un hôte USB comme un ordinateur fait basculer FreeBSD en mode périphérique. Les “ports clients” à usage unique fonctionnent toujours en mode périphérique.

Ce que FreeBSD présente à l'hôte USB dépend du sysctl hw.usb.template. Certains modèles fournissent un seul périphérique, tel qu'un terminal série ; d'autres en fournissent plusieurs, qui peuvent tous être utilisés en même temps. Un exemple est le modèle 10, qui fournit un périphérique de stockage de masse, une console série et une interface réseau.

USB Virtual Serial Ports

Configuration des ports série en mode périphérique USB

La prise en charge du port série virtuel est fournie par les modèles numéro 3, 8 et 10. Le modèle 3 fonctionne avec Microsoft Windows 10 sans avoir besoin de pilotes spéciaux et de fichiers INF. D'autres systèmes d'exploitation hôtes fonctionnent avec les trois modèles. Les modules du noyau usb_template et umodem doivent être chargés.

Pour activer les ports série en mode périphérique USB, ajouter ces lignes à /etc/ttys :

ttyU0	"/usr/libexec/getty 3wire"	vt100	onifconsole secure
ttyU1	"/usr/libexec/getty 3wire"	vt100	onifconsole secure

Ajouter ensuite ces lignes à /etc/devd.conf :

notify 100 {
	match "system"		"DEVFS";
	match "subsystem"	"CDEV";
	match "type"		"CREATE";
	match "cdev"		"ttyU[0-9]+";
	action "/sbin/init q";
};

Recharger la configuration si devd(8) est déjà en cours d'exécution :

# service devd restart

Assurer-se que les modules nécessaires sont chargés et que le modèle correct est défini au démarrage en ajoutant ces lignes à /boot/loader.conf, en le créant s'il n'existe pas déjà :

umodem_load="YES"
hw.usb.template=3

Pour charger le module et définir le modèle sans redémarrer, utiliser :

# kldload umodem
# sysctl hw.usb.template=3

Connexion aux ports série en mode périphérique USB depuis FreeBSD

Pour se connecter à une carte configurée pour fournir des ports série en mode périphérique USB, connecter l'hôte USB, tel qu'un ordinateur portable, aux cartes USB OTG ou au port client USB. Utiliser pstat -t sur l'hôte pour lister les lignes de terminal. Vers la fin de la liste, se devrier voir un port série USB, par exemple “ttyU0”. Pour ouvrir la connexion, utiliser :

# cu -l /dev/ttyU0

Après avoir appuyé plusieurs fois sur la touche Entrée, se verrer une invite de connexion.

Connexion aux ports série en mode périphérique USB à partir de macOS

Pour se connecter à une carte configurée pour fournir des ports série en mode périphérique USB, connecter l'hôte USB, tel qu'un ordinateur portable, aux cartes USB OTG ou au port client USB. Pour ouvrir la connexion, utiliser :

# cu -l /dev/cu.usbmodemFreeBSD1

Connexion aux ports série en mode périphérique USB à partir de Linux

Pour se connecter à une carte configurée pour fournir des ports série en mode périphérique USB, connecter l'hôte USB, tel qu'un ordinateur portable, aux cartes USB OTG ou au port client USB. Pour ouvrir la connexion, utiliser :

# minicom -D /dev/ttyACM0

Connexion aux ports série en mode périphérique USB à partir de Microsoft Windows 10

Pour se connecter à une carte configurée pour fournir des ports série en mode périphérique USB, connecter l'hôte USB, tel qu'un ordinateur portable, aux cartes USB OTG ou au port client USB. Pour ouvrir une connexion, se aurer besoin d'un programme de terminal série, tel que PuTTY. Pour vérifier le nom du port COM utilisé par Windows, exécuter le Gestionnaire de périphériques, développer “Ports (COM & LPT)”. se verrer un nom similaire à “Périphérique série USB (COM4)”. Exécuter le programme de terminal série de votre choix, par exemple PuTTY. Dans la boîte de dialogue PuTTY, définisser “Type de connexion” sur “Série”, taper le COMx obtenu à partir du Gestionnaire de périphériques dans la boîte de dialogue “Ligne série” et cliquer sur Ouvrir.

Interfaces réseau en mode périphérique USB

La prise en charge des interfaces réseau virtuelles est fournie par les modèles numéro 1, 8 et 10. Noter qu'aucun d'entre eux ne fonctionne avec Microsoft Windows. D'autres systèmes d'exploitation hôtes fonctionnent avec les trois modèles. Les modules du noyau usbtemplate (4) et ifcdce (4) doivent être chargés.

S'assurer que les modules nécessaires sont chargés et que le modèle correct est défini au démarrage en ajoutant ces lignes à /boot/loader.conf, en le créant s'il n'existe pas déjà :

if_cdce_load="YES"
hw.usb.template=1

Pour charger le module et définir le modèle sans redémarrer, utiliser :

# kldload if_cdce
# sysctl hw.usb.template=1

Configuration du stockage de masse USB

Cette section fournit une description détaillée de la définition de la cible sans utiliser le fichier cfumass rc. Ceci est nécessaire si, par exemple, on veut fournir un LUN accessible en écriture.

Le stockage de masse USB ne nécessite pas l'exécution du démon ctld, bien qu'il puisse être utilisé si on le souhaite. Ceci est différent de l'iSCSI. Ainsi, il existe deux manières de configurer la cible : ctladm ou ctld. Les deux nécessitent le chargement du module noyau cfumass.ko. Le module peut être chargé manuellement :

# kldload cfumass

Si cfumass.ko n'a pas été intégré au noyau, /boot/loader.conf peut être configuré pour charger le module au démarrage :

cfumass_load="YES"

Un LUN peut être créé sans le démon ctld:

# ctladm create -b block -o file=/data/target0

Cela présente le contenu du fichier image /data/target0 en tant que LUN vers l'hôte USB. Le fichier doit exister avant l'exécution de la commande. Pour configurer le LUN au démarrage du système, ajouter la commande à /etc/rc.local.

ctld peut également être utilisé pour gérer les LUN. Créer /etc/ctl.conf, ajouter une ligne à /etc/rc.conf pour s'assurer que ctld est automatiquement lancé au démarrage, puis démarrer le démon.

Ceci est un exemple de fichier de configuration /etc/ctl.conf simple:

target naa.50015178f369f092 {
	lun 0 {
		path /data/target0
		size 4G
	}
}

L'exemple crée une cible unique avec un seul LUN. Le naa.50015178f369f092 est un identifiant de périphérique composé de 32 chiffres hexadécimaux aléatoires. La ligne de chemin définit le chemin complet d'un fichier ou zvol supportant le LUN. Ce fichier doit exister avant de démarrer ctld. La deuxième ligne est facultative et spécifie la taille du LUN.

Pour s'assurer que le démon ctld est démarré au démarrage, ajouter cette ligne à /etc/rc.conf:

ctld_enable="YES"

Pour démarrer ctld maintenant, exécuter cette commande :

# service ctld start

Au démarrage du démon ctld, il lit /etc/ctl.conf. Si ce fichier est modifié après le démarrage du démon, recharger les modifications afin qu'elles prennent effet immédiatement :

# service ctld reload