Common subdirectories: ../rtl-sdr-ref/src/getopt and src/getopt
diff ../rtl-sdr-ref/src/librtlsdr.c src/librtlsdr.c
93a94,102
> // Sept 24 2012 SM5BSZ. Gain modes.
> // Note that these things are used in tuner_e4k.c also.
> // The routine using them should be moved to tuner_e4k.c 
> extern int e4k_gain_mode;
> #define E4K_GAIN_MODE_OLD 1
> #define E4K_GAIN_MODE_LINEARITY 2
> #define E4K_GAIN_MODE_SENSITIVITY 3
> #define MAX_E4K_GAIN_MODES 3
> 
127c136,140
< 	if(e4k_set_lna_gain(&devt->e4k_s, min(300, gain - mixgain * 10)) == -EINVAL)
---
> // SM5BSZ Sept24 2012:  Use only (the modified) set_lna_gain if the user
> // asked for linearity or sensitivity.
>         if(e4k_gain_mode <= E4K_GAIN_MODE_OLD)
>           {
> 	  if(e4k_set_lna_gain(&devt->e4k_s, min(300, gain - mixgain * 10)) == -EINVAL)
129c142
< 	if(e4k_mixer_gain_set(&devt->e4k_s, mixgain) == -EINVAL)
---
> 	  if(e4k_mixer_gain_set(&devt->e4k_s, mixgain) == -EINVAL)
130a144
> // SM5BSZ: enhanced gain should affect how the AGC turns down the gain 
132c146
< 	if(enhgain >= 0)
---
> 	  if(enhgain >= 0)
136c150,153
< 	return 0;
---
> 	  return 0;
> 	  }
> e4k_set_lna_gain(&devt->e4k_s, gain);
> return 0;
137a155
> 
141a160
> 
785a805,807
> // Sept 2012 SM5BSZ: Add standard gains
>         const int e4k_std_gains[] = { -250, -200, -150, -100, -50, 0, 50, 
>                     100, 150, 200, 250};
802c824,832
< 		ptr = (int *)e4k_gains; len = sizeof(e4k_gains);
---
> // Sept 2012 SM5BSZ: Use standard gains (5 dB step) if gain is mode above 1.
> 	        if(e4k_gain_mode < 2)
>                   {
> 	 	  ptr = (int *)e4k_gains; len = sizeof(e4k_gains);
> 	 	  }
> 	 	else
> 	 	  {
> 	 	  ptr=  (int *)e4k_std_gains; len = sizeof(e4k_std_gains);  
>                   }
879a910,922
> 
> // SM5BSZ Oct 17 2012  Reconfigure the rtl
> if(mode)
>   {
> /* enable SDR mode, disable DAGC (bit 5) */
>   rtlsdr_demod_write_reg(dev, 0, 0x19, 0x05, 1);
>   }
> else
>   {
> /*  enable AGC  */
>   rtlsdr_demod_write_reg(dev, 0, 0x19, 0x25, 1);
>   }
>   
diff ../rtl-sdr-ref/src/tuner_e4k.c src/tuner_e4k.c
41a42,49
> // Sept 24 2012 SM5BSZ. Gain modes.
> // Note that these things are used in librtlsdr.c also.
> int e4k_gain_mode;
> #define E4K_GAIN_MODE_OLD 1
> #define E4K_GAIN_MODE_LINEARITY 2
> #define E4K_GAIN_MODE_SENSITIVITY 3
> #define MAX_E4K_GAIN_MODES 3
> 
659a668,671
> // SM5BSZ Sept 24 2012: Use all gain controls if gain mode
> // is above 1
> if(e4k_gain_mode <= E4K_GAIN_MODE_OLD)
>   {
666a679,935
>   }
> if(e4k_gain_mode == E4K_GAIN_MODE_LINEARITY)
>   {
>   switch (gain)
>     {
>     case -250:
>     e4k_reg_set_mask(e4k, E4K_REG_GAIN1, 0xf, 0);
>     e4k_mixer_gain_set(e4k, 4);
>     e4k_if_gain_set(e4k, 1, -3);
>     e4k_if_gain_set(e4k, 2, 0);
>     e4k_if_gain_set(e4k, 3, 0);
>     e4k_if_gain_set(e4k, 4, 0);
>     e4k_if_gain_set(e4k, 5, 9);
>     e4k_if_gain_set(e4k, 6, 6);
>     break;
> 
>     case -200:
>     e4k_reg_set_mask(e4k, E4K_REG_GAIN1, 0xf, 0);
>     e4k_mixer_gain_set(e4k, 4);
>     e4k_if_gain_set(e4k, 1, -3);
>     e4k_if_gain_set(e4k, 2, 0);
>     e4k_if_gain_set(e4k, 3, 0);
>     e4k_if_gain_set(e4k, 4, 1);
>     e4k_if_gain_set(e4k, 5, 12);
>     e4k_if_gain_set(e4k, 6, 9);
>     break;
>     
>     case -150:
>     e4k_reg_set_mask(e4k, E4K_REG_GAIN1, 0xf, 0);
>     e4k_mixer_gain_set(e4k, 4);
>     e4k_if_gain_set(e4k, 1, -3);
>     e4k_if_gain_set(e4k, 2, 6);
>     e4k_if_gain_set(e4k, 3, 0);
>     e4k_if_gain_set(e4k, 4, 0);
>     e4k_if_gain_set(e4k, 5, 12);
>     e4k_if_gain_set(e4k, 6, 9);
>     break;
> 
>     case -100:
>     e4k_reg_set_mask(e4k, E4K_REG_GAIN1, 0xf, 0);
>     e4k_mixer_gain_set(e4k, 12);
>     e4k_if_gain_set(e4k, 1, -3);
>     e4k_if_gain_set(e4k, 2, 3);
>     e4k_if_gain_set(e4k, 3, 0);
>     e4k_if_gain_set(e4k, 4, 1);
>     e4k_if_gain_set(e4k, 5, 12);
>     e4k_if_gain_set(e4k, 6, 9);
>     break;
> 
>     case -50:
>     e4k_reg_set_mask(e4k, E4K_REG_GAIN1, 0xf, 0);
>     e4k_mixer_gain_set(e4k, 12);
>     e4k_if_gain_set(e4k, 1, -3);
>     e4k_if_gain_set(e4k, 2, 6);
>     e4k_if_gain_set(e4k, 3, 0);
>     e4k_if_gain_set(e4k, 4, 0);
>     e4k_if_gain_set(e4k, 5, 12);
>     e4k_if_gain_set(e4k, 6, 12);
>     break;
>     
>     case 0:
>     e4k_reg_set_mask(e4k, E4K_REG_GAIN1, 0xf, 4);
>     e4k_mixer_gain_set(e4k, 12);
>     e4k_if_gain_set(e4k, 1, -3);
>     e4k_if_gain_set(e4k, 2, 6);
>     e4k_if_gain_set(e4k, 3, 0);
>     e4k_if_gain_set(e4k, 4, 0);
>     e4k_if_gain_set(e4k, 5, 12);
>     e4k_if_gain_set(e4k, 6, 12);
>     break;
> 
>     case 50:
>     e4k_reg_set_mask(e4k, E4K_REG_GAIN1, 0xf, 6);
>     e4k_mixer_gain_set(e4k, 12);
>     e4k_if_gain_set(e4k, 1, -3);
>     e4k_if_gain_set(e4k, 2, 6);
>     e4k_if_gain_set(e4k, 3, 0);
>     e4k_if_gain_set(e4k, 4, 0);
>     e4k_if_gain_set(e4k, 5, 12);
>     e4k_if_gain_set(e4k, 6, 12);
>     break;
> 
>     case 100:
>     e4k_reg_set_mask(e4k, E4K_REG_GAIN1, 0xf, 8);
>     e4k_mixer_gain_set(e4k, 12);
>     e4k_if_gain_set(e4k, 1, -3);
>     e4k_if_gain_set(e4k, 2, 6);
>     e4k_if_gain_set(e4k, 3, 0);
>     e4k_if_gain_set(e4k, 4, 0);
>     e4k_if_gain_set(e4k, 5, 12);
>     e4k_if_gain_set(e4k, 6, 12);
>     break;
>     
>     
>     case 150:
>     e4k_reg_set_mask(e4k, E4K_REG_GAIN1, 0xf, 10);
>     e4k_mixer_gain_set(e4k, 12);
>     e4k_if_gain_set(e4k, 1, -3);
>     e4k_if_gain_set(e4k, 2, 6);
>     e4k_if_gain_set(e4k, 3, 0);
>     e4k_if_gain_set(e4k, 4, 0);
>     e4k_if_gain_set(e4k, 5, 12);
>     e4k_if_gain_set(e4k, 6, 12);
>     break;
> 
>     case 200:
>     e4k_reg_set_mask(e4k, E4K_REG_GAIN1, 0xf, 12);
>     e4k_mixer_gain_set(e4k, 12);
>     e4k_if_gain_set(e4k, 1, -3);
>     e4k_if_gain_set(e4k, 2, 6);
>     e4k_if_gain_set(e4k, 3, 0);
>     e4k_if_gain_set(e4k, 4, 0);
>     e4k_if_gain_set(e4k, 5, 12);
>     e4k_if_gain_set(e4k, 6, 12);
>     break;
> 
>     case 250:
>     e4k_reg_set_mask(e4k, E4K_REG_GAIN1, 0xf, 14);
>     e4k_mixer_gain_set(e4k, 12);
>     e4k_if_gain_set(e4k, 1, -3);
>     e4k_if_gain_set(e4k, 2, 6);
>     e4k_if_gain_set(e4k, 3, 0);
>     e4k_if_gain_set(e4k, 4, 0);
>     e4k_if_gain_set(e4k, 5, 12);
>     e4k_if_gain_set(e4k, 6, 12);
>     break;
>     }    
>   }
> if(e4k_gain_mode == E4K_GAIN_MODE_SENSITIVITY)
>   {
>   switch (gain)
>     {
>     case -250:
>     e4k_reg_set_mask(e4k, E4K_REG_GAIN1, 0xf, 6);
>     e4k_mixer_gain_set(e4k, 4);
>     e4k_if_gain_set(e4k, 1, -3);
>     e4k_if_gain_set(e4k, 2, 0);
>     e4k_if_gain_set(e4k, 3, 0);
>     e4k_if_gain_set(e4k, 4, 1);
>     e4k_if_gain_set(e4k, 5, 6);
>     e4k_if_gain_set(e4k, 6, 3);
>     break;
> 
>     case -200:
>     e4k_reg_set_mask(e4k, E4K_REG_GAIN1, 0xf, 8);
>     e4k_mixer_gain_set(e4k, 4);
>     e4k_if_gain_set(e4k, 1, -3);
>     e4k_if_gain_set(e4k, 2, 0);
>     e4k_if_gain_set(e4k, 3, 0);
>     e4k_if_gain_set(e4k, 4, 1);
>     e4k_if_gain_set(e4k, 5, 6);
>     e4k_if_gain_set(e4k, 6, 3);
>     break;
> 
>     case -150:
>     e4k_reg_set_mask(e4k, E4K_REG_GAIN1, 0xf, 10);
>     e4k_mixer_gain_set(e4k, 4);
>     e4k_if_gain_set(e4k, 1, -3);
>     e4k_if_gain_set(e4k, 2, 0);
>     e4k_if_gain_set(e4k, 3, 0);
>     e4k_if_gain_set(e4k, 4, 1);
>     e4k_if_gain_set(e4k, 5, 6);
>     e4k_if_gain_set(e4k, 6, 3);
>     break;
> 
>     case -100:
>     e4k_reg_set_mask(e4k, E4K_REG_GAIN1, 0xf, 12);
>     e4k_mixer_gain_set(e4k, 4);
>     e4k_if_gain_set(e4k, 1, -3);
>     e4k_if_gain_set(e4k, 2, 0);
>     e4k_if_gain_set(e4k, 3, 0);
>     e4k_if_gain_set(e4k, 4, 1);
>     e4k_if_gain_set(e4k, 5, 6);
>     e4k_if_gain_set(e4k, 6, 3);
>     break;
> 
>     case -50:
>     e4k_reg_set_mask(e4k, E4K_REG_GAIN1, 0xf, 14);
>     e4k_mixer_gain_set(e4k, 4);
>     e4k_if_gain_set(e4k, 1, -3);
>     e4k_if_gain_set(e4k, 2, 0);
>     e4k_if_gain_set(e4k, 3, 0);
>     e4k_if_gain_set(e4k, 4, 1);
>     e4k_if_gain_set(e4k, 5, 6);
>     e4k_if_gain_set(e4k, 6, 3);
>     break;
>     
>     case 0:
>     e4k_reg_set_mask(e4k, E4K_REG_GAIN1, 0xf, 14);
>     e4k_mixer_gain_set(e4k, 12);
>     e4k_if_gain_set(e4k, 1, -3);
>     e4k_if_gain_set(e4k, 2, 0);
>     e4k_if_gain_set(e4k, 3, 0);
>     e4k_if_gain_set(e4k, 4, 2);
>     e4k_if_gain_set(e4k, 5, 3);
>     e4k_if_gain_set(e4k, 6, 3);
>     break;
> 
>     case 50:
>     e4k_reg_set_mask(e4k, E4K_REG_GAIN1, 0xf, 14);
>     e4k_mixer_gain_set(e4k, 12);
>     e4k_if_gain_set(e4k, 1, -3);
>     e4k_if_gain_set(e4k, 2, 3);
>     e4k_if_gain_set(e4k, 3, 0);
>     e4k_if_gain_set(e4k, 4, 1);
>     e4k_if_gain_set(e4k, 5, 6);
>     e4k_if_gain_set(e4k, 6, 3);
>     break;
> 
>     case 100:
>     e4k_reg_set_mask(e4k, E4K_REG_GAIN1, 0xf, 14);
>     e4k_mixer_gain_set(e4k, 12);
>     e4k_if_gain_set(e4k, 1, 6);
>     e4k_if_gain_set(e4k, 2, 0);
>     e4k_if_gain_set(e4k, 3, 0);
>     e4k_if_gain_set(e4k, 4, 0);
>     e4k_if_gain_set(e4k, 5, 6);
>     e4k_if_gain_set(e4k, 6, 3);
>     break;
>     
>     case 150:
>     e4k_reg_set_mask(e4k, E4K_REG_GAIN1, 0xf, 14);
>     e4k_mixer_gain_set(e4k, 12);
>     e4k_if_gain_set(e4k, 1, 6);
>     e4k_if_gain_set(e4k, 2, 0);
>     e4k_if_gain_set(e4k, 3, 0);
>     e4k_if_gain_set(e4k, 4, 2);
>     e4k_if_gain_set(e4k, 5, 9);
>     e4k_if_gain_set(e4k, 6, 3);
>     break;
>     break;
> 
>     case 200:
>     fprintf(stderr,"\nCASE 200");
>     e4k_reg_set_mask(e4k, E4K_REG_GAIN1, 0xf, 14);
>     e4k_mixer_gain_set(e4k, 12);
>     e4k_if_gain_set(e4k, 1, 6);
>     e4k_if_gain_set(e4k, 2, 3);
>     e4k_if_gain_set(e4k, 3, 0);
>     e4k_if_gain_set(e4k, 4, 1);
>     e4k_if_gain_set(e4k, 5, 9);
>     e4k_if_gain_set(e4k, 6, 6);
>     break;
> 
>     case 250:
>     e4k_reg_set_mask(e4k, E4K_REG_GAIN1, 0xf, 14);
>     e4k_mixer_gain_set(e4k, 12);
>     e4k_if_gain_set(e4k, 1, 6);
>     e4k_if_gain_set(e4k, 2, 6);
>     e4k_if_gain_set(e4k, 3, 0);
>     e4k_if_gain_set(e4k, 4, 0);
>     e4k_if_gain_set(e4k, 5, 9);
>     e4k_if_gain_set(e4k, 6, 9);
>     break;
>     }    
>   }
> return gain;
694a964,969
> // Sept 24 2012 SM5BSZ. Add a flag for more gain modes and return it
> // so we know the library has this feature.
>   e4k_gain_mode=manual;
>   if(e4k_gain_mode > MAX_E4K_GAIN_MODES)e4k_gain_mode=MAX_E4K_GAIN_MODES;
>   return e4k_gain_mode;                     
> 
695a971
> 	        e4k_gain_mode=0;
701a978
>                 
