Я хочу реализовать 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;
}
}
}
}