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

USB mass storage, хочется странного

есть некий измерительный девайс у которого есть USB и с которого периодически надо взять немного данных, сейчас он прикидывается последовательным портом и управляется простыми ascii командами, которыми можно поменять пару параметров и попросить отправить данные.

и есть дурацкая идея прикинуться mass storage, чтобы пользователь мог забрать данные, тупо скопировав файл с "флэшки" в который устройство при чтении подсунет актуальные данные.

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

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


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

Просто тупо реализуемый USB MSD. После этого тупо используется. Тупо Copy/Paste.

Тупо добавить команду

SWITCH MSD

и устройство тупо переключится в MSD режим.

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


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

вопрос не про возможность "тупо" реализации MSD как такового. 

а про потенциальные грабли вида: пользователь во второй раз попытается открыть/прочитать тот же "файл" с данными, а виндовс вместо реального обращения к устройству за новыми данными подсунет ему предыдушие из кэша.

насколько понимаю у MSD устройства никакой возможности повлиять на хост нету, он ему только лишь чтение/запись блоков определённого размера предоставляет.

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

или есть какая-то возможность объяснить хосту что данные на USB флэшке могут меняться сами по себе, без участия хоста, и кэшировать их не надо? без ручного отключения кэширования в настройках ОС. и решений вроде прикинуться USB сетью и потом samba/NFS...

не знаю, может быть изобразить UDF или ещё какую-нибудь подобную дичь вместо FAT.

есть MTP, но винды в него не умеют как в файловую систему.

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


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

35 минут назад, _pv сказал:

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

Не надо ничего "химичить". Есть штатная возможность сделать Disconnect/Connect со стороны USB-устройства.

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


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

4 minutes ago, jcxz said:

Есть штатная возможность сделать Disconnect/Connect со стороны USB-устройства.

переподключиться можно, но это: не особо быстро, костыли, и винды пилиликать постоянно звуком подключения/отключения будут после каждого чтения :).

 

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


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

5 hours ago, _pv said:

есть некий измерительный девайс у которого есть USB и с которого периодически надо взять немного данных, сейчас он прикидывается последовательным портом и управляется простыми ascii командами, которыми можно поменять пару параметров и попросить отправить данные.

и есть дурацкая идея прикинуться mass storage, чтобы пользователь мог забрать данные, тупо скопировав файл с "флэшки" в который устройство при чтении подсунет актуальные данные.

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

Читайте ниже - сектора.

Сколько выпустили подобных вариантов устройств - ничего ни разу не кешировалось, даже если один сектор по кругу читать.

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


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

5 hours ago, x893 said:

Просто тупо реализуемый USB MSD

Это так не работает. Ведь для записи данных надо со стороны устройства поднять FatFS. И главное- разграничить доступ винды или внешней системы по USB MSD и внутренний доступ фирмвари по FatFS семафорами. Иначе возможны самые различные утраты данных из за одновременного доступа или неперечитки кешированных данных. И вот как раз реализации со стороны фирмвари FatFS  с семафорным взаимодействеим с USB MSD и принуждение винды перечитать данные кроме временного отключения виртуального диска, пока что то не попадалось.

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


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

15 minutes ago, _4afc_ said:

Читайте ниже - сектора.

Сколько выпустили подобных вариантов устройств - ничего ни разу не кешировалось, даже если один сектор по кругу читать.

что значит ниже?

HANDLE hDisk=CreateFile("\\\\.\\PhysicalDrive0", GENERIC_READ, FILE_SHARE_VALID_FLAGS, 0, OPEN_EXISTING, 0, 0);
SetFilePointer(hDisk,_nsect*512,0,FILE_BEGIN);
ReadFile(hDisk,_buff,512,&dwRead,0);

не очень-то юзерфрендли, оно сейчас с тем же успехом через CDC работает.

хочется получить данные с устройства именно через файловую систему, чтобы можно было просто скопировать файл без стороннего ПО/драйверов/..., открыть прямо с "как бы флэшки" в notepad :) и поглядеть в текущие данные.

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


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

6 часов назад, _pv сказал:

