From 7c98d3e14bb68686acfdf67b6642a7012c7dd4da Mon Sep 17 00:00:00 2001
From: Jared Boone <jboone@earfeast.com>
Date: Fri, 28 Aug 2015 12:48:05 -0700
Subject: [PATCH 57/68] Add W25Q80BV function to fast-read from device.

---
 firmware/common/w25q80bv.c | 22 ++++++++++++++++++++++
 firmware/common/w25q80bv.h |  3 +++
 2 files changed, 25 insertions(+)

--- a/firmware/common/w25q80bv.c
+++ b/firmware/common/w25q80bv.c
@@ -198,3 +198,25 @@
 		w25q80bv_page_program(drv, addr, len, data);
 	}
 }
+
+void w25q80bv_read(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))
+		return;
+
+	w25q80bv_wait_while_busy();
+
+	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);
+}
