|
|
  |
Вопрос про CY7C68013 EZ-USB FX2, Есть готовое устройство, нужно подключиться, не поломав. |
|
|
|
Aug 31 2010, 11:41
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601

|
Добрый день. Систуация такая. Имеется готовое устройство от буржуйских разработчиков, построенное на базе 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 - Aug 31 2010, 11:44
|
|
|
|
|
Aug 31 2010, 17:30
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601

|
При попытках понять работу примера 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.
|
|
|
|
|
Aug 31 2010, 18:11
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(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. Какой алгоритм дальнейшей работы посоветуете? Какие программы использовать? Какие вопросы у меня еще не возникли, но могут возникнуть в ближайшее время? На какие подводные камни я могу напороться? Читать документацию, темы данного подфорума и задавать вопросы. Современные. Почему никто не отвечает на Ваши вопросы. На нежелание читать документацию и злобные ответы на Ваши вопросы Невнимательно я прочитал Ваш топик. Увы мне. В качестве совета: Вам будет легче выполнить поставленную задачу если Вы перейдете от ezusb.sys к cyusb.sys и от C++ к C#.
Сообщение отредактировал Konst_777 - Aug 31 2010, 18:40
|
|
|
|
|
Sep 1 2010, 10:33
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601

|
Цитата Можно, нужно отредактировать 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, большое спасибо за развернутый ответ.
|
|
|
|
|
Sep 1 2010, 17:22
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(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.
|
|
|
|
|
Sep 1 2010, 18:47
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601

|
Цитата В таком случае, почему есть уверенность, что у Вас в этом черном ящике контроллер 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 и избавиться от проблем?
|
|
|
|
|
Sep 1 2010, 18:58
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(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-флешки на диск ПЭВМ.
Сообщение отредактировал Konst_777 - Sep 2 2010, 03:55
|
|
|
|
|
Sep 7 2010, 18:47
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601

|
Добрый день. Ситуация такая. Драйвер cyusb.sys настроил, работаю с ним в C++. Используя метод XferData, получаю из устройства в цикле 1000 раз по 4 Кбайта. Эта операция занимает от 2 до 5 секунд. Устройство может выдавать свои 4 Кбайта каждую миллисекунду, то есть операция должна занимать около секунды. Как узнать, где теряется скорость, и как это можно исправить? Возможно, нужно использовать более быстрые методы драйвера? Или 4МБ/с - это уже проблема для USB?
|
|
|
|
|
Sep 7 2010, 19:39
|
Местный
  
Группа: Свой
Сообщений: 357
Регистрация: 6-01-07
Пользователь №: 24 139

|
Цитата(niktagor @ Sep 7 2010, 22:47)  Или 4МБ/с - это уже проблема для USB? Устройство по ссылке http://www.saleae.com/logic/features/гонит в ПК 24 Мб в секунду. Сделано на CY7C68013A.
|
|
|
|
|
Sep 8 2010, 08:19
|
Частый гость
 
Группа: Свой
Сообщений: 183
Регистрация: 10-10-06
Из: Смоленск
Пользователь №: 21 167

|
Цитата(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Кб к примеру.
|
|
|
|
|
Sep 8 2010, 08:32
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601

|
Цитата(Serg_Sm @ Sep 8 2010, 12:19)  40 МБайт в секунду вполне реально, но нужен свой драйвер. Стандартные тормознутые, хотя и на них можно организовать обмен в 10-20 МБ/с. По поводу "1000 раз по 4 Кбайта" - цикл выполняется в User Mode со всеми вытекающими из этого проблемами. Попробуй работать с блоками большего размера 64Кб к примеру. Протокол устройства сделан таким образом, что читать приходится именно блоками по 4к и изменить это не возможно без вмешательства в него. User Mode это относится к контроллеру в устройстве или в PC? Где об этих режимах прочитать можно?
|
|
|
|
|
Sep 8 2010, 09:27
|
Частый гость
 
Группа: Свой
Сообщений: 183
Регистрация: 10-10-06
Из: Смоленск
Пользователь №: 21 167

|
Цитата(niktagor @ Sep 8 2010, 12:32)  Протокол устройства сделан таким образом, что читать приходится именно блоками по 4к и изменить это не возможно без вмешательства в него. User Mode это относится к контроллеру в устройстве или в PC? Где об этих режимах прочитать можно? Что значит "именно блоками по 4К"? 4К - это несколько транзакций для USB протокола, а где их несколько - можно попробовать увеличить. Единственная проблема, если после каждого блока нужно слать ответ-подтверждение. В таком случае нормальной скорости не добьешься никак. Kernel & User mode
|
|
|
|
|
Sep 8 2010, 09:48
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601

|
Цитата Что значит "именно блоками по 4К"? 4К - это несколько транзакций для USB протокола, а где их несколько - можно попробовать увеличить. Устройство сделано так, что я отправляю туда один запрос размером 1 байт. Оно в ответ выплевывает 8 транзакций по 512 байт и одну с sync packet'ом. Потом все повторяется заново. Так вот, эта операция должна занимать не больше 1 миллисекунды. А получается какая-то ерунда. Используя USB monitor, получаю удивительные результаты. Все работает сверхбыстро, пока куда-то не пропадают 15мс(смотри скриншот). Где искать причину?
Эскизы прикрепленных изображений
|
|
|
|
|
Sep 8 2010, 10:21
|
Частый гость
 
Группа: Свой
Сообщений: 183
Регистрация: 10-10-06
Из: Смоленск
Пользователь №: 21 167

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

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601

|
Хорошо. Почему тогда этот другой процесс ВСЕГДА занимает 15мс? Приоритет процесса - реального времени. Запускается на втором ядре. Я могу как-то запустить его не в user mode, а в режиме ядра? Цитата(Serg_Sm @ Sep 8 2010, 14:21)  PS2: Какой скорости приема нужно достичь? 1000 таких запросов должно обрабатываться за секунду. Точнее, примерно 4МБ в секунду. Вроде, цифра детская Ситуация странная. На каждую 1мс моих взаимодействий с прибором приходится 15мс потерянного времени. При том, что все остальные программы отключены и загрузка ЦП под 0%. Даже теоретическая максимальная скорость в этом случае всего 30Мбит в секунду. P.S. Это если верить USB Monitor.
Сообщение отредактировал niktagor - Sep 8 2010, 11:05
|
|
|
|
|
Sep 8 2010, 11:19
|
Частый гость
 
Группа: Свой
Сообщений: 183
Регистрация: 10-10-06
Из: Смоленск
Пользователь №: 21 167

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

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601

|
Про 15 миллисекунд разобрался. Это точность системного таймера в большинстве современных компьютеров. Например Sleep(1) и Sleep(8) обе вызывают задержку на 15 миллисекунд. Так что USB Monitor с большим разрешением время посчитать не сможет. И реальные тайминги я через нее не узнаю. Вопрос: можно ли их вообще узнать, не заглядывая в USB провод приборами?
|
|
|
|
|
Sep 8 2010, 12:48
|
Частый гость
 
Группа: Свой
Сообщений: 183
Регистрация: 10-10-06
Из: Смоленск
Пользователь №: 21 167

|
В 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);}
|
|
|
|
|
Sep 8 2010, 14:38
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(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 миллисекунд.
Сообщение отредактировал Konst_777 - Sep 8 2010, 15:30
|
|
|
|
|
Sep 8 2010, 20:18
|
Знающий
   
Группа: Свой
Сообщений: 614
Регистрация: 12-06-09
Из: рядом с Москвой
Пользователь №: 50 219

|
Цитата(niktagor @ Sep 8 2010, 16:03)  Про 15 миллисекунд разобрался. Это точность системного таймера в большинстве современных компьютеров. Например Sleep(1) и Sleep(8) обе вызывают задержку на 15 миллисекунд. Так что USB Monitor с большим разрешением время посчитать не сможет. И реальные тайминги я через нее не узнаю. Вопрос: можно ли их вообще узнать, не заглядывая в USB провод приборами? Попробуйте параллельно запустить Windows Media Player в режиме воспроизведения видео или музыки - - он повышает точность системного таймера до 1мс. и все измерители времени и Sleep'ы будут работать точнее в 15 раз.
|
|
|
|
|
Sep 9 2010, 11:54
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(niktagor @ Sep 8 2010, 12:48)  ... А получается какая-то ерунда. Используя USB monitor, получаю удивительные результаты. Все работает сверхбыстро, пока куда-то не пропадают 15мс(смотри скриншот). Где искать причину? Цитата(niktagor @ Sep 8 2010, 15:03)  Про 15 миллисекунд разобрался. ... Так что USB Monitor с большим разрешением время посчитать не сможет. И реальные тайминги я через нее не узнаю... Эх, не посмотрел я скриншот и начал фантазировать. Да, Вы правы. USB Monitor не использует High-Resolution Timer. И реальные тайминги Вы с помощью этой программы не узнаете.
|
|
|
|
|
Sep 9 2010, 17:24
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601

|
Прикрутил high-resolution timer. Выясняется, что между получаемыми пакетами задержка всегда ровно 250мкс. Это при том, что это все часть одной большой информации, и она выдается по одному запросу на 9 пакетов. Косяк явно не в приборе. Так как даже с родной программой и он выдает это быстрее. Использую метод XferData(). Посылка наперед нескольких запросов ситуацию не меняет. Завтра попробую использовать Begin\Wait\Finish DataXfer(). Есть смысл? В чем их принципиальное различие?
|
|
|
|
|
Sep 9 2010, 20:02
|
Знающий
   
Группа: Свой
Сообщений: 614
Регистрация: 12-06-09
Из: рядом с Москвой
Пользователь №: 50 219

|
Цитата(niktagor @ Sep 9 2010, 21:24)  Прикрутил high-resolution timer. Выясняется, что между получаемыми пакетами задержка всегда ровно 250мкс. Это при том, что это все часть одной большой информации, и она выдается по одному запросу на 9 пакетов. Косяк явно не в приборе. Так как даже с родной программой и он выдает это быстрее. Использую метод XferData(). Посылка наперед нескольких запросов ситуацию не меняет. Завтра попробую использовать Begin\Wait\Finish DataXfer(). Есть смысл? В чем их принципиальное различие? первый метод синхронный, второй асинхронный. Асинхронный метод позволяет посылать следующий запрос на чтение данных драйверу не дожидаясь исполнения предыдущего и таким образом можно организовать очередь запросов на чтение и получить скорость до 40-50МБайт/c. Но проблема в том, то у вас нужно посылать ещё и запрос устройству для того чтобы оно выдало данные - вот тут главные тормоза, так как Маздай от билла гейтса не является ОС реального времени и быстро переключать потоки и задачи не умеет.
|
|
|
|
|
Sep 10 2010, 04:57
|

Местный
  
Группа: Свой
Сообщений: 330
Регистрация: 10-06-05
Из: Россия, Москва
Пользователь №: 5 894

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

|
Цитата(-Al- @ Sep 10 2010, 10:57)  ....Вы НИКОГДА не получите 1мс на USB при запросе туда-обратно ... НИКОГДА не говорите НИКОГДА PS. Обсуждалось здесь http://electronix.ru/forum/index.php?showt...=37919&st=0
|
|
|
|
|
Sep 10 2010, 08:30
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601

|
По поводу моих 250мкс по Вашей ссылке нашел интересное сообщеньице Цитата У шины время кадра на полной скорости 1 мС, а на высокой микрокадр - 0.125 мс. В течении этого времени в самом худшем случае ( это тот случай, если имеется простейший планировщик пакетов - один запрос в кадре) мы буим иметь задержки 2 мСек и 0.25 мСек соответственно. В связи с этим, вопрос. Планировщик пакетов - это в cyusb.sys, или на более низком уровне? Еще появилась идея перейти под linux и написать код для библиотеки libusb. На сайте написано, что вышла ее версия под Windows. Кто-нибудь пробовал? Есть ли смысл в моей ситуации?
|
|
|
|
|
Sep 10 2010, 19:23
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(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). Нужна полная информация о характеристиках эндпоинтов Вашего устройства.
|
|
|
|
|
Sep 11 2010, 07:52
|
Местный
  
Группа: Свой
Сообщений: 244
Регистрация: 21-02-05
Из: Урал
Пользователь №: 2 806

|
Цитата(-Al- @ Sep 11 2010, 00:59)  Что Вы эти хотели сказать? Что время сколь угодно близко к 1мс, но все равно больше? Я говорю от том, что можно сделать так, что в пределах одного фрейма будет транзакция запроса и транзакция ответа.
|
|
|
|
|
Sep 13 2010, 07:32
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601

|
Выкладываю всю информацию об эндпоинтах и приступаю к реализации вышеуказанного алгоритма. Код <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 **********************************
Сообщение отредактировал niktagor - Sep 13 2010, 07:33
|
|
|
|
|
Sep 13 2010, 08:30
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

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

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601

|
Цитата 1). Известно ли Вам как построена аппаратура Вашего устройства (используемые компоненты, связи между компонентами, есть ли буферная память)? 2). Данные, которые Вы получаете от Вашего устройства через USB должны обрабатываться в реальном времени или можно накопить определенный объем данных (какой?), а затем обработать данные? 1) Не известно. 2) К сожалению, в реальном времени. Накопить их можно только в компьютере. Цитата Не нужно. С такой конфигурацией EP1Out ничего не получится. Можете пояснить, что плохо в этой конфигурации?
|
|
|
|
|
Sep 13 2010, 09:50
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(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 Мбайт. У Вас такая ситуация? Или Вам нужно считать в ПЭВМ какой-то объем данных, а затем можно обрабатывать его в не реальном времени?
|
|
|
|
|
Sep 13 2010, 14:28
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601

|
Цитата(Konst_777 @ Sep 13 2010, 13:50)  ... Или Вам нужно считать в ПЭВМ какой-то объем данных, а затем можно обрабатывать его в не реальном времени? Да, обрабатывать можно не в реальном времени. Важно обеспечить максимальную скорость снятия данных с датчика. А так как внутри прибора задокументированного буфера нет, приходиться извращаться.
|
|
|
|
|
Sep 13 2010, 16:53
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(niktagor @ Sep 13 2010, 17:28)  Да, обрабатывать можно не в реальном времени... Какой объем данных нужно снимать с датчика для обработки? Вы выяснили, где хранится программа FX2LP: в EEPROM, подключенном через I2C или во внешнем ЗУ (Flash, EEPROM), подключенном к шине данных и адреса FX2LP? Если программа хранится в EEPROM, подключенном через I2C, то можно считать программу и отредактировать таблицу дескрипторов USB, чтобы обеспечить для EP1OUT: Type="INTERRUPT" и MaxPktSize="1" (поскольку Вы выдаете 1 байт). Затем можно загружать отредактированный файл *.iic прямо в ОЗУ FX2LP.
|
|
|
|
|
Sep 13 2010, 17:26
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601

|
Цитата В 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() в кадре. Как бы проконтроллировать и улучшить этот показатель?
Сообщение отредактировал niktagor - Sep 13 2010, 17:29
|
|
|
|
|
Sep 14 2010, 14:43
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601

|
Konst_777, прошу прощения за невнимательность. Цитата Какой объем данных нужно снимать с датчика для обработки? Объём не ограничен. То есть в описанном режиме я могу накапливать данные например сутки, а потом еще неделю их анализировать. Это не критично. Если не буду успевать записывать на диск - можно например снимать данные 5 секунд, потом прерываться на запись и продолжать дальше. Цитата Вы выяснили, где хранится программа FX2LP... Пока не знаю, как это сделать. Боюсь что-нибудь испортить. Есть простой безопасный алгоритм? Какую программу нужно использовать? В USB-командах есть: -READ EEPROM -PSOC READ -READ REGISTER Соответственно, эти комплектующие есть внутри. Еще в документе упоминается, что внутри есть FPGA. Разбирать прибор нельзя. Картина пока что не сложилась.
Сообщение отредактировал niktagor - Sep 14 2010, 16:37
|
|
|
|
|
Sep 14 2010, 19:49
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(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.
|
|
|
|
|
Sep 15 2010, 14:42
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601

|
Цитата(Konst_777 @ Sep 14 2010, 23:49)  Итак, жду от Вас сообщения о результатах считывания firmware. Konst_777, большое спасибо. Пробовать буду завтра или послезавтра.
|
|
|
|
|
Sep 15 2010, 18:35
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(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" - пока не трогать, так как этот эндпоинт сложнее переконфигурировать.
Сообщение отредактировал Konst_777 - Sep 16 2010, 05:40
|
|
|
|
|
Sep 19 2010, 18:50
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601

|
EEPROM скачал успешно! Всего 17КБ вышло. Глянул в hex-редакторе, вроде все по-честному. Какой посоветуете дизассемблер? К сайпрессовскому девайсу подойдет любой для 8051? Пытался открыть Keil-ом, он выдает "error 59: invalid absolute module". Сшивал 5 кусочков по 4КБ в hex-редакторе, проверял, все правильно сшито. Может нужно в конец или в начало файла что-нибудь дописать?
|
|
|
|
|
Sep 19 2010, 19:02
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(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".
|
|
|
|
|
Sep 20 2010, 08:47
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601

|
Сегодня хотел попробовать загрузить обратно данные, которые скачал из EEPROM. Но теперь уже сомневаюсь в соответствии скачанного с реальным. Хотя ведь возможно такое, что чип по мере надобности подгружает себе программу из EEPROM в память, если это реализовано программно? В дэйташите не нашел, что объем внешней EEPROM чем-то ограничен. Скорее всего, он ограничен только максимальным размером адреса в чипе. А он обычно 2^8n, то есть не 16КБ.
|
|
|
|
|
Sep 20 2010, 10:42
|
Частый гость
 
Группа: Свой
Сообщений: 183
Регистрация: 10-10-06
Из: Смоленск
Пользователь №: 21 167

|
Цитата(niktagor @ Sep 20 2010, 12:47)  Сегодня хотел попробовать загрузить обратно данные, которые скачал из EEPROM. Но теперь уже сомневаюсь в соответствии скачанного с реальным. Хотя ведь возможно такое, что чип по мере надобности подгружает себе программу из EEPROM в память, если это реализовано программно? В дэйташите не нашел, что объем внешней EEPROM чем-то ограничен. Скорее всего, он ограничен только максимальным размером адреса в чипе. А он обычно 2^8n, то есть не 16КБ. И программу и данные FX2 грузит при старте одним махом. Но объем EEPROM может быть и 64Кбайта (или может быть несколько микросхем EEPROM) - устройство может хранить в верхней части (либо других) EEPROM дополнительные данные (калибровочные таблицы и т.п.). И доступ к этим данным возможен уже во время работы.
|
|
|
|
|
Sep 20 2010, 13:24
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601

|
Цитата(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). Зацепился нормально, выделил процедурки. Но найти, где эндпоинты конфигурируются, пока не получилось. Сижу, пыхчу.
|
|
|
|
|
Sep 20 2010, 14:38
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(niktagor @ Aug 31 2010, 14:41)  ...Имеется готовое устройство от буржуйских разработчиков, построенное на базе CY7C68013... Цитата(niktagor @ Sep 20 2010, 16:24)  Все сходится. Файл 17КБ. В начале - 0xC2. В конце - 0x80 0x01 0xE6 0x00 0x00... Значит, таки не CY7C68013 (FX2), а CY7C68013a (FX2LP). Цитата(niktagor @ Sep 13 2010, 10:32)  ... Код <ENDPOINT> Type="BULK" Direction="OUT" Address="01h" Attributes="02h" MaxPktSize="512" DescriptorType="5" DescriptorLength="7" Interval="0" </ENDPOINT> ... То есть, в таблице дескрипторов описание эндпоинта EP1OUT выглядит так: High-Speed Bulk Out Endpoint Descriptordb 07H ; Descriptor length db 05H ; Descriptor type: Endpoint db 01H ; Endpoint number, OUT direction db 02H ; Endpoint type: Bulk db 00H ; Maximun packet size (LSB) db 02H ; Max packect size (MSB) db 00H ; Polling interval А мы хотим получить такой эндпоинт EP1OUT: High-Speed Interrupt Out Endpoint Descriptordb 07H ; Descriptor length db 05H ; Descriptor type: Endpoint db 01H ; Endpoint number, OUT direction db 03H ; Endpoint type: Interrupt db 40H ; Maximun packet size (LSB) db 00H ; Max packect size (MSB) db 02H ; Polling interval = (2^(bInterval-1))*125us = 250us То есть, нужно в файле *.iic найти следующую последовательность байтов: 07 05 01 02 00 02 00 И заменить ее на такую: 07 05 01 03 40 00 02 Затем нужно научить Вашу программу загружать содержимое отредактированного файла *.iic в память FX2LP. Для C# библиотека CyUsb.dll имеет метод LoadRAM() в классе CyFX2Device (см. "Programmers Reference - C# Library" (файл CyUSB.NET.chm)). Для С++ эту функцию Вам придется писать самому. Если firmware для FX2LP содержит переподключение к шине USB, то смену типа EP1OUT с Bulk на Interrupt Вы сможете увидеть, например с помощью CyConsole, сразу после загрузки firmware в FX2LP и переподключения FX2LP к шине USB. Если firmware для FX2LP не содержит переподключение к шине USB, то потребуются дополнительные действия. Цитата(niktagor @ Sep 20 2010, 16:24)  Все сходится. Файл 17КБ. В начале - 0xC2. В конце - 0x80 0x01 0xE6 0x00 0x00... А все таки, Вы проверили, что структура считанного файла соответствует описанной в подразделе "3.4.3 Serial EEPROM Present, First Byte is 0xC2" EZ-USB® Technical Reference Manual ? То есть, перемещаясь по заголовкам каждой записи благополучно дошли до завершающей (0x80 0x01 0xE6 0x00 0x00) ???
|
|
|
|
|
Sep 20 2010, 18:34
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601

|
Цитата(Konst_777 @ Sep 20 2010, 18:38)  А все таки, Вы проверили, что структура считанного файла соответствует описанной в подразделе "3.4.3 Serial EEPROM Present, First Byte is 0xC2" EZ-USB® Technical Reference Manual ? То есть, перемещаясь по заголовкам каждой записи благополучно дошли до завершающей (0x80 0x01 0xE6 0x00 0x00) ??? Проверил. Не соответствует. Самый первый байт - 0xС2. Потом идут судя по всему какие-то данные, совсем не то, что написано в мануале. Начиная с адреса примерно 0x2200 идет то, что должно быть с 0x01 (VID,PID...). Чуть подальше, с 0x2290 идет такая последовательность байт: Код 07 05 01 02 00 02 00 07 05 82 02 00 02 00 07 05 86 02 00 02 00 07 05 81 02 00 02 00 09 02 2E 00 01 01 00 80 32 09 04 00 00 04 FF 00 00 00 07 05 01 02 40 00 00 07 05 82 02 40 00 00 07 05 86 02 40 00 00 07 05 81 02 40 00 00 То есть что-то типа двух разных конфигураций эндпоинтов. Менять только самую первую? Это не повлияет на работу алгоритма считывания данных с прибора? Завершающая последовательность встречается только один раз, в конце файла. Самое забавное - то, что я считал всякие данные с адресов 0x4000 - 0x43FF, хотя в мануале написано: Цитата Note Serial EEPROM data can be loaded only into these three on-chip RAM spaces: ■ Program/Data RAM at 0x0000-0x3FFF ■ Data RAM at 0xE000-0xE1FF ■ The CPUCS register (at 0xE600 (only bit 0, 8051RES, is EEPROM loadable) Считываю 0xE000 - 0xEFFF, там совсем пусто. Чудеса!!! Так ведь я ж не стал сначала проверять. Я сразу давай загружать прошивку обратно, чтобы проверить возможность совершения этого действия. И вот парадокс - работает! Причем при изменении чего-нибудь, работать перестает. То есть оно реально загружает то, что я ему подсовываю. Цитата Значит, таки не CY7C68013 (FX2), а CY7C68013a (FX2LP). Как Вы определили? У меня TRM на них один и тот же, и про EEPROM там для них одинаково написано.
Сообщение отредактировал niktagor - Sep 20 2010, 18:35
|
|
|
|
|
Sep 20 2010, 21:55
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(niktagor @ Sep 20 2010, 21:34)  Проверил. Не соответствует. Самый первый байт - 0xС2. Потом идут судя по всему какие-то данные, совсем не то, что написано в мануале. ... Самое забавное - то, что я считал всякие данные с адресов 0x4000 - 0x43FF, хотя в мануале написано:... Похоже, что используется внешняя память (программы или данных). Тогда в начале файла *.iic помещается загрузчик, цель которого, преодолеть ограничения загрузки программы или данных только во внутреннюю память контроллера (см. .hex working, .iic not working). В этом случае контроллер может быть и FX2 (CY7C68013), хотя файл *.iic имеет объем больше 8К. То есть, нужно уточнить, какой контроллер используется ( Distinction between FX2 and FX2LP by firmware). Цитата(niktagor @ Sep 20 2010, 21:34)  ... То есть что-то типа двух разных конфигураций эндпоинтов. Менять только самую первую? Это не повлияет на работу алгоритма считывания данных с прибора? ... Да, два набора дескрипторов для режимов High Speed и Full Speed. Менять только строку "07 05 01 02 00 02 00" на строку "07 05 01 03 40 00 02". В режиме Full Speed не будет обеспечена нужная Вам скорость обмена. Поэтому для дескрипторов режима Full Speed и не нужны изменения. Не повлияет. Цитата(niktagor @ Sep 20 2010, 21:34)  ...Причем при изменении чего-нибудь, работать перестает... То есть, меняете строку строку "07 05 01 02 00 02 00" на строку "07 05 01 03 40 00 02" и перестает работать? Я так понял, что Вы используете USB Control Center для загрузки модифицированного файла *.iic во внутреннюю память FX2/FX2LP. Это опасно. Рука дрогнет и перепрограммируете первые 256 байт EEPROM. Цитата(niktagor @ Sep 20 2010, 21:34)  Как Вы определили? У меня TRM на них один и тот же, и про EEPROM там для них одинаково написано. С этой страницы можно скачать EZ-USB® Technical Reference Manual для FX2. В FX2 8K внутренней памяти программ и данных, в FX2LP - 16K. Я полагал, что firmware использует только внутреннюю память контроллера FX2/FX2LP. Поэтому, когда узнал, что файл *.iic занимает 17К, то посчитал, что 17К просто не поместятся в FX2. Serg_Sm совершенно справедливо указал, что на самом деле, объем EEPROM может и превышать объем внутренней памяти контроллера.
|
|
|
|
|
Sep 21 2010, 17:55
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601

|
Цитата То есть, меняете строку строку "07 05 01 02 00 02 00" на строку "07 05 01 03 40 00 02" и перестает работать? Я так понял, что Вы используете USB Control Center для загрузки модифицированного файла *.iic во внутреннюю память FX2/FX2LP. Это опасно. Рука дрогнет и перепрограммируете первые 256 байт EEPROM. Изготовитель предоставляет программатор с одной кнопочкой "зашить", и прошивки раньше тоже были доступны. Скачивать он не умеет. Новую прошивку, которая у меня, не дают. Строку поменял, все нормально переконфигурировалось. Определяется как interrupt. Массив запросов с CYUSB_OUT он не хочет воспринимать. То есть сколько бы я ему их не посылал, после срабатывания "CYUSB_IN", он информацию перестает выдавать. Скорее всего, такой код. Зато с ситуации 2.1мс+- 0.1мс все изменилось на очень стабильные 2мс +- 0.001мс. И это очень радует. У родной программы было хуже(2.5мс +- 0.5мс и иногда несколько отсчетов выпадало вообще), так что работа не впустую проделана. Не радует вот что. У датчика время измерения можно менять. 1мс - это я писал самое минимальное, т.к. только в этом режиме будем работать с прибором. Так вот,со старой конфигурацией время цикла было примерно равно времени измерения + 1мс. А теперь оно равно t измерения для t>2мс. А при t<2мс оно все равно равно 2мс. То есть получается, что прибор умеет параллельно передавать данные и делать измерение, но это только для t>2мс. А в моем случае, при t=1мс, он намеренно ждет. Такой я могу сделать вывод. И скорее всего, выход один - копать ассемблерный код...
Сообщение отредактировал niktagor - Sep 21 2010, 17:56
|
|
|
|
|
Sep 21 2010, 19:15
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(niktagor @ Sep 21 2010, 20:55)  ... И скорее всего, выход один - копать ассемблерный код...  Еще рано горевать. Во-первых, я промахнулся. Мы хотели обеспечить для EP1OUT: Type="INTERRUPT" и MaxPktSize="1". А сделали:Type="INTERRUPT" и MaxPktSize="64". Так что, если массив запросов с CYUSB_OUT у Вас меньше 64, то Вы и получите в ответ один формуляр CYUSB_IN. Чтобы сделать MaxPktSize="1", нужно в измененном файле *.iic заменить последовательность байт "07 05 01 03 40 00 02" на "07 05 01 03 01 00 02". Во-вторых, пожалуйста, опишите формат байта (назначение битов), который составляет запрос CYUSB_OUT. В третьих, опишите алгоритм выдачи массива запросов CYUSB_OUT и прием массива ответов CYUSB_IN. Насколько он отличается от такого алгоритма: 1) BeginDataXfer() c "CYUSB_IN" на прием массива размером N*4.5 Кбайт, N=1000 2) BeginDataXfer() c "CYUSB_OUT" на выдачу массива N байт, N=1000 3) WaitForXfer() и FinishDataXfer() для "CYUSB_OUT" 4) WaitForXfer() и FinishDataXfer() для "CYUSB_IN" Еще вопрос: Цитата(niktagor @ Sep 8 2010, 12:48)  Устройство сделано так, что я отправляю туда один запрос размером 1 байт. Оно в ответ выплевывает 8 транзакций по 512 байт и одну с sync packet'ом... Вот этот последний sync packet тоже содержит 512 байт или меньше? Если меньше 512 байт, то тогда понятно почему Вы получаете один формуляр CYUSB_IN в ответ на массив запросов с CYUSB_OUT.
|
|
|
|
|
Sep 22 2010, 09:17
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601

|
Цитата(Konst_777 @ Sep 21 2010, 23:15)  Вот этот последний sync packet тоже содержит 512 байт или меньше? Если меньше 512 байт, то тогда понятно почему Вы получаете один формуляр CYUSB_IN в ответ на массив запросов с CYUSB_OUT. Почему? Мне не понятно. Он один байт всего содержит. И я посылаю массив запросов на 4097 байт. Цитата(Konst_777 @ Sep 21 2010, 23:15)  Мы хотели обеспечить для EP1OUT: Type="INTERRUPT" и MaxPktSize="1". ... Во-вторых, пожалуйста, опишите формат байта (назначение битов), который составляет запрос CYUSB_OUT. Там нет назначений битов. Просто байт запроса данных. Все конфигурирование типа установки скорости датчика происходит заранее, с помощью других команд. Размеры некоторых больше одного байта. Можно ли в этом случае делать MaxPktSize=1? Я правильно понимаю, что в устройстве буфер 64 байта и он его весь забивает нулями, когда я посылаю команду с MaxPktSize = 64, а мы пытаемся поместить в него несколько команд? Цитата(Konst_777 @ Sep 21 2010, 23:15)  В третьих, опишите алгоритм выдачи массива запросов CYUSB_OUT и прием массива ответов CYUSB_IN. Насколько он отличается от такого алгоритма: 1) BeginDataXfer() c "CYUSB_IN" на прием массива размером N*4.5 Кбайт, N=1000 2) BeginDataXfer() c "CYUSB_OUT" на выдачу массива N байт, N=1000 3) WaitForXfer() и FinishDataXfer() для "CYUSB_OUT" 4) WaitForXfer() и FinishDataXfer() для "CYUSB_IN" Сейчас с таким работает: 0)BeginDataXfer() c "CYUSB_IN" на прием 4097 байт while(i<1000) { 1) BeginDataXfer() c "CYUSB_IN" на прием 4097 байт 2) XferData() для "CYUSB_OUT" 3) WaitForXfer() и FinishDataXfer() для "CYUSB_IN" i++ } 5)WaitForXfer() и FinishDataXfer() для "CYUSB_IN" Причем WaitForXfer вызывается для того запроса, который был послан раньше. Массив запросов ни в ту ни в другую сторону он не хочет воспринимать. XferData() выполняется совсем быстро (5мкс), поэтому делаю синхронно.
|
|
|
|
|
Sep 22 2010, 17:39
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(niktagor @ Sep 22 2010, 12:17)  Почему? Мне не понятно. Он один байт всего содержит. И я посылаю массив запросов на 4097 байт. ... Universal Serial Bus Revision 2.0 specification раздел "5.8.3 Bulk Transfer Packet Size Constraints". Цитата(niktagor @ Sep 22 2010, 12:17)  Там нет назначений битов. Просто байт запроса данных. Все конфигурирование типа установки скорости датчика происходит заранее, с помощью других команд. Размеры некоторых больше одного байта. Можно ли в этом случае делать MaxPktSize=1? Нет, MaxPktSize должен быть не меньше числа байт для самой длинной команды. Цитата(niktagor @ Sep 22 2010, 12:17)  Я правильно понимаю, что в устройстве буфер 64 байта и он его весь забивает нулями, когда я посылаю команду с MaxPktSize = 64, а мы пытаемся поместить в него несколько команд? Не понял предложения. В целом выводы такие - правильные советы были даны Serg_Sm: Цитата(Serg_Sm @ Sep 8 2010, 12:27)  ... Единственная проблема, если после каждого блока нужно слать ответ-подтверждение. В таком случае нормальной скорости не добьешься никак... Цитата(Serg_Sm @ Sep 8 2010, 13:21)  Значит получение 4К данных по запросу - это хреново. Чтобы достичь приличной скорости по хорошему нужно выносить всю обработку в драйвер. А так попробуй поднять приоритет процесса до реал-тайм и кидать сразу несколько запросов (точное число проверяется экспериментально) в 1 байт асинхронно приему...
|
|
|
|
|
May 15 2014, 15:06
|
Группа: Новичок
Сообщений: 3
Регистрация: 23-12-05
Пользователь №: 12 588

