summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Markgraf <steve@steve-m.de>2012-03-13 23:18:25 +0100
committerSteve Markgraf <steve@steve-m.de>2012-03-13 23:18:25 +0100
commit8dc13ea3ea4fb8c6f4b45b675985290bfeef1956 (patch)
tree861e5243496fe92c536797425c35d86520e05017
parent5a4fd14581e9da5418a7d9e42c32ff00cafa222e (diff)
add commandline option for setting the sample rate
Signed-off-by: Steve Markgraf <steve@steve-m.de>
-rw-r--r--src/main.c34
1 files changed, 23 insertions, 11 deletions
diff --git a/src/main.c b/src/main.c
index 833d81f..b0208b5 100644
--- a/src/main.c
+++ b/src/main.c
@@ -21,6 +21,7 @@
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
+#include <math.h>
#include <unistd.h>
#include <libusb.h>
@@ -40,6 +41,8 @@
#define NOXON_VID 0x0ccd
#define NOXON_PID 0x00b3
+#define CRYSTAL_FREQ 28800000
+
static struct libusb_device_handle *devh = NULL;
static int do_exit = 0;
@@ -214,12 +217,20 @@ void demod_write_reg(uint8_t page, uint16_t addr, uint16_t val, uint8_t len)
demod_read_reg(0x0a, 0x01, 1);
}
-void set_resampler(uint32_t rsamp_ratio)
+void set_samp_rate(uint32_t samp_rate)
{
uint16_t tmp;
- rsamp_ratio <<= 2;
+ uint32_t rsamp_ratio;
+
+ /* check for the maximum rate the resampler supports */
+ if (samp_rate > 3200000)
+ samp_rate = 3200000;
+
+ printf("Setting sample rate: %i Hz\n", samp_rate);
+ rsamp_ratio = (CRYSTAL_FREQ * pow(2, 22)) / samp_rate;
- tmp = (rsamp_ratio >> 16) & 0xffff;
+ rsamp_ratio &= ~3;
+ tmp = (rsamp_ratio >> 16);
demod_write_reg(1, 0x9f, tmp, 2);
tmp = rsamp_ratio & 0xffff;
demod_write_reg(1, 0xa1, tmp, 2);
@@ -265,10 +276,6 @@ void rtl_init(void)
for (i = 0; i < sizeof (fir_coeff); i++)
demod_write_reg(1, 0x1c + i, fir_coeff[i], 1);
- /* TODO setting resampler test value, max value is 0xC99999,
- * value for DAB/FM is 0xE10000*/
- set_resampler(1 << 24);
-
demod_write_reg(0, 0x19, 0x25, 1);
/* init FSM state-holding register */
@@ -295,7 +302,7 @@ void tuner_init(int frequency)
switch (tuner_type) {
case TUNER_E4000:
e4000_Initialize(1);
- e4000_SetBandwidthHz(1, 80000);
+ e4000_SetBandwidthHz(1, 8000000);
e4000_SetRfFreqHz(1, frequency);
break;
case TUNER_FC0013:
@@ -314,7 +321,8 @@ void tuner_init(int frequency)
void usage(void)
{
printf("rtl-sdr, an I/Q recorder for RTL2832 based USB-sticks\n\n"
- "Usage:\t-f frequency to tune to [Hz]\n"
+ "Usage:\t -f frequency to tune to [Hz]\n"
+ "\t[-s samplerate (default: 2048000 Hz)]\n"
"\toutput filename\n");
exit(1);
}
@@ -329,16 +337,19 @@ int main(int argc, char **argv)
struct sigaction sigact;
int r, opt;
char *filename;
- unsigned int frequency = 0;
+ uint32_t frequency = 0, samp_rate = 2048000;
uint8_t buffer[READLEN];
int n_read;
FILE *file;
- while ((opt = getopt(argc, argv, "f:")) != -1) {
+ while ((opt = getopt(argc, argv, "f:s:")) != -1) {
switch (opt) {
case 'f':
frequency = atoi(optarg);
break;
+ case 's':
+ samp_rate = atoi(optarg);
+ break;
default:
usage();
break;
@@ -378,6 +389,7 @@ int main(int argc, char **argv)
/* Initialize the RTL2832 */
rtl_init();
+ set_samp_rate(samp_rate);
/* Initialize tuner & set frequency */
tuner_init(frequency);