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
stm32F1x serial_usb circular buffer
- Giovanni
- Site Admin
- Posts: 14457
- 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
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
After run latency_test you should see something like
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");
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");
Re: stm32F1x serial_usb circular buffer
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 .
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 .
Last edited by linvinus on Wed Sep 21, 2011 4:06 pm, edited 2 times in total.
- Giovanni
- Site Admin
- Posts: 14457
- 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
It's OK, there were some pretty good ideas discussed here.
Giovanni
Giovanni
Re: stm32F1x serial_usb circular buffer
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 .
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 .
- Giovanni
- Site Admin
- Posts: 14457
- 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
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
Giovanni
Re: stm32F1x serial_usb circular buffer
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.
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?
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.
- Giovanni
- Site Admin
- Posts: 14457
- 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
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
The issue with the I-class function is known, this is why the USB API is going to be reworked.
Giovanni
Re: stm32F1x serial_usb circular buffer
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.
- Giovanni
- Site Admin
- Posts: 14457
- 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
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 70 guests