Пакеты каким-то образом искажены, и единственный ресурс, который мне удалось найти, — это определение класса USB-устройств для MIDI-устройств. Других устройств на шине нет. Вот пример одного пакета — отправляемые данные MSC идут от выделенного октета f0 до конца. Это соответствует спецификации MSC, указанной выше. Информация в раскрывающемся списке в левом нижнем углу навела меня на мысль, что по какой-то причине это анализируется как два пакета MIDI-событий.

Как видно на изображении выше, мой ноутбук (хост) каждый раз отвечает URB_BULK. Я не могу найти упоминания об этом в спецификации класса устройства или любой другой документации, касающейся MIDI через USB или MSC. Я не уверен, что это за часть протокола. Вот URB_BULK.

Устройство монтируется/определяется как «Композитное USB-устройство». Сообщения MSC не обнаруживаются программным обеспечением, принимающим MSC, или анализаторами пакетов, специфичными для MSC.
Я пробовал модифицировать отправляемый пакет MSC, манипулировать временем, изменять длину пакета. маска, биты RD_EN/WR_EN, конечные точки, а также изменение процесса монтирования/перечисления и инициализации шины. Что не так с данными, которые я отправляю? Как мне привести его в соответствие с ожидаемым форматом?
Это часть соответствующего кода. ep_write взят из usbcore.cpp в ОС mbed. Я могу придумать, как изменить свой код, если знаю, как должен выглядеть отправленный пакет, мне просто нужно знать, чем то, что я отправляю, отличается от этого формата.
Код: Выделить всё
#define TxENDPKT (1USBTxData = *buf++;
}
LPC_USB->USBCtrl = 0;
LPC_USB->USBDevIntClr |= TxENDPKT;
sie_command(SIE_SEL_EP+ep); // select endpoint
sie_command(SIE_VAL_BUFFER); // validate TX buffer
}
/*
Takes command byte (0x06 for set), data pointer, and data length.
Sends a formatted MSC message over serial.
Returns 0 on success.
*/
int sendMSC(uint8_t command, uint8_t *data, int datalen) {
uint8_t msc_packet[] = {0xF0, 0x7F, 0x7F, 0x02, 0x7F, command};
/*[F07F] header, marks univ sys ex/realtime
[7F] target device (broadcast)
[02] MSC specifier
[7F] command format (all)*/
memcpy(msc_packet + 6, data, datalen); //copy data to end of msc packet
uint8_t msc_close = 0xF7; //closing octet
memcpy(msc_packet + 6 + datalen, &msc_close, 1);
if (VERBOSE) {
debug(("Sending MSC packet => "));
for (int i = 0; i < 7 + datalen; ++i) {
debug(("%x ", msc_packet[i]));
}
debug(("\n"));
}
ep_write(EP5, msc_packet, 7 + datalen);
return 0;
}

< /p>
После изменения его на HID-совместимое устройство с использованием библиотеки USBHID mbed:
[img]https://i.stack.imgur .com/mF5qX.png[/img]
Подробнее здесь: https://stackoverflow.com/questions/781 ... -formatted