Raspberry Pi 3 USB голый металл
Я работаю над новой платой Raspberry Pi 3 B+ в голой металлической среде (32-битная). У меня есть работающий драйвер USB для старых плат Pi 1. Насколько я понимаю, Pi 1 и Pi 3 B + имеют один и тот же хост-контроллер USB (хост-контроллер Synopsis DesignWare 2.0; или сокращенно dwc), но драйвер USB, который работает на Pi 1, не работает для меня на Pi 3 B+ (или Pi 3 B либо).
После просмотра некоторых отладочных сообщений я обнаружил, что проблема заключается в том, что, когда DWC перечисляет устройства, он пытается прочитать дескриптор устройства, которое, как я предполагаю, находится на плате USB-концентратора / Ethernet-устройства (LAN7515)., но он вернет ошибку передачи и, следовательно, не сможет перечислить устройство.
Мой вопрос: почему это происходит? Если Pi 1 и Pi 3 имеют один и тот же хост-контроллер, то теоретически он должен, по крайней мере, быть в состоянии правильно перечислить устройство.
Если кто-то может указать мне правильное направление относительно того, почему это происходит, это будет с благодарностью.
Заранее спасибо.
1 ответ
У Pi3 есть проблема с выравниванием, потому что некоторые из USB-структур не выровнены изначально и они упакованы. Обычно требуется вставить некоторые атрибуты упаковки и выравнивания " attribute ((pack, align (1)))" в некоторые структуры, которые не выровнены.
Правило идет uint16_t* указатели должны быть для чтения / записи выровнять 2 адреса uint32_t* указатели должны быть для чтения / записи выровнять 4 адреса
Таким образом, структура как это смещена.
struct BadStruct __attribute__((__packed__)){
uint8_t a;
uint16_t b;
};