hamaro_cx24128.c

来自「QPSK Tuner details, for conexant chipset」· C语言 代码 · 共 1,877 行 · 第 1/5 页

C
1,877
字号
   reg_value = reg_val_temp & 0x3E;
   p_viperparms->VcobandSel = (HAMARO_VCOBANDSEL)reg_value;
   
   
   
   /* -- Mongoose RevB -- */
   if (reg_value == 0) /* could be VCO6 */
   {

      /* Read 0x18[7] */
      reg_value = reg_val_temp & 0x80;
      
      if (reg_value != 0)
      {
         p_viperparms->VcobandSel = HAMARO_VCOBANDSEL_6;
      }
   }
   return(True);
}  /* HAMARO_TUNER_CX24128_GetParameters() */
/*******************************************************************************************************
 * HAMARO_TUNER_CX24128_SetParameters() 
 * sets passed in parameters in nim and into tuner
 *******************************************************************************************************/
BOOL        
HAMARO_TUNER_CX24128_SetParameters(HAMARO_NIM         *p_nim,        /* pointer to nim */
                            HAMARO_VIPERPARMS  *p_viperparms) /* copy of HAMARO_VIPERPARMS to use as default */
{
   unsigned long    reg_value;
   unsigned char reg_val_temp;
   HAMARO_TUNER_CX24128_VALIDATE(p_nim);

   if (p_viperparms == 0)  
   {
      return(False);
   }

   /* copy from user-buffer to tuner buffer */
   memcpy(&p_nim->tuner.cx24128.viperparms, p_viperparms, sizeof(HAMARO_VIPERPARMS));
 
   /* Read 0x10, and clear 0x10[6], 0x10[3:2], 0x10[0] */
   if (HAMARO_TunerRegisterRead(p_nim, (unsigned short)(0x10), (unsigned long*)&reg_value, HAMARO_IO_UNKNOWN) != True)  
   {
      return(False);
   }
   reg_value &= 0xB2;

   /* Set pre-scaler mode. 0x10[6] */
   switch(p_viperparms->PrescalerMode)
   {
      case True:
         reg_val_temp = 0x40UL;
         break;
      case False:
         reg_val_temp = 0x00UL;
         break;
      default:
         return(False);
      break;
   }
   reg_value |= reg_val_temp;
   
   /* ICP manual level. It's O.K if manual level is undefined. 0x10[5:4] */
   if (p_viperparms->ICPman != HAMARO_ICPMAN_UNDEF)
   {
      /* clear 0x10[5:4] */
      reg_value &= 0xCF;
      switch(p_viperparms->ICPman)
      {
         case HAMARO_ICPMAN_LEVEL1:
         case HAMARO_ICPMAN_LEVEL2:
         case HAMARO_ICPMAN_LEVEL3:
         case HAMARO_ICPMAN_LEVEL4:
         {
	     reg_val_temp = ((unsigned char)p_viperparms->ICPman << 4) & 0x30;
            reg_value |= reg_val_temp;
            break;
         }
         default:
         {
            return(False);
         }
      }
   }

   /* ICP digital. 0x10[3:2]*/
   switch(p_viperparms->ICPdig)
   {
      case HAMARO_ICPDIG_LEVEL1:
      case HAMARO_ICPDIG_LEVEL2:
      case HAMARO_ICPDIG_LEVEL3:
      case HAMARO_ICPDIG_LEVEL4:
      {
	  reg_val_temp = ((unsigned char)p_viperparms->ICPdig << 2) & 0x0C;
         reg_value |= reg_val_temp; 
         break;
      }
      default:
      {
         return(False);
      }
   }
   
   /* Set ICP settings to tuner. 0x10[0] */
   reg_val_temp = ((unsigned char)p_viperparms->ICPmode) & 0x01;
   reg_value |= reg_val_temp;

   /* write to 0x10 */
   if (HAMARO_TunerRegisterWrite(p_nim, (unsigned short)(0x10), (unsigned long)reg_value, HAMARO_IO_UNKNOWN) != True)  
   {
      return(False);
   }
   
/* ICP auto level. */
   switch(p_viperparms->ICPauto_Lo)
   {
      case HAMARO_ICPAUTO_LEVEL1:
      case HAMARO_ICPAUTO_LEVEL2:
      case HAMARO_ICPAUTO_LEVEL3:
      case HAMARO_ICPAUTO_LEVEL4:
         reg_value = p_viperparms->ICPauto_Lo; /* 0x11[1:0] */
         break;
      default:
      {
         return(False);
      }
   }
   
   switch(p_viperparms->ICPauto_MedLo)
   {
      case HAMARO_ICPAUTO_LEVEL1:
      case HAMARO_ICPAUTO_LEVEL2:
      case HAMARO_ICPAUTO_LEVEL3:
      case HAMARO_ICPAUTO_LEVEL4:
         reg_value |= p_viperparms->ICPauto_MedLo << 2; /* 0x11[3:2] */
         break;
      default:
      {
         return(False);
      }
   }
   
   switch(p_viperparms->ICPauto_MedHi)
   {
      case HAMARO_ICPAUTO_LEVEL1:
      case HAMARO_ICPAUTO_LEVEL2:
      case HAMARO_ICPAUTO_LEVEL3:
      case HAMARO_ICPAUTO_LEVEL4:
         reg_value |= p_viperparms->ICPauto_MedHi << 4; /* 0x11[5:4] */
         break;
      default:
      {
         return(False);
      }
   }
   
   switch(p_viperparms->ICPauto_Hi)
   {
      case HAMARO_ICPAUTO_LEVEL1:
      case HAMARO_ICPAUTO_LEVEL2:
      case HAMARO_ICPAUTO_LEVEL3:
      case HAMARO_ICPAUTO_LEVEL4:
         reg_value |= p_viperparms->ICPauto_Hi << 6; /* 0x11[7:6] */
         break;
      default:
      {
         return(False);
      }
   }
   /* write to 0x11[7:0] */
   if (HAMARO_TunerRegisterWrite(p_nim, (unsigned short)(0x11), (unsigned long)reg_value, HAMARO_IO_UNKNOWN) != True)  
   {
      return(False);
   }

/* Read 0x12, and clear 0x12[7:4], 0x12[2] */
   if (HAMARO_TunerRegisterRead(p_nim, (unsigned short)(0x12), (unsigned long*)&reg_value, HAMARO_IO_UNKNOWN) != True)  
   {
      return(False);
   }
   reg_value &= 0x0B;

   /* Set other VCO parameters. 0x12[7:4] */
   reg_val_temp = (p_viperparms->Bsdelay << 4) & 0xF0;
   reg_value |= reg_val_temp;

   /* Analog CP ON. 0x12[2] */
   reg_val_temp = ((unsigned char)p_viperparms->ACP_on << 2) & 0x04;
   reg_value |= reg_val_temp;
   
   if (HAMARO_TunerRegisterWrite(p_nim, (unsigned short)(0x12), (unsigned long)reg_value, HAMARO_IO_UNKNOWN) != True)  
   {
      return(False);
   }

   /* Read 0x14, and clear 0x14[7:6], 0x14[4:0] */
   if (HAMARO_TunerRegisterRead(p_nim, (unsigned short)(0x14), (unsigned long*)&reg_value, HAMARO_IO_UNKNOWN) != True)  
   {
      return(False);
   }
   reg_value &= 0x20; /*clear 0x14[7:6], 0x14[4:0] */
   
   /* Set VCO settings to tuner. */
   switch(p_viperparms->VcoMode)
   {
      case HAMARO_VCOMODE_AUTO:
      case HAMARO_VCOMODE_TEST:
         reg_val_temp = ((unsigned char)p_viperparms->VcoMode << 6) & 0xC0; /* 0x14[7:6] */
         reg_value |= reg_val_temp;/* 0x14[7:6] */   /* set the vco mode to the tuner */
         break;
      default:
         return(False);
   }

   reg_val_temp = (p_viperparms->Bsfreqcnt >> 8) & 0x1F; /* 0x14[4:0] */
   reg_value |= reg_val_temp;

   if (HAMARO_TunerRegisterWrite(p_nim, (unsigned short)(0x14), (unsigned long)reg_value, HAMARO_IO_UNKNOWN) != True)  
   {
      return(False);
   }
   /* Write 0x15[7:0] */
   reg_value = (p_viperparms->Bsfreqcnt) & 0xFF; /* 0x15[7:0] */
   if (HAMARO_TunerRegisterWrite(p_nim, (unsigned short)(0x15), (unsigned long)reg_value, HAMARO_IO_UNKNOWN) != True)  
   {
      return(False);
   }

   /* write to 0x16[7:0] */
   reg_value = (p_viperparms->Bsrdiv >> 4) & 0xFF;/*get 0x16[7:0] */
   if (HAMARO_TunerRegisterWrite(p_nim, (unsigned short)(0x16), (unsigned long)reg_value, HAMARO_IO_UNKNOWN) != True)  
   {
      return(False);
   }
   
   /* Read 0x17, and clear 0x17[7:4] */
   if (HAMARO_TunerRegisterRead(p_nim, (unsigned short)(0x17), (unsigned long*)&reg_value, HAMARO_IO_UNKNOWN) != True)  
   {
      return(False);
   }
   reg_value &= 0x0F; /* clear 0x17[7:4] */
   reg_val_temp = (p_viperparms->Bsrdiv & 0x0F) << 4;/*get the high 4bits for 0x17[7:4] */
   reg_value |= reg_val_temp;
   if (HAMARO_TunerRegisterWrite(p_nim, (unsigned short)(0x17), (unsigned long)reg_value, HAMARO_IO_UNKNOWN) != True)  
   {
      return(False);
   }

/* Read 0x18, and clear 0x18[0] */
   if (HAMARO_TunerRegisterRead(p_nim, (unsigned short)(0x18), (unsigned long*)&reg_value, HAMARO_IO_UNKNOWN) != True)  
   {
      return(False);
   }
   reg_value &= 0xFE; 

   /* 0x18[0] */
   switch(p_viperparms->Vcobs)
   {
      case HAMARO_VCOBANDSHIFT_HIGH:
      case HAMARO_VCOBANDSHIFT_LOW:
         reg_val_temp = (unsigned long)p_viperparms->Vcobs;
         break;
      default:
         return(False);
   }
   reg_value |= reg_val_temp;   
   
   switch(p_viperparms->VcobandSel)
   {
      case HAMARO_VCOBANDSEL_1:
      case HAMARO_VCOBANDSEL_2:
      case HAMARO_VCOBANDSEL_3:
      case HAMARO_VCOBANDSEL_4:
      case HAMARO_VCOBANDSEL_5:
      case HAMARO_VCOBANDSEL_6: /* -- Mongoose RevB -- */
         reg_val_temp = (unsigned char)p_viperparms->VcobandSel;
         break;
      default:
         return(False);
   }
   
   if (p_viperparms->VcobandSel == HAMARO_VCOBANDSEL_6)
   {
      
      /* clear 0x18[7] */
      reg_value &= 0x7F;
      reg_value |= (reg_val_temp << 7);
   }
   else
   {
      /* clear 0x18[5:1] */
      reg_value &= 0xC1;
      reg_value |= (reg_val_temp << 1);
   }
   if (HAMARO_TunerRegisterWrite(p_nim, (unsigned short)(0x18), (unsigned long)reg_value, HAMARO_IO_UNKNOWN) != True)  
   {
      return(False);
   }

/* Read 0x20, and clear 0x20[4] */
   if (HAMARO_TunerRegisterRead(p_nim, (unsigned short)(0x20), (unsigned long*)&reg_value, HAMARO_IO_UNKNOWN) != True)  
   {
      return(False);
   }
   reg_value &= 0xEF; /* clear 0x20[4] */

#if HAMARO_INCLUDE_RATTLER
   /* Rattler specific */
   if (p_nim->tuner_type == HAMARO_CX24113)
   {
      reg_value &= 0xFC;/* clear 0x20[1:0] */
      switch(p_viperparms->lna_gain)
      {
         case HAMARO_LNA_MIN_GAIN:
         case HAMARO_LNA_MID_GAIN:
         case HAMARO_LNA_MAX_GAIN:
            reg_val_temp= (unsigned char)p_viperparms->lna_gain;
            break;
         default:
         {
            return(False);
         }
      }
      reg_value |= reg_val_temp;
   }
#endif /* HAMARO_INCLUDE_RATTLER */

   /* -- Mongoose RevB -- 0x20[4] */
   reg_val_temp = ((p_viperparms->RFVGABiasControl == True) ? 0x01 : 0x00) << 4;
   reg_value |= reg_val_temp;

   if (HAMARO_TunerRegisterWrite(p_nim, (unsigned short)(0x20), (unsigned long)reg_value, HAMARO_IO_UNKNOWN) != True)
   {
      return(False);
   }
   return(True);
}  /* HAMARO_TUNER_CX24128_SetParameters() */
/*******************************************************************************************************
 * HAMARO_TUNER_CX24128_set_NFRregisters() 
 * function to set N, F, R registers in tuner 
 *******************************************************************************************************/
