mirror of https://github.com/rusefi/bldc.git
Axiom: FPGA image compression
Reduces the binary blob size from 104kB to 5kB. Signed-off-by: Marcos Chaparro <mchaparro@powerdesigns.ca>
This commit is contained in:
parent
4dc8d877d8
commit
9fd6844e36
|
@ -31,6 +31,7 @@
|
||||||
#include "mc_interface.h"
|
#include "mc_interface.h"
|
||||||
#include "stdio.h"
|
#include "stdio.h"
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include "minilzo.h"
|
||||||
|
|
||||||
#include "hw_axiom_fpga_bitstream.c" //this file ONLY contains the fpga binary blob
|
#include "hw_axiom_fpga_bitstream.c" //this file ONLY contains the fpga binary blob
|
||||||
|
|
||||||
|
@ -56,6 +57,7 @@
|
||||||
|
|
||||||
#define EEPROM_ADDR_CURRENT_GAIN 0
|
#define EEPROM_ADDR_CURRENT_GAIN 0
|
||||||
|
|
||||||
|
#define BITSTREAM_CHUNK_SIZE 2000
|
||||||
#define BITSTREAM_SIZE 104090 //ice40up5k
|
#define BITSTREAM_SIZE 104090 //ice40up5k
|
||||||
//#define BITSTREAM_SIZE 71338 //ice40LP1K
|
//#define BITSTREAM_SIZE 71338 //ice40LP1K
|
||||||
|
|
||||||
|
@ -64,7 +66,6 @@ static volatile bool i2c_running = false;
|
||||||
static volatile float current_sensor_gain = 0.0;
|
static volatile float current_sensor_gain = 0.0;
|
||||||
//extern unsigned char FPGA_bitstream[BITSTREAM_SIZE];
|
//extern unsigned char FPGA_bitstream[BITSTREAM_SIZE];
|
||||||
|
|
||||||
|
|
||||||
// I2C configuration
|
// I2C configuration
|
||||||
static const I2CConfig i2cfg = {
|
static const I2CConfig i2cfg = {
|
||||||
OPMODE_I2C,
|
OPMODE_I2C,
|
||||||
|
@ -480,6 +481,17 @@ void hw_axiom_init_FPGA_CLK(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
char hw_axiom_configure_FPGA(void) {
|
char hw_axiom_configure_FPGA(void) {
|
||||||
|
// use CCM SRAM for this 2kB decompressor buffer
|
||||||
|
__attribute__((section(".ram4"))) static uint8_t __LZO_MMODEL outputBuffer[BITSTREAM_CHUNK_SIZE] = {0};
|
||||||
|
|
||||||
|
int r;
|
||||||
|
uint32_t index = 0;
|
||||||
|
const int16_t chunks = BITSTREAM_SIZE / BITSTREAM_CHUNK_SIZE + 1;
|
||||||
|
lzo_uint decompressed_len;
|
||||||
|
lzo_uint decompressed_bitstream_size = 0;
|
||||||
|
|
||||||
|
r = lzo_init(); // Initialize decompressor
|
||||||
|
|
||||||
spi_begin();
|
spi_begin();
|
||||||
palSetPad(SPI_SW_SCK_GPIO, SPI_SW_SCK_PIN);
|
palSetPad(SPI_SW_SCK_GPIO, SPI_SW_SCK_PIN);
|
||||||
palClearPad(AXIOM_FPGA_RESET_PORT, AXIOM_FPGA_RESET_PIN);
|
palClearPad(AXIOM_FPGA_RESET_PORT, AXIOM_FPGA_RESET_PIN);
|
||||||
|
@ -487,15 +499,37 @@ char hw_axiom_configure_FPGA(void) {
|
||||||
palSetPad(AXIOM_FPGA_RESET_PORT, AXIOM_FPGA_RESET_PIN);
|
palSetPad(AXIOM_FPGA_RESET_PORT, AXIOM_FPGA_RESET_PIN);
|
||||||
chThdSleep(20);
|
chThdSleep(20);
|
||||||
|
|
||||||
spi_transfer(0, FPGA_bitstream, BITSTREAM_SIZE);
|
for (int i = 0; i < chunks; i++) {
|
||||||
|
uint16_t compressed_chunk_size = (uint16_t)FPGA_bitstream[index++] << 8;
|
||||||
|
compressed_chunk_size |= (uint8_t)FPGA_bitstream[index++];
|
||||||
|
|
||||||
|
if( i == (chunks - 1) ) {
|
||||||
|
decompressed_len = BITSTREAM_SIZE % BITSTREAM_CHUNK_SIZE;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
decompressed_len = BITSTREAM_CHUNK_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = lzo1x_decompress_safe(FPGA_bitstream + index,compressed_chunk_size, outputBuffer, &decompressed_len,NULL);
|
||||||
|
decompressed_bitstream_size += decompressed_len;
|
||||||
|
index += compressed_chunk_size;
|
||||||
|
|
||||||
|
if (r != LZO_E_OK) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
spi_transfer(0, outputBuffer, decompressed_len);
|
||||||
|
}
|
||||||
|
|
||||||
//include 49 extra spi clock cycles, dummy bytes
|
//include 49 extra spi clock cycles, dummy bytes
|
||||||
uint8_t dummy = 0;
|
uint8_t dummy = 0;
|
||||||
spi_transfer(0, &dummy, 7);
|
spi_transfer(0, &dummy, 7);
|
||||||
|
|
||||||
spi_end();
|
spi_end();
|
||||||
|
|
||||||
// CDONE LED should be set by now
|
// CDONE LED should be set by now
|
||||||
|
if( (r != LZO_E_OK) || (decompressed_bitstream_size != BITSTREAM_SIZE) )
|
||||||
|
commands_printf("Error decompressing FPGA image.\n");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue