Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос про CY7C68013 EZ-USB FX2
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
Страницы: 1, 2
niktagor
Добрый день. Систуация такая. Имеется готовое устройство от буржуйских разработчиков, построенное на базе CY7C68013. К нему прилагается программа под винду, которую мне нужно полностью заменить своей самопальной программой. При этом прошивку устройства требуется оставить нетронутой. Использует она драйвер ezusb.sys. Имеется также бумажка с описанием USB команд и формата пакетов для устройства. Никогда с данным чипом дела не имел. Сейчас скачал CY3681 EZ-USB FX2 Development Kit, запустил EZ-USB Control Panel. Устройство успешно определилось. Смотрю на все это, и возникают у меня вопросы, и не могу я удержаться и не задать их вам.

1. Как мне скопировать всю информацию из чипа (программу, EEPROM и.т.д.), и что вообще нужно копировать, чтобы в процессе изучения не испортить объект изучения?

2. Я правильно понимаю, что EZ-USB Control Panel позволяет мне вручную потестировать интерфейс взаимодействия с устройством, напрямую посылая байты в оконечные точки и принимая оттуда данные?

3. uVision2 - это программа для написания прошивки? Нужно ли мне вообще в ней что-то делать, если я прошивку менять не хочу?

4. Я скачал и установил Suite USB 3.4 for Visual Studio. В самой студии ничего не изменилось. Как мне ее найти? Умеет ли она работать с драйвером ezusb.sys? Если нет, то можно ли мне использовать новый драйвер cyusb.sys, если прошивка написана под старый?

5. Как узнать, в каком режиме девайс работает - full speed или high speed?

6. Сейчас сижу под вистой. Могут ли возникнуть проблемы из-за несовместимости с ней старого драйвера?

7. (пространный) Может ли в устройстве быть защита, которая не позволит ему работать не с родной программой? (догадываюсь, что может). Может ли быть защита, которая не позволит ему работать с инструментарием от cypress? Может ли быть защита, которая что-нибудь сломает, если "узнает", что я пытаюсь написать свою софтину?

8. Какой алгоритм дальнейшей работы посоветуете? Какие программы использовать? Какие вопросы у меня еще не возникли, но могут возникнуть в ближайшее время? На какие подводные камни я могу напороться?


На некоторые из этих вопросов на форуме в том или ином виде уже есть ответы, но меня они не совсем устроили. Большое спасибо всем, кто откликнется!
niktagor
При попытках понять работу примера BulkXfer, родился вот такой код:

CODE
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>

int _tmain(int argc, _TCHAR* argv[])

{
HANDLE phDriver;

SECURITY_ATTRIBUTES security;
security.nLength = sizeof(security);
security.lpSecurityDescriptor = NULL;
security.bInheritHandle = false;

LPCWSTR completeDeviceName;
completeDeviceName = (LPCWSTR)"Ezusb-0";
phDriver = CreateFile( completeDeviceName,
GENERIC_WRITE,
FILE_SHARE_WRITE,
&security,
OPEN_EXISTING,
0,
NULL);
printf("%d\n",phDriver);
getchar();
return 0;
}



Програмка упорно выдает -1 с кодом ошибки 2(ERROR_FILE_NOT_FOUND). В чем ошибка? EZ-USB Control Panel говорит, что девайс называется Ezusb-0.

Konst_777
Цитата(niktagor @ Aug 31 2010, 14:41) *
1. Как мне скопировать всю информацию из чипа (программу, EEPROM и.т.д.), и что вообще нужно копировать, чтобы в процессе изучения не испортить объект изучения?

Читайте в теме Проблема с cy7c68013a. Скопировать нужно все содержимое EEPROM. По типу EEPROM определите ее емкость. Посмотрите, может быть Ваш модуль содержит перемычку или джампер, с помощью которых можно отключить EEPROM.

Цитата(niktagor @ Aug 31 2010, 14:41) *
2. Я правильно понимаю, что EZ-USB Control Panel позволяет мне вручную потестировать интерфейс взаимодействия с устройством, напрямую посылая байты в оконечные точки и принимая оттуда данные?

Да. EZ-USB Control Panel это бабушка Cypress USB Console (CyConsole.exe).

Цитата(niktagor @ Aug 31 2010, 14:41) *
3. uVision2 - это программа для написания прошивки? Нужно ли мне вообще в ней что-то делать, если я прошивку менять не хочу?

Нет.

Цитата(niktagor @ Aug 31 2010, 14:41) *
4. Я скачал и установил Suite USB 3.4 for Visual Studio. В самой студии ничего не изменилось. Как мне ее найти? Умеет ли она работать с драйвером ezusb.sys? Если нет, то можно ли мне использовать новый драйвер cyusb.sys, если прошивка написана под старый?

В самой студии ничего измениться и не должно. Suite USB 3.4 содержит драйвер cyusb.sys и библиотеки для общения с драйвером для Visual Studio: cyapi.lib - для C++ и cyusb.dll для C#. А также документацию и примеры. Прочитайте "ReleaseNotes.pdf".
Нет ezusb.sys это дедушка cyusb.sys.
Можно, нужно отредактировать cyusb.inf файл, добавив в него VID и PID для Вашего устройства, а затем выполнить принудительную установку драйвера cyusb.sys.

Цитата(niktagor @ Aug 31 2010, 14:41) *
5. Как узнать, в каком режиме девайс работает - full speed или high speed?

Посмотреть с помощью CyConsole.exe. Если для Bulk endpoint "Max Pkt Size" равно 512, то девайс работает в high speed, если 64, то в full speed.

Цитата(niktagor @ Aug 31 2010, 14:41) *
6. Сейчас сижу под вистой. Могут ли возникнуть проблемы из-за несовместимости с ней старого драйвера?

Могут, используйте cyusb.sys для Vista.

Цитата(niktagor @ Aug 31 2010, 14:41) *
7. (пространный) Может ли в устройстве быть защита, которая не позволит ему работать не с родной программой? (догадываюсь, что может). Может ли быть защита, которая не позволит ему работать с инструментарием от cypress? Может ли быть защита, которая что-нибудь сломает, если "узнает", что я пытаюсь написать свою софтину?

Если под программой Вы понимаете firmware для FX2LP, то не может, даже если модуль содержит внешний watchdog. Если под программой Вы понимаете программу для ПЭВМ, то это не защита, а незнание протокола обмена с firmware.

Цитата(niktagor @ Aug 31 2010, 14:41) *
8. Какой алгоритм дальнейшей работы посоветуете? Какие программы использовать? Какие вопросы у меня еще не возникли, но могут возникнуть в ближайшее время? На какие подводные камни я могу напороться?

