tuner_e4000.c 40 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072
  1. /*
  2. * Elonics E4000 tuner driver, taken from the kernel driver that can be found
  3. * on http://linux.terratec.de/tv_en.html
  4. *
  5. * This driver is a mess, and should be replaced by the osmo-sdr E4000 driver
  6. *
  7. */
  8. #include <stdint.h>
  9. #include "i2c.h"
  10. #include "tuner_e4000.h"
  11. #define FUNCTION_ERROR 1
  12. #define FUNCTION_SUCCESS 0
  13. #define NO_USE 0
  14. #define LEN_2_BYTE 2
  15. #define I2C_BUFFER_LEN 128
  16. #define YES 1
  17. #define NO 0
  18. #define CRYSTAL_FREQ 28800000
  19. #define E4K_I2C_ADDR 0xc8
  20. /* glue functions to rtl-sdr code */
  21. int
  22. I2CReadByte(
  23. void *pTuner,
  24. unsigned char NoUse,
  25. unsigned char RegAddr,
  26. unsigned char *pReadingByte
  27. )
  28. {
  29. uint8_t data = RegAddr;
  30. if (rtlsdr_i2c_write((rtlsdr_dev_t *)pTuner, E4K_I2C_ADDR, &data, 1) < 0)
  31. return E4000_I2C_FAIL;
  32. if (rtlsdr_i2c_read((rtlsdr_dev_t *)pTuner, E4K_I2C_ADDR, &data, 1) < 0)
  33. return E4000_I2C_FAIL;
  34. *pReadingByte = data;
  35. return E4000_I2C_SUCCESS;
  36. }
  37. int
  38. I2CWriteByte(void *pTuner,
  39. unsigned char NoUse,
  40. unsigned char RegAddr,
  41. unsigned char WritingByte
  42. )
  43. {
  44. uint8_t data[2];
  45. data[0] = RegAddr;
  46. data[1] = WritingByte;
  47. if (rtlsdr_i2c_write((rtlsdr_dev_t *)pTuner, E4K_I2C_ADDR, data, 2) < 0)
  48. return E4000_I2C_FAIL;
  49. return E4000_I2C_SUCCESS;
  50. }
  51. int
  52. I2CWriteArray(
  53. void *pTuner,
  54. unsigned char NoUse,
  55. unsigned char RegStartAddr,
  56. unsigned char ByteNum,
  57. unsigned char *pWritingBytes
  58. )
  59. {
  60. unsigned int i;
  61. uint8_t WritingBuffer[I2C_BUFFER_LEN];
  62. WritingBuffer[0] = RegStartAddr;
  63. for(i = 0; i < ByteNum; i++)
  64. WritingBuffer[1 + i] = pWritingBytes[i];
  65. if (rtlsdr_i2c_write((rtlsdr_dev_t *)pTuner, E4K_I2C_ADDR, WritingBuffer, ByteNum + 1) < 0)
  66. return E4000_I2C_FAIL;
  67. return E4000_I2C_SUCCESS;
  68. }
  69. /**
  70. @see TUNER_FP_INITIALIZE
  71. */
  72. int
  73. e4000_Initialize(void *pTuner
  74. )
  75. {
  76. // Initialize tuner.
  77. // Note: Call E4000 source code functions.
  78. if(tunerreset(pTuner) != E4000_1_SUCCESS)
  79. goto error_status_execute_function;
  80. if(Tunerclock(pTuner) != E4000_1_SUCCESS)
  81. goto error_status_execute_function;
  82. if(Qpeak(pTuner) != E4000_1_SUCCESS)
  83. goto error_status_execute_function;
  84. if(DCoffloop(pTuner) != E4000_1_SUCCESS)
  85. goto error_status_execute_function;
  86. if(GainControlinit(pTuner) != E4000_1_SUCCESS)
  87. goto error_status_execute_function;
  88. return FUNCTION_SUCCESS;
  89. error_status_execute_function:
  90. return FUNCTION_ERROR;
  91. }
  92. /**
  93. @see TUNER_FP_SET_RF_FREQ_HZ
  94. */
  95. int
  96. e4000_SetRfFreqHz(
  97. void *pTuner,
  98. unsigned long RfFreqHz
  99. )
  100. {
  101. // E4000_EXTRA_MODULE *pExtra;
  102. int RfFreqKhz;
  103. int CrystalFreqKhz;
  104. int CrystalFreqHz = CRYSTAL_FREQ;
  105. // Set tuner RF frequency in KHz.
  106. // Note: 1. RfFreqKhz = round(RfFreqHz / 1000)
  107. // CrystalFreqKhz = round(CrystalFreqHz / 1000)
  108. // 2. Call E4000 source code functions.
  109. RfFreqKhz = (int)((RfFreqHz + 500) / 1000);
  110. CrystalFreqKhz = (int)((CrystalFreqHz + 500) / 1000);
  111. if(Gainmanual(pTuner) != E4000_1_SUCCESS)
  112. goto error_status_execute_function;
  113. if(E4000_gain_freq(pTuner, RfFreqKhz) != E4000_1_SUCCESS)
  114. goto error_status_execute_function;
  115. if(PLL(pTuner, CrystalFreqKhz, RfFreqKhz) != E4000_1_SUCCESS)
  116. goto error_status_execute_function;
  117. if(LNAfilter(pTuner, RfFreqKhz) != E4000_1_SUCCESS)
  118. goto error_status_execute_function;
  119. if(freqband(pTuner, RfFreqKhz) != E4000_1_SUCCESS)
  120. goto error_status_execute_function;
  121. if(DCoffLUT(pTuner) != E4000_1_SUCCESS)
  122. goto error_status_execute_function;
  123. if(GainControlauto(pTuner) != E4000_1_SUCCESS)
  124. goto error_status_execute_function;
  125. return FUNCTION_SUCCESS;
  126. error_status_execute_function:
  127. return FUNCTION_ERROR;
  128. }
  129. /**
  130. @brief Set E4000 tuner bandwidth.
  131. */
  132. int
  133. e4000_SetBandwidthHz(
  134. void *pTuner,
  135. unsigned long BandwidthHz
  136. )
  137. {
  138. // E4000_EXTRA_MODULE *pExtra;
  139. int BandwidthKhz;
  140. int CrystalFreqKhz;
  141. int CrystalFreqHz = CRYSTAL_FREQ;
  142. // Get tuner extra module.
  143. // pExtra = &(pTuner->Extra.E4000);
  144. // Set tuner bandwidth Hz.
  145. // Note: 1. BandwidthKhz = round(BandwidthHz / 1000)
  146. // CrystalFreqKhz = round(CrystalFreqHz / 1000)
  147. // 2. Call E4000 source code functions.
  148. BandwidthKhz = (int)((BandwidthHz + 500) / 1000);
  149. CrystalFreqKhz = (int)((CrystalFreqHz + 500) / 1000);
  150. if(IFfilter(pTuner, BandwidthKhz, CrystalFreqKhz) != E4000_1_SUCCESS)
  151. goto error_status_execute_function;
  152. return FUNCTION_SUCCESS;
  153. error_status_execute_function:
  154. return FUNCTION_ERROR;
  155. }
  156. // The following context is source code provided by Elonics.
  157. // Elonics source code - E4000_API_rev2_04_realtek.cpp
  158. //****************************************************************************/
  159. //
  160. // Filename E4000_initialisation.c
  161. // Revision 2.04
  162. //
  163. // Description:
  164. // Initialisation script for the Elonics E4000 revC tuner
  165. //
  166. // Copyright (c) Elonics Ltd
  167. //
  168. // Any software supplied free of charge for use with elonics
  169. // evaluation kits is supplied without warranty and for
  170. // evaluation purposes only. Incorporation of any of this
  171. // code into products for open sale is permitted but only at
  172. // the user's own risk. Elonics accepts no liability for the
  173. // integrity of this software whatsoever.
  174. //
  175. //
  176. //****************************************************************************/
  177. //#include <stdio.h>
  178. //#include <stdlib.h>
  179. //
  180. // User defined variable definitions
  181. //
  182. /*
  183. int Ref_clk = 26000; // Reference clock frequency(kHz).
  184. int Freq = 590000; // RF Frequency (kHz)
  185. int bandwidth = 8000; //RF channel bandwith (kHz)
  186. */
  187. //
  188. // API defined variable definitions
  189. //int VCO_freq;
  190. //unsigned char writearray[5];
  191. //unsigned char read1[1];
  192. //int status;
  193. //
  194. //
  195. // function definitions
  196. //
  197. /*
  198. int tunerreset ();
  199. int Tunerclock();
  200. int filtercal();
  201. int Qpeak();
  202. int PLL(int Ref_clk, int Freq);
  203. int LNAfilter(int Freq);
  204. int IFfilter(int bandwidth, int Ref_clk);
  205. int freqband(int Freq);
  206. int DCoffLUT();
  207. int DCoffloop();
  208. int commonmode();
  209. int GainControlinit();
  210. */
  211. //
  212. //****************************************************************************
  213. // --- Public functions ------------------------------------------------------
  214. /****************************************************************************\
  215. * Function: tunerreset
  216. *
  217. * Detailed Description:
  218. * The function resets the E4000 tuner. (Register 0x00).
  219. *
  220. \****************************************************************************/
  221. int tunerreset(void *pTuner)
  222. {
  223. unsigned char writearray[5];
  224. int status;
  225. writearray[0] = 64;
  226. // For dummy I2C command, don't check executing status.
  227. status=I2CWriteByte (pTuner, 200,2,writearray[0]);
  228. status=I2CWriteByte (pTuner, 200,2,writearray[0]);
  229. //printf("\nRegister 0=%d", writearray[0]);
  230. if(status != E4000_I2C_SUCCESS)
  231. {
  232. return E4000_1_FAIL;
  233. }
  234. writearray[0] = 0;
  235. status=I2CWriteByte (pTuner, 200,9,writearray[0]);
  236. if(status != E4000_I2C_SUCCESS)
  237. {
  238. return E4000_1_FAIL;
  239. }
  240. writearray[0] = 0;
  241. status=I2CWriteByte (pTuner, 200,5,writearray[0]);
  242. if(status != E4000_I2C_SUCCESS)
  243. {
  244. return E4000_1_FAIL;
  245. }
  246. writearray[0] = 7;
  247. status=I2CWriteByte (pTuner, 200,0,writearray[0]);
  248. //printf("\nRegister 0=%d", writearray[0]);
  249. if(status != E4000_I2C_SUCCESS)
  250. {
  251. return E4000_1_FAIL;
  252. }
  253. return E4000_1_SUCCESS;
  254. }
  255. /****************************************************************************\
  256. * Function: Tunerclock
  257. *
  258. * Detailed Description:
  259. * The function configures the E4000 clock. (Register 0x06, 0x7a).
  260. * Function disables the clock - values can be modified to enable if required.
  261. \****************************************************************************/
  262. int Tunerclock(void *pTuner)
  263. {
  264. unsigned char writearray[5];
  265. int status;
  266. writearray[0] = 0;
  267. status=I2CWriteByte(pTuner, 200,6,writearray[0]);
  268. //printf("\nRegister 6=%d", writearray[0]);
  269. if(status != E4000_I2C_SUCCESS)
  270. {
  271. return E4000_1_FAIL;
  272. }
  273. writearray[0] = 150;
  274. status=I2CWriteByte(pTuner, 200,122,writearray[0]);
  275. //printf("\nRegister 7a=%d", writearray[0]);
  276. //**Modify commands above with value required if output clock is required,
  277. if(status != E4000_I2C_SUCCESS)
  278. {
  279. return E4000_1_FAIL;
  280. }
  281. return E4000_1_SUCCESS;
  282. }
  283. /****************************************************************************\
  284. * Function: filtercal
  285. *
  286. * Detailed Description:
  287. * Instructs RC filter calibration. (Register 0x7b).
  288. *
  289. \****************************************************************************/
  290. /*
  291. int filtercal(void *pTuner)
  292. {
  293. //writearray[0] = 1;
  294. //I2CWriteByte (pTuner, 200,123,writearray[0]);
  295. //printf("\nRegister 7b=%d", writearray[0]);
  296. //return;
  297. return E4000_1_SUCCESS;
  298. }
  299. */
  300. /****************************************************************************\
  301. * Function: Qpeak()
  302. *
  303. * Detailed Description:
  304. * The function configures the E4000 gains.
  305. * Also sigma delta controller. (Register 0x82).
  306. *
  307. \****************************************************************************/
  308. int Qpeak(void *pTuner)
  309. {
  310. unsigned char writearray[5];
  311. int status;
  312. writearray[0] = 1;
  313. writearray[1] = 254;
  314. status=I2CWriteArray(pTuner, 200,126,2,writearray);
  315. //printf("\nRegister 7e=%d", writearray[0]);
  316. //printf("\nRegister 7f=%d", writearray[1]);
  317. if(status != E4000_I2C_SUCCESS)
  318. {
  319. return E4000_1_FAIL;
  320. }
  321. status=I2CWriteByte (pTuner, 200,130,0);
  322. //printf("\nRegister 82=0");
  323. if(status != E4000_I2C_SUCCESS)
  324. {
  325. return E4000_1_FAIL;
  326. }
  327. status=I2CWriteByte (pTuner, 200,36,5);
  328. //printf("\nRegister 24=5");
  329. if(status != E4000_I2C_SUCCESS)
  330. {
  331. return E4000_1_FAIL;
  332. }
  333. writearray[0] = 32;
  334. writearray[1] = 1;
  335. status=I2CWriteArray(pTuner, 200,135,2,writearray);
  336. if(status != E4000_I2C_SUCCESS)
  337. {
  338. return E4000_1_FAIL;
  339. }
  340. //printf("\nRegister 87=%d", writearray[0]);
  341. //printf("\nRegister 88=%d", writearray[1]);
  342. return E4000_1_SUCCESS;
  343. }
  344. /****************************************************************************\
  345. * Function: E4000_gain_freq()
  346. *
  347. * Detailed Description:
  348. * The function configures the E4000 gains vs. freq
  349. * 0xa3 to 0xa7. Also 0x24.
  350. *
  351. \****************************************************************************/
  352. int E4000_gain_freq(void *pTuner, int Freq)
  353. {
  354. unsigned char writearray[5];
  355. int status;
  356. if (Freq<=350000)
  357. {
  358. writearray[0] = 0x10;
  359. writearray[1] = 0x42;
  360. writearray[2] = 0x09;
  361. writearray[3] = 0x21;
  362. writearray[4] = 0x94;
  363. }
  364. else if(Freq>=1000000)
  365. {
  366. writearray[0] = 0x10;
  367. writearray[1] = 0x42;
  368. writearray[2] = 0x09;
  369. writearray[3] = 0x21;
  370. writearray[4] = 0x94;
  371. }
  372. else
  373. {
  374. writearray[0] = 0x10;
  375. writearray[1] = 0x42;
  376. writearray[2] = 0x09;
  377. writearray[3] = 0x21;
  378. writearray[4] = 0x94;
  379. }
  380. status=I2CWriteArray(pTuner, 200,163,5,writearray);
  381. if(status != E4000_I2C_SUCCESS)
  382. {
  383. return E4000_1_FAIL;
  384. }
  385. if (Freq<=350000)
  386. {
  387. writearray[0] = 94;
  388. writearray[1] = 6;
  389. status=I2CWriteArray(pTuner, 200,159,2,writearray);
  390. if(status != E4000_I2C_SUCCESS)
  391. {
  392. return E4000_1_FAIL;
  393. }
  394. writearray[0] = 0;
  395. status=I2CWriteArray(pTuner, 200,136,1,writearray);
  396. if(status != E4000_I2C_SUCCESS)
  397. {
  398. return E4000_1_FAIL;
  399. }
  400. }
  401. else
  402. {
  403. writearray[0] = 127;
  404. writearray[1] = 7;
  405. status=I2CWriteArray(pTuner, 200,159,2,writearray);
  406. if(status != E4000_I2C_SUCCESS)
  407. {
  408. return E4000_1_FAIL;
  409. }
  410. writearray[0] = 1;
  411. status=I2CWriteArray(pTuner, 200,136,1,writearray);
  412. if(status != E4000_I2C_SUCCESS)
  413. {
  414. return E4000_1_FAIL;
  415. }
  416. }
  417. //printf("\nRegister 9f=%d", writearray[0]);
  418. //printf("\nRegister a0=%d", writearray[1]);
  419. return E4000_1_SUCCESS;
  420. }
  421. /****************************************************************************\
  422. * Function: DCoffloop
  423. *
  424. * Detailed Description:
  425. * Populates DC offset LUT. (Registers 0x2d, 0x70, 0x71).
  426. * Turns on DC offset LUT and time varying DC offset.
  427. \****************************************************************************/
  428. int DCoffloop(void *pTuner)
  429. {
  430. unsigned char writearray[5];
  431. int status;
  432. //writearray[0]=0;
  433. //I2CWriteByte(pTuner, 200,115,writearray[0]);
  434. //printf("\nRegister 73=%d", writearray[0]);
  435. writearray[0] = 31;
  436. status=I2CWriteByte(pTuner, 200,45,writearray[0]);
  437. //printf("\nRegister 2d=%d", writearray[0]);
  438. if(status != E4000_I2C_SUCCESS)
  439. {
  440. return E4000_1_FAIL;
  441. }
  442. writearray[0] = 1;
  443. writearray[1] = 1;
  444. status=I2CWriteArray(pTuner, 200,112,2,writearray);
  445. //printf("\nRegister 70=%d", writearray[0]);
  446. //printf("\nRegister 71=%d", writearray[0]);
  447. if(status != E4000_I2C_SUCCESS)
  448. {
  449. return E4000_1_FAIL;
  450. }
  451. return E4000_1_SUCCESS;
  452. }
  453. /****************************************************************************\
  454. * Function: commonmode
  455. *
  456. * Detailed Description:
  457. * Configures common mode voltage. (Registers 0x2f).
  458. *
  459. \****************************************************************************/
  460. /*
  461. int commonmode(void *pTuner)
  462. {
  463. //writearray[0] = 0;
  464. //I2CWriteByte(Device_address,47,writearray[0]);
  465. //printf("\nRegister 0x2fh = %d", writearray[0]);
  466. // Sets 550mV. Modify if alternative is desired.
  467. return E4000_1_SUCCESS;
  468. }
  469. */
  470. /****************************************************************************\
  471. * Function: GainControlinit
  472. *
  473. * Detailed Description:
  474. * Configures gain control mode. (Registers 0x1d, 0x1e, 0x1f, 0x20, 0x21,
  475. * 0x1a, 0x74h, 0x75h).
  476. * User may wish to modify values depending on usage scenario.
  477. * Routine configures LNA: autonomous gain control
  478. * IF PWM gain control.
  479. * PWM thresholds = default
  480. * Mixer: switches when LNA gain =7.5dB
  481. * Sensitivity / Linearity mode: manual switch
  482. *
  483. \****************************************************************************/
  484. int GainControlinit(void *pTuner)
  485. {
  486. unsigned char writearray[5];
  487. unsigned char read1[1];
  488. int status;
  489. unsigned char sum=255;
  490. writearray[0] = 23;
  491. status=I2CWriteByte(pTuner, 200,26,writearray[0]);
  492. if(status != E4000_I2C_SUCCESS)
  493. {
  494. return E4000_1_FAIL;
  495. }
  496. //printf("\nRegister 1a=%d", writearray[0]);
  497. status=I2CReadByte(pTuner, 201,27,read1);
  498. if(status != E4000_I2C_SUCCESS)
  499. {
  500. return E4000_1_FAIL;
  501. }
  502. writearray[0] = 16;
  503. writearray[1] = 4;
  504. writearray[2] = 26;
  505. writearray[3] = 15;
  506. writearray[4] = 167;
  507. status=I2CWriteArray(pTuner, 200,29,5,writearray);
  508. //printf("\nRegister 1d=%d", writearray[0]);
  509. if(status != E4000_I2C_SUCCESS)
  510. {
  511. return E4000_1_FAIL;
  512. }
  513. writearray[0] = 81;
  514. status=I2CWriteByte(pTuner, 200,134,writearray[0]);
  515. if(status != E4000_I2C_SUCCESS)
  516. {
  517. return E4000_1_FAIL;
  518. }
  519. //printf("\nRegister 86=%d", writearray[0]);
  520. //For Realtek - gain control logic
  521. status=I2CReadByte(pTuner, 201,27,read1);
  522. if(status != E4000_I2C_SUCCESS)
  523. {
  524. return E4000_1_FAIL;
  525. }
  526. if(read1[0]<=sum)
  527. {
  528. sum=read1[0];
  529. }
  530. status=I2CWriteByte(pTuner, 200,31,writearray[2]);
  531. if(status != E4000_I2C_SUCCESS)
  532. {
  533. return E4000_1_FAIL;
  534. }
  535. status=I2CReadByte(pTuner, 201,27,read1);
  536. if(status != E4000_I2C_SUCCESS)
  537. {
  538. return E4000_1_FAIL;
  539. }
  540. if(read1[0] <= sum)
  541. {
  542. sum=read1[0];
  543. }
  544. status=I2CWriteByte(pTuner, 200,31,writearray[2]);
  545. if(status != E4000_I2C_SUCCESS)
  546. {
  547. return E4000_1_FAIL;
  548. }
  549. status=I2CReadByte(pTuner, 201,27,read1);
  550. if(status != E4000_I2C_SUCCESS)
  551. {
  552. return E4000_1_FAIL;
  553. }
  554. if(read1[0] <= sum)
  555. {
  556. sum=read1[0];
  557. }
  558. status=I2CWriteByte(pTuner, 200,31,writearray[2]);
  559. if(status != E4000_I2C_SUCCESS)
  560. {
  561. return E4000_1_FAIL;
  562. }
  563. status=I2CReadByte(pTuner, 201,27,read1);
  564. if(status != E4000_I2C_SUCCESS)
  565. {
  566. return E4000_1_FAIL;
  567. }
  568. if(read1[0] <= sum)
  569. {
  570. sum=read1[0];
  571. }
  572. status=I2CWriteByte(pTuner, 200,31,writearray[2]);
  573. if(status != E4000_I2C_SUCCESS)
  574. {
  575. return E4000_1_FAIL;
  576. }
  577. status=I2CReadByte(pTuner, 201,27,read1);
  578. if(status != E4000_I2C_SUCCESS)
  579. {
  580. return E4000_1_FAIL;
  581. }
  582. if (read1[0]<=sum)
  583. {
  584. sum=read1[0];
  585. }
  586. writearray[0]=sum;
  587. status=I2CWriteByte(pTuner, 200,27,writearray[0]);
  588. if(status != E4000_I2C_SUCCESS)
  589. {
  590. return E4000_1_FAIL;
  591. }
  592. //printf("\nRegister 1b=%d", writearray[0]);
  593. //printf("\nRegister 1e=%d", writearray[1]);
  594. //printf("\nRegister 1f=%d", writearray[2]);
  595. //printf("\nRegister 20=%d", writearray[3]);
  596. //printf("\nRegister 21=%d", writearray[4]);
  597. //writearray[0] = 3;
  598. //writearray[1] = 252;
  599. //writearray[2] = 3;
  600. //writearray[3] = 252;
  601. //I2CWriteArray(pTuner, 200,116,4,writearray);
  602. //printf("\nRegister 74=%d", writearray[0]);
  603. //printf("\nRegister 75=%d", writearray[1]);
  604. //printf("\nRegister 76=%d", writearray[2]);
  605. //printf("\nRegister 77=%d", writearray[3]);
  606. return E4000_1_SUCCESS;
  607. }
  608. /****************************************************************************\
  609. * Main program
  610. *
  611. *
  612. *
  613. \****************************************************************************/
  614. /*
  615. int main()
  616. {
  617. tunerreset ();
  618. Tunerclock();
  619. //filtercal();
  620. Qpeak();
  621. //PLL(Ref_clk, Freq);
  622. //LNAfilter(Freq);
  623. //IFfilter(bandwidth, Ref_clk);
  624. //freqband(Freq);
  625. //DCoffLUT();
  626. DCoffloop();
  627. //commonmode();
  628. GainControlinit();
  629. // system("PAUSE");
  630. return(0);
  631. }
  632. */
  633. // Elonics source code - frequency_change_rev2.04_realtek.c
  634. //****************************************************************************/
  635. //
  636. // Filename E4000_freqchangerev2.04.c
  637. // Revision 2.04
  638. //
  639. // Description:
  640. // Frequency change script for the Elonics E4000 revB tuner
  641. //
  642. // Copyright (c) Elonics Ltd
  643. //
  644. // Any software supplied free of charge for use with elonics
  645. // evaluation kits is supplied without warranty and for
  646. // evaluation purposes only. Incorporation of any of this
  647. // code into products for open sale is permitted but only at
  648. // the user's own risk. Elonics accepts no liability for the
  649. // integrity of this software whatsoever.
  650. //
  651. //
  652. //****************************************************************************/
  653. //#include <stdio.h>
  654. //#include <stdlib.h>
  655. //
  656. // User defined variable definitions
  657. //
  658. /*
  659. int Ref_clk = 20000; // Reference clock frequency(kHz).
  660. int Freq = 590000; // RF Frequency (kHz)
  661. int bandwidth = 8; //RF channel bandwith (MHz)
  662. */
  663. //
  664. // API defined variable definitions
  665. //int VCO_freq;
  666. //unsigned char writearray[5];
  667. //unsigned char read1[1];
  668. //int E4000_1_SUCCESS;
  669. //int E4000_1_FAIL;
  670. //int E4000_I2C_SUCCESS;
  671. //int status;
  672. //
  673. //
  674. // function definitions
  675. //
  676. /*
  677. int Gainmanual();
  678. int PLL(int Ref_clk, int Freq);
  679. int LNAfilter(int Freq);
  680. int IFfilter(int bandwidth, int Ref_clk);
  681. int freqband(int Freq);
  682. int DCoffLUT();
  683. int GainControlauto();
  684. */
  685. //
  686. //****************************************************************************
  687. // --- Public functions ------------------------------------------------------
  688. /****************************************************************************\
  689. //****************************************************************************\
  690. * Function: Gainmanual
  691. *
  692. * Detailed Description:
  693. * Sets Gain control to serial interface control.
  694. *
  695. \****************************************************************************/
  696. int Gainmanual(void *pTuner)
  697. {
  698. unsigned char writearray[5];
  699. int status;
  700. writearray[0]=0;
  701. status=I2CWriteByte(pTuner, 200,26,writearray[0]);
  702. //printf("\nRegister 1a=%d", writearray[0]);
  703. if(status != E4000_I2C_SUCCESS)
  704. {
  705. return E4000_1_FAIL;
  706. }
  707. writearray[0] = 0;
  708. status=I2CWriteByte (pTuner, 200,9,writearray[0]);
  709. if(status != E4000_I2C_SUCCESS)
  710. {
  711. return E4000_1_FAIL;
  712. }
  713. writearray[0] = 0;
  714. status=I2CWriteByte (pTuner, 200,5,writearray[0]);
  715. if(status != E4000_I2C_SUCCESS)
  716. {
  717. return E4000_1_FAIL;
  718. }
  719. return E4000_1_SUCCESS;
  720. }
  721. /****************************************************************************\
  722. * Function: PLL
  723. *
  724. * Detailed Description:
  725. * Configures E4000 PLL divider & sigma delta. 0x0d,0x09, 0x0a, 0x0b).
  726. *
  727. \****************************************************************************/
  728. int PLL(void *pTuner, int Ref_clk, int Freq)
  729. {
  730. int VCO_freq;
  731. unsigned char writearray[5];
  732. int status;
  733. unsigned char divider;
  734. int intVCOfreq;
  735. int SigDel;
  736. int SigDel2;
  737. int SigDel3;
  738. // int harmonic_freq;
  739. // int offset;
  740. if (Freq<=72400)
  741. {
  742. writearray[4] = 15;
  743. VCO_freq=Freq*48;
  744. }
  745. else if (Freq<=81200)
  746. {
  747. writearray[4] = 14;
  748. VCO_freq=Freq*40;
  749. }
  750. else if (Freq<=108300)
  751. {
  752. writearray[4]=13;
  753. VCO_freq=Freq*32;
  754. }
  755. else if (Freq<=162500)
  756. {
  757. writearray[4]=12;
  758. VCO_freq=Freq*24;
  759. }
  760. else if (Freq<=216600)
  761. {
  762. writearray[4]=11;
  763. VCO_freq=Freq*16;
  764. }
  765. else if (Freq<=325000)
  766. {
  767. writearray[4]=10;
  768. VCO_freq=Freq*12;
  769. }
  770. else if (Freq<=350000)
  771. {
  772. writearray[4]=9;
  773. VCO_freq=Freq*8;
  774. }
  775. else if (Freq<=432000)
  776. {
  777. writearray[4]=3;
  778. VCO_freq=Freq*8;
  779. }
  780. else if (Freq<=667000)
  781. {
  782. writearray[4]=2;
  783. VCO_freq=Freq*6;
  784. }
  785. else if (Freq<=1200000)
  786. {
  787. writearray[4]=1;
  788. VCO_freq=Freq*4;
  789. }
  790. else
  791. {
  792. writearray[4]=0;
  793. VCO_freq=Freq*2;
  794. }
  795. //printf("\nVCOfreq=%d", VCO_freq);
  796. // divider = VCO_freq * 1000 / Ref_clk;
  797. divider = VCO_freq / Ref_clk;
  798. //printf("\ndivider=%d", divider);
  799. writearray[0]= divider;
  800. // intVCOfreq = divider * Ref_clk /1000;
  801. intVCOfreq = divider * Ref_clk;
  802. //printf("\ninteger VCO freq=%d", intVCOfreq);
  803. // SigDel=65536 * 1000 * (VCO_freq - intVCOfreq) / Ref_clk;
  804. SigDel=65536 * (VCO_freq - intVCOfreq) / Ref_clk;
  805. //printf("\nSigma delta=%d", SigDel);
  806. if (SigDel<=1024)
  807. {
  808. SigDel = 1024;
  809. }
  810. else if (SigDel>=64512)
  811. {
  812. SigDel=64512;
  813. }
  814. SigDel2 = SigDel / 256;
  815. //printf("\nSigdel2=%d", SigDel2);
  816. writearray[2] = (unsigned char)SigDel2;
  817. SigDel3 = SigDel - (256 * SigDel2);
  818. //printf("\nSig del3=%d", SigDel3);
  819. writearray[1]= (unsigned char)SigDel3;
  820. writearray[3]=(unsigned char)0;
  821. status=I2CWriteArray(pTuner, 200,9,5,writearray);
  822. //printf("\nRegister 9=%d", writearray[0]);
  823. //printf("\nRegister a=%d", writearray[1]);
  824. //printf("\nRegister b=%d", writearray[2]);
  825. //printf("\nRegister d=%d", writearray[4]);
  826. if(status != E4000_I2C_SUCCESS)
  827. {
  828. return E4000_1_FAIL;
  829. }
  830. if (Freq<=82900)
  831. {
  832. writearray[0]=0;
  833. writearray[2]=1;
  834. }
  835. else if (Freq<=89900)
  836. {
  837. writearray[0]=3;
  838. writearray[2]=9;
  839. }
  840. else if (Freq<=111700)
  841. {
  842. writearray[0]=0;
  843. writearray[2]=1;
  844. }
  845. else if (Freq<=118700)
  846. {
  847. writearray[0]=3;
  848. writearray[2]=1;
  849. }
  850. else if (Freq<=140500)
  851. {
  852. writearray[0]=0;
  853. writearray[2]=3;
  854. }
  855. else if (Freq<=147500)
  856. {
  857. writearray[0]=3;
  858. writearray[2]=11;
  859. }
  860. else if (Freq<=169300)
  861. {
  862. writearray[0]=0;
  863. writearray[2]=3;
  864. }
  865. else if (Freq<=176300)
  866. {
  867. writearray[0]=3;
  868. writearray[2]=11;
  869. }
  870. else if (Freq<=198100)
  871. {
  872. writearray[0]=0;
  873. writearray[2]=3;
  874. }
  875. else if (Freq<=205100)
  876. {
  877. writearray[0]=3;
  878. writearray[2]=19;
  879. }
  880. else if (Freq<=226900)
  881. {
  882. writearray[0]=0;
  883. writearray[2]=3;
  884. }
  885. else if (Freq<=233900)
  886. {
  887. writearray[0]=3;
  888. writearray[2]=3;
  889. }
  890. else if (Freq<=350000)
  891. {
  892. writearray[0]=0;
  893. writearray[2]=3;
  894. }
  895. else if (Freq<=485600)
  896. {
  897. writearray[0]=0;
  898. writearray[2]=5;
  899. }
  900. else if (Freq<=493600)
  901. {
  902. writearray[0]=3;
  903. writearray[2]=5;
  904. }
  905. else if (Freq<=514400)
  906. {
  907. writearray[0]=0;
  908. writearray[2]=5;
  909. }
  910. else if (Freq<=522400)
  911. {
  912. writearray[0]=3;
  913. writearray[2]=5;
  914. }
  915. else if (Freq<=543200)
  916. {
  917. writearray[0]=0;
  918. writearray[2]=5;
  919. }
  920. else if (Freq<=551200)
  921. {
  922. writearray[0]=3;
  923. writearray[2]=13;
  924. }
  925. else if (Freq<=572000)
  926. {
  927. writearray[0]=0;
  928. writearray[2]=5;
  929. }
  930. else if (Freq<=580000)
  931. {
  932. writearray[0]=3;
  933. writearray[2]=13;
  934. }
  935. else if (Freq<=600800)
  936. {
  937. writearray[0]=0;
  938. writearray[2]=5;
  939. }
  940. else if (Freq<=608800)
  941. {
  942. writearray[0]=3;
  943. writearray[2]=13;
  944. }
  945. else if (Freq<=629600)
  946. {
  947. writearray[0]=0;
  948. writearray[2]=5;
  949. }
  950. else if (Freq<=637600)
  951. {
  952. writearray[0]=3;
  953. writearray[2]=13;
  954. }
  955. else if (Freq<=658400)
  956. {
  957. writearray[0]=0;
  958. writearray[2]=5;
  959. }
  960. else if (Freq<=666400)
  961. {
  962. writearray[0]=3;
  963. writearray[2]=13;
  964. }
  965. else if (Freq<=687200)
  966. {
  967. writearray[0]=0;
  968. writearray[2]=5;
  969. }
  970. else if (Freq<=695200)
  971. {
  972. writearray[0]=3;
  973. writearray[2]=13;
  974. }
  975. else if (Freq<=716000)
  976. {
  977. writearray[0]=0;
  978. writearray[2]=5;
  979. }
  980. else if (Freq<=724000)
  981. {
  982. writearray[0]=3;
  983. writearray[2]=13;
  984. }
  985. else if (Freq<=744800)
  986. {
  987. writearray[0]=0;
  988. writearray[2]=5;
  989. }
  990. else if (Freq<=752800)
  991. {
  992. writearray[0]=3;
  993. writearray[2]=21;
  994. }
  995. else if (Freq<=773600)
  996. {
  997. writearray[0]=0;
  998. writearray[2]=5;
  999. }
  1000. else if (Freq<=781600)
  1001. {
  1002. writearray[0]=3;
  1003. writearray[2]=21;
  1004. }
  1005. else if (Freq<=802400)
  1006. {
  1007. writearray[0]=0;
  1008. writearray[2]=5;
  1009. }
  1010. else if (Freq<=810400)
  1011. {
  1012. writearray[0]=3;
  1013. writearray[2]=21;
  1014. }
  1015. else if (Freq<=831200)
  1016. {
  1017. writearray[0]=0;
  1018. writearray[2]=5;
  1019. }
  1020. else if (Freq<=839200)
  1021. {
  1022. writearray[0]=3;
  1023. writearray[2]=21;
  1024. }
  1025. else if (Freq<=860000)
  1026. {
  1027. writearray[0]=0;
  1028. writearray[2]=5;
  1029. }
  1030. else if (Freq<=868000)
  1031. {
  1032. writearray[0]=3;
  1033. writearray[2]=21;
  1034. }
  1035. else
  1036. {
  1037. writearray[0]=0;
  1038. writearray[2]=7;
  1039. }
  1040. status=I2CWriteByte (pTuner, 200,7,writearray[2]);
  1041. if(status != E4000_I2C_SUCCESS)
  1042. {
  1043. return E4000_1_FAIL;
  1044. }
  1045. status=I2CWriteByte (pTuner, 200,5,writearray[0]);
  1046. if(status != E4000_I2C_SUCCESS)
  1047. {
  1048. return E4000_1_FAIL;
  1049. }
  1050. return E4000_1_SUCCESS;
  1051. }
  1052. /****************************************************************************\
  1053. * Function: LNAfilter
  1054. *
  1055. * Detailed Description:
  1056. * The function configures the E4000 LNA filter. (Register 0x10).
  1057. *
  1058. \****************************************************************************/
  1059. int LNAfilter(void *pTuner, int Freq)
  1060. {
  1061. unsigned char writearray[5];
  1062. int status;
  1063. if(Freq<=370000)
  1064. {
  1065. writearray[0]=0;
  1066. }
  1067. else if(Freq<=392500)
  1068. {
  1069. writearray[0]=1;
  1070. }
  1071. else if(Freq<=415000)
  1072. {
  1073. writearray[0] =2;
  1074. }
  1075. else if(Freq<=437500)
  1076. {
  1077. writearray[0]=3;
  1078. }
  1079. else if(Freq<=462500)
  1080. {
  1081. writearray[0]=4;
  1082. }
  1083. else if(Freq<=490000)
  1084. {
  1085. writearray[0]=5;
  1086. }
  1087. else if(Freq<=522500)
  1088. {
  1089. writearray[0]=6;
  1090. }
  1091. else if(Freq<=557500)
  1092. {
  1093. writearray[0]=7;
  1094. }
  1095. else if(Freq<=595000)
  1096. {
  1097. writearray[0]=8;
  1098. }
  1099. else if(Freq<=642500)
  1100. {
  1101. writearray[0]=9;
  1102. }
  1103. else if(Freq<=695000)
  1104. {
  1105. writearray[0]=10;
  1106. }
  1107. else if(Freq<=740000)
  1108. {
  1109. writearray[0]=11;
  1110. }
  1111. else if(Freq<=800000)
  1112. {
  1113. writearray[0]=12;
  1114. }
  1115. else if(Freq<=865000)
  1116. {
  1117. writearray[0] =13;
  1118. }
  1119. else if(Freq<=930000)
  1120. {
  1121. writearray[0]=14;
  1122. }
  1123. else if(Freq<=1000000)
  1124. {
  1125. writearray[0]=15;
  1126. }
  1127. else if(Freq<=1310000)
  1128. {
  1129. writearray[0]=0;
  1130. }
  1131. else if(Freq<=1340000)
  1132. {
  1133. writearray[0]=1;
  1134. }
  1135. else if(Freq<=1385000)
  1136. {
  1137. writearray[0]=2;
  1138. }
  1139. else if(Freq<=1427500)
  1140. {
  1141. writearray[0]=3;
  1142. }
  1143. else if(Freq<=1452500)
  1144. {
  1145. writearray[0]=4;
  1146. }
  1147. else if(Freq<=1475000)
  1148. {
  1149. writearray[0]=5;
  1150. }
  1151. else if(Freq<=1510000)
  1152. {
  1153. writearray[0]=6;
  1154. }
  1155. else if(Freq<=1545000)
  1156. {
  1157. writearray[0]=7;
  1158. }
  1159. else if(Freq<=1575000)
  1160. {
  1161. writearray[0] =8;
  1162. }
  1163. else if(Freq<=1615000)
  1164. {
  1165. writearray[0]=9;
  1166. }
  1167. else if(Freq<=1650000)
  1168. {
  1169. writearray[0] =10;
  1170. }
  1171. else if(Freq<=1670000)
  1172. {
  1173. writearray[0]=11;
  1174. }
  1175. else if(Freq<=1690000)
  1176. {
  1177. writearray[0]=12;
  1178. }
  1179. else if(Freq<=1710000)
  1180. {
  1181. writearray[0]=13;
  1182. }
  1183. else if(Freq<=1735000)
  1184. {
  1185. writearray[0]=14;
  1186. }
  1187. else
  1188. {
  1189. writearray[0]=15;
  1190. }
  1191. status=I2CWriteByte (pTuner, 200,16,writearray[0]);
  1192. //printf("\nRegister 10=%d", writearray[0]);
  1193. if(status != E4000_I2C_SUCCESS)
  1194. {
  1195. return E4000_1_FAIL;
  1196. }
  1197. return E4000_1_SUCCESS;
  1198. }
  1199. /****************************************************************************\
  1200. * Function: IFfilter
  1201. *
  1202. * Detailed Description:
  1203. * The function configures the E4000 IF filter. (Register 0x11,0x12).
  1204. *
  1205. \****************************************************************************/
  1206. int IFfilter(void *pTuner, int bandwidth, int Ref_clk)
  1207. {
  1208. unsigned char writearray[5];
  1209. int status;
  1210. int IF_BW;
  1211. IF_BW = bandwidth / 2;
  1212. if(IF_BW<=2150)
  1213. {
  1214. writearray[0]=253;
  1215. writearray[1]=31;
  1216. }
  1217. else if(IF_BW<=2200)
  1218. {
  1219. writearray[0]=253;
  1220. writearray[1]=30;
  1221. }
  1222. else if(IF_BW<=2240)
  1223. {
  1224. writearray[0]=252;
  1225. writearray[1]=29;
  1226. }
  1227. else if(IF_BW<=2280)
  1228. {
  1229. writearray[0]=252;
  1230. writearray[1]=28;
  1231. }
  1232. else if(IF_BW<=2300)
  1233. {
  1234. writearray[0]=252;
  1235. writearray[1]=27;
  1236. }
  1237. else if(IF_BW<=2400)
  1238. {
  1239. writearray[0]=252;
  1240. writearray[1]=26;
  1241. }
  1242. else if(IF_BW<=2450)
  1243. {
  1244. writearray[0]=252;
  1245. writearray[1]=25;
  1246. }
  1247. else if(IF_BW<=2500)
  1248. {
  1249. writearray[0]=252;
  1250. writearray[1]=24;
  1251. }
  1252. else if(IF_BW<=2550)
  1253. {
  1254. writearray[0]=252;
  1255. writearray[1]=23;
  1256. }
  1257. else if(IF_BW<=2600)
  1258. {
  1259. writearray[0]=252;
  1260. writearray[1]=22;
  1261. }
  1262. else if(IF_BW<=2700)
  1263. {
  1264. writearray[0]=252;
  1265. writearray[1]=21;
  1266. }
  1267. else if(IF_BW<=2750)
  1268. {
  1269. writearray[0]=252;
  1270. writearray[1]=20;
  1271. }
  1272. else if(IF_BW<=2800)
  1273. {
  1274. writearray[0]=252;
  1275. writearray[1]=19;
  1276. }
  1277. else if(IF_BW<=2900)
  1278. {
  1279. writearray[0]=251;
  1280. writearray[1]=18;
  1281. }
  1282. else if(IF_BW<=2950)
  1283. {
  1284. writearray[0]=251;
  1285. writearray[1]=17;
  1286. }
  1287. else if(IF_BW<=3000)
  1288. {
  1289. writearray[0]=251;
  1290. writearray[1]=16;
  1291. }
  1292. else if(IF_BW<=3100)
  1293. {
  1294. writearray[0]=251;
  1295. writearray[1]=15;
  1296. }
  1297. else if(IF_BW<=3200)
  1298. {
  1299. writearray[0]=250;
  1300. writearray[1]=14;
  1301. }
  1302. else if(IF_BW<=3300)
  1303. {
  1304. writearray[0]=250;
  1305. writearray[1]=13;
  1306. }
  1307. else if(IF_BW<=3400)
  1308. {
  1309. writearray[0]=249;
  1310. writearray[1]=12;
  1311. }
  1312. else if(IF_BW<=3600)
  1313. {
  1314. writearray[0]=249;
  1315. writearray[1]=11;
  1316. }
  1317. else if(IF_BW<=3700)
  1318. {
  1319. writearray[0]=249;
  1320. writearray[1]=10;
  1321. }
  1322. else if(IF_BW<=3800)
  1323. {
  1324. writearray[0]=248;
  1325. writearray[1]=9;
  1326. }
  1327. else if(IF_BW<=3900)
  1328. {
  1329. writearray[0]=248;
  1330. writearray[1]=8;
  1331. }
  1332. else if(IF_BW<=4100)
  1333. {
  1334. writearray[0]=248;
  1335. writearray[1]=7;
  1336. }
  1337. else if(IF_BW<=4300)
  1338. {
  1339. writearray[0]=247;
  1340. writearray[1]=6;
  1341. }
  1342. else if(IF_BW<=4400)
  1343. {
  1344. writearray[0]=247;
  1345. writearray[1]=5;
  1346. }
  1347. else if(IF_BW<=4600)
  1348. {
  1349. writearray[0]=247;
  1350. writearray[1]=4;
  1351. }
  1352. else if(IF_BW<=4800)
  1353. {
  1354. writearray[0]=246;
  1355. writearray[1]=3;
  1356. }
  1357. else if(IF_BW<=5000)
  1358. {
  1359. writearray[0]=246;
  1360. writearray[1]=2;
  1361. }
  1362. else if(IF_BW<=5300)
  1363. {
  1364. writearray[0]=245;
  1365. writearray[1]=1;
  1366. }
  1367. else if(IF_BW<=5500)
  1368. {
  1369. writearray[0]=245;
  1370. writearray[1]=0;
  1371. }
  1372. else
  1373. {
  1374. writearray[0]=0;
  1375. writearray[1]=32;
  1376. }
  1377. status=I2CWriteArray(pTuner, 200,17,2,writearray);
  1378. //printf("\nRegister 11=%d", writearray[0]);
  1379. //printf("\nRegister 12=%d", writearray[1]);
  1380. if(status != E4000_I2C_SUCCESS)
  1381. {
  1382. return E4000_1_FAIL;
  1383. }
  1384. return E4000_1_SUCCESS;
  1385. }
  1386. /****************************************************************************\
  1387. * Function: freqband
  1388. *
  1389. * Detailed Description:
  1390. * Configures the E4000 frequency band. (Registers 0x07, 0x78).
  1391. *
  1392. \****************************************************************************/
  1393. int freqband(void *pTuner, int Freq)
  1394. {
  1395. unsigned char writearray[5];
  1396. int status;
  1397. if (Freq<=140000)
  1398. {
  1399. writearray[0] = 3;
  1400. status=I2CWriteByte(pTuner, 200,120,writearray[0]);
  1401. if(status != E4000_I2C_SUCCESS)
  1402. {
  1403. return E4000_1_FAIL;
  1404. }
  1405. }
  1406. else if (Freq<=350000)
  1407. {
  1408. writearray[0] = 3;
  1409. status=I2CWriteByte(pTuner, 200,120,writearray[0]);
  1410. if(status != E4000_I2C_SUCCESS)
  1411. {
  1412. return E4000_1_FAIL;
  1413. }
  1414. }
  1415. else if (Freq<=1000000)
  1416. {
  1417. writearray[0] = 3;
  1418. status=I2CWriteByte(pTuner, 200,120,writearray[0]);
  1419. if(status != E4000_I2C_SUCCESS)
  1420. {
  1421. return E4000_1_FAIL;
  1422. }
  1423. }
  1424. else
  1425. {
  1426. writearray[0] = 7;
  1427. status=I2CWriteByte(pTuner, 200,7,writearray[0]);
  1428. if(status != E4000_I2C_SUCCESS)
  1429. {
  1430. return E4000_1_FAIL;
  1431. }
  1432. writearray[0] = 0;
  1433. status=I2CWriteByte(pTuner, 200,120,writearray[0]);
  1434. if(status != E4000_I2C_SUCCESS)
  1435. {
  1436. return E4000_1_FAIL;
  1437. }
  1438. }
  1439. return E4000_1_SUCCESS;
  1440. }
  1441. /****************************************************************************\
  1442. * Function: DCoffLUT
  1443. *
  1444. * Detailed Description:
  1445. * Populates DC offset LUT. (Registers 0x50 - 0x53, 0x60 - 0x63).
  1446. *
  1447. \****************************************************************************/
  1448. int DCoffLUT(void *pTuner)
  1449. {
  1450. unsigned char writearray[5];
  1451. int status;
  1452. unsigned char read1[1];
  1453. unsigned char IOFF;
  1454. unsigned char QOFF;
  1455. unsigned char RANGE1;
  1456. // unsigned char RANGE2;
  1457. unsigned char QRANGE;
  1458. unsigned char IRANGE;
  1459. writearray[0] = 0;
  1460. writearray[1] = 126;
  1461. writearray[2] = 36;
  1462. status=I2CWriteArray(pTuner, 200,21,3,writearray);
  1463. if(status != E4000_I2C_SUCCESS)
  1464. {
  1465. return E4000_1_FAIL;
  1466. }
  1467. // Sets mixer & IF stage 1 gain = 00 and IF stg 2+ to max gain.
  1468. writearray[0] = 1;
  1469. status=I2CWriteByte(pTuner, 200,41,writearray[0]);
  1470. // Instructs a DC offset calibration.
  1471. status=I2CReadByte(pTuner, 201,42,read1);
  1472. if(status != E4000_I2C_SUCCESS)
  1473. {
  1474. return E4000_1_FAIL;
  1475. }
  1476. IOFF=read1[0];
  1477. status=I2CReadByte(pTuner, 201,43,read1);
  1478. if(status != E4000_I2C_SUCCESS)
  1479. {
  1480. return E4000_1_FAIL;
  1481. }
  1482. QOFF=read1[0];
  1483. status=I2CReadByte(pTuner, 201,44,read1);
  1484. if(status != E4000_I2C_SUCCESS)
  1485. {
  1486. return E4000_1_FAIL;
  1487. }
  1488. RANGE1=read1[0];
  1489. //reads DC offset values back
  1490. if(RANGE1>=32)
  1491. {
  1492. RANGE1 = RANGE1 -32;
  1493. }
  1494. if(RANGE1>=16)
  1495. {
  1496. RANGE1 = RANGE1 - 16;
  1497. }
  1498. IRANGE=RANGE1;
  1499. QRANGE = (read1[0] - RANGE1) / 16;
  1500. writearray[0] = (IRANGE * 64) + IOFF;
  1501. status=I2CWriteByte(pTuner, 200,96,writearray[0]);
  1502. if(status != E4000_I2C_SUCCESS)
  1503. {
  1504. return E4000_1_FAIL;
  1505. }
  1506. writearray[0] = (QRANGE * 64) + QOFF;
  1507. status=I2CWriteByte(pTuner, 200,80,writearray[0]);
  1508. if(status != E4000_I2C_SUCCESS)
  1509. {
  1510. return E4000_1_FAIL;
  1511. }
  1512. // Populate DC offset LUT
  1513. writearray[0] = 0;
  1514. writearray[1] = 127;
  1515. status=I2CWriteArray(pTuner, 200,21,2,writearray);
  1516. if(status != E4000_I2C_SUCCESS)
  1517. {
  1518. return E4000_1_FAIL;
  1519. }
  1520. // Sets mixer & IF stage 1 gain = 01 leaving IF stg 2+ at max gain.
  1521. writearray[0]= 1;
  1522. status=I2CWriteByte(pTuner, 200,41,writearray[0]);
  1523. if(status != E4000_I2C_SUCCESS)
  1524. {
  1525. return E4000_1_FAIL;
  1526. }
  1527. // Instructs a DC offset calibration.
  1528. status=I2CReadByte(pTuner, 201,42,read1);
  1529. if(status != E4000_I2C_SUCCESS)
  1530. {
  1531. return E4000_1_FAIL;
  1532. }
  1533. IOFF=read1[0];
  1534. status=I2CReadByte(pTuner, 201,43,read1);
  1535. if(status != E4000_I2C_SUCCESS)
  1536. {
  1537. return E4000_1_FAIL;
  1538. }
  1539. QOFF=read1[0];
  1540. status=I2CReadByte(pTuner, 201,44,read1);
  1541. if(status != E4000_I2C_SUCCESS)
  1542. {
  1543. return E4000_1_FAIL;
  1544. }
  1545. RANGE1=read1[0];
  1546. // Read DC offset values
  1547. if(RANGE1>=32)
  1548. {
  1549. RANGE1 = RANGE1 -32;
  1550. }
  1551. if(RANGE1>=16)
  1552. {
  1553. RANGE1 = RANGE1 - 16;
  1554. }
  1555. IRANGE = RANGE1;
  1556. QRANGE = (read1[0] - RANGE1) / 16;
  1557. writearray[0] = (IRANGE * 64) + IOFF;
  1558. status=I2CWriteByte(pTuner, 200,97,writearray[0]);
  1559. if(status != E4000_I2C_SUCCESS)
  1560. {
  1561. return E4000_1_FAIL;
  1562. }
  1563. writearray[0] = (QRANGE * 64) + QOFF;
  1564. status=I2CWriteByte(pTuner, 200,81,writearray[0]);
  1565. if(status != E4000_I2C_SUCCESS)
  1566. {
  1567. return E4000_1_FAIL;
  1568. }
  1569. // Populate DC offset LUT
  1570. writearray[0] = 1;
  1571. status=I2CWriteByte(pTuner, 200,21,writearray[0]);
  1572. if(status != E4000_I2C_SUCCESS)
  1573. {
  1574. return E4000_1_FAIL;
  1575. }
  1576. // Sets mixer & IF stage 1 gain = 11 leaving IF stg 2+ at max gain.
  1577. writearray[0] = 1;
  1578. status=I2CWriteByte(pTuner, 200,41,writearray[0]);
  1579. if(status != E4000_I2C_SUCCESS)
  1580. {
  1581. return E4000_1_FAIL;
  1582. }
  1583. // Instructs a DC offset calibration.
  1584. status=I2CReadByte(pTuner, 201,42,read1);
  1585. if(status != E4000_I2C_SUCCESS)
  1586. {
  1587. return E4000_1_FAIL;
  1588. }
  1589. IOFF=read1[0];
  1590. status=I2CReadByte(pTuner, 201,43,read1);
  1591. if(status != E4000_I2C_SUCCESS)
  1592. {
  1593. return E4000_1_FAIL;
  1594. }
  1595. QOFF=read1[0];
  1596. status=I2CReadByte(pTuner, 201,44,read1);
  1597. if(status != E4000_I2C_SUCCESS)
  1598. {
  1599. return E4000_1_FAIL;
  1600. }
  1601. RANGE1 = read1[0];
  1602. // Read DC offset values
  1603. if(RANGE1>=32)
  1604. {
  1605. RANGE1 = RANGE1 -32;
  1606. }
  1607. if(RANGE1>=16)
  1608. {
  1609. RANGE1 = RANGE1 - 16;
  1610. }
  1611. IRANGE = RANGE1;
  1612. QRANGE = (read1[0] - RANGE1) / 16;
  1613. writearray[0] = (IRANGE * 64) + IOFF;
  1614. status=I2CWriteByte(pTuner, 200,99,writearray[0]);
  1615. if(status != E4000_I2C_SUCCESS)
  1616. {
  1617. return E4000_1_FAIL;
  1618. }
  1619. writearray[0] = (QRANGE * 64) + QOFF;
  1620. status=I2CWriteByte(pTuner, 200,83,writearray[0]);
  1621. if(status != E4000_I2C_SUCCESS)
  1622. {
  1623. return E4000_1_FAIL;
  1624. }
  1625. // Populate DC offset LUT
  1626. writearray[0] = 126;
  1627. status=I2CWriteByte(pTuner, 200,22,writearray[0]);
  1628. if(status != E4000_I2C_SUCCESS)
  1629. {
  1630. return E4000_1_FAIL;
  1631. }
  1632. // Sets mixer & IF stage 1 gain = 11 leaving IF stg 2+ at max gain.
  1633. writearray[0] = 1;
  1634. status=I2CWriteByte(pTuner, 200,41,writearray[0]);
  1635. if(status != E4000_I2C_SUCCESS)
  1636. {
  1637. return E4000_1_FAIL;
  1638. }
  1639. // Instructs a DC offset calibration.
  1640. status=I2CReadByte(pTuner, 201,42,read1);
  1641. if(status != E4000_I2C_SUCCESS)
  1642. {
  1643. return E4000_1_FAIL;
  1644. }
  1645. IOFF=read1[0];
  1646. status=I2CReadByte(pTuner, 201,43,read1);
  1647. if(status != E4000_I2C_SUCCESS)
  1648. {
  1649. return E4000_1_FAIL;
  1650. }
  1651. QOFF=read1[0];
  1652. status=I2CReadByte(pTuner, 201,44,read1);
  1653. if(status != E4000_I2C_SUCCESS)
  1654. {
  1655. return E4000_1_FAIL;
  1656. }
  1657. RANGE1=read1[0];
  1658. // Read DC offset values
  1659. if(RANGE1>=32)
  1660. {
  1661. RANGE1 = RANGE1 -32;
  1662. }
  1663. if(RANGE1>=16)
  1664. {
  1665. RANGE1 = RANGE1 - 16;
  1666. }
  1667. IRANGE = RANGE1;
  1668. QRANGE = (read1[0] - RANGE1) / 16;
  1669. writearray[0]=(IRANGE * 64) + IOFF;
  1670. status=I2CWriteByte(pTuner, 200,98,writearray[0]);
  1671. if(status != E4000_I2C_SUCCESS)
  1672. {
  1673. return E4000_1_FAIL;
  1674. }
  1675. writearray[0] = (QRANGE * 64) + QOFF;
  1676. status=I2CWriteByte(pTuner, 200,82,writearray[0]);
  1677. // Populate DC offset LUT
  1678. if(status != E4000_I2C_SUCCESS)
  1679. {
  1680. return E4000_1_FAIL;
  1681. }
  1682. return E4000_1_SUCCESS;
  1683. }
  1684. /****************************************************************************\
  1685. * Function: GainControlinit
  1686. *
  1687. * Detailed Description:
  1688. * Configures gain control mode. (Registers 0x1a)
  1689. *
  1690. \****************************************************************************/
  1691. int GainControlauto(void *pTuner)
  1692. {
  1693. unsigned char writearray[5];
  1694. int status;
  1695. writearray[0] = 23;
  1696. status=I2CWriteByte(pTuner, 200,26,writearray[0]);
  1697. if(status != E4000_I2C_SUCCESS)
  1698. {
  1699. return E4000_1_FAIL;
  1700. }
  1701. return E4000_1_SUCCESS;
  1702. }
  1703. /****************************************************************************\
  1704. * Main program
  1705. *
  1706. *
  1707. *
  1708. \****************************************************************************/
  1709. /*
  1710. int main()
  1711. {
  1712. Gainmanual();
  1713. PLL(Ref_clk, Freq);
  1714. LNAfilter(Freq);
  1715. IFfilter(bandwidth, Ref_clk);
  1716. freqband(Freq);
  1717. DCoffLUT();
  1718. GainControlauto();
  1719. return(0);
  1720. }
  1721. */
  1722. // Elonics source code - RT2832_SW_optimisation_rev2.c
  1723. /****************************************************************************\
  1724. * Function: E4000_sensitivity
  1725. *
  1726. * Detailed Description:
  1727. * The function configures the E4000 for sensitivity mode.
  1728. *
  1729. \****************************************************************************/
  1730. int E4000_sensitivity(void *pTuner, int Freq, int bandwidth)
  1731. {
  1732. unsigned char writearray[2];
  1733. int status;
  1734. int IF_BW;
  1735. writearray[1]=0x00;
  1736. if(Freq<=700000)
  1737. {
  1738. writearray[0] = 0x07;
  1739. }
  1740. else
  1741. {
  1742. writearray[0] = 0x05;
  1743. }
  1744. status = I2CWriteArray(pTuner,200,36,1,writearray);
  1745. if(status != E4000_I2C_SUCCESS)
  1746. {
  1747. return E4000_1_FAIL;
  1748. }
  1749. IF_BW = bandwidth / 2;
  1750. if(IF_BW<=2500)
  1751. {
  1752. writearray[0]=0xfc;
  1753. writearray[1]=0x17;
  1754. }
  1755. else if(IF_BW<=3000)
  1756. {
  1757. writearray[0]=0xfb;
  1758. writearray[1]=0x0f;
  1759. }
  1760. else if(IF_BW<=3500)
  1761. {
  1762. writearray[0]=0xf9;
  1763. writearray[1]=0x0b;
  1764. }
  1765. else if(IF_BW<=4000)
  1766. {
  1767. writearray[0]=0xf8;
  1768. writearray[1]=0x07;
  1769. }
  1770. status = I2CWriteArray(pTuner,200,17,2,writearray);
  1771. if(status != E4000_I2C_SUCCESS)
  1772. {
  1773. return E4000_1_FAIL;
  1774. }
  1775. return E4000_1_SUCCESS;
  1776. }
  1777. /****************************************************************************\
  1778. * Function: E4000_linearity
  1779. *
  1780. * Detailed Description:
  1781. * The function configures the E4000 for linearity mode.
  1782. *
  1783. \****************************************************************************/
  1784. int E4000_linearity(void *pTuner, int Freq, int bandwidth)
  1785. {
  1786. unsigned char writearray[2];
  1787. int status;
  1788. int IF_BW;
  1789. writearray[1]=0x00;
  1790. if(Freq<=700000)
  1791. {
  1792. writearray[0] = 0x03;
  1793. }
  1794. else
  1795. {
  1796. writearray[0] = 0x01;
  1797. }
  1798. status = I2CWriteArray(pTuner,200,36,1,writearray);
  1799. if(status != E4000_I2C_SUCCESS)
  1800. {
  1801. return E4000_1_FAIL;
  1802. }
  1803. IF_BW = bandwidth / 2;
  1804. if(IF_BW<=2500)
  1805. {
  1806. writearray[0]=0xfe;
  1807. writearray[1]=0x19;
  1808. }
  1809. else if(IF_BW<=3000)
  1810. {
  1811. writearray[0]=0xfd;
  1812. writearray[1]=0x11;
  1813. }
  1814. else if(IF_BW<=3500)
  1815. {
  1816. writearray[0]=0xfb;
  1817. writearray[1]=0x0d;
  1818. }
  1819. else if(IF_BW<=4000)
  1820. {
  1821. writearray[0]=0xfa;
  1822. writearray[1]=0x0a;
  1823. }
  1824. status = I2CWriteArray(pTuner,200,17,2,writearray);
  1825. if(status != E4000_I2C_SUCCESS)
  1826. {
  1827. return E4000_1_FAIL;
  1828. }
  1829. return E4000_1_SUCCESS;
  1830. }
  1831. /****************************************************************************\
  1832. * Function: E4000_nominal
  1833. *
  1834. * Detailed Description:
  1835. * The function configures the E4000 for nominal
  1836. *
  1837. \****************************************************************************/
  1838. int E4000_nominal(void *pTuner, int Freq, int bandwidth)
  1839. {
  1840. unsigned char writearray[2];
  1841. int status;
  1842. int IF_BW;
  1843. writearray[1]=0x00;
  1844. if(Freq<=700000)
  1845. {
  1846. writearray[0] = 0x03;
  1847. }
  1848. else
  1849. {
  1850. writearray[0] = 0x01;
  1851. }
  1852. status = I2CWriteArray(pTuner,200,36,1,writearray);
  1853. if(status != E4000_I2C_SUCCESS)
  1854. {
  1855. return E4000_1_FAIL;
  1856. }
  1857. IF_BW = bandwidth / 2;
  1858. if(IF_BW<=2500)
  1859. {
  1860. writearray[0]=0xfc;
  1861. writearray[1]=0x17;
  1862. }
  1863. else if(IF_BW<=3000)
  1864. {
  1865. writearray[0]=0xfb;
  1866. writearray[1]=0x0f;
  1867. }
  1868. else if(IF_BW<=3500)
  1869. {
  1870. writearray[0]=0xf9;
  1871. writearray[1]=0x0b;
  1872. }
  1873. else if(IF_BW<=4000)
  1874. {
  1875. writearray[0]=0xf8;
  1876. writearray[1]=0x07;
  1877. }
  1878. status = I2CWriteArray(pTuner,200,17,2,writearray);
  1879. if(status != E4000_I2C_SUCCESS)
  1880. {
  1881. return E4000_1_FAIL;
  1882. }
  1883. return E4000_1_SUCCESS;
  1884. }