/** Local function to handle outgoing bulk data @param [in] bEP @param [in] bEPStatus */ static void BulkIn(U8 bEP, U8 bEPStatus) { int i, iLen; if (_fifo_avail(&txfifo) == 0) { // no more data, disable further NAK interrupts until next USB frame USBHwNakIntEnable(0); return; } // get bytes from transmit FIFO into intermediate buffer for (i = 0; i < MAX_PACKET_SIZE; i++) { if (!_fifo_get(&txfifo, &abBulkBuf[i])) { break; } } iLen = i; // send over USB if (iLen > 0) { USBHwEPWrite(bEP, abBulkBuf, iLen); } }
/** Local function to handle outgoing bulk data @param [in] bEP @param [in] bEPStatus */ static void BulkIn(U8 bEP, U8 bEPStatus) { int i, iLen; // Verifica se não há data para enviar ao PC if (_fifo_avail(&txfifo) == 0) { // no more data, disable further NAK interrupts until next USB frame USBHwNakIntEnable(0); // não é gerada nenhuma interrupção sempre que o host tenta ler/escrever nos EPs mas este estão cheios/vazios. return; } // get bytes from transmit FIFO into intermediate buffer for (i = 0; i < MAX_PACKET_SIZE; i++) { if (!_fifo_get(&txfifo, &abBulkBuf[i])) { break; // sai do ciclo quando o fifo fica vazio, terminando a transferência de informação do &txfifo para &abBulkBuf[]. } } iLen = i; // send over USB if (iLen > 0) { USBHwEPWrite(bEP, abBulkBuf, iLen); } }
int16_t fifo_get_nowait (fifo_t* f) { if (!f->count) return -1; return (int)_fifo_get(f); }
// Atomic version unsigned char fifo_get(fifo_t *fifo, unsigned char *pc) { unsigned char t; NVIC_DisableIRQ(USB_IRQn); t = _fifo_get(fifo, pc); NVIC_EnableIRQ(USB_IRQn); return t; }
uint8_t fifo_get_wait (fifo_t* f) { while (!f->count); return _fifo_get(f); }