USB-гаджет - functionfs: как получить доступ к конечным точкам, используя флаг FUNCTIONFS_VIRTUAL_ADDR - PullRequest
0 голосов
/ 10 апреля 2019

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

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

Кто-нибудь имеет опыт работы сthis?

cheers benjo

Я прослушал трафик с помощью 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(&buffer[0], buffer.size(), '\0');
        if (ep2File.gcount() > 0)
        {
            std::cout << "Received " << ep2File.gcount() << " bytes." << std::endl;
            std::cout << reinterpret_cast<const char*>(&buffer[0]) << std::endl;
            std::string command(reinterpret_cast<const char*>(&buffer[1]));

            if (command == "ABC")
            {
                // do sth.
            }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...