_pv 71 22 октября, 2020 Опубликовано 22 октября, 2020 · Жалоба есть некий измерительный девайс у которого есть USB и с которого периодически надо взять немного данных, сейчас он прикидывается последовательным портом и управляется простыми ascii командами, которыми можно поменять пару параметров и попросить отправить данные. и есть дурацкая идея прикинуться mass storage, чтобы пользователь мог забрать данные, тупо скопировав файл с "флэшки" в который устройство при чтении подсунет актуальные данные. насколько это реализуемо или победить различные кэши со стороны ОС (виндоуса в основном) на чтение по-человечески не получится и можно и не пробовать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 51 22 октября, 2020 Опубликовано 22 октября, 2020 · Жалоба Просто тупо реализуемый USB MSD. После этого тупо используется. Тупо Copy/Paste. Тупо добавить команду SWITCH MSD и устройство тупо переключится в MSD режим. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 71 22 октября, 2020 Опубликовано 22 октября, 2020 · Жалоба вопрос не про возможность "тупо" реализации MSD как такового. а про потенциальные грабли вида: пользователь во второй раз попытается открыть/прочитать тот же "файл" с данными, а виндовс вместо реального обращения к устройству за новыми данными подсунет ему предыдушие из кэша. насколько понимаю у MSD устройства никакой возможности повлиять на хост нету, он ему только лишь чтение/запись блоков определённого размера предоставляет. и даже если нахимичить с файловой системой, чтобы при очередном обращении хост полез в "другое" место за данными, чтобы заведомо не из кэша, так ведь он и файловую систему поди тоже кэширует. или есть какая-то возможность объяснить хосту что данные на USB флэшке могут меняться сами по себе, без участия хоста, и кэшировать их не надо? без ручного отключения кэширования в настройках ОС. и решений вроде прикинуться USB сетью и потом samba/NFS... не знаю, может быть изобразить UDF или ещё какую-нибудь подобную дичь вместо FAT. есть MTP, но винды в него не умеют как в файловую систему. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 22 октября, 2020 Опубликовано 22 октября, 2020 · Жалоба 35 минут назад, _pv сказал: и даже если нахимичить с файловой системой, чтобы при очередном обращении хост полез в "другое" место за данными, чтобы заведомо не из кэша, так ведь он и файловую систему поди тоже кэширует. Не надо ничего "химичить". Есть штатная возможность сделать Disconnect/Connect со стороны USB-устройства. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 71 22 октября, 2020 Опубликовано 22 октября, 2020 · Жалоба 4 minutes ago, jcxz said: Есть штатная возможность сделать Disconnect/Connect со стороны USB-устройства. переподключиться можно, но это: не особо быстро, костыли, и винды пилиликать постоянно звуком подключения/отключения будут после каждого чтения :). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 25 22 октября, 2020 Опубликовано 22 октября, 2020 · Жалоба 5 hours ago, _pv said: есть некий измерительный девайс у которого есть USB и с которого периодически надо взять немного данных, сейчас он прикидывается последовательным портом и управляется простыми ascii командами, которыми можно поменять пару параметров и попросить отправить данные. и есть дурацкая идея прикинуться mass storage, чтобы пользователь мог забрать данные, тупо скопировав файл с "флэшки" в который устройство при чтении подсунет актуальные данные. насколько это реализуемо или победить различные кэши со стороны ОС (виндоуса в основном) на чтение по-человечески не получится и можно и не пробовать? Читайте ниже - сектора. Сколько выпустили подобных вариантов устройств - ничего ни разу не кешировалось, даже если один сектор по кругу читать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khach 41 22 октября, 2020 Опубликовано 22 октября, 2020 · Жалоба 5 hours ago, x893 said: Просто тупо реализуемый USB MSD Это так не работает. Ведь для записи данных надо со стороны устройства поднять FatFS. И главное- разграничить доступ винды или внешней системы по USB MSD и внутренний доступ фирмвари по FatFS семафорами. Иначе возможны самые различные утраты данных из за одновременного доступа или неперечитки кешированных данных. И вот как раз реализации со стороны фирмвари FatFS с семафорным взаимодействеим с USB MSD и принуждение винды перечитать данные кроме временного отключения виртуального диска, пока что то не попадалось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 71 22 октября, 2020 Опубликовано 22 октября, 2020 · Жалоба 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 :) и поглядеть в текущие данные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 22 октября, 2020 Опубликовано 22 октября, 2020 · Жалоба 6 часов назад, _pv сказал: и есть дурацкая идея прикинуться mass storage, чтобы пользователь мог забрать данные, тупо скопировав файл с "флэшки" в который устройство при чтении подсунет актуальные данные. Поднимите RNDIS, пусть пользователь заходит на ваше устройство своим любимым интернет-эксплорером, тыкает в ссылку "сделать мне хорошо" и получает каждый раз новый файл. Для большинства пользователей это будет даже проще, чем скопировать файл с "якобы флешки". Предполагаю, что такая реализация даже меньше памяти займет, чем MSD с FATFS. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 71 22 октября, 2020 Опубликовано 22 октября, 2020 · Жалоба 11 minutes ago, Сергей Борщ said: Поднимите RNDIS, пусть пользователь заходит на ваше устройство своим любимым интернет-эксплорером, тыкает в ссылку "сделать мне хорошо" и получает каждый раз новый файл. Для большинства пользователей это будет даже проще, чем скопировать файл с "якобы флешки". Предполагаю, что такая реализация даже меньше памяти займет, чем MSD с FATFS. да, это запасной вариант, но на устройство заходить по ойпи со страшными-непонятными циферками 192.168.1.1, (а ссылку хранить в массторадже с автораном :)) ещё настройки сети вылезут, чтобы случайно в уже существующую подсеть не попасть. правда, морду для управления, нарисовать проще. с другой стороны никакого управления кроме как забрать данные особо и не надо. а тут есть граждане которые захотят эти данные в каком-нибудь wavemetrics igor pro или, прости господи, origin или excel открыть и график построить, кто во что горазд, и если матлаб или математика с открытием файла по хттп ещё справятся, то вот эти вот - уже боюсь нет. всё-таки файловая система выглядит удобнее да и памяти не жалко. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 71 28 октября, 2020 Опубликовано 28 октября, 2020 · Жалоба нашел вот такие костыли: 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. как думаете, сработает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khach 41 28 октября, 2020 Опубликовано 28 октября, 2020 · Жалоба 1 hour ago, _pv said: нашел вот такие костыли: Интерсный костыль, но что делать если винда полезет читать а хуже того писать до того как прийдет TUR? Вот тут у Кейла есть аппнота https://www.keil.com/pack/doc/mw/USB/html/group__usbd__msc_functions.html по поводу переключения владельца Storage media "на ходу" но тут при неудачном обращение возвращаются ошибки и непонято как винда себя поведет при такой неготовности MSD Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 71 28 октября, 2020 Опубликовано 28 октября, 2020 · Жалоба да у меня как бы не надо владельцев переключать, этот "файл" винда всегда только читает и он как бы "readonly", надо лишь убедиться что он действительно каждый раз читается, а не из кэша. и ещё для флэшек в виндах нашел только настройки вроде бы кэширования записи через "быстрое" или "безопасное" извлечение флэшки. про кэширование особенно на чтение можно где-то в виндах руками что-нибудь отключить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khach 41 28 октября, 2020 Опубликовано 28 октября, 2020 · Жалоба 31 minutes ago, _pv said: этот "файл" винда всегда только читает и он как бы "readonly" Так это самый плохой сценарий, когда фирмварь контроллера постояно пишет, а винда хочет читать. Мы так с файлом лога мучались, который постоянно открыт. Пришлось делать вторую виртуальную карточку для MSD , т.е на реальную фирмварь пишет, на виртуальной копии создается закрытый файл и его винде показывают на чтение винде. Конечно это решение памяти сожрало кучу, зато данные перестало терять. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 71 28 октября, 2020 Опубликовано 28 октября, 2020 · Жалоба 26 minutes ago, khach said: Так это самый плохой сценарий, когда фирмварь контроллера постояно пишет, а винда хочет читать. Мы так с файлом лога мучались, который постоянно открыт. Пришлось делать вторую виртуальную карточку для MSD , т.е на реальную фирмварь пишет, на виртуальной копии создается закрытый файл и его винде показывают на чтение винде. Конечно это решение памяти сожрало кучу, зато данные перестало терять. у меня не то чтобы постоянно, и вообще без флэша, есть всего несколько кБ данных, которые по запросу надо отдать. то есть в момент обращения по usb к первому ФАТ кластеру файла, данные можно "защёлкнуть" целиком (скопировать в "файл") и отдавать наружу. а в случае с логом, кэширование не мешало при чтении, или файл постоянно "дописывался", но как тогда с кэшированием самого ФАТа и размерами файла? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться