Jump to content

    
Sign in to follow this  
niktagor

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

Recommended Posts

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

Share this post


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

 

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

 

 

Share this post


Link to post
Share on other sites

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

 

<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
**********************************

Edited by niktagor

Share this post


Link to post
Share on other sites
...приступаю к реализации вышеуказанного алгоритма.

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

...

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

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

...

Share this post


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

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

 

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

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

 

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

 

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

Share this post


Link to post
Share on other sites
...Можете пояснить, что плохо в этой конфигурации?

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

 

 

...

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

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

Share this post


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

 

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

Share this post


Link to post
Share on other sites
Да, обрабатывать можно не в реальном времени...

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

 

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

Share this post


Link to post
Share on other sites
В 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() в кадре. Как бы проконтроллировать и улучшить этот показатель?

Edited by niktagor

Share this post


Link to post
Share on other sites

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

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

 

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

Share this post


Link to post
Share on other sites

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

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

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

 

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

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

 

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

-READ EEPROM

-PSOC READ

-READ REGISTER

 

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

Edited by niktagor

Share this post


Link to post
Share on other sites
...Если не буду успевать записывать на диск - можно например снимать данные 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.

Share this post


Link to post
Share on other sites
Мой запрос содержит всего один байт. Или в этот буфер идут все запросы, в том числе "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" - пока не трогать, так как этот эндпоинт сложнее переконфигурировать.

Edited by Konst_777

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this