Читать документацию, темы данного подфорума и задавать вопросы.
Современные.
Почему никто не отвечает на Ваши вопросы.
На нежелание читать документацию и злобные ответы на Ваши вопросы smile.gif

Невнимательно я прочитал Ваш топик. Увы мне.
В качестве совета: Вам будет легче выполнить поставленную задачу если Вы перейдете от ezusb.sys к cyusb.sys и от C++ к C#.
niktagor
Цитата
Можно, нужно отредактировать cyusb.inf файл, добавив в него VID и PID для Вашего устройства, а затем выполнить принудительную установку драйвера cyusb.sys.

Читая сайт сайпресс, нашел, что новый драйвер "не будет работать со старыми разработками". Я правильно Вас понял, что не меняя старую прошивку устройства, написанную под ezusb.sys, я смогу так же осуществлять с ней взаимодействие через драйвер сyusb.sys? В чем тогда несовместимость? Только со стороны софта? То есть программа от разработчика перестанет работать, а я свой софт все же смогу написать? Или вообще совместимость полная, а я запутался...

Цитата
Посмотреть с помощью CyConsole.exe. Если для Bulk endpoint "Max Pkt Size" равно 512, то девайс работает в high speed, если 64, то в full speed.

64. А проблема именно со скоростью. Может можно просто изменить режим на high speed, не меняя софта и не создавая себе проблем? Как это сделать? Такое изменение потребует изменения прошивки, софта, или и того и другого?

Цитата
Читайте в теме Проблема с cy7c68013a. Скопировать нужно все содержимое EEPROM. По типу EEPROM определите ее емкость. Посмотрите, может быть Ваш модуль содержит перемычку или джампер, с помощью которых можно отключить EEPROM.

На всякий случай, еще раз обращу внимание на то, что мне требуется именно написать софт для уже готового устройства с готовой прошивкой. Я даже открывать его не могу, т.к. на нем гарантийная пломба и.т.д. Я в самом крайнем случае могу прошить его через USB, но для этого нужно сначала быть уверенным, что я ничего не потеряю.

Konst_777, большое спасибо за развернутый ответ.
Konst_777
Цитата(niktagor @ Sep 1 2010, 13:33) *
На всякий случай, еще раз обращу внимание на то, что мне требуется именно написать софт для уже готового устройства с готовой прошивкой. Я даже открывать его не могу, т.к. на нем гарантийная пломба и.т.д. Я в самом крайнем случае могу прошить его через USB, но для этого нужно сначала быть уверенным, что я ничего не потеряю.

В таком случае, почему есть уверенность, что у Вас в этом черном ящике контроллер FX2, а не FX1 (только Full Speed)? Тогда было бы понятно почему нет High-Speed соединения. Какая документация есть у Вас на это устройство?

Цитата(niktagor @ Sep 1 2010, 13:33) *
64. А проблема именно со скоростью. Может можно просто изменить режим на high speed, не меняя софта и не создавая себе проблем? Как это сделать? Такое изменение потребует изменения прошивки, софта, или и того и другого?

На всякий случай проверьте, что Ваш компьютер поддерживает High-Speed USB: проверьте, что в менеджере устройств в ветке "Контроллеры USB" присутствует "Стандартный расширенный USB хост-контроллер". Или измерьте среднюю скорость копирования большого по объему файла с современной флэшки на диск ПЭВМ.

Цитата(niktagor @ Sep 1 2010, 13:33) *
Читая сайт сайпресс, нашел, что новый драйвер "не будет работать со старыми разработками".

Можете дать ссылку?

Цитата(niktagor @ Sep 1 2010, 13:33) *
... Я правильно Вас понял, что не меняя старую прошивку устройства, написанную под ezusb.sys, я смогу так же осуществлять с ней взаимодействие через драйвер сyusb.sys? В чем тогда несовместимость? Только со стороны софта? То есть программа от разработчика перестанет работать, а я свой софт все же смогу написать? Или вообще совместимость полная, а я запутался...

Любое устройство USB (USB device) представляет собой набор endpoints. Или говорят о pipes - каналах обмена. Так вот, сyusb.sys является универсальным драйвером USB устройств и может общаться со всеми endpoint-ми, которые поддерживает firmware устройства USB.
niktagor
Цитата
В таком случае, почему есть уверенность, что у Вас в этом черном ящике контроллер FX2, а не FX1 (только Full Speed)? Тогда было бы понятно почему нет High-Speed соединения. Какая документация есть у Вас на это устройство?


Есть хитрым путем добытый ОЕМ-мануал, в котором написано, что контроллер CY7C68013. Так же там есть описание всех USB-команд с форматами пакетов для режимов high speed и full speed.

Цитата
Проверьте, что в менеджере устройств в ветке "Контроллеры USB" присутствует "Стандартный расширенный USB хост-контроллер


Есть. Intel® ICH8 Family USB2 Enhanced Host Controller - 2836.

Цитата
Цитата

Читая сайт сайпресс, нашел, что новый драйвер "не будет работать со старыми разработками".

Можете дать ссылку?


Прошу прощения, ввел в заблуждение из-за дефекта днк своего устройства памяти. Там написано:
"Please note that the cyusb.sys driver has a different API (CYAPI) than the ezusb.sys driver that host applications will have to communicate through. Thus, host applications written for one driver will not be compatible with the other. It is recommended that new designs start with the cyusb.sys driver."
http://www.cypress.com/?rID=32538


Опишу всю историю в надежде, что это поможет. Этот девайс был заказан из заморских стран по причине того, что именно скоростные характеристики указаны очень хорошие. Но оказалось, что они не соответствуют заявленным и работает он примерно в 2 раза медленнее, а это для нас недопустимо. На все возмущенные запросы в службу технической поддержки ответ был один - раньше(при тестах) он работал быстрее, но потом у всех что-то случилось и такой скорости уже не удается добиться. А команда разработчиков софта для девайса была сторонняя. Они деньги получили и ошибки уже править отказываются. Фантастика! Сначала не верилось. Начали изучать. Оказалось, что во время работы девайса процессор загружается на 100%. Программа написана на Java. Скорее всего, перестало у всех работать из-за выхода новой версии джавы. Пытались скачать старые, но это результата не дало. Вот и появилась идея свой софт написать. А сейчас оказалось, что девайс работает в bulk mode, да еще и с full speed. Можно ли просто full заменить на high и избавиться от проблем?

Konst_777
Цитата(niktagor @ Sep 1 2010, 21:47) *
...Можно ли просто full заменить на high и избавиться от проблем?

Начинать нужно с установки драйвера cyusb.sys. А затем разбираться, какой все таки используется контроллер и что не дает ему работать в High Speed.