|
Здравствуйте Уважаемые форумчане. Прочитал внимательно ветку и понял, что среди участников обсуждения большие специалисты по CY7C68013A. Есть следующая проблема. Устройство на указанном контроллере загружает прошивку из файла .sys. Прошивка загружается в RAM и по сигнатурам C0 ... 8001E60000 в файле не находится, т.к. не загружается в EEPROM. Как можно разыскать эту прошивку в файле .sys и преобразовать её в bix или hex для загрузки в контроллер вручную или через скрипт? Или, возможно, после загрузки её можно скачать из RAM? Требуется этот ход в связи с устаревшим драйвером .sys в котором кроме прошивки, я так понимаю, ничего полезного нет, т.к. усройство после загрузки прошивки переподключается с другими VID PID и управляется стандартным драйвером CyUSB.sys.
Извиняюсь, если обратился не в ту ветку форума. Если решение тривиально - ткните носом. Большого опыта работы с CY7C68013A нет.
|
|
|
|
|
May 19 2014, 02:30
|
Группа: Новичок
Сообщений: 3
Регистрация: 23-12-05
Пользователь №: 12 588

|
Прошивка точно грузится из файла AD9957LD.sys В 15 версии cy3681_ez_usb_fx2_development_kit_15 есть даже исходники для компиляции драйвера с прошивкой и программа для конвертации прошивки в C код для сборки с драйвером. Прошивка в файле записывается блоками по 16 байт с указанием перед каждым блоком 1 байт - от 0 до 16 - кол-во ненулевых байт прошивки в блоке, далее двухбайтный адрес - я так думаю, далее 1 байт - 00. Сравнивая пример скомпилированного из исходников драйвера ezloader.sys с прилагаемым файлом прошивки и ezloader.c, как мне кажется я нашёл нужные блоки прошивки в AD9957LD.sys, но проблема в том, что в этих блоках нет VID PID, которые прописываются после Ренумерации. Нужные VID PID в AD9957LD.sys присутсвуют только в одном месте, но далеко от тех блоков, что я считаю прошивкой. Как и где обычно прописываются VID PID при загрузке прошивки с хоста? Кроме того прошивки в EEPROM точно нет, т.к. единственная EEPROM на плате - 16 байт, в которой зашита стандартная комбинация C0 VID PID DID - проверено.
|
|
|
|
|
May 28 2014, 10:12
|
Группа: Новичок
Сообщений: 3
Регистрация: 23-12-05
Пользователь №: 12 588

|
Спасибо за советы. Прошивку вытащить удалось. Теперь полная свобода действий. Если интересно, то могу выложить hex файл с прошивкой от платки Evaluation Board for 1 GSPS DDS with 14-Bit DAC AD9910/PCBZ.
|
|
|
|
|
Jun 11 2014, 02:05
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 12-06-10
Пользователь №: 57 898

|
Добрый день! Может немного не суда, но все же... Имею плату ez-usb fx2lp на CY7C68013A поменял ЕЕПРОМ пробывал и Saleae Logic и USBee Suite, последняя впринцепи устраивает но тормозит, а в первой Saleae Logic нету режима неприрывного сканирования и как-то неочень удобно без него, может я чего-то не понял кто сталкивался с таким? В USBee Suite это кнопка Capture Many
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|