tuner.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:26k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #include <linux/module.h>
  2. #include <linux/kernel.h>
  3. #include <linux/sched.h>
  4. #include <linux/string.h>
  5. #include <linux/timer.h>
  6. #include <linux/delay.h>
  7. #include <linux/errno.h>
  8. #include <linux/slab.h>
  9. #include <linux/poll.h>
  10. #include <linux/i2c.h>
  11. #include <linux/types.h>
  12. #include <linux/videodev.h>
  13. #include <linux/init.h>
  14. #include "tuner.h"
  15. #include "audiochip.h"
  16. /* Addresses to scan */
  17. static unsigned short normal_i2c[] = {I2C_CLIENT_END};
  18. static unsigned short normal_i2c_range[] = {0x60,0x6f,I2C_CLIENT_END};
  19. static unsigned short probe[2]        = { I2C_CLIENT_END, I2C_CLIENT_END };
  20. static unsigned short probe_range[2]  = { I2C_CLIENT_END, I2C_CLIENT_END };
  21. static unsigned short ignore[2]       = { I2C_CLIENT_END, I2C_CLIENT_END };
  22. static unsigned short ignore_range[2] = { I2C_CLIENT_END, I2C_CLIENT_END };
  23. static unsigned short force[2]        = { I2C_CLIENT_END, I2C_CLIENT_END };
  24. static struct i2c_client_address_data addr_data = {
  25. normal_i2c, normal_i2c_range, 
  26. probe, probe_range, 
  27. ignore, ignore_range, 
  28. force
  29. };
  30. /* insmod options */
  31. static int debug =  0;
  32. static int type  = -1;
  33. static int addr  =  0;
  34. static char *pal =  "b";
  35. static int tv_range[2]    = { 44, 958 };
  36. static int radio_range[2] = { 65, 108 };
  37. MODULE_PARM(debug,"i");
  38. MODULE_PARM(type,"i");
  39. MODULE_PARM(addr,"i");
  40. MODULE_PARM(tv_range,"2i");
  41. MODULE_PARM(radio_range,"2i");
  42. MODULE_PARM(pal,"s");
  43. #define optimize_vco 1
  44. MODULE_DESCRIPTION("device driver for various TV and TV+FM radio tuners");
  45. MODULE_AUTHOR("Ralph Metzler, Gerd Knorr, Gunther Mayer");
  46. MODULE_LICENSE("GPL");
  47. static int this_adap;
  48. #define dprintk     if (debug) printk
  49. struct tuner
  50. {
  51. int type;            /* chip type */
  52. int freq;            /* keep track of the current settings */
  53. int std;
  54. int radio;
  55. int mode;            /* current norm for multi-norm tuners */
  56. int xogc;      // only for MT2032
  57. };
  58. static struct i2c_driver driver;
  59. static struct i2c_client client_template;
  60. /* ---------------------------------------------------------------------- */
  61. /* tv standard selection for Temic 4046 FM5
  62.    this value takes the low bits of control byte 2
  63.    from datasheet Rev.01, Feb.00 
  64.      standard     BG      I       L       L2      D
  65.      picture IF   38.9    38.9    38.9    33.95   38.9
  66.      sound 1      33.4    32.9    32.4    40.45   32.4
  67.      sound 2      33.16   
  68.      NICAM        33.05   32.348  33.05           33.05
  69.  */
  70. #define TEMIC_SET_PAL_I         0x05
  71. #define TEMIC_SET_PAL_DK        0x09
  72. #define TEMIC_SET_PAL_L         0x0a // SECAM ?
  73. #define TEMIC_SET_PAL_L2        0x0b // change IF !
  74. #define TEMIC_SET_PAL_BG        0x0c
  75. /* tv tuner system standard selection for Philips FQ1216ME
  76.    this value takes the low bits of control byte 2
  77.    from datasheet "1999 Nov 16" (supersedes "1999 Mar 23")
  78.      standard  BG DK I L L`
  79.      picture carrier 38.90 38.90 38.90 38.90 33.95
  80.      colour 34.47 34.47 34.47 34.47 38.38
  81.      sound 1 33.40 32.40 32.90 32.40 40.45
  82.      sound 2 33.16 - - - -
  83.      NICAM 33.05 33.05 32.35 33.05 39.80
  84.  */
  85. #define PHILIPS_SET_PAL_I 0x01 /* Bit 2 always zero !*/
  86. #define PHILIPS_SET_PAL_BGDK 0x09
  87. #define PHILIPS_SET_PAL_L2 0x0a
  88. #define PHILIPS_SET_PAL_L 0x0b
  89. /* system switching for Philips FI1216MF MK2
  90.    from datasheet "1996 Jul 09",
  91.     standard         BG     L      L'
  92.     picture carrier  38.90  38.90  33.95
  93.     colour      34.47  34.37  38.38
  94.     sound 1          33.40  32.40  40.45
  95.     sound 2          33.16  -      -
  96.     NICAM            33.05  33.05  39.80
  97.  */
  98. #define PHILIPS_MF_SET_BG 0x01 /* Bit 2 must be zero, Bit 3 is system output */
  99. #define PHILIPS_MF_SET_PAL_L 0x03 // France
  100. #define PHILIPS_MF_SET_PAL_L2 0x02 // L'
  101. /* ---------------------------------------------------------------------- */
  102. struct tunertype 
  103. {
  104. char *name;
  105. unsigned char Vendor;
  106. unsigned char Type;
  107.   
  108. unsigned short thresh1;  /*  band switch VHF_LO <=> VHF_HI  */
  109. unsigned short thresh2;  /*  band switch VHF_HI <=> UHF     */
  110. unsigned char VHF_L;
  111. unsigned char VHF_H;
  112. unsigned char UHF;
  113. unsigned char config; 
  114. unsigned short IFPCoff; /* 622.4=16*38.90 MHz PAL, 732=16*45.75 NTSC */
  115. };
  116. /*
  117.  * The floats in the tuner struct are computed at compile time
  118.  * by gcc and cast back to integers. Thus we don't violate the
  119.  * "no float in kernel" rule.
  120.  */
  121. static struct tunertype tuners[] = {
  122.         { "Temic PAL (4002 FH5)", TEMIC, PAL,
  123.   16*140.25,16*463.25,0x02,0x04,0x01,0x8e,623},
  124. { "Philips PAL_I (FI1246 and compatibles)", Philips, PAL_I,
  125.   16*140.25,16*463.25,0xa0,0x90,0x30,0x8e,623},
  126. { "Philips NTSC (FI1236 and compatibles)", Philips, NTSC,
  127.   16*157.25,16*451.25,0xA0,0x90,0x30,0x8e,732},
  128. { "Philips (SECAM+PAL_BG) (FI1216MF, FM1216MF, FR1216MF)", Philips, SECAM,
  129.   16*168.25,16*447.25,0xA7,0x97,0x37,0x8e,623},
  130. { "NoTuner", NoTuner, NOTUNER,
  131.   0,0,0x00,0x00,0x00,0x00,0x00},
  132. { "Philips PAL_BG (FI1216 and compatibles)", Philips, PAL,
  133.   16*168.25,16*447.25,0xA0,0x90,0x30,0x8e,623},
  134. { "Temic NTSC (4032 FY5)", TEMIC, NTSC,
  135.   16*157.25,16*463.25,0x02,0x04,0x01,0x8e,732},
  136. { "Temic PAL_I (4062 FY5)", TEMIC, PAL_I,
  137.   16*170.00,16*450.00,0x02,0x04,0x01,0x8e,623},
  138.   { "Temic NTSC (4036 FY5)", TEMIC, NTSC,
  139.   16*157.25,16*463.25,0xa0,0x90,0x30,0x8e,732},
  140.         { "Alps HSBH1", TEMIC, NTSC,
  141.   16*137.25,16*385.25,0x01,0x02,0x08,0x8e,732},
  142.         { "Alps TSBE1",TEMIC,PAL,
  143.   16*137.25,16*385.25,0x01,0x02,0x08,0x8e,732},
  144.         { "Alps TSBB5", Alps, PAL_I, /* tested (UK UHF) with Modulartech MM205 */
  145.   16*133.25,16*351.25,0x01,0x02,0x08,0x8e,632},
  146.         { "Alps TSBE5", Alps, PAL, /* untested - data sheet guess. Only IF differs. */
  147.   16*133.25,16*351.25,0x01,0x02,0x08,0x8e,622},
  148.         { "Alps TSBC5", Alps, PAL, /* untested - data sheet guess. Only IF differs. */
  149.   16*133.25,16*351.25,0x01,0x02,0x08,0x8e,608},
  150. { "Temic PAL_BG (4006FH5)", TEMIC, PAL,
  151.   16*170.00,16*450.00,0xa0,0x90,0x30,0x8e,623}, 
  152.    { "Alps TSCH6",Alps,NTSC,
  153.      16*137.25,16*385.25,0x14,0x12,0x11,0x8e,732},
  154.    { "Temic PAL_DK (4016 FY5)",TEMIC,PAL,
  155.      16*168.25,16*456.25,0xa0,0x90,0x30,0x8e,623},
  156.    { "Philips NTSC_M (MK2)",Philips,NTSC,
  157.      16*160.00,16*454.00,0xa0,0x90,0x30,0x8e,732},
  158.         { "Temic PAL_I (4066 FY5)", TEMIC, PAL_I,
  159.           16*169.00, 16*454.00, 0xa0,0x90,0x30,0x8e,623},
  160.         { "Temic PAL* auto (4006 FN5)", TEMIC, PAL,
  161.           16*169.00, 16*454.00, 0xa0,0x90,0x30,0x8e,623},
  162.         { "Temic PAL_BG (4009 FR5) or PAL_I (4069 FR5)", TEMIC, PAL,
  163.           16*141.00, 16*464.00, 0xa0,0x90,0x30,0x8e,623},
  164.         { "Temic NTSC (4039 FR5)", TEMIC, NTSC,
  165.           16*158.00, 16*453.00, 0xa0,0x90,0x30,0x8e,732},
  166.         { "Temic PAL/SECAM multi (4046 FM5)", TEMIC, PAL,
  167.           16*169.00, 16*454.00, 0xa0,0x90,0x30,0x8e,623},
  168.         { "Philips PAL_DK (FI1256 and compatibles)", Philips, PAL,
  169.   16*170.00,16*450.00,0xa0,0x90,0x30,0x8e,623},
  170. { "Philips PAL/SECAM multi (FQ1216ME)", Philips, PAL,
  171.   16*170.00,16*450.00,0xa0,0x90,0x30,0x8e,623},
  172. { "LG PAL_I+FM (TAPC-I001D)", LGINNOTEK, PAL_I,
  173.   16*170.00,16*450.00,0xa0,0x90,0x30,0x8e,623},
  174. { "LG PAL_I (TAPC-I701D)", LGINNOTEK, PAL_I,
  175.   16*170.00,16*450.00,0xa0,0x90,0x30,0x8e,623},
  176. { "LG NTSC+FM (TPI8NSR01F)", LGINNOTEK, NTSC,
  177.   16*210.00,16*497.00,0xa0,0x90,0x30,0x8e,732},
  178. { "LG PAL_BG+FM (TPI8PSB01D)", LGINNOTEK, PAL,
  179.   16*170.00,16*450.00,0xa0,0x90,0x30,0x8e,623},
  180. { "LG PAL_BG (TPI8PSB11D)", LGINNOTEK, PAL,
  181.   16*170.00,16*450.00,0xa0,0x90,0x30,0x8e,623},
  182. { "Temic PAL* auto + FM (4009 FN5)", TEMIC, PAL,
  183.   16*141.00, 16*464.00, 0xa0,0x90,0x30,0x8e,623},
  184. { "SHARP NTSC_JP (2U5JF5540)", SHARP, NTSC, /* 940=16*58.75 NTSC@Japan */
  185.   16*137.25,16*317.25,0x01,0x02,0x08,0x8e,732 }, // Corrected to NTSC=732 (was:940)
  186. { "Samsung PAL TCPM9091PD27", Samsung, PAL,  /* from sourceforge v3tv */
  187.           16*169,16*464,0xA0,0x90,0x30,0x8e,623},
  188. { "MT2032 universal", Microtune,PAL|NTSC,
  189.                0,0,0,0,0,0,0},
  190. { "Temic PAL_BG (4106 FH5)", TEMIC, PAL,
  191.           16*141.00, 16*464.00, 0xa0,0x90,0x30,0x8e,623},
  192. { "Temic PAL_DK/SECAM_L (4012 FY5)", TEMIC, PAL,
  193.           16*140.25, 16*463.25, 0x02,0x04,0x01,0x8e,623},
  194. { "Temic NTSC (4136 FY5)", TEMIC, NTSC,
  195.           16*158.00, 16*453.00, 0xa0,0x90,0x30,0x8e,732},
  196.         { "LG PAL (newer TAPC series)", LGINNOTEK, PAL,
  197.           16*170.00, 16*450.00, 0x01,0x02,0x08,0x8e,623},
  198. { "Philips PAL/SECAM multi (FM1216ME MK3)", Philips, PAL,
  199.   16*160.00,16*442.00,0x01,0x02,0x04,0x8e,623 },
  200. { "LG NTSC (newer TAPC series)", LGINNOTEK, NTSC,
  201.           16*170.00, 16*450.00, 0x01,0x02,0x08,0x8e,732},
  202. };
  203. #define TUNERS (sizeof(tuners)/sizeof(struct tunertype))
  204. /* ---------------------------------------------------------------------- */
  205. static int tuner_getstatus(struct i2c_client *c)
  206. {
  207. unsigned char byte;
  208. struct tuner *t = (struct tuner*)c->data;
  209.         if (t->type == TUNER_MT2032)
  210. return 0;
  211. if (1 != i2c_master_recv(c,&byte,1))
  212. return 0;
  213. return byte;
  214. }
  215. #define TUNER_POR       0x80
  216. #define TUNER_FL        0x40
  217. #define TUNER_MODE      0x38
  218. #define TUNER_AFC       0x07
  219. #define TUNER_STEREO    0x10 /* radio mode */
  220. #define TUNER_SIGNAL    0x07 /* radio mode */
  221. static int tuner_signal(struct i2c_client *c)
  222. {
  223. return (tuner_getstatus(c) & TUNER_SIGNAL)<<13;
  224. }
  225. static int tuner_stereo(struct i2c_client *c)
  226. {
  227. return (tuner_getstatus (c) & TUNER_STEREO);
  228. }
  229. #if 0 /* unused */
  230. static int tuner_islocked (struct i2c_client *c)
  231. {
  232.         return (tuner_getstatus (c) & TUNER_FL);
  233. }
  234. static int tuner_afcstatus (struct i2c_client *c)
  235. {
  236.         return (tuner_getstatus (c) & TUNER_AFC) - 2;
  237. }
  238. static int tuner_mode (struct i2c_client *c)
  239. {
  240.         return (tuner_getstatus (c) & TUNER_MODE) >> 3;
  241. }
  242. #endif
  243. // Initalization as described in "MT203x Programming Procedures", Rev 1.2, Feb.2001
  244. static int mt2032_init(struct i2c_client *c)
  245. {
  246.         unsigned char buf[21];
  247.         int ret,xogc,xok=0;
  248. struct tuner *t = (struct tuner*)c->data;
  249.         buf[0]=0;
  250.         ret=i2c_master_send(c,buf,1);
  251.         i2c_master_recv(c,buf,21);
  252.         printk("MT2032: Companycode=%02x%02x Part=%02x Revision=%02xn",
  253.                 buf[0x11],buf[0x12],buf[0x13],buf[0x14]);
  254.         if(debug) {
  255.                 int i;
  256.                 printk("MT2032 hexdump:n");
  257.                 for(i=0;i<21;i++) {
  258.                         printk(" %02x",buf[i]);
  259.                         if(((i+1)%8)==0) printk(" ");
  260.                         if(((i+1)%16)==0) printk("n ");
  261.                 }
  262.                 printk("n ");
  263.         }
  264.         // Initialize Registers per spec.
  265.         buf[1]=2; // Index to register 2
  266.         buf[2]=0xff;
  267.         buf[3]=0x0f;
  268.         buf[4]=0x1f;
  269.         ret=i2c_master_send(c,buf+1,4);
  270.         buf[5]=6; // Index register 6
  271.         buf[6]=0xe4;
  272.         buf[7]=0x8f;
  273.         buf[8]=0xc3;
  274.         buf[9]=0x4e;
  275.         buf[10]=0xec;
  276.         ret=i2c_master_send(c,buf+5,6);
  277.         buf[12]=13;  // Index register 13
  278.         buf[13]=0x32;
  279.         ret=i2c_master_send(c,buf+12,2);
  280.         // Adjust XOGC (register 7), wait for XOK
  281.         xogc=7;
  282.         do {
  283. dprintk("mt2032: xogc = 0x%02xn",xogc&0x07);
  284.                 mdelay(10);
  285.                 buf[0]=0x0e;
  286.                 i2c_master_send(c,buf,1);
  287.                 i2c_master_recv(c,buf,1);
  288.                 xok=buf[0]&0x01;
  289.                 dprintk("mt2032: xok = 0x%02xn",xok);
  290.                 if (xok == 1) break;
  291.                 xogc--;
  292.                 dprintk("mt2032: xogc = 0x%02xn",xogc&0x07);
  293.                 if (xogc == 3) {
  294.                         xogc=4; // min. 4 per spec
  295.                         break;
  296.                 }
  297.                 buf[0]=0x07;
  298.                 buf[1]=0x88 + xogc;
  299.                 ret=i2c_master_send(c,buf,2);
  300.                 if (ret!=2)
  301.                         printk("mt2032_init failed with %dn",ret);
  302.         } while (xok != 1 );
  303. t->xogc=xogc;
  304.         return(1);
  305. }
  306. // IsSpurInBand()?
  307. static int mt2032_spurcheck(int f1, int f2, int spectrum_from,int spectrum_to)
  308. {
  309. int n1=1,n2,f;
  310. f1=f1/1000; //scale to kHz to avoid 32bit overflows
  311. f2=f2/1000;
  312. spectrum_from/=1000;
  313. spectrum_to/=1000;
  314. dprintk("spurcheck f1=%d f2=%d  from=%d to=%dn",f1,f2,spectrum_from,spectrum_to);
  315. do {
  316.     n2=-n1;
  317.     f=n1*(f1-f2);
  318.     do {
  319. n2--;
  320. f=f-f2;
  321. dprintk(" spurtest n1=%d n2=%d ftest=%dn",n1,n2,f);
  322. if( (f>spectrum_from) && (f<spectrum_to))
  323. printk("mt2032 spurcheck triggered: %dn",n1);
  324.     } while ( (f>(f2-spectrum_to)) || (n2>-5));
  325.     n1++;
  326. } while (n1<5);
  327. return 1;
  328. }
  329. static int mt2032_compute_freq(int rfin, int if1, int if2, int spectrum_from,
  330. int spectrum_to, unsigned char *buf, int *ret_sel, int xogc) //all in Hz
  331. {
  332.         int fref,lo1,lo1n,lo1a,s,sel,lo1freq, desired_lo1,
  333. desired_lo2,lo2,lo2n,lo2a,lo2num,lo2freq;
  334.         fref= 5250 *1000; //5.25MHz
  335. desired_lo1=rfin+if1;
  336. lo1=(2*(desired_lo1/1000)+(fref/1000)) / (2*fref/1000);
  337.         lo1n=lo1/8;
  338.         lo1a=lo1-(lo1n*8);
  339.         s=rfin/1000/1000+1090;
  340. if(optimize_vco) {
  341. if(s>1890) sel=0;
  342. else if(s>1720) sel=1;
  343. else if(s>1530) sel=2;
  344. else if(s>1370) sel=3;
  345. else sel=4; // >1090
  346. }
  347. else {
  348.          if(s>1790) sel=0; // <1958
  349.          else if(s>1617) sel=1;
  350.          else if(s>1449) sel=2;
  351.          else if(s>1291) sel=3;
  352.          else sel=4; // >1090
  353. }
  354. *ret_sel=sel;
  355.         lo1freq=(lo1a+8*lo1n)*fref;
  356.         dprintk("mt2032: rfin=%d lo1=%d lo1n=%d lo1a=%d sel=%d, lo1freq=%dn",
  357. rfin,lo1,lo1n,lo1a,sel,lo1freq);
  358.         desired_lo2=lo1freq-rfin-if2;
  359.         lo2=(desired_lo2)/fref;
  360.         lo2n=lo2/8;
  361.         lo2a=lo2-(lo2n*8);
  362.         lo2num=((desired_lo2/1000)%(fref/1000))* 3780/(fref/1000); //scale to fit in 32bit arith
  363.         lo2freq=(lo2a+8*lo2n)*fref + lo2num*(fref/1000)/3780*1000;
  364.         dprintk("mt2032: rfin=%d lo2=%d lo2n=%d lo2a=%d num=%d lo2freq=%dn",
  365. rfin,lo2,lo2n,lo2a,lo2num,lo2freq);
  366.         if(lo1a<0 || lo1a>7 || lo1n<17 ||lo1n>48 || lo2a<0 ||lo2a >7 ||lo2n<17 || lo2n>30) {
  367.                 printk("mt2032: frequency parameters out of range: %d %d %d %dn",
  368.        lo1a, lo1n, lo2a,lo2n);
  369.                 return(-1);
  370.         }
  371. mt2032_spurcheck(lo1freq, desired_lo2,  spectrum_from, spectrum_to);
  372. // should recalculate lo1 (one step up/down)
  373. // set up MT2032 register map for transfer over i2c
  374. buf[0]=lo1n-1;
  375. buf[1]=lo1a | (sel<<4);
  376. buf[2]=0x86; // LOGC
  377. buf[3]=0x0f; //reserved
  378. buf[4]=0x1f;
  379. buf[5]=(lo2n-1) | (lo2a<<5);
  380.   if(rfin >400*1000*1000)
  381.                 buf[6]=0xe4;
  382.         else
  383.                 buf[6]=0xf4; // set PKEN per rev 1.2 
  384. buf[7]=8+xogc;
  385. buf[8]=0xc3; //reserved
  386. buf[9]=0x4e; //reserved
  387. buf[10]=0xec; //reserved
  388. buf[11]=(lo2num&0xff);
  389. buf[12]=(lo2num>>8) |0x80; // Lo2RST
  390. return 0;
  391. }
  392. static int mt2032_check_lo_lock(struct i2c_client *c)
  393. {
  394. int try,lock=0;
  395. unsigned char buf[2];
  396. for(try=0;try<10;try++) {
  397. buf[0]=0x0e;
  398. i2c_master_send(c,buf,1);
  399. i2c_master_recv(c,buf,1);
  400. dprintk("mt2032 Reg.E=0x%02xn",buf[0]);
  401. lock=buf[0] &0x06;
  402. if (lock==6)
  403. break;
  404. dprintk("mt2032: pll wait 1ms for lock (0x%2x)n",buf[0]);
  405. udelay(1000);
  406. }
  407.         return lock;
  408. }
  409. static int mt2032_optimize_vco(struct i2c_client *c,int sel,int lock)
  410. {
  411. unsigned char buf[2];
  412. int tad1;
  413. buf[0]=0x0f;
  414. i2c_master_send(c,buf,1);
  415. i2c_master_recv(c,buf,1);
  416. dprintk("mt2032 Reg.F=0x%02xn",buf[0]);
  417. tad1=buf[0]&0x07;
  418. if(tad1 ==0) return lock;
  419. if(tad1 ==1) return lock;
  420. if(tad1==2) {
  421. if(sel==0) 
  422. return lock;
  423. else sel--;
  424. }
  425. else {
  426. if(sel<4)
  427. sel++;
  428. else
  429. return lock;
  430. }
  431. dprintk("mt2032 optimize_vco: sel=%dn",sel);
  432. buf[0]=0x0f;
  433. buf[1]=sel;
  434.         i2c_master_send(c,buf,2);
  435. lock=mt2032_check_lo_lock(c);
  436. return lock;
  437. }
  438. static void mt2032_set_if_freq(struct i2c_client *c,int rfin, int if1, int if2, int from, int to)
  439. {
  440. unsigned char buf[21];
  441. int lint_try,ret,sel,lock=0;
  442. struct tuner *t = (struct tuner*)c->data;
  443. dprintk("mt2032_set_if_freq rfin=%d if1=%d if2=%d from=%d to=%dn",rfin,if1,if2,from,to);
  444.         buf[0]=0;
  445.         ret=i2c_master_send(c,buf,1);
  446.         i2c_master_recv(c,buf,21);
  447. buf[0]=0;
  448. ret=mt2032_compute_freq(rfin,if1,if2,from,to,&buf[1],&sel,t->xogc);
  449. if (ret<0)
  450. return;
  451.         // send only the relevant registers per Rev. 1.2
  452.         buf[0]=0;
  453.         ret=i2c_master_send(c,buf,4);
  454.         buf[5]=5;
  455.         ret=i2c_master_send(c,buf+5,4);
  456.         buf[11]=11;
  457.         ret=i2c_master_send(c,buf+11,3);
  458.         if(ret!=3)
  459.                 printk("mt2032_set_if_freq failed with %dn",ret);
  460. // wait for PLLs to lock (per manual), retry LINT if not.
  461. for(lint_try=0; lint_try<2; lint_try++) {
  462. lock=mt2032_check_lo_lock(c);
  463. if(optimize_vco)
  464. lock=mt2032_optimize_vco(c,sel,lock);
  465. if(lock==6) break;
  466. printk("mt2032: re-init PLLs by LINTn"); 
  467. buf[0]=7; 
  468. buf[1]=0x80 +8+t->xogc; // set LINT to re-init PLLs
  469. i2c_master_send(c,buf,2);
  470. mdelay(10);
  471. buf[1]=8+t->xogc;
  472. i2c_master_send(c,buf,2);
  473.         }
  474. if (lock!=6)
  475. printk("MT2032 Fatal Error: PLLs didn't lock.n");
  476. buf[0]=2;
  477. buf[1]=0x20; // LOGC for optimal phase noise
  478. ret=i2c_master_send(c,buf,2);
  479. if (ret!=2)
  480. printk("mt2032_set_if_freq2 failed with %dn",ret);
  481. }
  482. static void mt2032_set_tv_freq(struct i2c_client *c, int freq, int norm)
  483. {
  484. int if2,from,to;
  485. // signal bandwidth and picture carrier
  486. if(norm==VIDEO_MODE_NTSC) {
  487. from=40750*1000;
  488. to=46750*1000;
  489. if2=45750*1000; 
  490. }
  491. else {  // Pal 
  492. from=32900*1000;
  493. to=39900*1000;
  494. if2=38900*1000;
  495. }
  496.         mt2032_set_if_freq(c,freq* 1000*1000/16, 1090*1000*1000, if2, from, to);
  497. }
  498. // Set tuner frequency,  freq in Units of 62.5kHz = 1/16MHz
  499. static void set_tv_freq(struct i2c_client *c, int freq)
  500. {
  501. u8 config;
  502. u16 div;
  503. struct tunertype *tun;
  504. struct tuner *t = c->data;
  505.         unsigned char buffer[4];
  506. int rc;
  507. if (t->type == -1) {
  508. printk("tuner: tuner type not setn");
  509. return;
  510. }
  511. if (t->type == TUNER_MT2032) {
  512. mt2032_set_tv_freq(c,freq,t->mode);
  513. return;
  514. }
  515. if (freq < tv_range[0]*16 || freq > tv_range[1]*16) {
  516. /* FIXME: better do that chip-specific, but
  517.    right now we don't have that in the config
  518.    struct and this way is still better than no
  519.    check at all */
  520. printk("tuner: TV freq (%d.%02d) out of range (%d-%d)n",
  521.        freq/16,freq%16*100/16,tv_range[0],tv_range[1]);
  522. return;
  523. }
  524. tun=&tuners[t->type];
  525. if (freq < tun->thresh1) 
  526. config = tun->VHF_L;
  527. else if (freq < tun->thresh2) 
  528. config = tun->VHF_H;
  529. else
  530. config = tun->UHF;
  531. /* tv norm specific stuff for multi-norm tuners */
  532. switch (t->type) {
  533. case TUNER_PHILIPS_SECAM: // FI1216MF
  534. /* 0x01 -> ??? no change ??? */
  535. /* 0x02 -> PAL BDGHI / SECAM L */
  536. /* 0x04 -> ??? PAL others / SECAM others ??? */
  537. config &= ~0x02;
  538. if (t->mode == VIDEO_MODE_SECAM)
  539. config |= 0x02;
  540. break;
  541. case TUNER_TEMIC_4046FM5:
  542. config &= ~0x0f;
  543. switch (pal[0]) {
  544. case 'i':
  545. case 'I':
  546. config |= TEMIC_SET_PAL_I;
  547. break;
  548. case 'd':
  549. case 'D':
  550. config |= TEMIC_SET_PAL_DK;
  551. break;
  552. case 'l':
  553. case 'L':
  554. config |= TEMIC_SET_PAL_L;
  555. break;
  556. case 'b':
  557. case 'B':
  558. case 'g':
  559. case 'G':
  560. default:
  561. config |= TEMIC_SET_PAL_BG;
  562. break;
  563. }
  564. break;
  565. case TUNER_PHILIPS_FQ1216ME:
  566. config &= ~0x0f;
  567. switch (pal[0]) {
  568. case 'i':
  569. case 'I':
  570. config |= PHILIPS_SET_PAL_I;
  571. break;
  572. case 'l':
  573. case 'L':
  574. config |= PHILIPS_SET_PAL_L;
  575. break;
  576. case 'd':
  577. case 'D':
  578. case 'b':
  579. case 'B':
  580. case 'g':
  581. case 'G':
  582. config |= PHILIPS_SET_PAL_BGDK;
  583. break;
  584. }
  585. break;
  586. }
  587. /*
  588.  * Philips FI1216MK2 remark from specification :
  589.  * for channel selection involving band switching, and to ensure
  590.  * smooth tuning to the desired channel without causing
  591.  * unnecessary charge pump action, it is recommended to consider
  592.  * the difference between wanted channel frequency and the
  593.  * current channel frequency.  Unnecessary charge pump action
  594.  * will result in very low tuning voltage which may drive the
  595.  * oscillator to extreme conditions.
  596.  *
  597.  * Progfou: specification says to send config data before
  598.  * frequency in case (wanted frequency < current frequency).
  599.  */
  600. div=freq + tun->IFPCoff;
  601. if (t->type == TUNER_PHILIPS_SECAM && freq < t->freq) {
  602. buffer[0] = tun->config;
  603. buffer[1] = config;
  604. buffer[2] = (div>>8) & 0x7f;
  605. buffer[3] = div      & 0xff;
  606. } else {
  607. buffer[0] = (div>>8) & 0x7f;
  608. buffer[1] = div      & 0xff;
  609. buffer[2] = tun->config;
  610. buffer[3] = config;
  611. }
  612. dprintk("tuner: tv 0x%02x 0x%02x 0x%02x 0x%02xn",
  613. buffer[0],buffer[1],buffer[2],buffer[3]);
  614.         if (4 != (rc = i2c_master_send(c,buffer,4)))
  615.                 printk("tuner: i2c i/o error: rc == %d (should be 4)n",rc);
  616. }
  617. static void mt2032_set_radio_freq(struct i2c_client *c,int freq)
  618. {               
  619.         int if2;
  620.         if2=10700*1000; //  10.7MHz FM intermediate frequency
  621.         mt2032_set_if_freq(c,freq* 1000*1000/16, 1085*1000*1000,if2,if2,if2);
  622. }
  623. static void set_radio_freq(struct i2c_client *c, int freq)
  624. {
  625. struct tunertype *tun;
  626. struct tuner *t = (struct tuner*)c->data;
  627.         unsigned char buffer[4];
  628. int rc,div;
  629. if (freq < radio_range[0]*16 || freq > radio_range[1]*16) {
  630. printk("tuner: radio freq (%d.%02d) out of range (%d-%d)n",
  631.        freq/16,freq%16*100/16,
  632.        radio_range[0],radio_range[1]);
  633. return;
  634. }
  635. if (t->type == -1) {
  636. printk("tuner: tuner type not setn");
  637. return;
  638. }
  639.         if (t->type == TUNER_MT2032) {
  640.                 mt2032_set_radio_freq(c,freq);
  641. return;
  642. }
  643. tun=&tuners[t->type];
  644. div = freq + (int)(16*10.7);
  645.         buffer[0] = (div>>8) & 0x7f;
  646.         buffer[1] = div      & 0xff;
  647. buffer[2] = tun->config;
  648. switch (t->type) {
  649. case TUNER_PHILIPS_FM1216ME_MK3:
  650. buffer[3] = 0x19;
  651. break;
  652. default:
  653. buffer[3] = 0xa4;
  654. break;
  655. }
  656. dprintk("tuner: radio 0x%02x 0x%02x 0x%02x 0x%02xn",
  657. buffer[0],buffer[1],buffer[2],buffer[3]);
  658.         if (4 != (rc = i2c_master_send(c,buffer,4)))
  659.                 printk("tuner: i2c i/o error: rc == %d (should be 4)n",rc);
  660. }
  661. /* ---------------------------------------------------------------------- */
  662. static int tuner_attach(struct i2c_adapter *adap, int addr,
  663. unsigned short flags, int kind)
  664. {
  665. struct tuner *t;
  666. struct i2c_client *client;
  667. if (this_adap > 0)
  668. return -1;
  669. this_adap++;
  670.         client_template.adapter = adap;
  671.         client_template.addr = addr;
  672.         printk("tuner: chip found @ 0x%xn", addr<<1);
  673.         if (NULL == (client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL)))
  674.                 return -ENOMEM;
  675.         memcpy(client,&client_template,sizeof(struct i2c_client));
  676.         client->data = t = kmalloc(sizeof(struct tuner),GFP_KERNEL);
  677.         if (NULL == t) {
  678.                 kfree(client);
  679.                 return -ENOMEM;
  680.         }
  681.         memset(t,0,sizeof(struct tuner));
  682. if (type >= 0 && type < TUNERS) {
  683. t->type = type;
  684. strncpy(client->name, tuners[t->type].name, sizeof(client->name));
  685. } else {
  686. t->type = -1;
  687. }
  688.         i2c_attach_client(client);
  689.         if (t->type == TUNER_MT2032)
  690.                  mt2032_init(client);
  691. MOD_INC_USE_COUNT;
  692. return 0;
  693. }
  694. static int tuner_probe(struct i2c_adapter *adap)
  695. {
  696. int rc;
  697. if (0 != addr) {
  698. normal_i2c_range[0] = addr;
  699. normal_i2c_range[1] = addr;
  700. }
  701. this_adap = 0;
  702. switch (adap->id) {
  703. case I2C_ALGO_BIT | I2C_HW_B_BT848:
  704. case I2C_ALGO_BIT | I2C_HW_B_RIVA:
  705. case I2C_ALGO_SAA7134:
  706. printk("tuner: probing %s i2c adapter [id=0x%x]n",
  707.        adap->name,adap->id);
  708. rc = i2c_probe(adap, &addr_data, tuner_attach);
  709. break;
  710. default:
  711. printk("tuner: ignoring %s i2c adapter [id=0x%x]n",
  712.        adap->name,adap->id);
  713. rc = 0;
  714. /* nothing */
  715. }
  716. return rc;
  717. }
  718. static int tuner_detach(struct i2c_client *client)
  719. {
  720. struct tuner *t = (struct tuner*)client->data;
  721. i2c_detach_client(client);
  722. kfree(t);
  723. kfree(client);
  724. MOD_DEC_USE_COUNT;
  725. return 0;
  726. }
  727. static int
  728. tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
  729. {
  730. struct tuner *t = (struct tuner*)client->data;
  731.         int   *iarg = (int*)arg;
  732. #if 0
  733.         __u16 *sarg = (__u16*)arg;
  734. #endif
  735.         switch (cmd) {
  736. /* --- configuration --- */
  737. case TUNER_SET_TYPE:
  738. if (t->type != -1)
  739. return 0;
  740. if (*iarg < 0 || *iarg >= TUNERS)
  741. return 0;
  742. t->type = *iarg;
  743. dprintk("tuner: type set to %d (%s)n",
  744.                         t->type,tuners[t->type].name);
  745. strncpy(client->name, tuners[t->type].name, sizeof(client->name));
  746. if (t->type == TUNER_MT2032)
  747.                         mt2032_init(client);
  748. break;
  749. case AUDC_SET_RADIO:
  750. t->radio = 1;
  751. break;
  752. /* --- v4l ioctls --- */
  753. /* take care: bttv does userspace copying, we'll get a
  754.    kernel pointer here... */
  755. case VIDIOCSCHAN:
  756. {
  757. struct video_channel *vc = arg;
  758. t->radio = 0;
  759. t->mode = vc->norm;
  760. if (t->freq)
  761. set_tv_freq(client,t->freq);
  762. return 0;
  763. }
  764. case VIDIOCSFREQ:
  765. {
  766. unsigned long *v = arg;
  767. if (t->radio) {
  768. dprintk("tuner: radio freq set to %d.%02dn",
  769. (*iarg)/16,(*iarg)%16*100/16);
  770. set_radio_freq(client,*v);
  771. } else {
  772. dprintk("tuner: tv freq set to %d.%02dn",
  773. (*iarg)/16,(*iarg)%16*100/16);
  774. set_tv_freq(client,*v);
  775. }
  776. t->freq = *v;
  777. return 0;
  778. }
  779. case VIDIOCGTUNER:
  780. {
  781. struct video_tuner *vt = arg;
  782. if (t->radio)
  783. vt->signal = tuner_signal(client);
  784. return 0;
  785. }
  786. case VIDIOCGAUDIO:
  787. {
  788. struct video_audio *va = arg;
  789. if (t->radio)
  790. va->mode = (tuner_stereo(client) ? VIDEO_SOUND_STEREO : VIDEO_SOUND_MONO);
  791. return 0;
  792. }
  793. #if 0
  794. /* --- old, obsolete interface --- */
  795. case TUNER_SET_TVFREQ:
  796. dprintk("tuner: tv freq set to %d.%02dn",
  797. (*iarg)/16,(*iarg)%16*100/16);
  798. set_tv_freq(client,*iarg);
  799. t->radio = 0;
  800. t->freq = *iarg;
  801. break;
  802. case TUNER_SET_RADIOFREQ:
  803. dprintk("tuner: radio freq set to %d.%02dn",
  804. (*iarg)/16,(*iarg)%16*100/16);
  805. set_radio_freq(client,*iarg);
  806. t->radio = 1;
  807. t->freq = *iarg;
  808. break;
  809. case TUNER_SET_MODE:
  810. if (t->type != TUNER_PHILIPS_SECAM) {
  811. dprintk("tuner: trying to change mode for other than TUNER_PHILIPS_SECAMn");
  812. } else {
  813. int mode=(*sarg==VIDEO_MODE_SECAM)?1:0;
  814. dprintk("tuner: mode set to %dn", *sarg);
  815. t->mode = mode;
  816. set_tv_freq(client,t->freq);
  817. }
  818. break;
  819. #endif
  820. default:
  821. /* nothing */
  822. break;
  823. }
  824. return 0;
  825. }
  826. /* ----------------------------------------------------------------------- */
  827. static struct i2c_driver driver = {
  828.         name:           "i2c TV tuner driver",
  829.         id:             I2C_DRIVERID_TUNER,
  830.         flags:          I2C_DF_NOTIFY,
  831.         attach_adapter: tuner_probe,
  832.         detach_client:  tuner_detach,
  833.         command:        tuner_command,
  834. };
  835. static struct i2c_client client_template =
  836. {
  837.         name:   "(unset)",
  838. flags:  I2C_CLIENT_ALLOW_USE,
  839.         driver: &driver,
  840. };
  841. static int tuner_init_module(void)
  842. {
  843. i2c_add_driver(&driver);
  844. return 0;
  845. }
  846. static void tuner_cleanup_module(void)
  847. {
  848. i2c_del_driver(&driver);
  849. }
  850. module_init(tuner_init_module);
  851. module_exit(tuner_cleanup_module);
  852. /*
  853.  * Overrides for Emacs so that we follow Linus's tabbing style.
  854.  * ---------------------------------------------------------------------------
  855.  * Local variables:
  856.  * c-basic-offset: 8
  857.  * End:
  858.  */