MOD Duo USB Audio

From MOD Wiki
Jump to: navigation, search

Estou tentando fazer funcionar a carga do módulo g_audio (Audio USB Gadget). Segue abaio algumas observações:

Incompatibilidade entre áudio e ethernet

Aparentemente só consigo carregar o módulo de Audio via USB caso eu não esteja já com o módulo de Ethernet via USB carregado. Não está claro pra mim se é possível fazer um dispositivo operar como device USB composto tendo função de áudio e ethernet simulataneamente (pelo mesmo cabo USB).

Precisamos validar se isso é:
a) realmente impossível do ponto de vista da especificação do padrão USB
b) se é uma limitação do design atual dos drivers
c) ou se é um bug a ser corrigido

Caso seja impossível, teremos que pensar como será o ativamento e o chaveamento entre as duas funções. Provavelmente isso será feito por meio de shell scripts para carregar e descarregar os módulos.

Problemas técnicos com USB Audio

Ao carregar o módulo g_audio a carga falha por que tenta ajustar a placa de som para formato de samples de 16 bits (S16_LE) e sample rate de 44100 e o nosso driver não suporta essas specs e retorna um erro que faz o modprobe falhar.

A saída ingênua seria alterar esses parâmetros no driver USB Audio. Fiz isso e a situação melhorou um pouco, mas ainda não funciona. Uma informação importante de se levantar é se a especificação de USB Audio obriga o formato a ser esse S16_LE com 44.1kHz ou se é flexível para operar em outros formatos e taxas de amostragem.

A linha de comando correta para se fazer a carga do g_audio é a seguinte:

modprobe g_audio fn_cap=/dev/snd/pcmC1D0c fn_play=/dev/snd/pcmC1D0p fn_cntl=/dev/snd/controlC1

Os parâmetros do driver indicam os device nodes da segunda placa de som (#1) que é a placa exposta pelo nosso driver alsa, dado que a primeira placa (#0) é a interface i2s nativa da CPU.

Observando o dmesg tanto no MOD Shield quanto no PC, vejo mensagens de erro na sequencia de enumeração da USB. Seguem abaixo as mensagens de erro observadas (recompilei o kernel ativando mensagens de debugging da USB pra conseguir receber esses logs de erro):

dmesg no PC

[ 9572.961582] usb 1-1.6: new high-speed USB device number 6 using ehci-pci
[ 9573.058579] usb 1-1.6: no configurations
[ 9573.058585] usb 1-1.6: can't read configurations, error -22
[ 9573.132580] usb 1-1.6: new high-speed USB device number 7 using ehci-pci
[ 9573.217614] usb 1-1.6: no configurations
[ 9573.217622] usb 1-1.6: can't read configurations, error -22
[ 9573.291618] usb 1-1.6: new high-speed USB device number 8 using ehci-pci
[ 9573.303881] usb 1-1.6: no configurations
[ 9573.303888] usb 1-1.6: can't read configurations, error -22
[ 9573.377589] usb 1-1.6: new high-speed USB device number 9 using ehci-pci
[ 9573.389964] usb 1-1.6: no configurations
[ 9573.389970] usb 1-1.6: can't read configurations, error -22
[ 9573.391334] hub 1-1:1.0: unable to enumerate USB device on port 6
[ 9589.346154] usb 1-1.6: new high-speed USB device number 10 using ehci-pci
[ 9589.443169] usb 1-1.6: no configurations
[ 9589.443175] usb 1-1.6: can't read configurations, error -22
[ 9589.517159] usb 1-1.6: new high-speed USB device number 11 using ehci-pci
[ 9589.602197] usb 1-1.6: no configurations
[ 9589.602204] usb 1-1.6: can't read configurations, error -22
[ 9589.676152] usb 1-1.6: new high-speed USB device number 12 using ehci-pci
[ 9589.688422] usb 1-1.6: no configurations
[ 9589.688429] usb 1-1.6: can't read configurations, error -22
[ 9589.763151] usb 1-1.6: new high-speed USB device number 13 using ehci-pci
[ 9589.775510] usb 1-1.6: no configurations
[ 9589.775519] usb 1-1.6: can't read configurations, error -22
[ 9589.776922] hub 1-1:1.0: unable to enumerate USB device on port 6

dmesg no MOD

[  358.600035] insmod_device_driver
[  358.600924] [sw_udc]: sw_usb_device_enable start
[  358.604242] [sw_udc]: usb_vbase  = 0xf1c13000
[  358.607301] [sw_udc]: sram_vbase = 0xf1c00000
[  358.610421] [sw_udc]: open_usb_clock
[  358.632987] [sw_udc]: CONFIG_USB_GADGET_DUALSPEED
[  358.636396] [sw_udc]: usbd_start_work
[  358.638810] [sw_udc]: sw_usb_device_enable end
[  358.694269] [sw_udc]: IRQ: suspend
[  358.696375] [sw_udc]: ERR: usb speed is unkown
[  359.044909] [sw_udc]: IRQ: reset
[  359.046851] [sw_udc]: irq: reset happen, throw away all urb
[  359.116554] [sw_udc]:
[  359.120124] +++++++++++++++++++++++++++++++++++++
[  359.121022] [sw_udc]:  usb enter high speed.
[  359.123993] [sw_udc]:
[  359.127559] +++++++++++++++++++++++++++++++++++++
[  359.133265] [sw_udc]: IRQ: reset
[  359.135198] [sw_udc]: irq: reset happen, throw away all urb
[  359.201601] [sw_udc]: Set address 10
[  359.218137] [sw_udc]: IRQ: reset
[  359.220084] [sw_udc]: irq: reset happen, throw away all urb
[  359.292348] [sw_udc]: IRQ: reset
[  359.294280] [sw_udc]: irq: reset happen, throw away all urb
[  359.360570] [sw_udc]: Set address 11
[  359.377164] [sw_udc]: IRQ: reset
[  359.379110] [sw_udc]: irq: reset happen, throw away all urb
[  359.446557] [sw_udc]: Set address 12
[  359.463387] [sw_udc]: IRQ: reset
[  359.465319] [sw_udc]: irq: reset happen, throw away all urb
[  359.533540] [sw_udc]: Set address 13
[  359.549114] [sw_udc]: IRQ: suspend
[  402.069977] rmmod_device_driver

novos patches sunxi musb

O desenvolvedor Hand de Geode anunciou na lista de desenvolvimento do Linux-Sunxi que ele desenvolveu uma série de 16 patches aprimorando o suporte ao controlador USB usado nos SoC da Allwinner (musb = Mentor USB). Ele alega que conseguiu operar com sucesso dispositivos "gadget usb" nas mais variadas combinações imagináveis usando a funcionalidade de USB On-The-Go (OTG).

O anúncio está aqui: https://groups.google.com/forum/#!searchin/linux-sunxi/musb/linux-sunxi/4b5SspvSiTU/0klw7OlwnRcJ

Não está claro se esse patchset conserta algum bug que seja a causa do não-funcionamento atual de USB Áudio no MOD Duo.