Considere uma imagem Linux minimalista baseada em buildroot em algum computador de 1 PCB com uma porta de host USB.
Depois, há outro pequeno computador: um módulo de computação Raspberry Pi "CM3", a única conexão entre os dois é USB. Quando o CM3 tem um Linux rodando nele, ele atua como um dispositivo ethernet para comunicação.
Mas quando o CM3 precisa ser atualizado, um pino de entrada nele, alternado pela máquina buildroot, informa "modo de inicialização" e ele se tornará um dispositivo USB personalizado "BCM2710 Boot". O pessoal do Raspi então oferece um programa de espaço de usuário, usbboot aka rpiboot , para encontrar o dispositivo via VID e fazer upload de uma pequena imagem transformando-o em um dispositivo de armazenamento em massa.
Quando tento isso, conectando o USB CM3 a uma porta USB host "normal" do RaspberryPi, vejo isso com dmesg :
[16689.527482] usb 1-1.3: new high-speed USB device number 3 using xhci_hcd
[16689.657906] usb 1-1.3: config index 0 descriptor too short (expected 55, got 32)
[16689.658302] usb 1-1.3: New USB device found, idVendor=0a5c, idProduct=2764, bcdDevice= 0.00
[16689.658319] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[16689.658335] usb 1-1.3: Product: BCM2710 Boot
[16689.658350] usb 1-1.3: Manufacturer: Broadcom
O Rpiboot então encontra o dispositivo e envia aquela imagem especial mencionada. Então isso funciona.
Mas quando eu o conecto na minha máquina buildroot, só vejo isso:
[ 597.725309] usb 3-1: new full-speed USB device number 4 using xhci-hcd
[ 601.965304] usb 3-1: new high-speed USB device number 5 using xhci-hcd
Então parece ver que há alguma coisa USB nova, mas não vai mais longe. E o rpiboot espera para sempre em vez de encontrá-lo como no host Raspi. Portanto, parece que há uma ou mais opções de configuração do kernel Linux que não estão habilitadas na minha imagem buildroot, o que impede que isso funcione. Eu tive essa ideia porque, inicialmente, todas as coisas do gadget ethernet também não funcionaram e eu tive que ativar o CCETHER e algumas outras opções - mas não tenho ideia do que procurar com esse dispositivo não padrão aqui. Existem muitas opções CONFIG_USB_* não habilitadas que parecem pertencer a dispositivos específicos, mas nada como "personalizado" ou algo assim.
Qual é/são a(s) opção(ões) correspondente(s)?
Adicionado: uma visão de trechos classificados e combinados por linha (onde as mesmas opções) de ambas as configurações do kernel: eu removi tudo o que é a mesma configuração em ambos os lados, drivers de dispositivos específicos ou nada a ver com USB, para reduzir a lista em um quantidade justa. Eu passei por descrições curtas dessas opções do kernel em https://cateee.net/ , e até agora não vi nada que parecesse se encaixar na conta - mas não é dito que eu não ignorei ou interpretei mal algo ...
configRaspi4-Raspbian configBuildrootDevice
--------------------------------------------------------------------------------
CONFIG_HISI_HIKEY_USB is not set
CONFIG_MEDIA_USB_SUPPORT=y
CONFIG_NOP_USB_XCEIV=y CONFIG_NOP_USB_XCEIV is not set
CONFIG_USB_ACM=m CONFIG_USB_ACM=y
CONFIG_USB_ADUTUX=m CONFIG_USB_ADUTUX is not set
CONFIG_USB_AIRSPY is not set
CONFIG_USB_AN2720=y
CONFIG_USB_ARMLINUX=y
CONFIG_USB_ATM=m
CONFIG_USB_BELKIN=y
CONFIG_USB_CDC_COMPOSITE=m CONFIG_USB_CDC_COMPOSITE is not set
CONFIG_USB_CONFIGFS_ACM=y CONFIG_USB_CONFIGFS_ACM is not set
CONFIG_USB_CONFIGFS_ECM_SUBSET=y
CONFIG_USB_CONFIGFS_ECM=y CONFIG_USB_CONFIGFS_ECM is not set
CONFIG_USB_CONFIGFS_ECM_SUBSET is not set
CONFIG_USB_CONFIGFS_F_FS=y CONFIG_USB_CONFIGFS_F_FS is not set
CONFIG_USB_CONFIGFS_F_HID=y CONFIG_USB_CONFIGFS_F_HID is not set
CONFIG_USB_CONFIGFS_F_LB_SS=y CONFIG_USB_CONFIGFS_F_LB_SS is not set
CONFIG_USB_CONFIGFS_F_UAC2=y
CONFIG_USB_CONFIGFS_NCM=y CONFIG_USB_CONFIGFS_NCM is not set
CONFIG_USB_CONFIGFS_OBEX=y CONFIG_USB_CONFIGFS_OBEX is not set
CONFIG_USB_CONFIGFS_RNDIS=y CONFIG_USB_CONFIGFS_RNDIS is not set
CONFIG_USB_CONFIGFS_SERIAL=y CONFIG_USB_CONFIGFS_SERIAL is not set
CONFIG_USB_CONFIGFS=m CONFIG_USB_CONFIGFS=y
CONFIG_USB_DEFAULT_PERSIST=y CONFIG_USB_DEFAULT_PERSIST is not set
CONFIG_USB_DWC2_DEBUG is not set
CONFIG_USB_DWC2_DUAL_ROLE=y
CONFIG_USB_DWC2_HOST is not set
CONFIG_USB_DWC2_PCI is not set
CONFIG_USB_DWC2_PERIPHERAL is not set
CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set
CONFIG_USB_DWC2=m CONFIG_USB_DWC2 is not set
CONFIG_USB_DWC3_DUAL_ROLE=y
CONFIG_USB_DWC3_GADGET is not set
CONFIG_USB_DWC3_HAPS=y
CONFIG_USB_DWC3_HOST is not set
CONFIG_USB_DWC3_OF_SIMPLE=y
CONFIG_USB_DWC3_OTG is not set
CONFIG_USB_DWC3 is not set CONFIG_USB_DWC3=y
CONFIG_USB_DWCOTG=y
CONFIG_USB_ETH_EEM is not set CONFIG_USB_ETH_EEM=y
CONFIG_USB_ETH=m CONFIG_USB_ETH=y
CONFIG_USB_EZUSB_FX2=m CONFIG_USB_EZUSB_FX2 is not set
CONFIG_USB_F_ACM=m
CONFIG_USB_F_ECM=m CONFIG_USB_F_ECM=y
CONFIG_USB_F_EEM=m CONFIG_USB_F_EEM=y
CONFIG_USB_F_FS=m
CONFIG_USB_F_HID=m
CONFIG_USB_F_MASS_STORAGE=m CONFIG_USB_F_MASS_STORAGE=y
CONFIG_USB_F_NCM=m
CONFIG_USB_F_OBEX=m
CONFIG_USB_F_RNDIS=m CONFIG_USB_F_RNDIS=y
CONFIG_USB_F_SERIAL=m
CONFIG_USB_F_SS_LB=m
CONFIG_USB_F_SUBSET=m CONFIG_USB_F_SUBSET=y
CONFIG_USB_F_UAC2=m
CONFIG_USB_FEW_INIT_RETRIES is not set
CONFIG_USB_G_ACM_MS=m CONFIG_USB_G_ACM_MS is not set
CONFIG_USB_G_HID=m CONFIG_USB_G_HID is not set
CONFIG_USB_G_MULTI_CDC is not set
CONFIG_USB_G_MULTI_RNDIS=y
CONFIG_USB_G_MULTI=m CONFIG_USB_G_MULTI is not set
CONFIG_USB_G_SERIAL=m CONFIG_USB_G_SERIAL is not set
CONFIG_USB_GADGETFS=m CONFIG_USB_GADGETFS is not set
CONFIG_USB_GSPCA=m
CONFIG_USB_HIDDEV=y CONFIG_USB_HIDDEV is not set
CONFIG_USB_HSO=m
CONFIG_USB_LD=m CONFIG_USB_LD is not set
CONFIG_USB_LIBCOMPOSITE=m CONFIG_USB_LIBCOMPOSITE=y
CONFIG_USB_MASS_STORAGE=m CONFIG_USB_MASS_STORAGE is not set
CONFIG_USB_MON=m CONFIG_USB_MON is not set
CONFIG_USB_NET_CDC_EEM=m CONFIG_USB_NET_CDC_EEM=y
CONFIG_USB_NET_CDC_MBIM=m CONFIG_USB_NET_CDC_MBIM is not set
CONFIG_USB_NET_CDC_NCM=m CONFIG_USB_NET_CDC_NCM is not set
CONFIG_USB_NET_CDC_SUBSET_ENABLE=m
CONFIG_USB_NET_CDC_SUBSET=m CONFIG_USB_NET_CDC_SUBSET is not set
CONFIG_USB_NET_CDCETHER=m CONFIG_USB_NET_CDCETHER=y
CONFIG_USB_NET_RNDIS_HOST=m CONFIG_USB_NET_RNDIS_HOST is not set
CONFIG_USB_NET_RNDIS_WLAN=m
CONFIG_USB_OTG_BLACKLIST_HUB is not set
CONFIG_USB_OTG_FSM=y
CONFIG_USB_OTG_WHITELIST is not set
CONFIG_USB_OTG is not set CONFIG_USB_OTG=y
CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set
CONFIG_USB_OTG_PRODUCTLIST is not set
CONFIG_USB_PWC=m
CONFIG_USB_RAW_GADGET is not set
CONFIG_USB_ROLE_SWITCH=m CONFIG_USB_ROLE_SWITCH is not set
CONFIG_USB_SERIAL=m CONFIG_USB_SERIAL is not set
CONFIG_USB_SEVSEG=m CONFIG_USB_SEVSEG is not set
CONFIG_USB_TEST=m CONFIG_USB_TEST is not set
CONFIG_USB_TMC=m CONFIG_USB_TMC is not set
CONFIG_USB_U_ETHER=m CONFIG_USB_U_ETHER=y
CONFIG_USB_U_SERIAL=m
CONFIG_USB_WUSB_CBAF is not set
CONFIG_USB_ZERO=m CONFIG_USB_ZERO is not set
Parece que não há nenhuma opção especial necessária.
O Rpiboot usando libusb, via libusb, por padrão, exige que o udev seja executado, o que não acontece, no sistema host. Porém, ele não reclama quando você o executa em um sistema sem udev ... Fui enganado por isso, pois recentemente compilei "lsusb" (usbtools) como a implementação do BusyBox está faltando, e ele travou no sistema host, comlpaining sobre falta de coisas relacionadas ao udev.
Depois de compilar o libusb, configurá-lo com "--disable-udev" antes e usar isso para construir o rpiboot, isso funciona.