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

    

Mass Storage Usb Flash Disk

:help:

При создании 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 (Число головок) из каких соображений они выбираются?

Не мог бы кто-нибуть выложить свой бут сектор с комментариями, буду очень признателен?

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


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

Не большой спец по Mass Storage, но мысль имею :)

На флэше был создан раздел FAT16, при создании раздела руководствовался документацией по этой файловой системой.
А если попробовать флешку отформатировать средствами самой Винды? Может она сама для себя более корректно ее отформатирует?

P.S. кстати из опыта работы с FDD. Винда зачем-то пытается писать в boot свою инфу.

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


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

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

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


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

Насколько я в курсе, флешка должна лишь уметь обрабатывать усеченный набор команд SCSI. А какая файловая система на ней будет ее волновать не должно вообще. От диска лишь поддержка LBA требуется, а не какой-то конкретный FAT.

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


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

С набором команд как раз-таки все впорядки данные передаются и принимаются без ошибок. Ответы на команды тоже коррекные, формируются согласно спецификации SCSI. Логическую адресацию устройство поддерживает, вопрос в том почему ни одна программа не хочет ее форматировать. И почему винда после чтения бут сектора кидается сразу читать 64-ый блок, а не начинает читать FAT, а затем root. Мне почему-то кажется, что я где-то допустил ошибку в параметрах биос, т.к. винда ведь не с потолка берет адрес 0x40h(64), скорее всего это адрес вычисляется согласно этим параметрам, и судя по аналогии(обмен виндой с другими флэшками) там винда пытается прочитать FAT таблицу.

А вот где я допустил ошибку ума не приложу...

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


Ссылка на сообщение
Поделиться на другие сайты
А Partition Magic может тут помочь?

К сожалению он работает с жесткими дисками и только. :(

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


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

WinHex поможет- он с любыми дисками работает после лечения. И доступ к имиджу симулирует.

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


Ссылка на сообщение
Поделиться на другие сайты
WinHex поможет- он с любыми дисками работает после лечения. И доступ к имиджу симулирует.

Можно поподробней?

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


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

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

Изменено пользователем khach

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


Ссылка на сообщение
Поделиться на другие сайты
Залил версию 12.7 с лекарством в утилиты на наш аплоад.

Простите за ламерство :smile3046: , но это где?

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


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

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?

И вообще не понятна сама логика чтения, почему винда не читает все подряд, а после чтения бут сектра читает следующую дорожку?

Хотелось бы услышать мнения по поводу того, как винда высчитывает из параметров бут сектора значения смещений скажем на ФАТ таблицу, рут и пр.

Изменено пользователем kernel32ddl

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


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

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

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


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

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

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

 

Добрый день!

 

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

 

MailTo: MCU_Hunter@inbox.ru

С Уважением,

Charley

Изменено пользователем Charley

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


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

Значится так:

Первым делом идем на 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, правда не знаю с какой достоверностью можно использовать эту спецификаю (если б у меня совем не было проблем я бы говорил более уверенно :) ), поэтому не советую уж больно сильно увлекаться ей. Почему - было сказано выше.

И естественно советую внимательно изучить спецификацию по USB (особенно главу про Protocol Layer), благо в инете встречаютя описания на русском.

Изменено пользователем kernel32ddl

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация