Add support for MD-UV390 and MD-9600.
Add option "-l": list all supported devices.
This commit is contained in:
parent
50115606fb
commit
09188047c9
9
main.c
9
main.c
@ -60,6 +60,7 @@ void usage()
|
|||||||
fprintf(stderr, _(" -w Write codeplug to the radio.\n"));
|
fprintf(stderr, _(" -w Write codeplug to the radio.\n"));
|
||||||
fprintf(stderr, _(" -c Configure the radio from a text script.\n"));
|
fprintf(stderr, _(" -c Configure the radio from a text script.\n"));
|
||||||
fprintf(stderr, _(" -u Update contacts database.\n"));
|
fprintf(stderr, _(" -u Update contacts database.\n"));
|
||||||
|
fprintf(stderr, _(" -l List all supported radios.\n"));
|
||||||
fprintf(stderr, _(" -t Trace USB protocol.\n"));
|
fprintf(stderr, _(" -t Trace USB protocol.\n"));
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
@ -67,6 +68,7 @@ void usage()
|
|||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int read_flag = 0, write_flag = 0, config_flag = 0, csv_flag = 0;
|
int read_flag = 0, write_flag = 0, config_flag = 0, csv_flag = 0;
|
||||||
|
int list_flag = 0;
|
||||||
|
|
||||||
// Set locale and message catalogs.
|
// Set locale and message catalogs.
|
||||||
setlocale(LC_ALL, "");
|
setlocale(LC_ALL, "");
|
||||||
@ -82,12 +84,13 @@ int main(int argc, char **argv)
|
|||||||
copyright = _("Copyright (C) 2018 Serge Vakulenko KK6ABQ");
|
copyright = _("Copyright (C) 2018 Serge Vakulenko KK6ABQ");
|
||||||
trace_flag = 0;
|
trace_flag = 0;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
switch (getopt(argc, argv, "tcwru")) {
|
switch (getopt(argc, argv, "tcwrul")) {
|
||||||
case 't': ++trace_flag; continue;
|
case 't': ++trace_flag; continue;
|
||||||
case 'r': ++read_flag; continue;
|
case 'r': ++read_flag; continue;
|
||||||
case 'w': ++write_flag; continue;
|
case 'w': ++write_flag; continue;
|
||||||
case 'c': ++config_flag; continue;
|
case 'c': ++config_flag; continue;
|
||||||
case 'u': ++csv_flag; continue;
|
case 'u': ++csv_flag; continue;
|
||||||
|
case 'l': ++list_flag; continue;
|
||||||
default:
|
default:
|
||||||
usage();
|
usage();
|
||||||
case EOF:
|
case EOF:
|
||||||
@ -97,6 +100,10 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
argc -= optind;
|
argc -= optind;
|
||||||
argv += optind;
|
argv += optind;
|
||||||
|
if (list_flag) {
|
||||||
|
radio_list();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
if (read_flag + write_flag + config_flag + csv_flag > 1) {
|
if (read_flag + write_flag + config_flag + csv_flag > 1) {
|
||||||
fprintf(stderr, "Only one of -r, -w, -c or -u options is allowed.\n");
|
fprintf(stderr, "Only one of -r, -w, -c or -u options is allowed.\n");
|
||||||
usage();
|
usage();
|
||||||
|
57
radio.c
57
radio.c
@ -35,6 +35,21 @@
|
|||||||
#include "radio.h"
|
#include "radio.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
|
static struct {
|
||||||
|
char *ident;
|
||||||
|
radio_device_t *device;
|
||||||
|
} radio_tab[] = {
|
||||||
|
{ "DR780", &radio_md380 }, // TYT MD-380, Retevis RT3, RT8
|
||||||
|
{ "MD-UV380", &radio_uv380 }, // TYT MD-UV380
|
||||||
|
{ "MD-UV390", &radio_uv390 }, // TYT MD-UV390, Retevis RT3S
|
||||||
|
{ "2017", &radio_md2017 }, // TYT MD-2017, Retevis RT82
|
||||||
|
{ "MD9600", &radio_md9600 }, // TYT MD-9600
|
||||||
|
{ "ZD3688", &radio_d900 }, // Zastone D900
|
||||||
|
{ "TP660", &radio_dp880 }, // Zastone DP880
|
||||||
|
{ "ZN><:", &radio_rt27d }, // Radtel RT-27D
|
||||||
|
{ 0, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
unsigned char radio_mem [1024*1024]; // Radio memory contents, up to 1Mbyte
|
unsigned char radio_mem [1024*1024]; // Radio memory contents, up to 1Mbyte
|
||||||
int radio_progress; // Read/write progress counter
|
int radio_progress; // Read/write progress counter
|
||||||
|
|
||||||
@ -67,32 +82,34 @@ void radio_connect()
|
|||||||
{
|
{
|
||||||
// Only TYT MD family for now.
|
// Only TYT MD family for now.
|
||||||
const char *ident = dfu_init(0x0483, 0xdf11);
|
const char *ident = dfu_init(0x0483, 0xdf11);
|
||||||
|
int i;
|
||||||
|
|
||||||
if (strcasecmp(ident, "DR780") == 0) { // TYT MD-380, Retevis RT3, RT8
|
for (i=0; radio_tab[i].ident; i++) {
|
||||||
device = &radio_md380;
|
if (strcasecmp(ident, radio_tab[i].ident) == 0) {
|
||||||
} else
|
device = radio_tab[i].device;
|
||||||
if (strcasecmp(ident, "ZD3688") == 0) { // Zastone D900
|
break;
|
||||||
device = &radio_d900;
|
}
|
||||||
} else
|
}
|
||||||
if (strcasecmp(ident, "TP660") == 0) { // Zastone DP880
|
if (! device) {
|
||||||
device = &radio_dp880;
|
fprintf(stderr, "Unrecognized radio '%s'.\n", ident);
|
||||||
} else
|
|
||||||
if (strcasecmp(ident, "ZN><:") == 0) { // Radtel RT-27D
|
|
||||||
device = &radio_rt27d;
|
|
||||||
} else
|
|
||||||
if (strcasecmp(ident, "2017") == 0) { // TYT MD-2017, Retevis RT82
|
|
||||||
device = &radio_md2017;
|
|
||||||
} else
|
|
||||||
if (strcasecmp(ident, "MD-UV380") == 0) { // TYT MD-UV380
|
|
||||||
device = &radio_uv380;
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "Unrecognized radio '%s'.\n",
|
|
||||||
ident);
|
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
fprintf(stderr, "Connect to %s.\n", device->name);
|
fprintf(stderr, "Connect to %s.\n", device->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// List all supported radios.
|
||||||
|
//
|
||||||
|
void radio_list()
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
printf("Supported radios:\n");
|
||||||
|
for (i=0; radio_tab[i].ident; i++) {
|
||||||
|
printf(" %s\n", radio_tab[i].device->name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Read firmware image from the device.
|
// Read firmware image from the device.
|
||||||
//
|
//
|
||||||
|
7
radio.h
7
radio.h
@ -82,6 +82,11 @@ void radio_verify_config(void);
|
|||||||
//
|
//
|
||||||
void radio_write_csv(const char *filename);
|
void radio_write_csv(const char *filename);
|
||||||
|
|
||||||
|
//
|
||||||
|
// List all supported radios.
|
||||||
|
//
|
||||||
|
void radio_list(void);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Device-dependent interface to the radio.
|
// Device-dependent interface to the radio.
|
||||||
//
|
//
|
||||||
@ -107,6 +112,8 @@ struct _radio_device_t {
|
|||||||
extern radio_device_t radio_md380; // TYT MD-380
|
extern radio_device_t radio_md380; // TYT MD-380
|
||||||
extern radio_device_t radio_md2017; // TYT MD-2017
|
extern radio_device_t radio_md2017; // TYT MD-2017
|
||||||
extern radio_device_t radio_uv380; // TYT MD-UV380
|
extern radio_device_t radio_uv380; // TYT MD-UV380
|
||||||
|
extern radio_device_t radio_uv390; // TYT MD-UV390
|
||||||
|
extern radio_device_t radio_md9600; // TYT MD-9600
|
||||||
extern radio_device_t radio_d900; // Zastone D900
|
extern radio_device_t radio_d900; // Zastone D900
|
||||||
extern radio_device_t radio_dp880; // Zastone DP880
|
extern radio_device_t radio_dp880; // Zastone DP880
|
||||||
extern radio_device_t radio_rt27d; // Radtel RT-27D
|
extern radio_device_t radio_rt27d; // Radtel RT-27D
|
||||||
|
40
uv380.c
40
uv380.c
@ -2526,6 +2526,26 @@ radio_device_t radio_uv380 = {
|
|||||||
uv380_write_csv,
|
uv380_write_csv,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// TYT MD-UV390
|
||||||
|
//
|
||||||
|
radio_device_t radio_uv390 = {
|
||||||
|
"TYT MD-UV390",
|
||||||
|
uv380_download,
|
||||||
|
uv380_upload,
|
||||||
|
uv380_is_compatible,
|
||||||
|
uv380_read_image,
|
||||||
|
uv380_save_image,
|
||||||
|
uv380_print_version,
|
||||||
|
uv380_print_config,
|
||||||
|
uv380_verify_config,
|
||||||
|
uv380_parse_parameter,
|
||||||
|
uv380_parse_header,
|
||||||
|
uv380_parse_row,
|
||||||
|
uv380_update_timestamp,
|
||||||
|
uv380_write_csv,
|
||||||
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// TYT MD-2017
|
// TYT MD-2017
|
||||||
//
|
//
|
||||||
@ -2545,3 +2565,23 @@ radio_device_t radio_md2017 = {
|
|||||||
uv380_update_timestamp,
|
uv380_update_timestamp,
|
||||||
uv380_write_csv,
|
uv380_write_csv,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// TYT MD-9600
|
||||||
|
//
|
||||||
|
radio_device_t radio_md9600 = {
|
||||||
|
"TYT MD-9600",
|
||||||
|
uv380_download,
|
||||||
|
uv380_upload,
|
||||||
|
uv380_is_compatible,
|
||||||
|
uv380_read_image,
|
||||||
|
uv380_save_image,
|
||||||
|
uv380_print_version,
|
||||||
|
uv380_print_config,
|
||||||
|
uv380_verify_config,
|
||||||
|
uv380_parse_parameter,
|
||||||
|
uv380_parse_header,
|
||||||
|
uv380_parse_row,
|
||||||
|
uv380_update_timestamp,
|
||||||
|
uv380_write_csv,
|
||||||
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user