From f015fd7640a204f90a22bd3c8792e7df004c9956 Mon Sep 17 00:00:00 2001 From: Ben Gamari Date: Wed, 3 Jul 2013 13:38:59 -0400 Subject: [PATCH] usb: Things enumerate --- firmware/hackrf_usb/usb_queue.c | 18 ++++++++++++------ firmware/hackrf_usb/usb_queue.h | 6 +++++- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/firmware/hackrf_usb/usb_queue.c b/firmware/hackrf_usb/usb_queue.c index 0fc833d1..ed0e4a6e 100644 --- a/firmware/hackrf_usb/usb_queue.c +++ b/firmware/hackrf_usb/usb_queue.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "usb.h" #include "usb_queue.h" @@ -46,10 +47,10 @@ usb_transfer_t* free_transfers; // Pending transfer heads usb_transfer_t* endpoint_transfers[12] = {}; -void init_transfers() { +void usb_queue_init() { usb_transfer_t* t = &transfer_pool[0]; 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 = NULL; @@ -104,10 +105,14 @@ static void endpoint_add_transfer( ) { uint_fast8_t index = USB_ENDPOINT_INDEX(endpoint->address); //FIXME disable_irqs(); - usb_transfer_t* t = endpoint_transfers[index]; transfer->next = NULL; - for (; t->next != NULL; t = t->next); - t->next = transfer; + if (endpoint_transfers[index] != NULL) { + usb_transfer_t* t = endpoint_transfers[index]; + for (; t->next != NULL; t = t->next); + t->next = transfer; + } else { + endpoint_transfers[index] = transfer; + } //enable_irqs(); } @@ -117,6 +122,7 @@ static usb_transfer_t* endpoint_pop_transfer( uint_fast8_t index = USB_ENDPOINT_INDEX(endpoint->address); //FIXME disable_irqs(); usb_transfer_t* transfer = endpoint_transfers[index]; + assert(transfer != NULL); endpoint_transfers[index] = transfer->next; //enable_irqs(); return transfer; @@ -155,7 +161,7 @@ void usb_transfer_schedule_ack( 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); unsigned int transferred = transfer->actual_length - transfer->td.total_bytes; diff --git a/firmware/hackrf_usb/usb_queue.h b/firmware/hackrf_usb/usb_queue.h index 5e10b33e..3963f15d 100644 --- a/firmware/hackrf_usb/usb_queue.h +++ b/firmware/hackrf_usb/usb_queue.h @@ -59,6 +59,10 @@ void usb_transfer_schedule( 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__