@jtarrio/webrtlsdr 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/LICENSE +203 -0
  2. package/README.md +69 -0
  3. package/dist/audio/player.d.ts +24 -0
  4. package/dist/audio/player.d.ts.map +1 -0
  5. package/dist/audio/player.js +68 -0
  6. package/dist/audio/player.js.map +1 -0
  7. package/dist/demod/demodulator.d.ts +59 -0
  8. package/dist/demod/demodulator.d.ts.map +1 -0
  9. package/dist/demod/demodulator.js +150 -0
  10. package/dist/demod/demodulator.js.map +1 -0
  11. package/dist/demod/sample-counter.d.ts +18 -0
  12. package/dist/demod/sample-counter.d.ts.map +1 -0
  13. package/dist/demod/sample-counter.js +43 -0
  14. package/dist/demod/sample-counter.js.map +1 -0
  15. package/dist/demod/scheme-am.d.ts +32 -0
  16. package/dist/demod/scheme-am.d.ts.map +1 -0
  17. package/dist/demod/scheme-am.js +75 -0
  18. package/dist/demod/scheme-am.js.map +1 -0
  19. package/dist/demod/scheme-cw.d.ts +22 -0
  20. package/dist/demod/scheme-cw.d.ts.map +1 -0
  21. package/dist/demod/scheme-cw.js +68 -0
  22. package/dist/demod/scheme-cw.js.map +1 -0
  23. package/dist/demod/scheme-nbfm.d.ts +32 -0
  24. package/dist/demod/scheme-nbfm.d.ts.map +1 -0
  25. package/dist/demod/scheme-nbfm.js +76 -0
  26. package/dist/demod/scheme-nbfm.js.map +1 -0
  27. package/dist/demod/scheme-ssb.d.ts +33 -0
  28. package/dist/demod/scheme-ssb.d.ts.map +1 -0
  29. package/dist/demod/scheme-ssb.js +75 -0
  30. package/dist/demod/scheme-ssb.js.map +1 -0
  31. package/dist/demod/scheme-wbfm.d.ts +38 -0
  32. package/dist/demod/scheme-wbfm.d.ts.map +1 -0
  33. package/dist/demod/scheme-wbfm.js +106 -0
  34. package/dist/demod/scheme-wbfm.js.map +1 -0
  35. package/dist/demod/scheme.d.ts +78 -0
  36. package/dist/demod/scheme.d.ts.map +1 -0
  37. package/dist/demod/scheme.js +96 -0
  38. package/dist/demod/scheme.js.map +1 -0
  39. package/dist/demod/spectrum.d.ts +18 -0
  40. package/dist/demod/spectrum.d.ts.map +1 -0
  41. package/dist/demod/spectrum.js +76 -0
  42. package/dist/demod/spectrum.js.map +1 -0
  43. package/dist/dsp/buffers.d.ts +72 -0
  44. package/dist/dsp/buffers.d.ts.map +1 -0
  45. package/dist/dsp/buffers.js +109 -0
  46. package/dist/dsp/buffers.js.map +1 -0
  47. package/dist/dsp/coefficients.d.ts +22 -0
  48. package/dist/dsp/coefficients.d.ts.map +1 -0
  49. package/dist/dsp/coefficients.js +77 -0
  50. package/dist/dsp/coefficients.js.map +1 -0
  51. package/dist/dsp/converters.d.ts +15 -0
  52. package/dist/dsp/converters.d.ts.map +1 -0
  53. package/dist/dsp/converters.js +43 -0
  54. package/dist/dsp/converters.js.map +1 -0
  55. package/dist/dsp/demodulators.d.ts +72 -0
  56. package/dist/dsp/demodulators.d.ts.map +1 -0
  57. package/dist/dsp/demodulators.js +245 -0
  58. package/dist/dsp/demodulators.js.map +1 -0
  59. package/dist/dsp/fft.d.ts +53 -0
  60. package/dist/dsp/fft.d.ts.map +1 -0
  61. package/dist/dsp/fft.js +175 -0
  62. package/dist/dsp/fft.js.map +1 -0
  63. package/dist/dsp/filters.d.ts +91 -0
  64. package/dist/dsp/filters.d.ts.map +1 -0
  65. package/dist/dsp/filters.js +250 -0
  66. package/dist/dsp/filters.js.map +1 -0
  67. package/dist/dsp/power.d.ts +2 -0
  68. package/dist/dsp/power.d.ts.map +1 -0
  69. package/dist/dsp/power.js +10 -0
  70. package/dist/dsp/power.js.map +1 -0
  71. package/dist/dsp/resamplers.d.ts +33 -0
  72. package/dist/dsp/resamplers.d.ts.map +1 -0
  73. package/dist/dsp/resamplers.js +91 -0
  74. package/dist/dsp/resamplers.js.map +1 -0
  75. package/dist/errors.d.ts +19 -0
  76. package/dist/errors.d.ts.map +1 -0
  77. package/dist/errors.js +37 -0
  78. package/dist/errors.js.map +1 -0
  79. package/dist/radio/msgqueue.d.ts +23 -0
  80. package/dist/radio/msgqueue.d.ts.map +1 -0
  81. package/dist/radio/msgqueue.js +52 -0
  82. package/dist/radio/msgqueue.js.map +1 -0
  83. package/dist/radio/radio.d.ts +81 -0
  84. package/dist/radio/radio.d.ts.map +1 -0
  85. package/dist/radio/radio.js +305 -0
  86. package/dist/radio/radio.js.map +1 -0
  87. package/dist/radio/sample_receiver.d.ts +11 -0
  88. package/dist/radio/sample_receiver.d.ts.map +1 -0
  89. package/dist/radio/sample_receiver.js +49 -0
  90. package/dist/radio/sample_receiver.js.map +1 -0
  91. package/dist/rtlsdr/r820t.d.ts +18 -0
  92. package/dist/rtlsdr/r820t.d.ts.map +1 -0
  93. package/dist/rtlsdr/r820t.js +39 -0
  94. package/dist/rtlsdr/r820t.js.map +1 -0
  95. package/dist/rtlsdr/r828d.d.ts +28 -0
  96. package/dist/rtlsdr/r828d.d.ts.map +1 -0
  97. package/dist/rtlsdr/r828d.js +120 -0
  98. package/dist/rtlsdr/r828d.js.map +1 -0
  99. package/dist/rtlsdr/r8xx.d.ts +90 -0
  100. package/dist/rtlsdr/r8xx.d.ts.map +1 -0
  101. package/dist/rtlsdr/r8xx.js +468 -0
  102. package/dist/rtlsdr/r8xx.js.map +1 -0
  103. package/dist/rtlsdr/rtl2832u.d.ts +74 -0
  104. package/dist/rtlsdr/rtl2832u.d.ts.map +1 -0
  105. package/dist/rtlsdr/rtl2832u.js +342 -0
  106. package/dist/rtlsdr/rtl2832u.js.map +1 -0
  107. package/dist/rtlsdr/rtlcom.d.ts +144 -0
  108. package/dist/rtlsdr/rtlcom.d.ts.map +1 -0
  109. package/dist/rtlsdr/rtlcom.js +299 -0
  110. package/dist/rtlsdr/rtlcom.js.map +1 -0
  111. package/dist/rtlsdr/rtldevice.d.ts +53 -0
  112. package/dist/rtlsdr/rtldevice.d.ts.map +1 -0
  113. package/dist/rtlsdr/rtldevice.js +24 -0
  114. package/dist/rtlsdr/rtldevice.js.map +1 -0
  115. package/dist/rtlsdr/tuner.d.ts +20 -0
  116. package/dist/rtlsdr/tuner.d.ts.map +1 -0
  117. package/dist/rtlsdr/tuner.js +15 -0
  118. package/dist/rtlsdr/tuner.js.map +1 -0
  119. package/package.json +20 -0