Цитата(niktagor @ Sep 1 2010, 21:47) *
Есть. Intel® ICH8 Family USB2 Enhanced Host Controller - 2836.

Все таки, подключите к тому же разъему USB ПЭВМ, к которому Вы подключаете Ваше устройство, современную USB-флешку и измерьте среднюю скорость копирования большого по объему файла с USB-флешки на диск ПЭВМ.
niktagor
Добрый день. Ситуация такая. Драйвер cyusb.sys настроил, работаю с ним в C++. Используя метод XferData, получаю из устройства в цикле 1000 раз по 4 Кбайта. Эта операция занимает от 2 до 5 секунд. Устройство может выдавать свои 4 Кбайта каждую миллисекунду, то есть операция должна занимать около секунды. Как узнать, где теряется скорость, и как это можно исправить? Возможно, нужно использовать более быстрые методы драйвера? Или 4МБ/с - это уже проблема для USB?
Mik174
Цитата(niktagor @ Sep 7 2010, 22:47) *
Или 4МБ/с - это уже проблема для USB?


Устройство по ссылке
http://www.saleae.com/logic/features/
гонит в ПК 24 Мб в секунду.
Сделано на CY7C68013A.
Harbinger
Оно же USBee нескольких модификаций, оно же LOGIC-U (у последнего драйвера именно от saleae) wink.gif
24 Мб в секунду там не всегда получается, зависит от многих факторов. Например, Касперский...
Кстати, непонятно, почему 24 максимум - CY7C68013 может вытянуть 48 (по даташиту 96 MBps, но это в две стороны).
Serg_Sm
Цитата(niktagor @ Sep 7 2010, 22:47) *
Добрый день. Ситуация такая. Драйвер cyusb.sys настроил, работаю с ним в C++. Используя метод XferData, получаю из устройства в цикле 1000 раз по 4 Кбайта. Эта операция занимает от 2 до 5 секунд. Устройство может выдавать свои 4 Кбайта каждую миллисекунду, то есть операция должна занимать около секунды. Как узнать, где теряется скорость, и как это можно исправить? Возможно, нужно использовать более быстрые методы драйвера? Или 4МБ/с - это уже проблема для USB?

40 МБайт в секунду вполне реально, но нужен свой драйвер. Стандартные тормознутые, хотя и на них можно организовать обмен в 10-20 МБ/с.
По поводу "1000 раз по 4 Кбайта" - цикл выполняется в User Mode со всеми вытекающими из этого проблемами. Попробуй работать с блоками большего размера 64Кб к примеру.
niktagor
Цитата(Serg_Sm @ Sep 8 2010, 12:19) *
40 МБайт в секунду вполне реально, но нужен свой драйвер. Стандартные тормознутые, хотя и на них можно организовать обмен в 10-20 МБ/с.
По поводу "1000 раз по 4 Кбайта" - цикл выполняется в User Mode со всеми вытекающими из этого проблемами. Попробуй работать с блоками большего размера 64Кб к примеру.

Протокол устройства сделан таким образом, что читать приходится именно блоками по 4к и изменить это не возможно без вмешательства в него. User Mode это относится к контроллеру в устройстве или в PC? Где об этих режимах прочитать можно?
Serg_Sm
Цитата(niktagor @ Sep 8 2010, 12:32) *
Протокол устройства сделан таким образом, что читать приходится именно блоками по 4к и изменить это не возможно без вмешательства в него. User Mode это относится к контроллеру в устройстве или в PC? Где об этих режимах прочитать можно?

Что значит "именно блоками по 4К"? 4К - это несколько транзакций для USB протокола, а где их несколько - можно попробовать увеличить. Единственная проблема, если после каждого блока нужно слать ответ-подтверждение. В таком случае нормальной скорости не добьешься никак.
Kernel & User mode
niktagor
Цитата
Что значит "именно блоками по 4К"? 4К - это несколько транзакций для USB протокола, а где их несколько - можно попробовать увеличить.

Устройство сделано так, что я отправляю туда один запрос размером 1 байт. Оно в ответ выплевывает 8 транзакций по 512 байт и одну с sync packet'ом. Потом все повторяется заново. Так вот, эта операция должна занимать не больше 1 миллисекунды. А получается какая-то ерунда. Используя USB monitor, получаю удивительные результаты. Все работает сверхбыстро, пока куда-то не пропадают 15мс(смотри скриншот). Где искать причину?
Konst_777
Цитата(niktagor @ Sep 8 2010, 12:48) *
...Все работает сверхбыстро, пока куда-то не пропадают 15мс(смотри скриншот). Где искать причину?

Происходит переключение на поток другого процесса. Это нормальная работа Windows.
Serg_Sm
Цитата(niktagor @ Sep 8 2010, 13:48) *
Устройство сделано так, что я отправляю туда один запрос размером 1 байт. Оно в ответ выплевывает 8 транзакций по 512 байт и одну с sync packet'ом. Потом все повторяется заново. Так вот, эта операция должна занимать не больше 1 миллисекунды. А получается какая-то ерунда. Используя USB monitor, получаю удивительные результаты. Все работает сверхбыстро, пока куда-то не пропадают 15мс(смотри скриншот). Где искать причину?


Значит получение 4К данных по запросу - это хреново. Чтобы достичь приличной скорости по хорошему нужно выносить всю обработку в драйвер. А так попробуй поднять приоритет процесса до реал-тайм и кидать сразу несколько запросов (точное число проверяется экспериментально) в 1 байт асинхронно приему.

PS: Про 15мс тебе уже ответили.
PS2: Какой скорости приема нужно достичь?
niktagor
Хорошо. Почему тогда этот другой процесс ВСЕГДА занимает 15мс? Приоритет процесса - реального времени. Запускается на втором ядре. Я могу как-то запустить его не в user mode, а в режиме ядра?

Цитата(Serg_Sm @ Sep 8 2010, 14:21) *
PS2: Какой скорости приема нужно достичь?


1000 таких запросов должно обрабатываться за секунду. Точнее, примерно 4МБ в секунду. Вроде, цифра детская

Ситуация странная. На каждую 1мс моих взаимодействий с прибором приходится 15мс потерянного времени. При том, что все остальные программы отключены и загрузка ЦП под 0%. Даже теоретическая максимальная скорость в этом случае всего 30Мбит в секунду.

P.S. Это если верить USB Monitor.
Serg_Sm
Цитата(niktagor @ Sep 8 2010, 14:31) *
Хорошо. Почему тогда этот другой процесс ВСЕГДА занимает 15мс? Приоритет процесса - реального времени. Запускается на втором ядре. Я могу как-то запустить его не в user mode, а в режиме ядра?
1000 таких запросов должно обрабатываться за секунду. Точнее, примерно 4МБ в секунду. Вроде, цифра детская


