stm32F1x serial_usb circular buffer

This forum is dedicated to feedback, discussions about ongoing or future developments, ideas and suggestions regarding the ChibiOS projects are welcome. This forum is NOT for support.
User avatar
Giovanni
Site Admin
Posts: 14455
Joined: Wed May 27, 2009 8:48 am
Location: Salerno, Italy
Has thanked: 1076 times
Been thanked: 922 times
Contact:

Re: stm32F1x serial_usb circular buffer

Postby Giovanni » Wed Sep 21, 2011 11:25 am

NAKs are sent automatically by the USB hardware when the endpoint is in not ready state. The driver only changes the endpoint state when needed, the protocol is handled automatically.

Anyway, this is a complex matter and I am not yet sure you are experiencing a problem in the driver, the best way ahead would be if you could send me a host application able to lock the standard USB_CDC loopback demo, this way I would be able to do some debug.

As I wrote before the USB driver will be revisited before 2.4.x, it is still work in progress so any contribution is really appreciated.

Giovanni

linvinus
Posts: 19
Joined: Mon Sep 19, 2011 9:09 am

Re: stm32F1x serial_usb circular buffer

Postby linvinus » Wed Sep 21, 2011 1:18 pm

i don't understand where USB_CDC loopback demo, i guess it is chibios/testhal/STM32F1xx/USB_CDC

this code is modified chibios/testhal/STM32F1xx/USB_CDC
it also need
#define HAL_USE_SERIAL TRUE
#define STM32_SERIAL_USE_USART1 TRUE

application on host side shared in this post viewtopic.php?f=3&t=168#p1144

Code: Select all

/*
    ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
                 2011 Giovanni Di Sirio.

    This file is part of ChibiOS/RT.

    ChibiOS/RT is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.

    ChibiOS/RT is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include <stdio.h>
#include <string.h>

#include "ch.h"
#include "hal.h"
#include "test.h"

#include "usb_cdc.h"
#include "shell.h"
#include "chprintf.h"

/*===========================================================================*/
/* USB related stuff.                                                        */
/*===========================================================================*/

/*
 * USB Driver structure.
 */
static SerialUSBDriver SDU1;

/*
 * USB Device Descriptor.
 */
static const uint8_t vcom_device_descriptor_data[18] = {
  USB_DESC_DEVICE       (0x0110,        /* bcdUSB (1.1).                    */
                         0x02,          /* bDeviceClass (CDC).              */
                         0x00,          /* bDeviceSubClass.                 */
                         0x00,          /* bDeviceProtocol.                 */
                         0x40,          /* bMaxPacketSize.                  */
                         0x0483,        /* idVendor (ST).                   */
                         0x5740,        /* idProduct.                       */
                         0x0200,        /* bcdDevice.                       */
                         1,             /* iManufacturer.                   */
                         2,             /* iProduct.                        */
                         3,             /* iSerialNumber.                   */
                         1)             /* bNumConfigurations.              */
};

/*
 * Device Descriptor wrapper.
 */
static const USBDescriptor vcom_device_descriptor = {
  sizeof vcom_device_descriptor_data,
  vcom_device_descriptor_data
};

