Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Както задать ограничение на количество блоков в SCSI командах READ10/WRITE10?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Neumeyka
Здравствуйте!
Есть устройтсво на контроллере LPC 4357, которое выполняет функции microSD карт ридера.

Тоесть вставляем microSD карту в устройство, затем подключаем его через USB к компьютеру.
И в компе появляется Removable Disk (USB High Speed).

Проблема в следующем, при общении с устройством через SCSI команды, ОС Windows иногда присылает комаду READ10/WRITE10 с количеством блоков более 20,
но мое устройство может оперировать буфером максимум в 20 блоков (не хватает памяти в контроллере, 1 блок = 512 байт).

Вопрос:
Както можно задать ограничение на количество блоков в SCSI командах READ10/WRITE10?

Может в конфигурационных USB дескрипторах есть поле где указано максимальное колическто Bulk или байт в одной транзакции), либо при ответах на SCSI комадны IQUERY, CAPACITY, MODE_SENCE, есть поле где это ограничение можно задать..... но чет я там ниче такого не увидел sad.gif

Спасибо!!!
prottoss
Цитата(Neumeyka @ Aug 23 2014, 01:21) *
Проблема в следующем, при общении с устройством через SCSI команды, ОС Windows иногда присылает комаду READ10/WRITE10 с количеством блоков более 20,
но мое устройство может оперировать буфером максимум в 20 блоков (не хватает памяти в контроллере, 1 блок = 512 байт).
Как только буфер заполнился, отправляйте его по USB. После отправки буфера, снова заполняйте его данными из носителя и так пока не прочтете все, что требует хост. После отправляете статус. Простой и надежный алгоритм. Я на МК с 4К оперативки такое проделывал. Все работало.

Алгоритм можно ускорить. Сделать два (три, четыре, пять...) буфера. Пока один отправляется по USB, другой заполняется данными носителя.
Golikov A.
вот что говорит стандарт:
что за один микрофрайм может быть не более 14 успешных балк трансферов.

с другой стороны балк не является синхронным протоколом обмена, и вы имеете права выдавать блоки как можете. Поэтому чтобы разогнаться на максимум вам больше 14 блоков не надо, тогда их можно обновлять раз в микрофрайм, а реально проц гораздо быстрее USB, так что можно обойтись гораздо меньшим числом блоков, заполняя как предложили их по очереди
Neumeyka
Цитата(prottoss @ Aug 23 2014, 07:05) *
Как только буфер заполнился, отправляйте его по USB. После отправки буфера, снова заполняйте его данными из носителя и так пока не прочтете все, что требует хост. После отправляете статус. Простой и надежный алгоритм. Я на МК с 4К оперативки такое проделывал. Все работало.

Алгоритм можно ускорить. Сделать два (три, четыре, пять...) буфера. Пока один отправляется по USB, другой заполняется данными носителя.

А если от хоста будет команда WRITE10 с большим количеством блоков. Возможно я не буду успевать скидывать буфер на SD.

Спасибо.
prottoss
Цитата(Neumeyka @ Aug 23 2014, 14:42) *
Возможно я не буду успевать скидывать буфер на SD.
Будете. У всех ОС достаточно большой таймаут на ожидание - порядка нескольких секунд.
Golikov A.
а разве нельзя отвечать что вы заняты на балк посылки? это же не изохрон...
prottoss
Цитата(Golikov A. @ Aug 24 2014, 00:29) *
а разве нельзя отвечать что вы заняты на балк посылки? это же не изохрон...
Конечно можно и даже нужно. Но это для драйвера USB на хосте, а у файловой ОС полюбому таймауты.
controller_m30
Такое мнение.

Есть проект картридера на MSP430. Правда скорость FullSpeed. Буфер EndPoint_1 - всего 64 байта.
Когда Хост запрашивает блок данных SCSI_READ10 в количестве 8 блоков (больше почему-то не запрашивал за раз), то контроллер считывает с карты только один сектор (512 байт) и кусочками по 64 байта "скармливает" в EP1. Когда один сектор "скормлен" - скачивает с карты следующий сектор, и потихоньку отправляет. Никаких параллельных процессов с применением DMA не использовалось (хотя DMA есть) - всё последовательно. И Хост ждёт порций по 64 байта и по 512 байт без проблем.
Т.е. картридер даже при таких мизерных ресурсах работает. Вопрос только в скорости обмена - песенка 3 Мб вычитывалась с карты памяти секунд 30 biggrin.gif Но запускалась на проигрывание в плеере нормально.

Поэтому, если запрашиваемый блок больше имеющегося буфера - нужно лишь добавить в программу две переменные, в одной из которых будет храниться количество не поместившихся в буфер блоков, а в другой адрес первого несчитанного блока. Считывать их порциями кратными размеру буфера, и менять эти две переменные пока все запрошенные Хостом блоки не будут отправлены.
prottoss
Цитата(controller_m30 @ Aug 24 2014, 13:54) *
Такое мнение.
+1. Вполне имеющий право на жизнь алгоритм. Тоже такое делал.
meloden2
Dimension
75.2(L)*31.7(W)*16.4(H)mm

Weight
22g

Operation Mode Switch
●USB mode
●Wi-Fi mode

System Power Source
USB mode:
●Powered USB port
Self-Power mode:
●Internal Li-Polymer Battery

Storage Capacity
Up to 32GB MicroSD memory card

Support Device Connections
Up to 10 device connections, or stream videos 5 devices
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.