Enable EEPROM to force direct sampling mode

Re-purpose remote-enabled EEPROM flag to determine if direct sampling mode should be forced ON. Useful for apps that don't have any direct sampling mode settings in their GUI.
This commit is contained in:
rtlsdrblog 2019-11-01 17:34:12 +13:00 committed by GitHub
parent 4f6c1b2e98
commit 4ff1c4f74f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -43,8 +43,8 @@ typedef struct rtlsdr_config {
char product[MAX_STR_SIZE]; char product[MAX_STR_SIZE];
char serial[MAX_STR_SIZE]; char serial[MAX_STR_SIZE];
int have_serial; int have_serial;
int enable_ir; int enable_bt;
int remote_wakeup; int direct_sampling_on;
} rtlsdr_config_t; } rtlsdr_config_t;
void dump_config(rtlsdr_config_t *conf) void dump_config(rtlsdr_config_t *conf)
@ -57,10 +57,10 @@ void dump_config(rtlsdr_config_t *conf)
fprintf(stderr, "Serial number:\t\t%s\n", conf->serial); fprintf(stderr, "Serial number:\t\t%s\n", conf->serial);
fprintf(stderr, "Serial number enabled:\t"); fprintf(stderr, "Serial number enabled:\t");
fprintf(stderr, conf->have_serial ? "yes\n": "no\n"); fprintf(stderr, conf->have_serial ? "yes\n": "no\n");
fprintf(stderr, "IR endpoint enabled:\t"); fprintf(stderr, "Bias-T Always ON:\t");
fprintf(stderr, conf->enable_ir ? "yes\n": "no\n"); fprintf(stderr, conf->enable_bt ? "no\n": "yes\n"); // 0 is ON for this
fprintf(stderr, "Remote wakeup enabled:\t"); fprintf(stderr, "Direct Sampling Always ON:\t");
fprintf(stderr, conf->remote_wakeup ? "yes\n": "no\n"); fprintf(stderr, conf->direct_sampling_on ? "yes\n": "no\n");
fprintf(stderr, "__________________________________________\n"); fprintf(stderr, "__________________________________________\n");
} }
@ -74,7 +74,8 @@ void usage(void)
"\t[-m <str> set manufacturer string]\n" "\t[-m <str> set manufacturer string]\n"
"\t[-p <str> set product string]\n" "\t[-p <str> set product string]\n"
"\t[-s <str> set serial number string]\n" "\t[-s <str> set serial number string]\n"
"\t[-i <0,1> disable/enable IR-endpoint]\n" "\t[-b <\"y\",\"n\"> enable/disable bias tee always ON]\n"
"\t[-q <\"y\",\"n\"> enable/disable direct sampling always ON]\n"
"\t[-g <conf> generate default config and write to device]\n" "\t[-g <conf> generate default config and write to device]\n"
"\t[ <conf> can be one of:]\n" "\t[ <conf> can be one of:]\n"
"\t[ realtek\t\tRealtek default (as without EEPROM)]\n" "\t[ realtek\t\tRealtek default (as without EEPROM)]\n"
@ -139,8 +140,8 @@ int parse_eeprom_to_conf(rtlsdr_config_t *conf, uint8_t *dat)
conf->vendor_id = dat[2] | (dat[3] << 8); conf->vendor_id = dat[2] | (dat[3] << 8);
conf->product_id = dat[4] | (dat[5] << 8); conf->product_id = dat[4] | (dat[5] << 8);
conf->have_serial = (dat[6] == 0xa5) ? 1 : 0; conf->have_serial = (dat[6] == 0xa5) ? 1 : 0;
conf->remote_wakeup = (dat[7] & 0x01) ? 1 : 0; conf->direct_sampling_on = (dat[7] & 0x01) ? 1 : 0;
conf->enable_ir = (dat[7] & 0x02) ? 1 : 0; conf->enable_bt = (dat[7] & 0x02) ? 1 : 0;
pos = get_string_descriptor(STR_OFFSET, dat, conf->manufacturer); pos = get_string_descriptor(STR_OFFSET, dat, conf->manufacturer);
pos = get_string_descriptor(pos, dat, conf->product); pos = get_string_descriptor(pos, dat, conf->product);
@ -161,8 +162,8 @@ int gen_eeprom_from_conf(rtlsdr_config_t *conf, uint8_t *dat)
dat[5] = (conf->product_id >> 8) & 0xff; dat[5] = (conf->product_id >> 8) & 0xff;
dat[6] = conf->have_serial ? 0xa5 : 0x00; dat[6] = conf->have_serial ? 0xa5 : 0x00;
dat[7] = 0x14; dat[7] = 0x14;
dat[7] |= conf->remote_wakeup ? 0x01 : 0x00; dat[7] |= conf->direct_sampling_on ? 0x01 : 0x00;
dat[7] |= conf->enable_ir ? 0x02 : 0x00; dat[7] |= conf->enable_bt ? 0x02 : 0x00;
dat[8] = 0x02; dat[8] = 0x02;
pos = set_string_descriptor(STR_OFFSET, dat, conf->manufacturer); pos = set_string_descriptor(STR_OFFSET, dat, conf->manufacturer);
@ -194,8 +195,8 @@ void gen_default_conf(rtlsdr_config_t *conf, int config)
strcpy(conf->product, "RTL2832U DVB-T"); strcpy(conf->product, "RTL2832U DVB-T");
strcpy(conf->serial, "0"); strcpy(conf->serial, "0");
conf->have_serial = 1; conf->have_serial = 1;
conf->enable_ir = 0; conf->enable_bt = 0;
conf->remote_wakeup = 1; conf->direct_sampling_on = 1;
break; break;
case REALTEK_EEPROM: case REALTEK_EEPROM:
fprintf(stderr, "Realtek default OEM with EEPROM\n"); fprintf(stderr, "Realtek default OEM with EEPROM\n");
@ -205,8 +206,8 @@ void gen_default_conf(rtlsdr_config_t *conf, int config)
strcpy(conf->product, "RTL2838UHIDIR"); strcpy(conf->product, "RTL2838UHIDIR");
strcpy(conf->serial, "00000001"); strcpy(conf->serial, "00000001");
conf->have_serial = 1; conf->have_serial = 1;
conf->enable_ir = 1; conf->enable_bt = 1;
conf->remote_wakeup = 0; conf->direct_sampling_on = 0;
break; break;
case TERRATEC_NOXON: case TERRATEC_NOXON:
fprintf(stderr, "Terratec NOXON DAB Stick\n"); fprintf(stderr, "Terratec NOXON DAB Stick\n");
@ -216,8 +217,8 @@ void gen_default_conf(rtlsdr_config_t *conf, int config)
strcpy(conf->product, "DAB Stick"); strcpy(conf->product, "DAB Stick");
strcpy(conf->serial, "0"); strcpy(conf->serial, "0");
conf->have_serial = 1; conf->have_serial = 1;
conf->enable_ir = 0; conf->enable_bt = 0;
conf->remote_wakeup = 1; conf->direct_sampling_on = 1;
break; break;
case TERRATEC_T_BLACK: case TERRATEC_T_BLACK:
fprintf(stderr, "Terratec T Stick Black\n"); fprintf(stderr, "Terratec T Stick Black\n");
@ -227,8 +228,8 @@ void gen_default_conf(rtlsdr_config_t *conf, int config)
strcpy(conf->product, "RTL2838UHIDIR"); strcpy(conf->product, "RTL2838UHIDIR");
strcpy(conf->serial, "00000001"); strcpy(conf->serial, "00000001");
conf->have_serial = 1; conf->have_serial = 1;
conf->enable_ir = 1; conf->enable_bt = 1;
conf->remote_wakeup = 0; conf->direct_sampling_on = 0;
break; break;
case TERRATEC_T_PLUS: case TERRATEC_T_PLUS:
fprintf(stderr, "Terratec ran T Stick+\n"); fprintf(stderr, "Terratec ran T Stick+\n");
@ -238,8 +239,8 @@ void gen_default_conf(rtlsdr_config_t *conf, int config)
strcpy(conf->product, "RTL2838UHIDIR"); strcpy(conf->product, "RTL2838UHIDIR");
strcpy(conf->serial, "00000001"); strcpy(conf->serial, "00000001");
conf->have_serial = 1; conf->have_serial = 1;
conf->enable_ir = 1; conf->enable_bt = 1;
conf->remote_wakeup = 0; conf->direct_sampling_on = 0;
break; break;
default: default:
break; break;
@ -261,10 +262,11 @@ int main(int argc, char **argv)
int flash_file = 0; int flash_file = 0;
int default_config = 0; int default_config = 0;
int change = 0; int change = 0;
int ir_endpoint = 0; int enable_bt = 0;
int direct_sampling_on = 0;
char ch; char ch;
while ((opt = getopt(argc, argv, "d:m:p:s:i:g:w:r:h?")) != -1) { while ((opt = getopt(argc, argv, "d:m:p:s:b:q:g:w:r:h?")) != -1) {
switch (opt) { switch (opt) {
case 'd': case 'd':
dev_index = atoi(optarg); dev_index = atoi(optarg);
@ -281,8 +283,30 @@ int main(int argc, char **argv)
serial_str = optarg; serial_str = optarg;
change = 1; change = 1;
break; break;
case 'i': case 'b':
ir_endpoint = (atoi(optarg) > 0) ? 1 : -1; if(strcmp(optarg, "y") == 0)
{
enable_bt = 1;
}
else if(strcmp(optarg, "n") == 0)
{
enable_bt = -1;
}
//enable_bt = (!strcmp(optarg, "y")) ? 1 : -1;
//ir_endpoint = (atoi(optarg) > 0) ? 1 : -1;
change = 1;
break;
case 'q':
if(strcmp(optarg, "y") == 0)
{
direct_sampling_on = 1;
}
else if(strcmp(optarg, "n") == 0)
{
direct_sampling_on = -1;
}
//direct_sampling_on = (!strcmp(optarg, "y")) ? 1 : -1;
//direct_sampling_on = (atoi(optarg) > 0) ? 1 : -1;
change = 1; change = 1;
break; break;
case 'g': case 'g':
@ -380,8 +404,11 @@ int main(int argc, char **argv)
strncpy((char*)&conf.serial, serial_str, MAX_STR_SIZE); strncpy((char*)&conf.serial, serial_str, MAX_STR_SIZE);
} }
if (ir_endpoint != 0) if (enable_bt != 0)
conf.enable_ir = (ir_endpoint > 0) ? 1 : 0; conf.enable_bt = (enable_bt > 0) ? 0 : 1;
if (direct_sampling_on != 0)
conf.direct_sampling_on = (direct_sampling_on > 0) ? 1 : 0;
if (!change) if (!change)
goto exit; goto exit;