USB-гаджет — functionfs: Как получить доступ к конечным точкам, используя флаг FUNCTIONFS_VIRTUAL_ADDR

#c #linux #usb

#c #linux #usb

Вопрос:

Я пытаюсь использовать API functionFS для реализации пользовательского USB-устройства. Мне удалось настроить дескрипторы устройств с помощью configFS, а также дескрипторы интерфейса и enpoint через functionFS. Чтобы иметь более детерминированную нумерацию конечных точек (functionFS делает это в фоновом режиме), я попытался использовать флаг FUNCTIONFS_VIRTUAL_ADDR, который называет файлы конечных точек как «ep02» и «ep81» вместо «ep2» и «ep1».

Моя проблема сейчас в том, что, как только я использую флаг FUNCTIONFS_VIRTUAL_ADDR, я больше не могу получать массовые передачи. Файлы конечных точек есть (в моем случае «/ mnt / ffs / ep02» и «/ mnt / ffs / ep81»), но чтение файла ep02 не возвращает никакого содержимого.

У кого-нибудь есть опыт работы с этим?

приветствую Бенджо

Я прослушал трафик с помощью wireshark и вижу массовую передачу с хоста на конечную точку 0x02, но мое устройство никогда этого не видит.

 void Usb::dumpThread()
{
    std::ofstream ep1File(m_ffsPath   "/ep81");
    std::ifstream ep2File(m_ffsPath   "/ep02");

    static std::array<char, maxPacketSize> buffer;
    while (true)
    {
        ep2File.getline(amp;buffer[0], buffer.size(), '');
        if (ep2File.gcount() > 0)
        {
            std::cout << "Received " << ep2File.gcount() << " bytes." << std::endl;
            std::cout << reinterpret_cast<const char*>(amp;buffer[0]) << std::endl;
            std::string command(reinterpret_cast<const char*>(amp;buffer[1]));

            if (command == "ABC")
            {
                // do sth.
            }
}