Liangzhen Lai / Mbed 2 deprecated DDRO_Farrari

Dependencies:   mbed

Dependents:   Orange_Ferrari_board_functional

Files at this revision

API Documentation at this revision

Comitter:
liangzhen
Date:
Mon Oct 21 22:36:51 2013 +0000
Parent:
0:84a8bcfbdec9
Commit message:
mbed code for Farrari board

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
main.h Show annotated file Show diff for this revision Revisions of this file
mmap.h Show annotated file Show diff for this revision Revisions of this file
pinout.h Show annotated file Show diff for this revision Revisions of this file
pll.cpp Show annotated file Show diff for this revision Revisions of this file
pll.h Show annotated file Show diff for this revision Revisions of this file
power.cpp Show annotated file Show diff for this revision Revisions of this file
power.h Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Mon Oct 07 22:58:19 2013 +0000
+++ b/main.cpp	Mon Oct 21 22:36:51 2013 +0000
@@ -9,94 +9,69 @@
 #include "lcd.h"
 #include "jtag.h"
 #include "mmap.h"
-#include "clock.h"   
+#include "clock.h"
 #include "EasyBMP.h"
+#include "main.h"
 
-extern "C" void mbed_reset();
-extern "C" void HardFault_Handler() { mbed_reset(); }
-class Watchdog {
-public:
-// Load timeout value in watchdog timer and enable
-    void kick(float s) {
-        LPC_WDT->WDCLKSEL = 0x1;                // Set CLK src to PCLK
-        uint32_t clk = SystemCoreClock / 16;    // WD has a fixed /4 prescaler, PCLK default is /4
-        LPC_WDT->WDTC = s * (float)clk;
-        LPC_WDT->WDMOD = 0x3;                   // Enabled and Reset
-        kick();
-    }
-// "kick" or "feed" the dog - reset the watchdog timer
-// by writing this required bit pattern
-    void kick() {
-        LPC_WDT->WDFEED = 0xAA;
-        LPC_WDT->WDFEED = 0x55;
-    }
-};
-Watchdog wdt;
-void DDRO_Sensor(void);
-int FFT_Freq(float);
+int main()
+{
+    float core_volt = 1;
 
-int main() {
-    float new_power = 0.9;
-   
-    //wdt.kick(20.0); 
+    //wdt.kick(20.0);
     pc.printf("Begin FFT\r\n");
-    char buffer[21];
-   
     power_down();
-    power_up(new_power); // Power Up Chip
+    power_up(core_volt); // Power Up Chip
     pc.printf("Powered up!\r\n");
 
     PORESETn = 0;
     CORERESETn = 0;
+    wait_us(100);
     PORESETn = 1;
     CORERESETn = 1;
-    
+
     JTAG jtag;
     int idcode = jtag.readID();
     if(idcode != 0x4ba00477) {
         pc.printf("ERROR: IDCode %X\r\n", idcode);
-        wait(20);
+        wait(2);
         power_down();
         return -1;
     }
     pc.printf("IDCode %X\r\n", idcode);
-   
+
     jtag.reset();
     jtag.leaveState();
     jtag.PowerupDAP();
-    int freq = FFT_Freq(new_power);
-    pc.printf("fft working frequency: %d MHz\r\n", freq);
+    // setup necessary internal clock source selection
+    jtag.writeMemory(intclk_source, 2);
+    jtag.writeMemory(extclk_source, 1);
+    jtag.writeMemory(ext_div_by, 10);
+    power_core(1);
+    /*
+    for (int i=0; i<2; i++) {
+        int upper = 120;
+        int lower = 22;
+        while (upper-lower > 1) {
+            int middle = (upper+lower)/2;
+            middle = middle * 5;
+            if(check_FFT_Freq(jtag, middle)) {
+                lower = middle/5;
+            } else {
+                upper = middle/5;
+            }
+        }
+        pc.printf("fft working frequency: %d MHz\r\n", lower*5);
+    }
+    */
+    set_pll_frequency (200, jtag);
+    DDRO_Sensor(jtag);
+    /*
     
-    DDRO_Sensor(); 
     jtag.writeMemory(ddro_pad_out, 0xffffffff);
-    printf("Reading ddro pad out %x\n", jtag.readMemory(ddro_pad_out));
+    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\n", jtag.readMemory(ddro_div_by));
-   
-    //wdt.kick();
-    gain_ctrl=0;
-    pc.printf("GAIN_CTRL = 0\r\n");
-    pc.printf("SEN: %f\r\n",meas_sen.read());
-    pc.printf("MEM1: %f\r\n",meas_mem1.read());
-    pc.printf("MEM2: %f\r\n",meas_mem2.read());
-    pc.printf("CORE: %f\r\n",meas_core.read());
-    pc.getc();
-    wait(1);
-    gain_ctrl=1;
-    pc.printf("GAIN_CTRL = 1\r\n");
-    pc.printf("SEN: %f\r\n",meas_sen.read());
-    pc.printf("MEM1: %f\r\n",meas_mem1.read());
-    pc.printf("MEM2: %f\r\n",meas_mem2.read());
-    pc.printf("CORE: %f\r\n",meas_core.read());
-    pc.getc();
-    wait(1);
-    gain_ctrl=0;
-    pc.printf("GAIN_CTRL = 0\r\n");
-    pc.printf("SEN: %f\r\n",meas_sen.read());
-    pc.printf("MEM1: %f\r\n",meas_mem1.read());
-    pc.printf("MEM2: %f\r\n",meas_mem2.read());
-    pc.printf("CORE: %f\r\n",meas_core.read());
-    pc.getc();
+    printf("Reading ddro div by %x\r\n", jtag.readMemory(ddro_div_by));
+
     wait(1);
     gain_ctrl=1;
     pc.printf("GAIN_CTRL = 1\r\n");
@@ -104,243 +79,94 @@
     pc.printf("MEM1: %f\r\n",meas_mem1.read());
     pc.printf("MEM2: %f\r\n",meas_mem2.read());
     pc.printf("CORE: %f\r\n",meas_core.read());
-    pc.getc();
-    char paus;
+
+    wait(1);
+    gain_ctrl=0;
+    pc.printf("GAIN_CTRL = 0\r\n");
+    pc.printf("SEN: %f\r\n",meas_sen.read());
+    pc.printf("MEM1: %f\r\n",meas_mem1.read());
+    pc.printf("MEM2: %f\r\n",meas_mem2.read());
+    pc.printf("CORE: %f\r\n",meas_core.read());
+    */
+
     pc.printf("Powering Down\r\n");
     power_down();
     pc.printf("Done\r\n");
 }
 
-int FFT_Freq(float vdd) {
-    
-    JTAG jtag;
-    char buffer[21];
-    int counter_set=200;
-    int flag=0;
-    while(flag==0){
-    //load program
-        
-        if(jtag.loadProgram()) {
-            dual_printf("Load Failed");
-            exit(1);
-        }
-        jtag.writeMemory(PLL_RESET, 0);
-        jtag_pll(jtag, 1, 1, counter_set, 1, 10, 32 );
-        jtag.writeMemory(PLL_RESET, 1);
-        jtag.writeMemory(PLL_RESET, 0);
-        unsigned long long freq = calc_pll_freqs(1, 1, counter_set, 1, 10, 32);
-        freq = freq / 1000000; // in MHz
-        int fMHz = freq;
-        // dual_printf(buffer);
-         power_core(vdd);
-    
-         //dual_printf("Resetting");
-         CORERESETn = 0;
-         CORERESETn = 1;
-         wait(0.2);
-         jtag.reset();
-         jtag.leaveState();
-         jtag.PowerupDAP();
-        //  dual_printf("Reset finished");
-    
-    
-         unsigned int buffer_fft[64];
-         for (int number1=0; number1<=63; number1++) {
-               buffer_fft[number1] = jtag.readMemory(0x24000100 + number1*4);
-        //printf("new[%d]: %x\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 ) {
-              //printf("***********************maximum freq ***********************   %d", fMHz);
-                     flag = 1;
-              //return fMHz;
-              }            
-          else counter_set = counter_set-1; 
+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]);
     }
