реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Mass Storage Usb Flash Disk, Файловая система flash памяти (FAT 16)
kernel32ddl
сообщение Feb 21 2006, 12:28
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 44
Регистрация: 20-02-06
Из: Penza
Пользователь №: 14 526



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 (Число головок) из каких соображений они выбираются?
Не мог бы кто-нибуть выложить свой бут сектор с комментариями, буду очень признателен?
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 21 2006, 12:59
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Не большой спец по Mass Storage, но мысль имею smile.gif
Цитата
На флэше был создан раздел FAT16, при создании раздела руководствовался документацией по этой файловой системой.
А если попробовать флешку отформатировать средствами самой Винды? Может она сама для себя более корректно ее отформатирует?
P.S. кстати из опыта работы с FDD. Винда зачем-то пытается писать в boot свою инфу.
Go to the top of the page
 
+Quote Post
kernel32ddl
сообщение Feb 21 2006, 13:13
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 44
Регистрация: 20-02-06
Из: Penza
Пользователь №: 14 526



Форматировать пробовал(после того как винда перестает флэшеку мутузить) графическая программа фрматирования не запускается вообще, а консольная выдает ошибку "ошибка функции такой-то (что-то вроде IOCTL или в этом духе)" (к сожалению точно не помню какой, нет возможности в данный момент посмотреть)
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 22 2006, 04:40
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Насколько я в курсе, флешка должна лишь уметь обрабатывать усеченный набор команд SCSI. А какая файловая система на ней будет ее волновать не должно вообще. От диска лишь поддержка LBA требуется, а не какой-то конкретный FAT.
Go to the top of the page
 
+Quote Post
kernel32ddl
сообщение Feb 22 2006, 10:19
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 44
Регистрация: 20-02-06
Из: Penza
Пользователь №: 14 526



С набором команд как раз-таки все впорядки данные передаются и принимаются без ошибок. Ответы на команды тоже коррекные, формируются согласно спецификации SCSI. Логическую адресацию устройство поддерживает, вопрос в том почему ни одна программа не хочет ее форматировать. И почему винда после чтения бут сектора кидается сразу читать 64-ый блок, а не начинает читать FAT, а затем root. Мне почему-то кажется, что я где-то допустил ошибку в параметрах биос, т.к. винда ведь не с потолка берет адрес 0x40h(64), скорее всего это адрес вычисляется согласно этим параметрам, и судя по аналогии(обмен виндой с другими флэшками) там винда пытается прочитать FAT таблицу.
А вот где я допустил ошибку ума не приложу...
Go to the top of the page
 
+Quote Post
левша
сообщение Feb 26 2006, 08:45
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 4-10-04
Из: Москва
Пользователь №: 789



Забавная задачка.
А Partition Magic может тут помочь?
Go to the top of the page
 
+Quote Post
kernel32ddl
сообщение Feb 26 2006, 10:02
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 44
Регистрация: 20-02-06
Из: Penza
Пользователь №: 14 526



Цитата(левша @ Feb 26 2006, 11:45) *
А Partition Magic может тут помочь?

К сожалению он работает с жесткими дисками и только. sad.gif
Go to the top of the page
 
+Quote Post
khach
сообщение Feb 26 2006, 10:22
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 245
Регистрация: 29-12-04
Пользователь №: 1 741



WinHex поможет- он с любыми дисками работает после лечения. И доступ к имиджу симулирует.
Go to the top of the page
 
+Quote Post
kernel32ddl
сообщение Feb 26 2006, 10:40
Сообщение #9


Участник
*

Группа: Свой
Сообщений: 44
Регистрация: 20-02-06
Из: Penza
Пользователь №: 14 526



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

Можно поподробней?
Go to the top of the page
 
+Quote Post
khach
сообщение Feb 26 2006, 10:52
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 245
Регистрация: 29-12-04
Пользователь №: 1 741



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

Сообщение отредактировал khach - Feb 26 2006, 11:00
Go to the top of the page
 
+Quote Post
kernel32ddl
сообщение Feb 26 2006, 11:02
Сообщение #11


Участник
*

Группа: Свой
Сообщений: 44
Регистрация: 20-02-06
Из: Penza
Пользователь №: 14 526



Цитата(khach @ Feb 26 2006, 13:52) *
Залил версию 12.7 с лекарством в утилиты на наш аплоад.

Простите за ламерство smile3046.gif , но это где?
Go to the top of the page
 
+Quote Post
kernel32ddl
сообщение Feb 26 2006, 13:01
Сообщение #12


Участник
*

Группа: Свой
Сообщений: 44
Регистрация: 20-02-06
Из: Penza
Пользователь №: 14 526



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 - Feb 26 2006, 13:02
Go to the top of the page
 
+Quote Post
one_man_show
сообщение Feb 26 2006, 16:26
Сообщение #13


Помогу, чем смогу
******

Группа: Админы
Сообщений: 2 778
Регистрация: 28-05-04
Из: Москва
Пользователь №: 25



Цитата(kernel32ddl @ Feb 22 2006, 13:19) *
С набором команд как раз-таки все впорядки данные передаются и принимаются без ошибок. Ответы на команды тоже коррекные, формируются согласно спецификации SCSI.

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


--------------------
С уважением,
Ваган Саруханов
Проекты|Форум|Facebook|Linkedin
Go to the top of the page
 
+Quote Post
Charley
сообщение Feb 27 2006, 09:37
Сообщение #14


Участник
*

Группа: Новичок
Сообщений: 46
Регистрация: 10-11-05
Из: Chisinau
Пользователь №: 10 697



Цитата(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

Сообщение отредактировал Charley - Feb 27 2006, 09:38
Go to the top of the page
 
+Quote Post
kernel32ddl
сообщение Feb 27 2006, 11:02
Сообщение #15


Участник
*

Группа: Свой
Сообщений: 44
Регистрация: 20-02-06
Из: Penza
Пользователь №: 14 526



Значится так:
Первым делом идем на 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 - Feb 27 2006, 11:03
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd November 2017 - 20:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01324 секунд с 7
ELECTRONIX ©2004-2016