/* Configuration Descriptor tree for a CDC.*/
static const uint8_t vcom_configuration_descriptor_data[67] = {
  /* Configuration Descriptor.*/
  USB_DESC_CONFIGURATION(67,            /* wTotalLength.                    */
                         0x02,          /* bNumInterfaces.                  */
                         0x01,          /* bConfigurationValue.             */
                         0,             /* iConfiguration.                  */
                         0xC0,          /* bmAttributes (self powered).     */
                         50),           /* bMaxPower (100mA).               */
  /* Interface Descriptor.*/
  USB_DESC_INTERFACE    (0x00,          /* bInterfaceNumber.                */
                         0x00,          /* bAlternateSetting.               */
                         0x01,          /* bNumEndpoints.                   */
                         0x02,          /* bInterfaceClass (Communications
                                           Interface Class, CDC section
                                           4.2).                            */
                         0x02,          /* bInterfaceSubClass (Abstract
                                         Control Model, CDC section 4.3).   */
                         0x01,          /* bInterfaceProtocol (AT commands,
                                           CDC section 4.4).                */
                         0),            /* iInterface.                      */
  /* Header Functional Descriptor (CDC section 5.2.3).*/
  USB_DESC_BYTE         (5),            /* bLength.                         */
  USB_DESC_BYTE         (0x24),         /* bDescriptorType (CS_INTERFACE).  */
  USB_DESC_BYTE         (0x00),         /* bDescriptorSubtype (Header
                                           Functional Descriptor.           */
  USB_DESC_BCD          (0x0110),       /* bcdCDC.                          */
  /* Call Management Functional Descriptor. */
  USB_DESC_BYTE         (5),            /* bFunctionLength.                 */
  USB_DESC_BYTE         (0x24),         /* bDescriptorType (CS_INTERFACE).  */
  USB_DESC_BYTE         (0x01),         /* bDescriptorSubtype (Call Management
                                           Functional Descriptor).          */
  USB_DESC_BYTE         (0x00),         /* bmCapabilities (D0+D1).          */
  USB_DESC_BYTE         (0x01),         /* bDataInterface.                  */
  /* ACM Functional Descriptor.*/
  USB_DESC_BYTE         (4),            /* bFunctionLength.                 */
  USB_DESC_BYTE         (0x24),         /* bDescriptorType (CS_INTERFACE).  */
  USB_DESC_BYTE         (0x02),         /* bDescriptorSubtype (Abstract
                                           Control Management Descriptor).  */
  USB_DESC_BYTE         (0x02),         /* bmCapabilities.                  */
  /* Union Functional Descriptor.*/
  USB_DESC_BYTE         (5),            /* bFunctionLength.                 */
  USB_DESC_BYTE         (0x24),         /* bDescriptorType (CS_INTERFACE).  */
  USB_DESC_BYTE         (0x06),         /* bDescriptorSubtype (Union
                                           Functional Descriptor).          */
  USB_DESC_BYTE         (0x00),         /* bMasterInterface (Communication
                                           Class Interface).                */
  USB_DESC_BYTE         (0x01),         /* bSlaveInterface0 (Data Class
                                           Interface).                      */
  /* Endpoint 2 Descriptor.*/
  USB_DESC_ENDPOINT     (USB_CDC_INTERRUPT_REQUEST_EP|0x80,
                         0x03,          /* bmAttributes (Interrupt).        */
                         0x0008,        /* wMaxPacketSize.                  */
                         0xFF),         /* bInterval.                       */
  /* Interface Descriptor.*/
  USB_DESC_INTERFACE    (0x01,          /* bInterfaceNumber.                */
                         0x00,          /* bAlternateSetting.               */
                         0x02,          /* bNumEndpoints.                   */
                         0x0A,          /* bInterfaceClass (Data Class
                                           Interface, CDC section 4.5).     */
                         0x00,          /* bInterfaceSubClass (CDC section
                                           4.6).                            */
                         0x00,          /* bInterfaceProtocol (CDC section
                                           4.7).                            */
                         0x00),         /* iInterface.                      */
  /* Endpoint 3 Descriptor.*/
  USB_DESC_ENDPOINT     (USB_CDC_DATA_AVAILABLE_EP,     /* bEndpointAddress.*/
                         0x02,          /* bmAttributes (Bulk).             */
                         0x0040,        /* wMaxPacketSize.                  */
                         0x00),         /* bInterval.                       */
  /* Endpoint 1 Descriptor.*/
  USB_DESC_ENDPOINT     (USB_CDC_DATA_REQUEST_EP|0x80,  /* bEndpointAddress.*/
                         0x02,          /* bmAttributes (Bulk).             */
                         0x0040,        /* wMaxPacketSize.                  */
                         0x00)          /* bInterval.                       */
};

/*
 * Configuration Descriptor wrapper.
 */
static const USBDescriptor vcom_configuration_descriptor = {
  sizeof vcom_configuration_descriptor_data,
  vcom_configuration_descriptor_data
};

/*
 * U.S. English language identifier.
 */
static const uint8_t vcom_string0[] = {
  USB_DESC_BYTE(4),                     /* bLength.                         */
  USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType.                 */
  USB_DESC_WORD(0x0409)                 /* wLANGID (U.S. English).          */
};

/*
 * Vendor string.
 */
static const uint8_t vcom_string1[] = {
  USB_DESC_BYTE(38),                    /* bLength.                         */
  USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType.                 */
  'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0,
  'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0,
  'c', 0, 's', 0
};

/*
 * Device Description string.
 */
