librtlsdr.c 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929
  1. /*
  2. * rtl-sdr, turns your Realtek RTL2832 based DVB dongle into a SDR receiver
  3. * Copyright (C) 2012-2014 by Steve Markgraf <steve@steve-m.de>
  4. * Copyright (C) 2012 by Dimitri Stolnikov <horiz0n@gmx.net>
  5. *
  6. * This program is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 2 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. #include <errno.h>
  20. #include <signal.h>
  21. #include <string.h>
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #ifndef _WIN32
  25. #include <unistd.h>
  26. #define min(a, b) (((a) < (b)) ? (a) : (b))
  27. #endif
  28. #include <libusb.h>
  29. /*
  30. * All libusb callback functions should be marked with the LIBUSB_CALL macro
  31. * to ensure that they are compiled with the same calling convention as libusb.
  32. *
  33. * If the macro isn't available in older libusb versions, we simply define it.
  34. */
  35. #ifndef LIBUSB_CALL
  36. #define LIBUSB_CALL
  37. #endif
  38. /* libusb < 1.0.9 doesn't have libusb_handle_events_timeout_completed */
  39. #ifndef HAVE_LIBUSB_HANDLE_EVENTS_TIMEOUT_COMPLETED
  40. #define libusb_handle_events_timeout_completed(ctx, tv, c) \
  41. libusb_handle_events_timeout(ctx, tv)
  42. #endif
  43. /* two raised to the power of n */
  44. #define TWO_POW(n) ((double)(1ULL<<(n)))
  45. #include "rtl-sdr.h"
  46. #include "tuner_e4k.h"
  47. #include "tuner_fc0012.h"
  48. #include "tuner_fc0013.h"
  49. #include "tuner_fc2580.h"
  50. #include "tuner_r82xx.h"
  51. typedef struct rtlsdr_tuner_iface {
  52. /* tuner interface */
  53. int (*init)(void *);
  54. int (*exit)(void *);
  55. int (*set_freq)(void *, uint32_t freq /* Hz */);
  56. int (*set_bw)(void *, int bw /* Hz */);
  57. int (*set_gain)(void *, int gain /* tenth dB */);
  58. int (*set_if_gain)(void *, int stage, int gain /* tenth dB */);
  59. int (*set_gain_mode)(void *, int manual);
  60. } rtlsdr_tuner_iface_t;
  61. enum rtlsdr_async_status {
  62. RTLSDR_INACTIVE = 0,
  63. RTLSDR_CANCELING,
  64. RTLSDR_RUNNING
  65. };
  66. #define FIR_LEN 16
  67. /*
  68. * FIR coefficients.
  69. *
  70. * The filter is running at XTal frequency. It is symmetric filter with 32
  71. * coefficients. Only first 16 coefficients are specified, the other 16
  72. * use the same values but in reversed order. The first coefficient in
  73. * the array is the outer one, the last, the last is the inner one.
  74. * First 8 coefficients are 8 bit signed integers, the next 8 coefficients
  75. * are 12 bit signed integers. All coefficients have the same weight.
  76. *
  77. * Default FIR coefficients used for DAB/FM by the Windows driver,
  78. * the DVB driver uses different ones
  79. */
  80. static const int fir_default[FIR_LEN] = {
  81. -54, -36, -41, -40, -32, -14, 14, 53, /* 8 bit signed */
  82. 101, 156, 215, 273, 327, 372, 404, 421 /* 12 bit signed */
  83. };
  84. struct rtlsdr_dev {
  85. libusb_context *ctx;
  86. struct libusb_device_handle *devh;
  87. uint32_t xfer_buf_num;
  88. uint32_t xfer_buf_len;
  89. struct libusb_transfer **xfer;
  90. unsigned char **xfer_buf;
  91. rtlsdr_read_async_cb_t cb;
  92. void *cb_ctx;
  93. enum rtlsdr_async_status async_status;
  94. int async_cancel;
  95. /* rtl demod context */
  96. uint32_t rate; /* Hz */
  97. uint32_t rtl_xtal; /* Hz */
  98. int fir[FIR_LEN];
  99. int direct_sampling;
  100. /* tuner context */
  101. enum rtlsdr_tuner tuner_type;
  102. rtlsdr_tuner_iface_t *tuner;
  103. uint32_t tun_xtal; /* Hz */
  104. uint32_t freq; /* Hz */
  105. uint32_t bw;
  106. uint32_t offs_freq; /* Hz */
  107. int corr; /* ppm */
  108. int gain; /* tenth dB */
  109. struct e4k_state e4k_s;
  110. struct r82xx_config r82xx_c;
  111. struct r82xx_priv r82xx_p;
  112. /* status */
  113. int dev_lost;
  114. int driver_active;
  115. unsigned int xfer_errors;
  116. };
  117. void rtlsdr_set_gpio_bit(rtlsdr_dev_t *dev, uint8_t gpio, int val);
  118. static int rtlsdr_set_if_freq(rtlsdr_dev_t *dev, uint32_t freq);
  119. /* generic tuner interface functions, shall be moved to the tuner implementations */
  120. int e4000_init(void *dev) {
  121. rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
  122. devt->e4k_s.i2c_addr = E4K_I2C_ADDR;
  123. rtlsdr_get_xtal_freq(devt, NULL, &devt->e4k_s.vco.fosc);
  124. devt->e4k_s.rtl_dev = dev;
  125. return e4k_init(&devt->e4k_s);
  126. }
  127. int e4000_exit(void *dev) {
  128. rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
  129. return e4k_standby(&devt->e4k_s, 1);
  130. }
  131. int e4000_set_freq(void *dev, uint32_t freq) {
  132. rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
  133. return e4k_tune_freq(&devt->e4k_s, freq);
  134. }
  135. int e4000_set_bw(void *dev, int bw) {
  136. int r = 0;
  137. rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
  138. r |= e4k_if_filter_bw_set(&devt->e4k_s, E4K_IF_FILTER_MIX, bw);
  139. r |= e4k_if_filter_bw_set(&devt->e4k_s, E4K_IF_FILTER_RC, bw);
  140. r |= e4k_if_filter_bw_set(&devt->e4k_s, E4K_IF_FILTER_CHAN, bw);
  141. return r;
  142. }
  143. int e4000_set_gain(void *dev, int gain) {
  144. rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
  145. int mixgain = (gain > 340) ? 12 : 4;
  146. #if 0
  147. int enhgain = (gain - 420);
  148. #endif
  149. if(e4k_set_lna_gain(&devt->e4k_s, min(300, gain - mixgain * 10)) == -EINVAL)
  150. return -1;
  151. if(e4k_mixer_gain_set(&devt->e4k_s, mixgain) == -EINVAL)
  152. return -1;
  153. #if 0 /* enhanced mixer gain seems to have no effect */
  154. if(enhgain >= 0)
  155. if(e4k_set_enh_gain(&devt->e4k_s, enhgain) == -EINVAL)
  156. return -1;
  157. #endif
  158. return 0;
  159. }
  160. int e4000_set_if_gain(void *dev, int stage, int gain) {
  161. rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
  162. return e4k_if_gain_set(&devt->e4k_s, (uint8_t)stage, (int8_t)(gain / 10));
  163. }
  164. int e4000_set_gain_mode(void *dev, int manual) {
  165. rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
  166. return e4k_enable_manual_gain(&devt->e4k_s, manual);
  167. }
  168. int _fc0012_init(void *dev) { return fc0012_init(dev); }
  169. int fc0012_exit(void *dev) { return 0; }
  170. int fc0012_set_freq(void *dev, uint32_t freq) {
  171. /* select V-band/U-band filter */
  172. rtlsdr_set_gpio_bit(dev, 6, (freq > 300000000) ? 1 : 0);
  173. return fc0012_set_params(dev, freq, 6000000);
  174. }
  175. int fc0012_set_bw(void *dev, int bw) { return 0; }
  176. int _fc0012_set_gain(void *dev, int gain) { return fc0012_set_gain(dev, gain); }
  177. int fc0012_set_gain_mode(void *dev, int manual) { return 0; }
  178. int _fc0013_init(void *dev) { return fc0013_init(dev); }
  179. int fc0013_exit(void *dev) { return 0; }
  180. int fc0013_set_freq(void *dev, uint32_t freq) {
  181. return fc0013_set_params(dev, freq, 6000000);
  182. }
  183. int fc0013_set_bw(void *dev, int bw) { return 0; }
  184. int _fc0013_set_gain(void *dev, int gain) { return fc0013_set_lna_gain(dev, gain); }
  185. int fc2580_init(void *dev) { return fc2580_Initialize(dev); }
  186. int fc2580_exit(void *dev) { return 0; }
  187. int _fc2580_set_freq(void *dev, uint32_t freq) {
  188. return fc2580_SetRfFreqHz(dev, freq);
  189. }
  190. int fc2580_set_bw(void *dev, int bw) { return fc2580_SetBandwidthMode(dev, 1); }
  191. int fc2580_set_gain(void *dev, int gain) { return 0; }
  192. int fc2580_set_gain_mode(void *dev, int manual) { return 0; }
  193. int r820t_init(void *dev) {
  194. rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
  195. devt->r82xx_p.rtl_dev = dev;
  196. if (devt->tuner_type == RTLSDR_TUNER_R828D) {
  197. devt->r82xx_c.i2c_addr = R828D_I2C_ADDR;
  198. devt->r82xx_c.rafael_chip = CHIP_R828D;
  199. } else {
  200. devt->r82xx_c.i2c_addr = R820T_I2C_ADDR;
  201. devt->r82xx_c.rafael_chip = CHIP_R820T;
  202. }
  203. rtlsdr_get_xtal_freq(devt, NULL, &devt->r82xx_c.xtal);
  204. devt->r82xx_c.max_i2c_msg_len = 8;
  205. devt->r82xx_c.use_predetect = 0;
  206. devt->r82xx_p.cfg = &devt->r82xx_c;
  207. return r82xx_init(&devt->r82xx_p);
  208. }
  209. int r820t_exit(void *dev) {
  210. rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
  211. return r82xx_standby(&devt->r82xx_p);
  212. }
  213. int r820t_set_freq(void *dev, uint32_t freq) {
  214. rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
  215. return r82xx_set_freq(&devt->r82xx_p, freq);
  216. }
  217. int r820t_set_bw(void *dev, int bw) {
  218. int r;
  219. rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
  220. r = r82xx_set_bandwidth(&devt->r82xx_p, bw, devt->rate);
  221. if(r < 0)
  222. return r;
  223. r = rtlsdr_set_if_freq(devt, r);
  224. if (r)
  225. return r;
  226. return rtlsdr_set_center_freq(devt, devt->freq);
  227. }
  228. int r820t_set_gain(void *dev, int gain) {
  229. rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
  230. return r82xx_set_gain(&devt->r82xx_p, 1, gain);
  231. }
  232. int r820t_set_gain_mode(void *dev, int manual) {
  233. rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
  234. return r82xx_set_gain(&devt->r82xx_p, manual, 0);
  235. }
  236. /* definition order must match enum rtlsdr_tuner */
  237. static rtlsdr_tuner_iface_t tuners[] = {
  238. {
  239. NULL, NULL, NULL, NULL, NULL, NULL, NULL /* dummy for unknown tuners */
  240. },
  241. {
  242. e4000_init, e4000_exit,
  243. e4000_set_freq, e4000_set_bw, e4000_set_gain, e4000_set_if_gain,
  244. e4000_set_gain_mode
  245. },
  246. {
  247. _fc0012_init, fc0012_exit,
  248. fc0012_set_freq, fc0012_set_bw, _fc0012_set_gain, NULL,
  249. fc0012_set_gain_mode
  250. },
  251. {
  252. _fc0013_init, fc0013_exit,
  253. fc0013_set_freq, fc0013_set_bw, _fc0013_set_gain, NULL,
  254. fc0013_set_gain_mode
  255. },
  256. {
  257. fc2580_init, fc2580_exit,
  258. _fc2580_set_freq, fc2580_set_bw, fc2580_set_gain, NULL,
  259. fc2580_set_gain_mode
  260. },
  261. {
  262. r820t_init, r820t_exit,
  263. r820t_set_freq, r820t_set_bw, r820t_set_gain, NULL,
  264. r820t_set_gain_mode
  265. },
  266. {
  267. r820t_init, r820t_exit,
  268. r820t_set_freq, r820t_set_bw, r820t_set_gain, NULL,
  269. r820t_set_gain_mode
  270. },
  271. };
  272. typedef struct rtlsdr_dongle {
  273. uint16_t vid;
  274. uint16_t pid;
  275. const char *name;
  276. } rtlsdr_dongle_t;
  277. /*
  278. * Please add your device here and send a patch to osmocom-sdr@lists.osmocom.org
  279. */
  280. static rtlsdr_dongle_t known_devices[] = {
  281. { 0x0bda, 0x2832, "Generic RTL2832U" },
  282. { 0x0bda, 0x2838, "Generic RTL2832U OEM" },
  283. { 0x0413, 0x6680, "DigitalNow Quad DVB-T PCI-E card" },
  284. { 0x0413, 0x6f0f, "Leadtek WinFast DTV Dongle mini D" },
  285. { 0x0458, 0x707f, "Genius TVGo DVB-T03 USB dongle (Ver. B)" },
  286. { 0x0ccd, 0x00a9, "Terratec Cinergy T Stick Black (rev 1)" },
  287. { 0x0ccd, 0x00b3, "Terratec NOXON DAB/DAB+ USB dongle (rev 1)" },
  288. { 0x0ccd, 0x00b4, "Terratec Deutschlandradio DAB Stick" },
  289. { 0x0ccd, 0x00b5, "Terratec NOXON DAB Stick - Radio Energy" },
  290. { 0x0ccd, 0x00b7, "Terratec Media Broadcast DAB Stick" },
  291. { 0x0ccd, 0x00b8, "Terratec BR DAB Stick" },
  292. { 0x0ccd, 0x00b9, "Terratec WDR DAB Stick" },
  293. { 0x0ccd, 0x00c0, "Terratec MuellerVerlag DAB Stick" },
  294. { 0x0ccd, 0x00c6, "Terratec Fraunhofer DAB Stick" },
  295. { 0x0ccd, 0x00d3, "Terratec Cinergy T Stick RC (Rev.3)" },
  296. { 0x0ccd, 0x00d7, "Terratec T Stick PLUS" },
  297. { 0x0ccd, 0x00e0, "Terratec NOXON DAB/DAB+ USB dongle (rev 2)" },
  298. { 0x1554, 0x5020, "PixelView PV-DT235U(RN)" },
  299. { 0x15f4, 0x0131, "Astrometa DVB-T/DVB-T2" },
  300. { 0x185b, 0x0620, "Compro Videomate U620F"},
  301. { 0x185b, 0x0650, "Compro Videomate U650F"},
  302. { 0x185b, 0x0680, "Compro Videomate U680F"},
  303. { 0x1b80, 0xd393, "GIGABYTE GT-U7300" },
  304. { 0x1b80, 0xd394, "DIKOM USB-DVBT HD" },
  305. { 0x1b80, 0xd395, "Peak 102569AGPK" },
  306. { 0x1b80, 0xd397, "KWorld KW-UB450-T USB DVB-T Pico TV" },
  307. { 0x1b80, 0xd398, "Zaapa ZT-MINDVBZP" },
  308. { 0x1b80, 0xd39d, "SVEON STV20 DVB-T USB & FM" },
  309. { 0x1b80, 0xd3a4, "Twintech UT-40" },
  310. { 0x1b80, 0xd3a8, "ASUS U3100MINI_PLUS_V2" },
  311. { 0x1b80, 0xd3af, "SVEON STV27 DVB-T USB & FM" },
  312. { 0x1b80, 0xd3b0, "SVEON STV21 DVB-T USB & FM" },
  313. { 0x1d19, 0x1101, "Dexatek DK DVB-T Dongle (Logilink VG0002A)" },
  314. { 0x1d19, 0x1102, "Dexatek DK DVB-T Dongle (MSI DigiVox mini II V3.0)" },
  315. { 0x1d19, 0x1103, "Dexatek Technology Ltd. DK 5217 DVB-T Dongle" },
  316. { 0x1d19, 0x1104, "MSI DigiVox Micro HD" },
  317. { 0x1f4d, 0xa803, "Sweex DVB-T USB" },
  318. { 0x1f4d, 0xb803, "GTek T803" },
  319. { 0x1f4d, 0xc803, "Lifeview LV5TDeluxe" },
  320. { 0x1f4d, 0xd286, "MyGica TD312" },
  321. { 0x1f4d, 0xd803, "PROlectrix DV107669" },
  322. };
  323. #define DEFAULT_BUF_NUMBER 15
  324. #define DEFAULT_BUF_LENGTH (16 * 32 * 512)
  325. #define DEF_RTL_XTAL_FREQ 28800000
  326. #define MIN_RTL_XTAL_FREQ (DEF_RTL_XTAL_FREQ - 1000)
  327. #define MAX_RTL_XTAL_FREQ (DEF_RTL_XTAL_FREQ + 1000)
  328. #define CTRL_IN (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_IN)
  329. #define CTRL_OUT (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_OUT)
  330. #define CTRL_TIMEOUT 300
  331. #define BULK_TIMEOUT 0
  332. #define EEPROM_ADDR 0xa0
  333. enum usb_reg {
  334. USB_SYSCTL = 0x2000,
  335. USB_CTRL = 0x2010,
  336. USB_STAT = 0x2014,
  337. USB_EPA_CFG = 0x2144,
  338. USB_EPA_CTL = 0x2148,
  339. USB_EPA_MAXPKT = 0x2158,
  340. USB_EPA_MAXPKT_2 = 0x215a,
  341. USB_EPA_FIFO_CFG = 0x2160,
  342. };
  343. enum sys_reg {
  344. DEMOD_CTL = 0x3000,
  345. GPO = 0x3001,
  346. GPI = 0x3002,
  347. GPOE = 0x3003,
  348. GPD = 0x3004,
  349. SYSINTE = 0x3005,
  350. SYSINTS = 0x3006,
  351. GP_CFG0 = 0x3007,
  352. GP_CFG1 = 0x3008,
  353. SYSINTE_1 = 0x3009,
  354. SYSINTS_1 = 0x300a,
  355. DEMOD_CTL_1 = 0x300b,
  356. IR_SUSPEND = 0x300c,
  357. };
  358. enum blocks {
  359. DEMODB = 0,
  360. USBB = 1,
  361. SYSB = 2,
  362. TUNB = 3,
  363. ROMB = 4,
  364. IRB = 5,
  365. IICB = 6,
  366. };
  367. int rtlsdr_read_array(rtlsdr_dev_t *dev, uint8_t block, uint16_t addr, uint8_t *array, uint8_t len)
  368. {
  369. int r;
  370. uint16_t index = (block << 8);
  371. r = libusb_control_transfer(dev->devh, CTRL_IN, 0, addr, index, array, len, CTRL_TIMEOUT);
  372. #if 0
  373. if (r < 0)
  374. fprintf(stderr, "%s failed with %d\n", __FUNCTION__, r);
  375. #endif
  376. return r;
  377. }
  378. int rtlsdr_write_array(rtlsdr_dev_t *dev, uint8_t block, uint16_t addr, uint8_t *array, uint8_t len)
  379. {
  380. int r;
  381. uint16_t index = (block << 8) | 0x10;
  382. r = libusb_control_transfer(dev->devh, CTRL_OUT, 0, addr, index, array, len, CTRL_TIMEOUT);
  383. #if 0
  384. if (r < 0)
  385. fprintf(stderr, "%s failed with %d\n", __FUNCTION__, r);
  386. #endif
  387. return r;
  388. }
  389. int rtlsdr_i2c_write_reg(rtlsdr_dev_t *dev, uint8_t i2c_addr, uint8_t reg, uint8_t val)
  390. {
  391. uint16_t addr = i2c_addr;
  392. uint8_t data[2];
  393. data[0] = reg;
  394. data[1] = val;
  395. return rtlsdr_write_array(dev, IICB, addr, (uint8_t *)&data, 2);
  396. }
  397. uint8_t rtlsdr_i2c_read_reg(rtlsdr_dev_t *dev, uint8_t i2c_addr, uint8_t reg)
  398. {
  399. uint16_t addr = i2c_addr;
  400. uint8_t data = 0;
  401. rtlsdr_write_array(dev, IICB, addr, &reg, 1);
  402. rtlsdr_read_array(dev, IICB, addr, &data, 1);
  403. return data;
  404. }
  405. int rtlsdr_i2c_write(rtlsdr_dev_t *dev, uint8_t i2c_addr, uint8_t *buffer, int len)
  406. {
  407. uint16_t addr = i2c_addr;
  408. if (!dev)
  409. return -1;
  410. return rtlsdr_write_array(dev, IICB, addr, buffer, len);
  411. }
  412. int rtlsdr_i2c_read(rtlsdr_dev_t *dev, uint8_t i2c_addr, uint8_t *buffer, int len)
  413. {
  414. uint16_t addr = i2c_addr;
  415. if (!dev)
  416. return -1;
  417. return rtlsdr_read_array(dev, IICB, addr, buffer, len);
  418. }
  419. uint16_t rtlsdr_read_reg(rtlsdr_dev_t *dev, uint8_t block, uint16_t addr, uint8_t len)
  420. {
  421. int r;
  422. unsigned char data[2];
  423. uint16_t index = (block << 8);
  424. uint16_t reg;
  425. r = libusb_control_transfer(dev->devh, CTRL_IN, 0, addr, index, data, len, CTRL_TIMEOUT);
  426. if (r < 0)
  427. fprintf(stderr, "%s failed with %d\n", __FUNCTION__, r);
  428. reg = (data[1] << 8) | data[0];
  429. return reg;
  430. }
  431. int rtlsdr_write_reg(rtlsdr_dev_t *dev, uint8_t block, uint16_t addr, uint16_t val, uint8_t len)
  432. {
  433. int r;
  434. unsigned char data[2];
  435. uint16_t index = (block << 8) | 0x10;
  436. if (len == 1)
  437. data[0] = val & 0xff;
  438. else
  439. data[0] = val >> 8;
  440. data[1] = val & 0xff;
  441. r = libusb_control_transfer(dev->devh, CTRL_OUT, 0, addr, index, data, len, CTRL_TIMEOUT);
  442. if (r < 0)
  443. fprintf(stderr, "%s failed with %d\n", __FUNCTION__, r);
  444. return r;
  445. }
  446. uint16_t rtlsdr_demod_read_reg(rtlsdr_dev_t *dev, uint8_t page, uint16_t addr, uint8_t len)
  447. {
  448. int r;
  449. unsigned char data[2];
  450. uint16_t index = page;
  451. uint16_t reg;
  452. addr = (addr << 8) | 0x20;
  453. r = libusb_control_transfer(dev->devh, CTRL_IN, 0, addr, index, data, len, CTRL_TIMEOUT);
  454. if (r < 0)
  455. fprintf(stderr, "%s failed with %d\n", __FUNCTION__, r);
  456. reg = (data[1] << 8) | data[0];
  457. return reg;
  458. }
  459. int rtlsdr_demod_write_reg(rtlsdr_dev_t *dev, uint8_t page, uint16_t addr, uint16_t val, uint8_t len)
  460. {
  461. int r;
  462. unsigned char data[2];
  463. uint16_t index = 0x10 | page;
  464. addr = (addr << 8) | 0x20;
  465. if (len == 1)
  466. data[0] = val & 0xff;
  467. else
  468. data[0] = val >> 8;
  469. data[1] = val & 0xff;
  470. r = libusb_control_transfer(dev->devh, CTRL_OUT, 0, addr, index, data, len, CTRL_TIMEOUT);
  471. if (r < 0)
  472. fprintf(stderr, "%s failed with %d\n", __FUNCTION__, r);
  473. rtlsdr_demod_read_reg(dev, 0x0a, 0x01, 1);
  474. return (r == len) ? 0 : -1;
  475. }
  476. void rtlsdr_set_gpio_bit(rtlsdr_dev_t *dev, uint8_t gpio, int val)
  477. {
  478. uint16_t r;
  479. gpio = 1 << gpio;
  480. r = rtlsdr_read_reg(dev, SYSB, GPO, 1);
  481. r = val ? (r | gpio) : (r & ~gpio);
  482. rtlsdr_write_reg(dev, SYSB, GPO, r, 1);
  483. }
  484. void rtlsdr_set_gpio_output(rtlsdr_dev_t *dev, uint8_t gpio)
  485. {
  486. int r;
  487. gpio = 1 << gpio;
  488. r = rtlsdr_read_reg(dev, SYSB, GPD, 1);
  489. rtlsdr_write_reg(dev, SYSB, GPO, r & ~gpio, 1);
  490. r = rtlsdr_read_reg(dev, SYSB, GPOE, 1);
  491. rtlsdr_write_reg(dev, SYSB, GPOE, r | gpio, 1);
  492. }
  493. void rtlsdr_set_i2c_repeater(rtlsdr_dev_t *dev, int on)
  494. {
  495. rtlsdr_demod_write_reg(dev, 1, 0x01, on ? 0x18 : 0x10, 1);
  496. }
  497. int rtlsdr_set_fir(rtlsdr_dev_t *dev)
  498. {
  499. uint8_t fir[20];
  500. int i;
  501. /* format: int8_t[8] */
  502. for (i = 0; i < 8; ++i) {
  503. const int val = dev->fir[i];
  504. if (val < -128 || val > 127) {
  505. return -1;
  506. }
  507. fir[i] = val;
  508. }
  509. /* format: int12_t[8] */
  510. for (i = 0; i < 8; i += 2) {
  511. const int val0 = dev->fir[8+i];
  512. const int val1 = dev->fir[8+i+1];
  513. if (val0 < -2048 || val0 > 2047 || val1 < -2048 || val1 > 2047) {
  514. return -1;
  515. }
  516. fir[8+i*3/2] = val0 >> 4;
  517. fir[8+i*3/2+1] = (val0 << 4) | ((val1 >> 8) & 0x0f);
  518. fir[8+i*3/2+2] = val1;
  519. }
  520. for (i = 0; i < (int)sizeof(fir); i++) {
  521. if (rtlsdr_demod_write_reg(dev, 1, 0x1c + i, fir[i], 1))
  522. return -1;
  523. }
  524. return 0;
  525. }
  526. void rtlsdr_init_baseband(rtlsdr_dev_t *dev)
  527. {
  528. unsigned int i;
  529. /* initialize USB */
  530. rtlsdr_write_reg(dev, USBB, USB_SYSCTL, 0x09, 1);
  531. rtlsdr_write_reg(dev, USBB, USB_EPA_MAXPKT, 0x0002, 2);
  532. rtlsdr_write_reg(dev, USBB, USB_EPA_CTL, 0x1002, 2);
  533. /* poweron demod */
  534. rtlsdr_write_reg(dev, SYSB, DEMOD_CTL_1, 0x22, 1);
  535. rtlsdr_write_reg(dev, SYSB, DEMOD_CTL, 0xe8, 1);
  536. /* reset demod (bit 3, soft_rst) */
  537. rtlsdr_demod_write_reg(dev, 1, 0x01, 0x14, 1);
  538. rtlsdr_demod_write_reg(dev, 1, 0x01, 0x10, 1);
  539. /* disable spectrum inversion and adjacent channel rejection */
  540. rtlsdr_demod_write_reg(dev, 1, 0x15, 0x00, 1);
  541. rtlsdr_demod_write_reg(dev, 1, 0x16, 0x0000, 2);
  542. /* clear both DDC shift and IF frequency registers */
  543. for (i = 0; i < 6; i++)
  544. rtlsdr_demod_write_reg(dev, 1, 0x16 + i, 0x00, 1);
  545. rtlsdr_set_fir(dev);
  546. /* enable SDR mode, disable DAGC (bit 5) */
  547. rtlsdr_demod_write_reg(dev, 0, 0x19, 0x05, 1);
  548. /* init FSM state-holding register */
  549. rtlsdr_demod_write_reg(dev, 1, 0x93, 0xf0, 1);
  550. rtlsdr_demod_write_reg(dev, 1, 0x94, 0x0f, 1);
  551. /* disable AGC (en_dagc, bit 0) (this seems to have no effect) */
  552. rtlsdr_demod_write_reg(dev, 1, 0x11, 0x00, 1);
  553. /* disable RF and IF AGC loop */
  554. rtlsdr_demod_write_reg(dev, 1, 0x04, 0x00, 1);
  555. /* disable PID filter (enable_PID = 0) */
  556. rtlsdr_demod_write_reg(dev, 0, 0x61, 0x60, 1);
  557. /* opt_adc_iq = 0, default ADC_I/ADC_Q datapath */
  558. rtlsdr_demod_write_reg(dev, 0, 0x06, 0x80, 1);
  559. /* Enable Zero-IF mode (en_bbin bit), DC cancellation (en_dc_est),
  560. * IQ estimation/compensation (en_iq_comp, en_iq_est) */
  561. rtlsdr_demod_write_reg(dev, 1, 0xb1, 0x1b, 1);
  562. /* disable 4.096 MHz clock output on pin TP_CK0 */
  563. rtlsdr_demod_write_reg(dev, 0, 0x0d, 0x83, 1);
  564. }
  565. int rtlsdr_deinit_baseband(rtlsdr_dev_t *dev)
  566. {
  567. int r = 0;
  568. if (!dev)
  569. return -1;
  570. if (dev->tuner && dev->tuner->exit) {
  571. rtlsdr_set_i2c_repeater(dev, 1);
  572. r = dev->tuner->exit(dev); /* deinitialize tuner */
  573. rtlsdr_set_i2c_repeater(dev, 0);
  574. }
  575. /* poweroff demodulator and ADCs */
  576. rtlsdr_write_reg(dev, SYSB, DEMOD_CTL, 0x20, 1);
  577. return r;
  578. }
  579. static int rtlsdr_set_if_freq(rtlsdr_dev_t *dev, uint32_t freq)
  580. {
  581. uint32_t rtl_xtal;
  582. int32_t if_freq;
  583. uint8_t tmp;
  584. int r;
  585. if (!dev)
  586. return -1;
  587. /* read corrected clock value */
  588. if (rtlsdr_get_xtal_freq(dev, &rtl_xtal, NULL))
  589. return -2;
  590. if_freq = ((freq * TWO_POW(22)) / rtl_xtal) * (-1);
  591. tmp = (if_freq >> 16) & 0x3f;
  592. r = rtlsdr_demod_write_reg(dev, 1, 0x19, tmp, 1);
  593. tmp = (if_freq >> 8) & 0xff;
  594. r |= rtlsdr_demod_write_reg(dev, 1, 0x1a, tmp, 1);
  595. tmp = if_freq & 0xff;
  596. r |= rtlsdr_demod_write_reg(dev, 1, 0x1b, tmp, 1);
  597. return r;
  598. }
  599. int rtlsdr_set_sample_freq_correction(rtlsdr_dev_t *dev, int ppm)
  600. {
  601. int r = 0;
  602. uint8_t tmp;
  603. int16_t offs = ppm * (-1) * TWO_POW(24) / 1000000;
  604. tmp = offs & 0xff;
  605. r |= rtlsdr_demod_write_reg(dev, 1, 0x3f, tmp, 1);
  606. tmp = (offs >> 8) & 0x3f;
  607. r |= rtlsdr_demod_write_reg(dev, 1, 0x3e, tmp, 1);
  608. return r;
  609. }
  610. int rtlsdr_set_xtal_freq(rtlsdr_dev_t *dev, uint32_t rtl_freq, uint32_t tuner_freq)
  611. {
  612. int r = 0;
  613. if (!dev)
  614. return -1;
  615. if (rtl_freq > 0 &&
  616. (rtl_freq < MIN_RTL_XTAL_FREQ || rtl_freq > MAX_RTL_XTAL_FREQ))
  617. return -2;
  618. if (rtl_freq > 0 && dev->rtl_xtal != rtl_freq) {
  619. dev->rtl_xtal = rtl_freq;
  620. /* update xtal-dependent settings */
  621. if (dev->rate)
  622. r = rtlsdr_set_sample_rate(dev, dev->rate);
  623. }
  624. if (dev->tun_xtal != tuner_freq) {
  625. if (0 == tuner_freq)
  626. dev->tun_xtal = dev->rtl_xtal;
  627. else
  628. dev->tun_xtal = tuner_freq;
  629. /* read corrected clock value into e4k and r82xx structure */
  630. if (rtlsdr_get_xtal_freq(dev, NULL, &dev->e4k_s.vco.fosc) ||
  631. rtlsdr_get_xtal_freq(dev, NULL, &dev->r82xx_c.xtal))
  632. return -3;
  633. /* update xtal-dependent settings */
  634. if (dev->freq)
  635. r = rtlsdr_set_center_freq(dev, dev->freq);
  636. }
  637. return r;
  638. }
  639. int rtlsdr_get_xtal_freq(rtlsdr_dev_t *dev, uint32_t *rtl_freq, uint32_t *tuner_freq)
  640. {
  641. if (!dev)
  642. return -1;
  643. #define APPLY_PPM_CORR(val,ppm) (((val) * (1.0 + (ppm) / 1e6)))
  644. if (rtl_freq)
  645. *rtl_freq = (uint32_t) APPLY_PPM_CORR(dev->rtl_xtal, dev->corr);
  646. if (tuner_freq)
  647. *tuner_freq = (uint32_t) APPLY_PPM_CORR(dev->tun_xtal, dev->corr);
  648. return 0;
  649. }
  650. int rtlsdr_get_usb_strings(rtlsdr_dev_t *dev, char *manufact, char *product,
  651. char *serial)
  652. {
  653. struct libusb_device_descriptor dd;
  654. libusb_device *device = NULL;
  655. const int buf_max = 256;
  656. int r = 0;
  657. if (!dev || !dev->devh)
  658. return -1;
  659. device = libusb_get_device(dev->devh);
  660. r = libusb_get_device_descriptor(device, &dd);
  661. if (r < 0)
  662. return -1;
  663. if (manufact) {
  664. memset(manufact, 0, buf_max);
  665. libusb_get_string_descriptor_ascii(dev->devh, dd.iManufacturer,
  666. (unsigned char *)manufact,
  667. buf_max);
  668. }
  669. if (product) {
  670. memset(product, 0, buf_max);
  671. libusb_get_string_descriptor_ascii(dev->devh, dd.iProduct,
  672. (unsigned char *)product,
  673. buf_max);
  674. }
  675. if (serial) {
  676. memset(serial, 0, buf_max);
  677. libusb_get_string_descriptor_ascii(dev->devh, dd.iSerialNumber,
  678. (unsigned char *)serial,
  679. buf_max);
  680. }
  681. return 0;
  682. }
  683. int rtlsdr_write_eeprom(rtlsdr_dev_t *dev, uint8_t *data, uint8_t offset, uint16_t len)
  684. {
  685. int r = 0;
  686. int i;
  687. uint8_t cmd[2];
  688. if (!dev)
  689. return -1;
  690. if ((len + offset) > 256)
  691. return -2;
  692. for (i = 0; i < len; i++) {
  693. cmd[0] = i + offset;
  694. r = rtlsdr_write_array(dev, IICB, EEPROM_ADDR, cmd, 1);
  695. r = rtlsdr_read_array(dev, IICB, EEPROM_ADDR, &cmd[1], 1);
  696. /* only write the byte if it differs */
  697. if (cmd[1] == data[i])
  698. continue;
  699. cmd[1] = data[i];
  700. r = rtlsdr_write_array(dev, IICB, EEPROM_ADDR, cmd, 2);
  701. if (r != sizeof(cmd))
  702. return -3;
  703. /* for some EEPROMs (e.g. ATC 240LC02) we need a delay
  704. * between write operations, otherwise they will fail */
  705. #ifdef _WIN32
  706. Sleep(5);
  707. #else
  708. usleep(5000);
  709. #endif
  710. }
  711. return 0;
  712. }
  713. int rtlsdr_read_eeprom(rtlsdr_dev_t *dev, uint8_t *data, uint8_t offset, uint16_t len)
  714. {
  715. int r = 0;
  716. int i;
  717. if (!dev)
  718. return -1;
  719. if ((len + offset) > 256)
  720. return -2;
  721. r = rtlsdr_write_array(dev, IICB, EEPROM_ADDR, &offset, 1);
  722. if (r < 0)
  723. return -3;
  724. for (i = 0; i < len; i++) {
  725. r = rtlsdr_read_array(dev, IICB, EEPROM_ADDR, data + i, 1);
  726. if (r < 0)
  727. return -3;
  728. }
  729. return r;
  730. }
  731. int rtlsdr_set_center_freq(rtlsdr_dev_t *dev, uint32_t freq)
  732. {
  733. int r = -1;
  734. if (!dev || !dev->tuner)
  735. return -1;
  736. if (dev->direct_sampling) {
  737. r = rtlsdr_set_if_freq(dev, freq);
  738. } else if (dev->tuner && dev->tuner->set_freq) {
  739. rtlsdr_set_i2c_repeater(dev, 1);
  740. r = dev->tuner->set_freq(dev, freq - dev->offs_freq);
  741. rtlsdr_set_i2c_repeater(dev, 0);
  742. }
  743. if (!r)
  744. dev->freq = freq;
  745. else
  746. dev->freq = 0;
  747. return r;
  748. }
  749. uint32_t rtlsdr_get_center_freq(rtlsdr_dev_t *dev)
  750. {
  751. if (!dev)
  752. return 0;
  753. return dev->freq;
  754. }
  755. int rtlsdr_set_freq_correction(rtlsdr_dev_t *dev, int ppm)
  756. {
  757. int r = 0;
  758. if (!dev)
  759. return -1;
  760. if (dev->corr == ppm)
  761. return -2;
  762. dev->corr = ppm;
  763. r |= rtlsdr_set_sample_freq_correction(dev, ppm);
  764. /* read corrected clock value into e4k and r82xx structure */
  765. if (rtlsdr_get_xtal_freq(dev, NULL, &dev->e4k_s.vco.fosc) ||
  766. rtlsdr_get_xtal_freq(dev, NULL, &dev->r82xx_c.xtal))
  767. return -3;
  768. if (dev->freq) /* retune to apply new correction value */
  769. r |= rtlsdr_set_center_freq(dev, dev->freq);
  770. return r;
  771. }
  772. int rtlsdr_get_freq_correction(rtlsdr_dev_t *dev)
  773. {
  774. if (!dev)
  775. return 0;
  776. return dev->corr;
  777. }
  778. enum rtlsdr_tuner rtlsdr_get_tuner_type(rtlsdr_dev_t *dev)
  779. {
  780. if (!dev)
  781. return RTLSDR_TUNER_UNKNOWN;
  782. return dev->tuner_type;
  783. }
  784. int rtlsdr_get_tuner_gains(rtlsdr_dev_t *dev, int *gains)
  785. {
  786. /* all gain values are expressed in tenths of a dB */
  787. const int e4k_gains[] = { -10, 15, 40, 65, 90, 115, 140, 165, 190, 215,
  788. 240, 290, 340, 420 };
  789. const int fc0012_gains[] = { -99, -40, 71, 179, 192 };
  790. const int fc0013_gains[] = { -99, -73, -65, -63, -60, -58, -54, 58, 61,
  791. 63, 65, 67, 68, 70, 71, 179, 181, 182,
  792. 184, 186, 188, 191, 197 };
  793. const int fc2580_gains[] = { 0 /* no gain values */ };
  794. const int r82xx_gains[] = { 0, 9, 14, 27, 37, 77, 87, 125, 144, 157,
  795. 166, 197, 207, 229, 254, 280, 297, 328,
  796. 338, 364, 372, 386, 402, 421, 434, 439,
  797. 445, 480, 496 };
  798. const int unknown_gains[] = { 0 /* no gain values */ };
  799. const int *ptr = NULL;
  800. int len = 0;
  801. if (!dev)
  802. return -1;
  803. switch (dev->tuner_type) {
  804. case RTLSDR_TUNER_E4000:
  805. ptr = e4k_gains; len = sizeof(e4k_gains);
  806. break;
  807. case RTLSDR_TUNER_FC0012:
  808. ptr = fc0012_gains; len = sizeof(fc0012_gains);
  809. break;
  810. case RTLSDR_TUNER_FC0013:
  811. ptr = fc0013_gains; len = sizeof(fc0013_gains);
  812. break;
  813. case RTLSDR_TUNER_FC2580:
  814. ptr = fc2580_gains; len = sizeof(fc2580_gains);
  815. break;
  816. case RTLSDR_TUNER_R820T:
  817. case RTLSDR_TUNER_R828D:
  818. ptr = r82xx_gains; len = sizeof(r82xx_gains);
  819. break;
  820. default:
  821. ptr = unknown_gains; len = sizeof(unknown_gains);
  822. break;
  823. }
  824. if (!gains) { /* no buffer provided, just return the count */
  825. return len / sizeof(int);
  826. } else {
  827. if (len)
  828. memcpy(gains, ptr, len);
  829. return len / sizeof(int);
  830. }
  831. }
  832. int rtlsdr_set_tuner_bandwidth(rtlsdr_dev_t *dev, uint32_t bw)
  833. {
  834. int r = 0;
  835. if (!dev || !dev->tuner)
  836. return -1;
  837. if (dev->tuner->set_bw) {
  838. rtlsdr_set_i2c_repeater(dev, 1);
  839. r = dev->tuner->set_bw(dev, bw > 0 ? bw : dev->rate);
  840. rtlsdr_set_i2c_repeater(dev, 0);
  841. if (r)
  842. return r;
  843. dev->bw = bw;
  844. }
  845. return r;
  846. }
  847. int rtlsdr_set_tuner_gain(rtlsdr_dev_t *dev, int gain)
  848. {
  849. int r = 0;
  850. if (!dev || !dev->tuner)
  851. return -1;
  852. if (dev->tuner->set_gain) {
  853. rtlsdr_set_i2c_repeater(dev, 1);
  854. r = dev->tuner->set_gain((void *)dev, gain);
  855. rtlsdr_set_i2c_repeater(dev, 0);
  856. }
  857. if (!r)
  858. dev->gain = gain;
  859. else
  860. dev->gain = 0;
  861. return r;
  862. }
  863. int rtlsdr_get_tuner_gain(rtlsdr_dev_t *dev)
  864. {
  865. if (!dev)
  866. return 0;
  867. return dev->gain;
  868. }
  869. int rtlsdr_set_tuner_if_gain(rtlsdr_dev_t *dev, int stage, int gain)
  870. {
  871. int r = 0;
  872. if (!dev || !dev->tuner)
  873. return -1;
  874. if (dev->tuner->set_if_gain) {
  875. rtlsdr_set_i2c_repeater(dev, 1);
  876. r = dev->tuner->set_if_gain(dev, stage, gain);
  877. rtlsdr_set_i2c_repeater(dev, 0);
  878. }
  879. return r;
  880. }
  881. int rtlsdr_set_tuner_gain_mode(rtlsdr_dev_t *dev, int mode)
  882. {
  883. int r = 0;
  884. if (!dev || !dev->tuner)
  885. return -1;
  886. if (dev->tuner->set_gain_mode) {
  887. rtlsdr_set_i2c_repeater(dev, 1);
  888. r = dev->tuner->set_gain_mode((void *)dev, mode);
  889. rtlsdr_set_i2c_repeater(dev, 0);
  890. }
  891. return r;
  892. }
  893. int rtlsdr_set_sample_rate(rtlsdr_dev_t *dev, uint32_t samp_rate)
  894. {
  895. int r = 0;
  896. uint16_t tmp;
  897. uint32_t rsamp_ratio, real_rsamp_ratio;
  898. double real_rate;
  899. if (!dev)
  900. return -1;
  901. /* check if the rate is supported by the resampler */
  902. if ((samp_rate <= 225000) || (samp_rate > 3200000) ||
  903. ((samp_rate > 300000) && (samp_rate <= 900000))) {
  904. fprintf(stderr, "Invalid sample rate: %u Hz\n", samp_rate);
  905. return -EINVAL;
  906. }
  907. rsamp_ratio = (dev->rtl_xtal * TWO_POW(22)) / samp_rate;
  908. rsamp_ratio &= 0x0ffffffc;
  909. real_rsamp_ratio = rsamp_ratio | ((rsamp_ratio & 0x08000000) << 1);
  910. real_rate = (dev->rtl_xtal * TWO_POW(22)) / real_rsamp_ratio;
  911. if ( ((double)samp_rate) != real_rate )
  912. fprintf(stderr, "Exact sample rate is: %f Hz\n", real_rate);
  913. dev->rate = (uint32_t)real_rate;
  914. if (dev->tuner && dev->tuner->set_bw) {
  915. rtlsdr_set_i2c_repeater(dev, 1);
  916. dev->tuner->set_bw(dev, dev->bw > 0 ? dev->bw : dev->rate);
  917. rtlsdr_set_i2c_repeater(dev, 0);
  918. }
  919. tmp = (rsamp_ratio >> 16);
  920. r |= rtlsdr_demod_write_reg(dev, 1, 0x9f, tmp, 2);
  921. tmp = rsamp_ratio & 0xffff;
  922. r |= rtlsdr_demod_write_reg(dev, 1, 0xa1, tmp, 2);
  923. r |= rtlsdr_set_sample_freq_correction(dev, dev->corr);
  924. /* reset demod (bit 3, soft_rst) */
  925. r |= rtlsdr_demod_write_reg(dev, 1, 0x01, 0x14, 1);
  926. r |= rtlsdr_demod_write_reg(dev, 1, 0x01, 0x10, 1);
  927. /* recalculate offset frequency if offset tuning is enabled */
  928. if (dev->offs_freq)
  929. rtlsdr_set_offset_tuning(dev, 1);
  930. return r;
  931. }
  932. uint32_t rtlsdr_get_sample_rate(rtlsdr_dev_t *dev)
  933. {
  934. if (!dev)
  935. return 0;
  936. return dev->rate;
  937. }
  938. int rtlsdr_set_testmode(rtlsdr_dev_t *dev, int on)
  939. {
  940. if (!dev)
  941. return -1;
  942. return rtlsdr_demod_write_reg(dev, 0, 0x19, on ? 0x03 : 0x05, 1);
  943. }
  944. int rtlsdr_set_agc_mode(rtlsdr_dev_t *dev, int on)
  945. {
  946. if (!dev)
  947. return -1;
  948. return rtlsdr_demod_write_reg(dev, 0, 0x19, on ? 0x25 : 0x05, 1);
  949. }
  950. int rtlsdr_set_direct_sampling(rtlsdr_dev_t *dev, int on)
  951. {
  952. int r = 0;
  953. if (!dev)
  954. return -1;
  955. if (on) {
  956. if (dev->tuner && dev->tuner->exit) {
  957. rtlsdr_set_i2c_repeater(dev, 1);
  958. r = dev->tuner->exit(dev);
  959. rtlsdr_set_i2c_repeater(dev, 0);
  960. }
  961. /* disable Zero-IF mode */
  962. r |= rtlsdr_demod_write_reg(dev, 1, 0xb1, 0x1a, 1);
  963. /* disable spectrum inversion */
  964. r |= rtlsdr_demod_write_reg(dev, 1, 0x15, 0x00, 1);
  965. /* only enable In-phase ADC input */
  966. r |= rtlsdr_demod_write_reg(dev, 0, 0x08, 0x4d, 1);
  967. /* swap I and Q ADC, this allows to select between two inputs */
  968. r |= rtlsdr_demod_write_reg(dev, 0, 0x06, (on > 1) ? 0x90 : 0x80, 1);
  969. fprintf(stderr, "Enabled direct sampling mode, input %i\n", on);
  970. dev->direct_sampling = on;
  971. } else {
  972. if (dev->tuner && dev->tuner->init) {
  973. rtlsdr_set_i2c_repeater(dev, 1);
  974. r |= dev->tuner->init(dev);
  975. rtlsdr_set_i2c_repeater(dev, 0);
  976. }
  977. if ((dev->tuner_type == RTLSDR_TUNER_R820T) ||
  978. (dev->tuner_type == RTLSDR_TUNER_R828D)) {
  979. r |= rtlsdr_set_if_freq(dev, R82XX_IF_FREQ);
  980. /* enable spectrum inversion */
  981. r |= rtlsdr_demod_write_reg(dev, 1, 0x15, 0x01, 1);
  982. } else {
  983. r |= rtlsdr_set_if_freq(dev, 0);
  984. /* enable In-phase + Quadrature ADC input */
  985. r |= rtlsdr_demod_write_reg(dev, 0, 0x08, 0xcd, 1);
  986. /* Enable Zero-IF mode */
  987. r |= rtlsdr_demod_write_reg(dev, 1, 0xb1, 0x1b, 1);
  988. }
  989. /* opt_adc_iq = 0, default ADC_I/ADC_Q datapath */
  990. r |= rtlsdr_demod_write_reg(dev, 0, 0x06, 0x80, 1);
  991. fprintf(stderr, "Disabled direct sampling mode\n");
  992. dev->direct_sampling = 0;
  993. }
  994. r |= rtlsdr_set_center_freq(dev, dev->freq);
  995. return r;
  996. }
  997. int rtlsdr_get_direct_sampling(rtlsdr_dev_t *dev)
  998. {
  999. if (!dev)
  1000. return -1;
  1001. return dev->direct_sampling;
  1002. }
  1003. int rtlsdr_set_offset_tuning(rtlsdr_dev_t *dev, int on)
  1004. {
  1005. int r = 0;
  1006. int bw;
  1007. if (!dev)
  1008. return -1;
  1009. if ((dev->tuner_type == RTLSDR_TUNER_R820T) ||
  1010. (dev->tuner_type == RTLSDR_TUNER_R828D))
  1011. return -2;
  1012. if (dev->direct_sampling)
  1013. return -3;
  1014. /* based on keenerds 1/f noise measurements */
  1015. dev->offs_freq = on ? ((dev->rate / 2) * 170 / 100) : 0;
  1016. r |= rtlsdr_set_if_freq(dev, dev->offs_freq);
  1017. if (dev->tuner && dev->tuner->set_bw) {
  1018. rtlsdr_set_i2c_repeater(dev, 1);
  1019. if (on) {
  1020. bw = 2 * dev->offs_freq;
  1021. } else if (dev->bw > 0) {
  1022. bw = dev->bw;
  1023. } else {
  1024. bw = dev->rate;
  1025. }
  1026. dev->tuner->set_bw(dev, bw);
  1027. rtlsdr_set_i2c_repeater(dev, 0);
  1028. }
  1029. if (dev->freq > dev->offs_freq)
  1030. r |= rtlsdr_set_center_freq(dev, dev->freq);
  1031. return r;
  1032. }
  1033. int rtlsdr_get_offset_tuning(rtlsdr_dev_t *dev)
  1034. {
  1035. if (!dev)
  1036. return -1;
  1037. return (dev->offs_freq) ? 1 : 0;
  1038. }
  1039. static rtlsdr_dongle_t *find_known_device(uint16_t vid, uint16_t pid)
  1040. {
  1041. unsigned int i;
  1042. rtlsdr_dongle_t *device = NULL;
  1043. for (i = 0; i < sizeof(known_devices)/sizeof(rtlsdr_dongle_t); i++ ) {
  1044. if (known_devices[i].vid == vid && known_devices[i].pid == pid) {
  1045. device = &known_devices[i];
  1046. break;
  1047. }
  1048. }
  1049. return device;
  1050. }
  1051. uint32_t rtlsdr_get_device_count(void)
  1052. {
  1053. int i;
  1054. libusb_context *ctx;
  1055. libusb_device **list;
  1056. uint32_t device_count = 0;
  1057. struct libusb_device_descriptor dd;
  1058. ssize_t cnt;
  1059. libusb_init(&ctx);
  1060. cnt = libusb_get_device_list(ctx, &list);
  1061. for (i = 0; i < cnt; i++) {
  1062. libusb_get_device_descriptor(list[i], &dd);
  1063. if (find_known_device(dd.idVendor, dd.idProduct))
  1064. device_count++;
  1065. }
  1066. libusb_free_device_list(list, 1);
  1067. libusb_exit(ctx);
  1068. return device_count;
  1069. }
  1070. const char *rtlsdr_get_device_name(uint32_t index)
  1071. {
  1072. int i;
  1073. libusb_context *ctx;
  1074. libusb_device **list;
  1075. struct libusb_device_descriptor dd;
  1076. rtlsdr_dongle_t *device = NULL;
  1077. uint32_t device_count = 0;
  1078. ssize_t cnt;
  1079. libusb_init(&ctx);
  1080. cnt = libusb_get_device_list(ctx, &list);
  1081. for (i = 0; i < cnt; i++) {
  1082. libusb_get_device_descriptor(list[i], &dd);
  1083. device = find_known_device(dd.idVendor, dd.idProduct);
  1084. if (device) {
  1085. device_count++;
  1086. if (index == device_count - 1)
  1087. break;
  1088. }
  1089. }
  1090. libusb_free_device_list(list, 1);
  1091. libusb_exit(ctx);
  1092. if (device)
  1093. return device->name;
  1094. else
  1095. return "";
  1096. }
  1097. int rtlsdr_get_device_usb_strings(uint32_t index, char *manufact,
  1098. char *product, char *serial)
  1099. {
  1100. int r = -2;
  1101. int i;
  1102. libusb_context *ctx;
  1103. libusb_device **list;
  1104. struct libusb_device_descriptor dd;
  1105. rtlsdr_dongle_t *device = NULL;
  1106. rtlsdr_dev_t devt;
  1107. uint32_t device_count = 0;
  1108. ssize_t cnt;
  1109. libusb_init(&ctx);
  1110. cnt = libusb_get_device_list(ctx, &list);
  1111. for (i = 0; i < cnt; i++) {
  1112. libusb_get_device_descriptor(list[i], &dd);
  1113. device = find_known_device(dd.idVendor, dd.idProduct);
  1114. if (device) {
  1115. device_count++;
  1116. if (index == device_count - 1) {
  1117. r = libusb_open(list[i], &devt.devh);
  1118. if (!r) {
  1119. r = rtlsdr_get_usb_strings(&devt,
  1120. manufact,
  1121. product,
  1122. serial);
  1123. libusb_close(devt.devh);
  1124. }
  1125. break;
  1126. }
  1127. }
  1128. }
  1129. libusb_free_device_list(list, 1);
  1130. libusb_exit(ctx);
  1131. return r;
  1132. }
  1133. int rtlsdr_get_index_by_serial(const char *serial)
  1134. {
  1135. int i, cnt, r;
  1136. char str[256];
  1137. if (!serial)
  1138. return -1;
  1139. cnt = rtlsdr_get_device_count();
  1140. if (!cnt)
  1141. return -2;
  1142. for (i = 0; i < cnt; i++) {
  1143. r = rtlsdr_get_device_usb_strings(i, NULL, NULL, str);
  1144. if (!r && !strcmp(serial, str))
  1145. return i;
  1146. }
  1147. return -3;
  1148. }
  1149. int rtlsdr_open(rtlsdr_dev_t **out_dev, uint32_t index)
  1150. {
  1151. int r;
  1152. int i;
  1153. libusb_device **list;
  1154. rtlsdr_dev_t *dev = NULL;
  1155. libusb_device *device = NULL;
  1156. uint32_t device_count = 0;
  1157. struct libusb_device_descriptor dd;
  1158. uint8_t reg;
  1159. ssize_t cnt;
  1160. dev = malloc(sizeof(rtlsdr_dev_t));
  1161. if (NULL == dev)
  1162. return -ENOMEM;
  1163. memset(dev, 0, sizeof(rtlsdr_dev_t));
  1164. memcpy(dev->fir, fir_default, sizeof(fir_default));
  1165. libusb_init(&dev->ctx);
  1166. dev->dev_lost = 1;
  1167. cnt = libusb_get_device_list(dev->ctx, &list);
  1168. for (i = 0; i < cnt; i++) {
  1169. device = list[i];
  1170. libusb_get_device_descriptor(list[i], &dd);
  1171. if (find_known_device(dd.idVendor, dd.idProduct)) {
  1172. device_count++;
  1173. }
  1174. if (index == device_count - 1)
  1175. break;
  1176. device = NULL;
  1177. }
  1178. if (!device) {
  1179. r = -1;
  1180. goto err;
  1181. }
  1182. r = libusb_open(device, &dev->devh);
  1183. if (r < 0) {
  1184. libusb_free_device_list(list, 1);
  1185. fprintf(stderr, "usb_open error %d\n", r);
  1186. if(r == LIBUSB_ERROR_ACCESS)
  1187. fprintf(stderr, "Please fix the device permissions, e.g. "
  1188. "by installing the udev rules file rtl-sdr.rules\n");
  1189. goto err;
  1190. }
  1191. libusb_free_device_list(list, 1);
  1192. if (libusb_kernel_driver_active(dev->devh, 0) == 1) {
  1193. dev->driver_active = 1;
  1194. #ifdef DETACH_KERNEL_DRIVER
  1195. if (!libusb_detach_kernel_driver(dev->devh, 0)) {
  1196. fprintf(stderr, "Detached kernel driver\n");
  1197. } else {
  1198. fprintf(stderr, "Detaching kernel driver failed!");
  1199. goto err;
  1200. }
  1201. #else
  1202. fprintf(stderr, "\nKernel driver is active, or device is "
  1203. "claimed by second instance of librtlsdr."
  1204. "\nIn the first case, please either detach"
  1205. " or blacklist the kernel module\n"
  1206. "(dvb_usb_rtl28xxu), or enable automatic"
  1207. " detaching at compile time.\n\n");
  1208. #endif
  1209. }
  1210. r = libusb_claim_interface(dev->devh, 0);
  1211. if (r < 0) {
  1212. fprintf(stderr, "usb_claim_interface error %d\n", r);
  1213. goto err;
  1214. }
  1215. dev->rtl_xtal = DEF_RTL_XTAL_FREQ;
  1216. /* perform a dummy write, if it fails, reset the device */
  1217. if (rtlsdr_write_reg(dev, USBB, USB_SYSCTL, 0x09, 1) < 0) {
  1218. fprintf(stderr, "Resetting device...\n");
  1219. libusb_reset_device(dev->devh);
  1220. }
  1221. rtlsdr_init_baseband(dev);
  1222. dev->dev_lost = 0;
  1223. /* Probe tuners */
  1224. rtlsdr_set_i2c_repeater(dev, 1);
  1225. reg = rtlsdr_i2c_read_reg(dev, E4K_I2C_ADDR, E4K_CHECK_ADDR);
  1226. if (reg == E4K_CHECK_VAL) {
  1227. fprintf(stderr, "Found Elonics E4000 tuner\n");
  1228. dev->tuner_type = RTLSDR_TUNER_E4000;
  1229. goto found;
  1230. }
  1231. reg = rtlsdr_i2c_read_reg(dev, FC0013_I2C_ADDR, FC0013_CHECK_ADDR);
  1232. if (reg == FC0013_CHECK_VAL) {
  1233. fprintf(stderr, "Found Fitipower FC0013 tuner\n");
  1234. dev->tuner_type = RTLSDR_TUNER_FC0013;
  1235. goto found;
  1236. }
  1237. reg = rtlsdr_i2c_read_reg(dev, R820T_I2C_ADDR, R82XX_CHECK_ADDR);
  1238. if (reg == R82XX_CHECK_VAL) {
  1239. fprintf(stderr, "Found Rafael Micro R820T tuner\n");
  1240. dev->tuner_type = RTLSDR_TUNER_R820T;
  1241. goto found;
  1242. }
  1243. reg = rtlsdr_i2c_read_reg(dev, R828D_I2C_ADDR, R82XX_CHECK_ADDR);
  1244. if (reg == R82XX_CHECK_VAL) {
  1245. fprintf(stderr, "Found Rafael Micro R828D tuner\n");
  1246. dev->tuner_type = RTLSDR_TUNER_R828D;
  1247. goto found;
  1248. }
  1249. /* initialise GPIOs */
  1250. rtlsdr_set_gpio_output(dev, 5);
  1251. /* reset tuner before probing */
  1252. rtlsdr_set_gpio_bit(dev, 5, 1);
  1253. rtlsdr_set_gpio_bit(dev, 5, 0);
  1254. reg = rtlsdr_i2c_read_reg(dev, FC2580_I2C_ADDR, FC2580_CHECK_ADDR);
  1255. if ((reg & 0x7f) == FC2580_CHECK_VAL) {
  1256. fprintf(stderr, "Found FCI 2580 tuner\n");
  1257. dev->tuner_type = RTLSDR_TUNER_FC2580;
  1258. goto found;
  1259. }
  1260. reg = rtlsdr_i2c_read_reg(dev, FC0012_I2C_ADDR, FC0012_CHECK_ADDR);
  1261. if (reg == FC0012_CHECK_VAL) {
  1262. fprintf(stderr, "Found Fitipower FC0012 tuner\n");
  1263. rtlsdr_set_gpio_output(dev, 6);
  1264. dev->tuner_type = RTLSDR_TUNER_FC0012;
  1265. goto found;
  1266. }
  1267. found:
  1268. /* use the rtl clock value by default */
  1269. dev->tun_xtal = dev->rtl_xtal;
  1270. dev->tuner = &tuners[dev->tuner_type];
  1271. switch (dev->tuner_type) {
  1272. case RTLSDR_TUNER_R828D:
  1273. dev->tun_xtal = R828D_XTAL_FREQ;
  1274. case RTLSDR_TUNER_R820T:
  1275. /* disable Zero-IF mode */
  1276. rtlsdr_demod_write_reg(dev, 1, 0xb1, 0x1a, 1);
  1277. /* only enable In-phase ADC input */
  1278. rtlsdr_demod_write_reg(dev, 0, 0x08, 0x4d, 1);
  1279. /* the R82XX use 3.57 MHz IF for the DVB-T 6 MHz mode, and
  1280. * 4.57 MHz for the 8 MHz mode */
  1281. rtlsdr_set_if_freq(dev, R82XX_IF_FREQ);
  1282. /* enable spectrum inversion */
  1283. rtlsdr_demod_write_reg(dev, 1, 0x15, 0x01, 1);
  1284. break;
  1285. case RTLSDR_TUNER_UNKNOWN:
  1286. fprintf(stderr, "No supported tuner found\n");
  1287. rtlsdr_set_direct_sampling(dev, 1);
  1288. break;
  1289. default:
  1290. break;
  1291. }
  1292. if (dev->tuner->init)
  1293. r = dev->tuner->init(dev);
  1294. rtlsdr_set_i2c_repeater(dev, 0);
  1295. *out_dev = dev;
  1296. return 0;
  1297. err:
  1298. if (dev) {
  1299. if (dev->ctx)
  1300. libusb_exit(dev->ctx);
  1301. free(dev);
  1302. }
  1303. return r;
  1304. }
  1305. int rtlsdr_close(rtlsdr_dev_t *dev)
  1306. {
  1307. if (!dev)
  1308. return -1;
  1309. if(!dev->dev_lost) {
  1310. /* block until all async operations have been completed (if any) */
  1311. while (RTLSDR_INACTIVE != dev->async_status) {
  1312. #ifdef _WIN32
  1313. Sleep(1);
  1314. #else
  1315. usleep(1000);
  1316. #endif
  1317. }
  1318. rtlsdr_deinit_baseband(dev);
  1319. }
  1320. libusb_release_interface(dev->devh, 0);
  1321. #ifdef DETACH_KERNEL_DRIVER
  1322. if (dev->driver_active) {
  1323. if (!libusb_attach_kernel_driver(dev->devh, 0))
  1324. fprintf(stderr, "Reattached kernel driver\n");
  1325. else
  1326. fprintf(stderr, "Reattaching kernel driver failed!\n");
  1327. }
  1328. #endif
  1329. libusb_close(dev->devh);
  1330. libusb_exit(dev->ctx);
  1331. free(dev);
  1332. return 0;
  1333. }
  1334. int rtlsdr_reset_buffer(rtlsdr_dev_t *dev)
  1335. {
  1336. if (!dev)
  1337. return -1;
  1338. rtlsdr_write_reg(dev, USBB, USB_EPA_CTL, 0x1002, 2);
  1339. rtlsdr_write_reg(dev, USBB, USB_EPA_CTL, 0x0000, 2);
  1340. return 0;
  1341. }
  1342. int rtlsdr_read_sync(rtlsdr_dev_t *dev, void *buf, int len, int *n_read)
  1343. {
  1344. if (!dev)
  1345. return -1;
  1346. return libusb_bulk_transfer(dev->devh, 0x81, buf, len, n_read, BULK_TIMEOUT);
  1347. }
  1348. static void LIBUSB_CALL _libusb_callback(struct libusb_transfer *xfer)
  1349. {
  1350. rtlsdr_dev_t *dev = (rtlsdr_dev_t *)xfer->user_data;
  1351. if (LIBUSB_TRANSFER_COMPLETED == xfer->status) {
  1352. if (dev->cb)
  1353. dev->cb(xfer->buffer, xfer->actual_length, dev->cb_ctx);
  1354. libusb_submit_transfer(xfer); /* resubmit transfer */
  1355. dev->xfer_errors = 0;
  1356. } else if (LIBUSB_TRANSFER_CANCELLED != xfer->status) {
  1357. #ifndef _WIN32
  1358. if (LIBUSB_TRANSFER_ERROR == xfer->status)
  1359. dev->xfer_errors++;
  1360. if (dev->xfer_errors >= dev->xfer_buf_num ||
  1361. LIBUSB_TRANSFER_NO_DEVICE == xfer->status) {
  1362. #endif
  1363. dev->dev_lost = 1;
  1364. rtlsdr_cancel_async(dev);
  1365. fprintf(stderr, "cb transfer status: %d, "
  1366. "canceling...\n", xfer->status);
  1367. #ifndef _WIN32
  1368. }
  1369. #endif
  1370. }
  1371. }
  1372. int rtlsdr_wait_async(rtlsdr_dev_t *dev, rtlsdr_read_async_cb_t cb, void *ctx)
  1373. {
  1374. return rtlsdr_read_async(dev, cb, ctx, 0, 0);
  1375. }
  1376. static int _rtlsdr_alloc_async_buffers(rtlsdr_dev_t *dev)
  1377. {
  1378. unsigned int i;
  1379. if (!dev)
  1380. return -1;
  1381. if (!dev->xfer) {
  1382. dev->xfer = malloc(dev->xfer_buf_num *
  1383. sizeof(struct libusb_transfer *));
  1384. for(i = 0; i < dev->xfer_buf_num; ++i)
  1385. dev->xfer[i] = libusb_alloc_transfer(0);
  1386. }
  1387. if (!dev->xfer_buf) {
  1388. dev->xfer_buf = malloc(dev->xfer_buf_num *
  1389. sizeof(unsigned char *));
  1390. for(i = 0; i < dev->xfer_buf_num; ++i)
  1391. dev->xfer_buf[i] = malloc(dev->xfer_buf_len);
  1392. }
  1393. return 0;
  1394. }
  1395. static int _rtlsdr_free_async_buffers(rtlsdr_dev_t *dev)
  1396. {
  1397. unsigned int i;
  1398. if (!dev)
  1399. return -1;
  1400. if (dev->xfer) {
  1401. for(i = 0; i < dev->xfer_buf_num; ++i) {
  1402. if (dev->xfer[i]) {
  1403. libusb_free_transfer(dev->xfer[i]);
  1404. }
  1405. }
  1406. free(dev->xfer);
  1407. dev->xfer = NULL;
  1408. }
  1409. if (dev->xfer_buf) {
  1410. for(i = 0; i < dev->xfer_buf_num; ++i) {
  1411. if (dev->xfer_buf[i])
  1412. free(dev->xfer_buf[i]);
  1413. }
  1414. free(dev->xfer_buf);
  1415. dev->xfer_buf = NULL;
  1416. }
  1417. return 0;
  1418. }
  1419. int rtlsdr_read_async(rtlsdr_dev_t *dev, rtlsdr_read_async_cb_t cb, void *ctx,
  1420. uint32_t buf_num, uint32_t buf_len)
  1421. {
  1422. unsigned int i;
  1423. int r = 0;
  1424. struct timeval tv = { 1, 0 };
  1425. struct timeval zerotv = { 0, 0 };
  1426. enum rtlsdr_async_status next_status = RTLSDR_INACTIVE;
  1427. if (!dev)
  1428. return -1;
  1429. if (RTLSDR_INACTIVE != dev->async_status)
  1430. return -2;
  1431. dev->async_status = RTLSDR_RUNNING;
  1432. dev->async_cancel = 0;
  1433. dev->cb = cb;
  1434. dev->cb_ctx = ctx;
  1435. if (buf_num > 0)
  1436. dev->xfer_buf_num = buf_num;
  1437. else
  1438. dev->xfer_buf_num = DEFAULT_BUF_NUMBER;
  1439. if (buf_len > 0 && buf_len % 512 == 0) /* len must be multiple of 512 */
  1440. dev->xfer_buf_len = buf_len;
  1441. else
  1442. dev->xfer_buf_len = DEFAULT_BUF_LENGTH;
  1443. _rtlsdr_alloc_async_buffers(dev);
  1444. for(i = 0; i < dev->xfer_buf_num; ++i) {
  1445. libusb_fill_bulk_transfer(dev->xfer[i],
  1446. dev->devh,
  1447. 0x81,
  1448. dev->xfer_buf[i],
  1449. dev->xfer_buf_len,
  1450. _libusb_callback,
  1451. (void *)dev,
  1452. BULK_TIMEOUT);
  1453. r = libusb_submit_transfer(dev->xfer[i]);
  1454. if (r < 0) {
  1455. fprintf(stderr, "Failed to submit transfer %i!\n", i);
  1456. dev->async_status = RTLSDR_CANCELING;
  1457. break;
  1458. }
  1459. }
  1460. while (RTLSDR_INACTIVE != dev->async_status) {
  1461. r = libusb_handle_events_timeout_completed(dev->ctx, &tv,
  1462. &dev->async_cancel);
  1463. if (r < 0) {
  1464. /*fprintf(stderr, "handle_events returned: %d\n", r);*/
  1465. if (r == LIBUSB_ERROR_INTERRUPTED) /* stray signal */
  1466. continue;
  1467. break;
  1468. }
  1469. if (RTLSDR_CANCELING == dev->async_status) {
  1470. next_status = RTLSDR_INACTIVE;
  1471. if (!dev->xfer)
  1472. break;
  1473. for(i = 0; i < dev->xfer_buf_num; ++i) {
  1474. if (!dev->xfer[i])
  1475. continue;
  1476. if (LIBUSB_TRANSFER_CANCELLED !=
  1477. dev->xfer[i]->status) {
  1478. r = libusb_cancel_transfer(dev->xfer[i]);
  1479. /* handle events after canceling
  1480. * to allow transfer status to
  1481. * propagate */
  1482. libusb_handle_events_timeout_completed(dev->ctx,
  1483. &zerotv, NULL);
  1484. if (r < 0)
  1485. continue;
  1486. next_status = RTLSDR_CANCELING;
  1487. }
  1488. }
  1489. if (dev->dev_lost || RTLSDR_INACTIVE == next_status) {
  1490. /* handle any events that still need to
  1491. * be handled before exiting after we
  1492. * just cancelled all transfers */
  1493. libusb_handle_events_timeout_completed(dev->ctx,
  1494. &zerotv, NULL);
  1495. break;
  1496. }
  1497. }
  1498. }
  1499. _rtlsdr_free_async_buffers(dev);
  1500. dev->async_status = next_status;
  1501. return r;
  1502. }
  1503. int rtlsdr_cancel_async(rtlsdr_dev_t *dev)
  1504. {
  1505. if (!dev)
  1506. return -1;
  1507. /* if streaming, try to cancel gracefully */
  1508. if (RTLSDR_RUNNING == dev->async_status) {
  1509. dev->async_status = RTLSDR_CANCELING;
  1510. dev->async_cancel = 1;
  1511. return 0;
  1512. }
  1513. /* if called while in pending state, change the state forcefully */
  1514. #if 0
  1515. if (RTLSDR_INACTIVE != dev->async_status) {
  1516. dev->async_status = RTLSDR_INACTIVE;
  1517. return 0;
  1518. }
  1519. #endif
  1520. return -2;
  1521. }
  1522. uint32_t rtlsdr_get_tuner_clock(void *dev)
  1523. {
  1524. uint32_t tuner_freq;
  1525. if (!dev)
  1526. return 0;
  1527. /* read corrected clock value */
  1528. if (rtlsdr_get_xtal_freq((rtlsdr_dev_t *)dev, NULL, &tuner_freq))
  1529. return 0;
  1530. return tuner_freq;
  1531. }
  1532. int rtlsdr_i2c_write_fn(void *dev, uint8_t addr, uint8_t *buf, int len)
  1533. {
  1534. if (dev)
  1535. return rtlsdr_i2c_write(((rtlsdr_dev_t *)dev), addr, buf, len);
  1536. return -1;
  1537. }
  1538. int rtlsdr_i2c_read_fn(void *dev, uint8_t addr, uint8_t *buf, int len)
  1539. {
  1540. if (dev)
  1541. return rtlsdr_i2c_read(((rtlsdr_dev_t *)dev), addr, buf, len);
  1542. return -1;
  1543. }