1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
From 87f59de104364da2a50ce8c6c633415383f50687 Mon Sep 17 00:00:00 2001
From: Dominic Spill <dominicgs@gmail.com>
Date: Sun, 20 Dec 2015 15:28:29 +0000
Subject: [PATCH 64/68] Merge "abstract buses" changes with "fix SPI flash
read"
---
firmware/common/rf_path.c | 2 +-
firmware/common/w25q80bv.c | 35 ++++++++++++++++++----------------
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, 23 insertions(+), 23 deletions(-)
--- a/firmware/common/rf_path.c
+++ b/firmware/common/rf_path.c
@@ -268,7 +268,7 @@
#ifdef HACKRF_ONE
rf_path_set_antenna(0);
#endif
- rf_path_set_lna(0);
+ rf_path_set_lna(rf_path, 0);
/* Set RF path to receive direction when "off" */
switchctrl &= ~SWITCHCTRL_TX;
rffc5071_disable(&rffc5072);
--- a/firmware/common/w25q80bv.c
+++ b/firmware/common/w25q80bv.c
@@ -199,24 +199,27 @@
}
}
-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);
+
+ 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 }
+ };
- 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);
+ spi_bus_transfer_gather(drv->bus, transfers, ARRAY_SIZE(transfers));
}
--- a/firmware/hackrf_usb/hackrf_usb.c
+++ b/firmware/hackrf_usb/hackrf_usb.c
@@ -221,9 +221,6 @@
#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);
--- a/firmware/hackrf_usb/usb_api_spiflash.c
+++ b/firmware/hackrf_usb/usb_api_spiflash.c
@@ -99,7 +99,7 @@
|| ((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;
|