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

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

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

 

Есть железка, которая предстаёт как USB MSC для ПК. Сам диск реализован в ОЗУ. Размер 16 Мб. На этот диск записывается один! файл. Можно ли внутри железки без FAT (как я понимаю, именно эта ФС используется в USB MSC по умолчанию в Win) обнаружить, что файл был записан (имя всегда одно и то же) и считать его? Не могу найти вразумительного ответа на просторах сети.

 

Спасибо!

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


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

1 hour ago, haker_fox said:

Можно ли внутри железки без FAT

Прочитать fat таблицу диска и найти там его, разбирая эту область. Полностью реализовывать поддержку fat не обязательно. Что-то типа read only fat, но еще сильнее урезанная.

Можно в лоб - слить fat таблицу посекторно в двух состояниях: с записанных в нее файлом и без. Сравнением побайтно выяснить что изменилось в этой таблице.

 

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


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

1 minute ago, Forger said:

Прочитать fat таблицу диска и найти там его, разбирая эту область. Полностью реализовывать поддержку fat не обязательно. Что-то типа read only fat, но еще сильнее урезанная.

Мда... Сейчас стал приходить к подобному же выводу. И, как мне кажется, теперь становится очевидным взять FatFS от мистера Чана, скомпилировать её в режиме только чтение, и не выдумывать альтернативу велосипеду:blum:

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


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

19 minutes ago, haker_fox said:

И, как мне кажется, теперь становится очевидным взять FatFS от мистера Чана

если позволяет место на флэши, то конечно так проще всего )

У мистера Чана поддержаны разные фат, а тут судя по всему нужна самая примитивная из них - fat12, хотя может и fat16.

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


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

20 minutes ago, Forger said:

fat16

Она. Но в целом - да, лучше брать готовую либу. А то сегодня хотят один файл, завтра - сотню)

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


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

53 минуты назад, Forger сказал:

Можно в лоб - слить fat таблицу посекторно в двух состояниях: с записанных в нее файлом и без. Сравнением побайтно выяснить что изменилось в этой таблице.

Не понятно - что именно автор имел в виду под "файл был записан (имя всегда одно и то же)"? Если мог быть случай записи в существующий файл записью поверх старых данных, то FAT-таблица скорей всего не изменится и её чтение ни чего не даст. Тогда поможет только чтение всего массива байт файла и контроль некоей CRC/хеша (заранее где-то посчитанной/сохранённой).

PS: Ещё можно попробовать делать контроль по изменению записи в директории о файле. Точнее - о времени/дате его последней модификации. По уму - она тоже должна измениться, если только ПО на ПК не предпримет каких-то действий по недопущению этого. Вобщем-то многие компиляторы поступают именно так, когда решают - какие файлы стоит перекомпилить, а какие - нет (по дате/времени модификации).

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


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

7 minutes ago, jcxz said:

Если мог быть случай записи в существующий файл записью поверх старых данных, то FAT-таблица скорей всего не изменится и её чтение ни чего не даст.

Как я понял нужно сравнить два состояния: есть один файл и нет ни одного файла. Типа пусто/не пусто.

Действительно это можно сделать в лоб, тупо сравнивая несколько байтов по известному смещению внутри одного и того же заранее выясненного сектора.

Конечно, если пишется только один файл и ничего более.

 

 

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


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

3 часа назад, haker_fox сказал:

Есть железка, которая предстаёт как USB MSC для ПК. Сам диск реализован в ОЗУ. Размер 16 Мб. На этот диск записывается один! файл. Можно ли внутри железки без FAT (как я понимаю, именно эта ФС используется в USB MSC по умолчанию в Win) обнаружить, что файл был записан (имя всегда одно и то же) и считать его? Не могу найти вразумительного ответа на просторах сети.

