USBv1 driver optimization and removal of a potential race condition (not demonstrated).
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@15071 27425a3e-05d8-49a3-a47f-9c15f0e5edd8
This commit is contained in:
parent
655ea2923c
commit
5eec7b1b55
|
@ -283,16 +283,17 @@ static void usb_packet_write_from_buffer(usbep_t ep,
|
||||||
* @brief Common ISR code, serves the EP-related interrupts.
|
* @brief Common ISR code, serves the EP-related interrupts.
|
||||||
*
|
*
|
||||||
* @param[in] usbp pointer to the @p USBDriver object
|
* @param[in] usbp pointer to the @p USBDriver object
|
||||||
* @param[in] ep endpoint number
|
* @param[in] istr ISTR register value to consider
|
||||||
*
|
*
|
||||||
* @notapi
|
* @notapi
|
||||||
*/
|
*/
|
||||||
static void usb_serve_endpoints(USBDriver *usbp, uint32_t ep) {
|
static void usb_serve_endpoints(USBDriver *usbp, uint32_t istr) {
|
||||||
|
uint32_t ep = istr & ISTR_EP_ID_MASK;
|
||||||
size_t n;
|
size_t n;
|
||||||
uint32_t epr = STM32_USB->EPR[ep];
|
uint32_t epr = STM32_USB->EPR[ep];
|
||||||
const USBEndpointConfig *epcp = usbp->epc[ep];
|
const USBEndpointConfig *epcp = usbp->epc[ep];
|
||||||
|
|
||||||
if (epr & EPR_CTR_TX) {
|
if ((istr & ISTR_DIR) == 0U) {
|
||||||
/* IN endpoint, transmission.*/
|
/* IN endpoint, transmission.*/
|
||||||
USBInEndpointState *isp = epcp->in_state;
|
USBInEndpointState *isp = epcp->in_state;
|
||||||
|
|
||||||
|
@ -318,7 +319,7 @@ static void usb_serve_endpoints(USBDriver *usbp, uint32_t ep) {
|
||||||
_usb_isr_invoke_in_cb(usbp, ep);
|
_usb_isr_invoke_in_cb(usbp, ep);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (epr & EPR_CTR_RX) {
|
else {
|
||||||
/* OUT endpoint, receive.*/
|
/* OUT endpoint, receive.*/
|
||||||
|
|
||||||
EPR_CLEAR_CTR_RX(ep);
|
EPR_CLEAR_CTR_RX(ep);
|
||||||
|
@ -375,7 +376,7 @@ OSAL_IRQ_HANDLER(STM32_USB1_HP_HANDLER) {
|
||||||
/* Endpoint events handling.*/
|
/* Endpoint events handling.*/
|
||||||
istr = STM32_USB->ISTR;
|
istr = STM32_USB->ISTR;
|
||||||
while (istr & ISTR_CTR) {
|
while (istr & ISTR_CTR) {
|
||||||
usb_serve_endpoints(usbp, istr & ISTR_EP_ID_MASK);
|
usb_serve_endpoints(usbp, istr);
|
||||||
istr = STM32_USB->ISTR;
|
istr = STM32_USB->ISTR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -395,12 +396,12 @@ OSAL_IRQ_HANDLER(STM32_USB1_LP_HANDLER) {
|
||||||
|
|
||||||
OSAL_IRQ_PROLOGUE();
|
OSAL_IRQ_PROLOGUE();
|
||||||
|
|
||||||
|
/* Reading interrupt sources and atomically clearing them.*/
|
||||||
istr = STM32_USB->ISTR;
|
istr = STM32_USB->ISTR;
|
||||||
|
STM32_USB->ISTR = ~istr;
|
||||||
|
|
||||||
/* USB bus reset condition handling.*/
|
/* USB bus reset condition handling.*/
|
||||||
if (istr & ISTR_RESET) {
|
if (istr & ISTR_RESET) {
|
||||||
STM32_USB->ISTR = ~ISTR_RESET;
|
|
||||||
|
|
||||||
_usb_reset(usbp);
|
_usb_reset(usbp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -410,8 +411,6 @@ OSAL_IRQ_HANDLER(STM32_USB1_LP_HANDLER) {
|
||||||
#if STM32_USB_LOW_POWER_ON_SUSPEND
|
#if STM32_USB_LOW_POWER_ON_SUSPEND
|
||||||
STM32_USB->CNTR |= CNTR_LP_MODE;
|
STM32_USB->CNTR |= CNTR_LP_MODE;
|
||||||
#endif
|
#endif
|
||||||
STM32_USB->ISTR = ~ISTR_SUSP;
|
|
||||||
|
|
||||||
_usb_suspend(usbp);
|
_usb_suspend(usbp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -420,7 +419,6 @@ OSAL_IRQ_HANDLER(STM32_USB1_LP_HANDLER) {
|
||||||
uint32_t fnr = STM32_USB->FNR;
|
uint32_t fnr = STM32_USB->FNR;
|
||||||
if (!(fnr & FNR_RXDP)) {
|
if (!(fnr & FNR_RXDP)) {
|
||||||
STM32_USB->CNTR &= ~CNTR_FSUSP;
|
STM32_USB->CNTR &= ~CNTR_FSUSP;
|
||||||
|
|
||||||
_usb_wakeup(usbp);
|
_usb_wakeup(usbp);
|
||||||
}
|
}
|
||||||
#if STM32_USB_LOW_POWER_ON_SUSPEND
|
#if STM32_USB_LOW_POWER_ON_SUSPEND
|
||||||
|
@ -430,18 +428,16 @@ OSAL_IRQ_HANDLER(STM32_USB1_LP_HANDLER) {
|
||||||
STM32_USB->CNTR |= CNTR_LP_MODE;
|
STM32_USB->CNTR |= CNTR_LP_MODE;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
STM32_USB->ISTR = ~ISTR_WKUP;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SOF handling.*/
|
/* SOF handling.*/
|
||||||
if (istr & ISTR_SOF) {
|
if (istr & ISTR_SOF) {
|
||||||
_usb_isr_invoke_sof_cb(usbp);
|
_usb_isr_invoke_sof_cb(usbp);
|
||||||
STM32_USB->ISTR = ~ISTR_SOF;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Endpoint events handling.*/
|
/* Endpoint events handling.*/
|
||||||
while (istr & ISTR_CTR) {
|
while (istr & ISTR_CTR) {
|
||||||
usb_serve_endpoints(usbp, istr & ISTR_EP_ID_MASK);
|
usb_serve_endpoints(usbp, istr);
|
||||||
istr = STM32_USB->ISTR;
|
istr = STM32_USB->ISTR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -74,6 +74,8 @@
|
||||||
*****************************************************************************
|
*****************************************************************************
|
||||||
|
|
||||||
*** Next ***
|
*** Next ***
|
||||||
|
- NEW: USBv1 driver optimization and removal of a potential race condition
|
||||||
|
(not demonstrated).
|
||||||
- NEW: Added elfAcquireBus()/eflReleaseBus() functions to EFL driver.
|
- NEW: Added elfAcquireBus()/eflReleaseBus() functions to EFL driver.
|
||||||
- NEW: Increased stacks size in RT test suite from 128 to 192. added an
|
- NEW: Increased stacks size in RT test suite from 128 to 192. added an
|
||||||
option to override the stack size by defining THREADS_STACK_SIZE
|
option to override the stack size by defining THREADS_STACK_SIZE
|
||||||
|
|
Loading…
Reference in New Issue