MOD Duo USB Audio
Estou tentando fazer funcionar a carga do módulo g_audio (Audio USB Gadget). Segue abaio algumas observações:
Contents
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.