static const uint8_t vcom_string2[] = {
  USB_DESC_BYTE(56),                    /* bLength.                         */
  USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType.                 */
  'C', 0, 'h', 0, 'i', 0, 'b', 0, 'i', 0, 'O', 0, 'S', 0, '/', 0,
  'R', 0, 'T', 0, ' ', 0, 'V', 0, 'i', 0, 'r', 0, 't', 0, 'u', 0,
  'a', 0, 'l', 0, ' ', 0, 'C', 0, 'O', 0, 'M', 0, ' ', 0, 'P', 0,
  'o', 0, 'r', 0, 't', 0
};

/*
 * Serial Number string.
 */
static const uint8_t vcom_string3[] = {
  USB_DESC_BYTE(8),                     /* bLength.                         */
  USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType.                 */
  '0' + CH_KERNEL_MAJOR, 0,
  '0' + CH_KERNEL_MINOR, 0,
  '0' + CH_KERNEL_PATCH, 0
};

/*
 * Strings wrappers array.
 */
static const USBDescriptor vcom_strings[] = {
  {sizeof vcom_string0, vcom_string0},
  {sizeof vcom_string1, vcom_string1},
  {sizeof vcom_string2, vcom_string2},
  {sizeof vcom_string3, vcom_string3}
};

/*
 * Handles the GET_DESCRIPTOR callback. All required descriptors must be
 * handled here.
 */
static const USBDescriptor *get_descriptor(USBDriver *usbp,
                                           uint8_t dtype,
                                           uint8_t dindex,
                                           uint16_t lang) {

  (void)usbp;
  (void)lang;
  switch (dtype) {
  case USB_DESCRIPTOR_DEVICE:
    return &vcom_device_descriptor;
  case USB_DESCRIPTOR_CONFIGURATION:
    return &vcom_configuration_descriptor;
  case USB_DESCRIPTOR_STRING:
    if (dindex < 4)
      return &vcom_strings[dindex];
  }
  return NULL;
}

/**
 * @brief   EP1 initialization structure (IN only).
 */
static const USBEndpointConfig ep1config = {
  USB_EP_MODE_TYPE_BULK | USB_EP_MODE_PACKET,
  NULL,
  sduDataTransmitted,
  NULL,
  0x0040,
  0x0000,
  NULL,
  NULL
};

/**
 * @brief   EP2 initialization structure (IN only).
 */
static const USBEndpointConfig ep2config = {
  USB_EP_MODE_TYPE_INTR | USB_EP_MODE_PACKET,
  NULL,
  sduInterruptTransmitted,
  NULL,
  0x0010,
  0x0000,
  NULL,
  NULL
};

/**
 * @brief   EP3 initialization structure (OUT only).
 */
static const USBEndpointConfig ep3config = {
  USB_EP_MODE_TYPE_BULK | USB_EP_MODE_PACKET,
  NULL,
  NULL,
  sduDataReceived,
  0x0000,
  0x0040,
  NULL,
  NULL
};

/*
 * Handles the USB driver global events.
 */
static void usb_event(USBDriver *usbp, usbevent_t event) {

  switch (event) {
  case USB_EVENT_RESET:
    return;
  case USB_EVENT_ADDRESS:
    return;
  case USB_EVENT_CONFIGURED:
    /* Enables the endpoints specified into the configuration.
       Note, this callback is invoked from an ISR so I-Class functions
       must be used.*/
    chSysLockFromIsr();
    usbInitEndpointI(usbp, USB_CDC_DATA_REQUEST_EP, &ep1config);
    usbInitEndpointI(usbp, USB_CDC_INTERRUPT_REQUEST_EP, &ep2config);
    usbInitEndpointI(usbp, USB_CDC_DATA_AVAILABLE_EP, &ep3config);
    chSysUnlockFromIsr();
    return;
  case USB_EVENT_SUSPEND:
    return;
  case USB_EVENT_WAKEUP:
    return;
  case USB_EVENT_STALLED:
    return;
  }
  return;
}

/*
 * Serial over USB driver configuration.
 */
static const SerialUSBConfig serusbcfg = {
  &USBD1,
  {
    usb_event,
    get_descriptor,
    sduRequestsHook,
    NULL
  }
};

/*===========================================================================*/
/* Command line related.                                                     */
/*===========================================================================*/

#define SHELL_WA_SIZE   THD_WA_SIZE(2048)
#define TEST_WA_SIZE    THD_WA_SIZE(256)