15 мс - так организован системный таймер виндов. Все претензии к одному богатому пенсионеру. В режиме ядра запустить виндовое приложение - хм... А вот написать службу, которая будет рулить потоком данных - это нормальный выход.
Konst_777
Цитата(Serg_Sm @ Sep 8 2010, 13:21) *
... и кидать сразу несколько запросов (точное число проверяется экспериментально) в 1 байт асинхронно приему.

Это поможет если firmware FX2LP умеет накапливать число запросов. Если нет, то есть, на каждый запрос выдается ответ в 4К, то это не поможет. А если firmware работает неправильно, то есть, по каждому запросу пытается выдать новые 512 байт не разбираясь, выданы ли предыдущие 4К, то это только усугубит ситуацию.
niktagor
Про 15 миллисекунд разобрался. Это точность системного таймера в большинстве современных компьютеров. Например Sleep(1) и Sleep(8) обе вызывают задержку на 15 миллисекунд. Так что USB Monitor с большим разрешением время посчитать не сможет. И реальные тайминги я через нее не узнаю. Вопрос: можно ли их вообще узнать, не заглядывая в USB провод приборами?
Serg_Sm
В FX2LP есть аппаратная буферизация - как минимум 2 запроса должны пройти. Как отреагирует фирмварь это другой вопрос.
Определение временных интервалов с помощью high-resolution performance counter:
Код
#define GETFIRSTTICK()    LARGE_INTEGER qwTickCountA[2];    \
                        QueryPerformanceCounter(&(qwTickCountA[0]));

#define GETSECONDTICKMESSAGE()    { QueryPerformanceCounter(&(qwTickCountA[1]));    \
                                LARGE_INTEGER qwFrequencyA;    \
                                QueryPerformanceFrequency(&qwFrequencyA);    \
                                double dbTMPA = (double)(qwTickCountA[1].QuadPart - qwTickCountA[0].QuadPart)/(double)qwFrequencyA.QuadPart; \
                                char szMessageA[80];    \
                                sprintf(szMessageA,"Операция завершена за %.9f секунд", dbTMPA);    \
                                ::MessageBox(0, szMessageA, ("Время работы"), MB_OK | MB_ICONINFORMATION);}
Konst_777
Цитата(niktagor @ Sep 8 2010, 13:31) *
Ситуация странная. На каждую 1мс моих взаимодействий с прибором приходится 15мс потерянного времени.


Цитата(niktagor @ Sep 8 2010, 15:03) *
Про 15 миллисекунд разобрался. Это точность системного таймера в большинстве современных компьютеров. Например Sleep(1) и Sleep(8) обе вызывают задержку на 15 миллисекунд. Так что USB Monitor с большим разрешением время посчитать не сможет. И реальные тайминги я через нее не узнаю. Вопрос: можно ли их вообще узнать, не заглядывая в USB провод приборами?

Если USB Monitor серьезная программа, то для измерения промежутков времени будет использовать High-Resolution Timer (класс Stopwatch в .NET Framework). Скорее всего, в программе, которую Вы используете в цикле обмена по USB вызывается Sleep(1), что приводит к засыпанию потока Вашей программы, в котором выполняется обмен по USB на 15 миллисекунд.
VladimirB
Цитата(niktagor @ Sep 8 2010, 16:03) *
Про 15 миллисекунд разобрался. Это точность системного таймера в большинстве современных компьютеров. Например Sleep(1) и Sleep(8) обе вызывают задержку на 15 миллисекунд. Так что USB Monitor с большим разрешением время посчитать не сможет. И реальные тайминги я через нее не узнаю. Вопрос: можно ли их вообще узнать, не заглядывая в USB провод приборами?

Попробуйте параллельно запустить Windows Media Player в режиме воспроизведения видео или музыки -
- он повышает точность системного таймера до 1мс.

и все измерители времени и Sleep'ы будут работать точнее в 15 раз.
Konst_777
Цитата(niktagor @ Sep 8 2010, 12:48) *
... А получается какая-то ерунда. Используя USB monitor, получаю удивительные результаты. Все работает сверхбыстро, пока куда-то не пропадают 15мс(смотри скриншот). Где искать причину?

Цитата(niktagor @ Sep 8 2010, 15:03) *
Про 15 миллисекунд разобрался. ... Так что USB Monitor с большим разрешением время посчитать не сможет. И реальные тайминги я через нее не узнаю...

Эх, не посмотрел я скриншот и начал фантазировать. Да, Вы правы. USB Monitor не использует High-Resolution Timer. И реальные тайминги Вы с помощью этой программы не узнаете.
niktagor
Прикрутил high-resolution timer. Выясняется, что между получаемыми пакетами задержка всегда ровно 250мкс. Это при том, что это все часть одной большой информации, и она выдается по одному запросу на 9 пакетов. Косяк явно не в приборе. Так как даже с родной программой и он выдает это быстрее. Использую метод XferData(). Посылка наперед нескольких запросов ситуацию не меняет. Завтра попробую использовать Begin\Wait\Finish DataXfer(). Есть смысл? В чем их принципиальное различие?
VladimirB
Цитата(niktagor @ Sep 9 2010, 21:24) *
Прикрутил high-resolution timer. Выясняется, что между получаемыми пакетами задержка всегда ровно 250мкс. Это при том, что это все часть одной большой информации, и она выдается по одному запросу на 9 пакетов. Косяк явно не в приборе. Так как даже с родной программой и он выдает это быстрее. Использую метод XferData(). Посылка наперед нескольких запросов ситуацию не меняет. Завтра попробую использовать Begin\Wait\Finish DataXfer(). Есть смысл? В чем их принципиальное различие?

первый метод синхронный, второй асинхронный.
Асинхронный метод позволяет посылать следующий запрос на чтение данных драйверу не дожидаясь исполнения предыдущего и таким образом можно организовать очередь запросов на чтение и получить скорость до 40-50МБайт/c.

Но проблема в том, то у вас нужно посылать ещё и запрос устройству для того чтобы оно выдало данные -
вот тут главные тормоза, так как Маздай от билла гейтса не является ОС реального времени и быстро переключать потоки и задачи не умеет.



