Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Mass Storage Usb Flash Disk
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
kernel32ddl
help.gif
При создании Usb flash диска (128мб) появились проблемы с его определением windows. Дела обстоят следующим образом: при подключении устройства windows загружает все необходимые драйвера, т.е. диск определяется как сменный носитель, появляется в проводнике (с этим проблем нет); а вот дальше начинаются странности. На флэше был создан раздел FAT16, при создании раздела руководствовался документацией по этой файловой системой.
Блок параметров биос выглядит так:
Смещение Название Размер Значение Описание
0 (0x0) BS_jmpBoot 3 EB 3E 90 Команда перехода на загрузчик ОС
3 (0x3) BS_OEMName 8 2B 58 64 68 39 49 48 43 (Xdh9IHC) Название и версия Windows
11 (0xB) BPB_BytsPerSec 2 00 02(512) Количество байтов в секторе (всегда 512)
13 (0xD) BPB_SecPerClus 1 04(4) Секторов на кластер всегда кратно степени двух
14 (0xE) BPB_RsvdSecCnt 2 01 00(1) Количество зарезервированных секторов перед первой FAT
16 (0x10) BPB_NumFATs 1 02(2) Количество таблиц FAT (всегда 2)
17 (0x11) BPB_RootEntCnt 2 B0 02(688) Количество элементов в корневом каталоге (максимальный предел)
19 (0x13) BPB_TotSec16 2 00 00 Общее число секторов (0 - если размер диска больше 32 Мб)
21 (0x15) BPB_Media 1 F8 Тип устройства: F0 - гибкий диск, F8 - жесткий диск с любой емкостью (Media дескриптор носителя)
22 (0x16) BPB_FATsz16 2 FA 00(250) Количество секторов на элемент таблицы FAT (число секторов в одной FAT)
24 (0x18) BPB_SecPerTrk 2 20 00(32) Количество секторов на дорожку
26 (0x1A) BPB_NumHeads 2 FF 00(255) Число головок
28 (0x1C) BPB_HiddSec 4 00 00 00 00 Количество скрытых секторов
32 (0x20) BPB_TotSec32 4 FF E4 03 00(255231) Общее число секторов (0 - если размер диска меньше 32 Мб)
36 (0x24) BS_DrvNum 1 80(128) Номер диска
37 (0x25) BS_NtRsvd 1 01 Зарезервировано для Windows NT
38 (0x26) BS_BootSig 1 29 Расширенная сигнатура (если 29h, то следующие поля актуальны)
39 (0x27) BS_VolID 4 68 42 6C 30(hBl0)Серийный номер тома
43 (0x2B) BS_VolLab 11 4E 4F 20 4E 41 4D 45 20 20 20 20(NO NAME ) Метка тома
54 (0x36) BS_FilSysSize 8 46 41 54 31 36 20 20 20(FAT16 ) Тип файловой системы (12- или 16-разрядная)

В готовой флэши (смотрел несколько флэш Trancend) процесс чтения происходит так: сначала читается загрузочная область (винда почему-то это делает несколько раз), затем начинается чтение fat по порядку, а затем читается root и т.д. и т.п, т.е все достаточно логично.
У меня происходит все довольно странно после чтения boot сектора винда читает сектор со смещением 0x40h(64) и переодисечки повторяет чтение то boot сектора, то этого сектора
При попытке зайти на диск проводник виснет при это не выводится ни каких сообщений.
Пробовал отфармотировать флэшку при помощи HP USB Disk Storage Format Tool, но она пишет, что диск защищен от записи.
Очень хотелось бы узнать как те кто этим занимался решили проблему файловой системы диска, либо как я писали ее сами, либо брали уже готовую, скажем с носителя такой же емкости?
Возможно проблема в блоке параметров биос (параметры брал согласно мануалам)?
Ни где не встретил описание параметров BPB_SecPerTrk (Количество секторов на дорожку) и BPB_NumHeads (Число головок) из каких соображений они выбираются?
Не мог бы кто-нибуть выложить свой бут сектор с комментариями, буду очень признателен?
rezident
Не большой спец по Mass Storage, но мысль имею smile.gif
Цитата
На флэше был создан раздел FAT16, при создании раздела руководствовался документацией по этой файловой системой.
А если попробовать флешку отформатировать средствами самой Винды? Может она сама для себя более корректно ее отформатирует?
P.S. кстати из опыта работы с FDD. Винда зачем-то пытается писать в boot свою инфу.
kernel32ddl
Форматировать пробовал(после того как винда перестает флэшеку мутузить) графическая программа фрматирования не запускается вообще, а консольная выдает ошибку "ошибка функции такой-то (что-то вроде IOCTL или в этом духе)" (к сожалению точно не помню какой, нет возможности в данный момент посмотреть)
rezident
Насколько я в курсе, флешка должна лишь уметь обрабатывать усеченный набор команд SCSI. А какая файловая система на ней будет ее волновать не должно вообще. От диска лишь поддержка LBA требуется, а не какой-то конкретный FAT.
kernel32ddl
С набором команд как раз-таки все впорядки данные передаются и принимаются без ошибок. Ответы на команды тоже коррекные, формируются согласно спецификации SCSI. Логическую адресацию устройство поддерживает, вопрос в том почему ни одна программа не хочет ее форматировать. И почему винда после чтения бут сектора кидается сразу читать 64-ый блок, а не начинает читать FAT, а затем root. Мне почему-то кажется, что я где-то допустил ошибку в параметрах биос, т.к. винда ведь не с потолка берет адрес 0x40h(64), скорее всего это адрес вычисляется согласно этим параметрам, и судя по аналогии(обмен виндой с другими флэшками) там винда пытается прочитать FAT таблицу.
А вот где я допустил ошибку ума не приложу...
левша
Забавная задачка.
А Partition Magic может тут помочь?
kernel32ddl
Цитата(левша @ Feb 26 2006, 11:45) *
А Partition Magic может тут помочь?