@@ -0,0 +1,468 @@
1
+ // Copyright 2024 Jacobo Tarrio Barreiro. All rights reserved.
2
+ // Copyright 2013 Google Inc. All rights reserved.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ import { RadioError, RadioErrorType } from "../errors";
16
+ /** Standard configurations for the multiplexer in different frequency bands. */
17
+ export const STD_MUX_CFGS = [
18
+ [0, 0b1000, 0b00000010, 0b11011111],
19
+ [50, 0b1000, 0b00000010, 0b10111110],
20
+ [55, 0b1000, 0b00000010, 0b10001011],
21
+ [60, 0b1000, 0b00000010, 0b01111011],
22
+ [65, 0b1000, 0b00000010, 0b01101001],
23
+ [70, 0b1000, 0b00000010, 0b01011000],
24
+ [75, 0b0000, 0b00000010, 0b01000100],
25
+ [90, 0b0000, 0b00000010, 0b00110100],
26
+ [110, 0b0000, 0b00000010, 0b00100100],
27
+ [140, 0b0000, 0b00000010, 0b00010100],
28
+ [180, 0b0000, 0b00000010, 0b00010011],
29
+ [250, 0b0000, 0b00000010, 0b00010001],
30
+ [280, 0b0000, 0b00000010, 0b00000000],
31
+ [310, 0b0000, 0b01000001, 0b00000000],
32
+ [588, 0b0000, 0b01000000, 0b00000000],
33
+ // ^ ^^ ^^ ^^^^^^^^
34
+ // | || || ||||++++- LPF (0000: highest)
35
+ // | || || ++++- LPNF (0000: highest)
36
+ // | || ++- RF filter (00: high, 01: med, 10: low)
37
+ // | ++- tracking filter (01: bypass)
38
+ // +- open drain (1: low Z)
39
+ ];
40
+ /** Operations on R820/R828/R860 style tuner chips. */
41
+ export class R8xx {
42
+ com;
43
+ i2c;
44
+ muxCfgs;
45
+ vcoPowerRef;
46
+ /** Frequency of the oscillator crystal. */
47
+ static XTAL_FREQ = 28800000;
48
+ /** Initial values for registers 0x05-0x1f. */
49
+ static REGISTERS = [
50
+ // 0x05
51
+ // [7] loop through off [6] 0 [5] LNA 1 on [4] LNA gain auto [3:0] LNA gain 3
52
+ 0b10000011,
53
+ // [7] power detector 1 on [6] power detector 3 off [5] filter gain +3dB [4] 1 [3] 0 [2:0] LNA power 2
54
+ 0b00110010,
55
+ // [7] 0 [6] mixer power on [5] mixer current normal [4] mixer gain auto [3:0] mixer gain 5
56
+ 0b01110101,
57
+ // 0x08
58
+ // [7] mixer buffer power on [6] mixer buffer low current [5:0] image gain adjustment 0
59
+ 0b11000000,
60
+ // [7] IF filter off [6] IF filter low current [5:0] image phase adjustment 0
61
+ 0b01000000,
62
+ // [7] channel filter on [6:5] filter power 2 [4] 1 [3:0] filter bandwidth fine tune 6
63
+ 0b11010110,
64
+ // [7] 0 [6:5] filter bandwidth coarse tune 3 [4] 0 [3:0] high pass filter corner 12
65
+ 0b01101100,
66
+ // [7] 1 [6] VGA power on [5] 1 [4] VGA gain controlled by pin [3:0] VGA gain 5.5dB
67
+ 0b11110101,
68
+ // [7:4] LNA agc power detector threshold high 0.94V [3:0] LNA agc power detector threshold low 0.64V
69
+ 0b01100011,
70
+ // [7:4] Mixer agc power detector threshold high 1.04V [3:0] Mixer agd power detector threshold low 0.84V
71
+ 0b01110101,
72
+ // [7] 0 [6:5] LDO 3.0V [4] clock output off [3] 1 [2] 0 [1] internal agc clock on [0] 0
73
+ 0b01101000,
74
+ // 0x10
75
+ // [7:5] PLL to mixer divider 1:1 [4] PLL divider 1 [3] xtal swing low [2] 1 [1:0] Internal xtal cap (none)
76
+ 0b01101100,
77
+ // [7:6] PLL analog regulator 2.0V [5] 0 [4] 0 [3] 0 [2] 0 [1] 1 [0] 1
78
+ 0b10000011,
79
+ // [7] 1 [6:4] 0 [3] ? [2:0] 0
80
+ 0b10000000,
81
+ // [7:0] 0
82
+ 0b00000000,
83
+ // [7:6] SI2C = 0 [5:0] NI2C = 15
84
+ 0b00001111,
85
+ // [7:0] SDM_IN[16:9]
86
+ 0b00000000,
87
+ // [7:0] SDM_IN[8:1]
88
+ 0b11000000,
89
+ // [7:6] PLL digital regulator 1.8V, 8mA [5:4] 1 [3] open drain high-Z [2] 1 [1:0] 0
90
+ 0b00110000,
91
+ // 0x18
92
+ // [7] 0 [6] 1 [5:0] -
93
+ 0b01001000,
94
+ // [7] RF filter power on [6:5] 0 [4] agc_pin = agc_in [3:2] 1 [1:0] -
95
+ 0b11001100,
96
+ // [7:6] tracking filter bypass [5] 1 [4] 0 [3:2] PLL auto tune 128kHz [1:0] RF filter highest band
97
+ 0b01100000,
98
+ // [7:4] highest corner for LPNF [3:0] highest corner for LPF
99
+ 0b00000000,
100
+ // [7:4] power detector 3 TOP 5 [3] 0 [2] 1 [1] - [0] 0
101
+ 0b01010100,
102
+ // [7:6] 1 [5:3] power detector 1 TOP 5 [2:0] power detector 2 TOP 6
103
+ 0b10101110,
104
+ // [7] 0 [6] filter extension enable [5:0] power detector timing control 10
105
+ 0b01001010,
106
+ // [7:6] 1 [5:2] 0 [1:0] -
107
+ 0b11000000,
108
+ ];
109
+ /** A bit mask to reverse the bits in a byte. */
110
+ static BIT_REVS = [
111
+ 0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe, 0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7,
112
+ 0xf,
113
+ ];
114
+ /** This tuner's intermediate frequency. */
115
+ static IF_FREQ = 3570000;
116
+ /** The frequency of the oscillator crystal. */
117
+ xtalFreq;
118
+ /** Whether the PLL in the tuner is locked. */
119
+ hasPllLock;
120
+ /** Shadow registers 0x05-0x1f, for setting values using masks. */
121
+ shadowRegs;
122
+ /**
123
+ * Checks if a R8xx tuner is present.
124
+ */
125
+ static async check(com, i2c) {
126
+ await com.openI2C();
127
+ let found = false;
128
+ try {
129
+ let data = await com.getI2CReg(i2c, 0);
130
+ found = data == 0x69;
131
+ }
132
+ catch { }
133
+ await com.closeI2C();
134
+ return found;
135
+ }
136
+ /**
137
+ * @param com The RTL communications object.
138
+ * @param i2c The tuner's I2C address.
139
+ * @param muxCfgs The tuner's multiplexer configurations.
140
+ */
141
+ constructor(com, i2c, muxCfgs, vcoPowerRef) {
142
+ this.com = com;
143
+ this.i2c = i2c;
144
+ this.muxCfgs = muxCfgs;
145
+ this.vcoPowerRef = vcoPowerRef;
146
+ this.xtalFreq = R8xx.XTAL_FREQ;
147
+ this.hasPllLock = false;
148
+ this.shadowRegs = new Uint8Array();
149
+ }
150
+ /**
151
+ * Sets the tuner's frequency.
152
+ * @param freq The frequency to tune to.
153
+ * @returns a promise that resolves to the actual tuned frequency.
154
+ */
155
+ async setFrequency(freq) {
156
+ await this._setMux(freq + R8xx.IF_FREQ);
157
+ let actual = await this._setPll(freq + R8xx.IF_FREQ);
158
+ return actual - R8xx.IF_FREQ;
159
+ }
160
+ /** Starts the tuner. */
161
+ async open() {
162
+ // [0] disable zero-IF input [1] enable DC estimation [3] enable IQ compensation [4] enable IQ estimation
163
+ await this.com.setDemodReg(1, 0xb1, 0b00011010, 1);
164
+ // [6] enable ADC_Q [7] disable ADC_I
165
+ await this.com.setDemodReg(0, 0x08, 0b01001101, 1);
166
+ // [0] inverted spectrum
167
+ await this.com.setDemodReg(1, 0x15, 0b00000001, 1);
168
+ await this.com.openI2C();
169
+ this.shadowRegs = new Uint8Array(R8xx.REGISTERS);
170
+ for (let i = 0; i < this.shadowRegs.length; ++i) {
171
+ await this.com.setI2CReg(this.i2c, i + 5, this.shadowRegs[i]);
172
+ }
173
+ await this._initElectronics();
174
+ await this.com.closeI2C();
175
+ }
176
+ /** Stops the tuner. */
177
+ async close() {
178
+ // [7] power detector 1 off [6] power detector 3 off [5] filter gain [2:0] LNA power 1
179
+ await this._writeRegMask(0x06, 0b10110001, 0xff);
180
+ // [7] loop through off [5] lna 1 power off [4] LNA gain manual [3:0] LNA gain 3
181
+ await this._writeRegMask(0x05, 0b10110011, 0xff);
182
+ // [6] mixer power off [5] mixer normal current [4] mixer gain auto [3:0] mixer gain 10
183
+ await this._writeRegMask(0x07, 0b00111010, 0xff);
184
+ // [7] mixer buffer power off [6] mixer buffer low current [5:0] image gain 0
185
+ await this._writeRegMask(0x08, 0b01000000, 0xff);
186
+ // [7] IF filter off [6] IF filter low current [5:0] image phase 0
187
+ await this._writeRegMask(0x09, 0b11000000, 0xff);
188
+ // [7] channel filter off [6:5] filter power 1 [3:0] filter bandwidth 6
189
+ await this._writeRegMask(0x0a, 0b00111010, 0xff);
190
+ // [6] vga power off [4] vga controlled by pin [3:0] vga gain 5
191
+ await this._writeRegMask(0x0c, 0b00110101, 0xff);
192
+ // [4] clock output on [1] internal agc clock on
193
+ await this._writeRegMask(0x0f, 0b01101000, 0xff);
194
+ // [7:6] pll analog regulator off
195
+ await this._writeRegMask(0x11, 0b00000011, 0xff);
196
+ // [7:6] pll digital regulator off [3] open drain high-Z
197
+ await this._writeRegMask(0x17, 0b11110100, 0xff);
198
+ // [7] rf filter power off [4] agc pin = agc_in
199
+ await this._writeRegMask(0x19, 0b00001100, 0xff);
200
+ }
201
+ /** Sets the tuner to automatic gain. */
202
+ async setAutoGain() {
203
+ // [4] lna gain auto
204
+ await this._writeRegMask(0x05, 0b00000000, 0b00010000);
205
+ // [4] mixer gain auto
206
+ await this._writeRegMask(0x07, 0b00010000, 0b00010000);
207
+ // [4] IF vga mode manual [3:0] IF vga gain 26.5dB
208
+ await this._writeRegMask(0x0c, 0b00001011, 0b10011111);
209
+ }
210
+ /**
211
+ * Sets the tuner's manual gain.
212
+ * @param gain The tuner's gain, in dB.
213
+ */
214
+ async setManualGain(gain) {
215
+ // Experimentally, LNA goes in 2.3dB steps, Mixer in 1.2dB steps.
216
+ let fullsteps = Math.floor(gain / 3.5);
217
+ let halfsteps = gain - 3.5 * fullsteps >= 2.3 ? 1 : 0;
218
+ if (fullsteps < 0)
219
+ fullsteps = 0;
220
+ if (fullsteps > 15)
221
+ fullsteps = 15;
222
+ if (fullsteps == 15)
223
+ halfsteps = 0;
224
+ let lnaValue = fullsteps + halfsteps;
225
+ let mixerValue = fullsteps;
226
+ // [4] lna gain manual
227
+ await this._writeRegMask(0x05, 0b00010000, 0b00010000);
228
+ // [4] mixer gain manual
229
+ await this._writeRegMask(0x07, 0b00000000, 0b00010000);
230
+ // [4] vga mode manual [3:0] vga gain 16dB
231
+ await this._writeRegMask(0x0c, 0b00001000, 0b10011111);
232
+ // [3:0] lna gain
233
+ await this._writeRegMask(0x05, lnaValue, 0b00001111);
234
+ // [3:0] mixer gain
235
+ await this._writeRegMask(0x07, mixerValue, 0b00001111);
236
+ }
237
+ setXtalFrequency(xtalFreq) {
238
+ this.xtalFreq = xtalFreq;
239
+ }
240
+ getIntermediateFrequency() {
241
+ return R8xx.IF_FREQ;
242
+ }
243
+ getMinimumFrequency() {
244
+ return R8xx.XTAL_FREQ;
245
+ }
246
+ /** Calibrates the filters. */
247
+ async _calibrateFilter() {
248
+ let firstTry = true;
249
+ while (true) {
250
+ // [6:5] filter bandwidth manual coarse narrowest
251
+ await this._writeRegMask(0x0b, 0b01100000, 0b01100000);
252
+ // [2] channel filter calibration clock on
253
+ await this._writeRegMask(0x0f, 0b00000100, 0b00000100);
254
+ // [1:0] xtal cap setting -> no cap
255
+ await this._writeRegMask(0x10, 0b00000000, 0b00000011);
256
+ await this._setPll(56000000);
257
+ if (!this.hasPllLock) {
258
+ throw new RadioError("PLL not locked -- cannot tune to the selected frequency.", RadioErrorType.TunerError);
259
+ }
260
+ // [4] channel filter calibration start
261
+ await this._writeRegMask(0x0b, 0b00010000, 0b00010000);
262
+ // [4] channel filter calibration reset
263
+ await this._writeRegMask(0x0b, 0b00000000, 0b00010000);
264
+ // [2] channel filter calibration clock off
265
+ await this._writeRegMask(0x0f, 0b00000000, 0b00000100);
266
+ let data = await this._readRegBuffer(0x00, 5);
267
+ let arr = new Uint8Array(data);
268
+ // [3:0] filter calibration code
269
+ let filterCap = arr[4] & 0b00001111;
270
+ if (filterCap == 0b00001111) {
271
+ filterCap = 0;
272
+ }
273
+ if (filterCap == 0 || !firstTry) {
274
+ return filterCap;
275
+ }
276
+ firstTry = false;
277
+ }
278
+ }
279
+ /**
280
+ * Sets the multiplexer's frequency.
281
+ * @param freq The frequency to set.
282
+ */
283
+ async _setMux(freq) {
284
+ let freqMhz = freq / 1000000;
285
+ let i;
286
+ for (i = 0; i < this.muxCfgs.length - 1; ++i) {
287
+ if (freqMhz < this.muxCfgs[i + 1][0]) {
288
+ break;
289
+ }
290
+ }
291
+ let cfg = this.muxCfgs[i];
292
+ // [3] open drain
293
+ await this._writeRegMask(0x17, cfg[1], 0b00001000);
294
+ // [7:6] tracking filter [1:0] RF filter
295
+ await this._writeRegMask(0x1a, cfg[2], 0b11000011);
296
+ // [7:4] LPNF [3:0] LPF
297
+ await this._writeRegMask(0x1b, cfg[3], 0b11111111);
298
+ // [3] xtal swing high [1:0] xtal setting no cap
299
+ await this._writeRegMask(0x10, 0b00000000, 0b00001011);
300
+ // [5:0] image gain 0
301
+ await this._writeRegMask(0x08, 0b00000000, 0b00111111);
302
+ // [5:0] image phase 0
303
+ await this._writeRegMask(0x09, 0b00000000, 0b00111111);
304
+ }
305
+ /**
306
+ * Sets the PLL's frequency.
307
+ * @param freq The frequency to set.
308
+ * @returns a promise that resolves to the actual frequency set, or to 0 if the frequency is not achievable.
309
+ */
310
+ async _setPll(freq) {
311
+ let pllRef = Math.floor(this.xtalFreq);
312
+ // [4] PLL reference divider 1:1
313
+ await this._writeRegMask(0x10, 0b00000000, 0b00010000);
314
+ // [3:2] PLL auto tune clock rate 128 kHz
315
+ await this._writeRegMask(0x1a, 0b00000000, 0b00001100);
316
+ // [7:5] VCO core power 4 (mid)
317
+ await this._writeRegMask(0x12, 0b10000000, 0b11100000);
318
+ let divNum = Math.min(6, Math.floor(Math.log(1770000000 / freq) / Math.LN2));
319
+ let mixDiv = 1 << (divNum + 1);
320
+ let data = await this._readRegBuffer(0x00, 5);
321
+ let arr = new Uint8Array(data);
322
+ // [5:4] VCO fine tune
323
+ let vcoFineTune = (arr[4] & 0x30) >> 4;
324
+ if (vcoFineTune > this.vcoPowerRef) {
325
+ --divNum;
326
+ }
327
+ else if (vcoFineTune < this.vcoPowerRef) {
328
+ ++divNum;
329
+ }
330
+ // [7:5] pll to mixer divider 0=1/2 1=1/4 2=1/8 3=1/16 4=1/32 5=1/64
331
+ await this._writeRegMask(0x10, divNum << 5, 0b11100000);
332
+ let vcoFreq = freq * mixDiv;
333
+ let nint = Math.floor(vcoFreq / (2 * pllRef));
334
+ let vcoFra = vcoFreq % (2 * pllRef);
335
+ if (nint > 63) {
336
+ this.hasPllLock = false;
337
+ return 0;
338
+ }
339
+ let ni = Math.floor((nint - 13) / 4);
340
+ let si = (nint - 13) % 4;
341
+ // [7:6] si2c [5:0] ni2c
342
+ await this._writeRegMask(0x14, ni + (si << 6), 0b11111111);
343
+ // [4] sigma delta dither (0 on)
344
+ await this._writeRegMask(0x12, vcoFra == 0 ? 0b1000 : 0b0000, 0b00001000);
345
+ let sdm = Math.min(65535, Math.floor((32768 * vcoFra) / pllRef));
346
+ // SDM high
347
+ await this._writeRegMask(0x16, sdm >> 8, 0b11111111);
348
+ // SDM low
349
+ await this._writeRegMask(0x15, sdm & 0xff, 0b11111111);
350
+ await this._getPllLock();
351
+ // [3] PLL auto tune clock rate 8 kHz
352
+ await this._writeRegMask(0x1a, 0b00001000, 0b00001000);
353
+ return (2 * pllRef * (nint + sdm / 65536)) / mixDiv;
354
+ }
355
+ /**
356
+ * Checks whether the PLL has achieved lock.
357
+ * @param firstTry Whether this is the first try to achieve lock.
358
+ */
359
+ async _getPllLock() {
360
+ let firstTry = true;
361
+ while (true) {
362
+ let data = await this._readRegBuffer(0x00, 3);
363
+ let arr = new Uint8Array(data);
364
+ // [6] pll lock?
365
+ if (arr[2] & 0b01000000) {
366
+ this.hasPllLock = true;
367
+ return;
368
+ }
369
+ if (!firstTry) {
370
+ this.hasPllLock = true;
371
+ return;
372
+ }
373
+ // [7:5] VCO core power 3
374
+ await this._writeRegMask(0x12, 0b01100000, 0b11100000);
375
+ firstTry = false;
376
+ }
377
+ }
378
+ /** Initializes all the components of the tuner. */
379
+ async _initElectronics() {
380
+ // [3:0] IF vga -12dB
381
+ await this._writeRegMask(0x0c, 0b00000000, 0b00001111);
382
+ // [5:0] VCO bank 49
383
+ await this._writeRegMask(0x13, 0b00110001, 0b00111111);
384
+ // [5:3] power detector 1 TOP 0
385
+ await this._writeRegMask(0x1d, 0b00000000, 0b00111000);
386
+ let filterCap = await this._calibrateFilter();
387
+ // [4] channel filter high Q [3:0] filter bandwidth manual fine tune
388
+ await this._writeRegMask(0x0a, 0b00010000 | filterCap, 0b00011111);
389
+ // [7:5] filter bandwidth coarse 3 [3:0] high pass corner 11
390
+ await this._writeRegMask(0x0b, 0b01101011, 0b11101111);
391
+ // [7] mixer sideband lower
392
+ await this._writeRegMask(0x07, 0b00000000, 0b10000000);
393
+ // [5] filter gain 0 dB [4] mixer filter 6MHz function on
394
+ await this._writeRegMask(0x06, 0b00010000, 0b00110000);
395
+ // [6] filter extension enable [5] channer filter extension @ LNA max
396
+ await this._writeRegMask(0x1e, 0b01000000, 0b01100000);
397
+ // [7] loop through on
398
+ await this._writeRegMask(0x05, 0b00000000, 0b10000000);
399
+ // [7] loop through attenuation enable
400
+ await this._writeRegMask(0x1f, 0b00000000, 0b10000000);
401
+ // [7] filter extension widest off
402
+ await this._writeRegMask(0x0f, 0b00000000, 0b10000000);
403
+ // [6:5] RF poly filter current min
404
+ await this._writeRegMask(0x19, 0b01100000, 0b01100000);
405
+ // [7:6] LNA narrow band power detector lowest BW [2:0] power detector 2 TOP 5
406
+ await this._writeRegMask(0x1d, 0b11100101, 0b11000111);
407
+ // [7:4] power detector 3 TOP 4
408
+ await this._writeRegMask(0x1c, 0b00100100, 0b11111000);
409
+ // [7:4] LNA agc power detector voltage threshold high 0.84V [3:0] low 0.64V
410
+ await this._writeRegMask(0x0d, 0b01010011, 0b11111111);
411
+ // [7:4] mixer agc power detector voltage threshold high 1.04V [3:0] low 0.84V
412
+ await this._writeRegMask(0x0e, 0b01110101, 0b11111111);
413
+ // [6] cable 1 LNA off [5] LNA 1 power on
414
+ await this._writeRegMask(0x05, 0b00000000, 0b01100000);
415
+ // [3] cable 2 LNA off
416
+ await this._writeRegMask(0x06, 0b00000000, 0b00001000);
417
+ // [3] ?
418
+ await this._writeRegMask(0x11, 0b00111000, 0b00001000);
419
+ // [5:4] prescale 45 current 150u
420
+ await this._writeRegMask(0x17, 0b00110000, 0b00110000);
421
+ // [6:5] filter power 2
422
+ await this._writeRegMask(0x0a, 0b01000000, 0b01100000);
423
+ // [5:3] power detector 1 TOP 0
424
+ await this._writeRegMask(0x1d, 0b00000000, 0b00111000);
425
+ // [2] LNA power detector mode normal
426
+ await this._writeRegMask(0x1c, 0b00000000, 0b00000100);
427
+ // [6] LNA power detector narrow band off
428
+ await this._writeRegMask(0x06, 0b00000000, 0b01000000);
429
+ // [5:4] AGC clock 20ms
430
+ await this._writeRegMask(0x1a, 0b00110000, 0b00110000);
431
+ // [5:3] power detector 1 TOP 3
432
+ await this._writeRegMask(0x1d, 0b00011000, 0b00111000);
433
+ // [2] LNA power detector 1 low discharge
434
+ await this._writeRegMask(0x1c, 0b00100100, 0b00000100);
435
+ // [4:0] LNA discharge current 13
436
+ await this._writeRegMask(0x1e, 0b00001101, 0b00011111);
437
+ // [5:4] AGC clock 80 ms
438
+ await this._writeRegMask(0x1a, 0b00100000, 0b00110000);
439
+ }
440
+ /**
441
+ * Reads a series of registers into a buffer.
442
+ * @param addr The first register's address to read.
443
+ * @param length The number of registers to read.
444
+ * @returns a promise that resolves to an ArrayBuffer with the data.
445
+ */
446
+ async _readRegBuffer(addr, length) {
447
+ let data = await this.com.getI2CRegBuffer(this.i2c, addr, length);
448
+ let buf = new Uint8Array(data);
449
+ for (let i = 0; i < buf.length; ++i) {
450
+ let b = buf[i];
451
+ buf[i] = (R8xx.BIT_REVS[b & 0xf] << 4) | R8xx.BIT_REVS[b >> 4];
452
+ }
453
+ return buf.buffer;
454
+ }
455
+ /**
456
+ * Writes a masked value into a register.
457
+ * @param addr The address of the register to write into.
458
+ * @param value The value to write.
459
+ * @param mask A mask that specifies which bits to write.
460
+ */
461
+ async _writeRegMask(addr, value, mask) {
462
+ let rc = this.shadowRegs[addr - 5];
463
+ let val = (rc & ~mask) | (value & mask);
464
+ this.shadowRegs[addr - 5] = val;
465
+ await this.com.setI2CReg(this.i2c, addr, val);
466
+ }
467
+ }
468
+ //# sourceMappingURL=r8xx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"r8xx.js","sourceRoot":"","sources":["../../src/rtlsdr/r8xx.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import { DirectSampling, RtlDevice, RtlDeviceProvider, SampleBlock } from "./rtldevice";
2
+ /** Class that returns an open RTL2832U device. */
3
+ export declare class RTL2832U_Provider implements RtlDeviceProvider {
4
+ constructor();
5
+ private device?;
6
+ get(): Promise<RtlDevice>;
7
+ private getDevice;
8
+ }
9
+ /** Operations on the RTL2832U demodulator. */
10
+ export declare class RTL2832U implements RtlDevice {
11
+ private com;
12
+ private tuner;
13
+ /** Frequency of the oscillator crystal. */
14
+ static XTAL_FREQ: number;
15
+ /** The number of bytes for each sample. */
16
+ static BYTES_PER_SAMPLE: number;
17
+ private constructor();
18
+ private centerFrequency;
19
+ private ppm;
20
+ private gain;
21
+ private directSamplingMethod;
22
+ private directSampling;
23
+ private biasTeeEnabled;
24
+ /**
25
+ * Initializes the demodulator.
26
+ * @param device The USB device.
27
+ */
28
+ static open(device: USBDevice): Promise<RTL2832U>;
29
+ private static _init;
30
+ /** Finds the tuner that's connected to this demodulator and returns the appropriate instance. */
31
+ private static _findTuner;
32
+ /**
33
+ * Set the sample rate.
34
+ * @param rate The sample rate, in samples/sec.
35
+ * @returns a promise that resolves to the sample rate that was actually set.
36
+ */
37
+ setSampleRate(rate: number): Promise<number>;
38
+ setFrequencyCorrection(ppm: number): Promise<void>;
39
+ private _setIfFrequency;
40
+ getFrequencyCorrection(): number;
41
+ setGain(gain: number | null): Promise<void>;
42
+ getGain(): number | null;
43
+ enableBiasTee(enabled: boolean): Promise<void>;
44
+ isBiasTeeEnabled(): boolean;
45
+ private _enableRtlAgc;
46
+ private _getXtalFrequency;
47
+ /** Resets the demodulator. */
48
+ private _resetDemodulator;
49
+ /**
50
+ * Tunes the device to the given frequency.
51
+ * @param freq The frequency to tune to, in Hertz.
52
+ * @returns a promise that resolves to the actual tuned frequency.
53
+ */
54
+ setCenterFrequency(freq: number): Promise<number>;
55
+ /**
56
+ * Sets the method used for direct sampling mode, or disables it.
57
+ * If enabled, the radio will enter direct sampling mode for low frequencies.
58
+ */
59
+ setDirectSamplingMethod(method: DirectSampling): Promise<void>;
60
+ /** Returns the current direct sampling method. */
61
+ getDirectSamplingMethod(): DirectSampling;
62
+ private _maybeSetDirectSampling;
63
+ /** Resets the sample buffer. Call this before starting to read samples. */
64
+ resetBuffer(): Promise<void>;
65
+ /**
66
+ * Reads a block of samples off the device.
67
+ * @param length The number of samples to read.
68
+ * @returns a promise that resolves to a SampleBlock.
69
+ */
70
+ readSamples(length: number): Promise<SampleBlock>;
71
+ /** Stops the demodulator. */
72
+ close(): Promise<void>;
73
+ }
74
+ //# sourceMappingURL=rtl2832u.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rtl2832u.d.ts","sourceRoot":"","sources":["../../src/rtlsdr/rtl2832u.ts"],"names":[],"mappings":"AAmBA,OAAO,EACL,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,WAAW,EACZ,MAAM,aAAa,CAAC;AASrB,kDAAkD;AAClD,qBAAa,iBAAkB,YAAW,iBAAiB;;IAKzD,OAAO,CAAC,MAAM,CAAC,CAAY;IAErB,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;YAQjB,SAAS;CAiBxB;AAED,8CAA8C;AAC9C,qBAAa,QAAS,YAAW,SAAS;IAQtC,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,KAAK;IARf,2CAA2C;IAC3C,MAAM,CAAC,SAAS,SAAY;IAE5B,2CAA2C;IAC3C,MAAM,CAAC,gBAAgB,SAAK;IAE5B,OAAO;IAYP,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,IAAI,CAAgB;IAC5B,OAAO,CAAC,oBAAoB,CAAiB;IAC7C,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,cAAc,CAAU;IAEhC;;;OAGG;WACU,IAAI,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC;mBAYlC,KAAK;IAgE1B,iGAAiG;mBAC5E,UAAU;IAa/B;;;;OAIG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAW5C,sBAAsB,CAAC,GAAG,EAAE,MAAM;YAiB1B,eAAe;IAU7B,sBAAsB,IAAI,MAAM;IAI1B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAajC,OAAO,IAAI,MAAM,GAAG,IAAI;IAIlB,aAAa,CAAC,OAAO,EAAE,OAAO;IAMpC,gBAAgB,IAAI,OAAO;YAIb,aAAa;IAI3B,OAAO,CAAC,iBAAiB;IAIzB,8BAA8B;YAChB,iBAAiB;IAM/B;;;;OAIG;IACG,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAcvD;;;OAGG;IACG,uBAAuB,CAAC,MAAM,EAAE,cAAc;IAQpD,kDAAkD;IAClD,uBAAuB,IAAI,cAAc;YAI3B,uBAAuB;IAsCrC,2EAA2E;IACrE,WAAW;IAMjB;;;;OAIG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAOvD,6BAA6B;IACvB,KAAK;CAOZ"}