asket 0 16 мая, 2012 Опубликовано 16 мая, 2012 · Жалоба Прошу помочь разобраться с проблемой, пишу приложение для at91sam9263 под rtos eCos с использованием встроенных функции eCOS serial USB. Нашел драйвер под win xp/7 ecosusbserial.inf как было описано в доке по eCos, и установил, однако win 7 обнаружила данное устройство, но отказывается его обслуживать, в диспетчере устройств напротив порта восклицательный знак и выдает сообщение, что не в состоянии его запустить, код 10. Если через тот же шнур подключить SAM-BA в режиме RomBoot, то работает нормально, без нареканий. Привожу исходник тестового приложения на ecos: #define BUF_SIZE 4096 static cyg_uint8 rx_buf[2][BUF_SIZE+1], tx_buf[BUF_SIZE+1]; // -------------------------------------------------------------------------- // Thread receives packets from the USB and sends them out the serial port // It uses a buffered stdio input, an un-buffered low-level file output. // This isn't terribly efficient, but rather an example of both methods. void usb2ser_func(cyg_addrword_t data) { int n; unsigned ibuf, next_buf; DBG("Usb2Ser: Thread starting\n"); // Give the USB receiver an adequate buffer. // setvbuf(rxf, usb2ser_buf, _IOFBF, BUF_SIZE); ibuf = 0; while (1) { // ----- Wait for the host to configure ----- DBG("Usb2Ser: Waiting for USB configuration\n"); usbs_serial_wait_until_configured(); cyg_thread_delay((cyg_tick_count_t) 10); // ----- While configured read data & send out serial port ----- DBG("Usb2Ser: USB configured\n"); usbs_serial_start_rx(&usbs_ser0, rx_buf[ibuf], BUF_SIZE); while (usbs_serial_is_configured()) { n = usbs_serial_wait_for_rx(&usbs_ser0); next_buf = ibuf ^ 1; usbs_serial_start_rx(&usbs_ser0, rx_buf[next_buf], BUF_SIZE); if (n < 0) { DBG("*** I/O Error: %d ***\n", n); } else { rx_buf[ibuf][n] = '\0'; DBG("%s", rx_buf[ibuf]); } ibuf = next_buf; } } } // -------------------------------------------------------------------------- // Thread receives packets from the serial port and sends them out the USB // It uses a buffered stdio input, an un-buffered low-level file output. // This isn't terribly efficient, but rather an example of both methods. void ser2usb_func(cyg_addrword_t data) { int n; DBG("Ser2Usb: Thread starting\n"); while (1) { // ----- Wait for the host to configure ----- DBG("Ser2Usb: Waiting for USB configuration\n"); usbs_serial_wait_until_configured(); cyg_thread_delay((cyg_tick_count_t) 10); // ----- While configured read data & send out serial port ----- DBG("Ser2Usb: USB configured\n"); while (usbs_serial_is_configured()) { n = 5; memset(tx_buf, 0xAA, n); usbs_serial_tx(&usbs_ser0, tx_buf, n); cyg_thread_delay((cyg_tick_count_t) 1000); } } } // -------------------------------------------------------------------------- // Application Startup // -------------------------------------------------------------------------- int main(void) { DBG("Entering usb_serial_send function\n"); cyg_thread_create(4, usb2ser_func, (cyg_addrword_t) 0, "Usb2Serial", (void *) stack[0], THREAD_STACK_SIZE, &usb2ser_thread, &thread[0]); cyg_thread_create(4, ser2usb_func, (cyg_addrword_t) 1, "Serial2Usb", (void *) stack[1], THREAD_STACK_SIZE, &ser2usb_thread, &thread[1]); // Start USB subsystem usbs_serial_start(); // Start the threads running. cyg_thread_resume(usb2ser_thread); cyg_thread_resume(ser2usb_thread); #if 1 char ch = 0; while (ch != 'q') { printf("\r\nPress `q' to quit"); scanf("%c", &ch); } #else for (;;) { } #endif CYGACC_CALL_IF_RESET(); //CYGACC_CALL_IF_MONITOR_RETURN(0); // return to RedBoot return 0; } Это измененный пример тестового исходника из пакета eCos. Вот что выдает приложение при подключении к ПК. Entering usb_serial_send function ### 4:Reset ### Usb2Ser: Thread star### 132:<null> ### ting Usb2Ser: Waiting for USB configuration Ser2Usb: Thread starting Ser2Usb: Waiting for USB configuration Press `q' to quit### 4:Reset ### ### 3:Powered ### ### 4:Reset ### ### 3:Powered ### ### 4:Reset ### ### 5:Addressed ### ### 6:Configured ### ### 6:Configured ### Usb2Ser: USB configured Ser2Usb: USB configured Прошу помочь, на что нужно обратить внимание. Спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
asket 0 17 мая, 2012 Опубликовано 17 мая, 2012 · Жалоба Хорошо поставлю вопрос по другому, обязательно ли в пакете конфигурации USB должен быть присутствовать класс устройства USB CDC=0x02 для virtual com port, в нынешной сборке ecos почему-то не указали класс устройств USB (0x00), может ли из-за этого драйвер некорректно работать с данным устройством? вот так выглядет пакет описания дескриптора Device Descriptor eCos USB Serial Device Offset Field Size Value Description 0 bLength 1 12h 1 bDescriptorType 1 01h Device 2 bcdUSB 2 0200h USB Spec 2.0 4 bDeviceClass 1 00h Class info in Ifc Descriptors (!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!) 5 bDeviceSubClass 1 00h 6 bDeviceProtocol 1 00h 7 bMaxPacketSize0 1 08h 8 bytes 8 idVendor 2 FFFFh 10 idProduct 2 0001h 12 bcdDevice 2 0000h 0.00 14 iManufacturer 1 01h "eCos" 15 iProduct 1 02h "eCos USB Serial Device" 16 iSerialNumber 1 00h 17 bNumConfigurations 1 01h Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
asket 0 17 мая, 2012 Опубликовано 17 мая, 2012 (изменено) · Жалоба Разобрался! windows будет работать с классом устройств ACM, а у меня по умолчанию стоит generic. Может кому-то будет интересно. Изменено 17 мая, 2012 пользователем asket Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться