32 #define __INCLUDE_FROM_USB_DRIVER
33 #include "../../../USBMode.h"
35 #if (defined(__LPC17XX__) || defined(__LPC177X_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] __DATA(USBRAM_SECTION);
48 uint32_t DataInRemainCount, DataInRemainOffset;
49 bool IsConfigured, shortpacket;
52 uint8_t iso_buffer[512] ATTR_ALIGNED(4) __DATA(USBRAM_SECTION);
55 Dummy_EPGetISOAddress);
57 uint32_t BufferAddressIso[32] __DATA(USBRAM_SECTION);
63 LPC_USB->USBCmdCode =
cmd;
64 while ((LPC_USB->USBDevIntSt &
CCEMTY_INT) == 0) ;
70 LPC_USB->USBCmdCode =
cmd;
71 while ((LPC_USB->USBDevIntSt &
CCEMTY_INT) == 0) ;
73 LPC_USB->USBCmdCode = val;
74 while ((LPC_USB->USBDevIntSt &
CCEMTY_INT) == 0) ;
80 LPC_USB->USBCmdCode =
cmd;
81 while ((LPC_USB->USBDevIntSt &
CDFULL_INT) == 0) ;
82 return LPC_USB->USBCmdData;
89 LPC_USB->USBEpInd = 0;
91 LPC_USB->USBEpInd = 1;
96 LPC_USB->USBEpIntEn = 0;
99 LPC_USB->USBEpIntClr = 0xFFFFFFFF;
100 LPC_USB->USBDevIntClr = 0xFFFFFFFF;
101 LPC_USB->USBEpIntPri = 0;
104 LPC_USB->USBEpDMADis = 0xFFFFFFFF;
105 LPC_USB->USBDMARClr = 0xFFFFFFFF;
106 LPC_USB->USBEoTIntClr = 0xFFFFFFFF;
107 LPC_USB->USBNDDRIntClr = 0xFFFFFFFF;
108 LPC_USB->USBSysErrIntClr = 0xFFFFFFFF;
111 LPC_USB->USBUDCAH = (
uint32_t) UDCA;
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 LPC_USB->USBReEp |= (1 << PhyEP);
150 LPC_USB->USBEpInd = PhyEP;
151 LPC_USB->USBMaxPSize = Size & 0x3ff;
157 LPC_USB->USBEpIntEn |= _BIT(PhyEP);
158 DataInRemainCount = 0;
159 DataInRemainOffset = 0;
164 dmaDescriptor[PhyEP].MaxPacketSize =
Size;
165 dmaDescriptor[PhyEP].Retired = 1;
167 LPC_USB->USBEpDMAEn = _BIT(PhyEP);
177 void ReadControlEndpoint(uint8_t *pData)
184 cnt = LPC_USB->USBRxPLen;
185 }
while ((cnt &
PKT_RDY) == 0);
188 for (n = 0; n < (cnt + 3) / 4; n++) {
189 *((
uint32_t *) pData) = LPC_USB->USBRxData;
192 LPC_USB->USBCtrl = 0;
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;
223 LPC_USB->USBTxPLen = count;
225 for (n = 0; n < (count + 3) / 4; n++) {
226 LPC_USB->USBTxData = *((
uint32_t *) pData);
230 LPC_USB->USBCtrl = 0;
236 void HAL17XX_SetDeviceAddress(uint8_t Address)
249 memcpy(pData, SetupPackage, 8);
252 void SlaveEndpointISR()
255 for (PhyEP = 0; PhyEP < 2; PhyEP++)
256 if (LPC_USB->USBEpIntSt & _BIT(PhyEP)) {
257 LPC_USB->USBEpIntClr = _BIT(PhyEP);
262 while ((LPC_USB->USBDevIntSt &
CDFULL_INT) == 0) ;
263 SIEEndpointStatus = LPC_USB->USBCmdData;
266 SETUPReceived =
true;
267 ReadControlEndpoint(SetupPackage);
275 if (DataInRemainCount) {
276 WriteControlEndpoint((uint8_t *) (
usb_data_buffer + DataInRemainOffset), DataInRemainCount);
281 WriteControlEndpoint((uint8_t *) (
usb_data_buffer + 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 LPC_USB->USBEpDMAEn = _BIT(PhyEP);
349 void DMAEndTransferISR()
352 uint32_t EoTIntSt = LPC_USB->USBEoTIntSt;
355 if ( EoTIntSt & _BIT(PhyEP) ) {
356 if ( IsOutEndpoint(PhyEP) ) {
357 if (dmaDescriptor[PhyEP].Isochronous == 1) {
358 SizeAudioTransfer = (BufferAddressIso[0]) & 0xFFFF;
364 dmaDescriptor[PhyEP].MaxPacketSize) > 512) {
365 LPC_USB->USBDMAIntEn &= ~(1 << 1);
372 LPC_USB->USBEoTIntClr = EoTIntSt;
375 void DMANewTransferRequestISR()
378 uint32_t NDDRIntSt = LPC_USB->USBNDDRIntSt;
381 if ( NDDRIntSt & _BIT(PhyEP) ) {
382 if ( IsOutEndpoint(PhyEP) ) {
383 if (dmaDescriptor[PhyEP].Isochronous == 1) {
387 uint16_t MaxPS = dmaDescriptor[PhyEP].MaxPacketSize;
401 if (dmaDescriptor[PhyEP].Isochronous == 1) {
403 if (SizeAudioTransfer > 0) {
412 LPC_USB->USBNDDRIntClr = NDDRIntSt;
438 DevIntSt = LPC_USB->USBDevIntSt & LPC_USB->USBDevIntEn;
439 LPC_USB->USBDevIntClr = DevIntSt;
446 if (SIEDeviceStatus &
DEV_RST) {
455 if (SIEDeviceStatus &
DEV_SUS) {
476 DMAIntSt = LPC_USB->USBDMAIntSt & LPC_USB->USBDMAIntEn;
484 DMANewTransferRequestISR();
490 LPC_USB->USBSysErrIntClr = LPC_USB->USBSysErrIntSt;