Я следую этому руководству по реализации устройства GadgetFS в Linux: https://blog.soutade.fr/post/2016/07/cr ... getfs.html
Мне нужно было расширить конфигурацию, добавив вторую альтернативную настройку, в которой есть все мои конечные точки. Итак, мой код определил один интерфейс с альтернативным значением 0, без конечных точек, и другой интерфейс с альтернативным значением 1, с двумя конечными точками. В остальном код такой же, как в примере выше.
Устройство, похоже, распознается хостом правильно, однако во время инициализации оно достигает следующих строк кода:
Код: Выделить всё
case USB_REQ_SET_INTERFACE:
printf("SET_INTERFACE\n");
ioctl (thread_args.fd_in, GADGETFS_CLEAR_HALT);
ioctl (thread_args.fd_out, GADGETFS_CLEAR_HALT);
// ACK
status = read (fd, &status, 0);
I figured out that if I simply comment out the ioctl() calls, then it seems to work fine. However, I am cautious of doing this because I don't really know what those lines do, they must be there for a reason. The API's comments merely say "resets endpoint halt+toggle; used to implement set_interface.", and I don't really find any other info anywhere else online either.
If I simply have one interface, like the original example, the problem does not occur either.
So my question is, what do these GADGETFS_CLEAR_HALT operations do? Why are they breaking my program if I specify more than one USB interface?
Источник: https://stackoverflow.com/questions/781 ... ce-program
Мобильная версия