static void cmd_mem(BaseChannel *chp, int argc, char *argv[]) {
  size_t n, size;

  (void)argv;
  if (argc > 0) {
    chprintf(chp, "Usage: mem\r\n");
    return;
  }
  n = chHeapStatus(NULL, &size);
  chprintf(chp, "core free memory : %u bytes\r\n", chCoreStatus());
  chprintf(chp, "heap fragments   : %u\r\n", n);
  chprintf(chp, "heap free total  : %u bytes\r\n", size);
}

static void cmd_threads(BaseChannel *chp, int argc, char *argv[]) {
  static const char *states[] = {
    "READY",
    "CURRENT",
    "SUSPENDED",
    "WTSEM",
    "WTMTX",
    "WTCOND",
    "SLEEPING",
    "WTEXIT",
    "WTOREVT",
    "WTANDEVT",
    "SNDMSGQ",
    "SNDMSG",
    "WTMSG",
    "FINAL"
  };
  Thread *tp;

  (void)argv;
  if (argc > 0) {
    chprintf(chp, "Usage: threads\r\n");
    return;
  }
  chprintf(chp, "    addr    stack prio refs     state time\r\n");
  tp = chRegFirstThread();
  do {
    chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s %lu\r\n",
            (uint32_t)tp, (uint32_t)tp->p_ctx.r13,
            (uint32_t)tp->p_prio, (uint32_t)(tp->p_refs - 1),
            states[tp->p_state], (uint32_t)tp->p_time);
    tp = chRegNextThread(tp);
  } while (tp != NULL);
}

static void cmd_test(BaseChannel *chp, int argc, char *argv[]) {
  Thread *tp;

  (void)argv;
  if (argc > 0) {
    chprintf(chp, "Usage: test\r\n");
    return;
  }
  tp = chThdCreateFromHeap(NULL, TEST_WA_SIZE, chThdGetPriority(),
                           TestThread, chp);
  if (tp == NULL) {
    chprintf(chp, "out of memory\r\n");
    return;
  }
  chThdWait(tp);
}

static const ShellCommand commands[] = {
  {"mem", cmd_mem},
  {"threads", cmd_threads},
  {"test", cmd_test},
  {NULL, NULL}
};

static const ShellConfig shell_cfg1 = {
  (BaseChannel *)&SDU1,
  commands
};

/*===========================================================================*/
/* Generic code.                                                             */
/*===========================================================================*/

/*
 * Red LED blinker thread, times are in milliseconds.
 */
static WORKING_AREA(waThread1, 128);
static msg_t Thread1(void *arg) {

  (void)arg;
  chRegSetThreadName("blinker");
  while (TRUE) {
    palClearPad(IOPORT3, GPIOC_LED);
    chThdSleepMilliseconds(500);
    palSetPad(IOPORT3, GPIOC_LED);
    chThdSleepMilliseconds(500);
  }
}

/*
 * Application entry point.
 */
int main(void) {
  Thread *shelltp = NULL;

  /*
   * System initializations.
   * - HAL initialization, this also initializes the configured device drivers
   *   and performs the board-specific initializations.
   * - Kernel initialization, the main() function becomes a thread and the
   *   RTOS is active.
   */
  halInit();
  chSysInit();

  sdStart(&SD1, NULL);
  chprintf((struct BaseChannel*)&SD1, "Hello!\r\n");

  /*
   * Activates the USB driver and then the USB bus pull-up on D+.
   */
  sduObjectInit(&SDU1);
  sduStart(&SDU1, &serusbcfg);
  palClearPad(GPIOC, GPIOC_USB_DISC);

  /*
   * Shell manager initialization.
   */
  //shellInit();

  /*
   * Creates the blinker thread.
   */
  chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL);

  /*
   * Normal main() thread activity, in this demo it does nothing except
   * sleeping in a loop and check the button state.
   */
   int count_id=0;
  while (TRUE) {
    //if (!shelltp && (SDU1.config->usbp->state == USB_ACTIVE))
    //  shelltp = shellCreate(&shell_cfg1, SHELL_WA_SIZE, NORMALPRIO);
    //else if (chThdTerminated(shelltp)) {
    //  chThdRelease(shelltp);    /* Recovers memory of the previous shell.   */
    //  shelltp = NULL;           /* Triggers spawning of a new shell.        */
    //}
    //chThdSleepMilliseconds(1000);

    if((SDU1.config->usbp->state == USB_ACTIVE)){
      //short c;
      int count=0;

      while(!chIOGetWouldBlock(&SDU1) ){
        char buf[SERIAL_USB_BUFFERS_SIZE]={0};
        int n=1;
        //n=chIOReadTimeout(&SDU1,&buf,SERIAL_USB_BUFFERS_SIZE,TIME_IMMEDIATE);
        buf[n-1] = (short)chIOGetTimeout(&SDU1,TIME_IMMEDIATE);
        if (buf[n-1] >= 0){
        count+=n;

        //debug message
        chprintf((struct BaseChannel*)&SD1, "012x c=%d %2d F=%2d E=%2d buf=%s total=%d\r\n",(uint8_t)buf[n-1],count,chIQGetFullI(&SDU1.iqueue),chIQGetEmptyI(&SDU1.iqueue),buf,count_id);

        if (buf[n-1] == 'x') {      // 'x' is end of input message
        //answer back to application
          chprintf((struct BaseChannel*)&SDU1, "012x %2d",count);
          count_id++;
          //break;
          }
        }

      }

    }else{
      chThdSleepMilliseconds(100);
    }
  }
}