и есть дурацкая идея прикинуться mass storage, чтобы пользователь мог забрать данные, тупо скопировав файл с "флэшки" в который устройство при чтении подсунет актуальные данные.

Поднимите RNDIS, пусть пользователь заходит на ваше устройство своим любимым интернет-эксплорером, тыкает в ссылку "сделать мне хорошо" и получает каждый раз новый файл. Для большинства пользователей это будет даже проще, чем скопировать файл с "якобы флешки". Предполагаю, что такая реализация даже меньше памяти займет, чем MSD с FATFS.

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


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

11 minutes ago, Сергей Борщ said:

Поднимите RNDIS, пусть пользователь заходит на ваше устройство своим любимым интернет-эксплорером, тыкает в ссылку "сделать мне хорошо" и получает каждый раз новый файл. Для большинства пользователей это будет даже проще, чем скопировать файл с "якобы флешки". Предполагаю, что такая реализация даже меньше памяти займет, чем MSD с FATFS.

да, это запасной вариант, но на устройство заходить по ойпи со страшными-непонятными циферками 192.168.1.1, (а ссылку хранить в массторадже с автораном :)) ещё настройки сети вылезут, чтобы случайно в уже существующую подсеть не попасть.

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

а тут есть граждане которые захотят эти данные в каком-нибудь wavemetrics igor pro или, прости господи, origin или excel открыть и график построить, кто во что горазд, и если матлаб или математика с открытием файла по хттп ещё справятся, то вот эти вот - уже боюсь нет.

всё-таки файловая система выглядит удобнее да и памяти не жалко.

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


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

нашел вот такие костыли:

Quote

The best way to do this is with test unit ready (TUR) command response and the request sense command response. Windows will send test unit ready commands about once a second when the media is idle. When you are done editing a file, mark the following TUR response as failed (0x01), the host will then issue a Request sense command which you should respond with 'unit attention' (0x06). Then make the following test unit command response pass (0x00). This will make windows invalidate the file cache and it will refetch the memory.

как думаете, сработает?

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


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

1 hour ago, _pv said:

нашел вот такие костыли:

Интерсный костыль, но что делать если винда полезет читать а хуже того писать до того как прийдет TUR?

Вот тут у Кейла есть аппнота https://www.keil.com/pack/doc/mw/USB/html/group__usbd__msc_functions.html

по поводу переключения владельца Storage media "на ходу" но тут при неудачном обращение возвращаются ошибки и непонято как винда себя поведет при такой неготовности MSD

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


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

да у меня как бы не надо владельцев переключать, этот "файл" винда всегда только читает и он как бы "readonly", надо лишь убедиться что он действительно каждый раз читается, а не из кэша.

и ещё для флэшек в виндах нашел только настройки вроде бы кэширования записи через "быстрое" или "безопасное" извлечение флэшки.

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

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


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

31 minutes ago, _pv said:

этот "файл" винда всегда только читает и он как бы "readonly"

Так это самый плохой сценарий, когда фирмварь контроллера постояно пишет, а винда хочет читать. Мы так с файлом лога мучались, который постоянно открыт. Пришлось делать вторую виртуальную карточку для MSD , т.е на реальную фирмварь пишет, на виртуальной копии создается закрытый файл и его винде показывают на чтение винде. Конечно это решение памяти сожрало кучу, зато данные перестало терять.

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


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

26 minutes ago, khach said:

Так это самый плохой сценарий, когда фирмварь контроллера постояно пишет, а винда хочет читать. Мы так с файлом лога мучались, который постоянно открыт. Пришлось делать вторую виртуальную карточку для MSD , т.е на реальную фирмварь пишет, на виртуальной копии создается закрытый файл и его винде показывают на чтение винде. Конечно это решение памяти сожрало кучу, зато данные перестало терять.

у меня не то чтобы постоянно, и вообще без флэша, есть всего несколько кБ данных, которые по запросу надо отдать.

то есть в момент обращения по usb к первому ФАТ кластеру файла, данные можно "защёлкнуть" целиком (скопировать в "файл") и отдавать наружу.

 

а в случае с логом, кэширование не мешало при чтении, или файл постоянно "дописывался", но как тогда с кэшированием самого ФАТа и размерами файла?

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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