Fixed bug #531.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@7273 35acf78f-673a-0410-8e92-d51de3d6d3f4master
parent
653a7e9ad0
commit
a8042eea48
|
@ -32,12 +32,13 @@
|
||||||
/* Driver local definitions. */
|
/* Driver local definitions. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
#define TRDT_VALUE 5
|
#define TRDT_VALUE 5
|
||||||
|
|
||||||
#define EP0_MAX_INSIZE 64
|
#define EP0_MAX_INSIZE 64
|
||||||
|
#define EP0_MAX_OUTSIZE 64
|
||||||
/*===========================================================================*/
|
|
||||||
/* Driver exported variables. */
|
/*===========================================================================*/
|
||||||
|
/* Driver exported variables. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
/** @brief OTG_FS driver identifier.*/
|
/** @brief OTG_FS driver identifier.*/
|
||||||
|
@ -589,13 +590,29 @@ static void otg_epout_handler(USBDriver *usbp, usbep_t ep) {
|
||||||
specific callback.*/
|
specific callback.*/
|
||||||
_usb_isr_invoke_setup_cb(usbp, ep);
|
_usb_isr_invoke_setup_cb(usbp, ep);
|
||||||
|
|
||||||
}
|
}
|
||||||
if ((epint & DOEPINT_XFRC) && (otgp->DOEPMSK & DOEPMSK_XFRCM)) {
|
if ((epint & DOEPINT_XFRC) && (otgp->DOEPMSK & DOEPMSK_XFRCM)) {
|
||||||
/* Receive transfer complete.*/
|
/* Receive transfer complete.*/
|
||||||
_usb_isr_invoke_out_cb(usbp, ep);
|
USBOutEndpointState *osp = usbp->epc[ep]->out_state;
|
||||||
}
|
|
||||||
}
|
if (osp->rxsize < osp->totsize) {
|
||||||
|
/* In case the transaction covered only part of the total transfer
|
||||||
|
then another transaction is immediately started in order to
|
||||||
|
cover the remaining.*/
|
||||||
|
osp->rxsize = osp->totsize - osp->rxsize;
|
||||||
|
osp->rxcnt = 0;
|
||||||
|
usb_lld_prepare_receive(usbp, ep);
|
||||||
|
chSysLockFromIsr();
|
||||||
|
usb_lld_start_out(usbp, ep);
|
||||||
|
chSysUnlockFromIsr();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* End on OUT transfer.*/
|
||||||
|
_usb_isr_invoke_out_cb(usbp, ep);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief OTG shared ISR.
|
* @brief OTG shared ISR.
|
||||||
*
|
*
|
||||||
|
@ -1140,12 +1157,16 @@ void usb_lld_read_setup(USBDriver *usbp, usbep_t ep, uint8_t *buf) {
|
||||||
*/
|
*/
|
||||||
void usb_lld_prepare_receive(USBDriver *usbp, usbep_t ep) {
|
void usb_lld_prepare_receive(USBDriver *usbp, usbep_t ep) {
|
||||||
uint32_t pcnt;
|
uint32_t pcnt;
|
||||||
USBOutEndpointState *osp = usbp->epc[ep]->out_state;
|
USBOutEndpointState *osp = usbp->epc[ep]->out_state;
|
||||||
|
|
||||||
/* Transfer initialization.*/
|
/* Transfer initialization.*/
|
||||||
pcnt = (osp->rxsize + usbp->epc[ep]->out_maxsize - 1) /
|
osp->totsize = osp->rxsize;
|
||||||
usbp->epc[ep]->out_maxsize;
|
if ((ep == 0) && (osp->rxsize > EP0_MAX_OUTSIZE))
|
||||||
usbp->otg->oe[ep].DOEPTSIZ = DOEPTSIZ_STUPCNT(3) | DOEPTSIZ_PKTCNT(pcnt) |
|
osp->rxsize = EP0_MAX_OUTSIZE;
|
||||||
|
|
||||||
|
pcnt = (osp->rxsize + usbp->epc[ep]->out_maxsize - 1) /
|
||||||
|
usbp->epc[ep]->out_maxsize;
|
||||||
|
usbp->otg->oe[ep].DOEPTSIZ = DOEPTSIZ_STUPCNT(3) | DOEPTSIZ_PKTCNT(pcnt) |
|
||||||
DOEPTSIZ_XFRSIZ(osp->rxsize);
|
DOEPTSIZ_XFRSIZ(osp->rxsize);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -260,10 +260,14 @@ typedef struct {
|
||||||
* @brief Pointer to the input queue.
|
* @brief Pointer to the input queue.
|
||||||
*/
|
*/
|
||||||
input_queue_t *rxqueue;
|
input_queue_t *rxqueue;
|
||||||
} queue;
|
} queue;
|
||||||
} mode;
|
} mode;
|
||||||
} USBOutEndpointState;
|
/**
|
||||||
|
* @brief Total transmit transfer size.
|
||||||
|
*/
|
||||||
|
size_t totsize;
|
||||||
|
} USBOutEndpointState;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Type of an USB endpoint configuration structure.
|
* @brief Type of an USB endpoint configuration structure.
|
||||||
* @note Platform specific restrictions may apply to endpoints.
|
* @note Platform specific restrictions may apply to endpoints.
|
||||||
|
|
Loading…
Reference in New Issue