After run latency_test you should see something like

Code: Select all

./latency_test3
port /dev/ttyACM0 opened
waiting for board to be ready:
.read=120, r =   7 012x  1
ok
read=120, r =   7 012x  6
error reading result2, r=0


and after that CDC is unavailable.



by the way CDC example hangs on
chDbgAssert(usbp->epc[ep] != NULL,
"usbEnableEndpointI(), #2", "already initialized");

(gdb) bt
#0 0x080002f2 in port_halt () at ../../../os/ports/GCC/ARMCMx/chcore.c:41
#1 0x0800155e in usbInitEndpointI (usbp=0x20001064, ep=<value optimized out>, epcp=0x8003560) at ../../../os/hal/src/usb.c:312
#2 0x08002d94 in usb_event (usbp=0x20001064, event=<value optimized out>) at main.c:285
#3 0x080018d0 in default_handler (usbp=0x20001064, ep=<value optimized out>) at ../../../os/hal/src/usb.c:144
#4 _usb_ep0setup (usbp=0x20001064, ep=<value optimized out>) at ../../../os/hal/src/usb.c:594
#5 0x0800248a in Vector90 () at ../../../os/hal/platforms/STM32/USBv1/usb_lld.c:276
#6 <signal handler called>
#7 0x55555554 in ?? ()
#8 0x55555554 in ?? ()

my be it should be?
chDbgAssert(usbp->epc[ep] == NULL,
"usbEnableEndpointI(), #2", "already initialized");

linvinus
Posts: 19
Joined: Mon Sep 19, 2011 9:09 am

Re: stm32F1x serial_usb circular buffer

Postby linvinus » Wed Sep 21, 2011 3:54 pm

Hmm, now i'm understand your logic,

program must check for available data infinitely, to prevent CDC lock,

My mistake, is that i'm checks for available data before call chIOGetTimeout(&SDU1,TIME_IMMEDIATE), which is actually checks for unread data, from USB buffer, through queue callback inotify.

Now it working!
Sorry :roll: .
Last edited by linvinus on Wed Sep 21, 2011 4:06 pm, edited 2 times in total.

User avatar
Giovanni
Site Admin
Posts: 14455
Joined: Wed May 27, 2009 8:48 am
Location: Salerno, Italy
Has thanked: 1076 times
Been thanked: 922 times
Contact:

Re: stm32F1x serial_usb circular buffer

Postby Giovanni » Wed Sep 21, 2011 4:03 pm

It's OK, there were some pretty good ideas discussed here.

Giovanni

linvinus
Posts: 19
Joined: Mon Sep 19, 2011 9:09 am

Re: stm32F1x serial_usb circular buffer

Postby linvinus » Wed Sep 21, 2011 4:13 pm

Now another question :)
why queue callback don't have possibility to pass addition parameters?
If it will have that, then you will not need for dirty trick with passing sdup through iqueue.q_wrptr?

For example
typedef void (*qnotify_t)(GenericQueue *qp,void* data);

I'm don't understand for what use this callback if it can operate only with internal queues parameters .

User avatar
Giovanni
Site Admin
Posts: 14455
Joined: Wed May 27, 2009 8:48 am
Location: Salerno, Italy
Has thanked: 1076 times
Been thanked: 922 times
Contact:

