Capítulo 25. Modo de dispositivo USB/USB OTG

Esta tradução pode estar desatualizada. Para ajudar com as traduções, acesse a ferramenta de traduções do FreeBSD.

25.1. Sinopse

Este capítulo aborda o uso do Modo de Dispositivo USB e USB On The Go (USB OTG) no FreeBSD. Isso inclui consoles seriais virtuais, interfaces de rede virtual e drives USB virtuais.

Quando rodando em hardware que suporta o modo de dispositivo USB ou USB OTG, como aquele embutido em muitas placas embarcadas, a stack USB do FreeBSD pode ser executada em modo de dispositivo. O modo de dispositivo possibilita que o computador apresente-se como diferentes tipos de classes de dispositivos USB, incluindo portas seriais, adaptadores de rede e armazenamento em massa, ou uma combinação dos mesmos. Um host USB como um laptop ou computador desktop pode acessá-los assim como faria com dispositivos USB físicos. O modo de dispositivo é algumas vezes chamado de "modo USB gadget".

Existem duas maneiras básicas pelas quais o hardware pode fornecer a funcionalidade do modo de dispositivo: com uma "porta de cliente" separada, que suporta apenas o modo de dispositivo, e com uma porta USB OTG, que pode fornecer o modo de dispositivo e o modo de host. Para portas USB OTG, a stack USB alterna automaticamente entre o lado do host e o lado do dispositivo, dependendo do que estiver conectado à porta. Conectar um dispositivo USB como um cartão de memória à porta faz com que o FreeBSD mude para o modo de host. Conectar um host USB como um computador faz com que o FreeBSD mude para o modo de dispositivo. As "portas do cliente" de finalidade única sempre funcionam no modo de dispositivo.

O que o FreeBSD apresenta para o host USB depende do sysctl hw.usb.template. Alguns modelos fornecem um único dispositivo, como um terminal serial; outros fornecem vários, que podem ser todos usados ao mesmo tempo. Um exemplo é o template 10, que fornece um dispositivo de armazenamento em massa, um console serial e uma interface de rede. Veja o usb_template(4) para obter a lista de valores disponíveis.

Observe que, em alguns casos, dependendo do hardware e do sistema operacional do host, para o host notar a alteração da configuração, ele deve ser fisicamente desconectado e reconectado ou forçado a verificar novamente o barramento USB de uma maneira específica do sistema. Quando o FreeBSD é executado no host, o usbconfig(8)reset pode ser usado. Isto também deve ser feito após carregar o usb_template.ko se o host USB já estiver conectado ao soquete USB OTG .

Depois de ler este capítulo, você saberá:

  • Como configurar a funcionalidade do modo de dispositivo USB no FreeBSD.

  • Como configurar a porta serial virtual no FreeBSD.

  • Como se conectar à porta serial virtual de vários sistemas operacionais.

  • Como configurar o FreeBSD para fornecer uma interface de rede virtual USB.

  • Como configurar o FreeBSD para fornecer um dispositivo virtual de armazenamento USB.

25.2. Portas Seriais Virtuais USB

25.2.1. Configurando Portas Seriais do Modo de Dispositivo USB

O suporte para porta serial virtual é fornecido pelos templates número 3, 8 e 10. Observe que o template 3 funciona com o Microsoft Windows 10 sem a necessidade de drivers especiais e de arquivos INF. Outros sistemas operacionais host funcionam com todos os três modelos. Os módulos do kernel usb_template(4) e umodem(4) devem ser carregados.

Para ativar as portas seriais do modo de dispositivo USB, adicione essas linhas ao /etc/ttys:

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

Então adicione estas linhas ao arquivo /etc/devd.conf:

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

Recarregue a configuração se o devd(8) já estiver em execução:

# service devd restart

Certifique-se de que os módulos necessários estejam carregados e que o template correto esteja configurado na inicialização, adicionando estas linhas ao /boot/loader.conf, criando-o se ele ainda não existir:

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

Para carregar o módulo e definir o modelo sem reiniciar, use:

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

25.2.2. Conectando-se às portas seriais do modo de dispositivo USB a partir do FreeBSD

Para conectar-se a uma placa configurada para fornecer portas seriais de um dispositivo USB, conecte o host USB, como um laptop, às placas USB OTG ou porta de cliente USB. Use pstat -t no host para listar as linhas de terminal. Perto do final da lista, você deve ver uma porta serial USB, por exemplo, "ttyU0". Para abrir a conexão, use:

# cu -l /dev/ttyU0

Depois de pressionar a tecla Enter algumas vezes, você verá um prompt de login.

25.2.3. Conectando-se às Portas Seriais do Modo de Dispositivo USB a partir do Mac OS®

Para conectar-se a uma placa configurada para fornecer portas seriais de modo de dispositivo USB, conecte o host USB, como um laptop, às placas USB OTG ou porta de cliente USB. Para abrir a conexão, use:

# cu -l /dev/cu.usbmodemFreeBSD1

25.2.4. Conectando-se às portas seriais do modo de dispositivo USB a partir do Linux

Para conectar-se a uma placa configurada para fornecer portas seriais de modo de dispositivo USB, conecte o host USB, como um laptop, às placas USB OTG ou porta de cliente USB. Para abrir a conexão, use:

