usb в gpl-прошивке работает потому что броадком свою шину в своем же коде заворачивает в обертки для эмуляции pci после чего регистрирует в системе эту эмулируемую шину pci. Регистры устройства usb совместимы с hcd-usb поэтому когда в системе появляется эмуль ssb/axi в виде pci штатный драйвер usb/pci подхватывает этот контроллер usb.
Именно изза эмуляции pci в штатной прошивке ты увидишь 2 шины если сделаешь lspci. И изза этого же в драйверах броадкома все probe для шины pci, кроме разумеется тех, что добавлены в последствии для поддержки с использованием кода linux/ssb. Все это завернуто таким нетривиальным способом для возможности использовать большую часть кода монолитного драйвера под другие ОС - виндовс/мак и не писать драйвер usb.
Вся инициализация шины - это сканирование (поиск доступных устройств на шине - siutils.с, si_doattach), инициализация buscore (mips для внедряемых систем либо pcmcia/pci/sdio/etc. хоста - файлы hndmips.c/hndpci.c/etc.), инициализация buscommon (chipcommon либо extif - hndpmu.c)
На самом деле все довольно таки просто (особенно для внедряемых систем - для них даже инициализация не обязательна так как при включении устройства его инициализирует код cfe и остается лишь определить текущую конфигурацию). Вот только нагромождение кода выглядит пугающе поскольку у броадкома все свалено в кучу ради монолитного драйвера
Судя по тем крохам информации что мне удалось нарыть, контроллер USB Broadcom
имеет 5 каналов dma, но linux ими пользоваться не умеет, а драйвер написать
в виду отсутствия какой либо документации не представляется возможным. Драйвера
ohci-ssb/ehci-ssb предоставляют лишь pio доступ к USB.
Чтобы завести USB не в PIO режиме нужна
информация по регистрам host-контроллера либо пример в виде драйвера под
Броадкомовские библиотеки как это было для bgmac.
Источники информации - старые коды Broadcom (svn dd-wrt лучший источник этого хлама), более
новые коды броадком (почти все кроме mips есть в linux/staging/brcm80211/{util,include},
GPL-пакет ASUS (
ftp://ftp.asus.com). В старых исходниках из dd-wrt есть .h файл с описанием
регистров usb, однако к сожалению без описания зачем они нужны - "голые" названия и карта
их размещения
В ядре есть поддержка шины SSB. Я добавил код поддержки шины AXI с использованием базы кода
SSB. В моих патчах есть ssb_dma.c - это порт hnddma.с для linux/ssb.
Тут не путай код SSB (код поддержки шины SB включенный в mainline linux) с шиной.
Broadcom для дров своих устройств использует библиотеки, полностью скрывающие архитектуру от
ядра. Вместо реализации кода шины отделно, кода драйверов отдельно, Broadcom все свалили в
одну кучу и, например, тот же драйвер brcm80211 при запуске поднимает/настраивает шину, но
системе показывает лишь наличие одного устройства - карточки wifi. Код ssb работает по другому,
реализация управления шиной отдельно, драйвера отдельно.
С выходом шины AXI все стало совсем печально, поддержки её в linux нет и не скоро будет, а
драйвера от броадком в mainline попадут очень не скоро если вообще попадут. Поэтому написал
поддержку AXI с использованием SSB надеясь что это может быть включено в mainline но похоже
не судьба.
Что такое SB - это весьма длинная история. Если в кратце, то это набор устройств, где одно из
них (опциональное) выполняет роль как бы арбитра шины, и ещё одно (обязательное) выполняет роль
"ведущего". Устройства доступны в физическом адресном пространстве, регистры устройств располагаются
в этом физ. адресном пространстве друг за другом по 0x1000 байт на устройство. Все программирование
шины сводится к первичной настройке двух спец. устройств упомянутых выше. После их настройки остальные
устройства могут управляться собственными драйверами независимо друг от друга и от самой шины.
Шина AXI - та же шина SB, с небольшими изменениями. В SB спец. регистры шины были в адресном
пространстве устройств по смещению 0x800 от начала регистров каждого устройства. В AXI аналогичные
регистры шины расположены отдельно от блока регистров устройств и обрабатываются несколько по другому.
При этом и в SB и в AXI сами устройства (USB/Wifi/etc.) имеют те же самые регистры и могут управляться
теми же самыми дровами. Тоесть вся разница что при обращении к регистрам собственно SB либо AXI их нужно
"искать" в разных местах и использовать по разному. А в остальном с точки зрения программирования
это "те же яйца только в профиль".