-=HermiT=- 0 25 ноября, 2008 Опубликовано 25 ноября, 2008 · Жалоба В документе FX2 TechRefManual.pdf написано: The USB 2.0 Specification requires that high-speed (480 Mbit/sec) devices must also be capable of enumerating at full-speed (12 Mbit/s). In fact, all high-speed devices begin the enumeration process in full-speed mode; devices switch to high-speed operation only after the host and device have agreed to operate at high speed. The high-speed negotiation process occurs during USB reset, via the “Chirp” protocol described in Chapter 7 of the USB 2.0 Specification. (что за “Chirp” protocol я там так и не нашел). Но зато в 7 главе есть следующее: 7.5 USB Bus Reset The host signals a USB Bus Reset by driving an SE0 state (both D+ and D- data lines low) for a minimum of 10 ms. The FX2 senses this condition, requests the USB Interrupt (INT2), and supplies the interrupt vector for a USB Reset. After a USB bus reset, the following occurs: • Toggle bits are cleared to 0. • The device address is reset to zero. • If the Default USB Device is active, the USB configuration and alternate settings are reset to zero. • The FX2 will renegotiate with the host for high-speed (480 Mbps) mode. Казалось бы то, что надо. Вставил команду: DeviceIoControl (FX2Device, IOCTL_Ezusb_RESET, NULL, 0, NULL, 0, (unsigned long *)&nBytes, NULL); Но она никак не повлияла Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
-=HermiT=- 0 25 ноября, 2008 Опубликовано 25 ноября, 2008 · Жалоба Проблема решилась с помощью использования асинхронного ввода вывода. Использовал драйвер CyUSB.sys Код фактически такой же, как в документе CyAPI.pdf на странице 6 (2.1 BeginDataXfer( )) OVERLAPPED in6OvLap1, in8OvLap1, in6OvLap2, in8OvLap2, in6OvLap3, in8OvLap3, in6OvLap4, in8OvLap4; in6OvLap1.hEvent = CreateEvent(NULL, false, false, "CYUSB_IN61"); ... UCHAR *inContext61 = BulkInEpt6->BeginDataXfer(buf[0], 1024, &in6OvLap1); ... BulkInEpt6->WaitForXfer(&in6OvLap1, 10000); ... BulkInEpt6->FinishDataXfer(buf[0], 1024, &in6OvLap1, inContext61); ... CloseHandle(in6OvLap1.hEvent); ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndreyS 0 25 ноября, 2008 Опубликовано 25 ноября, 2008 · Жалоба В документе FX2 TechRefManual.pdf написано: (что за “Chirp” protocol я там так и не нашел). Но зато в 7 главе есть следующее: Добрый день. Ну для начала внимательно смотрим на то что написано. Вами указано именно ссылка на главу 7 USB2.0 спецификации, а не пользовательской инструкции FX2. Ну а если вы там почитаете внимательно, то там идет описание выхода устройства на High speed режим. И самое главное. Если у вас хост не high speed, то FX2 не перейдет на бфструю скорость. И наоборот. Если у вас хост 2.0, то несущая у вас будет с FX2 именно 480Мбит. Даже если вы скажете FX2, что работатете на full speed (пропускная способность кончно упадет, но несущая будет 480МГц). В свое время пытался из-за глюков (потеря данных, периодическое пропадание устройства в системе) на плохом кабеле, но с хостом USB2.0 заставить всеми силами FX2 перейти на несущую 12мбит. Но без отключения хаба 2.0 в компе этого не происходит. И виноват в этом Chirp протокол :) Он работает на нижнем уровне и на него нет возможности повлиять со стороны FX2. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
-=HermiT=- 0 26 ноября, 2008 Опубликовано 26 ноября, 2008 · Жалоба Вами указано именно ссылка на главу 7 USB2.0 спецификации, а не пользовательской инструкции FX2. :) да точно, я как-то даже и не заметил. Спасибо за ответ. Спецификацию изучу Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Konst_777 0 26 ноября, 2008 Опубликовано 26 ноября, 2008 · Жалоба Если у вас хост 2.0, то несущая у вас будет с FX2 именно 480Мбит. Даже если вы скажете FX2, что работатете на full speed (пропускная способность кончно упадет, но несущая будет 480МГц). В разделе "3.1 Disabling High-speed Chirp via EEPROM Config Byte" документа "Migrating From EZ-USB FX2™ to EZ-USB FX2LP™" (fx2_to_fx2lp.pdf) описано, как заставить FX2/FX2LP работать на Full Speed с High Speed хостом. В свое время пытался из-за глюков (потеря данных, периодическое пропадание устройства в системе) на плохом кабеле, но с хостом USB2.0 заставить всеми силами FX2 перейти на несущую 12мбит. Но без отключения хаба 2.0 в компе этого не происходит. И виноват в этом Chirp протокол :) Он работает на нижнем уровне и на него нет возможности повлиять со стороны FX2. Сам такую задачу не решал, так что, сейчас буду фантазировать :) Можно так: подключиться с разрешенным “Chirp”, затем проанализировать, если в течении определенного времени хост не присваивает адрес FX2/FX2LP, хотя VBUS присутствует, то FX2/FX2LP устанавливает в "1" бит 1 недокументированного регистра CT1 и переподключается к USB. Дальше: наличие сбоев обмена анализировать по регистрам USBERRIE, USBERRIRQ, ERRCNTLIM, CLRERRCNT. Если число сбоев больше допустимого, то опять таки, переключить FX2/FX2LP в режим Full Speed. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
-=HermiT=- 0 27 ноября, 2008 Опубликовано 27 ноября, 2008 (изменено) · Жалоба В общем на этом грабли на пути достижения высокой скорости передачи не закончились. Пытался передать на компьютер 32 МБ. Попытался на 40.9 МБ/с - не получилось. Пришлось понизить скорость заполнения pipes. Стабильной передачи удалось добиться на скорости примерно 11.7 МБ/с. Дальнейшие эксперименты показали, что на скорости 40,9 МБ/с нормально передается около 1020 кБ, бОльшие объемы информации на такой скорости компьютер не успевает принимать. Проверил программу на нескольких компьютерах. Там где система была послабее, не удавалось достичь и скорости 6 МБ/с. При этом программа грузит два ядра процессора практически на 100%. Вот код const int kmax = 1023;//8192;//65536; const int kmax_2 = kmax / 2; char *buf = new char[kmax * 1024]; //------------------------------------- OVERLAPPED in6OvLap[kmax_2], in8OvLap[kmax_2]; for (int i = 0; i < kmax_2; i++) { in6OvLap[i].hEvent = CreateEvent(NULL, false, false, NULL); in8OvLap[i].hEvent = CreateEvent(NULL, false, false, NULL); } // BeginDataXfer UCHAR *inContext6[kmax_2]; UCHAR *inContext8[kmax_2]; for (int i = 0; i < kmax_2; i++) { int i_base = 2 * i * 1024; UCHAR *buf2 = buf + i_base; UCHAR *buf3 = buf + i_base + 1024; inContext6[i] = BulkInEpt6->BeginDataXfer(buf2, 1024 , &in6OvLap[i]); inContext8[i] = BulkInEpt8->BeginDataXfer(buf3, 1024 , &in8OvLap[i]); } // WaitForXfer for (int i = 0; i < kmax_2; i++) { BulkInEpt6->WaitForXfer(&in6OvLap[i], 10000); BulkInEpt8->WaitForXfer(&in8OvLap[i], 10000); } // FinishDataXfer for (int i = 0; i < kmax_2; i++) { int i_base = 2 * i * 1024; UCHAR *buf2 = buf + i_base; UCHAR *buf3 = buf + i_base + 1024; BulkInEpt6->FinishDataXfer(buf2, 1024 , &in6OvLap[i], inContext6[i]); BulkInEpt8->FinishDataXfer(buf3, 1024 , &in8OvLap[i], inContext8[i]); } // CloseHandle for (int i = 0; i < kmax_2; i++) { CloseHandle(in6OvLap[i].hEvent); CloseHandle(in8OvLap[i].hEvent); } //------------------------------------- delete [] buf; Изменено 27 ноября, 2008 пользователем -=HermiT=- Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndreyS 0 29 ноября, 2008 Опубликовано 29 ноября, 2008 · Жалоба В разделе "3.1 Disabling High-speed Chirp via EEPROM Config Byte" документа "Migrating From EZ-USB FX2™ to EZ-USB FX2LP™" (fx2_to_fx2lp.pdf) описано, как заставить FX2/FX2LP работать на Full Speed с High Speed хостом. Сам такую задачу не решал, так что, сейчас буду фантазировать :) Можно так: подключиться с разрешенным “Chirp”, затем проанализировать, если в течении определенного времени хост не присваивает адрес FX2/FX2LP, хотя VBUS присутствует, то FX2/FX2LP устанавливает в "1" бит 1 недокументированного регистра CT1 и переподключается к USB. Дальше: наличие сбоев обмена анализировать по регистрам USBERRIE, USBERRIRQ, ERRCNTLIM, CLRERRCNT. Если число сбоев больше допустимого, то опять таки, переключить FX2/FX2LP в режим Full Speed. Добрый день. Огромное спасибо за ссылку. Этот документ я не читал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndreyS 0 2 декабря, 2008 Опубликовано 2 декабря, 2008 (изменено) · Жалоба В разделе "3.1 Disabling High-speed Chirp via EEPROM Config Byte" документа "Migrating From EZ-USB FX2™ to EZ-USB FX2LP™" (fx2_to_fx2lp.pdf) описано, как заставить FX2/FX2LP работать на Full Speed с High Speed хостом. Добрый день. Нашел этот документ, но в нем нет адреса этого регистра, в даташите об этом регистре тоже ничего нет. Нашел хидер с перечнем недокументированных регистров ( в том числе и адрес этого пресловутого CT1). Но возник резонный вопрос, а дока по ним есть?? :) Я что-то не нашел. Изменено 2 декабря, 2008 пользователем AndreyS Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Konst_777 0 3 декабря, 2008 Опубликовано 3 декабря, 2008 · Жалоба Добрый день. Нашел этот документ, но в нем нет адреса этого регистра, в даташите об этом регистре тоже ничего нет. Нашел хидер с перечнем недокументированных регистров ( в том числе и адрес этого пресловутого CT1). Но возник резонный вопрос, а дока по ним есть?? :) Я что-то не нашел. Я и не искал. Поскольку прочитал в "FX2regs.h", что: / Debug/Test // The following registers are for Cypress's internal testing purposes only. // These registers are not documented in the datasheet or the Technical Reference // Manual as they were not designed for end user application usage EXTERN xdata volatile BYTE DBUG _AT_ 0xE6F8; // Debug EXTERN xdata volatile BYTE TESTCFG _AT_ 0xE6F9; // Test configuration EXTERN xdata volatile BYTE USBTEST _AT_ 0xE6FA; // USB Test Modes EXTERN xdata volatile BYTE CT1 _AT_ 0xE6FB; // Chirp Test--Override EXTERN xdata volatile BYTE CT2 _AT_ 0xE6FC; // Chirp Test--FSM EXTERN xdata volatile BYTE CT3 _AT_ 0xE6FD; // Chirp Test--Control Signals EXTERN xdata volatile BYTE CT4 _AT_ 0xE6FE; // Chirp Test--Inputs Если есть большое желание узнать, как использовать эти регистры, то можно попробовать пообщаться с техподдержкой Cypress. Отвечают они всегда быстро, но, бывает, что результат общения - нулевой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndreyS 0 3 декабря, 2008 Опубликовано 3 декабря, 2008 · Жалоба Если есть большое желание узнать, как использовать эти регистры, то можно попробовать пообщаться с техподдержкой Cypress. Отвечают они всегда быстро, но, бывает, что результат общения - нулевой. Спасибо. Было просто любопытно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MegaElektronik 0 5 декабря, 2008 Опубликовано 5 декабря, 2008 · Жалоба Здравствуйте! Помогите пожалуйста! Проблемма: Имеется CY7C68013A. Написаны дескрипторы и т.д. система определяет USB audio device, как и требовалось, а конкретнее USB Speaker. Драйвер стандартный используется. Тип передачи изохронный. Так вот пытаюсь в него передать данные например Winamp-ом и смотру как данные идут в настройке драйвера выхода (DirectSound вкладка статус), а он пишет что отправил 1280байт (примерно) и стоит. В чем может быть проблемма? В программе для контроллера в функции TD Pool в регистры пишется EP2BCH=0, а EP2BCL=0x80. Чать кода привожу.. void TD_Poll(void) // Called repeatedly while the device is idle { // Audio control action if( !(EP2CS & bmEPEMPTY) ) //EP2CS & bmEPFULL ) // Is there something available { IOB = EP2FIFOBUF[0]; EP2BCH = 0; EP2BCL = 0x80; // Rearm endpoint buffer } } Может кто делал такое и кусочком исходника поделится? Помогите!!! Уже неделю бьюсь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vix 0 5 декабря, 2008 Опубликовано 5 декабря, 2008 · Жалоба Итак, снова о CodeGear 2007 и Builder6. Исключительную ситуацию в CodeGear 2007 вызывают следующие коды 1) ... = new CCyUSBDevice(...); 2) USBDevice->Open(...); Чтобы использовать CyAPI в CodeGear 2007, необходимо написать простую DLL в Builder6. В DLL передается VID & PID, а возвращается указатель на CCyUSBDevice. Далее работаем с CyAPI как обычно. Пример функции из DLL extern "C" __declspec(dllexport) CCyUSBDevice* IUSBDeviceOpen(int VID,int PID){ CCyUSBDevice *USBDevice = new CCyUSBDevice(NULL); int i; int USBDevCount = USBDevice->DeviceCount(); if (USBDevCount == 0) return NULL; for (i = 0; i < USBDevCount; i++) { USBDevice->Open(i); if((USBDevice->VendorID == VID) && (USBDevice->ProductID == PID)) break; } if(i == USBDevCount) return NULL;//"No USB device found"; if(!USBDevice->EndPoints) { USBDevice->ReConnect(); return NULL; } return USBDevice; } Если нужна готовая DLL (со стандартным GUID), могу выложить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
J2post 0 10 декабря, 2008 Опубликовано 10 декабря, 2008 · Жалоба Итак, снова о CodeGear 2007 и Builder6. Исключительную ситуацию в CodeGear 2007 вызывают следующие коды 1) ... = new CCyUSBDevice(...); 2) USBDevice->Open(...); Чтобы использовать CyAPI в CodeGear 2007, необходимо написать простую DLL в Builder6. В DLL передается VID & PID, а возвращается указатель на CCyUSBDevice. Далее работаем с CyAPI как обычно. Пример функции из DLL extern "C" __declspec(dllexport) CCyUSBDevice* IUSBDeviceOpen(int VID,int PID){ CCyUSBDevice *USBDevice = new CCyUSBDevice(NULL); int i; int USBDevCount = USBDevice->DeviceCount(); if (USBDevCount == 0) return NULL; for (i = 0; i < USBDevCount; i++) { USBDevice->Open(i); if((USBDevice->VendorID == VID) && (USBDevice->ProductID == PID)) break; } if(i == USBDevCount) return NULL;//"No USB device found"; if(!USBDevice->EndPoints) { USBDevice->ReConnect(); return NULL; } return USBDevice; } Если нужна готовая DLL (со стандартным GUID), могу выложить. Очень интересует такой вопрос, а для VC будет работать эта DLL написанная в Borlande?????????? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vix 0 10 декабря, 2008 Опубликовано 10 декабря, 2008 · Жалоба Очень интересует такой вопрос, а для VC будет работать эта DLL написанная в Borlande?????????? Маловероятно. Пробуйте. А лучше в более старой студии создайте аналогичную DLL. USB_CY_DLL.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
J2post 0 10 декабря, 2008 Опубликовано 10 декабря, 2008 · Жалоба Маловероятно. Пробуйте. А лучше в более старой студии создайте аналогичную DLL. Ого как оперативно, спасибо за такое внимание. Вообще у меня следующая проблема, не знаю как прикрутить эту библиотеку к компилятору MinGW (осваиваю Qt4), есть вариант написать СОМ обьект, но не хочется заморачиваться. Как думаете что поможет в моем случае? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться