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

проблема с serial usb в ecos

Прошу помочь разобраться с проблемой, пишу приложение для 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

 

Прошу помочь, на что нужно обратить внимание.

Спасибо

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


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

Хорошо поставлю вопрос по другому, обязательно ли в пакете конфигурации 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

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


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

Разобрался! windows будет работать с классом устройств ACM, а у меня по умолчанию стоит generic. Может кому-то будет интересно.

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

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


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

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

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

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

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

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

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

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

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

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