diff --git a/firmware/hackrf_usb/Makefile b/firmware/hackrf_usb/Makefile index 69d31197..98f21440 100644 --- a/firmware/hackrf_usb/Makefile +++ b/firmware/hackrf_usb/Makefile @@ -33,6 +33,7 @@ SRC = $(BINARY).c \ usb_descriptor.c \ usb_device.c \ usb_endpoint.c \ + usb_api_cpld.c \ ../common/usb_queue.c \ ../common/fault_handler.c \ ../common/hackrf_core.c \ diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index 25c23866..0b52613d 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -35,7 +35,6 @@ #include #include #include -#include #include #include @@ -57,10 +56,6 @@ static volatile transceiver_mode_t transceiver_mode = TRANSCEIVER_MODE_OFF; -static volatile bool start_cpld_update = false; -uint8_t cpld_xsvf_buffer[512]; -volatile bool cpld_wait = false; - uint8_t spiflash_buffer[W25Q80BV_PAGE_LEN]; char version_string[] = VERSION_STRING; @@ -616,61 +611,6 @@ const usb_request_handlers_t usb_request_handlers = { .reserved = 0, }; -static void cpld_buffer_refilled(void* user_data, unsigned int length) -{ - cpld_wait = false; -} - -static void refill_cpld_buffer(void) -{ - cpld_wait = true; - usb_transfer_schedule( - &usb_endpoint_bulk_out, - cpld_xsvf_buffer, - sizeof(cpld_xsvf_buffer), - cpld_buffer_refilled, - NULL - ); - - // Wait until transfer finishes - while (cpld_wait); -} - -static void cpld_update(void) -{ - #define WAIT_LOOP_DELAY (6000000) - #define ALL_LEDS (PIN_LED1|PIN_LED2|PIN_LED3) - int i; - int error; - - usb_queue_flush_endpoint(&usb_endpoint_bulk_in); - usb_queue_flush_endpoint(&usb_endpoint_bulk_out); - - refill_cpld_buffer(); - - error = cpld_jtag_program(sizeof(cpld_xsvf_buffer), - cpld_xsvf_buffer, - refill_cpld_buffer); - if(error == 0) - { - /* blink LED1, LED2, and LED3 on success */ - while (1) - { - gpio_set(PORT_LED1_3, ALL_LEDS); /* LEDs on */ - for (i = 0; i < WAIT_LOOP_DELAY; i++) /* Wait a bit. */ - __asm__("nop"); - gpio_clear(PORT_LED1_3, ALL_LEDS); /* LEDs off */ - for (i = 0; i < WAIT_LOOP_DELAY; i++) /* Wait a bit. */ - __asm__("nop"); - } - }else - { - /* LED3 (Red) steady on error */ - gpio_set(PORT_LED1_3, PIN_LED3); /* LEDs on */ - while (1); - } -} - void usb_configuration_changed( usb_device_t* const device ) { diff --git a/firmware/hackrf_usb/usb_api_cpld.c b/firmware/hackrf_usb/usb_api_cpld.c new file mode 100644 index 00000000..e29007c5 --- /dev/null +++ b/firmware/hackrf_usb/usb_api_cpld.c @@ -0,0 +1,94 @@ +/* + * Copyright 2012 Jared Boone + * Copyright 2013 Benjamin Vernoux + * + * This file is part of HackRF. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "usb_api_cpld.h" + +#include + +#include +#include +#include + +#include "usb_endpoint.h" + +#include +#include +#include + +volatile bool start_cpld_update = false; +uint8_t cpld_xsvf_buffer[512]; +volatile bool cpld_wait = false; + +static void cpld_buffer_refilled(void* user_data, unsigned int length) +{ + cpld_wait = false; +} + +static void refill_cpld_buffer(void) +{ + cpld_wait = true; + usb_transfer_schedule( + &usb_endpoint_bulk_out, + cpld_xsvf_buffer, + sizeof(cpld_xsvf_buffer), + cpld_buffer_refilled, + NULL + ); + + // Wait until transfer finishes + while (cpld_wait); +} + +void cpld_update(void) +{ + #define WAIT_LOOP_DELAY (6000000) + #define ALL_LEDS (PIN_LED1|PIN_LED2|PIN_LED3) + int i; + int error; + + usb_queue_flush_endpoint(&usb_endpoint_bulk_in); + usb_queue_flush_endpoint(&usb_endpoint_bulk_out); + + refill_cpld_buffer(); + + error = cpld_jtag_program(sizeof(cpld_xsvf_buffer), + cpld_xsvf_buffer, + refill_cpld_buffer); + if(error == 0) + { + /* blink LED1, LED2, and LED3 on success */ + while (1) + { + gpio_set(PORT_LED1_3, ALL_LEDS); /* LEDs on */ + for (i = 0; i < WAIT_LOOP_DELAY; i++) /* Wait a bit. */ + __asm__("nop"); + gpio_clear(PORT_LED1_3, ALL_LEDS); /* LEDs off */ + for (i = 0; i < WAIT_LOOP_DELAY; i++) /* Wait a bit. */ + __asm__("nop"); + } + }else + { + /* LED3 (Red) steady on error */ + gpio_set(PORT_LED1_3, PIN_LED3); /* LEDs on */ + while (1); + } +} diff --git a/firmware/hackrf_usb/usb_api_cpld.h b/firmware/hackrf_usb/usb_api_cpld.h new file mode 100644 index 00000000..5bafdfef --- /dev/null +++ b/firmware/hackrf_usb/usb_api_cpld.h @@ -0,0 +1,32 @@ +/* + * Copyright 2012 Jared Boone + * Copyright 2013 Benjamin Vernoux + * + * This file is part of HackRF. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __USB_API_CPLD_H__ +#define __USB_API_CPLD_H__ + +#include + +extern volatile bool start_cpld_update; + +void cpld_update(void); + +#endif /* end of include guard: __USB_API_CPLD_H__ */