-    unsigned long long freq = calc_pll_freqs(1, 1, counter_set, 1, 10, 32);
-    freq = freq / 1000000; // in MHz
-    int fMHz = freq;
-    return fMHz;
+    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(void){
-    JTAG jtag;
+void DDRO_Sensor(JTAG &jtag)
+{
     /**********************enable****************************************/
     jtag.writeMemory(ddro_syn_en, 0xffffffff);
-    //printf("Reading ddro syn en %x\n", jtag.readMemory(ddro_syn_en));
     jtag.writeMemory(ddro_inv_en, 0xffffffff);
-   // printf("Reading ddro inv en %x\n", jtag.readMemory(ddro_inv_en));
-    
     /**********************set ref_clk and samp_clk**********************/
-    jtag.writeMemory(ddro_samp_src, 0x00000000);
-    //printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
-    jtag.writeMemory(ddro_ref_src, 0x00000003);
-    //printf("Reading samp src %x\n", jtag.readMemory(ddro_samp_src));
-    
+    jtag.writeMemory(ddro_ref_src, 0x00000002);
     /**********************write threshold*******************************/
-   // printf("Writing threshold\n");
-    jtag.writeMemory(ddro_threshold, 10);
-   // printf("Reading threshold %d\n", jtag.readMemory(ddro_threshold));
+    jtag.writeMemory(ddro_threshold, 100000);
+    //jtag.writeMemory(0xe000e104, 0x000000ff); // enable interrupts
 
-    jtag.writeMemory(0xe000e104, 0x000000ff); // enable interrupts
-    
-    /**********************start DDRO************************************/
-  //  printf("Ready to start DDRO \n");
-  //  printf("DDRO starting\n");
-    jtag.writeMemory(ddro_start, 1);//*ddro_start = 1;
-    
-    /*********************output*****************************************/
-    printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
-    jtag.writeMemory(ddro_start, 0);//*ddro_start = 1;
-  
-  
-  
-    
-    jtag.writeMemory(ddro_ref_src, 0x00000004);
-    printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
-    jtag.writeMemory(ddro_start, 1);//*ddro_start = 1;
-    printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
-    jtag.writeMemory(ddro_start, 0);
-    
-    jtag.writeMemory(ddro_ref_src, 0x00000005);
-    printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
-    jtag.writeMemory(ddro_start, 1);
-    printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
-    jtag.writeMemory(ddro_start, 0);
-    
-    jtag.writeMemory(ddro_ref_src, 0x00000006);
-    printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
-    jtag.writeMemory(ddro_start, 1);
-    printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
-    jtag.writeMemory(ddro_start, 0);
-    
-    jtag.writeMemory(ddro_ref_src, 0x00000007);
-    printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
-    jtag.writeMemory(ddro_start, 1);
-    printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
-    jtag.writeMemory(ddro_start, 0);
-    
-    jtag.writeMemory(ddro_ref_src, 0x00000008);
-    printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
-    jtag.writeMemory(ddro_start, 1);
-    printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
-    jtag.writeMemory(ddro_start, 0);
-    
-    jtag.writeMemory(ddro_ref_src, 0x00000009);
-    printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
-    jtag.writeMemory(ddro_start, 1);
-    printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
-    jtag.writeMemory(ddro_start, 0);
-    
-    jtag.writeMemory(ddro_ref_src, 0x0000000a);
-    printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
-    jtag.writeMemory(ddro_start, 1);
-    printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
-    jtag.writeMemory(ddro_start, 0);
-    
-    jtag.writeMemory(ddro_ref_src, 0x0000000b);
-    printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
-    jtag.writeMemory(ddro_start, 1);
-    printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
-    jtag.writeMemory(ddro_start, 0);
-    
-    jtag.writeMemory(ddro_ref_src, 0x0000000c);
-    printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
-    jtag.writeMemory(ddro_start, 1);
-    printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
-    jtag.writeMemory(ddro_start, 0);
-    
-    jtag.writeMemory(ddro_ref_src, 0x0000000d);
-    printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
-    jtag.writeMemory(ddro_start, 1);
-    printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
-    jtag.writeMemory(ddro_start, 0);
-    
-    jtag.writeMemory(ddro_ref_src, 0x0000000e);
-    printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
-    jtag.writeMemory(ddro_start, 1);
-    printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
-    jtag.writeMemory(ddro_start, 0);
-    
-    jtag.writeMemory(ddro_ref_src, 0x0000000f);
-    printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
-    jtag.writeMemory(ddro_start, 1);
-    printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
-    jtag.writeMemory(ddro_start, 0);
-    
-    jtag.writeMemory(ddro_ref_src, 0x00000010);
-    printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
-    jtag.writeMemory(ddro_start, 1);
-    printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
-    jtag.writeMemory(ddro_start, 0);
-    
-    jtag.writeMemory(ddro_ref_src, 0x00000011);
-    printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
-    jtag.writeMemory(ddro_start, 1);
-    printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
-    jtag.writeMemory(ddro_start, 0);
-    
-    jtag.writeMemory(ddro_ref_src, 0x00000012);
-    printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
-    jtag.writeMemory(ddro_start, 1);
-    printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
-    jtag.writeMemory(ddro_start, 0);
-    
-    jtag.writeMemory(ddro_ref_src, 0x00000013);
-    printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
-    jtag.writeMemory(ddro_start, 1);
-    printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
-    jtag.writeMemory(ddro_start, 0);
-    
-    jtag.writeMemory(ddro_ref_src, 0x00000014);
-    printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
-    jtag.writeMemory(ddro_start, 1);
-    printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
-    jtag.writeMemory(ddro_start, 0);
-    
-    jtag.writeMemory(ddro_ref_src, 0x00000015);
-    printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
-    jtag.writeMemory(ddro_start, 1);
-    printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
-    jtag.writeMemory(ddro_start, 0);
-    
-    jtag.writeMemory(ddro_ref_src, 0x00000016);
-    printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
-    jtag.writeMemory(ddro_start, 1);
-    printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
-    jtag.writeMemory(ddro_start, 0);
-    
-    jtag.writeMemory(ddro_ref_src, 0x00000017);
-    printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
-    jtag.writeMemory(ddro_start, 1);
-    printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
-    jtag.writeMemory(ddro_start, 0);
-    
-    jtag.writeMemory(ddro_ref_src, 0x00000018);
-    printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
-    jtag.writeMemory(ddro_start, 1);
-    printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
-    jtag.writeMemory(ddro_start, 0);
-    
-    jtag.writeMemory(ddro_ref_src, 0x00000019);
-    printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
-    jtag.writeMemory(ddro_start, 1);
-    printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
-    jtag.writeMemory(ddro_start, 0);
-    
- }
+    for (int ro_id=3;ro_id<=15;ro_id++) {
+        pc.printf("RO %d\r\n ", ro_id-2);
+        jtag.writeMemory(ddro_samp_src, ro_id);
+        jtag.writeMemory(ddro_start, 0);
+        int meas1 = 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 = jtag.readMemory(ddro_count);
+        pc.printf("ends at: %d\r\n", meas1);
+        
+        jtag.writeMemory(ddro_samp_src, ro_id);
+        jtag.writeMemory(ddro_start, 0);
+        meas1 = 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 = jtag.readMemory(ddro_count);
+        printf("ends at: %d\r\n", meas1);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.h	Mon Oct 21 22:36:51 2013 +0000
@@ -0,0 +1,27 @@
+#ifndef MAIN_H
+#define MAIN_H
+
+extern "C" void mbed_reset();
+extern "C" void HardFault_Handler() { mbed_reset(); }
+class Watchdog {
+public:
+// Load timeout value in watchdog timer and enable
+    void kick(float s) {
+        LPC_WDT->WDCLKSEL = 0x1;                // Set CLK src to PCLK  
+        uint32_t clk = SystemCoreClock / 16;    // WD has a fixed /4 prescaler, PCLK default is /4
+        LPC_WDT->WDTC = s * (float)clk;
+        LPC_WDT->WDMOD = 0x3;                   // Enabled and Reset
+        kick();
+    }
+// "kick" or "feed" the dog - reset the watchdog timer
+// by writing this required bit pattern
+    void kick() {
+        LPC_WDT->WDFEED = 0xAA;
+        LPC_WDT->WDFEED = 0x55;
+    }
+};
+Watchdog wdt;
+
+void DDRO_Sensor(JTAG &jtag);
+int check_FFT_Freq(JTAG &jtag, int fMHz);
+#endif
\ No newline at end of file
--- a/mmap.h	Mon Oct 07 22:58:19 2013 +0000
+++ b/mmap.h	Mon Oct 21 22:36:51 2013 +0000
@@ -40,6 +40,56 @@
 #define ext_div_by 0x44100018///////////////////////////////////////
 #define extclk_source 0x4410001c
 
+/*
+   always @*
+   begin
+      case (intclk_source)
+      2'b00 : HCLK = HCLK_EXT;
+      2'b01 : HCLK = ring_osc_HCLK;
+      2'b10 : HCLK = PLL_PLLOUTA;
+      2'b11 : HCLK = PLL_PLLOUTB;
+      default : HCLK = HCLK_EXT;
+      endcase
+   end
+
+
+
+   always @*
+   begin
+      case (extclk_source)
+      2'b00 : HCLK_div_down = HCLK_EXT;
+      2'b01 : HCLK_div_down = HCLK_divider;
+      2'b10 : HCLK_div_down = PLL_PLLOUTA;
+      2'b11 : HCLK_div_down = PLL_PLLOUTB;
+      default : HCLK_div_down = HCLK_EXT;
+      endcase
+   end
+   
+      always @*
+   begin
+      case (ext_div_by)
+4'd0 : HCLK_divider = HCLK_div_2;
+4'd1 : HCLK_divider = HCLK_div_2;
+4'd2 : HCLK_divider = HCLK_div_4;
+4'd3 : HCLK_divider = HCLK_div_8;
+4'd4 : HCLK_divider = HCLK_div_16;
+4'd5 : HCLK_divider = HCLK_div_32;
+4'd6 : HCLK_divider = HCLK_div_64;
+4'd7 : HCLK_divider = HCLK_div_128;
+4'd8 : HCLK_divider = HCLK_div_256;
+4'd9 : HCLK_divider = HCLK_div_512;
+4'd10 : HCLK_divider = HCLK_div_1024;
+4'd11 : HCLK_divider = HCLK_div_2048;
+4'd12 : HCLK_divider = HCLK_div_4096;
+4'd13 : HCLK_divider = HCLK_div_8192;
+4'd14 : HCLK_divider = HCLK_div_16384;
+4'd15 : HCLK_divider = HCLK_div_32768;
+      default : HCLK_divider = HCLK_div_2;
+      endcase
+   end
+
+*/
+
 // Resets
 #define reset_reg 0x44000004
 #define RESET_scan 0x44100020
@@ -57,6 +107,42 @@
 #define ddro_done 0x44100060
 #define ddro_count 0x44100064
 
+/*
+ reg          ref_clk;
+   always @*
+   begin
+      case(ref_src)
+      5'h0:  ref_clk = HCLK;
+      5'h1:  ref_clk = ring_osc_HCLK;
+      5'h2:  ref_clk = PLL_REFCLK;
+      5'h3:  ref_clk = syn_out[0];
+      5'h4:  ref_clk = syn_out[1];
+      5'h5:  ref_clk = syn_out[2];
+      5'h6:  ref_clk = syn_out[3];
+      5'h7:  ref_clk = syn_out[4];
+      5'h8:  ref_clk = syn_out[5];
+      5'h9:  ref_clk = syn_out[6];
+      5'ha:  ref_clk = syn_out[7];
+      5'hb:  ref_clk = syn_out[8];
+      5'hc:  ref_clk = inv_out[0];
+      5'hd:  ref_clk = inv_out[1];
+      5'he:  ref_clk = inv_out[2];
+      5'hf:  ref_clk = inv_out[3];
+      5'h10: ref_clk = inv_out[4];
+      5'h11: ref_clk = inv_out[5];
+      5'h12: ref_clk = inv_out[6];
+      5'h13: ref_clk = inv_out[7];
+      5'h14: ref_clk = inv_out[8];
+      5'h15: ref_clk = inv_out[9];
+      5'h16: ref_clk = OXIDE_CLK;
+      5'h17: ref_clk = PMOS_CLK;
+      5'h18: ref_clk = NMOS_CLK;
+      5'h19: ref_clk = TEMP_CLK;
+      default: ref_clk = HCLK;
+      endcase
+   end
+*/
+
 // Sensors
 #define sensor_disable 0x44100048
 #define sensor_oxide_stress 0x4410004c
--- a/pinout.h	Mon Oct 07 22:58:19 2013 +0000
+++ b/pinout.h	Mon Oct 21 22:36:51 2013 +0000
@@ -73,4 +73,4 @@
 #define RING_OSC_NBIAS  ADDR_0,CHAN_F
 
 // 20 MHz Crystal
-#define PLL_REF 20000000
\ No newline at end of file
+#define PLL_REF 20000
\ No newline at end of file
--- a/pll.cpp	Mon Oct 07 22:58:19 2013 +0000
+++ b/pll.cpp	Mon Oct 21 22:36:51 2013 +0000
@@ -25,24 +25,24 @@
         pc.printf("RangeB out of 1-32 range\r\n");
     }
     
-    unsigned long long dco = PLL_REF / prediv * multint_upper * multint;
-    if(dco < 2500000000 || dco > 5000000000){
-        pc.printf("Dco out of 2.5G-5G range\r\n");
+    int dco = (PLL_REF / prediv) * multint_upper * multint;
+    if(dco < 2500000 || dco > 5000000){
+        pc.printf("Dco=%d out of 2.5G-5G range\r\n",dco);
     }
-    unsigned long long internal = dco / multint_upper;
-    if(internal < 9800000 || internal > 3200000000){
-       //\ pc.printf("Dco out of 9.8M-3.2G range\r\n");
+    int internal = dco / multint_upper;
+    if(internal < 9800 || internal > 3200000){
+       pc.printf("internal=%d out of 9.8M-3.2G range\r\n",internal);
     }
-    unsigned long long prescale_dco = dco / range_upper;
-    if(prescale_dco > 3200000000){
-       // pc.printf("Prescale DCO out of 0-3.2G range\r\n");
+    int prescale_dco = dco / range_upper;
+    if(prescale_dco > 3200000){
+       pc.printf("Prescale DCO out of 0-3.2G range\r\n");
     }
-    unsigned long long out_a = prescale_dco / rangea;
-    if(out_a < 20000000 || out_a > 3000000000){
+    int out_a = prescale_dco / rangea;
+    if(out_a < 20000 || out_a > 3000000){
         pc.printf("Out A out of 20M-3.0G range\r\n");
     }
-    unsigned long long out_b = prescale_dco / rangeb;
-    if(out_b < 20000000 || out_b > 3000000000){
+    int out_b = prescale_dco / rangeb;
+    if(out_b < 20000 || out_b > 3000000){
         pc.printf("Out B out of 20M-3.0G range\r\n");
     }
     
@@ -107,7 +107,6 @@
     range_upper   = get_binline_by_num("/local/Prangeup.txt", range_upper);
     rangea        = get_binline_by_num("/local/Prange.txt",   rangea);
     rangeb        = get_binline_by_num("/local/Prange.txt",   rangeb);
-    
     jtag.writeMemory(PLL_CE1CCB,   1);
     jtag.writeMemory(PLL_CE1MPGC1, 1);
     jtag.writeMemory(PLL_FFTUNE,   fftune(0));
@@ -115,9 +114,9 @@
     jtag.writeMemory(PLL_LFTUNE_40_32,   lftune_hi());
     jtag.writeMemory(PLL_INTFBK,   1);
     jtag.writeMemory(PLL_PREDIV,   prediv);
-    jtag.writeMemory(PLL_MULTINT,  multint_upper << 8 | multint);
     jtag.writeMemory(PLL_RANGEA,   range_upper << 5 | rangea);
     jtag.writeMemory(PLL_RANGEB,   range_upper << 5 | rangeb);
+    jtag.writeMemory(PLL_MULTINT,  multint_upper << 8 | multint);
 }
 
 
@@ -140,4 +139,61 @@
 unsigned long long lftune(){
     // 41 bits
     return 0x05040100000L;
+}
+
+/*
+unsigned long long calc_pll_freqs(unsigned int prediv, unsigned int multint_upper, unsigned int multint, 
+                            unsigned int range_upper, unsigned int rangea, unsigned int rangeb)
+                            dco = (PLL_REF / prediv) * multint_upper * multint;
+                            prescale_dco = dco / range_upper;
+                            out_a = prescale_dco / rangea;
+*/
+int set_pll_frequency (int fMHz, JTAG &jtag) {
+  jtag.writeMemory(intclk_source, 0);
+  int counter = fMHz / 5;
+  int frequency = counter * 5;
+  if (frequency >= 625) {
+    pc.printf("Frequency > 625 MHz out of range!\r\nClock source changed to HCLK_EXT\r\n");
+    return 1;
+  } /*
+  else if (frequency >= 625) {
+    //counter between 125 and 200
+    // 20*125/4=625
+    // 20*200/4=1G 
+    jtag_pll(jtag, 1, 1, counter, 1, 4, 4);
+    calculated_f = calc_pll_freqs(1, 1, counter, 1, 4, 4)/1000;
+    if (calculated_f != frequency) {
+        pc.printf("PLL frequency not match!\r\n");
+    }
+  } */ 
+  else if (frequency >= 325) {
+    //counter between 65 and 125
+    // 20*2*65/8=325
+    // 20*2*125/8=625
+    jtag_pll(jtag, 1, 2, counter, 1, 8, 8);
+  } else if (frequency >= 210) {
+    //counter between 42 and 65 
+    // 20*3*42/12=210
+    // 20*3*65/12=325
+    jtag_pll(jtag, 1, 3, counter, 1, 12, 12);
+  } else if (frequency >= 105) {
+    //counter between 21 and 42 
+    // 20*6*21/24=125
+    // 20*6*42/24=210
+    jtag_pll(jtag, 1, 3, 2*counter, 1, 24, 24);
+  } else {
+    pc.printf("Frequency < 105M out of range!\r\nClock source changed to HCLK_EXT\r\n");
+    return 1;
+  }
+  jtag.writeMemory(PLL_RESET, 1);
+  wait_us(10);
+  jtag.writeMemory(PLL_RESET, 0);
+  wait_us(10);
+  if(jtag.readMemory(PLL_PLLLOCK)==0) {
+    pc.printf("PLL lock failed!\r\nClock source changed to HCLK_EXT\r\n");
+    return 1;
+  } else {
+    jtag.writeMemory(intclk_source, 2);
+    return 0;
+  }
 }
\ No newline at end of file
--- a/pll.h	Mon Oct 07 22:58:19 2013 +0000
+++ b/pll.h	Mon Oct 21 22:36:51 2013 +0000
@@ -4,6 +4,11 @@
 #include "jtag.h"
 #include "mmap.h"
 
+// Main utility function, this function will automatically
+// round fMHz to multiple of 5MHz.
+// Current supported range: 105MHz - 625MHz
+int set_pll_frequency (int fMHz, JTAG &jtag);
+
 unsigned long long calc_pll_freqs(unsigned int prediv, unsigned int multint_upper, unsigned int multint, 
                             unsigned int range_upper, unsigned int rangea, unsigned int rangeb);
 
--- a/power.cpp	Mon Oct 07 22:58:19 2013 +0000
+++ b/power.cpp	Mon Oct 21 22:36:51 2013 +0000
@@ -21,17 +21,18 @@
 void power_core(float core_volt)
 {
     float periph_volt = core_volt;
-    
-    
-    if(core_volt > 1.1){
-        periph_volt = 1.1;
+    float mem_volt = periph_volt;
+    if(core_volt > 1){
+        periph_volt = 1;
+        core_volt = 1;
+        mem_volt = 1;
     }
     if(core_volt < 0.9){
         periph_volt = 0.9;
     }
-    
-    float mem_volt = core_volt;
-    
+    if(core_volt < 0.8){
+        mem_volt = core_volt + 0.05;
+    }
     power_chan(PADVDD, periph_volt);
     wait(POWER_UP_TIME);
 
@@ -48,6 +49,14 @@
     wait(POWER_UP_TIME);
     power_chan(PLLAVDD, periph_volt);
     wait(POWER_UP_TIME);
+    
+    // Sensor
+    power_chan(SENSORVDD, core_volt);//power_chan(SENSORVDD, 1.0);
+    wait(POWER_UP_TIME);
+    power_chan(SENSORLOWVDD, 0.35);
+    wait(POWER_UP_TIME);
+    power_chan(SENSORSTRESSVDD, periph_volt);//power_chan(SENSORSTRESSVDD, 1.0);
+    wait(POWER_UP_TIME);
 }
 
 
@@ -59,7 +68,18 @@
     power_chan(DVDD2, 1.8);
     wait(POWER_UP_TIME);
     
-    float new_power = core_volt;//////////////////////////////////////////////////////////
+    float periph_volt = core_volt;
+    
+    
+    if(core_volt > 1){
+        periph_volt = 1;
+        core_volt = 1;
+    }
+    if(core_volt < 0.95){
+        periph_volt = 0.95;
+    }
+    
+    float mem_volt = periph_volt;
     
     // Other padring
     power_chan(ADVDD, 3.3);
@@ -70,15 +90,15 @@
     wait(POWER_UP_TIME);
 
     // Core and Memory
-    power_chan(COREVDD, 1.0);
+    power_chan(COREVDD, core_volt);
     wait(POWER_UP_TIME);
-    power_chan(MEM1VDD, new_power);//power_chan(MEM1VDD, 1.0);
+    power_chan(MEM1VDD, mem_volt);//power_chan(MEM1VDD, 1.0);
     wait(POWER_UP_TIME);
-    power_chan(MEM2VDD, new_power);//power_chan(MEM2VDD, 1.0);
+    power_chan(MEM2VDD, mem_volt);//power_chan(MEM2VDD, 1.0);
     wait(POWER_UP_TIME);
 
     // Clock
-    power_chan(CLOCKVDD, 1.0);//power_chan(CLOCKVDD, 1.0);
+    power_chan(CLOCKVDD, periph_volt);//power_chan(CLOCKVDD, 1.0);
     wait(POWER_UP_TIME);
     power_chan(PLLAVDD, 1.0);//power_chan(PLLAVDD, 1.0);
     wait(POWER_UP_TIME);
@@ -86,7 +106,7 @@
     wait(POWER_UP_TIME);
 
     // Sensor Supplies
-    power_chan(SENSORVDD, 1.0);//power_chan(SENSORVDD, 1.0);
+    power_chan(SENSORVDD, core_volt);//power_chan(SENSORVDD, 1.0);
     wait(POWER_UP_TIME);
     power_chan(SENSORLOWVDD, 0.35);
     wait(POWER_UP_TIME);
--- a/power.h	Mon Oct 07 22:58:19 2013 +0000
+++ b/power.h	Mon Oct 21 22:36:51 2013 +0000
@@ -1,7 +1,7 @@
 #include "dac.h"
 
-void power_up(float core_volt = 1.0);
-void power_core(float core_volt = 1.0);
+void power_up(float core_volt);
+void power_core(float core_volt);
 
 //float current_meas(bool core);
 void power_down();