Разработка прошивки USB (SCSI) — как обращаться со съемными носителями

Я разрабатываю USB-накопитель. У меня аппарат в принципе рабочий (слишком тормозит, но это уже другой разговор). Что не работает так хорошо, как мне бы хотелось, так это обработка удаления устройства - не со стороны USB, а с USB-устройства, представляющего правильные ответы хосту, когда USB-устройство принудительно отключено (принудительно) удалением носителя.

Я пытался отвечать на запросы чтения/записи смысловым ключом NOT_READY с дополнительной информацией MEDIUM_NOT_PRESENT, но хосты, похоже, не реагируют на это так же, как на отсоединение USB-кабеля.

Каково ожидаемое поведение USB-устройств со съемными носителями, когда носитель выдергивается во время работы?


person nsayer    schedule 19.04.2017    source источник
comment
Какие у вас хозяева? Мне повезло с MEDIUM_NOT_PRESENT как в Linux, так и в Windows 7+. Если мне не изменяет память, возможно, было важно отвечать на ВСЕ команды последовательно с помощью MEDIUM_NOT_PRESENT, а не только читать и писать — например, TEST_UNIT_READY тоже должен это получить.   -  person Mike Andrews    schedule 20.04.2017
comment
Я тестирую Linux (Raspbian) и Mac. Я пытаюсь добавить его в TEST_UNIT_READY, но если это сработает, вы можете подумать о преобразовании своего комментария в ответ.   -  person nsayer    schedule 20.04.2017
comment
Я добавил ту же проверку/ответ в UNIT_TEST_READY, но это не помогло.   -  person nsayer    schedule 20.04.2017
comment
Ах, ваш последний абзац просто окончательно вошел в мой мозг. Вы не извлекаете устройство, как с командой eject, получая START_STOP_UNIT EJECT? В этом случае вы можете захотеть выдернуть LUN, вместо того, чтобы вести себя так, как будто носитель только что исчез. Можно ли поэкспериментировать с выдачей UNIT_ATTENTION с REPORTED_LUNS_DATA_HAS_CHANGED, а затем отказаться сообщать о LUN?   -  person Mike Andrews    schedule 20.04.2017
comment
Каково значение REPORTED_LUNS_DATA_HAS_CHANGED? Я не вижу этого. Является ли это дополнительным смысловым кодовым значением?   -  person nsayer    schedule 20.04.2017
comment
Я нашел значения для единицы внимания, но, похоже, это не помогло.   -  person nsayer    schedule 20.04.2017
comment
Я думаю, что осталось: каково поведение? У вас есть неприятные сообщения в /var/log/messages (или journalctl)?   -  person Mike Andrews    schedule 20.04.2017
comment
Поведение... вообще ничего. Я могу выдернуть карту, и хост будет вести себя так, как будто ничего не произошло. Ввод/вывод просто зависнет. Я не ждал достаточно долго, чтобы увидеть, как долго тайм-аут.   -  person nsayer    schedule 21.04.2017


Ответы (1)


Спасибо Dean Camera из LUFA за решение этой проблемы (я не знаю, есть ли у него здесь личность или нет). Решение заключалось в том, чтобы не изменять количество LUN, а вместо этого ответить на PREVENT_ALLOW_MEDIUM_REMOVAL смысловым ключом ILLEGAL_REQUEST и ответить на TEST_UNIT_READY в соответствии с состоянием устройства (успешно или NOT_READY/MEDIUM_NOT_PRESENT). Я также генерирую UNIT_ATTENTION для первой команды после любого изменения статуса. И теперь устройство работает точно корректно при удалении и вставке носителя.

person nsayer    schedule 29.04.2017