USB-гаджет через functionfs с альтернативными интерфейсами - PullRequest
0 голосов
/ 17 октября 2019

Я хочу реализовать USB-гаджет в пространстве пользователя с помощью функции Linux Linux на C / C ++. В простейшем виде гаджет имеет только один интерфейс с двумя конечными точками. Но может также существовать более сложная форма с дополнительными функциями, состоящими из двух альтернативных настроек интерфейса.

Function 1
  Interface
    Endpoint 1
    Endpoint 2
Function 2
  Interface (alternate setting 0, zero bandwidth)
  Interface (alternate setting 1)
    Endpoint 1
    Endpoint 2
Function 3... (analog to previous one)
...

USB-хост может переключаться между альтернативными настройками в любое время. Насколько я понимаю API-функции functionfs, хост-узел уведомляет о переключении альтернативной настройки через событие ep0 FUNCTIONFS_ENABLE. Но нет никакой информации, какой интерфейс переключил альтернативную настройку.

Поэтому первый вопрос, который у меня возникает, это: можно ли это реализовать с помощью одного экземпляра функции?

Решением может быть использованиевыделенный экземпляр функции для каждой функции. В этом случае у меня был бы выделенный ep0 для каждой функции, и я мог бы различить, для какого интерфейса произошел альтернативный переключатель настроек (потому что событие FUNCTIONFS_ENABLE уведомлено о соответствующем ep0).

Но все еще естьОстается вопрос: как мне узнать, какой из двух альтернативных параметров был выбран хостом? В API-функции functionfs я не нашел ничего такого, что могло бы дать мне эту информацию.

while (true)
{
    usb_functionfs_event event;
    res = ::read(ep0_fd[func_inst], &event, sizeof(event));
    if (res < 0)
    {
        // error
    }
    else
    {
        switch (event.type)
        {
            case FUNCTIONFS_BIND:
            {
                // do something
                break;
            }
            case FUNCTIONFS_UNBIND:
            {
                break;
            }
            case FUNCTIONFS_ENABLE:
            {
                // interface enabled or alternate setting changed
                break;
            }
            case FUNCTIONFS_DISABLE:
            {
                // interface disabled
                break;
            }
            case FUNCTIONFS_SETUP:
            {
                break;
            }
            case FUNCTIONFS_SUSPEND:
            {
                break;
            }
            case FUNCTIONFS_RESUME:
            {
                break;
            }
            default:
            {
                break;
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...