Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: проблема с serial usb в ecos
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы
asket
Прошу помочь разобраться с проблемой, пишу приложение для 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
Хорошо поставлю вопрос по другому, обязательно ли в пакете конфигурации 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
Разобрался! windows будет работать с классом устройств ACM, а у меня по умолчанию стоит generic. Может кому-то будет интересно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.