usb: Things enumerate

This commit is contained in:
Ben Gamari
2013-07-03 13:38:59 -04:00
parent 6142c828df
commit f015fd7640
2 changed files with 17 additions and 7 deletions

View File

@ -23,6 +23,7 @@
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
#include <stddef.h> #include <stddef.h>
#include <assert.h>
#include "usb.h" #include "usb.h"
#include "usb_queue.h" #include "usb_queue.h"
@ -46,10 +47,10 @@ usb_transfer_t* free_transfers;
// Pending transfer heads // Pending transfer heads
usb_transfer_t* endpoint_transfers[12] = {}; usb_transfer_t* endpoint_transfers[12] = {};
void init_transfers() { void usb_queue_init() {
usb_transfer_t* t = &transfer_pool[0]; usb_transfer_t* t = &transfer_pool[0];
free_transfers = t; free_transfers = t;
for (unsigned int i=0; i < sizeof(transfer_pool) / sizeof(usb_transfer_t); i++, t++) { for (unsigned int i=0; i < sizeof(transfer_pool) / sizeof(usb_transfer_t) - 1; i++, t++) {
t->next = t+1; t->next = t+1;
} }
t->next = NULL; t->next = NULL;
@ -104,10 +105,14 @@ static void endpoint_add_transfer(
) { ) {
uint_fast8_t index = USB_ENDPOINT_INDEX(endpoint->address); uint_fast8_t index = USB_ENDPOINT_INDEX(endpoint->address);
//FIXME disable_irqs(); //FIXME disable_irqs();
usb_transfer_t* t = endpoint_transfers[index];
transfer->next = NULL; transfer->next = NULL;
for (; t->next != NULL; t = t->next); if (endpoint_transfers[index] != NULL) {
t->next = transfer; usb_transfer_t* t = endpoint_transfers[index];
for (; t->next != NULL; t = t->next);
t->next = transfer;
} else {
endpoint_transfers[index] = transfer;
}
//enable_irqs(); //enable_irqs();
} }
@ -117,6 +122,7 @@ static usb_transfer_t* endpoint_pop_transfer(
uint_fast8_t index = USB_ENDPOINT_INDEX(endpoint->address); uint_fast8_t index = USB_ENDPOINT_INDEX(endpoint->address);
//FIXME disable_irqs(); //FIXME disable_irqs();
usb_transfer_t* transfer = endpoint_transfers[index]; usb_transfer_t* transfer = endpoint_transfers[index];
assert(transfer != NULL);
endpoint_transfers[index] = transfer->next; endpoint_transfers[index] = transfer->next;
//enable_irqs(); //enable_irqs();
return transfer; return transfer;
@ -155,7 +161,7 @@ void usb_transfer_schedule_ack(
usb_transfer_schedule_wait(endpoint, 0, 0); usb_transfer_schedule_wait(endpoint, 0, 0);
} }
void transfer_complete(const usb_endpoint_t* const endpoint) void usb_queue_transfer_complete(usb_endpoint_t* const endpoint)
{ {
usb_transfer_t* transfer = endpoint_pop_transfer(endpoint); usb_transfer_t* transfer = endpoint_pop_transfer(endpoint);
unsigned int transferred = transfer->actual_length - transfer->td.total_bytes; unsigned int transferred = transfer->actual_length - transfer->td.total_bytes;

View File

@ -59,6 +59,10 @@ void usb_transfer_schedule(
const uint32_t maximum_length const uint32_t maximum_length
); );
void init_transfers(void); void usb_queue_init(void);
void usb_queue_transfer_complete(
usb_endpoint_t* const endpoint
);
#endif//__USB_QUEUE_H__ #endif//__USB_QUEUE_H__