librtlsdr.c 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692
  1. /*
  2. * rtl-sdr, turns your Realtek RTL2832 based DVB dongle into a SDR receiver
  3. * Copyright (C) 2012 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. /* two raised to the power of n */
  39. #define TWO_POW(n) ((double)(1ULL<<(n)))
  40. #include "rtl-sdr.h"
  41. #include "tuner_e4k.h"
  42. #include "tuner_fc0012.h"
  43. #include "tuner_fc0013.h"
  44. #include "tuner_fc2580.h"
  45. #include "tuner_r820t.h"
  46. typedef struct rtlsdr_tuner_iface {
  47. /* tuner interface */
  48. int (*init)(void *);
  49. int (*exit)(void *);
  50. int (*set_freq)(void *, uint32_t freq /* Hz */);
  51. int (*set_bw)(void *, int bw /* Hz */);
  52. int (*set_gain)(void *, int gain /* tenth dB */);
  53. int (*set_if_gain)(void *, int stage, int gain /* tenth dB */);
  54. int (*set_gain_mode)(void *, int manual);
  55. } rtlsdr_tuner_iface_t;
  56. enum rtlsdr_async_status {
  57. RTLSDR_INACTIVE = 0,
  58. RTLSDR_CANCELING,
  59. RTLSDR_RUNNING
  60. };
  61. struct rtlsdr_dev {
  62. libusb_context *ctx;
  63. struct libusb_device_handle *devh;
  64. uint32_t xfer_buf_num;
  65. uint32_t xfer_buf_len;
  66. struct libusb_transfer **xfer;
  67. unsigned char **xfer_buf;
  68. rtlsdr_read_async_cb_t cb;
  69. void *cb_ctx;
  70. enum rtlsdr_async_status async_status;
  71. /* rtl demod context */
  72. uint32_t rate; /* Hz */
  73. uint32_t rtl_xtal; /* Hz */
  74. int direct_sampling;
  75. /* tuner context */
  76. enum rtlsdr_tuner tuner_type;
  77. rtlsdr_tuner_iface_t *tuner;
  78. uint32_t tun_xtal; /* Hz */
  79. uint32_t freq; /* Hz */
  80. uint32_t offs_freq; /* Hz */
  81. int corr; /* ppm */
  82. int gain; /* tenth dB */
  83. struct e4k_state e4k_s;
  84. };
  85. void rtlsdr_set_gpio_bit(rtlsdr_dev_t *dev, uint8_t gpio, int val);
  86. /* generic tuner interface functions, shall be moved to the tuner implementations */
  87. int e4000_init(void *dev) {
  88. rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
  89. devt->e4k_s.i2c_addr = E4K_I2C_ADDR;
  90. rtlsdr_get_xtal_freq(devt, NULL, &devt->e4k_s.vco.fosc);
  91. devt->e4k_s.rtl_dev = dev;
  92. return e4k_init(&devt->e4k_s);
  93. }
  94. int e4000_exit(void *dev) { return 0; }
  95. int e4000_set_freq(void *dev, uint32_t freq) {
  96. rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
  97. return e4k_tune_freq(&devt->e4k_s, freq);
  98. }
  99. int e4000_set_bw(void *dev, int bw) {
  100. int r = 0;
  101. rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
  102. r |= e4k_if_filter_bw_set(&devt->e4k_s, E4K_IF_FILTER_MIX, bw);
  103. r |= e4k_if_filter_bw_set(&devt->e4k_s, E4K_IF_FILTER_RC, bw);
  104. r |= e4k_if_filter_bw_set(&devt->e4k_s, E4K_IF_FILTER_CHAN, bw);
  105. return r;
  106. }
  107. int e4000_set_gain(void *dev, int gain) {
  108. rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
  109. int mixgain = (gain > 340) ? 12 : 4;
  110. #if 0
  111. int enhgain = (gain - 420);
  112. #endif
  113. if(e4k_set_lna_gain(&devt->e4k_s, min(300, gain - mixgain * 10)) == -EINVAL)
  114. return -1;
  115. if(e4k_mixer_gain_set(&devt->e4k_s, mixgain) == -EINVAL)
  116. return -1;
  117. #if 0 /* enhanced mixer gain seems to have no effect */
  118. if(enhgain >= 0)
  119. if(e4k_set_enh_gain(&devt->e4k_s, enhgain) == -EINVAL)
  120. return -1;
  121. #endif
  122. return 0;
  123. }
  124. int e4000_set_if_gain(void *dev, int stage, int gain) {
  125. rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
  126. return e4k_if_gain_set(&devt->e4k_s, (uint8_t)stage, (int8_t)(gain / 10));
  127. }
  128. int e4000_set_gain_mode(void *dev, int manual) {
  129. rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
  130. return e4k_enable_manual_gain(&devt->e4k_s, manual);
  131. }
  132. int _fc0012_init(void *dev) { return fc0012_init(dev); }
  133. int fc0012_exit(void *dev) { return 0; }
  134. int fc0012_set_freq(void *dev, uint32_t freq) {
  135. /* select V-band/U-band filter */
  136. rtlsdr_set_gpio_bit(dev, 6, (freq > 300000000) ? 1 : 0);
  137. return fc0012_set_params(dev, freq, 6000000);
  138. }
  139. int fc0012_set_bw(void *dev, int bw) { return 0; }
  140. int _fc0012_set_gain(void *dev, int gain) { return fc0012_set_gain(dev, gain); }
  141. int fc0012_set_gain_mode(void *dev, int manual) { return 0; }
  142. int _fc0013_init(void *dev) { return fc0013_init(dev); }
  143. int fc0013_exit(void *dev) { return 0; }
  144. int fc0013_set_freq(void *dev, uint32_t freq) {
  145. return fc0013_set_params(dev, freq, 6000000);
  146. }
  147. int fc0013_set_bw(void *dev, int bw) { return 0; }
  148. int _fc0013_set_gain(void *dev, int gain) { return fc0013_set_lna_gain(dev, gain); }
  149. int fc2580_init(void *dev) { return fc2580_Initialize(dev); }
  150. int fc2580_exit(void *dev) { return 0; }
  151. int _fc2580_set_freq(void *dev, uint32_t freq) {
  152. return fc2580_SetRfFreqHz(dev, freq);
  153. }
  154. int fc2580_set_bw(void *dev, int bw) { return fc2580_SetBandwidthMode(dev, 1); }
  155. int fc2580_set_gain(void *dev, int gain) { return 0; }
  156. int fc2580_set_gain_mode(void *dev, int manual) { return 0; }
  157. int r820t_init(void *dev) {
  158. int r = R828_Init(dev);
  159. r820t_SetStandardMode(dev, DVB_T_6M);
  160. return r;
  161. }
  162. int r820t_exit(void *dev) { return 0; }
  163. int r820t_set_freq(void *dev, uint32_t freq) { return r820t_SetRfFreqHz(dev, freq); }
  164. int r820t_set_bw(void *dev, int bw) { return 0; }
  165. int r820t_set_gain(void *dev, int gain) { return R828_SetRfGain(dev, gain); }
  166. int r820t_set_gain_mode(void *dev, int manual) { return R828_RfGainMode(dev, manual); }
  167. /* definition order must match enum rtlsdr_tuner */
  168. static rtlsdr_tuner_iface_t tuners[] = {
  169. {
  170. NULL, NULL, NULL, NULL, NULL, NULL, NULL /* dummy for unknown tuners */
  171. },
  172. {
  173. e4000_init, e4000_exit,
  174. e4000_set_freq, e4000_set_bw, e4000_set_gain, e4000_set_if_gain,
  175. e4000_set_gain_mode
  176. },
  177. {
  178. _fc0012_init, fc0012_exit,
  179. fc0012_set_freq, fc0012_set_bw, _fc0012_set_gain, NULL,
  180. fc0012_set_gain_mode
  181. },
  182. {
  183. _fc0013_init, fc0013_exit,
  184. fc0013_set_freq, fc0013_set_bw, _fc0013_set_gain, NULL,
  185. fc0013_set_gain_mode
  186. },
  187. {
  188. fc2580_init, fc2580_exit,
  189. _fc2580_set_freq, fc2580_set_bw, fc2580_set_gain, NULL,
  190. fc2580_set_gain_mode
  191. },
  192. {
  193. r820t_init, r820t_exit,
  194. r820t_set_freq, r820t_set_bw, r820t_set_gain, NULL,
  195. r820t_set_gain_mode
  196. },
  197. };
  198. typedef struct rtlsdr_dongle {
  199. uint16_t vid;
  200. uint16_t pid;
  201. const char *name;
  202. } rtlsdr_dongle_t;
  203. /*
  204. * Please add your device here and send a patch to osmocom-sdr@lists.osmocom.org
  205. */
  206. static rtlsdr_dongle_t known_devices[] = {
  207. { 0x0bda, 0x2832, "Generic RTL2832U (e.g. hama nano)" },
  208. { 0x0bda, 0x2838, "ezcap USB 2.0 DVB-T/DAB/FM dongle" },
  209. { 0x0ccd, 0x00a9, "Terratec Cinergy T Stick Black (rev 1)" },
  210. { 0x0ccd, 0x00b3, "Terratec NOXON DAB/DAB+ USB dongle (rev 1)" },
  211. { 0x0ccd, 0x00b4, "Terratec NOXON DAB/DAB+ USB dongle (rev 1)" },
  212. { 0x0ccd, 0x00b7, "Terratec NOXON DAB/DAB+ USB dongle (rev 1)" },
  213. { 0x0ccd, 0x00c6, "Terratec NOXON DAB/DAB+ USB dongle (rev 1)" },
  214. { 0x0ccd, 0x00d3, "Terratec Cinergy T Stick RC (Rev.3)" },
  215. { 0x0ccd, 0x00d7, "Terratec T Stick PLUS" },
  216. { 0x0ccd, 0x00e0, "Terratec NOXON DAB/DAB+ USB dongle (rev 2)" },
  217. { 0x1554, 0x5020, "PixelView PV-DT235U(RN)" },
  218. { 0x185b, 0x0620, "Compro Videomate U620F"},
  219. { 0x185b, 0x0650, "Compro Videomate U650F"},
  220. { 0x185b, 0x0680, "Compro Videomate U680F"},
  221. { 0x1f4d, 0xa803, "Sweex DVB-T USB" },
  222. { 0x1f4d, 0xb803, "GTek T803" },
  223. { 0x1f4d, 0xc803, "Lifeview LV5TDeluxe" },
  224. { 0x1f4d, 0xd286, "MyGica TD312" },
  225. { 0x1f4d, 0xd803, "PROlectrix DV107669" },
  226. { 0x1b80, 0xd398, "Zaapa ZT-MINDVBZP" },
  227. { 0x1b80, 0xd3a4, "Twintech UT-40" },
  228. { 0x1d19, 0x1101, "Dexatek DK DVB-T Dongle (Logilink VG0002A)" },
  229. { 0x1d19, 0x1102, "Dexatek DK DVB-T Dongle (MSI DigiVox mini II V3.0)" },
  230. { 0x1d19, 0x1103, "Dexatek Technology Ltd. DK 5217 DVB-T Dongle" },
  231. { 0x1d19, 0x1104, "MSI DigiVox Micro HD" },
  232. { 0x0458, 0x707f, "Genius TVGo DVB-T03 USB dongle (Ver. B)" },
  233. { 0x1b80, 0xd393, "GIGABYTE GT-U7300" },
  234. { 0x1b80, 0xd394, "DIKOM USB-DVBT HD" },
  235. { 0x1b80, 0xd395, "Peak 102569AGPK" },
  236. { 0x1b80, 0xd39d, "SVEON STV20 DVB-T USB & FM" },
  237. };
  238. #define DEFAULT_BUF_NUMBER 32
  239. #define DEFAULT_BUF_LENGTH (16 * 32 * 512)
  240. #define DEF_RTL_XTAL_FREQ 28800000
  241. #define MIN_RTL_XTAL_FREQ (DEF_RTL_XTAL_FREQ - 1000)
  242. #define MAX_RTL_XTAL_FREQ (DEF_RTL_XTAL_FREQ + 1000)
  243. #define MAX_SAMP_RATE 3200000
  244. #define CTRL_IN (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_IN)
  245. #define CTRL_OUT (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_OUT)
  246. #define CTRL_TIMEOUT 300
  247. #define BULK_TIMEOUT 0
  248. #define EEPROM_ADDR 0xa0
  249. enum usb_reg {
  250. USB_SYSCTL = 0x2000,
  251. USB_CTRL = 0x2010,
  252. USB_STAT = 0x2014,
  253. USB_EPA_CFG = 0x2144,
  254. USB_EPA_CTL = 0x2148,
  255. USB_EPA_MAXPKT = 0x2158,
  256. USB_EPA_MAXPKT_2 = 0x215a,
  257. USB_EPA_FIFO_CFG = 0x2160,
  258. };
  259. enum sys_reg {
  260. DEMOD_CTL = 0x3000,
  261. GPO = 0x3001,
  262. GPI = 0x3002,
  263. GPOE = 0x3003,
  264. GPD = 0x3004,
  265. SYSINTE = 0x3005,
  266. SYSINTS = 0x3006,
  267. GP_CFG0 = 0x3007,
  268. GP_CFG1 = 0x3008,
  269. SYSINTE_1 = 0x3009,
  270. SYSINTS_1 = 0x300a,
  271. DEMOD_CTL_1 = 0x300b,
  272. IR_SUSPEND = 0x300c,
  273. };
  274. enum blocks {
  275. DEMODB = 0,
  276. USBB = 1,
  277. SYSB = 2,
  278. TUNB = 3,
  279. ROMB = 4,
  280. IRB = 5,
  281. IICB = 6,
  282. };
  283. int rtlsdr_read_array(rtlsdr_dev_t *dev, uint8_t block, uint16_t addr, uint8_t *array, uint8_t len)
  284. {
  285. int r;
  286. uint16_t index = (block << 8);
  287. r = libusb_control_transfer(dev->devh, CTRL_IN, 0, addr, index, array, len, CTRL_TIMEOUT);
  288. #if 0
  289. if (r < 0)
  290. fprintf(stderr, "%s failed with %d\n", __FUNCTION__, r);
  291. #endif
  292. return r;
  293. }
  294. int rtlsdr_write_array(rtlsdr_dev_t *dev, uint8_t block, uint16_t addr, uint8_t *array, uint8_t len)
  295. {
  296. int r;
  297. uint16_t index = (block << 8) | 0x10;
  298. r = libusb_control_transfer(dev->devh, CTRL_OUT, 0, addr, index, array, len, CTRL_TIMEOUT);
  299. #if 0
  300. if (r < 0)
  301. fprintf(stderr, "%s failed with %d\n", __FUNCTION__, r);
  302. #endif
  303. return r;
  304. }
  305. int rtlsdr_i2c_write_reg(rtlsdr_dev_t *dev, uint8_t i2c_addr, uint8_t reg, uint8_t val)
  306. {
  307. uint16_t addr = i2c_addr;
  308. uint8_t data[2];
  309. data[0] = reg;
  310. data[1] = val;
  311. return rtlsdr_write_array(dev, IICB, addr, (uint8_t *)&data, 2);
  312. }
  313. uint8_t rtlsdr_i2c_read_reg(rtlsdr_dev_t *dev, uint8_t i2c_addr, uint8_t reg)
  314. {
  315. uint16_t addr = i2c_addr;
  316. uint8_t data = 0;
  317. rtlsdr_write_array(dev, IICB, addr, &reg, 1);
  318. rtlsdr_read_array(dev, IICB, addr, &data, 1);
  319. return data;
  320. }
  321. /* TODO clean this up again */
  322. int e4k_reg_write(struct e4k_state *e4k, uint8_t reg, uint8_t val)
  323. {
  324. return rtlsdr_i2c_write_reg((rtlsdr_dev_t*)e4k->rtl_dev, e4k->i2c_addr, reg, val);}
  325. uint8_t e4k_reg_read(struct e4k_state *e4k, uint8_t reg)
  326. {
  327. return rtlsdr_i2c_read_reg((rtlsdr_dev_t*)e4k->rtl_dev, e4k->i2c_addr, reg);
  328. }
  329. int rtlsdr_i2c_write(rtlsdr_dev_t *dev, uint8_t i2c_addr, uint8_t *buffer, int len)
  330. {
  331. uint16_t addr = i2c_addr;
  332. if (!dev)
  333. return -1;
  334. return rtlsdr_write_array(dev, IICB, addr, buffer, len);
  335. }
  336. int rtlsdr_i2c_read(rtlsdr_dev_t *dev, uint8_t i2c_addr, uint8_t *buffer, int len)
  337. {
  338. uint16_t addr = i2c_addr;
  339. if (!dev)
  340. return -1;
  341. return rtlsdr_read_array(dev, IICB, addr, buffer, len);
  342. }
  343. uint16_t rtlsdr_read_reg(rtlsdr_dev_t *dev, uint8_t block, uint16_t addr, uint8_t len)
  344. {
  345. int r;
  346. unsigned char data[2];
  347. uint16_t index = (block << 8);
  348. uint16_t reg;
  349. r = libusb_control_transfer(dev->devh, CTRL_IN, 0, addr, index, data, len, CTRL_TIMEOUT);
  350. if (r < 0)
  351. fprintf(stderr, "%s failed with %d\n", __FUNCTION__, r);
  352. reg = (data[1] << 8) | data[0];
  353. return reg;
  354. }
  355. int rtlsdr_write_reg(rtlsdr_dev_t *dev, uint8_t block, uint16_t addr, uint16_t val, uint8_t len)
  356. {
  357. int r;
  358. unsigned char data[2];
  359. uint16_t index = (block << 8) | 0x10;
  360. if (len == 1)
  361. data[0] = val & 0xff;
  362. else
  363. data[0] = val >> 8;
  364. data[1] = val & 0xff;
  365. r = libusb_control_transfer(dev->devh, CTRL_OUT, 0, addr, index, data, len, CTRL_TIMEOUT);
  366. if (r < 0)
  367. fprintf(stderr, "%s failed with %d\n", __FUNCTION__, r);
  368. return r;
  369. }
  370. uint16_t rtlsdr_demod_read_reg(rtlsdr_dev_t *dev, uint8_t page, uint16_t addr, uint8_t len)
  371. {
  372. int r;
  373. unsigned char data[2];
  374. uint16_t index = page;
  375. uint16_t reg;
  376. addr = (addr << 8) | 0x20;
  377. r = libusb_control_transfer(dev->devh, CTRL_IN, 0, addr, index, data, len, CTRL_TIMEOUT);
  378. if (r < 0)
  379. fprintf(stderr, "%s failed with %d\n", __FUNCTION__, r);
  380. reg = (data[1] << 8) | data[0];
  381. return reg;
  382. }
  383. int rtlsdr_demod_write_reg(rtlsdr_dev_t *dev, uint8_t page, uint16_t addr, uint16_t val, uint8_t len)
  384. {
  385. int r;
  386. unsigned char data[2];
  387. uint16_t index = 0x10 | page;
  388. addr = (addr << 8) | 0x20;
  389. if (len == 1)
  390. data[0] = val & 0xff;
  391. else
  392. data[0] = val >> 8;
  393. data[1] = val & 0xff;
  394. r = libusb_control_transfer(dev->devh, CTRL_OUT, 0, addr, index, data, len, CTRL_TIMEOUT);
  395. if (r < 0)
  396. fprintf(stderr, "%s failed with %d\n", __FUNCTION__, r);
  397. rtlsdr_demod_read_reg(dev, 0x0a, 0x01, 1);
  398. return (r == len) ? 0 : -1;
  399. }
  400. void rtlsdr_set_gpio_bit(rtlsdr_dev_t *dev, uint8_t gpio, int val)
  401. {
  402. uint8_t r;
  403. gpio = 1 << gpio;
  404. r = rtlsdr_read_reg(dev, SYSB, GPO, 1);
  405. r = val ? (r | gpio) : (r & ~gpio);
  406. rtlsdr_write_reg(dev, SYSB, GPO, r, 1);
  407. }
  408. void rtlsdr_set_gpio_output(rtlsdr_dev_t *dev, uint8_t gpio)
  409. {
  410. int r;
  411. gpio = 1 << gpio;
  412. r = rtlsdr_read_reg(dev, SYSB, GPD, 1);
  413. rtlsdr_write_reg(dev, SYSB, GPO, r & ~gpio, 1);
  414. r = rtlsdr_read_reg(dev, SYSB, GPOE, 1);
  415. rtlsdr_write_reg(dev, SYSB, GPOE, r | gpio, 1);
  416. }
  417. void rtlsdr_set_i2c_repeater(rtlsdr_dev_t *dev, int on)
  418. {
  419. rtlsdr_demod_write_reg(dev, 1, 0x01, on ? 0x18 : 0x10, 1);
  420. }
  421. void rtlsdr_init_baseband(rtlsdr_dev_t *dev)
  422. {
  423. unsigned int i;
  424. /* default FIR coefficients used for DAB/FM by the Windows driver,
  425. * the DVB driver uses different ones */
  426. uint8_t fir_coeff[] = {
  427. 0xca, 0xdc, 0xd7, 0xd8, 0xe0, 0xf2, 0x0e, 0x35, 0x06, 0x50,
  428. 0x9c, 0x0d, 0x71, 0x11, 0x14, 0x71, 0x74, 0x19, 0x41, 0xa5,
  429. };
  430. /* initialize USB */
  431. rtlsdr_write_reg(dev, USBB, USB_SYSCTL, 0x09, 1);
  432. rtlsdr_write_reg(dev, USBB, USB_EPA_MAXPKT, 0x0002, 2);
  433. rtlsdr_write_reg(dev, USBB, USB_EPA_CTL, 0x1002, 2);
  434. /* poweron demod */
  435. rtlsdr_write_reg(dev, SYSB, DEMOD_CTL_1, 0x22, 1);
  436. rtlsdr_write_reg(dev, SYSB, DEMOD_CTL, 0xe8, 1);
  437. /* reset demod (bit 3, soft_rst) */
  438. rtlsdr_demod_write_reg(dev, 1, 0x01, 0x14, 1);
  439. rtlsdr_demod_write_reg(dev, 1, 0x01, 0x10, 1);
  440. /* disable spectrum inversion and adjacent channel rejection */
  441. rtlsdr_demod_write_reg(dev, 1, 0x15, 0x00, 1);
  442. rtlsdr_demod_write_reg(dev, 1, 0x16, 0x0000, 2);
  443. /* clear both DDC shift and IF frequency registers */
  444. for (i = 0; i < 6; i++)
  445. rtlsdr_demod_write_reg(dev, 1, 0x16 + i, 0x00, 1);
  446. /* set FIR coefficients */
  447. for (i = 0; i < sizeof (fir_coeff); i++)
  448. rtlsdr_demod_write_reg(dev, 1, 0x1c + i, fir_coeff[i], 1);
  449. /* enable SDR mode, disable DAGC (bit 5) */
  450. rtlsdr_demod_write_reg(dev, 0, 0x19, 0x05, 1);
  451. /* init FSM state-holding register */
  452. rtlsdr_demod_write_reg(dev, 1, 0x93, 0xf0, 1);
  453. rtlsdr_demod_write_reg(dev, 1, 0x94, 0x0f, 1);
  454. /* disable AGC (en_dagc, bit 0) (this seems to have no effect) */
  455. rtlsdr_demod_write_reg(dev, 1, 0x11, 0x00, 1);
  456. /* disable RF and IF AGC loop */
  457. rtlsdr_demod_write_reg(dev, 1, 0x04, 0x00, 1);
  458. /* disable PID filter (enable_PID = 0) */
  459. rtlsdr_demod_write_reg(dev, 0, 0x61, 0x60, 1);
  460. /* opt_adc_iq = 0, default ADC_I/ADC_Q datapath */
  461. rtlsdr_demod_write_reg(dev, 0, 0x06, 0x80, 1);
  462. /* Enable Zero-IF mode (en_bbin bit), DC cancellation (en_dc_est),
  463. * IQ estimation/compensation (en_iq_comp, en_iq_est) */
  464. rtlsdr_demod_write_reg(dev, 1, 0xb1, 0x1b, 1);
  465. /* disable 4.096 MHz clock output on pin TP_CK0 */
  466. rtlsdr_demod_write_reg(dev, 0, 0x0d, 0x83, 1);
  467. }
  468. int rtlsdr_deinit_baseband(rtlsdr_dev_t *dev)
  469. {
  470. int r = 0;
  471. if (!dev)
  472. return -1;
  473. if (dev->tuner && dev->tuner->exit) {
  474. rtlsdr_set_i2c_repeater(dev, 1);
  475. r = dev->tuner->exit(dev); /* deinitialize tuner */
  476. rtlsdr_set_i2c_repeater(dev, 0);
  477. }
  478. /* poweroff demodulator and ADCs */
  479. rtlsdr_write_reg(dev, SYSB, DEMOD_CTL, 0x20, 1);
  480. return r;
  481. }
  482. int rtlsdr_set_if_freq(rtlsdr_dev_t *dev, uint32_t freq)
  483. {
  484. uint32_t rtl_xtal;
  485. int32_t if_freq;
  486. uint8_t tmp;
  487. int r;
  488. if (!dev)
  489. return -1;
  490. /* read corrected clock value */
  491. if (rtlsdr_get_xtal_freq(dev, &rtl_xtal, NULL))
  492. return -2;
  493. if_freq = ((freq * TWO_POW(22)) / rtl_xtal) * (-1);
  494. tmp = (if_freq >> 16) & 0x3f;
  495. r = rtlsdr_demod_write_reg(dev, 1, 0x19, tmp, 1);
  496. tmp = (if_freq >> 8) & 0xff;
  497. r |= rtlsdr_demod_write_reg(dev, 1, 0x1a, tmp, 1);
  498. tmp = if_freq & 0xff;
  499. r |= rtlsdr_demod_write_reg(dev, 1, 0x1b, tmp, 1);
  500. return r;
  501. }
  502. int rtlsdr_set_sample_freq_correction(rtlsdr_dev_t *dev, int ppm)
  503. {
  504. int r = 0;
  505. uint8_t tmp;
  506. int16_t offs = ppm * (-1) * TWO_POW(24) / 1000000;
  507. tmp = offs & 0xff;
  508. r |= rtlsdr_demod_write_reg(dev, 1, 0x3f, tmp, 1);
  509. tmp = (offs >> 8) & 0x3f;
  510. r |= rtlsdr_demod_write_reg(dev, 1, 0x3e, tmp, 1);
  511. return r;
  512. }
  513. int rtlsdr_set_xtal_freq(rtlsdr_dev_t *dev, uint32_t rtl_freq, uint32_t tuner_freq)
  514. {
  515. int r = 0;
  516. if (!dev)
  517. return -1;
  518. if (rtl_freq > 0 &&
  519. (rtl_freq < MIN_RTL_XTAL_FREQ || rtl_freq > MAX_RTL_XTAL_FREQ))
  520. return -2;
  521. if (rtl_freq > 0 && dev->rtl_xtal != rtl_freq) {
  522. dev->rtl_xtal = rtl_freq;
  523. /* update xtal-dependent settings */
  524. if (dev->rate)
  525. r = rtlsdr_set_sample_rate(dev, dev->rate);
  526. }
  527. if (dev->tun_xtal != tuner_freq) {
  528. if (0 == tuner_freq)
  529. dev->tun_xtal = dev->rtl_xtal;
  530. else
  531. dev->tun_xtal = tuner_freq;
  532. /* read corrected clock value into e4k structure */
  533. if (rtlsdr_get_xtal_freq(dev, NULL, &dev->e4k_s.vco.fosc))
  534. return -3;
  535. /* update xtal-dependent settings */
  536. if (dev->freq)
  537. r = rtlsdr_set_center_freq(dev, dev->freq);
  538. }
  539. return r;
  540. }
  541. int rtlsdr_get_xtal_freq(rtlsdr_dev_t *dev, uint32_t *rtl_freq, uint32_t *tuner_freq)
  542. {
  543. if (!dev)
  544. return -1;
  545. #define APPLY_PPM_CORR(val,ppm) (((val) * (1.0 + (ppm) / 1e6)))
  546. if (rtl_freq)
  547. *rtl_freq = (uint32_t) APPLY_PPM_CORR(dev->rtl_xtal, dev->corr);
  548. if (tuner_freq)
  549. *tuner_freq = (uint32_t) APPLY_PPM_CORR(dev->tun_xtal, dev->corr);
  550. return 0;
  551. }
  552. int rtlsdr_get_usb_strings(rtlsdr_dev_t *dev, char *manufact, char *product,
  553. char *serial)
  554. {
  555. struct libusb_device_descriptor dd;
  556. libusb_device *device = NULL;
  557. const int buf_max = 256;
  558. int r = 0;
  559. if (!dev || !dev->devh)
  560. return -1;
  561. device = libusb_get_device(dev->devh);
  562. r = libusb_get_device_descriptor(device, &dd);
  563. if (r < 0)
  564. return -1;
  565. if (manufact) {
  566. memset(manufact, 0, buf_max);
  567. libusb_get_string_descriptor_ascii(dev->devh, dd.iManufacturer,
  568. (unsigned char *)manufact,
  569. buf_max);
  570. }
  571. if (product) {
  572. memset(product, 0, buf_max);
  573. libusb_get_string_descriptor_ascii(dev->devh, dd.iProduct,
  574. (unsigned char *)product,
  575. buf_max);
  576. }
  577. if (serial) {
  578. memset(serial, 0, buf_max);
  579. libusb_get_string_descriptor_ascii(dev->devh, dd.iSerialNumber,
  580. (unsigned char *)serial,
  581. buf_max);
  582. }
  583. return 0;
  584. }
  585. int rtlsdr_write_eeprom(rtlsdr_dev_t *dev, uint8_t *data, uint8_t offset, uint16_t len)
  586. {
  587. int r = 0;
  588. int i;
  589. uint8_t cmd[2];
  590. if (!dev)
  591. return -1;
  592. if ((len + offset) > 256)
  593. return -2;
  594. for (i = 0; i < len; i++) {
  595. cmd[0] = i + offset;
  596. r = rtlsdr_write_array(dev, IICB, EEPROM_ADDR, cmd, 1);
  597. r = rtlsdr_read_array(dev, IICB, EEPROM_ADDR, &cmd[1], 1);
  598. /* only write the byte if it differs */
  599. if (cmd[1] == data[i])
  600. continue;
  601. cmd[1] = data[i];
  602. r = rtlsdr_write_array(dev, IICB, EEPROM_ADDR, cmd, 2);
  603. if (r != sizeof(cmd))
  604. return -3;
  605. /* for some EEPROMs (e.g. ATC 240LC02) we need a delay
  606. * between write operations, otherwise they will fail */
  607. #ifdef _WIN32
  608. Sleep(5);
  609. #else
  610. usleep(5000);
  611. #endif
  612. }
  613. return 0;
  614. }
  615. int rtlsdr_read_eeprom(rtlsdr_dev_t *dev, uint8_t *data, uint8_t offset, uint16_t len)
  616. {
  617. int r = 0;
  618. int i;
  619. if (!dev)
  620. return -1;
  621. if ((len + offset) > 256)
  622. return -2;
  623. r = rtlsdr_write_array(dev, IICB, EEPROM_ADDR, &offset, 1);
  624. if (r < 0)
  625. return -3;
  626. for (i = 0; i < len; i++) {
  627. r = rtlsdr_read_array(dev, IICB, EEPROM_ADDR, data + i, 1);
  628. if (r < 0)
  629. return -3;
  630. }
  631. return r;
  632. }
  633. int rtlsdr_set_center_freq(rtlsdr_dev_t *dev, uint32_t freq)
  634. {
  635. int r = -1;
  636. if (!dev || !dev->tuner)
  637. return -1;
  638. if (dev->direct_sampling) {
  639. r = rtlsdr_set_if_freq(dev, freq);
  640. } else if (dev->tuner && dev->tuner->set_freq) {
  641. rtlsdr_set_i2c_repeater(dev, 1);
  642. r = dev->tuner->set_freq(dev, freq - dev->offs_freq);
  643. rtlsdr_set_i2c_repeater(dev, 0);
  644. }
  645. if (!r)
  646. dev->freq = freq;
  647. else
  648. dev->freq = 0;
  649. return r;
  650. }
  651. uint32_t rtlsdr_get_center_freq(rtlsdr_dev_t *dev)
  652. {
  653. if (!dev)
  654. return 0;
  655. return dev->freq;
  656. }
  657. int rtlsdr_set_freq_correction(rtlsdr_dev_t *dev, int ppm)
  658. {
  659. int r = 0;
  660. if (!dev)
  661. return -1;
  662. if (dev->corr == ppm)
  663. return -2;
  664. dev->corr = ppm;
  665. r |= rtlsdr_set_sample_freq_correction(dev, ppm);
  666. /* read corrected clock value into e4k structure */
  667. if (rtlsdr_get_xtal_freq(dev, NULL, &dev->e4k_s.vco.fosc))
  668. return -3;
  669. if (dev->freq) /* retune to apply new correction value */
  670. r |= rtlsdr_set_center_freq(dev, dev->freq);
  671. return r;
  672. }
  673. int rtlsdr_get_freq_correction(rtlsdr_dev_t *dev)
  674. {
  675. if (!dev)
  676. return 0;
  677. return dev->corr;
  678. }
  679. enum rtlsdr_tuner rtlsdr_get_tuner_type(rtlsdr_dev_t *dev)
  680. {
  681. if (!dev)
  682. return RTLSDR_TUNER_UNKNOWN;
  683. return dev->tuner_type;
  684. }
  685. int rtlsdr_get_tuner_gains(rtlsdr_dev_t *dev, int *gains)
  686. {
  687. /* all gain values are expressed in tenths of a dB */
  688. const int e4k_gains[] = { -10, 15, 40, 65, 90, 115, 140, 165, 190, 215,
  689. 240, 290, 340, 420 };
  690. const int fc0012_gains[] = { -99, -40, 71, 179, 192 };
  691. const int fc0013_gains[] = { -99, -73, -65, -63, -60, -58, -54, 58, 61,
  692. 63, 65, 67, 68, 70, 71, 179, 181, 182,
  693. 184, 186, 188, 191, 197 };
  694. const int fc2580_gains[] = { 0 /* no gain values */ };
  695. const int r820t_gains[] = { 0, 9, 14, 27, 37, 77, 87, 125, 144, 157,
  696. 166, 197, 207, 229, 254, 280, 297, 328,
  697. 338, 364, 372, 386, 402, 421, 434, 439,
  698. 445, 480, 496 };
  699. const int unknown_gains[] = { 0 /* no gain values */ };
  700. const int *ptr = NULL;
  701. int len = 0;
  702. if (!dev)
  703. return -1;
  704. switch (dev->tuner_type) {
  705. case RTLSDR_TUNER_E4000:
  706. ptr = e4k_gains; len = sizeof(e4k_gains);
  707. break;
  708. case RTLSDR_TUNER_FC0012:
  709. ptr = fc0012_gains; len = sizeof(fc0012_gains);
  710. break;
  711. case RTLSDR_TUNER_FC0013:
  712. ptr = fc0013_gains; len = sizeof(fc0013_gains);
  713. break;
  714. case RTLSDR_TUNER_FC2580:
  715. ptr = fc2580_gains; len = sizeof(fc2580_gains);
  716. break;
  717. case RTLSDR_TUNER_R820T:
  718. ptr = r820t_gains; len = sizeof(r820t_gains);
  719. break;
  720. default:
  721. ptr = unknown_gains; len = sizeof(unknown_gains);
  722. break;
  723. }
  724. if (!gains) { /* no buffer provided, just return the count */
  725. return len / sizeof(int);
  726. } else {
  727. if (len)
  728. memcpy(gains, ptr, len);
  729. return len / sizeof(int);
  730. }
  731. }
  732. int rtlsdr_set_tuner_gain(rtlsdr_dev_t *dev, int gain)
  733. {
  734. int r = 0;
  735. if (!dev || !dev->tuner)
  736. return -1;
  737. if (dev->tuner->set_gain) {
  738. rtlsdr_set_i2c_repeater(dev, 1);
  739. r = dev->tuner->set_gain((void *)dev, gain);
  740. rtlsdr_set_i2c_repeater(dev, 0);
  741. }
  742. if (!r)
  743. dev->gain = gain;
  744. else
  745. dev->gain = 0;
  746. return r;
  747. }
  748. int rtlsdr_get_tuner_gain(rtlsdr_dev_t *dev)
  749. {
  750. if (!dev)
  751. return 0;
  752. return dev->gain;
  753. }
  754. int rtlsdr_set_tuner_if_gain(rtlsdr_dev_t *dev, int stage, int gain)
  755. {
  756. int r = 0;
  757. if (!dev || !dev->tuner)
  758. return -1;
  759. if (dev->tuner->set_if_gain) {
  760. rtlsdr_set_i2c_repeater(dev, 1);
  761. r = dev->tuner->set_if_gain(dev, stage, gain);
  762. rtlsdr_set_i2c_repeater(dev, 0);
  763. }
  764. return r;
  765. }
  766. int rtlsdr_set_tuner_gain_mode(rtlsdr_dev_t *dev, int mode)
  767. {
  768. int r = 0;
  769. if (!dev || !dev->tuner)
  770. return -1;
  771. if (dev->tuner->set_gain_mode) {
  772. rtlsdr_set_i2c_repeater(dev, 1);
  773. r = dev->tuner->set_gain_mode((void *)dev, mode);
  774. rtlsdr_set_i2c_repeater(dev, 0);
  775. }
  776. return r;
  777. }
  778. int rtlsdr_set_sample_rate(rtlsdr_dev_t *dev, uint32_t samp_rate)
  779. {
  780. int r = 0;
  781. uint16_t tmp;
  782. uint32_t rsamp_ratio;
  783. double real_rate;
  784. uint32_t rtl_freq = dev->rtl_xtal;
  785. if (!dev)
  786. return -1;
  787. /* check for the maximum rate the resampler supports */
  788. if (samp_rate > MAX_SAMP_RATE)
  789. samp_rate = MAX_SAMP_RATE;
  790. rsamp_ratio = (rtl_freq * TWO_POW(22)) / samp_rate;
  791. rsamp_ratio &= ~3;
  792. real_rate = (rtl_freq * TWO_POW(22)) / rsamp_ratio;
  793. if ( ((double)samp_rate) != real_rate )
  794. fprintf(stderr, "Exact sample rate is: %f Hz\n", real_rate);
  795. if (dev->tuner && dev->tuner->set_bw) {
  796. rtlsdr_set_i2c_repeater(dev, 1);
  797. dev->tuner->set_bw(dev, (int)real_rate);
  798. rtlsdr_set_i2c_repeater(dev, 0);
  799. }
  800. dev->rate = (uint32_t)real_rate;
  801. tmp = (rsamp_ratio >> 16);
  802. r |= rtlsdr_demod_write_reg(dev, 1, 0x9f, tmp, 2);
  803. tmp = rsamp_ratio & 0xffff;
  804. r |= rtlsdr_demod_write_reg(dev, 1, 0xa1, tmp, 2);
  805. r |= rtlsdr_set_sample_freq_correction(dev, dev->corr);
  806. /* reset demod (bit 3, soft_rst) */
  807. r |= rtlsdr_demod_write_reg(dev, 1, 0x01, 0x14, 1);
  808. r |= rtlsdr_demod_write_reg(dev, 1, 0x01, 0x10, 1);
  809. /* recalculate offset frequency if offset tuning is enabled */
  810. if (dev->offs_freq)
  811. rtlsdr_set_offset_tuning(dev, 1);
  812. return r;
  813. }
  814. uint32_t rtlsdr_get_sample_rate(rtlsdr_dev_t *dev)
  815. {
  816. if (!dev)
  817. return 0;
  818. return dev->rate;
  819. }
  820. int rtlsdr_set_testmode(rtlsdr_dev_t *dev, int on)
  821. {
  822. if (!dev)
  823. return -1;
  824. return rtlsdr_demod_write_reg(dev, 0, 0x19, on ? 0x03 : 0x05, 1);
  825. }
  826. int rtlsdr_set_agc_mode(rtlsdr_dev_t *dev, int on)
  827. {
  828. if (!dev)
  829. return -1;
  830. return rtlsdr_demod_write_reg(dev, 0, 0x19, on ? 0x25 : 0x05, 1);
  831. }
  832. int rtlsdr_set_direct_sampling(rtlsdr_dev_t *dev, int on)
  833. {
  834. int r = 0;
  835. if (!dev)
  836. return -1;
  837. if (on) {
  838. if (dev->tuner && dev->tuner->exit) {
  839. rtlsdr_set_i2c_repeater(dev, 1);
  840. r = dev->tuner->exit(dev);
  841. rtlsdr_set_i2c_repeater(dev, 0);
  842. }
  843. /* disable Zero-IF mode */
  844. r |= rtlsdr_demod_write_reg(dev, 1, 0xb1, 0x1a, 1);
  845. /* disable spectrum inversion */
  846. r |= rtlsdr_demod_write_reg(dev, 1, 0x15, 0x00, 1);
  847. /* only enable In-phase ADC input */
  848. r |= rtlsdr_demod_write_reg(dev, 0, 0x08, 0x4d, 1);
  849. /* swap I and Q ADC, this allows to select between two inputs */
  850. r |= rtlsdr_demod_write_reg(dev, 0, 0x06, (on > 1) ? 0x90 : 0x80, 1);
  851. fprintf(stderr, "Enabled direct sampling mode, input %i\n", on);
  852. dev->direct_sampling = on;
  853. } else {
  854. if (dev->tuner && dev->tuner->init) {
  855. rtlsdr_set_i2c_repeater(dev, 1);
  856. r |= dev->tuner->init(dev);
  857. rtlsdr_set_i2c_repeater(dev, 0);
  858. }
  859. if (dev->tuner_type == RTLSDR_TUNER_R820T) {
  860. r |= rtlsdr_set_if_freq(dev, R820T_IF_FREQ);
  861. /* enable spectrum inversion */
  862. r |= rtlsdr_demod_write_reg(dev, 1, 0x15, 0x01, 1);
  863. } else {
  864. r |= rtlsdr_set_if_freq(dev, 0);
  865. /* enable In-phase + Quadrature ADC input */
  866. r |= rtlsdr_demod_write_reg(dev, 0, 0x08, 0xcd, 1);
  867. /* Enable Zero-IF mode */
  868. r |= rtlsdr_demod_write_reg(dev, 1, 0xb1, 0x1b, 1);
  869. }
  870. /* opt_adc_iq = 0, default ADC_I/ADC_Q datapath */
  871. r |= rtlsdr_demod_write_reg(dev, 0, 0x06, 0x80, 1);
  872. fprintf(stderr, "Disabled direct sampling mode\n");
  873. dev->direct_sampling = 0;
  874. }
  875. r |= rtlsdr_set_center_freq(dev, dev->freq);
  876. return r;
  877. }
  878. int rtlsdr_get_direct_sampling(rtlsdr_dev_t *dev)
  879. {
  880. if (!dev)
  881. return -1;
  882. return dev->direct_sampling;
  883. }
  884. int rtlsdr_set_offset_tuning(rtlsdr_dev_t *dev, int on)
  885. {
  886. int r = 0;
  887. if (!dev)
  888. return -1;
  889. if (dev->tuner_type == RTLSDR_TUNER_R820T)
  890. return -2;
  891. if (dev->direct_sampling)
  892. return -3;
  893. /* based on keenerds 1/f noise measurements */
  894. dev->offs_freq = on ? ((dev->rate / 2) * 170 / 100) : 0;
  895. r |= rtlsdr_set_if_freq(dev, dev->offs_freq);
  896. if (dev->tuner && dev->tuner->set_bw) {
  897. rtlsdr_set_i2c_repeater(dev, 1);
  898. dev->tuner->set_bw(dev, on ? (2 * dev->offs_freq) : dev->rate);
  899. rtlsdr_set_i2c_repeater(dev, 0);
  900. }
  901. if (dev->freq > dev->offs_freq)
  902. r |= rtlsdr_set_center_freq(dev, dev->freq);
  903. return r;
  904. }
  905. int rtlsdr_get_offset_tuning(rtlsdr_dev_t *dev)
  906. {
  907. if (!dev)
  908. return -1;
  909. return (dev->offs_freq) ? 1 : 0;
  910. }
  911. static rtlsdr_dongle_t *find_known_device(uint16_t vid, uint16_t pid)
  912. {
  913. unsigned int i;
  914. rtlsdr_dongle_t *device = NULL;
  915. for (i = 0; i < sizeof(known_devices)/sizeof(rtlsdr_dongle_t); i++ ) {
  916. if (known_devices[i].vid == vid && known_devices[i].pid == pid) {
  917. device = &known_devices[i];
  918. break;
  919. }
  920. }
  921. return device;
  922. }
  923. uint32_t rtlsdr_get_device_count(void)
  924. {
  925. int i;
  926. libusb_context *ctx;
  927. libusb_device **list;
  928. uint32_t device_count = 0;
  929. struct libusb_device_descriptor dd;
  930. ssize_t cnt;
  931. libusb_init(&ctx);
  932. cnt = libusb_get_device_list(ctx, &list);
  933. for (i = 0; i < cnt; i++) {
  934. libusb_get_device_descriptor(list[i], &dd);
  935. if (find_known_device(dd.idVendor, dd.idProduct))
  936. device_count++;
  937. }
  938. libusb_free_device_list(list, 1);
  939. libusb_exit(ctx);
  940. return device_count;
  941. }
  942. const char *rtlsdr_get_device_name(uint32_t index)
  943. {
  944. int i;
  945. libusb_context *ctx;
  946. libusb_device **list;
  947. struct libusb_device_descriptor dd;
  948. rtlsdr_dongle_t *device = NULL;
  949. uint32_t device_count = 0;
  950. ssize_t cnt;
  951. libusb_init(&ctx);
  952. cnt = libusb_get_device_list(ctx, &list);
  953. for (i = 0; i < cnt; i++) {
  954. libusb_get_device_descriptor(list[i], &dd);
  955. device = find_known_device(dd.idVendor, dd.idProduct);
  956. if (device) {
  957. device_count++;
  958. if (index == device_count - 1)
  959. break;
  960. }
  961. }
  962. libusb_free_device_list(list, 1);
  963. libusb_exit(ctx);
  964. if (device)
  965. return device->name;
  966. else
  967. return "";
  968. }
  969. int rtlsdr_get_device_usb_strings(uint32_t index, char *manufact,
  970. char *product, char *serial)
  971. {
  972. int r = -2;
  973. int i;
  974. libusb_context *ctx;
  975. libusb_device **list;
  976. struct libusb_device_descriptor dd;
  977. rtlsdr_dongle_t *device = NULL;
  978. rtlsdr_dev_t devt;
  979. uint32_t device_count = 0;
  980. ssize_t cnt;
  981. libusb_init(&ctx);
  982. cnt = libusb_get_device_list(ctx, &list);
  983. for (i = 0; i < cnt; i++) {
  984. libusb_get_device_descriptor(list[i], &dd);
  985. device = find_known_device(dd.idVendor, dd.idProduct);
  986. if (device) {
  987. device_count++;
  988. if (index == device_count - 1) {
  989. r = libusb_open(list[i], &devt.devh);
  990. if (!r) {
  991. r = rtlsdr_get_usb_strings(&devt,
  992. manufact,
  993. product,
  994. serial);
  995. libusb_close(devt.devh);
  996. }
  997. break;
  998. }
  999. }
  1000. }
  1001. libusb_free_device_list(list, 1);
  1002. libusb_exit(ctx);
  1003. return r;
  1004. }
  1005. int rtlsdr_get_index_by_serial(const char *serial)
  1006. {
  1007. int i, cnt, r;
  1008. char str[256];
  1009. if (!serial)
  1010. return -1;
  1011. cnt = rtlsdr_get_device_count();
  1012. if (!cnt)
  1013. return -2;
  1014. for (i = 0; i < cnt; i++) {
  1015. r = rtlsdr_get_device_usb_strings(i, NULL, NULL, str);
  1016. if (!r && !strcmp(serial, str))
  1017. return i;
  1018. }
  1019. return -3;
  1020. }
  1021. int rtlsdr_open(rtlsdr_dev_t **out_dev, uint32_t index)
  1022. {
  1023. int r;
  1024. int i;
  1025. libusb_device **list;
  1026. rtlsdr_dev_t *dev = NULL;
  1027. libusb_device *device = NULL;
  1028. uint32_t device_count = 0;
  1029. struct libusb_device_descriptor dd;
  1030. uint8_t reg;
  1031. ssize_t cnt;
  1032. dev = malloc(sizeof(rtlsdr_dev_t));
  1033. if (NULL == dev)
  1034. return -ENOMEM;
  1035. memset(dev, 0, sizeof(rtlsdr_dev_t));
  1036. libusb_init(&dev->ctx);
  1037. cnt = libusb_get_device_list(dev->ctx, &list);
  1038. for (i = 0; i < cnt; i++) {
  1039. device = list[i];
  1040. libusb_get_device_descriptor(list[i], &dd);
  1041. if (find_known_device(dd.idVendor, dd.idProduct)) {
  1042. device_count++;
  1043. }
  1044. if (index == device_count - 1)
  1045. break;
  1046. device = NULL;
  1047. }
  1048. if (!device) {
  1049. r = -1;
  1050. goto err;
  1051. }
  1052. r = libusb_open(device, &dev->devh);
  1053. if (r < 0) {
  1054. libusb_free_device_list(list, 1);
  1055. fprintf(stderr, "usb_open error %d\n", r);
  1056. goto err;
  1057. }
  1058. libusb_free_device_list(list, 1);
  1059. r = libusb_claim_interface(dev->devh, 0);
  1060. if (r < 0) {
  1061. fprintf(stderr, "usb_claim_interface error %d\n", r);
  1062. goto err;
  1063. }
  1064. dev->rtl_xtal = DEF_RTL_XTAL_FREQ;
  1065. rtlsdr_init_baseband(dev);
  1066. /* Probe tuners */
  1067. rtlsdr_set_i2c_repeater(dev, 1);
  1068. reg = rtlsdr_i2c_read_reg(dev, E4K_I2C_ADDR, E4K_CHECK_ADDR);
  1069. if (reg == E4K_CHECK_VAL) {
  1070. fprintf(stderr, "Found Elonics E4000 tuner\n");
  1071. dev->tuner_type = RTLSDR_TUNER_E4000;
  1072. goto found;
  1073. }
  1074. reg = rtlsdr_i2c_read_reg(dev, FC0013_I2C_ADDR, FC0013_CHECK_ADDR);
  1075. if (reg == FC0013_CHECK_VAL) {
  1076. fprintf(stderr, "Found Fitipower FC0013 tuner\n");
  1077. dev->tuner_type = RTLSDR_TUNER_FC0013;
  1078. goto found;
  1079. }
  1080. reg = rtlsdr_i2c_read_reg(dev, R820T_I2C_ADDR, R820T_CHECK_ADDR);
  1081. if (reg == R820T_CHECK_VAL) {
  1082. fprintf(stderr, "Found Rafael Micro R820T tuner\n");
  1083. dev->tuner_type = RTLSDR_TUNER_R820T;
  1084. /* disable Zero-IF mode */
  1085. rtlsdr_demod_write_reg(dev, 1, 0xb1, 0x1a, 1);
  1086. /* only enable In-phase ADC input */
  1087. rtlsdr_demod_write_reg(dev, 0, 0x08, 0x4d, 1);
  1088. /* the R820T uses 3.57 MHz IF for the DVB-T 6 MHz mode, and
  1089. * 4.57 MHz for the 8 MHz mode */
  1090. rtlsdr_set_if_freq(dev, R820T_IF_FREQ);
  1091. /* enable spectrum inversion */
  1092. rtlsdr_demod_write_reg(dev, 1, 0x15, 0x01, 1);
  1093. goto found;
  1094. }
  1095. /* initialise GPIOs */
  1096. rtlsdr_set_gpio_output(dev, 5);
  1097. /* reset tuner before probing */
  1098. rtlsdr_set_gpio_bit(dev, 5, 1);
  1099. rtlsdr_set_gpio_bit(dev, 5, 0);
  1100. reg = rtlsdr_i2c_read_reg(dev, FC2580_I2C_ADDR, FC2580_CHECK_ADDR);
  1101. if ((reg & 0x7f) == FC2580_CHECK_VAL) {
  1102. fprintf(stderr, "Found FCI 2580 tuner\n");
  1103. dev->tuner_type = RTLSDR_TUNER_FC2580;
  1104. goto found;
  1105. }
  1106. reg = rtlsdr_i2c_read_reg(dev, FC0012_I2C_ADDR, FC0012_CHECK_ADDR);
  1107. if (reg == FC0012_CHECK_VAL) {
  1108. fprintf(stderr, "Found Fitipower FC0012 tuner\n");
  1109. rtlsdr_set_gpio_output(dev, 6);
  1110. dev->tuner_type = RTLSDR_TUNER_FC0012;
  1111. goto found;
  1112. }
  1113. found:
  1114. if (dev->tuner_type == RTLSDR_TUNER_UNKNOWN) {
  1115. fprintf(stderr, "No supported tuner found\n");
  1116. rtlsdr_set_direct_sampling(dev, 1);
  1117. }
  1118. dev->tuner = &tuners[dev->tuner_type];
  1119. dev->tun_xtal = dev->rtl_xtal; /* use the rtl clock value by default */
  1120. if (dev->tuner->init)
  1121. r = dev->tuner->init(dev);
  1122. rtlsdr_set_i2c_repeater(dev, 0);
  1123. *out_dev = dev;
  1124. return 0;
  1125. err:
  1126. if (dev) {
  1127. if (dev->ctx)
  1128. libusb_exit(dev->ctx);
  1129. free(dev);
  1130. }
  1131. return r;
  1132. }
  1133. int rtlsdr_close(rtlsdr_dev_t *dev)
  1134. {
  1135. if (!dev)
  1136. return -1;
  1137. /* block until all async operations have been completed (if any) */
  1138. while (RTLSDR_INACTIVE != dev->async_status) {
  1139. #ifdef _WIN32
  1140. Sleep(1);
  1141. #else
  1142. usleep(1000);
  1143. #endif
  1144. }
  1145. rtlsdr_deinit_baseband(dev);
  1146. libusb_release_interface(dev->devh, 0);
  1147. libusb_close(dev->devh);
  1148. libusb_exit(dev->ctx);
  1149. free(dev);
  1150. return 0;
  1151. }
  1152. int rtlsdr_reset_buffer(rtlsdr_dev_t *dev)
  1153. {
  1154. if (!dev)
  1155. return -1;
  1156. rtlsdr_write_reg(dev, USBB, USB_EPA_CTL, 0x1002, 2);
  1157. rtlsdr_write_reg(dev, USBB, USB_EPA_CTL, 0x0000, 2);
  1158. return 0;
  1159. }
  1160. int rtlsdr_read_sync(rtlsdr_dev_t *dev, void *buf, int len, int *n_read)
  1161. {
  1162. if (!dev)
  1163. return -1;
  1164. return libusb_bulk_transfer(dev->devh, 0x81, buf, len, n_read, BULK_TIMEOUT);
  1165. }
  1166. static void LIBUSB_CALL _libusb_callback(struct libusb_transfer *xfer)
  1167. {
  1168. rtlsdr_dev_t *dev = (rtlsdr_dev_t *)xfer->user_data;
  1169. if (LIBUSB_TRANSFER_COMPLETED == xfer->status) {
  1170. if (dev->cb)
  1171. dev->cb(xfer->buffer, xfer->actual_length, dev->cb_ctx);
  1172. libusb_submit_transfer(xfer); /* resubmit transfer */
  1173. } else if (LIBUSB_TRANSFER_CANCELLED == xfer->status) {
  1174. /* nothing to do */
  1175. } else {
  1176. /*fprintf(stderr, "transfer status: %d\n", xfer->status);*/
  1177. }
  1178. }
  1179. int rtlsdr_wait_async(rtlsdr_dev_t *dev, rtlsdr_read_async_cb_t cb, void *ctx)
  1180. {
  1181. return rtlsdr_read_async(dev, cb, ctx, 0, 0);
  1182. }
  1183. static int _rtlsdr_alloc_async_buffers(rtlsdr_dev_t *dev)
  1184. {
  1185. unsigned int i;
  1186. if (!dev)
  1187. return -1;
  1188. if (!dev->xfer) {
  1189. dev->xfer = malloc(dev->xfer_buf_num *
  1190. sizeof(struct libusb_transfer *));
  1191. for(i = 0; i < dev->xfer_buf_num; ++i)
  1192. dev->xfer[i] = libusb_alloc_transfer(0);
  1193. }
  1194. if (!dev->xfer_buf) {
  1195. dev->xfer_buf = malloc(dev->xfer_buf_num *
  1196. sizeof(unsigned char *));
  1197. for(i = 0; i < dev->xfer_buf_num; ++i)
  1198. dev->xfer_buf[i] = malloc(dev->xfer_buf_len);
  1199. }
  1200. return 0;
  1201. }
  1202. static int _rtlsdr_free_async_buffers(rtlsdr_dev_t *dev)
  1203. {
  1204. unsigned int i;
  1205. if (!dev)
  1206. return -1;
  1207. if (dev->xfer) {
  1208. for(i = 0; i < dev->xfer_buf_num; ++i) {
  1209. if (dev->xfer[i]) {
  1210. libusb_free_transfer(dev->xfer[i]);
  1211. }
  1212. }
  1213. free(dev->xfer);
  1214. dev->xfer = NULL;
  1215. }
  1216. if (dev->xfer_buf) {
  1217. for(i = 0; i < dev->xfer_buf_num; ++i) {
  1218. if (dev->xfer_buf[i])
  1219. free(dev->xfer_buf[i]);
  1220. }
  1221. free(dev->xfer_buf);
  1222. dev->xfer_buf = NULL;
  1223. }
  1224. return 0;
  1225. }
  1226. int rtlsdr_read_async(rtlsdr_dev_t *dev, rtlsdr_read_async_cb_t cb, void *ctx,
  1227. uint32_t buf_num, uint32_t buf_len)
  1228. {
  1229. unsigned int i;
  1230. int r = 0;
  1231. struct timeval tv = { 1, 0 };
  1232. enum rtlsdr_async_status next_status = RTLSDR_INACTIVE;
  1233. if (!dev)
  1234. return -1;
  1235. if (RTLSDR_INACTIVE != dev->async_status)
  1236. return -2;
  1237. dev->async_status = RTLSDR_RUNNING;
  1238. dev->cb = cb;
  1239. dev->cb_ctx = ctx;
  1240. if (buf_num > 0)
  1241. dev->xfer_buf_num = buf_num;
  1242. else
  1243. dev->xfer_buf_num = DEFAULT_BUF_NUMBER;
  1244. if (buf_len > 0 && buf_len % 512 == 0) /* len must be multiple of 512 */
  1245. dev->xfer_buf_len = buf_len;
  1246. else
  1247. dev->xfer_buf_len = DEFAULT_BUF_LENGTH;
  1248. _rtlsdr_alloc_async_buffers(dev);
  1249. for(i = 0; i < dev->xfer_buf_num; ++i) {
  1250. libusb_fill_bulk_transfer(dev->xfer[i],
  1251. dev->devh,
  1252. 0x81,
  1253. dev->xfer_buf[i],
  1254. dev->xfer_buf_len,
  1255. _libusb_callback,
  1256. (void *)dev,
  1257. BULK_TIMEOUT);
  1258. libusb_submit_transfer(dev->xfer[i]);
  1259. }
  1260. while (RTLSDR_INACTIVE != dev->async_status) {
  1261. r = libusb_handle_events_timeout(dev->ctx, &tv);
  1262. if (r < 0) {
  1263. /*fprintf(stderr, "handle_events returned: %d\n", r);*/
  1264. if (r == LIBUSB_ERROR_INTERRUPTED) /* stray signal */
  1265. continue;
  1266. break;
  1267. }
  1268. if (RTLSDR_CANCELING == dev->async_status) {
  1269. next_status = RTLSDR_INACTIVE;
  1270. if (!dev->xfer)
  1271. break;
  1272. for(i = 0; i < dev->xfer_buf_num; ++i) {
  1273. if (!dev->xfer[i])
  1274. continue;
  1275. if (LIBUSB_TRANSFER_CANCELLED !=
  1276. dev->xfer[i]->status) {
  1277. libusb_cancel_transfer(dev->xfer[i]);
  1278. next_status = RTLSDR_CANCELING;
  1279. }
  1280. }
  1281. if (RTLSDR_INACTIVE == next_status)
  1282. break;
  1283. }
  1284. }
  1285. _rtlsdr_free_async_buffers(dev);
  1286. dev->async_status = next_status;
  1287. return r;
  1288. }
  1289. int rtlsdr_cancel_async(rtlsdr_dev_t *dev)
  1290. {
  1291. if (!dev)
  1292. return -1;
  1293. /* if streaming, try to cancel gracefully */
  1294. if (RTLSDR_RUNNING == dev->async_status) {
  1295. dev->async_status = RTLSDR_CANCELING;
  1296. return 0;
  1297. }
  1298. /* if called while in pending state, change the state forcefully */
  1299. if (RTLSDR_INACTIVE != dev->async_status) {
  1300. dev->async_status = RTLSDR_INACTIVE;
  1301. return 0;
  1302. }
  1303. return -2;
  1304. }
  1305. uint32_t rtlsdr_get_tuner_clock(void *dev)
  1306. {
  1307. uint32_t tuner_freq;
  1308. if (!dev)
  1309. return 0;
  1310. /* read corrected clock value */
  1311. if (rtlsdr_get_xtal_freq((rtlsdr_dev_t *)dev, NULL, &tuner_freq))
  1312. return 0;
  1313. return tuner_freq;
  1314. }
  1315. int rtlsdr_i2c_write_fn(void *dev, uint8_t addr, uint8_t *buf, int len)
  1316. {
  1317. if (dev)
  1318. return rtlsdr_i2c_write(((rtlsdr_dev_t *)dev), addr, buf, len);
  1319. return -1;
  1320. }
  1321. int rtlsdr_i2c_read_fn(void *dev, uint8_t addr, uint8_t *buf, int len)
  1322. {
  1323. if (dev)
  1324. return rtlsdr_i2c_read(((rtlsdr_dev_t *)dev), addr, buf, len);
  1325. return -1;
  1326. }