Liangzhen Lai / Mbed 2 deprecated Orange_Ferrari_board_functional

Dependencies:   DDRO_Farrari mbed

Fork of DDRO_Farrari by Liangzhen Lai

main.cpp

Committer:
liangzhen
Date:
2014-02-20
Revision:
2:e94460b2149f
Parent:
1:6a820a0ca03b
Child:
3:e1a6e12233dd

File content as of revision 2:e94460b2149f:


#include "mbed.h"
#include "dac.h"
#include "board_test.h"
#include "scan.h"
#include "power.h"
#include "pinout.h"
#include "pll.h"
#include "lcd.h"
#include "jtag.h"
#include "mmap.h"
#include "clock.h"
#include "EasyBMP.h"
#include "main.h"

//#define WRITE_RESULTS
FILE *results_file;

DigitalOut myled(LED4);
#ifdef WRITE_RESULTS
//LocalFileSystem local("local");               // Create the local filesystem under the name "local"
#endif

int main()
{
    float core_volt = 1;
#ifdef WRITE_RESULTS
    results_file=fopen("/local/results.txt", "a");  // Open "out.txt" on the local file system for writing
#endif


    //wdt.kick(20.0);
    pc.printf("Begin FFT\r\n");
    power_down();
    power_up(core_volt); // Power Up Chip
    pc.printf("Powered up!\r\n");

    PORESETn = 0;
    CORERESETn = 0;
    wait_us(100);
    pc.getc();
    PORESETn = 1;
    CORERESETn = 1;
    pc.getc();
    JTAG jtag;
    int idcode = jtag.readID();
    if(idcode != 0x4ba00477) {
        pc.printf("ERROR: IDCode %X\r\n", idcode);
        wait(2);
        power_down();
        return -1;
    }
    pc.printf("IDCode %X\r\n", idcode);

    jtag.reset();
    jtag.leaveState();
    jtag.PowerupDAP();
    // setup necessary internal clock source selection
    jtag.writeMemory(intclk_source, 2);
    jtag.writeMemory(extclk_source, 1);
    jtag.writeMemory(ext_div_by, 10);
    for(int iter=0; iter<3; iter++) {
#ifdef WRITE_RESULTS
        fprintf(results_file,"Iteration: %d\n", iter);
#endif
        float voltage=1;
        for(int i=0; i<=5; i++) {
            voltage = 1 - 0.04*i;
            power_core(voltage);
#ifdef WRITE_RESULTS
            fprintf(results_file,"V: %f\n", voltage);
#endif
            int upper = 120;
            int lower = 22;
            while (upper-lower > 1) {
                int middle = (upper+lower)/2;
                middle = middle * 5;
                bool if_pass = true;
                for (int j=1; j<10; j++) {
                    if(!check_FFT_Freq(jtag,middle)) {
                        if_pass = false;
                        j=10;
                    }
                }
                if(if_pass) {
                    lower = middle/5;
                } else {
                    upper = middle/5;
                }
            }
            pc.printf("fft working frequency: %d MHz\r\n", lower*5);
#ifdef WRITE_RESULTS
            fprintf(results_file,"FFT: %d\n", lower*5);
#endif
            set_pll_frequency (200, jtag);
            DDRO_Sensor(jtag);
            wait(1);
            gain_ctrl=1;
#ifdef WRITE_RESULTS
            fprintf(results_file,"GAIN_CTRL = 1\r\n");
            fprintf(results_file,"SEN: %f\r\n",meas_sen.read());
            fprintf(results_file,"MEM1: %f\r\n",meas_mem1.read());
            fprintf(results_file,"MEM2: %f\r\n",meas_mem2.read());
            fprintf(results_file,"CORE: %f\r\n",meas_core.read());
#endif
            wait(1);
            gain_ctrl=0;
#ifdef WRITE_RESULTS

            fprintf(results_file,"GAIN_CTRL = 0\r\n");
            fprintf(results_file,"SEN: %f\r\n",meas_sen.read());
            fprintf(results_file,"MEM1: %f\r\n",meas_mem1.read());
            fprintf(results_file,"MEM2: %f\r\n",meas_mem2.read());
            fprintf(results_file,"CORE: %f\r\n",meas_core.read());
#endif
        }
    }
    /*

    jtag.writeMemory(ddro_pad_out, 0xffffffff);
    printf("Reading ddro pad out %x\r\n", jtag.readMemory(ddro_pad_out));
    jtag.writeMemory(ddro_div_by, 0xffffffff);
    printf("Reading ddro div by %x\r\n", jtag.readMemory(ddro_div_by));
    */



    pc.printf("Powering Down\r\n");
    power_down();
#ifdef WRITE_RESULTS
    fclose(results_file);
#endif
    pc.printf("Done\r\n");
    while(1) {
        myled = 1;
        wait(0.2);
        myled = 0;
        wait(0.2);
    }
}

int check_FFT_Freq(JTAG &jtag, int fMHz)
{
    if(jtag.loadProgram()) {
        dual_printf("Load Failed");
        exit(1);
    }
    set_pll_frequency (fMHz, jtag);
    //dual_printf("Resetting");
    CORERESETn = 0;
    CORERESETn = 1;
    wait(0.2);
    jtag.reset();
    jtag.leaveState();
    jtag.PowerupDAP();
    unsigned int buffer_fft[64];
    for (int number1=0; number1<=63; number1++) {
        buffer_fft[number1] = jtag.readMemory(0x24000100 + number1*4);
        jtag.writeMemory(0x24000100 + number1*4,0xF0F0F0F0);
        //printf("new[%d]: %d\r\n", number1, buffer_fft[number1]);
    }
    if ( buffer_fft[0] == 0x0000fffc && buffer_fft[1]==0x0000fffd && buffer_fft[2]==0xffc0000a && buffer_fft[3]==0x0000fffe &&
            buffer_fft[4]==0x0000fffd && buffer_fft[5]==0x0000ffff && buffer_fft[6]==0x0000fffd && buffer_fft[7]==0x00000000 &&
            buffer_fft[8]==0x0000ffff && buffer_fft[9]==0x0000ffff && buffer_fft[10]==0xfffeffff && buffer_fft[11]==0xffff0000 &&
            buffer_fft[12]==0x0000ffff && buffer_fft[13]==0xffff0000 && buffer_fft[14]==0xfffffffe && buffer_fft[15]==0xffff0000 &&
            buffer_fft[16]==0x00010000  && buffer_fft[17]==0x0001ffff && buffer_fft[18]==0x0000ffff && buffer_fft[19]==0x0001ffff &&
            buffer_fft[20]==0x0001fffe && buffer_fft[21]==0x0000fffe && buffer_fft[22]==0x0001fffe && buffer_fft[23]==0x0000ffff &&
            buffer_fft[24]==0x0000ffff && buffer_fft[25]==0x0001fffe && buffer_fft[26]==0x0000ffff && buffer_fft[27]==0x00010000 &&
            buffer_fft[28]==0x0001ffff && buffer_fft[29]==0x00010000 && buffer_fft[30]==0x0000ffff && buffer_fft[31]==0x00010000 &&
            buffer_fft[32]==0x0000ffff && buffer_fft[33]==0x0000ffff && buffer_fft[34]==0x0000ffff && buffer_fft[35]==0x0000ffff &&
            buffer_fft[36]==0x0000fffe && buffer_fft[37]==0x0000ffff && buffer_fft[38]==0x0000fffe && buffer_fft[39]==0x00000000 &&
            buffer_fft[40]==0xffffffff && buffer_fft[41]==0x0000ffff && buffer_fft[42]==0xffffffff && buffer_fft[43]==0x00000000 &&
            buffer_fft[44]==0x0000ffff && buffer_fft[45]==0x00000000 && buffer_fft[46]==0xffffffff && buffer_fft[47]==0x00000000 &&
            buffer_fft[48]==0x00000000 && buffer_fft[49]==0x00000000 && buffer_fft[50]==0x00000000 && buffer_fft[51]==0x00000000 &&
            buffer_fft[52]==0x0000ffff && buffer_fft[53]==0x0000ffff && buffer_fft[54]==0x0000ffff && buffer_fft[55]==0x00000000 &&
            buffer_fft[56]==0xfffeffff && buffer_fft[57]==0xffffffff && buffer_fft[58]==0xffff0000 && buffer_fft[59]==0x00000000 &&
            buffer_fft[60]==0x0000ffff && buffer_fft[61]==0x00000000 && buffer_fft[62]==0x003d000c && buffer_fft[63]==0x00000000 ) {
        return 1;
    } else {
        return 0;
    }
}

