refactored divider setting on rxdb clk, txdb clk, and test clk
authormatt <matt@221aa14e-8319-0410-a670-987f0aec2ac5>
Sun, 12 Oct 2008 00:26:16 +0000 (00:26 +0000)
committermatt <matt@221aa14e-8319-0410-a670-987f0aec2ac5>
Sun, 12 Oct 2008 00:26:16 +0000 (00:26 +0000)
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@9780 221aa14e-8319-0410-a670-987f0aec2ac5

usrp2/firmware/apps/txrx.c
usrp2/firmware/lib/clocks.c
usrp2/firmware/lib/clocks.h
usrp2/firmware/lib/u2_init.c

index 13aa8ba2b71464f51093d4ee9d58ae567a07e328..e2c162113e97e266d72228d8bb3e7e7de5025aeb 100644 (file)
@@ -35,7 +35,7 @@
 #include <stddef.h>
 #include <stdlib.h>
 #include <string.h>
-
+#include "clocks.h"
 
 #define FW_SETS_SEQNO  1       // define to 0 or 1 (FIXME must be 1 for now)
 
index 2c176eaf65cbd2a77af9516da516707989d42a9e..10f37cb1b94ae2efc9a5f7dca54995a6e966b37f 100644 (file)
@@ -52,7 +52,7 @@ clocks_init(void)
 
   // Set up other clocks
 
-  clocks_enable_test_clk(false);
+  clocks_enable_test_clk(false, 0);
   clocks_enable_tx_dboard(false, 0);
   clocks_enable_rx_dboard(false, 0);
 
@@ -128,54 +128,55 @@ clocks_mimo_config(int flags)
   ad9510_write_reg(0x5A, 0x01); // Update Regs
 }
 
-void
-clocks_enable_test_clk(bool enable)
+int inline
+clocks_gen_div(int divisor)
 {
-  if (enable){
-    ad9510_write_reg(0x3C, 0x08); // Turn on output 0 -- Test output
-    ad9510_write_reg(0x49, 0x80); // Bypass divider 0
-  }
-  else {
-    ad9510_write_reg(0x3C, 0x02); // Turn off output 0 
-  }
-  ad9510_write_reg(0x5A, 0x01); // Update Regs
+  int L,H;
+  L = (divisor>>1)-1;
+  H = divisor-L-2;
+  return (L<<4)|H;
 }
 
+#define CLOCK_OUT_EN 0x08
+#define CLOCK_OUT_DIS_CMOS 0x01
+#define CLOCK_OUT_DIS_PECL 0x02
+#define CLOCK_DIV_DIS 0x80
+#define CLOCK_DIV_EN 0x00
 
-void
-clocks_enable_rx_dboard(bool enable, int divisor)
+void 
+clocks_enable_XXX_clk(bool enable, int divisor, int reg_en, int reg_div, int val_off)
 {
-  if (enable){
-    ad9510_write_reg(0x43, 0x08); // enable output 7 (db_rx_clk), CMOS
-
-    if (divisor == 0){
-      ad9510_write_reg(0x57, 0x80); // Bypass Div #7, 100 MHz clock
+  if(enable) {
+    ad9510_write_reg(reg_en,CLOCK_OUT_EN);     // Turn on output, normal levels
+    if(divisor>1) {
+      ad9510_write_reg(reg_div,clocks_gen_div(divisor)); // Set divisor
+      ad9510_write_reg(reg_div+1,CLOCK_DIV_EN);   // Enable divider
     }
     else {
-      // FIXME Matt, do something with divisor...
+      ad9510_write_reg(reg_div+1,CLOCK_DIV_DIS);  // Disable Divider
     }
   }
   else {
-    ad9510_write_reg(0x43, 0x01); // Turn off output 7 (db_rx_clk)
+    ad9510_write_reg(reg_en,val_off);  // Power off output (val different for PECL/CMOS)
+    ad9510_write_reg(reg_div+1,CLOCK_DIV_DIS);  // Bypass Divider to power it down
   }
-  ad9510_write_reg(0x5A, 0x01); // Update Regs
+  ad9510_write_reg(0x5A, 0x01);  // Update Regs
 }
 
+void
+clocks_enable_test_clk(bool enable, int divisor)
+{
+  clocks_enable_XXX_clk(enable,divisor,0x3C,0x48,CLOCK_OUT_DIS_PECL);
+}
+
+void
+clocks_enable_rx_dboard(bool enable, int divisor)
+{
+  clocks_enable_XXX_clk(enable,divisor,0x43,0x56,CLOCK_OUT_DIS_CMOS);
+}
 
 void
 clocks_enable_tx_dboard(bool enable, int divisor)
 {
-  if (enable){
-    ad9510_write_reg(0x42, 0x08);    // enable output 6 (db_tx_clk), CMOS
-    if (divisor == 0) {
-      ad9510_write_reg(0x55, 0x80);  // Bypass Div #6, 100 MHz clock
-    }
-    else {
-      // FIXME Matt, do something with divisor
-    }
-  }
-  else {
-    ad9510_write_reg(0x42, 0x01); // Turn off output 6 (db_tx_clk)
-  }
-  ad9510_write_reg(0x5A, 0x01); // Update Regs
+  clocks_enable_XXX_clk(enable,divisor,0x42,0x54,CLOCK_OUT_DIS_CMOS);
 }
index c43cfcb1478d0f093a4c90028e5d6df3aa851b97..3b93007d772a6f7f3adfbe4ff5d9b4fb4c140516 100644 (file)
@@ -46,7 +46,7 @@ void clocks_mimo_config(int flags);
 /*!
  * \brief Enable or disable test clock (extra clock signal)
  */
-void clocks_enable_test_clk(bool enable);
+void clocks_enable_test_clk(bool enable, int divisor);
 
 /*!
  * \brief Enable or disable clock to Rx daughterboard
index 4313c9502a04b1dd971281f4b299ffe52b7db11e..b1339634323291a9e7d3b579694a179d9e20100d 100644 (file)
@@ -66,7 +66,7 @@ u2_init(void)
   // set up the default clocks
   clocks_init();
 
-  // clocks_enable_test_clk(true);
+  // clocks_enable_test_clk(true,1);
 
   // Enable ADCs
   output_regs->adc_ctrl = ADC_CTRL_ON;