уже довольно долго мучаюсь с попыткой поднять стек MSD на unicore-mx. портит все дело внезапные остановы отправки пакетов в bulkIN точке. (почемуто на точке0 никаких проблем нету)
вот последний анамнез ставящий меня в тупик:
Код
cm_disable_interrupts();
REBASE(DWC_OTG_DIEPxTSIZ, ep_num) = mc_from_flags(transfer->flags) | DWC_OTG_DIEPTSIZ_PKTCNT(pktcnt) |DWC_OTG_DIEPTSIZ_XFRSIZ(transfer->length);
//* вот тут вот установлен NACK - чтобы точка не вела активность пока в ее ФИФО чтото кидается
REBASE(DWC_OTG_DIEPxCTL, ep_num) = DWC_OTG_DIEPCTL_EPENA | DWC_OTG_DIEPCTL_MPSIZ(transfer->ep_size) | DWC_OTG_DIEPCTL_SNAK | DWC_OTG_DIEPCTL_TXFNUM(ep_num) | ptyp_map[transfer->ep_type] | DWC_OTG_DIEPCTL_USBAEP;
USBD_LOGF_LN(USB_VIO, "USBD:submit urb%"PRIurb" on ep8%"PRIx8" DIEPxTSIZ=%x"
, view_urbid(urb->id), ep_num, REBASE(DWC_OTG_DIEPxTSIZ, ep_num) );
/* Push first packet to memory! */
if (transfer->length) {
/* Enable empty interrupt mask */
REBASE(DWC_OTG_DIEPEMPMSK) |= DWC_OTG_DIEPEMPMSK_INEPTXFEM(ep_num);
urb_to_fifo_1pkt(dev, urb);
}
//* вот тут вот установлен ACK - чтобы точка начала отправку
REBASE(DWC_OTG_DIEPxCTL, ep_num) |= DWC_OTG_DIEPCTL_CNAK;
cm_enable_interrupts();
/* Enable Interrupt */
REBASE(DWC_OTG_DAINTMSK) |= DWC_OTG_DAINTMSK_IEPM(ep_num);
REBASE(DWC_OTG_DIEPxTSIZ, ep_num) = mc_from_flags(transfer->flags) | DWC_OTG_DIEPTSIZ_PKTCNT(pktcnt) |DWC_OTG_DIEPTSIZ_XFRSIZ(transfer->length);
//* вот тут вот установлен NACK - чтобы точка не вела активность пока в ее ФИФО чтото кидается
REBASE(DWC_OTG_DIEPxCTL, ep_num) = DWC_OTG_DIEPCTL_EPENA | DWC_OTG_DIEPCTL_MPSIZ(transfer->ep_size) | DWC_OTG_DIEPCTL_SNAK | DWC_OTG_DIEPCTL_TXFNUM(ep_num) | ptyp_map[transfer->ep_type] | DWC_OTG_DIEPCTL_USBAEP;
USBD_LOGF_LN(USB_VIO, "USBD:submit urb%"PRIurb" on ep8%"PRIx8" DIEPxTSIZ=%x"
, view_urbid(urb->id), ep_num, REBASE(DWC_OTG_DIEPxTSIZ, ep_num) );
/* Push first packet to memory! */
if (transfer->length) {
/* Enable empty interrupt mask */
REBASE(DWC_OTG_DIEPEMPMSK) |= DWC_OTG_DIEPEMPMSK_INEPTXFEM(ep_num);
urb_to_fifo_1pkt(dev, urb);
}
//* вот тут вот установлен ACK - чтобы точка начала отправку
REBASE(DWC_OTG_DIEPxCTL, ep_num) |= DWC_OTG_DIEPCTL_CNAK;
cm_enable_interrupts();
/* Enable Interrupt */
REBASE(DWC_OTG_DAINTMSK) |= DWC_OTG_DAINTMSK_IEPM(ep_num);
останов на последнем операторе - включение прерываний, показывает изумительную картину:
флаг XFRC - установлен, что и понятно, вссь пакет ушел в фифо.
флаг TXFE - чист, а DTXFSTSx - показывает что в фифо завис мой пакет, и никуда не отправляется. при этом DIEPCTL показывает флаг NACKSTS = 0
на этом месте обмен с хостом останавливается, и спустя таймаут хоста требует ресета.
Кто боролся с ФИФО в стмах - расскажите что я нетак курю? как правильно работать с отправкой балк-пакетов?