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 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
|
From 579f8212a652f305275c85abb0cdfdc6ddfc0112 Mon Sep 17 00:00:00 2001
From: Jared Boone <jboone@earfeast.com>
Date: Sun, 9 Nov 2014 12:21:21 -0800
Subject: [PATCH 22/68] MAX2837: Finish SPI abstraction.
Conflicts:
firmware/common/hackrf_core.c
---
firmware/common/hackrf_core.c | 10 ++++++++--
firmware/common/max2837.c | 7 +++----
firmware/common/max2837_spi.c | 19 ++++++++++++++-----
firmware/common/max2837_spi.h | 1 +
4 files changed, 26 insertions(+), 11 deletions(-)
--- a/firmware/common/hackrf_core.c
+++ b/firmware/common/hackrf_core.c
@@ -42,8 +42,14 @@
.i2c_address = 0x60,
};
+spi_t max2837_spi = {
+ .init = max2837_spi_init,
+ .transfer = max2837_spi_transfer,
+ .transfer_gather = max2837_spi_transfer_gather,
+};
+
max2837_driver_t max2837 = {
- .spi = NULL, /* TODO */
+ .spi = &max2837_spi,
};
@@ -541,7 +547,7 @@
void ssp1_set_mode_max2837(void)
{
- max2837_spi_init(max2837.spi);
+ spi_init(max2837.spi);
}
void ssp1_set_mode_max5864(void)
--- a/firmware/common/max2837.c
+++ b/firmware/common/max2837.c
@@ -31,7 +31,6 @@
#include <stdint.h>
#include <string.h>
#include "max2837.h"
-#include "max2837_spi.h"
#include "max2837_target.h"
#include "max2837_regs.def" // private register def macros
@@ -80,7 +79,7 @@
/* Set up all registers according to defaults specified in docs. */
static void max2837_init(max2837_driver_t* const drv)
{
- max2837_spi_init(drv->spi);
+ spi_init(drv->spi);
max2837_mode_shutdown(drv);
max2837_target_init(drv);
@@ -126,13 +125,13 @@
static uint16_t max2837_read(max2837_driver_t* const drv, uint8_t r) {
uint16_t value = (1 << 15) | (r << 10);
- max2837_spi_transfer(drv->spi, &value, 1);
+ spi_transfer(drv->spi, &value, 1);
return value & 0x3ff;
}
static void max2837_write(max2837_driver_t* const drv, uint8_t r, uint16_t v) {
uint16_t value = (r << 10) | (v & 0x3ff);
- max2837_spi_transfer(drv->spi, &value, 1);
+ spi_transfer(drv->spi, &value, 1);
}
uint16_t max2837_reg_read(max2837_driver_t* const drv, uint8_t r)
--- a/firmware/common/max2837_spi.c
+++ b/firmware/common/max2837_spi.c
@@ -57,14 +57,23 @@
scu_pinmux(SCU_SSP1_SCK, (SCU_SSP_IO | SCU_CONF_FUNCTION1));
}
-void max2837_spi_transfer(spi_t* const spi, void* const _data, const size_t count) {
+void max2837_spi_transfer_gather(spi_t* const spi, const spi_transfer_t* const transfers, const size_t count) {
(void)spi;
-
- uint16_t* const data = _data;
gpio_clear(PORT_XCVR_CS, PIN_XCVR_CS);
for(size_t i=0; i<count; i++) {
- data[i] = ssp_transfer(SSP1_NUM, data[i]);
- }
+ const size_t data_count = transfers[i].count;
+ uint16_t* const data = transfers[i].data;
+ for(size_t j=0; j<data_count; j++) {
+ data[j] = ssp_transfer(SSP1_NUM, data[j]);
+ }
+ }
gpio_set(PORT_XCVR_CS, PIN_XCVR_CS);
}
+
+void max2837_spi_transfer(spi_t* const spi, void* const data, const size_t count) {
+ const spi_transfer_t transfers[] = {
+ { data, count },
+ };
+ max2837_spi_transfer_gather(spi, transfers, 1);
+}
--- a/firmware/common/max2837_spi.h
+++ b/firmware/common/max2837_spi.h
@@ -30,5 +30,6 @@
void max2837_spi_init(spi_t* const spi);
void max2837_spi_transfer(spi_t* const spi, void* const data, const size_t count);
+void max2837_spi_transfer_gather(spi_t* const spi, const spi_transfer_t* const transfers, const size_t count);
#endif/*__MAX2837_SPI_H__*/
|