BOOL     
HAMARO_TUNER_CX24128_SetNFRRegisters(HAMARO_NIM               *p_nim, /* pointer to nim */
                              unsigned int      nvalue, /* N register */
                              int               fvalue, /* F register */
                              HAMARO_RDIVVAL           rvalue) /* R register */
{
   unsigned char reg_value, reg_vlue_temp;
   unsigned long pllfreq;
   unsigned long Nfrac;
   HAMARO_BCDNO         bcd;
   
   /* save last n,a,r settings */
   p_nim->tuner.cx24128.N = nvalue;
   p_nim->tuner.cx24128.F = fvalue;
   p_nim->tuner.cx24128.R = rvalue;
   
   /* High 8bits of N will be set to 0x19 */
   reg_value = (nvalue >>1) & 0xFF;
   
   /* Write */
   if(HAMARO_TunerRegisterWrite(p_nim, (unsigned short)(0x19), (unsigned long)reg_value, HAMARO_IO_UNKNOWN) != True)  
   {
      return(False);
   }
   
   /* N[0] = 0x1A[7] F[17:11]=0x1A[6:0] */
   reg_value = (nvalue & 0x01) << 7;
   reg_vlue_temp = (fvalue >> 11) & 0x7F;
   reg_value = reg_value | reg_vlue_temp;
   if(HAMARO_TunerRegisterWrite(p_nim, (unsigned short)(0x1A), (unsigned long)reg_value, HAMARO_IO_UNKNOWN) != True)  
   {
      return(False);
   }	
   
   /* F[10:3]=0x1B[7:0] */
   reg_value = (fvalue >> 3) & 0xFF;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?