32 #define __INCLUDE_FROM_USB_DRIVER
33 #include "../../USBMode.h"
35 #if (defined(__LPC175X_6X__) || defined(__LPC177X_8X__) || defined(__LPC407X_8X__)) && defined(USB_CAN_BE_DEVICE)
36 #include "../../Endpoint.h"
38 #define IsOutEndpoint(PhysicalEP) (!((PhysicalEP) & 1) )
40 volatile bool SETUPReceived;
41 volatile bool isOutReceived;
42 volatile bool isInReady;
47 static uint8_t SetupPackage[8] __BSS(USBRAM_SECTION);
48 uint32_t DataInRemainCount, DataInRemainOffset;
49 bool IsConfigured, shortpacket;
52 uint8_t iso_buffer[512] ATTR_ALIGNED(4) __BSS(USBRAM_SECTION);
55 Dummy_EPGetISOAddress);
57 uint32_t BufferAddressIso[32] __BSS(USBRAM_SECTION);
60 void SIE_WriteCommand(
uint32_t cmd) {
74 while ((
USB_REG(0)->DevIntSt & CCEMTY_INT) == 0) ;
99 USB_REG(corenum)->EpIntClr = 0xFFFFFFFF;
100 USB_REG(corenum)->DevIntClr = 0xFFFFFFFF;
101 USB_REG(corenum)->EpIntPri = 0;
104 USB_REG(corenum)->EpDMADis = 0xFFFFFFFF;
105 USB_REG(corenum)->DMARClr = 0xFFFFFFFF;
106 USB_REG(corenum)->EoTIntClr = 0xFFFFFFFF;
107 USB_REG(corenum)->NDDRIntClr = 0xFFFFFFFF;
108 USB_REG(corenum)->SysErrIntClr = 0xFFFFFFFF;
114 IsConfigured =
false;
115 isOutReceived =
false;
139 const uint8_t
Direction,
const uint16_t
Size,
const uint8_t Banks)
143 if ((!IsConfigured) && (PhyEP > 1)) {
148 USB_REG(corenum)->ReEp |= (1 << PhyEP);
150 USB_REG(corenum)->EpInd = PhyEP;
151 USB_REG(corenum)->MaxPSize = Size & 0x3ff;
153 while ((
USB_REG(corenum)->DevIntSt & EP_RLZED_INT) == 0) ;
157 USB_REG(corenum)->EpIntEn |= _BIT(PhyEP);
158 DataInRemainCount = 0;
159 DataInRemainOffset = 0;
164 dmaDescriptor[PhyEP].MaxPacketSize =
Size;
165 dmaDescriptor[PhyEP].Retired = 1;
167 USB_REG(corenum)->EpDMAEn = _BIT(PhyEP);
177 void ReadControlEndpoint(uint8_t *pData)
185 }
while ((cnt &
PKT_RDY) == 0);
188 for (n = 0; n < (cnt + 3) / 4; n++) {
194 if ((cnt > 0) && (SETUPReceived ==
false)) {
195 isOutReceived =
true;
203 void WriteControlEndpoint(uint8_t *pData,
uint32_t cnt)
215 DataInRemainOffset += count;
219 DataInRemainCount = 0;
220 DataInRemainOffset = 0;
225 for (n = 0; n < (count + 3) / 4; n++) {
236 void HAL17XX_SetDeviceAddress(uint8_t Address)
249 memcpy(pData, SetupPackage, 8);
252 void SlaveEndpointISR()
255 for (PhyEP = 0; PhyEP < 2; PhyEP++)
256 if (
USB_REG(0)->EpIntSt & _BIT(PhyEP)) {
257 USB_REG(0)->EpIntClr = _BIT(PhyEP);
263 SIEEndpointStatus =
USB_REG(0)->CmdData;
266 SETUPReceived =
true;
267 ReadControlEndpoint(SetupPackage);
275 if (DataInRemainCount) {
276 WriteControlEndpoint((uint8_t *) (
usb_data_buffer[0] + DataInRemainOffset), DataInRemainCount);
281 WriteControlEndpoint((uint8_t *) (
usb_data_buffer[0] + DataInRemainOffset), DataInRemainCount);
282 DataInRemainOffset = 0;
290 uint16_t totalpackets, uint16_t dummypackets)
294 dummypackets = dummypackets;
296 for (i = 0; i < totalpackets; i++) {
303 for (i = 0; i < totalpackets; i++) {
314 dmaDescriptor[PhyEP].BufferStartAddr = pData;
315 if (dmaDescriptor[PhyEP].Isochronous == 1) {
318 for (BufferCount = 0; BufferCount < cnt / 0xFF; BufferCount++)
319 BufferAddressIso[BufferCount] = 0xFF;
320 BufferAddressIso[BufferCount] = (cnt % 0xFF);
321 if (cnt % 0xFF != 0) {
322 dmaDescriptor[PhyEP].BufferLength = cnt / 0xFF + 1;
325 dmaDescriptor[PhyEP].BufferLength = cnt / 0xFF;
329 dmaDescriptor[PhyEP].BufferLength = 1;
331 dmaDescriptor[PhyEP].IsoBufferAddr = (
uint32_t) BufferAddressIso;
332 dmaDescriptor[PhyEP].Isochronous = 1;
333 dmaDescriptor[PhyEP].MaxPacketSize = 0;
336 dmaDescriptor[PhyEP].BufferLength = cnt;
338 dmaDescriptor[PhyEP].Retired = 0;
339 dmaDescriptor[PhyEP].Status = 0;
340 dmaDescriptor[PhyEP].IsoPacketValid = 0;
341 dmaDescriptor[PhyEP].LSByteExtracted = 0;
342 dmaDescriptor[PhyEP].MSByteExtracted = 0;
343 dmaDescriptor[PhyEP].PresentCount = 0;
345 UDCA[PhyEP] = (
uint32_t) &dmaDescriptor[PhyEP];
346 USB_REG(0)->EpDMAEn = _BIT(PhyEP);
349 void DMAEndTransferISR()
355 if ( EoTIntSt & _BIT(PhyEP) ) {
356 if ( IsOutEndpoint(PhyEP) ) {
358 if (dmaDescriptor[PhyEP].Isochronous == 1) {
359 SizeAudioTransfer = (BufferAddressIso[0]) & 0xFFFF;
365 USB_REG(0)->DMAIntEn &= ~(1 << 1);
372 USB_REG(0)->EoTIntClr = EoTIntSt;
375 void DMANewTransferRequestISR()
381 if ( NDDRIntSt & _BIT(PhyEP) ) {
382 if ( IsOutEndpoint(PhyEP) ) {
383 if (dmaDescriptor[PhyEP].Isochronous == 1) {
387 uint16_t MaxPS = dmaDescriptor[PhyEP].MaxPacketSize;
400 if (dmaDescriptor[PhyEP].Isochronous == 1) {
402 if (SizeAudioTransfer > 0) {
411 USB_REG(0)->NDDRIntClr = NDDRIntSt;
437 DevIntSt =
USB_REG(DeviceID)->DevIntEn;
438 DevIntSt &=
USB_REG(DeviceID)->DevIntEn;
440 USB_REG(DeviceID)->DevIntClr = DevIntSt;
447 if (SIEDeviceStatus &
DEV_RST) {
456 if (SIEDeviceStatus &
DEV_SUS) {
478 DMAIntSt &=
USB_REG(DeviceID)->DMAIntEn;
485 DMANewTransferRequestISR();