CPLD: Introduce Config type to clean up programming interface.

Hide the details of how the CPLD data is stored.
This commit is contained in:
Jared Boone 2017-06-02 16:54:24 -07:00
parent 76c2cc77af
commit a3483a8394
4 changed files with 21 additions and 10 deletions

View File

@ -27,11 +27,11 @@
#include "jtag_target_gpio.hpp"
#include "cpld_max5.hpp"
#include "cpld_xilinx.hpp"
#include "portapack_cpld_data.hpp"
#include "hackrf_cpld_data.hpp"
bool cpld_update_if_necessary(
const std::array<uint16_t, 3328>& block_0,
const std::array<uint16_t, 512>& block_1
const portapack::cpld::Config config
) {
jtag::GPIOTarget target {
portapack::gpio_cpld_tck,
@ -65,11 +65,11 @@ bool cpld_update_if_necessary(
}
/* Verify CPLD contents against current bitstream. */
auto ok = cpld.verify(block_0, block_1);
auto ok = cpld.verify(config.block_0, config.block_1);
/* CPLD verifies incorrectly. Erase and program with current bitstream. */
if( !ok ) {
ok = cpld.program(block_0, block_1);
ok = cpld.program(config.block_0, config.block_1);
}
/* If programming OK, reset CPLD to user mode. Otherwise leave it in

View File

@ -22,12 +22,10 @@
#ifndef __CPLD_UPDATE_H__
#define __CPLD_UPDATE_H__
#include <cstdint>
#include <array>
#include "portapack_cpld_data.hpp"
bool cpld_update_if_necessary(
const std::array<uint16_t, 3328>& block_0,
const std::array<uint16_t, 512>& block_1
const portapack::cpld::Config config
);
bool cpld_hackrf_load_sram();

View File

@ -176,11 +176,11 @@ void init() {
clock_manager.run_at_full_speed();
if( portapack_model() == PortaPackModel::R2_20170522 ) {
if( !cpld_update_if_necessary(portapack::cpld::rev_20170522::block_0, portapack::cpld::rev_20170522::block_1) ) {
if( !cpld_update_if_necessary(portapack::cpld::rev_20170522::config) ) {
chSysHalt();
}
} else {
if( !cpld_update_if_necessary(portapack::cpld::rev_20150901::block_0, portapack::cpld::rev_20150901::block_1) ) {
if( !cpld_update_if_necessary(portapack::cpld::rev_20150901::config) ) {
chSysHalt();
}
}

View File

@ -28,14 +28,27 @@
namespace portapack {
namespace cpld {
struct Config {
const std::array<uint16_t, 3328>& block_0;
const std::array<uint16_t, 512>& block_1;
};
namespace rev_20150901 {
extern const std::array<uint16_t, 3328> block_0;
extern const std::array<uint16_t, 512> block_1;
const Config config { block_0, block_1 };
} /* namespace rev_20150901 */
namespace rev_20170522 {
extern const std::array<uint16_t, 3328> block_0;
extern const std::array<uint16_t, 512> block_1;
const Config config { block_0, block_1 };
} /* namespace rev_20170522 */
} /* namespace cpld */