К сожалению он работает с жесткими дисками и только. sad.gif
khach
WinHex поможет- он с любыми дисками работает после лечения. И доступ к имиджу симулирует.
kernel32ddl
Цитата(khach @ Feb 26 2006, 13:22) *
WinHex поможет- он с любыми дисками работает после лечения. И доступ к имиджу симулирует.

Можно поподробней?
khach
Есть такая прога- WinHex, от X-Ways software. Навороченный hex редаетор под Винду. Умеет работать с имиджами дисков, клонировать диски итд. Залил версию 12.7 с лекарством в утилиты на наш аплоад. А так- спаршивать в р2р сетях. Подробности- http://www.x-ways.net/ После применения professional лицензии обкспечивает доступ и редактирование физических дисков, в том числе USB. Позволяет прочитать NTFS раздел под Win98 и скопировать файлы, работает с поврежденными разделами итд.
kernel32ddl
Цитата(khach @ Feb 26 2006, 13:52) *
Залил версию 12.7 с лекарством в утилиты на наш аплоад.

Простите за ламерство smile3046.gif , но это где?
kernel32ddl
64-ый сектор - это оказывается первый сеткор второй дорожки. Узнал я это при помощи программки flashnul. Она выдала следующее:

Disk g: (UNC name: \\.\g:)
-------------------------------------------------------
DeviceIoCtrl & IOCTL_DISK_GET_DRIVE_GEOMETRY reports:
Cylinders = 16
Tracks per cylinder = 255
Sectors per track = 63
Bytes per sector = 512
calculated disk size = 131604480 (125Mb)
delta to near pow of two= 2613248 (2Mb)
-------------------------------------------------------
GetDiskFreeSpaceEx() reports:
function failed
-------------------------------------------------------
Reading 0x0 (0b) error: Превышен таймаут семафора.


Как я понимаю параметр Sectors per track это тот же BPB_SecPerTrk в блоке параметров биос загрузочной области. Откуда же интересно винда берет это значение, ведь этот параметр равен у меня 32?
И вообще не понятна сама логика чтения, почему винда не читает все подряд, а после чтения бут сектра читает следующую дорожку?
Хотелось бы услышать мнения по поводу того, как винда высчитывает из параметров бут сектора значения смещений скажем на ФАТ таблицу, рут и пр.
one_man_show
Цитата(kernel32ddl @ Feb 22 2006, 13:19) *
С набором команд как раз-таки все впорядки данные передаются и принимаются без ошибок. Ответы на команды тоже коррекные, формируются согласно спецификации SCSI.

Если не затруднит, киньте инфо или ссылку на список SCSI команд, достаточных для реализации USB FLSH Disk
Charley
Цитата(one_man_show @ Feb 26 2006, 21:26) *
Цитата(kernel32ddl @ Feb 22 2006, 13:19) *

С набором команд как раз-таки все впорядки данные передаются и принимаются без ошибок. Ответы на команды тоже коррекные, формируются согласно спецификации SCSI.

Если не затруднит, киньте инфо или ссылку на список SCSI команд, достаточных для реализации USB FLSH Disk


Добрый день!

Если не затруднит, и мне, пожалуйста! А то задача уж больно похожая, а информации по общению PC c MCU практически нет!

