Перейти к содержанию
    

USB MSC найти и прочитать один файл без FAT внутри устройства

23 минуты назад, xvr сказал:

После окончания записи - безусловно, но он может это делать и в процессе записи.

Имхо - запись обновляется после закрытия файла. Либо после принудительного сброса (flush). А самопроизвольно, для открытого на запись файла - нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Коллеги, благодарю за помощь!

Пришёл к выводу, что после записи файла на диск пользователь должен будет отключить шланг USB от устройства. Это и будет ялвяться для загрузчика сигналом к проверке наличия файла, его целостности и т.д. и т.п. О том, чтобы кеши были сброшены на диск должна заботится ОС, либо, пользователь должен будет делать безопасное извлечение диска. Вроде это на старых ОС Windows точно требовалось. На новых версия, насколько мне известно, кэширование отключено по умолчанию, и флешку можно просто выдернуть из разъёма. Но в любом случае это уже не загрузчика забота.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день, коллеги!

 

Подниму тему. Начальство озадачило вопросом извлечения USB MSC. Другими словами можно ли как-то USB стеком в микроконтроллере задетектировать событие извлечения? Типа, чтобы не нужно было отключать кабель USB от хоста. Зачем это нужно, честно говоря не знаю. Но ответ хотят получить быстро.

 

В иаровском стеке я поставил ради интереса две команды с точками останова. Сделал в Win извлечение диска. И ни на одной строке не произошло останова. При этом отладчик работал корректно. Я остановил его кнопкой "пауза" и программа прекратила выполнение. Т.е. глюков отладки не было. В Win10 при этом съёмный диск пропал.

image.thumb.png.1bf62d13d9d249f71522be48749c0ee1.png

Я перечитал описание команд SCSI, и так и не понял, к какой команде можно "прикрутить" свой код, который должен выполниться однозначно в случае извлечения диска со стороны ОС? Прошу помощи более опытных коллег в данном вопросе.

Т.к. я не могу изучить все ОС (веток того же линукса довольно много), да и физически проверить те же Win98 (мало ли), Win XP довольно сложно, вообще спрошу, как правильно сделать всё же так, чтобы загрузчик получил целый файл?

 

Сейчас сделано так: при подключении устройства по USB, на ОС видент диск. На диск я копирую файл. После окончания копирования, отключаю кабель USB от компа. Программа на микроконтроллере видит пропадание напряжения +5 В на ножке VBUS, и далее начинает работать с массивом памяти как с диском через FatFS. Всё работает корректно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С оптимизацией для быстрого извлечения по-моему так сделать не получится, т.к. винда всегда после записи сбрасывает кеши и не вызывает остановку устройства в явном виде, поскольку это попросту не нужно (устройство и так всегда готово к извлечению). Можно попробовать ориентироваться на косвенные признаки: после "извлечения" должны перестать приходить запросы TEST_UNIT_READY, которые в обычном режиме должны приходить где-то раз в секунду или около того.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@makc, вот и я о том же))) Но руководитель мой говорит, что в линукс происходит отмонтирование. Да я и сам об этом знаю. Может что-то по этому поводу сказать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сказать можно только одно: нет общего механизма и Linux != Windows. Ну это он, наверное, и так знает, но стоит напомнить. 😉

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Интересно, а после безопасного извлечения диска из винды/линукса она случаем не переводит его в спящий режим некими командами?

не очень шарю в этом вопросе, но проверить не долго - бряк на точку, где по стеку происходит вход в спячку

просто знаю по внешним usb-ssd дискам, если его безопасно извлечь и не вынимать, то постепенно он перестает быть "тепленьким", даже если до этого о просто торчал в компе и никакой софт с ним не работал

т.е. видать входит в "спячку"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 minutes ago, makc said:

Сказать можно только одно: нет общего механизма и Linux != Windows. Ну это он, наверное, и так знает, но стоит напомнить. 😉

Простите, что Вы хотите этим сказать? Я немного плохо соображаю после нескольких часов чтения документации... Мой алгоритм: вытащили кабель из хоста, задетектировали пропадание напряжения +5 В, начали искать файл с помощью FatFS - рабочий? Или всё же нужно добавлять события в стек?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я хочу сказать, что обеспечение целостности данных на носителе (обеспечение реализации процедуры безопасного извлечения) лежит на приложении (операционной системе), поэтому каждый делает что хочет и нет общего механизма, закреплённого где-то в тексте стандарта. Поэтому потеря данных при некорректном извлечении - это проблема не железа (носителя), а пользователя и его ОС.

2 минуты назад, haker_fox сказал:

Мой алгоритм: вытащили кабель из хоста, задетектировали пропадание напряжения +5 В, начали искать файл с помощью FatFS - рабочий? Или всё же нужно добавлять события в стек?

Нет, нужно ориентироваться на состояние физического уровня USB (событие disconnect в контроллере). Устройство вполне может работать через USB и без этих +5В, если у него есть своё питание. Это вполне нормальная ситуация.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, makc said:

Поэтому потеря данных при некорректном извлечении - это проблема не железа (носителя), а пользователя и его ОС.

Понял, спасибо!

1 minute ago, makc said:

Устройство вполне может работать через USB и без этих +5В

В нашем случае VBUS всегда заведён на разъём, поэтому, как я понимаю, проблемы нет?!)))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, haker_fox сказал:

В нашем случае VBUS всегда заведён на разъём, поэтому, как я понимаю, проблемы нет?!)))

Не понял, какой именно разъём вы имеете в виду, т.к. не представляю всю структуру вашей системы в комплексе. Но наверное вы правы и проблемы нет. 🙂

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, makc said:

Не понял, какой именно разъём вы имеете

USB B, USB type C, micro/mini USB. Во всех случаях у нас на эти разъёмы подаётся +5 В от хоста.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне кажется, тут надо плясать от печки от компа. Натравить на USB Wireshark и смотреть лог работы устройства в момент извлечения в виндовсе и линухе без всяких точек останова в устройстве. Если в логе найдется что-то интересное - тогда уже пытаться поддерживать внутри устройства.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, Сергей Борщ сказал:

Мне кажется, тут надо плясать от печки от компа. Натравить на USB Wireshark и смотреть лог работы устройства в момент извлечения в виндовсе и линухе без всяких точек останова в устройстве. Если в логе найдется что-то интересное - тогда уже пытаться поддерживать внутри устройства.

Гарантий это не даёт, т.к. при других настройках ОС или при другом патче драйвера в ОС поведение может быть другим.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 minutes ago, makc said:

Гарантий это не даёт, т.к. при других настройках ОС или при другом патче драйвера в ОС поведение может быть другим.

Возможно, что я чего-то не понимаю. Но руководитель настаивает на том, что событие извлечения нужно ловить, чтобы не потерять данные. Я уже не знаю, что говорить ему. Дал ссылку на форум. И всё равно... бесполезную работу я делать не хочу. Но и своих знаний в этой области почти ноль. А получить их за пару  дней нереально. 

 

Вот что может произойти, если пользовать выбрал "извлечть", затем отключил кабель USB? Ну как там могут потеряться данные? Ума не приложу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...