#include #include #include #include #include #include #include "hwlib.h" #include "soc_cv_av/socal/socal.h" #include "soc_cv_av/socal/hps.h" #include "soc_cv_av/socal/alt_gpio.h" #include #include "filtre.h" #include "kiss_fft.h" #include #include "hps_0.h" #define HW_REGS_BASE ( ALT_STM_OFST ) #define HW_REGS_SPAN ( 0x04000000 ) #define HW_REGS_MASK ( HW_REGS_SPAN - 1 ) typedef enum _etatsEffets { none, effet1, effet2, effet3 } etatsEffets; volatile unsigned long *h2p_lw_spi_addr=NULL; volatile unsigned long *h2p_lw_adc_addr=NULL; volatile unsigned long *button_addr=NULL; float valButtonMemo = 0; int main(int argc, char **argv){ int ret; void *virtual_base; int fd; int i; // Création de la configuration et des buffers in et out pour s(t) et S(f) const kiss_fft_cfg config = kiss_fft_alloc(NFFT, 0, NULL, NULL); const kiss_fft_cfg configInv = kiss_fft_alloc(NFFT, 1, NULL, NULL); kiss_fft_cpx* in = (kiss_fft_cpx*)malloc(NFFT*sizeof(kiss_fft_cpx)); kiss_fft_cpx* out = (kiss_fft_cpx*)malloc(NFFT*sizeof(kiss_fft_cpx)); kiss_fft_cpx* inv = (kiss_fft_cpx*)malloc(NFFT*sizeof(kiss_fft_cpx)); int cpt, sec, dodo; for(i = 0; i < NFFT; i++){ in[i].r = 0.0; inv[i].r = 0.0; } // map the address space for the ADC register into user space so we can interact with it. if( ( fd = open( "/dev/mem", ( O_RDWR | O_SYNC ) ) ) == -1 ) { printf( "ERROR: could not open \"/dev/mem\"...\n" ); return( 1 ); } //void *mmap(void *addr, size_t length, int protection, int flags, int fd, off_t offset); //addr est NULL, le noyau choisit l'adresse à laquelle créer la projection. virtual_base = mmap( NULL, HW_REGS_SPAN, ( PROT_READ | PROT_WRITE ), MAP_SHARED, fd, HW_REGS_BASE ); if( virtual_base == MAP_FAILED ) { printf( "ERROR: mmap() failed...\n" ); close( fd ); return(1); } h2p_lw_spi_addr=virtual_base + ( ( unsigned long )( ALT_LWFPGASLVS_OFST + SPI_0_BASE ) & ( unsigned long)( HW_REGS_MASK ) ); h2p_lw_adc_addr=virtual_base + ( ( unsigned long )( ALT_LWFPGASLVS_OFST + ADC_0_BASE ) & ( unsigned long)( HW_REGS_MASK ) ); button_addr=virtual_base + ( ( unsigned long )( ALT_LWFPGASLVS_OFST + BUTTON_BASE ) & ( unsigned long)( HW_REGS_MASK ) ); printf("Hello World !!! \n"); int data; etatsEffets etatCourant = none; while(1){ acquisition(h2p_lw_adc_addr, &data); in[cpt].r = (float)data; // Calcul de la FFT depuis in vers out cpt ++; printf("ADC: %.3f\n", (float)*h2p_lw_adc_addr/1000); // /1000 pour avoir la bonne valeur en tension et non // pas une valeur 0 -> 4096 data = 0b0001111111111000; //printf("data: %d\n", data); //printf("%.3fV: \r\n", (float)*(h2p_lw_adc_addr)/1000.0); //*(h2p_lw_spi_addr+1) = ((0x1 << 12) | *h2p_lw_adc_addr); //entrée spi sur 16 bits = 0001 (4 bits) concaténer de la sortie adc (sur 12 bits) //*(h2p_lw_spi_addr+1) = data; //entrée spi sur 16 bits = 0001 (4 bits) concaténer de la sortie adc (sur 12 bits) //printf("val-button = %f\n", (float)*button_addr); if ((valButtonMemo == 0) && ((float)*button_addr == 1)) { printf ("APPUI BOUTON\n"); switch (etatCourant) { case none: etatCourant = effet1; printf ("effect 1 selected\n"); break; case effet1: etatCourant = effet2; printf ("effect 2 selected\n"); break; case effet2: etatCourant = effet3; printf ("effect 3 selected\n"); break; case effet3: etatCourant = none; printf ("none effect selected\n"); break; default: break; } } switch (etatCourant) { case effet1: if(cpt == NFFT){ kiss_fft(config, in, out); // Calcul de la FFT inverse passeBas(out, 1000); kiss_fft(configInv, out, inv); for(i = 0; i < NFFT; i++) inv[i].r /= NFFT; cpt = 0;} *(h2p_lw_spi_addr+1) = inv[cpt].r; break; case effet2: if(cpt == NFFT){ kiss_fft(config, in, out); // Calcul de la FFT inverse passeHaut(out, 1000); kiss_fft(configInv, out, inv); for(i = 0; i < NFFT; i++) inv[i].r /= NFFT; cpt = 0;} *(h2p_lw_spi_addr+1) = inv[cpt].r; break; case none: *(h2p_lw_spi_addr+1) = data; break; default: break; } valButtonMemo = (float)*button_addr; } // détruit la projection dans la zone de mémoire spécifiée, et s'arrange pour que toute référence // ultérieure à cette zone mémoire déclenche une erreur d'adressage if( munmap( virtual_base, HW_REGS_SPAN ) != 0 ) { printf( "ERROR: munmap() failed...\n" ); close( fd ); return( 1 ); } close( fd ); // Libération des espaces mémoire alloués free(configInv); free(config); free(in); free(out); free(inv); return 0; }