MailTo: MCU_Hunter@inbox.ru
С Уважением,
Charley
kernel32ddl
Значится так:
Первым делом идем на usb.org USB Device Сlass Specification. В секции Mass Storage качаем
Mass Storage Overview 1.2
Mass Storage Bulk Only 1.0
Mass Storage Control/Bulk/Interrupt (CBI) Specification 1.1
Mass Storage UFI Command Specification 1.0
Mass Storage Bootability Specification 1.0

В принципе это самое важное из всей документации на эту тему, в Mass Storage UFI Command Specification 1.0 можно найти примерный набор команд. Подчеркиваю! примерный. Все дело в том, что к сожалению до сих пор нет никакого стандарта на обмен между флэшиной и компом. 98% этих команд, беруться из SCSI Primary Commands -2 (SPC-2). За этой спецификацией идем на t10.org, в частности в раздел Architecture. Эта спецификация очень большая (по количеству страниц), в ней пригодиться только малая часть, для более подробного изучения команд, описанных в Mass Storage UFI Command Specification 1.0 . С сайта t10.org обязательно скачиваем RBC Reduced Block Commands. Лично я писал свои команды именно по этой спецификации. НО! ни в коем случае не описывайте в дескрипторах свое устройство как RBC. В винде нет поддержки RBC! Ваше усройство просто-напросто не будет определяться как сменный накопитель. Нас эта спецификация интересут только в плане команд.
Строго говоря все-таки существут примерно-стандартный набор команд которые должно поддерживать устройство. Вот их список:
0x00 - TEST UNIT READY
0x03 - REQUEST SENSE
0x04 - FORMAT UNIT
0x12 - INQUIRY
0x15 - MODE SELECT
0x16 - RESERVE
0x17 - RELEASE
0x1A - MODE SENSE(6)
0x1B - START STOP UNIT
0x1E - MEDIUM REMOVAL
0x23 - READ FORMAT CAPACITY
0x25 - READ CAPACITY
0x28 - READ
0x2A - WRITE
0x2F - VERIFY
0x35 - SYNCH CACHE
0x3B - WRITE BUFFER
0x5A - MODE SENSE(10)

Этот список довольно исбыточен, т.к. при использовании одних команд другие команды становятся не нужными. Подробнее об этом написано в RBC Reduced Block Commands, правда не знаю с какой достоверностью можно использовать эту спецификаю (если б у меня совем не было проблем я бы говорил более уверенно smile.gif ), поэтому не советую уж больно сильно увлекаться ей. Почему - было сказано выше.
И естественно советую внимательно изучить спецификацию по USB (особенно главу про Protocol Layer), благо в инете встречаютя описания на русском.
kernel32ddl
По ходу дела возник такой вопрос: какую файловую систему лучше использовать для флэшены? Гворят что ФАТ32 не очень хороша для нее...
one_man_show
Уважаемый kernel32ddl!
Большое спасибо за подробный ответ, по-больше бы таких постов smile.gif

Пользуетесь ли Вы каким-нибудь тулкитом или все приходится делать руками? Слышал и частично видел USBIO, что нашлось даже в наших сусеках, но к сожалению не нашел там раздела Firmware, только Drivers.

Интересно мнение спецов на счет этой тулсы, знающих толк в этом деле, уже реализовавших на своих машинках Mass Storage USB Disk

И еще чайниковский вопрос.
У меня машинка на х86, на борту CompactFlash, USB организован через последовательный порт машинки на FTDI FT232BM. Сейчас пользуюсь на РС виртуальным СОМ-портом, в машинке реализован FAT16 и протокол файлового обмена. Чтобы это чудо обслужить на РС, пришлось делать свою прогу под тот реализованный протокол. Хочется услышать от знатоков следующее. Если использовать USB Firmware Library от Thesycon (или его подобие), то какие грабли или непреодолимые препятствия ожидают.
kernel32ddl
one_man_show, спасибо за столь лесную похвалу smile.gif .

