32 #define __INCLUDE_FROM_USB_DRIVER
33 #include "../../USBMode.h"
35 #if (defined(__LPC18XX__) || defined(__LPC43XX__)) && defined(USB_CAN_BE_DEVICE)
36 #include "../../Endpoint.h"
39 #if defined(USB_DEVICE_ROM_DRIVER)
43 uint8_t usb_RomDriver_MSC_buffer[ROMDRIVER_MSC_MEM_SIZE]
ATTR_ALIGNED(4) __BSS(USBRAM_SECTION);
45 uint8_t usb_RomDriver_CDC_buffer[ROMDRIVER_CDC_MEM_SIZE]
ATTR_ALIGNED(4) __BSS(USBRAM_SECTION);
48 uint8_t UsbdCdc_EPIN_buffer[CDC_MAX_BULK_EP_SIZE]
ATTR_ALIGNED(4) __BSS(USBRAM_SECTION);
51 uint8_t UsbdCdc_EPOUT_buffer[CDC_MAX_BULK_EP_SIZE]
ATTR_ALIGNED(4) __BSS(USBRAM_SECTION);
53 uint8_t usb_RomDriver_HID_buffer[ROMDRIVER_HID_MEM_SIZE]
ATTR_ALIGNED(4) __BSS(USBRAM_SECTION);
60 volatile DeviceQueueHead dQueueHead0[USED_PHYSICAL_ENDPOINTS0]
ATTR_ALIGNED(2048) __BSS(USBRAM_SECTION);
62 volatile DeviceQueueHead dQueueHead1[USED_PHYSICAL_ENDPOINTS1]
ATTR_ALIGNED(2048) __BSS(USBRAM_SECTION);
64 DeviceTransferDescriptor dTransferDescriptor0[USED_PHYSICAL_ENDPOINTS0]
ATTR_ALIGNED(32) __BSS(USBRAM_SECTION);
66 DeviceTransferDescriptor dTransferDescriptor1[USED_PHYSICAL_ENDPOINTS1]
ATTR_ALIGNED(32) __BSS(USBRAM_SECTION);
68 DeviceTransferDescriptor dStreamTD0[STREAM_TDs]
ATTR_ALIGNED(32) __BSS(USBRAM_SECTION);
70 DeviceTransferDescriptor dStreamTD1[STREAM_TDs]
ATTR_ALIGNED(32) __BSS(USBRAM_SECTION);
74 DeviceTransferDescriptor *
const dTransferDescriptor[
LPC18_43_MAX_USB_CORE] = {dTransferDescriptor0, dTransferDescriptor1};
79 stream_dummy_buffer_address,
80 stream_remain_packets,
90 Dummy_EPGetISOAddress);
96 void EVENT_USB_Device_TransferComplete(
int logicalEP,
int xfer_in)
ATTR_WEAK ATTR_ALIAS(Dummy_EVENT_USB_Device_TransferComplete);
100 void DcdPrepareTD(DeviceTransferDescriptor *pDTD, uint8_t *pData,
uint32_t length, uint8_t IOC);
109 USB_Reg->
ENDPTCTRL[0] &= ~(ENDPTCTRL_RxEnable | ENDPTCTRL_TxEnable);
110 USB_Reg->
ENDPTCTRL[1] &= ~(ENDPTCTRL_RxEnable | ENDPTCTRL_TxEnable);
111 USB_Reg->
ENDPTCTRL[2] &= ~(ENDPTCTRL_RxEnable | ENDPTCTRL_TxEnable);
112 USB_Reg->
ENDPTCTRL[3] &= ~(ENDPTCTRL_RxEnable | ENDPTCTRL_TxEnable);
114 USB_Reg->
ENDPTCTRL[4] &= ~(ENDPTCTRL_RxEnable | ENDPTCTRL_TxEnable);
115 USB_Reg->
ENDPTCTRL[5] &= ~(ENDPTCTRL_RxEnable | ENDPTCTRL_TxEnable);
137 USB_Reg->
USBINTR_D = USBINTR_D_UsbIntEnable | USBINTR_D_UsbErrorIntEnable |
138 USBINTR_D_PortChangeIntEnable | USBINTR_D_UsbResetEnable |
139 USBINTR_D_SuspendEnable | USBINTR_D_NAKEnable | USBINTR_D_SofReceivedEnable;
155 Stream_Variable[corenum].stream_total_packets = 0;
159 const uint8_t
Direction,
const uint16_t
Size,
const uint8_t Banks)
161 uint8_t * ISO_Address;
162 volatile DeviceQueueHead * pdQueueHead;
164 __IO
uint32_t * pEndPointCtrl = &ENDPTCTRL_REG(corenum, Number);
165 uint32_t EndPtCtrl = *pEndPointCtrl;
167 pdQueueHead = &(dQueueHead[corenum][PhyEP]);
168 memset((
void *) pdQueueHead, 0,
sizeof(DeviceQueueHead) );
170 pdQueueHead->MaxPacketSize = Size & 0x3ff;
171 pdQueueHead->IntOnSetup = 1;
172 pdQueueHead->ZeroLengthTermination = 1;
176 EndPtCtrl &= ~0x0000FFFF;
177 EndPtCtrl |= ((Type << 2) & ENDPTCTRL_RxType) | ENDPTCTRL_RxEnable | ENDPTCTRL_RxToggleReset;
180 *pEndPointCtrl = (Type << 2);
185 USB_REG(corenum)->ENDPTNAKEN |= (1 << EP_Physical2BitPosition(PhyEP));
189 EndPtCtrl &= ~0xFFFF0000;
190 EndPtCtrl |= ((Type << 18) & ENDPTCTRL_TxType) | ENDPTCTRL_TxEnable | ENDPTCTRL_TxToggleReset;
193 *pEndPointCtrl = (Type << 18);
198 *pEndPointCtrl = EndPtCtrl;
205 uint16_t totalpackets, uint16_t dummypackets)
209 volatile DeviceQueueHead * pdQueueHead;
211 for (i = 0; i < totalpackets; i++) {
212 DcdDataTransfer(corenum, PhyEP, (uint8_t *) (buffer + i * packetsize), packetsize);
215 && (dQueueHead[PhyEP].overlay.Active == 0)
219 for (i = 0; i < dummypackets; i++) {
223 && (dQueueHead[PhyEP].overlay.Active == 0)
228 STREAM_VAR_t * current_stream = &Stream_Variable[corenum];
229 DeviceTransferDescriptor *dStreamTD = dStreamTD_Tbl[corenum];
231 dummypackets = dummypackets;
232 while (
USB_REG(corenum)->ENDPTSTAT & _BIT(EP_Physical2BitPosition(PhyEP) ) ) {
235 for (i = 0; i < totalpackets; i++) {
237 if (i == STREAM_TDs) {
240 if ((i == totalpackets - 1) || (i == STREAM_TDs - 1)) {
247 DcdPrepareTD(&dStreamTD[i], (uint8_t *) (buffer + i * packetsize), packetsize, ioc);
254 if (STREAM_TDs < totalpackets) {
255 current_stream->stream_remain_packets = totalpackets - STREAM_TDs;
256 current_stream->stream_buffer_address = (
uint32_t) buffer + STREAM_TDs * packetsize;
257 current_stream->stream_packet_size = packetsize;
260 current_stream->stream_remain_packets = current_stream->stream_buffer_address = current_stream->stream_packet_size = 0;
262 current_stream->stream_total_packets = totalpackets;
263 pdQueueHead = &(dQueueHead[corenum][PhyEP]);
264 pdQueueHead->overlay.Halted = 0;
265 pdQueueHead->overlay.Active = 0;
266 pdQueueHead->overlay.NextTD = (
uint32_t) dStreamTD;
267 pdQueueHead->TransferCount = totalpackets * packetsize;
268 pdQueueHead->IsOutReceived = 0;
270 USB_REG(corenum)->ENDPTPRIME |= _BIT(EP_Physical2BitPosition(PhyEP) );
276 DeviceTransferDescriptor *pTD = (DeviceTransferDescriptor *) head;
277 while (!(pTD->NextTD &
LINK_TERMINATE)) pTD = (DeviceTransferDescriptor *) pTD->NextTD;
281 void DcdPrepareTD(DeviceTransferDescriptor *pDTD, uint8_t *pData,
uint32_t length, uint8_t IOC)
284 memset((
void *) pDTD, 0,
sizeof(DeviceTransferDescriptor));
287 pDTD->TotalBytes = length;
288 pDTD->IntOnComplete = IOC;
290 pDTD->BufferPage[0] = (
uint32_t) pData;
291 pDTD->BufferPage[1] = ((
uint32_t) pData + 0x1000) & 0xfffff000;
299 DeviceTransferDescriptor * pDTD = (DeviceTransferDescriptor *) &dTransferDescriptor[corenum][PhyEP];
300 volatile DeviceQueueHead * pdQueueHead = &(dQueueHead[corenum][PhyEP]);
301 while (
USB_REG(corenum)->ENDPTSTAT & _BIT(EP_Physical2BitPosition(PhyEP) ) ) {
305 memset((
void *) pDTD, 0,
sizeof(DeviceTransferDescriptor));
310 pdQueueHead->Mult = mult;
315 pdQueueHead->Mult = mult;
320 pDTD->TotalBytes = length;
321 pDTD->IntOnComplete = 1;
324 pDTD->BufferPage[0] = (
uint32_t) pData;
325 pDTD->BufferPage[1] = ((
uint32_t) pData + 0x1000) & 0xfffff000;
326 pDTD->BufferPage[2] = ((
uint32_t) pData + 0x2000) & 0xfffff000;
327 pDTD->BufferPage[3] = ((
uint32_t) pData + 0x3000) & 0xfffff000;
328 pDTD->BufferPage[4] = ((
uint32_t) pData + 0x4000) & 0xfffff000;
330 pdQueueHead->overlay.Halted = 0;
331 pdQueueHead->overlay.Active = 0;
332 pdQueueHead->overlay.NextTD = (
uint32_t) &dTransferDescriptor[corenum][PhyEP];
333 pdQueueHead->TransferCount = length;
336 USB_REG(corenum)->ENDPTPRIME |= _BIT(EP_Physical2BitPosition(PhyEP) );
339 void TransferCompleteISR(uint8_t corenum)
341 uint8_t * ISO_Address;
343 STREAM_VAR_t * current_stream = &Stream_Variable[corenum];
349 if ( ENDPTCOMPLETE & _BIT(n) ) {
351 uint32_t size = dQueueHead[corenum][2 * n].TransferCount;
352 size -= dQueueHead[corenum][2 * n].overlay.TotalBytes;
359 uint32_t tem = dQueueHead[corenum][2 * n].overlay.TotalBytes;
360 dQueueHead[corenum][2 * n].TransferCount -= tem;
362 if (current_stream->stream_total_packets > 0) {
363 if (current_stream->stream_remain_packets > 0) {
364 uint32_t cnt = dQueueHead[corenum][2 * n].TransferCount;
366 current_stream->stream_packet_size,
367 current_stream->stream_remain_packets,
369 dQueueHead[corenum][2 * n].TransferCount = cnt;
372 current_stream->stream_total_packets = 0;
373 dQueueHead[corenum][2 * n].IsOutReceived = 1;
378 dQueueHead[corenum][2 * n].IsOutReceived = 1;
389 if ( ENDPTCOMPLETE & _BIT( (n + 16) ) ) {
396 if (current_stream->stream_remain_packets > 0) {
397 uint32_t cnt = dQueueHead[corenum][2 * n].TransferCount;
399 current_stream->stream_packet_size,
400 current_stream->stream_remain_packets,
402 dQueueHead[corenum][2 * n].TransferCount = cnt;
405 current_stream->stream_total_packets = 0;
417 volatile DeviceQueueHead* pdQueueHead = &(dQueueHead[corenum][0]);
418 memcpy(pData, (
void *) pdQueueHead->SetupPackage, 8);
423 (ctrlrq->wLength != 0)
425 pdQueueHead->IsOutReceived = 0;
443 if (USBSTS_D & USBSTS_D_UsbInt) {
450 TransferCompleteISR(corenum);
454 if (USBSTS_D & USBSTS_D_NAK) {
463 if (ENDPTNAK & _BIT(LogicalEP)) {
464 uint8_t PhyEP = 2 * LogicalEP;
465 if ( !(USB_Reg->
ENDPTSTAT & _BIT(LogicalEP)) ) {
467 if (!dQueueHead[corenum][PhyEP].IsOutReceived) {
475 if (Stream_Variable[corenum].stream_total_packets == 0) {
488 if (USBSTS_D & USBSTS_D_SofReceived) {
492 if (USBSTS_D & USBSTS_D_ResetReceived) {
509 if (USBSTS_D & USBSTS_D_SuspendInt) {
513 if (USBSTS_D & USBSTS_D_PortChangeDetect) {
517 if (USBSTS_D & USBSTS_D_UsbErrorInt) {
535 void Dummy_EVENT_USB_Device_TransferComplete(
int logicalEP,
int xfer_in)