Re: stm32F1x serial_usb circular buffer

Postby Giovanni » Wed Sep 21, 2011 5:53 pm

Just matter of space, the usual use for queues is for I/O and in that role an argument is never required. ChibiOS runs in as low as 1KB of RAM, those few bytes can make the difference.

Giovanni

linvinus
Posts: 19
Joined: Mon Sep 19, 2011 9:09 am

Re: stm32F1x serial_usb circular buffer

Postby linvinus » Wed Sep 21, 2011 6:12 pm

ok, thanks for help!
i didn't understand did you read about Assert in CDC example?
It happens when debugging options enabled. It enabled by default, so by default CDC example don't work.

by the way CDC example hangs on
chDbgAssert(usbp->epc[ep] != NULL,
"usbEnableEndpointI(), #2", "already initialized");

(gdb) bt
#0 0x080002f2 in port_halt () at ../../../os/ports/GCC/ARMCMx/chcore.c:41
#1 0x0800155e in usbInitEndpointI (usbp=0x20001064, ep=<value optimized out>, epcp=0x8003560) at ../../../os/hal/src/usb.c:312
#2 0x08002d94 in usb_event (usbp=0x20001064, event=<value optimized out>) at main.c:285
#3 0x080018d0 in default_handler (usbp=0x20001064, ep=<value optimized out>) at ../../../os/hal/src/usb.c:144
#4 _usb_ep0setup (usbp=0x20001064, ep=<value optimized out>) at ../../../os/hal/src/usb.c:594
#5 0x0800248a in Vector90 () at ../../../os/hal/platforms/STM32/USBv1/usb_lld.c:276
#6 <signal handler called>
#7 0x55555554 in ?? ()
#8 0x55555554 in ?? ()

my be it should be?
chDbgAssert(usbp->epc[ep] == NULL,
"usbEnableEndpointI(), #2", "already initialized");


and another problem, when enabled debugging options
(gdb) bt
#0 0x080007ac in chDbgCheckClassI () at ../../../os/kernel/src/chdebug.c:188
#1 0x080015e0 in usbReadPacketI (usbp=0x20001064, ep=<value optimized out>, buf=0x20000a00 "x@", '1' <repeats 55 times>, "x1111110 249", n=64)
at ../../../os/hal/src/usb.c:375
#2 0x08001ada in inotify (qp=<value optimized out>) at ../../../os/hal/src/serial_usb.c:127
#3 0x08000f5c in chIQGetTimeout (iqp=0x200009c0, time=0) at ../../../os/kernel/src/chqueues.c:179
#4 0x08002fbe in main () at main.c:484

when inotify call usbReadPacketI it call it not from irq context,
i don't know is it normal or not?
Last edited by linvinus on Wed Sep 21, 2011 6:21 pm, edited 2 times in total.

User avatar
Giovanni
Site Admin
Posts: 14455
Joined: Wed May 27, 2009 8:48 am
Location: Salerno, Italy
Has thanked: 1076 times
Been thanked: 922 times
Contact:

Re: stm32F1x serial_usb circular buffer

Postby Giovanni » Wed Sep 21, 2011 6:17 pm

For some reason the USB callback is called twice and the application tries to reinitialize the endpoints, I will look into this.

The issue with the I-class function is known, this is why the USB API is going to be reworked.

Giovanni

linvinus
Posts: 19
Joined: Mon Sep 19, 2011 9:09 am

Re: stm32F1x serial_usb circular buffer

Postby linvinus » Wed Sep 21, 2011 6:24 pm

For some reason the USB callback is called twice and the application tries to reinitialize the endpoints, I will look into this.

no,
i'm check, it happens on startup, when usbInitEndpointI called first time.
second time it happens if reconnect usb cable.

User avatar
Giovanni
Site Admin
Posts: 14455
Joined: Wed May 27, 2009 8:48 am
Location: Salerno, Italy
Has thanked: 1076 times
Been thanked: 922 times
Contact:

Re: stm32F1x serial_usb circular buffer

Postby Giovanni » Wed Sep 21, 2011 6:40 pm

usbp->epc[ep] is set to NULL on an USB RESET condition, it is like the endpoint status is not reset correctly looking at that assertion "already initialized".


Return to “Development and Feedback”

Who is online

Users browsing this forum: No registered users and 15 guests