Что такое USBIO к сожалению понятия не имею sad.gif , лично я делаю своё детище на TMS5509a, в Code Composer Studio от Texas Instrument. Очень помог пример реализации USB устройства на сайте c5000.spectrumdigital.com. Практически 70% всего кода, необходимого для реалиции устройства уже есть в этом примере, оставалось только надстроить его до необходимого класса (добавить нужные команды и т.п.). Вообще разработчики TI сделали хорошую абстракцию от аппаратной части (CSL библиотека USB), никаких портов программировать не надо, берешь функцию, указаваешь ей буфер с данными, номер конечной точки и вперед - данные передаются! Все очень просто.
Для снятия протоколов обмена пользуюсь USB Monitor и SnoopyPro.
На последний ваш вопрос, ответить не могу - ничего в этом не смыслю smile3046.gif.
kernel32ddl
Забыл добавить еще одну важную ссылку, при описании документации www.rs232.ru. Там есть спецификация на USB по русски.
v_mirgorodsky
Не знаю как для флешей, но для обычных жестких дисков самый первый сектор на диске - MBR. В нем содержится таблица разделов диска. Далее в начале каждого раздела находится BOOT. Так как MBR в вашем случае имеет неправильную структуру, поскольку он BOOT по формату, то винда и не хочет с ним корректно работать и пытается найти MBR на следующей дорожке. Для проверки данного утверждения необходимо все снести с флешки (забить ее нулями) и попытаться выполнить все операции по разметке средствами самой винды. Если запись/чтение реализованы корректно, то проблем быть не должно.
kernel32ddl
На флэшках, структуру которых мне удалось посмотреть MBR и таблицы нет. Идет сразу раздел со своей загрузочной областью. Объясняется это наверно тем, что в ней просто нет неоходимости - раздел-то на флэшке только один.
Наконец-то удалось раздобыть флэшину на 128 мб cheers.gif , обнаружил много несоответствий. Как только исправлю все, сообщу о результатах.
kernel32ddl
Итак... Первым делом пришлось фарматировать флэш средствами винды под ФАТ16. Винда создала там таблицу разделов, мбр и собственно сам раздел. Но тут меня ожидал БАЛЬШОООЙ облом. После полного копирования всего вышеописанного на флэшь.... НИЧЕГО НЕ ИЗМЕНИЛОСЬ!!! Как не работало, так и не стало работать. И тут я обратил внимание на одну проблему, значение которой я поначалу не придал. Ответ винде от моего устройства приходол только тогда, когда винда повторно отправляла команду! А все из-за того, что после передачи ей данных я не отправлят пустые пакеты (SEND_ACK и GET_ACK). Но на этом проблемы не закончились... Некоторые ответы на команды иногда все равно отправлялись только со второго раза. И возникла некая несогласованность.
Объясняю(пример):
Приходит команда(25), в ответ на команду должны передаться данные (data25), затем ответ на команду. Данные сразу не передаются и команда принимается еще раз и данные со второго раза передаются. Затем приходит другая команда и data25 опять передаются.
Вобщем бардак.
ЗНАЮЩИЕ ЛЮДИ БОЛЬШАЯ ПРОСЬБА! ОБЪЯНИТЕ МНЕ ДУРАКУ В КАКИХ СЛУЧАЯХ НАДО ОТПРЯВЛЯТЬ SEND_AKC и GET_ACK?
jhoo
Что такое пустые пакеты SEND_ACK и GET_ACK? Просто usb пакеты нулевой длины (ZLP)?
Какая стоит win? Для первых экспериментов лучше отключить кеширование. Правильно ли контролируешь отработку этапов CBW-DATAIN-CSW? Даже если предположить что размер данных совпадает с размером bulkin, то это не согласуется с командой RBC_READ_CAPACITY_10=0x25, для которой формат данных READ_CAPACITY_DATA равен 8 байт, а размер CSW 13 байт.

Лучше отлаживать все команды по отдельности, например через usbio.
Я делал так: подключал обычную usb флешку и с помощью сниффера записывал все команды, котрые использует винда. А уж потом из программы usbio отправлял бинарные файлы с командами и данными.
Тогда сразу видно будет кто виноват.
kernel32ddl
Цитата(jhoo @ Mar 7 2006, 09:10) *
Лучше отлаживать все команды по отдельности, например через usbio.

уважаемый jhoo не подскажите что это за программа и где ее можно взять?
jhoo
Может быть поздно. Но, http://www.thesycon.de/
kernel32ddl
Спасибо
afe
Цитата(kernel32ddl @ Mar 1 2006, 13:22) *
На флэшках, структуру которых мне удалось посмотреть MBR и таблицы нет. Идет сразу раздел со своей загрузочной областью. Объясняется это наверно тем, что в ней просто нет неоходимости - раздел-то на флэшке только один.
Наконец-то удалось раздобыть флэшину на 128 мб cheers.gif , обнаружил много несоответствий. Как только исправлю все, сообщу о результатах.


Voobsheto nikto ne zapreshaet sdelat' neskol'ko razdelov, po krayney mere na CF ya delal bez problem.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2016 Invision Power Services, Inc.