-Al-
Цитата(niktagor @ Sep 8 2010, 13:48) *
Устройство сделано так, что я отправляю туда один запрос размером 1 байт. Оно в ответ выплевывает 8 транзакций по 512 байт и одну с sync packet'ом. Потом все повторяется заново. Так вот, эта операция должна занимать не больше 1 миллисекунды. А получается какая-то ерунда. Используя USB monitor, получаю удивительные результаты. Все работает сверхбыстро, пока куда-то не пропадают 15мс(смотри скриншот). Где искать причину?
Вы НИКОГДА не получите 1мс на USB при запросе туда-обратно. Время на переключение направления Вы не уменьшите. Пробуйте посылать запросы не по одному байту, а пачками, маскимум - размер входного буфера на данном EndPoint. А потом вычитывать данные. Если устройство сделано нормально, то должно работать.
Седой
Цитата(-Al- @ Sep 10 2010, 10:57) *
....Вы НИКОГДА не получите 1мс на USB при запросе туда-обратно ...


НИКОГДА не говорите НИКОГДА

PS. Обсуждалось здесь http://electronix.ru/forum/index.php?showt...=37919&st=0
niktagor
По поводу моих 250мкс по Вашей ссылке нашел интересное сообщеньице
Цитата
У шины время кадра на полной скорости 1 мС, а на высокой микрокадр - 0.125 мс. В течении этого времени в самом худшем случае ( это тот случай, если имеется простейший планировщик пакетов - один запрос в кадре) мы буим иметь задержки 2 мСек и 0.25 мСек соответственно.

В связи с этим, вопрос. Планировщик пакетов - это в cyusb.sys, или на более низком уровне?

Еще появилась идея перейти под linux и написать код для библиотеки libusb. На сайте написано, что вышла ее версия под Windows. Кто-нибудь пробовал? Есть ли смысл в моей ситуации?
-Al-
Цитата(Седой @ Sep 10 2010, 10:15) *
НИКОГДА не говорите НИКОГДА

PS. Обсуждалось здесь http://electronix.ru/forum/index.php?showt...=37919&st=0

Что Вы эти хотели сказать? Что время сколь угодно близко к 1мс, но все равно больше? И кто тут прав?? smile.gif Вот Ваше мнение.
И насколько мне известно, в USB2.0 микрофреймы не могут быть туда-обратно. Только фреймы так умеют. Потому мы в реалии и видим всегда, что в лучшем случае пара мс.
Konst_777
Цитата(niktagor @ Sep 10 2010, 11:30) *
... Планировщик пакетов - это в cyusb.sys, или на более низком уровне?

Планировщик пакетов - это на более низком уровне (в драйвере хост-контроллера).

Цитата(niktagor @ Sep 10 2010, 11:30) *
Еще появилась идея перейти под linux и написать код для библиотеки libusb. На сайте написано, что вышла ее версия под Windows. Кто-нибудь пробовал? Есть ли смысл в моей ситуации?

ИМХО. Смысла нет. Под Windows в Вашем распоряжении больше инструментальных средств. Проблема не в Windows и не в драйвере CyUsb.sys, а в использованных решениях при написании firmware, software и, очень похоже, что и в архитектуре hardware.

Для прояснения ситуации, пожалуйста, ответьте на вопросы и предоставьте информацию:
1). Известно ли Вам как построена аппаратура Вашего устройства (используемые компоненты, связи между компонентами, есть ли буферная память)?
2). Данные, которые Вы получаете от Вашего устройства через USB должны обрабатываться в реальном времени или можно накопить определенный объем данных (какой?), а затем обработать данные?
3). Сделайте то, что Вам порекомендовал -Al-:
а). создайте массив, состоящий из 10 запросов. Длина каждого запроса должна быть точно равна размеру входного буфера для Out EndPoint (64 или 512 байт).
б). асинхронно (с помощью однократного вызова функции BeginDataXfer) выдайте этот массив в Ваше устройство.
в). синхронно считайте 10 формуляров из Вашего устройства однократным вызовом функции XferData. Предварительно установите с большим запасом таймаут для этой операции.
г). завершите асинхронную выдачу BeginDataXfer функциями WaitForXfer и FinishDataXfer.
д). проверьте, что принятые формуляры (все или первые N) содержат правильные данные.
4). Выложите скриншоты CyConsole (CyConsole.exe) и Control Center (CyControl.exe) для Вашего устройства (лучше в формате png). Нужна полная информация о характеристиках эндпоинтов Вашего устройства.
Седой
Цитата(-Al- @ Sep 11 2010, 00:59) *
Что Вы эти хотели сказать? Что время сколь угодно близко к 1мс, но все равно больше?


Я говорю от том, что можно сделать так, что в пределах одного фрейма будет транзакция запроса и транзакция ответа.

niktagor
Выкладываю всю информацию об эндпоинтах и приступаю к реализации вышеуказанного алгоритма.

Код
<DEVICE>
    FriendlyName="Cypress Generic USB Device"
    Configurations="1"
    MaxPacketSize="64"
    Class="00h"
    SubClass="00h"
    Protocol="00h"
    BcdDevice="00 02"
    BcdUSB="02 00"
    <CONFIGURATION>
        Configuration="0"
        ConfigurationValue="1"
        Attributes="80h"
        Interfaces="1"
        DescriptorType="2"
        DescriptorLength="9"
        TotalLength="46"
        MaxPower="200"
        <INTERFACE>
            Interface="0"
            InterfaceNumber="0"
            AltSetting="0"
            Class="FFh"
            Subclass="00h"
            Protocol="0"
            Endpoints="4"
            DescriptorType="4"
            DescriptorLength="9"
            <ENDPOINT>
                Type="BULK"
                Direction="OUT"
                Address="01h"
                Attributes="02h"
                MaxPktSize="512"
                DescriptorType="5"
                DescriptorLength="7"
                Interval="0"
            </ENDPOINT>
            <ENDPOINT>
                Type="BULK"
                Direction="IN"
                Address="82h"
                Attributes="02h"
                MaxPktSize="512"
                DescriptorType="5"
                DescriptorLength="7"
                Interval="0"
            </ENDPOINT>
            <ENDPOINT>
                Type="BULK"
                Direction="IN"
                Address="86h"
                Attributes="02h"
                MaxPktSize="512"
                DescriptorType="5"
                DescriptorLength="7"
                Interval="0"
            </ENDPOINT>
            <ENDPOINT>
                Type="BULK"
                Direction="IN"
                Address="81h"
                Attributes="02h"
                MaxPktSize="512"
                DescriptorType="5"
                DescriptorLength="7"
                Interval="0"
            </ENDPOINT>
        </INTERFACE>
    </CONFIGURATION>
</DEVICE>


