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) __DATA(USBRAM_SECTION);
45 uint8_t usb_RomDriver_CDC_buffer[ROMDRIVER_CDC_MEM_SIZE]
ATTR_ALIGNED(4) __DATA(USBRAM_SECTION);
48 uint8_t UsbdCdc_EPIN_buffer[CDC_MAX_BULK_EP_SIZE]
ATTR_ALIGNED(4) __DATA(USBRAM_SECTION);
51 uint8_t UsbdCdc_EPOUT_buffer[CDC_MAX_BULK_EP_SIZE]
ATTR_ALIGNED(4) __DATA(USBRAM_SECTION);
53 uint8_t usb_RomDriver_HID_buffer[ROMDRIVER_HID_MEM_SIZE]
ATTR_ALIGNED(4) __DATA(USBRAM_SECTION);
64 DeviceTransferDescriptor dStreamTD[STREAM_TDs]
ATTR_ALIGNED(32) __DATA(USBRAM_SECTION);
70 Dummy_EPGetISOAddress);
76 void EVENT_USB_Device_TransferComplete(
int logicalEP,
int xfer_in)
ATTR_WEAK ATTR_ALIAS(Dummy_EVENT_USB_Device_TransferComplete);
80 void DcdPrepareTD(DeviceTransferDescriptor *pDTD, uint8_t *pData,
uint32_t length, uint8_t IOC);
82 uint32_t stream_buffer_address, stream_dummy_buffer_address, stream_remain_packets,
83 stream_dummy_packets, stream_packet_size, stream_total_packets;
118 USB_REG(
USBPortNum)->USBINTR_D = USBINTR_D_UsbIntEnable | USBINTR_D_UsbErrorIntEnable |
119 USBINTR_D_PortChangeIntEnable | USBINTR_D_UsbResetEnable |
120 USBINTR_D_SuspendEnable | USBINTR_D_NAKEnable | USBINTR_D_SofReceivedEnable;
122 USB_Device_SetDeviceAddress(0);
136 stream_total_packets = 0;
140 const uint8_t
Direction,
const uint16_t
Size,
const uint8_t Banks)
142 uint8_t *ISO_Address;
144 uint32_t EndPtCtrl = ENDPTCTRL_REG(Number);
146 memset((
void *) &dQueueHead[PhyEP], 0,
sizeof(DeviceQueueHead) );
148 dQueueHead[PhyEP].MaxPacketSize = Size & 0x3ff;
149 dQueueHead[PhyEP].IntOnSetup = 1;
150 dQueueHead[PhyEP].ZeroLengthTermination = 1;
154 EndPtCtrl &= ~0x0000FFFF;
155 EndPtCtrl |= ((Type << 2) & ENDPTCTRL_RxType) | ENDPTCTRL_RxEnable | ENDPTCTRL_RxToggleReset;
158 ENDPTCTRL_REG(Number) = (Type << 2);
167 EndPtCtrl &= ~0xFFFF0000;
168 EndPtCtrl |= ((Type << 18) & ENDPTCTRL_TxType) | ENDPTCTRL_TxEnable | ENDPTCTRL_TxToggleReset;
171 ENDPTCTRL_REG(Number) = (Type << 18);
176 ENDPTCTRL_REG(Number) = EndPtCtrl;
183 uint16_t totalpackets, uint16_t dummypackets)
188 for (i = 0; i < totalpackets; i++) {
189 DcdDataTransfer(PhyEP, (uint8_t *) (buffer + i * packetsize), packetsize);
192 && (dQueueHead[PhyEP].overlay.Active == 0)
196 for (i = 0; i < dummypackets; i++) {
200 && (dQueueHead[PhyEP].overlay.Active == 0)
206 dummypackets = dummypackets;
207 while (
USB_REG(
USBPortNum)->ENDPTSTAT & _BIT(EP_Physical2BitPosition(PhyEP) ) ) {
210 for (i = 0; i < totalpackets; i++) {
212 if (i == STREAM_TDs) {
215 if ((i == totalpackets - 1) || (i == STREAM_TDs - 1)) {
222 DcdPrepareTD(&dStreamTD[i], (uint8_t *) (buffer + i * packetsize), packetsize, ioc);
229 if (STREAM_TDs < totalpackets) {
230 stream_remain_packets = totalpackets - STREAM_TDs;
231 stream_buffer_address = (
uint32_t) buffer + STREAM_TDs * packetsize;
232 stream_packet_size = packetsize;
235 stream_remain_packets = stream_buffer_address = stream_packet_size = 0;
237 stream_total_packets = totalpackets;
239 dQueueHead[PhyEP].overlay.Halted = 0;
240 dQueueHead[PhyEP].overlay.Active = 0;
241 dQueueHead[PhyEP].overlay.NextTD = (
uint32_t) dStreamTD;
242 dQueueHead[PhyEP].TransferCount = totalpackets * packetsize;
243 dQueueHead[PhyEP].IsOutReceived = 0;
251 DeviceTransferDescriptor *pTD = (DeviceTransferDescriptor *) head;
252 while (!(pTD->NextTD &
LINK_TERMINATE)) pTD = (DeviceTransferDescriptor *) pTD->NextTD;
256 void DcdPrepareTD(DeviceTransferDescriptor *pDTD, uint8_t *pData,
uint32_t length, uint8_t IOC)
259 memset((
void *) pDTD, 0,
sizeof(DeviceTransferDescriptor));
262 pDTD->TotalBytes = length;
263 pDTD->IntOnComplete = IOC;
265 pDTD->BufferPage[0] = (
uint32_t) pData;
266 pDTD->BufferPage[1] = ((
uint32_t) pData + 0x1000) & 0xfffff000;
274 DeviceTransferDescriptor *pDTD = (DeviceTransferDescriptor *) &dTransferDescriptor[PhyEP];
276 while (
USB_REG(
USBPortNum)->ENDPTSTAT & _BIT(EP_Physical2BitPosition(PhyEP) ) ) {
280 memset((
void *) pDTD, 0,
sizeof(DeviceTransferDescriptor));
285 dQueueHead[PhyEP].Mult = mult;
290 dQueueHead[PhyEP].Mult = mult;
295 pDTD->TotalBytes = length;
296 pDTD->IntOnComplete = 1;
299 pDTD->BufferPage[0] = (
uint32_t) pData;
300 pDTD->BufferPage[1] = ((
uint32_t) pData + 0x1000) & 0xfffff000;
301 pDTD->BufferPage[2] = ((
uint32_t) pData + 0x2000) & 0xfffff000;
302 pDTD->BufferPage[3] = ((
uint32_t) pData + 0x3000) & 0xfffff000;
303 pDTD->BufferPage[4] = ((
uint32_t) pData + 0x4000) & 0xfffff000;
305 dQueueHead[PhyEP].overlay.Halted = 0;
306 dQueueHead[PhyEP].overlay.Active = 0;
307 dQueueHead[PhyEP].overlay.NextTD = (
uint32_t) &dTransferDescriptor[PhyEP];
308 dQueueHead[PhyEP].TransferCount = length;
314 void TransferCompleteISR(
void)
316 uint8_t *ISO_Address;
323 if ( ENDPTCOMPLETE & _BIT(n) ) {
325 uint32_t size = dQueueHead[2 * n].TransferCount;
326 size -= dQueueHead[2 * n].overlay.TotalBytes;
332 uint32_t tem = dQueueHead[2 * n].overlay.TotalBytes;
333 dQueueHead[2 * n].TransferCount -= tem;
335 if (stream_total_packets > 0) {
336 if (stream_remain_packets > 0) {
337 uint32_t cnt = dQueueHead[2 * n].TransferCount;
340 stream_remain_packets,
342 dQueueHead[2 * n].TransferCount = cnt;
345 stream_total_packets = 0;
349 stream_total_packets = 0;
350 dQueueHead[2 * n].IsOutReceived = 1;
361 if ( ENDPTCOMPLETE & _BIT( (n + 16) ) ) {
368 if (stream_remain_packets > 0) {
369 uint32_t cnt = dQueueHead[2 * n].TransferCount;
372 stream_remain_packets,
374 dQueueHead[2 * n].TransferCount = cnt;
377 stream_total_packets = 0;
389 memcpy(pData, (
void *) dQueueHead[0].SetupPackage, 8);
394 (ctrlrq->wLength != 0)
396 dQueueHead[0].IsOutReceived = 0;
413 if (USBSTS_D & USBSTS_D_UsbInt) {
420 TransferCompleteISR();
424 if (USBSTS_D & USBSTS_D_NAK) {
433 if (ENDPTNAK & _BIT(LogicalEP)) {
434 uint8_t PhyEP = 2 * LogicalEP;
437 if (!dQueueHead[PhyEP].IsOutReceived) {
445 if (stream_total_packets == 0) {
458 if (USBSTS_D & USBSTS_D_SofReceived) {
462 if (USBSTS_D & USBSTS_D_ResetReceived) {
477 if (USBSTS_D & USBSTS_D_SuspendInt) {
481 if (USBSTS_D & USBSTS_D_PortChangeDetect) {
485 if (USBSTS_D & USBSTS_D_UsbErrorInt) {
503 void Dummy_EVENT_USB_Device_TransferComplete(
int logicalEP,
int xfer_in)