Subversion Repositories f9daq

Rev

Blame | Last modification | View Log | RSS feed

/*
 * data_handling.c
 *
 *  Created on: 18. dec. 2018
 *      Author: Domen
 */


#include <stdint.h>
#include "data_handling.h"
#include <sys/mman.h>


/*----------------------------------STATIC FUNCTIONS PROTOTYPES---------------------------------*/

uint32_t read__value(uint32_t *addr);
void write_value (uint32_t *addr, uint32_t value);











/* -----------------------------------------STATIC (PRIVATE) FUNCTIONS----------------------------------*/


uint32_t read_value(uint32_t *addr) //mogoce dodaj *
{


        uint32_t result = 0;

        result = *(addr);

        return result;
}



void write_value(uint32_t *addr, uint32_t value)
{
        *addr = value;
}







/*-----------------------------------------PUBLIC FUNCTIONS----------------------------------*/

uint32_t *HW_init(void)
{

        void *map_base = (void *)(-1);  //naslov, kjer se mi zacne mapiran spomin
        static void *virt_addr;
        int fd = -1; //file descriptor



        //odpiram svoj file
        if ( (fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1 )
        {
                perror("ERROR: open."); //sporoci napako, ce ni OK odprl
        }


        //mapiram memmory v zgoraj odprtem file-u in preverjam, ce se je OK odprl
        map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, HW_address & ~MAP_MASK); //zakaj ni tukaj za offset kar samo HW_address

        if(map_base == (void *) -1)
        {
                perror("ERROR: mmap ni pravilno lociral spomina");
        }

        printf("MAP_BASE: %p\n",map_base);
        virt_addr = map_base + (HW_address & MAP_MASK); //ne vem, ce to potrebno, ker bi moral ze v map_base imeti pravi naslov
        virt_addr = (uint32_t *)virt_addr; //castam na uint32_t, da ga read_value lahko sprejme


        /* map base bi mi ze  moral vrniti moj pravi HW_naslov, se pravi 0x40500000, ker
         * v funkciji mmap dodam offset, kje naj locira pomnilnik: zaène na NULL v /dev/mem, offset pa je HW_address & ~MAP_MASK
         * kar je enako 0x40500000, maska poskrbi samo za to, da je spodnjih 12 bitov na 0, ker so memory blocks poravnani na
         * zaèetek strani (glej tole: https://www.youtube.com/watch?v=XV5sRaSVtXQ at 5.20)
         *
         *
         */




        return virt_addr;
}





uint8_t HW_comm ( HW_system *strct, uint32_t *reg_addr)
{
        uint32_t HW_write = 0;
        uint32_t HW_read = 0;


        if ( (strct -> HW_config_flag) == 1 )
        {
                //pisanje ukazov v register
                HW_write = (  (strct -> start) |
                                     ((strct -> reset) << 1) |
                                         ((strct -> threshold) << 8) |
                                         ((strct -> acq_window) << 19) |
                                         ((strct -> sw_trigger) << 27)
                                   );
                //*reg_addr = HW_write;
                write_value(reg_addr, HW_write);
                //printf("VPIS v HW:0x%08x\n",HW_write);
                return 1; //sistem nastavljen
        }

        //branje histograma iz registra in shranjevanje podatkov v strukturo
        else if ( (strct -> send_data_flag) == 1)
        {
                HW_read = read_value(reg_addr);

                (strct -> UC_rd_en_current) = (HW_read & UC_rd_en_current_mask) >> 1;
                (strct -> UC_rd_en_final) = (HW_read & UC_rd_en_final_mask);
                (strct -> hist_data) = (HW_read & HIST_MASK) >> 8 ;


                //printf("PREBRANI PODATKI:0x%08x\n",HW_read);
                //printf("UC_rd_en_current: 0x%08x\n ",strct ->UC_rd_en_current);



                return 2; //podatki pripravljeni za posiljanje v PC
        }

        else
                return 0;

}






                /*

                //------------TRENUTNI HISTOGRAM-----------
                for (int idx=0; idx<BIN_NUM; idx++)
                {

                        HW_read = read_value(reg_addr);

                        (strct -> UC_rd_en_current) = HW_read & UC_rd_en_current_mask;
                        (strct -> UC_rd_en_final) = HW_read & UC_rd_en_final_mask;


                        if ( (HW_read & UC_rd_en_final_mask) == UC_rd_en_final_mask ) //prisel je koncni histogram, ne vpisuj vec v trenutnega
                        {
                                break;
                        }
                        else
                        {
                                //(strct -> hist_idx) = idx;
                                (strct -> hist_data+idx) = HW_read & HIST_MASK;
                        }


                        if(idx == BIN_NUM -1)
                        {
                                return 1;
                        }
                }


                //------------------KONCNI HISTOGRAM----------------
                if ( (strct -> UC_rd_en_final) == 1 && (strct -> UC_rd_en_current) == 0 )
                {
                        (strct -> hist_data + 0) = HW_read & HIST_MASK; //vpis prvega podatka koncnega histograma

                        for (int idx=1; idx<BIN_NUM; idx++)
                        {
                                HW_read = read_value(reg_addr);

                                (strct -> UC_rd_en_current) = HW_read & UC_rd_en_current_mask;
                                (strct -> UC_rd_en_final) = HW_read & UC_rd_en_final_mask;
                                //(strct -> hist_idx) = idx;
                                (strct -> hist_data+idx) = HW_read & HIST_MASK;
                        }


                        if(idx == BIN_NUM -1)
                        {
                                return 1;
                        }

                }
                */



//      }

//}