ОС работает с MSC как с блочным устройством, используя, в том числе, и кэширование. Поэтому, с момента монтирования (подключения) до отсоединения, вправе писать блоки как угодно, сначала таблицу, потом данные, или наоборот. Или вообще не писать ничего, если сохраняемый файл не изменился, к примеру. Поэтому изнутри устройства USB понять, что файл записан и запись окончена можно, только если непрерывно мониторить FAT таблицу и как-то узнать "свой" файл, проверив его CRC, которое хранится в соседнем файле, например. Проще говоря, это костыли.

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


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

57 minutes ago, gerber said:

Проще говоря, это костыли.

Как тогда работают загрузчики, обновляющие прошивку через USB MSC? Там же механизм простой: закинул файл, и ПО обновлено...

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


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

3 minutes ago, haker_fox said:

Там же механизм простой: закинул файл, и ПО обновлено...

С теми загрузчиками, что я знаком, обновление происходит ПОСЛЕ отключения девайса от ПК.

Т. е сначала записывается образ загрузчика во некую флэш на устройстве как обычный файл.

А уже потом сам загрузчик этот же файл вычитывает и обновляет прошивку камня.

 

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


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

Отличить состояния 'девственно чистый диск' от 'что то записано' можно по наличию первой записи в root секторе.

Отличить состояния 'что то пишется' от 'всё записно' со 100% вероятностью нельзя в принципе - FAT никак не помечает окончание записи в файл (если мой склероз мне не изменяет). Только по таймаутам или физическому размонтированию носителя (выдёргивание USB например)

Читать то, что записано лучше всего через fatFS в режиме RO или аналог (как уже предлагали, да и сам ТС к тому же пришёл). В принципе можно предположить что ОС будет записывать сектора файла последовательно (и скорее всего так и будет), но полагаться на это нельзя.

8 minutes ago, haker_fox said:

Как тогда работают загрузчики, обновляющие прошивку через USB MSC?

Читают FAT, это не так сложно, как кажется.

 

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


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

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

Отличить состояния 'что то пишется' от 'всё записно' со 100% вероятностью нельзя в принципе - FAT никак не помечает окончание записи в файл (если мой склероз мне не изменяет).

Вы забываете про запись о файле в директории. После модификации файла, драйвер ОС (как минимум) должен произвести коррекцию времени последней модификации и (опционально) размера файла.

Конечно проблем с кешированием в ОС это не отменяет. Но, если в пишущей программе на ПК это предусмотреть, то в ней можно после завершения модификации файла, давать команду "flush" драйверу ОС. По которой он вроде как(?) должен сделать сброс данных на диск.

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

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

Непонятно - почему все игнорируют время/дату последней модификации файла??? :unknw:

Если файл находится в корневой директории, то в FAT12/FAT16 её положение и размер - фиксированы. Прочитать её несложно руками, без всякой FatFS. И не надо читать и разбирать никаких таблиц и массивов секторов.

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


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

18 minutes ago, jcxz said:

После модификации файла, драйвер ОС (как минимум) должен произвести коррекцию времени последней модификации и (опционально) размера файла.

После окончания записи - безусловно, но он может это делать и в процессе записи. Так что это не 100% надёжный вариант отследить именно окончание записи в файл.

20 minutes ago, jcxz said:

Если файл находится в корневой директории, то в FAT12/FAT16 её положение и размер - фиксированы.

Сама директория да, а вот кластеры файла - нет. Так что для чтения файла придётся по FAT ходить

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


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

Если уж писать свою программу записи файла, то правильнее будет по окончании записи отмонтировать устройство ("извлечь..."), это и будет сигналом для ОС, что все кэши необходимо сбросить на физический носитель, и для устройства, что запись окончена, и можно работать с файлом.

Ещё вариант - заморочиться, и реализовать MTP протокол вместо Mass Storage, который оперирует уже не блоками, а файлами. Это, вероятно, самое правильное решение.

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


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

4 minutes ago, gerber said:

вероятно, самое правильное решение.

в итоге будет прикручен FatFS от мистера Чана ))

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


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

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

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

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

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

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

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

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

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

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