void DDRO_Sensor(JTAG &jtag)
{
    /**********************enable****************************************/
    jtag.writeMemory(ddro_syn_en, 0xffffffff);
    jtag.writeMemory(ddro_inv_en, 0xffffffff);
    /**********************set ref_clk and samp_clk**********************/
    jtag.writeMemory(ddro_ref_src, 0x00000002);
    /**********************write threshold*******************************/
    jtag.writeMemory(ddro_threshold, 100000);
    //jtag.writeMemory(0xe000e104, 0x000000ff); // enable interrupts

    for (int ro_id=3; ro_id<=15; ro_id++) {
        unsigned int meas1_s, meas1_e, meas2_s, meas2_e;
        int delta1, delta2;
        //pc.printf("RO %d\r\n ", ro_id-2);
        jtag.writeMemory(ddro_samp_src, ro_id);
        jtag.writeMemory(ddro_start, 0);
        meas1_s = jtag.readMemory(ddro_count);
        //pc.printf("Counter starts at: %d  ", meas1);
        jtag.writeMemory(ddro_start, 1);
        wait_us(50000);
        jtag.writeMemory(ddro_start, 0);
        meas1_e = jtag.readMemory(ddro_count);
        //pc.printf("ends at: %d\r\n", meas1);
        delta1 = meas1_e - meas1_s;

        jtag.writeMemory(ddro_samp_src, ro_id);
        jtag.writeMemory(ddro_start, 0);
        meas2_s = jtag.readMemory(ddro_count);
        //pc.printf("Counter starts at: %d  ", meas1);
        jtag.writeMemory(ddro_start, 1);
        wait_us(50000);
        jtag.writeMemory(ddro_start, 0);
        meas2_e = jtag.readMemory(ddro_count);
        delta2 = meas2_e - meas2_s;
        //printf("ends at: %d\r\n", meas1);

        if ( (float)delta2/meas1_e>=0.95 && (float)delta2/meas1_e<=1.05 ) {
            pc.printf("RO %d:  %d\n\r", ro_id, (delta2+meas1_e)/2);
#ifdef WRITE_RESULTS
            fprintf(results_file,"RO %d:  %d\n\r", ro_id, (delta2+meas1_e)/2);
#endif
        } else if ((float)delta1/meas2_e>=0.95 && (float)delta1/meas2_e<=1.05 ) {
            pc.printf("RO %d:  %d\n\r", ro_id, (delta1+meas2_e)/2);
#ifdef WRITE_RESULTS
            fprintf(results_file,"RO %d:  %d\n\r", ro_id, (delta1+meas2_e)/2);
#endif
        } else if ( (float)delta2/delta1 >=0.95 && (float)delta2/delta1<=1.05 ) {
            pc.printf("RO %d:  %d\n\r", ro_id, (delta1+delta2)/2);
#ifdef WRITE_RESULTS
            fprintf(results_file,"RO %d:  %d\n\r", ro_id, (delta1+delta2)/2);
#endif
        } else if ( (float)meas2_e/meas1_e >=0.95 && (float)meas2_e/meas1_e<=1.05 ) {
            pc.printf("RO %d:  %d\n\r", ro_id, (meas1_e+meas2_e)/2);
#ifdef WRITE_RESULTS
            fprintf(results_file,"RO %d:  %d\n\r", ro_id, (meas1_e+meas2_e)/2);
#endif
        } else {
            pc.printf("Error in measuring DDRO %d\n\r", ro_id);
#ifdef WRITE_RESULTS
            fprintf(results_file,"Error in measuring DDRO %d\n\r", ro_id);
#endif
        }
    }
}