X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Modules%2FUSB%2FCore%2Fusb_poll.c;h=ec03036f16ca6a8164edfac8d7f1564dfa9f56e5;hb=17993abdd6e2662878dbd8dffe1517b0bf579e6e;hp=a4e8d44874077d78b78c9bf444e795972746c4a1;hpb=9c8d1751ca2eb1470a1707e42896262d19efe31d;p=tpg%2Facess2.git diff --git a/Modules/USB/Core/usb_poll.c b/Modules/USB/Core/usb_poll.c index a4e8d448..ec03036f 100644 --- a/Modules/USB/Core/usb_poll.c +++ b/Modules/USB/Core/usb_poll.c @@ -13,6 +13,9 @@ #define POLL_MAX 256 // Max period that can be nominated #define POLL_SLOTS ((int)(POLL_MAX/POLL_ATOM)) +// === IMPORTS === +extern tUSBHost *gUSB_Hosts; + // === PROTOTYPES === void USB_StartPollingEndpoint(tUSBInterface *Iface, int Endpoint); @@ -26,19 +29,26 @@ void USB_StartPollingEndpoint(tUSBInterface *Iface, int Endpoint) tUSBEndpoint *endpt; // Some sanity checks - if(Endpoint <= 0 || Endpoint >= Iface->nEndpoints) return ; + if(Endpoint <= 0 || Endpoint > Iface->nEndpoints) return ; endpt = &Iface->Endpoints[Endpoint-1]; if(endpt->PollingPeriod > POLL_MAX || endpt->PollingPeriod <= 0) return ; // TODO: Check that this endpoint isn't already on the queue + endpt->InputData = malloc(endpt->MaxPacketSize); + // Determine polling period in atoms endpt->PollingAtoms = (endpt->PollingPeriod + POLL_ATOM-1) / POLL_ATOM; if(endpt->PollingAtoms > POLL_SLOTS) endpt->PollingAtoms = POLL_SLOTS; // Add to poll queue - endpt->Next = gUSB_PollQueues[endpt->PollingAtoms]; - gUSB_PollQueues[endpt->PollingAtoms] = endpt; + // TODO: Locking + { + int idx = giUSB_PollPosition + 1; + if(idx >= POLL_SLOTS) idx -= POLL_SLOTS; + endpt->Next = gUSB_PollQueues[idx]; + gUSB_PollQueues[idx] = endpt; + } } /** @@ -46,17 +56,29 @@ void USB_StartPollingEndpoint(tUSBInterface *Iface, int Endpoint) */ int USB_PollThread(void *unused) { + Threads_SetName("USB Polling Thread"); for(;;) { tUSBEndpoint *ep, *prev; + if(giUSB_PollPosition == 0) + { + // Check hosts + for( tUSBHost *host = gUSB_Hosts; host; host = host->Next ) + { + host->HostDef->CheckPorts(host->Ptr); + } + } + // A little evil for neater code prev = (void*)( (tVAddr)&gUSB_PollQueues[giUSB_PollPosition] - offsetof(tUSBEndpoint, Next) ); // Process queue +// LOG("giUSB_PollPosition = %i", giUSB_PollPosition); for( ep = gUSB_PollQueues[giUSB_PollPosition]; ep; prev = ep, ep = ep->Next ) { int period_in_atoms = ep->PollingAtoms; +// LOG("%i: ep = %p", giUSB_PollPosition, ep); // Check for invalid entries if(period_in_atoms < 0 || period_in_atoms > POLL_ATOM) @@ -78,6 +100,12 @@ int USB_PollThread(void *unused) // TODO: Check the endpoint // TODO: Async checking? // - Send the read request on all of them then wait for the first to complete + USB_RecvDataA( + ep->Interface, ep->EndpointIdx+1, + ep->MaxPacketSize, ep->InputData, + ep->Interface->Driver->Endpoints[ep->EndpointIdx].DataAvail + ); + // Call callback // Reschedule @@ -90,6 +118,7 @@ int USB_PollThread(void *unused) ep->Next = *newqueue; *newqueue = ep; + ep = prev; } } giUSB_PollPosition ++;