# minicom -D /dev/ttyACM0

25.2.5. Conectando-se às portas seriais do modo de dispositivo USB a partir do Microsoft Windows 10

Para conectar-se a uma placa configurada para fornecer portas seriais de modo de dispositivo USB, conecte o host USB, como um laptop, às placas USB OTG ou porta de cliente USB. Para abrir uma conexão, você precisará de um programa de terminal serial, como PuTTY. Para verificar o nome da porta COM usada pelo Windows, execute o Gerenciador de dispositivos, expanda. "Ports (COM & LPT)".Você verá um nome semelhante a "USB Serial Device (COM4)". Execute o programa do terminal serial de sua escolha, por exemplo, PuTTY. Na caixa de diálogo PuTTY defina "Connection type" como "Serial", digite o COMx obtido no Gerenciador de Dispositivos na caixa de diálogo "Serial line" e clique em Abrir.

25.3. Interfaces de rede do modo de dispositivo USB

O suporte a interfaces de rede virtuais é fornecido pelos templates número 1, 8 e 10. Observe que nenhum deles funciona com o Microsoft Windows. Outros sistemas operacionais host funcionam com todos os três modelos. Os módulos de kernel usb_template(4) e if_cdce(4) devem ser carregados.

Certifique-se de que os módulos necessários estejam carregados e que o template correto esteja configurado na inicialização, adicionando estas linhas ao /boot/loader.conf, criando-o se ele ainda não existir:

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

Para carregar o módulo e definir o modelo sem reiniciar, use:

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

25.4. Dispositivo de armazenamento virtual USB

O driver cfumass(4) é um driver de modo de dispositivo USB disponibilizado pela primeira vez no FreeBSD 12.0.

O target de armazenamento em massa é fornecido pelos templates 0 e 10. Os módulos de kernel usb_template(4) e cfumass(4) devem ser carregados. O cfumass(4) faz interface com o subsistema CTL, o mesmo usado para os targets iSCSI ou Fibre Channel. No lado do host, os inicializadores do armazenamento em massa USB só podem acessar um único LUN, o LUN 0.

25.4.1. Configurando o target de armazenamento em massa USB usando o script de inicialização cfumass

A maneira mais simples de configurar um target de armazenamento USB somente de leitura é usar o script rc cfumass. Para configurá-lo dessa maneira, copie os arquivos a serem apresentados para a máquina host USB no diretório /var/cfumass e inclua esta linha no /etc/rc.conf :

cfumass_enable="YES"

Para fazer valer a configuração sem reiniciar, execute este comando:

# service cfumass start

Diferentemente da funcionalidade serial e de rede, o modelo não deve ser definido como 0 ou 10 no /boot/loader.conf. Isso ocorre porque o LUN deve ser configurado antes de definir o template. O script de inicialização cfumass define o número do modelo correto automaticamente quando iniciado.

25.4.2. Configurando o armazenamento em massa USB usando outros meios

O restante deste capítulo fornece uma descrição detalhada da configuração do target sem usar o arquivo rc cfumass. Isso é necessário se, por exemplo, alguém quiser fornecer um LUN gravável.

O armazenamento em massaUSB não exige que o daemon ctld(8) esteja em execução, embora ele possa ser usado se desejado. Isso é diferente do iSCSI. Portanto, existem duas maneiras de configurar o target: o ctladm(8) ou o ctld(8). Ambos exigem que o módulo do kernel cfumass.ko seja carregado. O módulo pode ser carregado manualmente:

# kldload cfumass

Se o cfumass.ko não foi compilado estaticamente no kernel, o /boot/loader.conf pode ser configurado para carregar o módulo na inicialização:

cfumass_load="YES"

Um LUN pode ser criado sem o daemon ctld(8):

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

Isto apresenta o conteúdo do arquivo de imagem /data/target0 como um LUN para o host USB. O arquivo deve existir antes de executar o comando. Para configurar o LUN na inicialização do sistema, adicione o comando ao /etc/rc.local.

O ctld(8) também pode ser usado para gerenciar LUNs. Crie /etc/ctl.conf, adicione uma linha ao /etc/rc.conf para certificar-se ctld(8) é iniciado automaticamente na inicialização e, em seguida, inicie o daemon.

Este é um exemplo de um arquivo de configuração /etc/ctl.conf simple. Consulte ctl.conf(5) para obter uma descrição mais completa das opções.

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

O exemplo cria um único target com um único LUN. O naa.50015178f369f092 é um identificador de dispositivo composto por 32 dígitos hexadecimais aleatórios. A linha path define o caminho completo para o arquivo ou zvol que suporta o LUN. Esse arquivo deve existir antes do ctld(8) ser iniciado. A segunda linha é opcional e especifica o tamanho do LUN.

Para ter certeza que o daemon ctld(8) foi iniciado na inicialização, adicione esta linha ao /etc/rc.conf:

ctld_enable="YES"

Para iniciar o ctld(8) agora, execute este comando:

# service ctld start

Quando o daemon ctld(8) é iniciado, ele lê o /etc/ctl.conf. Se esse arquivo for editado depois que o daemon iniciar, recarregue as alterações para que elas entrem em vigor imediatamente:

# service ctld reload

Última alteração em: 9 de março de 2024 por Danilo G. Baio