Zimin Wang / Mbed 2 deprecated DDRO_Farrari

Dependencies:   mbed-rtos mbed

Fork of DDRO_Farrari by Liangzhen Lai

Revision:
1:6a820a0ca03b
Parent:
0:84a8bcfbdec9
Child:
10:95e9932f7990
--- 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