Код
Config Descriptor:
bLength:  0x9
bDescriptorType:  2
wTotalLength:  46  (0x2e)
bNumInterfaces:  1
bConfigurationValue:  1
iConfiguration:  0
bmAttributes:  0x80
MaxPower:  200
**********************************
Interface Descriptor:1
--------------------------------
bLength:  0x9
bDescriptorType:  4
bInterfaceNumber:  0
bAlternateSetting:  0
bNumEndpoints:  4
bInterfaceClass:  255
bInterfaceSubClass:  0  (0x0)
bInterfaceProtocol:  0  (0x0)
iInterface:  0  (0x0)
**********************************
EndPoint Descriptor: 1
--------------------------------
bLength:  0x7
bDescriptorType:  5
bEndpointAddress:  0x1
bmAttributes:  0x2
wMaxPacketSize:  512
bInterval:  0
**********************************
EndPoint Descriptor: 2
--------------------------------
bLength:  0x7
bDescriptorType:  5
bEndpointAddress:  0x82
bmAttributes:  0x2
wMaxPacketSize:  512
bInterval:  0
**********************************
EndPoint Descriptor: 3
--------------------------------
bLength:  0x7
bDescriptorType:  5
bEndpointAddress:  0x86
bmAttributes:  0x2
wMaxPacketSize:  512
bInterval:  0
**********************************
EndPoint Descriptor: 4
--------------------------------
bLength:  0x7
bDescriptorType:  5
bEndpointAddress:  0x81
bmAttributes:  0x2
wMaxPacketSize:  512
bInterval:  0
**********************************
Konst_777
Цитата(niktagor @ Sep 13 2010, 10:32) *
...приступаю к реализации вышеуказанного алгоритма.

Не нужно. С такой конфигурацией EP1Out ничего не получится. Лучше, ответьте на вопросы:
Цитата(Konst_777 @ Sep 10 2010, 22:23) *
...
1). Известно ли Вам как построена аппаратура Вашего устройства (используемые компоненты, связи между компонентами, есть ли буферная память)?
2). Данные, которые Вы получаете от Вашего устройства через USB должны обрабатываться в реальном времени или можно накопить определенный объем данных (какой?), а затем обработать данные?
...
niktagor
Цитата
1). Известно ли Вам как построена аппаратура Вашего устройства (используемые компоненты, связи между компонентами, есть ли буферная память)?
2). Данные, которые Вы получаете от Вашего устройства через USB должны обрабатываться в реальном времени или можно накопить определенный объем данных (какой?), а затем обработать данные?


1) Не известно.
2) К сожалению, в реальном времени. Накопить их можно только в компьютере.

Цитата
Не нужно. С такой конфигурацией EP1Out ничего не получится.


Можете пояснить, что плохо в этой конфигурации?
Konst_777
Цитата(niktagor @ Sep 13 2010, 11:52) *
...Можете пояснить, что плохо в этой конфигурации?

В FX2LP EP1OUT имеет буфер объемом 64 байта (глава 8 EZ-USB® Technical Reference Manual (EZ-USB_TRM.PDF)). Пока ему пересылаются пакеты размером не более 64 байт все будет хорошо. Что будет, если послать эндпоинту пакет длиной, большей, чем его физический буфер? Как поведет себя драйвер устройства USB и драйвер хост-контроллера? Я не пробовал делать такие вещи.


Цитата(niktagor @ Sep 13 2010, 11:52) *
...
2) К сожалению, в реальном времени. Накопить их можно только в компьютере.

Под реальным временем я понимаю необходимость успеть обработать полученные 4К данных за время поступления следующих 4К. Облегченный вариант реального времени: успеть обработать полученные N Мбайт данных за время поступления следующих N Мбайт. У Вас такая ситуация? Или Вам нужно считать в ПЭВМ какой-то объем данных, а затем можно обрабатывать его в не реальном времени?
niktagor
Цитата(Konst_777 @ Sep 13 2010, 13:50) *
... Или Вам нужно считать в ПЭВМ какой-то объем данных, а затем можно обрабатывать его в не реальном времени?


Да, обрабатывать можно не в реальном времени. Важно обеспечить максимальную скорость снятия данных с датчика. А так как внутри прибора задокументированного буфера нет, приходиться извращаться.
Konst_777
Цитата(niktagor @ Sep 13 2010, 17:28) *
Да, обрабатывать можно не в реальном времени...

Какой объем данных нужно снимать с датчика для обработки?

Вы выяснили, где хранится программа FX2LP: в EEPROM, подключенном через I2C или во внешнем ЗУ (Flash, EEPROM), подключенном к шине данных и адреса FX2LP? Если программа хранится в EEPROM, подключенном через I2C, то можно считать программу и отредактировать таблицу дескрипторов USB, чтобы обеспечить для EP1OUT: Type="INTERRUPT" и MaxPktSize="1" (поскольку Вы выдаете 1 байт). Затем можно загружать отредактированный файл *.iic прямо в ОЗУ FX2LP.
niktagor
Цитата
В FX2LP EP1OUT имеет буфер объемом 64 байта (глава 8 EZ-USB® Technical Reference Manual (EZ-USB_TRM.PDF)). Пока ему пересылаются пакеты размером не более 64 байт все будет хорошо. Что будет, если послать эндпоинту пакет длиной, большей, чем его физический буфер? Как поведет себя драйвер устройства USB и драйвер хост-контроллера? Я не пробовал делать такие вещи.

Мой запрос содержит всего один байт. Или в этот буфер идут все запросы, в том числе "CYUSB_IN"? И они каждый по 64 байта?
Не нашел, как сделать массив запросов в CyAPI Programmer's Reference. Есть другие документы по CyAPI?

Цитата
в). синхронно считайте 10 формуляров из Вашего устройства однократным вызовом функции XferData. Предварительно установите с большим запасом таймаут для этой операции.

Что-то я не понял, зачем XferData? Разве WaitForXfer() не записывает в нужный буфер принятую информацию? В примерах исползуется только BeginDataXfer-WaitForXfer-FinishDataXfer.

Реализовал такой алгоритм:

