Jump to content

    
_pv

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

Recommended Posts

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

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

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

Share this post


Link to post
Share on other sites

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

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

SWITCH MSD

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
35 минут назад, _pv сказал:

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

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

Share this post


Link to post
Share on other sites
4 minutes ago, jcxz said:

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

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

 

Share this post


Link to post
Share on other sites
5 hours ago, _pv said:

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

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

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

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

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

Share this post


Link to post
Share on other sites
5 hours ago, x893 said:

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

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

Share this post


Link to post
Share on other sites
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 :) и поглядеть в текущие данные.

Share this post


Link to post
Share on other sites
6 часов назад, _pv сказал:

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

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

Share this post


Link to post
Share on other sites
11 minutes ago, Сергей Борщ said:

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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.

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

Share this post


Link to post
Share on other sites
1 hour ago, _pv said:

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites
31 minutes ago, _pv said:

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

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

Share this post


Link to post
Share on other sites
26 minutes ago, khach said:

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

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

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

 

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.