From 4c1d8ded3badd4f8960cf16c6f4e4f5f4fdb879f Mon Sep 17 00:00:00 2001 From: drowe67 Date: Wed, 26 Aug 2015 03:34:54 +0000 Subject: [PATCH] working on getting stm32 dir building again, put conditional defines in src to prevent 700 mode code being linked, and modified stm32/src for freedv api changes. stm32 Makefile runs OK but haven't tested anything git-svn-id: https://svn.code.sf.net/p/freetel/code@2286 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/src/codec2.c | 7 +++- codec2-dev/src/freedv_api.c | 13 ++++++- codec2-dev/src/freedv_api.h | 2 + codec2-dev/src/quantise.c | 7 ++++ codec2-dev/stm32/Makefile | 18 ++++----- codec2-dev/stm32/src/fdmdv_profile.c | 2 +- codec2-dev/stm32/src/freedv_rx_profile.c | 21 +++++++---- codec2-dev/stm32/src/freedv_tx_profile.c | 9 +++-- codec2-dev/stm32/src/sm1000_main.c | 48 ++++++++++++------------ 9 files changed, 80 insertions(+), 47 deletions(-) diff --git a/codec2-dev/src/codec2.c b/codec2-dev/src/codec2.c index a41827e0..8f3f79ce 100644 --- a/codec2-dev/src/codec2.c +++ b/codec2-dev/src/codec2.c @@ -277,10 +277,12 @@ void codec2_encode(struct CODEC2 *c2, unsigned char *bits, short speech[]) codec2_encode_1300(c2, bits, speech); if (c2->mode == CODEC2_MODE_1200) codec2_encode_1200(c2, bits, speech); +#ifndef CORTEX_M4 if (c2->mode == CODEC2_MODE_700) codec2_encode_700(c2, bits, speech); if (c2->mode == CODEC2_MODE_700B) codec2_encode_700b(c2, bits, speech); +#endif } void codec2_decode(struct CODEC2 *c2, short speech[], const unsigned char *bits) @@ -314,10 +316,12 @@ void codec2_decode_ber(struct CODEC2 *c2, short speech[], const unsigned char *b codec2_decode_1300(c2, speech, bits, ber_est); if (c2->mode == CODEC2_MODE_1200) codec2_decode_1200(c2, speech, bits); +#ifndef CORTEX_M4 if (c2->mode == CODEC2_MODE_700) codec2_decode_700(c2, speech, bits); if (c2->mode == CODEC2_MODE_700B) codec2_decode_700b(c2, speech, bits); +#endif } @@ -1334,6 +1338,7 @@ void codec2_decode_1200(struct CODEC2 *c2, short speech[], const unsigned char * } +#ifndef CORTEX_M4 /*---------------------------------------------------------------------------*\ FUNCTION....: codec2_encode_700 @@ -1741,7 +1746,7 @@ void codec2_decode_700b(struct CODEC2 *c2, short speech[], const unsigned char * for(i=0; iprev_lsps_dec[i] = lsps[3][i]; } - +#endif /*---------------------------------------------------------------------------*\ diff --git a/codec2-dev/src/freedv_api.c b/codec2-dev/src/freedv_api.c index 06058604..ee500af4 100644 --- a/codec2-dev/src/freedv_api.c +++ b/codec2-dev/src/freedv_api.c @@ -107,6 +107,7 @@ struct freedv *freedv_open(int mode) { f->sz_error_pattern = fdmdv_error_pattern_size(f->fdmdv); } +#ifndef CORTEX_M4 if ((mode == FREEDV_MODE_700) || (mode == FREEDV_MODE_700B)) { f->snr_squelch_thresh = 0.0; f->squelch_en = 0; @@ -126,6 +127,7 @@ struct freedv *freedv_open(int mode) { return NULL; f->sz_error_pattern = cohpsk_error_pattern_size(); } +#endif f->test_frame_sync_state = 0; f->total_bits = 0; @@ -183,8 +185,10 @@ void freedv_close(struct freedv *freedv) { free(freedv->tx_bits); if (freedv->mode == FREEDV_MODE_1600) fdmdv_destroy(freedv->fdmdv); +#ifndef CORTEX_M4 if (freedv->mode == FREEDV_MODE_700) cohpsk_destroy(freedv->cohpsk); +#endif codec2_destroy(freedv->codec2); free(freedv); } @@ -335,6 +339,7 @@ void freedv_comptx(struct freedv *f, COMP mod_out[], short speech_in[]) { } +#ifndef CORTEX_M4 if ((f->mode == FREEDV_MODE_700) || (f->mode == FREEDV_MODE_700B)) { bits_per_codec_frame = codec2_bits_per_frame(f->codec2); bits_per_modem_frame = COHPSK_BITS_PER_FRAME; @@ -399,6 +404,7 @@ void freedv_comptx(struct freedv *f, COMP mod_out[], short speech_in[]) { for(i=0; in_nom_modem_samples; i++) mod_out[i] = fcmult(FDMDV_SCALE*NORM_PWR, tx_fdm[i]); } +#endif } int freedv_nin(struct freedv *f) { @@ -653,6 +659,7 @@ int freedv_comprx(struct freedv *f, short speech_out[], COMP demod_in[]) { } +#ifndef CORTEX_M4 if ((f->mode == FREEDV_MODE_700) || (f->mode == FREEDV_MODE_700B)) { float rx_bits[COHPSK_BITS_PER_FRAME]; int sync; @@ -781,9 +788,9 @@ int freedv_comprx(struct freedv *f, short speech_out[], COMP demod_in[]) { //fprintf(stderr, "%d %d %d\n", f->n_speech_samples, speech_out[0], speech_out[nin_prev-1]); } } - } +#endif //fprintf(stderr,"f->stats.sync: %d reliable_sync_bit: %d evenframe: %d nout: %d\n", f->stats.sync, reliable_sync_bit, f->evenframe, nout); return nout; @@ -845,8 +852,10 @@ void freedv_get_modem_stats(struct freedv *f, int *sync, float *snr_est) { if (f->mode == FREEDV_MODE_1600) fdmdv_get_demod_stats(f->fdmdv, &f->stats); +#ifndef CORTEX_M4 if (f->mode == FREEDV_MODE_700) cohpsk_get_demod_stats(f->cohpsk, &f->stats); +#endif if (sync) *sync = f->stats.sync; if (snr_est) *snr_est = f->stats.snr_est; } @@ -865,6 +874,7 @@ void freedv_get_modem_stats(struct freedv *f, int *sync, float *snr_est) // Set integers void freedv_set_test_frames (struct freedv *f, int val) {f->smooth_symbols = val;} void freedv_set_squelch_en (struct freedv *f, int val) {f->squelch_en = val;} +void freedv_zero_total_bit_errors (struct freedv *f) {f->total_bit_errors = 0;} // Set floats void freedv_set_snr_squelch_thresh (struct freedv *f, float val) {f->snr_squelch_thresh = val;} @@ -886,5 +896,6 @@ int freedv_get_n_max_modem_samples (struct freedv *f) {return f->n_max_modem_sa int freedv_get_n_nom_modem_samples (struct freedv *f) {return f->n_nom_modem_samples;} int freedv_get_total_bits (struct freedv *f) {return f->total_bits;} int freedv_get_total_bit_errors (struct freedv *f) {return f->total_bit_errors;} +int freedv_get_sync (struct freedv *f) {return f->stats.sync;} // Get floats diff --git a/codec2-dev/src/freedv_api.h b/codec2-dev/src/freedv_api.h index 7f1825c0..0f1b0aea 100644 --- a/codec2-dev/src/freedv_api.h +++ b/codec2-dev/src/freedv_api.h @@ -73,6 +73,8 @@ int freedv_get_n_max_modem_samples (struct freedv *freedv); int freedv_get_n_nom_modem_samples (struct freedv *freedv); int freedv_get_total_bits (struct freedv *freedv); int freedv_get_total_bit_errors (struct freedv *freedv); +void freedv_zero_total_bit_errors (struct freedv *freedv); +int freedv_get_sync (struct freedv *freedv); #endif #ifdef __cplusplus diff --git a/codec2-dev/src/quantise.c b/codec2-dev/src/quantise.c index c7222800..fe1ebe78 100644 --- a/codec2-dev/src/quantise.c +++ b/codec2-dev/src/quantise.c @@ -65,6 +65,7 @@ int lspd_bits(int i) { return lsp_cbd[i].log2m; } +#ifndef CORTEX_M4 int mel_bits(int i) { return mel_cb[i].log2m; } @@ -72,6 +73,7 @@ int mel_bits(int i) { int lspmelvq_cb_bits(int i) { return lspmelvq_cb[i].log2m; } +#endif #ifdef __EXPERIMENTAL__ int lspdt_bits(int i) { @@ -539,6 +541,7 @@ void lspjvm_quantise(float *x, float *xq, int order) } +#ifndef CORTEX_M4 /* simple (non mbest) 6th order LSP MEL VQ quantiser. Returns MSE of result */ float lspmelvq_quantise(float *x, float *xq, int order) @@ -781,6 +784,7 @@ void lspmelvq_decode(int *indexes, float *xq, int ndim) xq[i] = codebook1[ndim*n1+i] + codebook2[ndim*n2+i] + codebook3[ndim*n3+i]; } } +#endif int check_lsp_order(float lsp[], int order) @@ -1366,6 +1370,8 @@ void decode_lsps_scalar(float lsp[], int indexes[], int order) } +#ifndef CORTEX_M4 + /*---------------------------------------------------------------------------*\ FUNCTION....: encode_mels_scalar() @@ -1433,6 +1439,7 @@ void decode_mels_scalar(float mels[], int indexes[], int order) } +#endif #ifdef __EXPERIMENTAL__ diff --git a/codec2-dev/stm32/Makefile b/codec2-dev/stm32/Makefile index 95b9316b..b70c2a21 100644 --- a/codec2-dev/stm32/Makefile +++ b/codec2-dev/stm32/Makefile @@ -6,14 +6,14 @@ FLOAT_TYPE=hard ################################################### -BINPATH=/opt/gcc-arm-none-eabi-4_7-2013q1/bin -CC=$(BINPATH)/arm-none-eabi-gcc -OBJCOPY=$(BINPATH)/arm-none-eabi-objcopy -SIZE=$(BINPATH)/arm-none-eabi-size +BINPATH= +CC=$(BINPATH)arm-none-eabi-gcc +OBJCOPY=$(BINPATH)arm-none-eabi-objcopy +SIZE=$(BINPATH)arm-none-eabi-size ################################################### -CFLAGS = -std=gnu99 -O0 -g -Wall -Tstm32_flash.ld -DSTM32F4XX -DCORTEX_M4 +CFLAGS = -std=gnu99 -O0 -g -Wall -Tstm32_flash.ld -DSTM32F40_41xxx -DCORTEX_M4 CFLAGS += -mlittle-endian -mthumb -mthumb-interwork -nostartfiles -mcpu=cortex-m4 ifeq ($(FLOAT_TYPE), hard) @@ -30,7 +30,7 @@ endif PERIPHLIBURL = http://www.st.com/st-web-ui/static/active/en/st_prod_software_internet/resource/technical/software/firmware/ PERIPHLIBZIP = stm32f4_dsp_stdperiph_lib.zip -PERIPHLIBVER = V1.5.0 +PERIPHLIBVER = V1.4.0 PERIPHLIBNAME = STM32F4xx_DSP_StdPeriph_Lib PERIPHLIBDIR = $(PERIPHLIBNAME) CMSIS = $(PERIPHLIBDIR)/Libraries/CMSIS @@ -79,7 +79,7 @@ CFLAGS += -I../unittest CFLAGS += -Iinc FFT_TEST_SRCS = \ -$(DSPLIB)/Examples/arm_fft_bin_example/ARM/arm_fft_bin_data.c \ +$(DSPLIB)/Examples/arm_fft_bin_example/arm_fft_bin_data.c \ fft_test.c \ src/startup_stm32f4xx.s \ stm32f4_machdep.c \ @@ -109,7 +109,7 @@ OBJS = $(SRCS:.c=.o) ################################################### -all: libstm32f4.a codec2_profile.elf fft_test.elf dac_ut.elf dac_play.elf adc_rec.elf pwm_ut.elf fdmdv_profile.elf sm1000_leds_switches_ut.elf sm1000.elf adcdac_ut.elf freedv_tx_profile.elf freedv_rx_profile.elf adc_sd.elf usb_vcp_ut.elf fdmdv_dump_rt.elf tuner_ut.elf fast_dac_ut.elf +all: libstm32f4.a codec2_profile.elf fft_test.elf dac_ut.elf dac_play.elf adc_rec.elf pwm_ut.elf fdmdv_profile.elf sm1000_leds_switches_ut.elf sm1000.elf adcdac_ut.elf freedv_tx_profile.elf freedv_rx_profile.elf adc_sd.elf usb_vcp_ut.elf tuner_ut.elf fast_dac_ut.elf dl/$(PERIPHLIBZIP): mkdir -p dl @@ -117,7 +117,7 @@ dl/$(PERIPHLIBZIP): $(PERIPHLIBDIR): dl/$(PERIPHLIBZIP) cd dl; unzip $(PERIPHLIBZIP) - mv dl/$(PERIPHLIBDIR) $(PERIPHLIBDIR) + mv dl/$(PERIPHLIBDIR)_$(PERIPHLIBVER) $(PERIPHLIBDIR) libstm32f4.a: $(PERIPHLIBDIR) $(MAKE) $(STM32F4TEMPLATE)/system_stm32f4xx.o diff --git a/codec2-dev/stm32/src/fdmdv_profile.c b/codec2-dev/stm32/src/fdmdv_profile.c index 06dc5129..05b8d623 100644 --- a/codec2-dev/stm32/src/fdmdv_profile.c +++ b/codec2-dev/stm32/src/fdmdv_profile.c @@ -90,7 +90,7 @@ int main(int argc, char *argv[]) { COMP rx_fdm[FDMDV_NOM_SAMPLES_PER_FRAME]; int i, j, nin, reliable_sync_bit[2], sync_bit, bit_errors, ntest_bits, test_frame_sync; short *error_pattern; - struct FDMDV_STATS stats; + struct MODEM_STATS stats; PROFILE_VAR(mod_start, demod_start); machdep_profile_init (); diff --git a/codec2-dev/stm32/src/freedv_rx_profile.c b/codec2-dev/stm32/src/freedv_rx_profile.c index 5c0d216b..65b43ae1 100644 --- a/codec2-dev/stm32/src/freedv_rx_profile.c +++ b/codec2-dev/stm32/src/freedv_rx_profile.c @@ -53,18 +53,24 @@ int main(int argc, char *argv[]) { struct freedv *f; - short adc16k[FDMDV_OS_TAPS_16K+FREEDV_NSAMPLES_16K]; - short dac16k[FREEDV_NSAMPLES_16K]; - short adc8k[FREEDV_NSAMPLES]; - short dac8k[FDMDV_OS_TAPS_8K+FREEDV_NSAMPLES]; FILE *fin, *fout, *ftotal; int frame, nin_16k, nin, i, nout = 0; - struct FDMDV_STATS stats; + int n_samples, n_samples_16k; + int sync; + float snr_est; + PROFILE_VAR(fdmdv_16_to_8_start, freedv_rx_start, fdmdv_8_to_16_start); machdep_profile_init(); f = freedv_open(FREEDV_MODE_1600); + n_samples = freedv_get_n_speech_samples(f); + n_samples_16k = 2*n_samples; + + short adc16k[FDMDV_OS_TAPS_16K+n_samples_16k]; + short dac16k[n_samples_16k]; + short adc8k[n_samples]; + short dac8k[FDMDV_OS_TAPS_8K+n_samples]; // Receive --------------------------------------------------------------------- @@ -105,7 +111,6 @@ int main(int argc, char *argv[]) { nout = freedv_rx(f, &dac8k[FDMDV_OS_TAPS_8K], adc8k); nin = freedv_nin(f); nin_16k = 2*nin; - fdmdv_get_demod_stats(f->fdmdv, &stats); PROFILE_SAMPLE_AND_LOG(fdmdv_8_to_16_start, freedv_rx_start, " freedv_rx"); @@ -117,9 +122,9 @@ int main(int argc, char *argv[]) { machdep_profile_print_logged_samples(); fwrite(dac16k, sizeof(short), 2*nout, fout); - fdmdv_get_demod_stats(f->fdmdv, &stats); + freedv_get_modem_stats(f, &sync, &snr_est); printf("frame: %d nin_16k: %d sync: %d SNR: %3.2f \n", - ++frame, nin_16k, stats.sync, (double)stats.snr_est); + ++frame, nin_16k, sync, (double)snr_est); } fclose(fin); diff --git a/codec2-dev/stm32/src/freedv_tx_profile.c b/codec2-dev/stm32/src/freedv_tx_profile.c index 7391c521..54b58915 100644 --- a/codec2-dev/stm32/src/freedv_tx_profile.c +++ b/codec2-dev/stm32/src/freedv_tx_profile.c @@ -46,14 +46,15 @@ int main(int argc, char *argv[]) { struct freedv *f; - short inbuf[FREEDV_NSAMPLES], outbuf[FREEDV_NSAMPLES]; FILE *fin, *fout; - int frame; + int frame, n_samples; PROFILE_VAR(freedv_start); machdep_profile_init(); f = freedv_open(FREEDV_MODE_1600); + n_samples = freedv_get_n_speech_samples(f); + short inbuf[n_samples], outbuf[n_samples]; // Transmit --------------------------------------------------------------------- @@ -71,12 +72,12 @@ int main(int argc, char *argv[]) { frame = 0; - while (fread(inbuf, sizeof(short), FREEDV_NSAMPLES, fin) == FREEDV_NSAMPLES) { + while (fread(inbuf, sizeof(short), n_samples, fin) == n_samples) { PROFILE_SAMPLE(freedv_start); freedv_tx(f, outbuf, inbuf); PROFILE_SAMPLE_AND_LOG2(freedv_start, " freedv_tx"); - fwrite(outbuf, sizeof(short), FREEDV_NSAMPLES, fout); + fwrite(outbuf, sizeof(short), n_samples, fout); printf("frame: %d\n", ++frame); machdep_profile_print_logged_samples(); } diff --git a/codec2-dev/stm32/src/sm1000_main.c b/codec2-dev/stm32/src/sm1000_main.c index b40fa516..56a2b951 100644 --- a/codec2-dev/stm32/src/sm1000_main.c +++ b/codec2-dev/stm32/src/sm1000_main.c @@ -75,12 +75,9 @@ short aSine[] = { int main(void) { struct freedv *f; - short adc16k[FDMDV_OS_TAPS_16K+FREEDV_NSAMPLES_16K]; - short dac16k[FREEDV_NSAMPLES_16K]; - short adc8k[FREEDV_NSAMPLES]; - short dac8k[FDMDV_OS_TAPS_8K+FREEDV_NSAMPLES]; SWITCH_STATE ss; int nin, nout, i; + int n_samples, n_samples_16k; /* init all the drivers for various peripherals */ @@ -89,6 +86,13 @@ int main(void) { dac_open(4*DAC_BUF_SZ); adc_open(4*ADC_BUF_SZ); f = freedv_open(FREEDV_MODE_1600); + n_samples = freedv_get_n_speech_samples(f); + n_samples_16k = 2*n_samples; + + short adc16k[FDMDV_OS_TAPS_16K+n_samples_16k]; + short dac16k[n_samples_16k]; + short adc8k[n_samples]; + short dac8k[FDMDV_OS_TAPS_8K+n_samples]; /* put outputs into a known state */ @@ -114,35 +118,35 @@ int main(void) { /* ADC2 is the SM1000 microphone, DAC1 is the modulator signal we send to radio tx */ - if (adc2_read(&adc16k[FDMDV_OS_TAPS_16K], FREEDV_NSAMPLES_16K) == 0) { + if (adc2_read(&adc16k[FDMDV_OS_TAPS_16K], n_samples_16k) == 0) { GPIOE->ODR = (1 << 3); /* clipping indicator */ led_err(0); - for (i=0; i 28000) led_err(1); } - fdmdv_16_to_8_short(adc8k, &adc16k[FDMDV_OS_TAPS_16K], FREEDV_NSAMPLES); + fdmdv_16_to_8_short(adc8k, &adc16k[FDMDV_OS_TAPS_16K], n_samples); if (ss.mode == ANALOG) { - for(i=0; itotal_bit_errors = 0; + freedv_zero_total_bit_errors(f); if (adc1_read(&adc16k[FDMDV_OS_TAPS_16K], 2*nin) == 0) { GPIOE->ODR = (1 << 3); @@ -187,7 +189,7 @@ int main(void) { nout = freedv_rx(f, &dac8k[FDMDV_OS_TAPS_8K], adc8k); fdmdv_8_to_16_short(dac16k, &dac8k[FDMDV_OS_TAPS_8K], nout); dac2_write(dac16k, 2*nout); - led_rt(f->fdmdv_stats.sync); led_err(f->total_bit_errors); + led_rt(freedv_get_sync(f)); led_err(freedv_get_total_bit_errors(f)); GPIOE->ODR &= ~(1 << 3); } } -- 2.25.1