1) 9 запросов BeginDataXfer() c "CYUSB_IN"
2) запрос BeginDataXfer() c "CYUSB_OUT"
3) WaitForXfer() для "CYUSB_OUT"
4) 9 раз WaitForXfer() для "CYUSB_IN"
5) 10 раз FinishDataXfer()
Лог:
Код
0.000001 Timer test dt = 0.001 ms
0.000040 Timer test dt = 0.039 ms
0.000047 Timer test dt = 0.007 ms
0.000054 Timer test dt = 0.007 ms
0.000061 Timer test dt = 0.007 ms
0.000067 Timer test dt = 0.007 ms
0.000074 Timer test dt = 0.007 ms
0.000081 Timer test dt = 0.007 ms
0.000195 BeginDataXferIn dt = 0.114 ms
0.000230 BeginDataXferIn dt = 0.035 ms
0.000260 BeginDataXferIn dt = 0.030 ms
0.000290 BeginDataXferIn dt = 0.030 ms
0.000321 BeginDataXferIn dt = 0.031 ms
0.000351 BeginDataXferIn dt = 0.031 ms
0.000387 BeginDataXferIn dt = 0.036 ms
0.000419 BeginDataXferIn dt = 0.031 ms
0.000449 BeginDataXferInSync dt = 0.030 ms
0.000487 BeginDataXferOut dt = 0.038 ms
0.000497 WaitForXferOut dt = 0.010 ms
0.001406 WaitForXferIn dt = 0.909 ms       \\Тут прибор снимал данные с датчика
0.001444 WaitForXferIn dt = 0.038 ms
0.001464 WaitForXferIn dt = 0.020 ms
0.001562 WaitForXferIn dt = 0.098 ms
0.001682 WaitForXferIn dt = 0.121 ms
0.001818 WaitForXferIn dt = 0.136 ms
0.001931 WaitForXferIn dt = 0.112 ms
0.002061 WaitForXferIn dt = 0.130 ms
0.002193 WaitForXferInSync dt = 0.133 ms
0.002211 FinishDataXferOut dt = 0.017 ms
0.002226 FinishDataXferIn dt = 0.015 ms
0.002234 FinishDataXferIn dt = 0.009 ms
0.002243 FinishDataXferIn dt = 0.008 ms
0.002251 FinishDataXferIn dt = 0.008 ms
0.002259 FinishDataXferIn dt = 0.008 ms
0.002267 FinishDataXferIn dt = 0.008 ms
0.002276 FinishDataXferIn dt = 0.008 ms
0.002284 FinishDataXferIn dt = 0.008 ms
0.002292 FinishDataXferSync dt = 0.008 ms

За вычетом времени работы таймера, вся операция в среднем занимает (2,1+-0,1)мс. По задумке разработчиков, все 4Кб должны приниматься за оставшиеся ~100мкс после обработки сигнала датчика. Это равносильно скорости 40МБ/c. Для bulk многовато, но даже если будет 10МБ/c, для моих целей это будет очень значительное улучшение. Анализируя логи, прихожу к выводу, что WaitForXfer() выполняется один раз за микрокадр, но бывают исключительные ситуации, когда случается 2 WaitForXfer() в кадре. Как бы проконтроллировать и улучшить этот показатель?
Konst_777
Давайте, вначале Вы ответите на мои вопросы. А затем я на Ваши.
Цитата(Konst_777 @ Sep 13 2010, 19:53) *
Какой объем данных нужно снимать с датчика для обработки?

Вы выяснили, где хранится программа FX2LP...
niktagor
Konst_777, прошу прощения за невнимательность.
Цитата
Какой объем данных нужно снимать с датчика для обработки?

Объём не ограничен. То есть в описанном режиме я могу накапливать данные например сутки, а потом еще неделю их анализировать. Это не критично. Если не буду успевать записывать на диск - можно например снимать данные 5 секунд, потом прерываться на запись и продолжать дальше.

Цитата
Вы выяснили, где хранится программа FX2LP...

Пока не знаю, как это сделать. Боюсь что-нибудь испортить. Есть простой безопасный алгоритм? Какую программу нужно использовать?

В USB-командах есть:
-READ EEPROM
-PSOC READ
-READ REGISTER

Соответственно, эти комплектующие есть внутри. Еще в документе упоминается, что внутри есть FPGA. Разбирать прибор нельзя. Картина пока что не сложилась.
Konst_777
Цитата(niktagor @ Sep 14 2010, 17:43) *
...Если не буду успевать записывать на диск - можно например снимать данные 5 секунд, потом прерываться на запись и продолжать дальше.

Так и придется делать.

Цитата(niktagor @ Sep 14 2010, 17:43) *
...Еще в документе упоминается, что внутри есть FPGA.

Это хорошая новость.

Цитата(niktagor @ Sep 14 2010, 17:43) *
Пока не знаю, как это сделать. Боюсь что-нибудь испортить. Есть простой безопасный алгоритм? Какую программу нужно использовать?
...

1). Скачайте и установите SETUP_FX2LP_DVK_1004.exe (входит в состав CY3684 EZ-USB FX2LP Development Kit).
2). Изучите "\Cypress\USB\doc\General\CyConsole.pdf".
3). Скачайте и разархивируйте Save_EEPROM_demo.rar из темы Проблема с cy7c68013a. Запустите "Save_EEPROM_demo.htm" из папки "\Save_EEPROM_demo". Обратите внимание, что внизу экрана расположены кнопки управления воспроизведением (как в медиаплеере). Внимательно изучите последовательность действий. Если есть возможность, вначале лучше потренироваться на каком-либо другом модуле с FX2LP, а затем считывать firmware из Вашего устройства. Например, можно купить модуль с FX2LP на www.evodbg.com. Если считывание первых 4 Кбайт завершится успешно ("Control transfer complete: 4096 bytes read."), значит программа хранится в EEPROM.
4). После сохранения 16 Кбайт содержимого EEPROM у Вас должны быть записаны на диск 4 файла по 4 Кбайта каждый.

Итак, жду от Вас сообщения о результатах считывания firmware.
niktagor
Цитата(Konst_777 @ Sep 14 2010, 23:49) *
Итак, жду от Вас сообщения о результатах считывания firmware.


Konst_777, большое спасибо. Пробовать буду завтра или послезавтра.
Konst_777
Цитата(niktagor @ Sep 13 2010, 20:26) *
Мой запрос содержит всего один байт. Или в этот буфер идут все запросы, в том числе "CYUSB_IN"? И они каждый по 64 байта?
Не нашел, как сделать массив запросов в CyAPI Programmer's Reference. Есть другие документы по CyAPI?

Firmware Вашего устройства задает MaxPktSize="512" для "CYUSB_OUT". Если выдавать в "CYUSB_OUT" массив от 1 до 512 байт с помощью одиночного вызова функции XferData(), то устройством это будет воспринято, как один запрос. Если выдавать в "CYUSB_OUT" массив размером N*512 байт с помощью одиночного вызова XferData(), то устройством это будет воспринято, как N запросов.
XferData() объединяет в одной функции последовательность вызовов функций BeginDataXfer(), WaitForXfer(), FinishDataXfer(). XferData() является синхронной (блокирующей) функцией для выполнения пересылки данных. То есть, программа (поток) будет выполняться дальше только после завершения выполнения функции XferData().

Аналогично, с помощью одиночного вызова функции BeginDataXfer() для "CYUSB_IN" Вы можете сразу считать 4.5 Кбайта данных регистрации. То есть, Ваш алгоритм:
Цитата(niktagor @ Sep 13 2010, 20:26) *
Реализовал такой алгоритм:

1) 9 запросов BeginDataXfer() c "CYUSB_IN"
2) запрос BeginDataXfer() c "CYUSB_OUT"
3) WaitForXfer() для "CYUSB_OUT"
4) 9 раз WaitForXfer() для "CYUSB_IN"
5) 10 раз FinishDataXfer()
...

может быть переписан так:
1) BeginDataXfer() c "CYUSB_IN" на прием массива размером 4.5 Кбайт
2) BeginDataXfer() c "CYUSB_OUT"
3) WaitForXfer() и FinishDataXfer() для "CYUSB_OUT"
4) WaitForXfer() и FinishDataXfer() для "CYUSB_IN"

Для N запросов алгоритм будет выглядеть так:
1) BeginDataXfer() c "CYUSB_IN" на прием массива размером N*4.5 Кбайт
2) BeginDataXfer() c "CYUSB_OUT" на выдачу массива N*512 байт
3) WaitForXfer() и FinishDataXfer() для "CYUSB_OUT"
4) WaitForXfer() и FinishDataXfer() для "CYUSB_IN"

Преимущество такого подхода в том, что теперь пересылкой запросов и данных регистрации занимается драйвер хост-контроллера, а не Ваша программа. И есть гораздо больше шансов не потерять данные регистрации. То есть, все было бы хорошо, если бы не следующие обстоятельства:
1). эндпоинт EP1OUT имеет объем буфера в 64 байта. И отправлять ему 512 байт нельзя. А в дескрипторе эндпоинта, который считывается хост-контроллером, написано, что можно. Ну, хост-контроллер и выдаст ему... А Ваше устройство и ответит... А драйвер хост-контроллера возьмет и подвесит Windows.
2). поскольку эндпоинты "CYUSB_OUT" и "CYUSB_IN" сконфигурированы, как Bulk endpoint-ы, то все таки возможны ситуации потери данных регистрации из за того, что хост-контроллер перестал на какое-то время опрашивать Ваше устройство, поскольку активировался ну очень приоритетный процесс.

С этими неприятностями можно бороться, отредактировав таблицу дескрипторов в firmware. "CYUSB_OUT"нужно сконфигурировать, как Interrupt endpoint с интервалом опроса в 250 мкс и MaxPktSize="1". "CYUSB_IN" - пока не трогать, так как этот эндпоинт сложнее переконфигурировать.
niktagor
EEPROM скачал успешно! Всего 17КБ вышло. Глянул в hex-редакторе, вроде все по-честному. Какой посоветуете дизассемблер? К сайпрессовскому девайсу подойдет любой для 8051? Пытался открыть Keil-ом, он выдает "error 59: invalid absolute module". Сшивал 5 кусочков по 4КБ в hex-редакторе, проверял, все правильно сшито. Может нужно в конец или в начало файла что-нибудь дописать?
Konst_777
Цитата(niktagor @ Sep 19 2010, 21:50) *
...Всего 17КБ вышло...

Это перебор. Если у Вас контроллер FX2, то память программ и данных у него 8К и в третьем файле должен быть повтор содержимого первого.

Дизассемблер на этом этапе не нужен. Вам нужно изучить раздел "3.4 EEPROM Boot-load Data Formats" и особенно подраздел "3.4.3 Serial EEPROM Present, First Byte is 0xC2" из EZ-USB® Technical Reference Manual (EZ-USB_TRM.pdf). Дальше, Вам нужно будет найти в объединенном файле первое появление последовательности байтов "0x80, 0x01, 0xe6, 0x00,0x00". В этом месте (предположительно) заканчиваются данные загрузки. Проверьте, что формат файла, до места завершающей последовательности соответствует формату, описанному в подразделе "3.4.3 Serial EEPROM Present, First Byte is 0xC2".
Serg_Sm
Кипарисы с буковкой "A" имеют 16Кбайт памяти команд/данных. 8КБайтных уже не производят вроде.
niktagor
Сегодня хотел попробовать загрузить обратно данные, которые скачал из EEPROM. Но теперь уже сомневаюсь в соответствии скачанного с реальным. Хотя ведь возможно такое, что чип по мере надобности подгружает себе программу из EEPROM в память, если это реализовано программно? В дэйташите не нашел, что объем внешней EEPROM чем-то ограничен. Скорее всего, он ограничен только максимальным размером адреса в чипе. А он обычно 2^8n, то есть не 16КБ.
Serg_Sm
Цитата(niktagor @ Sep 20 2010, 12:47) *
Сегодня хотел попробовать загрузить обратно данные, которые скачал из EEPROM. Но теперь уже сомневаюсь в соответствии скачанного с реальным. Хотя ведь возможно такое, что чип по мере надобности подгружает себе программу из EEPROM в память, если это реализовано программно? В дэйташите не нашел, что объем внешней EEPROM чем-то ограничен. Скорее всего, он ограничен только максимальным размером адреса в чипе. А он обычно 2^8n, то есть не 16КБ.

И программу и данные FX2 грузит при старте одним махом. Но объем EEPROM может быть и 64Кбайта (или может быть несколько микросхем EEPROM) - устройство может хранить в верхней части (либо других) EEPROM дополнительные данные (калибровочные таблицы и т.п.). И доступ к этим данным возможен уже во время работы.
niktagor
Цитата(Konst_777 @ Sep 19 2010, 23:02) *
Дизассемблер на этом этапе не нужен. Вам нужно изучить раздел "3.4 EEPROM Boot-load Data Formats" и особенно подраздел "3.4.3 Serial EEPROM Present, First Byte is 0xC2" из EZ-USB® Technical Reference Manual (EZ-USB_TRM.pdf). Дальше, Вам нужно будет найти в объединенном файле первое появление последовательности байтов "0x80, 0x01, 0xe6, 0x00,0x00". В этом месте (предположительно) заканчиваются данные загрузки. Проверьте, что формат файла, до места завершающей последовательности соответствует формату, описанному в подразделе "3.4.3 Serial EEPROM Present, First Byte is 0xC2".


Все сходится. Файл 17КБ. В начале - 0xC2. В конце - 0x80 0x01 0xE6 0x00 0x00. Дизассемблировал программку с помощью IDA Pro (сказал ему, что это Intel 8051). Зацепился нормально, выделил процедурки. Но найти, где эндпоинты конфигурируются, пока не получилось. Сижу, пыхчу.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.