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

Вопрос про CY7C68013 EZ-USB FX2

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

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

 

Еще появилась идея перейти под 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). Нужна полная информация о характеристиках эндпоинтов Вашего устройства.

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


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

Что Вы эти хотели сказать? Что время сколь угодно близко к 1мс, но все равно больше?

 

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

 

 

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


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

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

 

<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

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


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

...приступаю к реализации вышеуказанного алгоритма.

Не нужно. С такой конфигурацией EP1Out ничего не получится. Лучше, ответьте на вопросы:

...

1). Известно ли Вам как построена аппаратура Вашего устройства (используемые компоненты, связи между компонентами, есть ли буферная память)?

2). Данные, которые Вы получаете от Вашего устройства через USB должны обрабатываться в реальном времени или можно накопить определенный объем данных (какой?), а затем обработать данные?

...

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


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

1). Известно ли Вам как построена аппаратура Вашего устройства (используемые компоненты, связи между компонентами, есть ли буферная память)?

2). Данные, которые Вы получаете от Вашего устройства через USB должны обрабатываться в реальном времени или можно накопить определенный объем данных (какой?), а затем обработать данные?

 

1) Не известно.

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

 

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

 

Можете пояснить, что плохо в этой конфигурации?

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


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

...Можете пояснить, что плохо в этой конфигурации?

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

 

 

...

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

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

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


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

... Или Вам нужно считать в ПЭВМ какой-то объем данных, а затем можно обрабатывать его в не реальном времени?

 

Да, обрабатывать можно не в реальном времени. Важно обеспечить максимальную скорость снятия данных с датчика. А так как внутри прибора задокументированного буфера нет, приходиться извращаться.

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


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

Да, обрабатывать можно не в реальном времени...

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

 

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

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


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

В 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

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


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

Давайте, вначале Вы ответите на мои вопросы. А затем я на Ваши.

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

 

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

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


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

Konst_777, прошу прощения за невнимательность.

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

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

 

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

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

 

В USB-командах есть:

-READ EEPROM

-PSOC READ

-READ REGISTER

 

Соответственно, эти комплектующие есть внутри. Еще в документе упоминается, что внутри есть FPGA. Разбирать прибор нельзя. Картина пока что не сложилась.

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

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


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

...Если не буду успевать записывать на диск - можно например снимать данные 5 секунд, потом прерываться на запись и продолжать дальше.

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

 

...Еще в документе упоминается, что внутри есть FPGA.

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

 

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

...

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.

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


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

Итак, жду от Вас сообщения о результатах считывания firmware.

 

Konst_777, большое спасибо. Пробовать буду завтра или послезавтра.

 

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


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

Мой запрос содержит всего один байт. Или в этот буфер идут все запросы, в том числе "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 Кбайта данных регистрации. То есть, Ваш алгоритм:

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

 

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

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


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

EEPROM скачал успешно! Всего 17КБ вышло. Глянул в hex-редакторе, вроде все по-честному. Какой посоветуете дизассемблер? К сайпрессовскому девайсу подойдет любой для 8051? Пытался открыть Keil-ом, он выдает "error 59: invalid absolute module". Сшивал 5 кусочков по 4КБ в hex-редакторе, проверял, все правильно сшито. Может нужно в конец или в начало файла что-нибудь дописать?

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...