From 87f59de104364da2a50ce8c6c633415383f50687 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Sun, 20 Dec 2015 15:28:29 +0000 Subject: [PATCH] Merge "abstract buses" changes with "fix SPI flash read" --- firmware/common/rf_path.c | 2 +- firmware/common/w25q80bv.c | 33 ++++++++++++++------------ firmware/common/w25q80bv.h | 2 +- firmware/hackrf_usb/hackrf_usb.c | 3 --- firmware/hackrf_usb/usb_api_spiflash.c | 2 +- firmware/libopencm3 | 2 +- 6 files changed, 22 insertions(+), 22 deletions(-) diff --git a/firmware/common/rf_path.c b/firmware/common/rf_path.c index 14f83e0e..7db1101a 100644 --- a/firmware/common/rf_path.c +++ b/firmware/common/rf_path.c @@ -268,7 +268,7 @@ void rf_path_set_direction(rf_path_t* const rf_path, const rf_path_direction_t d #ifdef HACKRF_ONE rf_path_set_antenna(rf_path, 0); #endif - rf_path_set_lna(0); + rf_path_set_lna(rf_path, 0); /* Set RF path to receive direction when "off" */ rf_path->switchctrl &= ~SWITCHCTRL_TX; rffc5071_disable(&rffc5072); diff --git a/firmware/common/w25q80bv.c b/firmware/common/w25q80bv.c index b9f6880d..e7029cd1 100644 --- a/firmware/common/w25q80bv.c +++ b/firmware/common/w25q80bv.c @@ -201,24 +201,27 @@ void w25q80bv_program(w25q80bv_driver_t* const drv, uint32_t addr, uint32_t len, } } -void w25q80bv_read(uint32_t addr, uint32_t len, uint8_t* const data) +/* write an arbitrary number of bytes */ +void w25q80bv_read(w25q80bv_driver_t* const drv, uint32_t addr, uint32_t len, uint8_t* const data) { - uint32_t i; - /* do nothing if we would overflow the flash */ - if ((len > W25Q80BV_NUM_BYTES) || (addr > W25Q80BV_NUM_BYTES) - || ((addr + len) > W25Q80BV_NUM_BYTES)) + if ((len > drv->num_bytes) || (addr > drv->num_bytes) + || ((addr + len) > drv->num_bytes)) return; - w25q80bv_wait_while_busy(); + w25q80bv_wait_while_busy(drv); - gpio_clear(PORT_SSP0_SSEL, PIN_SSP0_SSEL); - ssp_transfer(SSP0_NUM, W25Q80BV_FAST_READ); - ssp_transfer(SSP0_NUM, (addr >> 16) & 0xFF); - ssp_transfer(SSP0_NUM, (addr >> 8) & 0xFF); - ssp_transfer(SSP0_NUM, (addr >> 0) & 0xFF); - ssp_transfer(SSP0_NUM, 0xFF); - for (i = 0; i < len; i++) - data[i] = ssp_transfer(SSP0_NUM, 0xFF); - gpio_set(PORT_SSP0_SSEL, PIN_SSP0_SSEL); + uint8_t header[] = { + W25Q80BV_FAST_READ, + (addr & 0xFF0000) >> 16, + (addr & 0xFF00) >> 8, + addr & 0xFF + }; + + const spi_transfer_t transfers[] = { + { header, ARRAY_SIZE(header) }, + { data, len } + }; + + spi_bus_transfer_gather(drv->bus, transfers, ARRAY_SIZE(transfers)); } diff --git a/firmware/common/w25q80bv.h b/firmware/common/w25q80bv.h index 18ac481d..9d244c4d 100644 --- a/firmware/common/w25q80bv.h +++ b/firmware/common/w25q80bv.h @@ -55,6 +55,6 @@ void w25q80bv_chip_erase(w25q80bv_driver_t* const drv); void w25q80bv_program(w25q80bv_driver_t* const drv, uint32_t addr, uint32_t len, uint8_t* data); uint8_t w25q80bv_get_device_id(w25q80bv_driver_t* const drv); void w25q80bv_get_unique_id(w25q80bv_driver_t* const drv, w25q80bv_unique_id_t* unique_id); -void w25q80bv_read(uint32_t addr, uint32_t len, uint8_t* const data); +void w25q80bv_read(w25q80bv_driver_t* const drv, uint32_t addr, uint32_t len, uint8_t* const data); #endif//__W25Q80BV_H__ diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index ea3104d3..eb424be3 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -221,9 +221,6 @@ int main(void) { #endif cpu_clock_init(); - /* Code is not running from SPI flash, initialize for flash read/write over USB */ - w25q80bv_setup(); - usb_set_descriptor_by_serial_number(); usb_set_configuration_changed_cb(usb_configuration_changed); diff --git a/firmware/hackrf_usb/usb_api_spiflash.c b/firmware/hackrf_usb/usb_api_spiflash.c index ff429099..6b3f8502 100644 --- a/firmware/hackrf_usb/usb_api_spiflash.c +++ b/firmware/hackrf_usb/usb_api_spiflash.c @@ -96,7 +96,7 @@ usb_request_status_t usb_vendor_request_read_spiflash( || ((addr + len) > spi_flash.num_bytes)) { return USB_REQUEST_STATUS_STALL; } else { - w25q80bv_read(addr, len, &spiflash_buffer[0]); + w25q80bv_read(&spi_flash, addr, len, &spiflash_buffer[0]); usb_transfer_schedule_block(endpoint->in, &spiflash_buffer[0], len, NULL, NULL); return USB_REQUEST_STATUS_OK; diff --git a/firmware/libopencm3 b/firmware/libopencm3 index 10503c7c..50c51c7b 160000 --- a/firmware/libopencm3 +++ b/firmware/libopencm3 @@ -1 +1 @@ -Subproject commit 10503c7cc19647393d98cc66c3dbaf20bd634494 +Subproject commit 50c51c7b5fd2f113440241bb13be3a0e64724b8d