From cc1bffac15294c040eb55ed39d4be845a858be72 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Sat, 27 Apr 2013 10:18:20 +0000 Subject: [PATCH] Fixed bug #405. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/stable_2.4.x@5636 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/hal/dox/usb.dox | 24 ++++++++++++++---------- os/hal/src/usb.c | 4 ++-- readme.txt | 1 + 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/os/hal/dox/usb.dox b/os/hal/dox/usb.dox index 6c3806f76..cb086bb2a 100644 --- a/os/hal/dox/usb.dox +++ b/os/hal/dox/usb.dox @@ -51,7 +51,7 @@ uninit [label="USB_UNINIT", style="bold"]; ready [label="USB_READY\nClock Enabled"]; selected [label="\nUSB_SELECTED\naddress\nassigned"]; - configured [label="\nUSB_ACTIVE\nconfiguration\nselected"]; + active [label="\nUSB_ACTIVE\nconfiguration\nselected"]; uninit -> stop [label=" usbInit()", constraint=false]; stop -> stop [label="\nusbStop()"]; @@ -60,12 +60,14 @@ ready -> ready [label="\n\nusbStart()"]; ready -> ready [label="\nSUSPEND/WAKEUP\n>event_cb<"]; ready -> selected [label="\nSET_ADDRESS\n>event_cb<"]; + selected -> stop [label="\nusbStop()"]; selected -> ready [label="\nUSB RESET\n>event_cb<"]; selected -> selected [label="\nSUSPEND/WAKEUP\n>event_cb<\n\nValid EP0 Message\n>requests_hook_cb<\n\nGET DESCRIPTOR\n>get_descriptor_cb<"]; - selected -> configured [label="\nSET_CONF(n)\n>event_cb<"]; - configured -> selected [label="\nSET_CONF(0)\n>event_cb<"]; - configured -> configured [label="\nSUSPEND/WAKEUP\n>event_cb<\n\nValid EP0 Message\n>requests_hook_cb<\n\nGET DESCRIPTOR\n>get_descriptor_cb<\n\nEndpoints Activity\n >in_cb< or >out_cb<"]; - configured -> ready [label="\nUSB RESET\n>event_cb<"]; + selected -> active [label="\nSET_CONF(n)\n>event_cb<"]; + active -> stop [label="\nusbStop()"]; + active -> selected [label="\nSET_CONF(0)\n>event_cb<"]; + active -> active [label="\nSUSPEND/WAKEUP\n>event_cb<\n\nValid EP0 Message\n>requests_hook_cb<\n\nGET DESCRIPTOR\n>get_descriptor_cb<\n\nEndpoints Activity\n >in_cb< or >out_cb<"]; + active -> ready [label="\nUSB RESET\n>event_cb<"]; } * @enddot * @else @@ -80,7 +82,7 @@ uninit [label="USB_UNINIT", style="bold"]; ready [label="USB_READY\nClock Enabled"]; selected [label="\nUSB_SELECTED\naddress\nassigned"]; - configured [label="\nUSB_ACTIVE\nconfiguration\nselected"]; + active [label="\nUSB_ACTIVE\nconfiguration\nselected"]; uninit -> stop [label=" usbInit()", constraint=false]; stop -> stop [label="\nusbStop()"]; @@ -89,12 +91,14 @@ ready -> ready [label="\n\nusbStart()"]; ready -> ready [label="\nSUSPEND/WAKEUP\n>event_cb<"]; ready -> selected [label="\nSET_ADDRESS\n>event_cb<"]; + selected -> stop [label="\nusbStop()"]; selected -> ready [label="\nUSB RESET\n>event_cb<"]; selected -> selected [label="\nSUSPEND/WAKEUP\n>event_cb<\n\nValid EP0 Message\n>requests_hook_cb<\n\nGET DESCRIPTOR\n>get_descriptor_cb<"]; - selected -> configured [label="\nSET_CONF(n)\n>event_cb<"]; - configured -> selected [label="\nSET_CONF(0)\n>event_cb<"]; - configured -> configured [label="\nSUSPEND/WAKEUP\n>event_cb<\n\nValid EP0 Message\n>requests_hook_cb<\n\nGET DESCRIPTOR\n>get_descriptor_cb<\n\nEndpoints Activity\n >in_cb< or >out_cb<"]; - configured -> ready [label="\nUSB RESET\n>event_cb<"]; + selected -> active [label="\nSET_CONF(n)\n>event_cb<"]; + active -> stop [label="\nusbStop()"]; + active -> selected [label="\nSET_CONF(0)\n>event_cb<"]; + active -> active [label="\nSUSPEND/WAKEUP\n>event_cb<\n\nValid EP0 Message\n>requests_hook_cb<\n\nGET DESCRIPTOR\n>get_descriptor_cb<\n\nEndpoints Activity\n >in_cb< or >out_cb<"]; + active -> ready [label="\nUSB RESET\n>event_cb<"]; } * @enddot * @endif diff --git a/os/hal/src/usb.c b/os/hal/src/usb.c index 9e5f6e353..04873e862 100644 --- a/os/hal/src/usb.c +++ b/os/hal/src/usb.c @@ -289,8 +289,8 @@ void usbStop(USBDriver *usbp) { chDbgCheck(usbp != NULL, "usbStop"); chSysLock(); - chDbgAssert((usbp->state == USB_STOP) || (usbp->state == USB_READY), - "usbStop(), #1", "invalid state"); + chDbgAssert((usbp->state == USB_STOP) || (usbp->state == USB_READY) || + (usbp->state == USB_SELECTED) || (usbp->state == USB_ACTIVE), usb_lld_stop(usbp); usbp->state = USB_STOP; chSysUnlock(); diff --git a/readme.txt b/readme.txt index 3e4df282c..c6abf9bc3 100644 --- a/readme.txt +++ b/readme.txt @@ -79,6 +79,7 @@ ***************************************************************************** *** 2.4.4 *** +- FIX: Fixed USB driver cannot be stopped (bug #405). - FIX: Fixed fixed I2C malfunction after fixing bug 3607518 (bug 3607549). - FIX: Fixed spurious interrupt disabling an STM32 DMA stream (bug 3607518). - FIX: Fixed start of any ADC disables VREF and VBAT (bug 3607467).