git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@7273 35acf78f-673a-0410-8e92-d51de3d6d3f4
master
gdisirio 2014-09-14 08:07:49 +00:00
parent 653a7e9ad0
commit a8042eea48
2 changed files with 48 additions and 23 deletions

View File

@ -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);
} }

View File

@ -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.