Merge branch 'anytone'.

This commit is contained in:
Serge Vakulenko 2018-10-26 19:57:22 -07:00
commit 81153d7cbd
17 changed files with 3041 additions and 314 deletions

View File

@ -10,3 +10,7 @@ SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="df11", MODE="666"
# Baofeng RD-5R # Baofeng RD-5R
SUBSYSTEM=="usb", ATTRS{idVendor}=="15a2", ATTRS{idProduct}=="0073", MODE="666" SUBSYSTEM=="usb", ATTRS{idVendor}=="15a2", ATTRS{idProduct}=="0073", MODE="666"
# Anytone AT-D868UV
# Ignore this device in Modem Manager
ATTRS{idVendor}=="28e9" ATTRS{idProduct}=="018a", ENV{ID_MM_DEVICE_IGNORE}="1"

View File

@ -6,7 +6,7 @@ UNAME = $(shell uname)
CFLAGS = -g -O -Wall -Werror -DVERSION='"$(VERSION).$(GITCOUNT)"' CFLAGS = -g -O -Wall -Werror -DVERSION='"$(VERSION).$(GITCOUNT)"'
LDFLAGS = -g LDFLAGS = -g
OBJS = main.o util.o radio.o dfu-libusb.o uv380.o md380.o rd5r.o gd77.o hid.o OBJS = main.o util.o radio.o dfu-libusb.o uv380.o md380.o rd5r.o gd77.o hid.o serial.o d868uv.o
LIBS = -lusb-1.0 LIBS = -lusb-1.0
# #
@ -48,6 +48,7 @@ dmrconfig.linux: dmrconfig
strip $@ strip $@
### ###
d868uv.o: d868uv.c radio.h util.h
dfu-libusb.o: dfu-libusb.c util.h dfu-libusb.o: dfu-libusb.c util.h
dfu-windows.o: dfu-windows.c util.h dfu-windows.o: dfu-windows.c util.h
gd77.o: gd77.c radio.h util.h gd77.o: gd77.c radio.h util.h
@ -59,5 +60,6 @@ main.o: main.c radio.h util.h
md380.o: md380.c radio.h util.h md380.o: md380.c radio.h util.h
radio.o: radio.c radio.h util.h radio.o: radio.c radio.h util.h
rd5r.o: rd5r.c radio.h util.h rd5r.o: rd5r.c radio.h util.h
serial.o: serial.c util.h
util.o: util.c util.h util.o: util.c util.h
uv380.o: uv380.c radio.h util.h uv380.o: uv380.c radio.h util.h

View File

@ -5,7 +5,7 @@ GITCOUNT = $(shell git rev-list HEAD --count)
CFLAGS = -g -O -Wall -Werror -DVERSION='"$(VERSION).$(GITCOUNT)"' CFLAGS = -g -O -Wall -Werror -DVERSION='"$(VERSION).$(GITCOUNT)"'
LDFLAGS = -g -s LDFLAGS = -g -s
OBJS = main.o util.o radio.o dfu-windows.o uv380.o md380.o rd5r.o gd77.o hid.o hid-windows.o OBJS = main.o util.o radio.o dfu-windows.o uv380.o md380.o rd5r.o gd77.o hid.o hid-windows.o serial.o d868uv.o
LIBS = -lhid -lsetupapi LIBS = -lhid -lsetupapi
# Compiling Windows binary from Linux # Compiling Windows binary from Linux
@ -33,6 +33,7 @@ install: dmrconfig
install -c -s dmrconfig /usr/local/bin/dmrconfig install -c -s dmrconfig /usr/local/bin/dmrconfig
### ###
d868uv.o: d868uv.c radio.h util.h
dfu-libusb.o: dfu-libusb.c util.h dfu-libusb.o: dfu-libusb.c util.h
dfu-windows.o: dfu-windows.c util.h dfu-windows.o: dfu-windows.c util.h
gd77.o: gd77.c radio.h util.h gd77.o: gd77.c radio.h util.h
@ -44,5 +45,6 @@ main.o: main.c radio.h util.h
md380.o: md380.c radio.h util.h md380.o: md380.c radio.h util.h
radio.o: radio.c radio.h util.h radio.o: radio.c radio.h util.h
rd5r.o: rd5r.c radio.h util.h rd5r.o: rd5r.c radio.h util.h
serial.o: serial.c util.h
util.o: util.c util.h util.o: util.c util.h
uv380.o: uv380.c radio.h util.h uv380.o: uv380.c radio.h util.h

38
contact5.diff Normal file
View File

@ -0,0 +1,38 @@
--- d868uv-contacts.hd 2018-10-26 16:58:56.070106184 -0700
+++ d868uv-contacts-delete5.hd 2018-10-26 17:10:11.651995288 -0700
@@ -18204,10 +18204,9 @@
000764e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000764f0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
00076500 00 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 |................| --- List of contacts?
-00076510 04 00 00 00 ff ff ff ff ff ff ff ff ff ff ff ff |................|
-00076520 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
+00076510 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
-00080140 e0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
+00080140 f0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| --- Bitmap of invalid contacts
00080150 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
00080620 ff ff ff 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
@@ -18233,43 +18232,12 @@
00080790 44 44 44 01 00 00 00 00 00 00 00 00 00 00 00 00 |DDD.............|
000807a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
-000807d0 00 43 6f 6e 74 61 63 74 20 35 00 00 00 00 00 00 |.Contact 5......| --- Contact5 structure
-000807e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
-000807f0 00 00 00 15 55 55 55 02 00 00 00 00 00 00 00 00 |....UUU.........|
-00080800 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
-*
-00080840 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
+000807d0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
@@ -18306,8 +18274,7 @@
00174c30 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
00188380 f1 ac 68 24 00 00 00 00 66 66 66 26 02 00 00 00 |..h$....fff&....|
-00188390 88 88 88 28 03 00 00 00 aa aa aa 2a 04 00 00 00 |...(.......*....|
-001883a0 2a e4 ee 2c 01 00 00 00 ff ff ff ff ff ff ff ff |*..,............|
-001883b0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
+00188390 88 88 88 28 03 00 00 00 2a e4 ee 2c 01 00 00 00 |...(....*..,....| --- Unknown data
+001883a0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
00188680

580
d868uv-map.h Normal file
View File

@ -0,0 +1,580 @@
/*
* Address map of D868UV memory space.
*/
{ 0x02fa0010, 0x40 }, // Radio name and timestamp
{ 0x00800000, 0x2000 }, // Channels 1-128
{ 0x00840000, 0x2000 }, // Channels 129-256
{ 0x00880000, 0x2000 }, // Channels 257-384
{ 0x008c0000, 0x2000 }, // Channels 385-512
{ 0x00900000, 0x2000 }, // Channels 513-640
{ 0x00940000, 0x2000 }, // Channels 641-768
{ 0x00980000, 0x2000 }, // Channels 769-896
{ 0x009c0000, 0x2000 }, // Channels 897-1024
{ 0x00a00000, 0x2000 }, // Channels 1025-1152
{ 0x00a40000, 0x2000 }, // Channels 1153-1280
{ 0x00a80000, 0x2000 }, // Channels 1281-1408
{ 0x00ac0000, 0x2000 }, // Channels 1409-1536
{ 0x00b00000, 0x2000 }, // Channels 1537-1664
{ 0x00b40000, 0x2000 }, // Channels 1665-1792
{ 0x00b80000, 0x2000 }, // Channels 1793-1920
{ 0x00bc0000, 0x2000 }, // Channels 1921-2048
{ 0x00c00000, 0x2000 }, // Channels 2049-2176
{ 0x00c40000, 0x2000 }, // Channels 2177-2304
{ 0x00c80000, 0x2000 }, // Channels 2305-2432
{ 0x00cc0000, 0x2000 }, // Channels 2433-2560
{ 0x00d00000, 0x2000 }, // Channels 2561-2688
{ 0x00d40000, 0x2000 }, // Channels 2689-2816
{ 0x00d80000, 0x2000 }, // Channels 2817-2944
{ 0x00dc0000, 0x2000 }, // Channels 2945-3072
{ 0x00e00000, 0x2000 }, // Channels 3073-3200
{ 0x00e40000, 0x2000 }, // Channels 3201-3328
{ 0x00e80000, 0x2000 }, // Channels 3329-3456
{ 0x00ec0000, 0x2000 }, // Channels 3457-3584
{ 0x00f00000, 0x2000 }, // Channels 3585-3712
{ 0x00f40000, 0x2000 }, // Channels 3713-3840
{ 0x00f80000, 0x2000 }, // Channels 3841-3968
{ 0x00fc0000, 0x0880 }, // Channels 3969-4000, VFO A, VFO B
{ 0x01000000, 0x1f400 }, // Unknown bitmap
{ 0x01080000, 0xc0 }, // Scanlist 1
{ 0x01080200, 0xc0 }, // Scanlist 2
{ 0x01080400, 0xc0 }, // Scanlist 3
{ 0x01080600, 0xc0 }, // Scanlist 4
{ 0x01080800, 0xc0 }, // Scanlist 5
{ 0x01080a00, 0xc0 }, // Scanlist 6
{ 0x01080c00, 0xc0 }, // Scanlist 7
{ 0x01080e00, 0xc0 }, // Scanlist 8
{ 0x01081000, 0xc0 }, // Scanlist 9
{ 0x01081200, 0xc0 }, // Scanlist 10
{ 0x01081400, 0xc0 }, // Scanlist 11
{ 0x01081600, 0xc0 }, // Scanlist 12
{ 0x01081800, 0xc0 }, // Scanlist 13
{ 0x01081a00, 0xc0 }, // Scanlist 14
{ 0x01081c00, 0xc0 }, // Scanlist 15
{ 0x01081e00, 0xc0 }, // Scanlist 16
{ 0x010c0000, 0xc0 }, // Scanlist 17
{ 0x010c0200, 0xc0 }, // Scanlist 18
{ 0x010c0400, 0xc0 }, // Scanlist 19
{ 0x010c0600, 0xc0 }, // Scanlist 20
{ 0x010c0800, 0xc0 }, // Scanlist 21
{ 0x010c0a00, 0xc0 }, // Scanlist 22
{ 0x010c0c00, 0xc0 }, // Scanlist 23
{ 0x010c0e00, 0xc0 }, // Scanlist 24
{ 0x010c1000, 0xc0 }, // Scanlist 25
{ 0x010c1200, 0xc0 }, // Scanlist 26
{ 0x010c1400, 0xc0 }, // Scanlist 27
{ 0x010c1600, 0xc0 }, // Scanlist 28
{ 0x010c1800, 0xc0 }, // Scanlist 29
{ 0x010c1a00, 0xc0 }, // Scanlist 30
{ 0x010c1c00, 0xc0 }, // Scanlist 31
{ 0x010c1e00, 0xc0 }, // Scanlist 32
{ 0x01100000, 0xc0 }, // Scanlist 33
{ 0x01100200, 0xc0 }, // Scanlist 34
{ 0x01100400, 0xc0 }, // Scanlist 35
{ 0x01100600, 0xc0 }, // Scanlist 36
{ 0x01100800, 0xc0 }, // Scanlist 37
{ 0x01100a00, 0xc0 }, // Scanlist 38
{ 0x01100c00, 0xc0 }, // Scanlist 39
{ 0x01100e00, 0xc0 }, // Scanlist 40
{ 0x01101000, 0xc0 }, // Scanlist 41
{ 0x01101200, 0xc0 }, // Scanlist 42
{ 0x01101400, 0xc0 }, // Scanlist 43
{ 0x01101600, 0xc0 }, // Scanlist 44
{ 0x01101800, 0xc0 }, // Scanlist 45
{ 0x01101a00, 0xc0 }, // Scanlist 46
{ 0x01101c00, 0xc0 }, // Scanlist 47
{ 0x01101e00, 0xc0 }, // Scanlist 48
{ 0x01140000, 0xc0 }, // Scanlist 49
{ 0x01140200, 0xc0 }, // Scanlist 50
{ 0x01140400, 0xc0 }, // Scanlist 51
{ 0x01140600, 0xc0 }, // Scanlist 52
{ 0x01140800, 0xc0 }, // Scanlist 53
{ 0x01140a00, 0xc0 }, // Scanlist 54
{ 0x01140c00, 0xc0 }, // Scanlist 55
{ 0x01140e00, 0xc0 }, // Scanlist 56
{ 0x01141000, 0xc0 }, // Scanlist 57
{ 0x01141200, 0xc0 }, // Scanlist 58
{ 0x01141400, 0xc0 }, // Scanlist 59
{ 0x01141600, 0xc0 }, // Scanlist 60
{ 0x01141800, 0xc0 }, // Scanlist 61
{ 0x01141a00, 0xc0 }, // Scanlist 62
{ 0x01141c00, 0xc0 }, // Scanlist 63
{ 0x01141e00, 0xc0 }, // Scanlist 64
{ 0x01180000, 0xc0 }, // Scanlist 65
{ 0x01180200, 0xc0 }, // Scanlist 66
{ 0x01180400, 0xc0 }, // Scanlist 67
{ 0x01180600, 0xc0 }, // Scanlist 68
{ 0x01180800, 0xc0 }, // Scanlist 69
{ 0x01180a00, 0xc0 }, // Scanlist 70
{ 0x01180c00, 0xc0 }, // Scanlist 71
{ 0x01180e00, 0xc0 }, // Scanlist 72
{ 0x01181000, 0xc0 }, // Scanlist 73
{ 0x01181200, 0xc0 }, // Scanlist 74
{ 0x01181400, 0xc0 }, // Scanlist 75
{ 0x01181600, 0xc0 }, // Scanlist 76
{ 0x01181800, 0xc0 }, // Scanlist 77
{ 0x01181a00, 0xc0 }, // Scanlist 78
{ 0x01181c00, 0xc0 }, // Scanlist 79
{ 0x01181e00, 0xc0 }, // Scanlist 80
{ 0x011c0000, 0xc0 }, // Scanlist 81
{ 0x011c0200, 0xc0 }, // Scanlist 82
{ 0x011c0400, 0xc0 }, // Scanlist 83
{ 0x011c0600, 0xc0 }, // Scanlist 84
{ 0x011c0800, 0xc0 }, // Scanlist 85
{ 0x011c0a00, 0xc0 }, // Scanlist 86
{ 0x011c0c00, 0xc0 }, // Scanlist 87
{ 0x011c0e00, 0xc0 }, // Scanlist 88
{ 0x011c1000, 0xc0 }, // Scanlist 89
{ 0x011c1200, 0xc0 }, // Scanlist 90
{ 0x011c1400, 0xc0 }, // Scanlist 91
{ 0x011c1600, 0xc0 }, // Scanlist 92
{ 0x011c1800, 0xc0 }, // Scanlist 93
{ 0x011c1a00, 0xc0 }, // Scanlist 94
{ 0x011c1c00, 0xc0 }, // Scanlist 95
{ 0x011c1e00, 0xc0 }, // Scanlist 96
{ 0x01200000, 0xc0 }, // Scanlist 97
{ 0x01200200, 0xc0 }, // Scanlist 98
{ 0x01200400, 0xc0 }, // Scanlist 99
{ 0x01200600, 0xc0 }, // Scanlist 100
{ 0x01200800, 0xc0 }, // Scanlist 101
{ 0x01200a00, 0xc0 }, // Scanlist 102
{ 0x01200c00, 0xc0 }, // Scanlist 103
{ 0x01200e00, 0xc0 }, // Scanlist 104
{ 0x01201000, 0xc0 }, // Scanlist 105
{ 0x01201200, 0xc0 }, // Scanlist 106
{ 0x01201400, 0xc0 }, // Scanlist 107
{ 0x01201600, 0xc0 }, // Scanlist 108
{ 0x01201800, 0xc0 }, // Scanlist 109
{ 0x01201a00, 0xc0 }, // Scanlist 110
{ 0x01201c00, 0xc0 }, // Scanlist 111
{ 0x01201e00, 0xc0 }, // Scanlist 112
{ 0x01240000, 0xc0 }, // Scanlist 113
{ 0x01240200, 0xc0 }, // Scanlist 114
{ 0x01240400, 0xc0 }, // Scanlist 115
{ 0x01240600, 0xc0 }, // Scanlist 116
{ 0x01240800, 0xc0 }, // Scanlist 117
{ 0x01240a00, 0xc0 }, // Scanlist 118
{ 0x01240c00, 0xc0 }, // Scanlist 119
{ 0x01240e00, 0xc0 }, // Scanlist 120
{ 0x01241000, 0xc0 }, // Scanlist 121
{ 0x01241200, 0xc0 }, // Scanlist 122
{ 0x01241400, 0xc0 }, // Scanlist 123
{ 0x01241600, 0xc0 }, // Scanlist 124
{ 0x01241800, 0xc0 }, // Scanlist 125
{ 0x01241a00, 0xc0 }, // Scanlist 126
{ 0x01241c00, 0xc0 }, // Scanlist 127
{ 0x01241e00, 0xc0 }, // Scanlist 128
{ 0x01280000, 0xc0 }, // Scanlist 129
{ 0x01280200, 0xc0 }, // Scanlist 130
{ 0x01280400, 0xc0 }, // Scanlist 131
{ 0x01280600, 0xc0 }, // Scanlist 132
{ 0x01280800, 0xc0 }, // Scanlist 133
{ 0x01280a00, 0xc0 }, // Scanlist 134
{ 0x01280c00, 0xc0 }, // Scanlist 135
{ 0x01280e00, 0xc0 }, // Scanlist 136
{ 0x01281000, 0xc0 }, // Scanlist 137
{ 0x01281200, 0xc0 }, // Scanlist 138
{ 0x01281400, 0xc0 }, // Scanlist 139
{ 0x01281600, 0xc0 }, // Scanlist 140
{ 0x01281800, 0xc0 }, // Scanlist 141
{ 0x01281a00, 0xc0 }, // Scanlist 142
{ 0x01281c00, 0xc0 }, // Scanlist 143
{ 0x01281e00, 0xc0 }, // Scanlist 144
{ 0x012c0000, 0xc0 }, // Scanlist 145
{ 0x012c0200, 0xc0 }, // Scanlist 146
{ 0x012c0400, 0xc0 }, // Scanlist 147
{ 0x012c0600, 0xc0 }, // Scanlist 148
{ 0x012c0800, 0xc0 }, // Scanlist 149
{ 0x012c0a00, 0xc0 }, // Scanlist 150
{ 0x012c0c00, 0xc0 }, // Scanlist 151
{ 0x012c0e00, 0xc0 }, // Scanlist 152
{ 0x012c1000, 0xc0 }, // Scanlist 153
{ 0x012c1200, 0xc0 }, // Scanlist 154
{ 0x012c1400, 0xc0 }, // Scanlist 155
{ 0x012c1600, 0xc0 }, // Scanlist 156
{ 0x012c1800, 0xc0 }, // Scanlist 157
{ 0x012c1a00, 0xc0 }, // Scanlist 158
{ 0x012c1c00, 0xc0 }, // Scanlist 159
{ 0x012c1e00, 0xc0 }, // Scanlist 160
{ 0x01300000, 0xc0 }, // Scanlist 161
{ 0x01300200, 0xc0 }, // Scanlist 162
{ 0x01300400, 0xc0 }, // Scanlist 163
{ 0x01300600, 0xc0 }, // Scanlist 164
{ 0x01300800, 0xc0 }, // Scanlist 165
{ 0x01300a00, 0xc0 }, // Scanlist 166
{ 0x01300c00, 0xc0 }, // Scanlist 167
{ 0x01300e00, 0xc0 }, // Scanlist 168
{ 0x01301000, 0xc0 }, // Scanlist 169
{ 0x01301200, 0xc0 }, // Scanlist 170
{ 0x01301400, 0xc0 }, // Scanlist 171
{ 0x01301600, 0xc0 }, // Scanlist 172
{ 0x01301800, 0xc0 }, // Scanlist 173
{ 0x01301a00, 0xc0 }, // Scanlist 174
{ 0x01301c00, 0xc0 }, // Scanlist 175
{ 0x01301e00, 0xc0 }, // Scanlist 176
{ 0x01340000, 0xc0 }, // Scanlist 177
{ 0x01340200, 0xc0 }, // Scanlist 178
{ 0x01340400, 0xc0 }, // Scanlist 179
{ 0x01340600, 0xc0 }, // Scanlist 180
{ 0x01340800, 0xc0 }, // Scanlist 181
{ 0x01340a00, 0xc0 }, // Scanlist 182
{ 0x01340c00, 0xc0 }, // Scanlist 183
{ 0x01340e00, 0xc0 }, // Scanlist 184
{ 0x01341000, 0xc0 }, // Scanlist 185
{ 0x01341200, 0xc0 }, // Scanlist 186
{ 0x01341400, 0xc0 }, // Scanlist 187
{ 0x01341600, 0xc0 }, // Scanlist 188
{ 0x01341800, 0xc0 }, // Scanlist 189
{ 0x01341a00, 0xc0 }, // Scanlist 190
{ 0x01341c00, 0xc0 }, // Scanlist 191
{ 0x01341e00, 0xc0 }, // Scanlist 192
{ 0x01380000, 0xc0 }, // Scanlist 193
{ 0x01380200, 0xc0 }, // Scanlist 194
{ 0x01380400, 0xc0 }, // Scanlist 195
{ 0x01380600, 0xc0 }, // Scanlist 196
{ 0x01380800, 0xc0 }, // Scanlist 197
{ 0x01380a00, 0xc0 }, // Scanlist 198
{ 0x01380c00, 0xc0 }, // Scanlist 199
{ 0x01380e00, 0xc0 }, // Scanlist 200
{ 0x01381000, 0xc0 }, // Scanlist 201
{ 0x01381200, 0xc0 }, // Scanlist 202
{ 0x01381400, 0xc0 }, // Scanlist 203
{ 0x01381600, 0xc0 }, // Scanlist 204
{ 0x01381800, 0xc0 }, // Scanlist 205
{ 0x01381a00, 0xc0 }, // Scanlist 206
{ 0x01381c00, 0xc0 }, // Scanlist 207
{ 0x01381e00, 0xc0 }, // Scanlist 208
{ 0x013c0000, 0xc0 }, // Scanlist 209
{ 0x013c0200, 0xc0 }, // Scanlist 210
{ 0x013c0400, 0xc0 }, // Scanlist 211
{ 0x013c0600, 0xc0 }, // Scanlist 212
{ 0x013c0800, 0xc0 }, // Scanlist 213
{ 0x013c0a00, 0xc0 }, // Scanlist 214
{ 0x013c0c00, 0xc0 }, // Scanlist 215
{ 0x013c0e00, 0xc0 }, // Scanlist 216
{ 0x013c1000, 0xc0 }, // Scanlist 217
{ 0x013c1200, 0xc0 }, // Scanlist 218
{ 0x013c1400, 0xc0 }, // Scanlist 219
{ 0x013c1600, 0xc0 }, // Scanlist 220
{ 0x013c1800, 0xc0 }, // Scanlist 221
{ 0x013c1a00, 0xc0 }, // Scanlist 222
{ 0x013c1c00, 0xc0 }, // Scanlist 223
{ 0x013c1e00, 0xc0 }, // Scanlist 224
{ 0x01400000, 0xc0 }, // Scanlist 225
{ 0x01400200, 0xc0 }, // Scanlist 226
{ 0x01400400, 0xc0 }, // Scanlist 227
{ 0x01400600, 0xc0 }, // Scanlist 228
{ 0x01400800, 0xc0 }, // Scanlist 229
{ 0x01400a00, 0xc0 }, // Scanlist 230
{ 0x01400c00, 0xc0 }, // Scanlist 231
{ 0x01400e00, 0xc0 }, // Scanlist 232
{ 0x01401000, 0xc0 }, // Scanlist 233
{ 0x01401200, 0xc0 }, // Scanlist 234
{ 0x01401400, 0xc0 }, // Scanlist 235
{ 0x01401600, 0xc0 }, // Scanlist 236
{ 0x01401800, 0xc0 }, // Scanlist 237
{ 0x01401a00, 0xc0 }, // Scanlist 238
{ 0x01401c00, 0xc0 }, // Scanlist 239
{ 0x01401e00, 0xc0 }, // Scanlist 240
{ 0x01440000, 0xc0 }, // Scanlist 241
{ 0x01440200, 0xc0 }, // Scanlist 242
{ 0x01440400, 0xc0 }, // Scanlist 243
{ 0x01440600, 0xc0 }, // Scanlist 244
{ 0x01440800, 0xc0 }, // Scanlist 245
{ 0x01440a00, 0xc0 }, // Scanlist 246
{ 0x01440c00, 0xc0 }, // Scanlist 247
{ 0x01440e00, 0xc0 }, // Scanlist 248
{ 0x01441000, 0xc0 }, // Scanlist 249
{ 0x01441200, 0xc0 }, // Scanlist 250
{ 0x01640000, 0x640 }, // Unknown index
{ 0x01640800, 0xc0 }, // Zeroes?
{ 0x02140000, 0x800 }, // Messages 1-8
{ 0x02180000, 0x800 }, // Messages 9-16
{ 0x021c0000, 0x800 }, // Messages 17-24
{ 0x02200000, 0x800 }, // Messages 25-32
{ 0x02240000, 0x800 }, // Messages 33-40
{ 0x02280000, 0x800 }, // Messages 41-48
{ 0x022c0000, 0x800 }, // Messages 49-56
{ 0x02300000, 0x800 }, // Messages 57-64
{ 0x02340000, 0x800 }, // Messages 65-72
{ 0x02380000, 0x800 }, // Messages 73-80
{ 0x023c0000, 0x800 }, // Messages 81-88
{ 0x02400000, 0x800 }, // Messages 89-96
{ 0x02440000, 0x400 }, // Messages 97-100
{ 0x02480000, 0x1c0 }, // Unknown index
{ 0x02480200, 0x40 }, // Unknown bitmap
{ 0x024c0000, 0x40 }, // Unknown data
{ 0x024c0c80, 0x40 }, // Unknown data
{ 0x024c0d00, 0x200 }, // Zeroes?
{ 0x024c1000, 0x140 }, // Unknown data
{ 0x024c1280, 0x40 }, // Unknown data
{ 0x024c1300, 0x80 }, // Unknown data
{ 0x024c1400, 0x80 }, // Unknown data
{ 0x024c1500, 0x240 }, // Channel bitmap
{ 0x024c1800, 0x500 }, // Zeroes?
{ 0x024c2000, 0x440 }, // Unknown data
{ 0x024c2600, 0x40 }, // Unknown data
{ 0x02500000, 0x640 }, // Unknown data
{ 0x02501000, 0x40 }, // Unknown data
{ 0x02501100, 0x140 }, // GPS message
{ 0x02540000, 0x1f40 }, // Zones 1-250
{ 0x02580000, 0x1f40 }, // Radio ID 1-250
{ 0x025c0000, 0x880 }, // Unknown data, status message
{ 0x025c0b00, 0x40 }, // Unknown data
{ 0x02600000, 0x9c40 }, // Unknown data, bitmap
{ 0x02640000, 0x500 }, // Unknown data, bitmap
{ 0x02680000, 0xf4240 }, // Contacts 1-10000
{ 0x02900000, 0x80 }, // Unknown index
{ 0x02900100, 0x80 }, // Unknown index
{ 0x02940000, 0x180 }, // AnalogContacts 1-128
{ 0x02980000, 0x140 }, // Grouplist 1
{ 0x02980200, 0x140 }, // Grouplist 2
{ 0x02980400, 0x140 }, // Grouplist 3
{ 0x02980600, 0x140 }, // Grouplist 4
{ 0x02980800, 0x140 }, // Grouplist 5
{ 0x02980a00, 0x140 }, // Grouplist 6
{ 0x02980c00, 0x140 }, // Grouplist 7
{ 0x02980e00, 0x140 }, // Grouplist 8
{ 0x02981000, 0x140 }, // Grouplist 9
{ 0x02981200, 0x140 }, // Grouplist 10
{ 0x02981400, 0x140 }, // Grouplist 11
{ 0x02981600, 0x140 }, // Grouplist 12
{ 0x02981800, 0x140 }, // Grouplist 13
{ 0x02981a00, 0x140 }, // Grouplist 14
{ 0x02981c00, 0x140 }, // Grouplist 15
{ 0x02981e00, 0x140 }, // Grouplist 16
{ 0x02982000, 0x140 }, // Grouplist 17
{ 0x02982200, 0x140 }, // Grouplist 18
{ 0x02982400, 0x140 }, // Grouplist 19
{ 0x02982600, 0x140 }, // Grouplist 20
{ 0x02982800, 0x140 }, // Grouplist 21
{ 0x02982a00, 0x140 }, // Grouplist 22
{ 0x02982c00, 0x140 }, // Grouplist 23
{ 0x02982e00, 0x140 }, // Grouplist 24
{ 0x02983000, 0x140 }, // Grouplist 25
{ 0x02983200, 0x140 }, // Grouplist 26
{ 0x02983400, 0x140 }, // Grouplist 27
{ 0x02983600, 0x140 }, // Grouplist 28
{ 0x02983800, 0x140 }, // Grouplist 29
{ 0x02983a00, 0x140 }, // Grouplist 30
{ 0x02983c00, 0x140 }, // Grouplist 31
{ 0x02983e00, 0x140 }, // Grouplist 32
{ 0x02984000, 0x140 }, // Grouplist 33
{ 0x02984200, 0x140 }, // Grouplist 34
{ 0x02984400, 0x140 }, // Grouplist 35
{ 0x02984600, 0x140 }, // Grouplist 36
{ 0x02984800, 0x140 }, // Grouplist 37
{ 0x02984a00, 0x140 }, // Grouplist 38
{ 0x02984c00, 0x140 }, // Grouplist 39
{ 0x02984e00, 0x140 }, // Grouplist 40
{ 0x02985000, 0x140 }, // Grouplist 41
{ 0x02985200, 0x140 }, // Grouplist 42
{ 0x02985400, 0x140 }, // Grouplist 43
{ 0x02985600, 0x140 }, // Grouplist 44
{ 0x02985800, 0x140 }, // Grouplist 45
{ 0x02985a00, 0x140 }, // Grouplist 46
{ 0x02985c00, 0x140 }, // Grouplist 47
{ 0x02985e00, 0x140 }, // Grouplist 48
{ 0x02986000, 0x140 }, // Grouplist 49
{ 0x02986200, 0x140 }, // Grouplist 50
{ 0x02986400, 0x140 }, // Grouplist 51
{ 0x02986600, 0x140 }, // Grouplist 52
{ 0x02986800, 0x140 }, // Grouplist 53
{ 0x02986a00, 0x140 }, // Grouplist 54
{ 0x02986c00, 0x140 }, // Grouplist 55
{ 0x02986e00, 0x140 }, // Grouplist 56
{ 0x02987000, 0x140 }, // Grouplist 57
{ 0x02987200, 0x140 }, // Grouplist 58
{ 0x02987400, 0x140 }, // Grouplist 59
{ 0x02987600, 0x140 }, // Grouplist 60
{ 0x02987800, 0x140 }, // Grouplist 61
{ 0x02987a00, 0x140 }, // Grouplist 62
{ 0x02987c00, 0x140 }, // Grouplist 63
{ 0x02987e00, 0x140 }, // Grouplist 64
{ 0x02988000, 0x140 }, // Grouplist 65
{ 0x02988200, 0x140 }, // Grouplist 66
{ 0x02988400, 0x140 }, // Grouplist 67
{ 0x02988600, 0x140 }, // Grouplist 68
{ 0x02988800, 0x140 }, // Grouplist 69
{ 0x02988a00, 0x140 }, // Grouplist 70
{ 0x02988c00, 0x140 }, // Grouplist 71
{ 0x02988e00, 0x140 }, // Grouplist 72
{ 0x02989000, 0x140 }, // Grouplist 73
{ 0x02989200, 0x140 }, // Grouplist 74
{ 0x02989400, 0x140 }, // Grouplist 75
{ 0x02989600, 0x140 }, // Grouplist 76
{ 0x02989800, 0x140 }, // Grouplist 77
{ 0x02989a00, 0x140 }, // Grouplist 78
{ 0x02989c00, 0x140 }, // Grouplist 79
{ 0x02989e00, 0x140 }, // Grouplist 80
{ 0x0298a000, 0x140 }, // Grouplist 81
{ 0x0298a200, 0x140 }, // Grouplist 82
{ 0x0298a400, 0x140 }, // Grouplist 83
{ 0x0298a600, 0x140 }, // Grouplist 84
{ 0x0298a800, 0x140 }, // Grouplist 85
{ 0x0298aa00, 0x140 }, // Grouplist 86
{ 0x0298ac00, 0x140 }, // Grouplist 87
{ 0x0298ae00, 0x140 }, // Grouplist 88
{ 0x0298b000, 0x140 }, // Grouplist 89
{ 0x0298b200, 0x140 }, // Grouplist 90
{ 0x0298b400, 0x140 }, // Grouplist 91
{ 0x0298b600, 0x140 }, // Grouplist 92
{ 0x0298b800, 0x140 }, // Grouplist 93
{ 0x0298ba00, 0x140 }, // Grouplist 94
{ 0x0298bc00, 0x140 }, // Grouplist 95
{ 0x0298be00, 0x140 }, // Grouplist 96
{ 0x0298c000, 0x140 }, // Grouplist 97
{ 0x0298c200, 0x140 }, // Grouplist 98
{ 0x0298c400, 0x140 }, // Grouplist 99
{ 0x0298c600, 0x140 }, // Grouplist 100
{ 0x0298c800, 0x140 }, // Grouplist 101
{ 0x0298ca00, 0x140 }, // Grouplist 102
{ 0x0298cc00, 0x140 }, // Grouplist 103
{ 0x0298ce00, 0x140 }, // Grouplist 104
{ 0x0298d000, 0x140 }, // Grouplist 105
{ 0x0298d200, 0x140 }, // Grouplist 106
{ 0x0298d400, 0x140 }, // Grouplist 107
{ 0x0298d600, 0x140 }, // Grouplist 108
{ 0x0298d800, 0x140 }, // Grouplist 109
{ 0x0298da00, 0x140 }, // Grouplist 110
{ 0x0298dc00, 0x140 }, // Grouplist 111
{ 0x0298de00, 0x140 }, // Grouplist 112
{ 0x0298e000, 0x140 }, // Grouplist 113
{ 0x0298e200, 0x140 }, // Grouplist 114
{ 0x0298e400, 0x140 }, // Grouplist 115
{ 0x0298e600, 0x140 }, // Grouplist 116
{ 0x0298e800, 0x140 }, // Grouplist 117
{ 0x0298ea00, 0x140 }, // Grouplist 118
{ 0x0298ec00, 0x140 }, // Grouplist 119
{ 0x0298ee00, 0x140 }, // Grouplist 120
{ 0x0298f000, 0x140 }, // Grouplist 121
{ 0x0298f200, 0x140 }, // Grouplist 122
{ 0x0298f400, 0x140 }, // Grouplist 123
{ 0x0298f600, 0x140 }, // Grouplist 124
{ 0x0298f800, 0x140 }, // Grouplist 125
{ 0x0298fa00, 0x140 }, // Grouplist 126
{ 0x0298fc00, 0x140 }, // Grouplist 127
{ 0x0298fe00, 0x140 }, // Grouplist 128
{ 0x02990000, 0x140 }, // Grouplist 129
{ 0x02990200, 0x140 }, // Grouplist 130
{ 0x02990400, 0x140 }, // Grouplist 131
{ 0x02990600, 0x140 }, // Grouplist 132
{ 0x02990800, 0x140 }, // Grouplist 133
{ 0x02990a00, 0x140 }, // Grouplist 134
{ 0x02990c00, 0x140 }, // Grouplist 135
{ 0x02990e00, 0x140 }, // Grouplist 136
{ 0x02991000, 0x140 }, // Grouplist 137
{ 0x02991200, 0x140 }, // Grouplist 138
{ 0x02991400, 0x140 }, // Grouplist 139
{ 0x02991600, 0x140 }, // Grouplist 140
{ 0x02991800, 0x140 }, // Grouplist 141
{ 0x02991a00, 0x140 }, // Grouplist 142
{ 0x02991c00, 0x140 }, // Grouplist 143
{ 0x02991e00, 0x140 }, // Grouplist 144
{ 0x02992000, 0x140 }, // Grouplist 145
{ 0x02992200, 0x140 }, // Grouplist 146
{ 0x02992400, 0x140 }, // Grouplist 147
{ 0x02992600, 0x140 }, // Grouplist 148
{ 0x02992800, 0x140 }, // Grouplist 149
{ 0x02992a00, 0x140 }, // Grouplist 150
{ 0x02992c00, 0x140 }, // Grouplist 151
{ 0x02992e00, 0x140 }, // Grouplist 152
{ 0x02993000, 0x140 }, // Grouplist 153
{ 0x02993200, 0x140 }, // Grouplist 154
{ 0x02993400, 0x140 }, // Grouplist 155
{ 0x02993600, 0x140 }, // Grouplist 156
{ 0x02993800, 0x140 }, // Grouplist 157
{ 0x02993a00, 0x140 }, // Grouplist 158
{ 0x02993c00, 0x140 }, // Grouplist 159
{ 0x02993e00, 0x140 }, // Grouplist 160
{ 0x02994000, 0x140 }, // Grouplist 161
{ 0x02994200, 0x140 }, // Grouplist 162
{ 0x02994400, 0x140 }, // Grouplist 163
{ 0x02994600, 0x140 }, // Grouplist 164
{ 0x02994800, 0x140 }, // Grouplist 165
{ 0x02994a00, 0x140 }, // Grouplist 166
{ 0x02994c00, 0x140 }, // Grouplist 167
{ 0x02994e00, 0x140 }, // Grouplist 168
{ 0x02995000, 0x140 }, // Grouplist 169
{ 0x02995200, 0x140 }, // Grouplist 170
{ 0x02995400, 0x140 }, // Grouplist 171
{ 0x02995600, 0x140 }, // Grouplist 172
{ 0x02995800, 0x140 }, // Grouplist 173
{ 0x02995a00, 0x140 }, // Grouplist 174
{ 0x02995c00, 0x140 }, // Grouplist 175
{ 0x02995e00, 0x140 }, // Grouplist 176
{ 0x02996000, 0x140 }, // Grouplist 177
{ 0x02996200, 0x140 }, // Grouplist 178
{ 0x02996400, 0x140 }, // Grouplist 179
{ 0x02996600, 0x140 }, // Grouplist 180
{ 0x02996800, 0x140 }, // Grouplist 181
{ 0x02996a00, 0x140 }, // Grouplist 182
{ 0x02996c00, 0x140 }, // Grouplist 183
{ 0x02996e00, 0x140 }, // Grouplist 184
{ 0x02997000, 0x140 }, // Grouplist 185
{ 0x02997200, 0x140 }, // Grouplist 186
{ 0x02997400, 0x140 }, // Grouplist 187
{ 0x02997600, 0x140 }, // Grouplist 188
{ 0x02997800, 0x140 }, // Grouplist 189
{ 0x02997a00, 0x140 }, // Grouplist 190
{ 0x02997c00, 0x140 }, // Grouplist 191
{ 0x02997e00, 0x140 }, // Grouplist 192
{ 0x02998000, 0x140 }, // Grouplist 193
{ 0x02998200, 0x140 }, // Grouplist 194
{ 0x02998400, 0x140 }, // Grouplist 195
{ 0x02998600, 0x140 }, // Grouplist 196
{ 0x02998800, 0x140 }, // Grouplist 197
{ 0x02998a00, 0x140 }, // Grouplist 198
{ 0x02998c00, 0x140 }, // Grouplist 199
{ 0x02998e00, 0x140 }, // Grouplist 200
{ 0x02999000, 0x140 }, // Grouplist 201
{ 0x02999200, 0x140 }, // Grouplist 202
{ 0x02999400, 0x140 }, // Grouplist 203
{ 0x02999600, 0x140 }, // Grouplist 204
{ 0x02999800, 0x140 }, // Grouplist 205
{ 0x02999a00, 0x140 }, // Grouplist 206
{ 0x02999c00, 0x140 }, // Grouplist 207
{ 0x02999e00, 0x140 }, // Grouplist 208
{ 0x0299a000, 0x140 }, // Grouplist 209
{ 0x0299a200, 0x140 }, // Grouplist 210
{ 0x0299a400, 0x140 }, // Grouplist 211
{ 0x0299a600, 0x140 }, // Grouplist 212
{ 0x0299a800, 0x140 }, // Grouplist 213
{ 0x0299aa00, 0x140 }, // Grouplist 214
{ 0x0299ac00, 0x140 }, // Grouplist 215
{ 0x0299ae00, 0x140 }, // Grouplist 216
{ 0x0299b000, 0x140 }, // Grouplist 217
{ 0x0299b200, 0x140 }, // Grouplist 218
{ 0x0299b400, 0x140 }, // Grouplist 219
{ 0x0299b600, 0x140 }, // Grouplist 220
{ 0x0299b800, 0x140 }, // Grouplist 221
{ 0x0299ba00, 0x140 }, // Grouplist 222
{ 0x0299bc00, 0x140 }, // Grouplist 223
{ 0x0299be00, 0x140 }, // Grouplist 224
{ 0x0299c000, 0x140 }, // Grouplist 225
{ 0x0299c200, 0x140 }, // Grouplist 226
{ 0x0299c400, 0x140 }, // Grouplist 227
{ 0x0299c600, 0x140 }, // Grouplist 228
{ 0x0299c800, 0x140 }, // Grouplist 229
{ 0x0299ca00, 0x140 }, // Grouplist 230
{ 0x0299cc00, 0x140 }, // Grouplist 231
{ 0x0299ce00, 0x140 }, // Grouplist 232
{ 0x0299d000, 0x140 }, // Grouplist 233
{ 0x0299d200, 0x140 }, // Grouplist 234
{ 0x0299d400, 0x140 }, // Grouplist 235
{ 0x0299d600, 0x140 }, // Grouplist 236
{ 0x0299d800, 0x140 }, // Grouplist 237
{ 0x0299da00, 0x140 }, // Grouplist 238
{ 0x0299dc00, 0x140 }, // Grouplist 239
{ 0x0299de00, 0x140 }, // Grouplist 240
{ 0x0299e000, 0x140 }, // Grouplist 241
{ 0x0299e200, 0x140 }, // Grouplist 242
{ 0x0299e400, 0x140 }, // Grouplist 243
{ 0x0299e600, 0x140 }, // Grouplist 244
{ 0x0299e800, 0x140 }, // Grouplist 245
{ 0x0299ea00, 0x140 }, // Grouplist 246
{ 0x0299ec00, 0x140 }, // Grouplist 247
{ 0x0299ee00, 0x140 }, // Grouplist 248
{ 0x0299f000, 0x140 }, // Grouplist 249
{ 0x0299f200, 0x140 }, // Grouplist 250
{ 0x04280000, 0x300 }, // Unknown index
{ 0, 0 },

1279
d868uv.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,167 +1,191 @@
# #
# Generic DMR configuration for South Bay Area. # Generic DMR configuration for South Bay Area.
# #
# Schedules (PDT):
# Monday 8-10 pm: PAPA DMR Roundtable, California (3106/TS1)
# Tuesday 8-9 pm: SNARS DMR Net (31328/TS1)
# Wednesday 5:30-6:30 pm: Texas Statewide Net (3148/TS1)
# Thursday 7-7:30 pm: NorCal DMR Net (31068/TS2)
# Thursday 8-10 pm: PAPA Tech Roundtable, XRF012A, analog&D-STAR (31078/TS1)
# Saturday 9-11 am: Worldwide Net (91/TS1)
#
Radio: Baofeng RD-5R Radio: Baofeng RD-5R
# Table of digital channels. # Table of digital channels.
# 1) Channel number: 1-1000 # 1) Channel number: 1-1024
# 2) Name: up to 16 characters, use '_' instead of space # 2) Name: up to 16 characters, use '_' instead of space
# 3) Receive frequency in MHz # 3) Receive frequency in MHz
# 4) Transmit frequency or +/- offset in MHz # 4) Transmit frequency or +/- offset in MHz
# 5) Transmit power: High, Low # 5) Transmit power: High, Low
# 6) Scan list: - or index in Scanlist table # 6) Scan list: - or index in Scanlist table
# 7) Autoscan flag: -, + # 7) Transmit timeout timer in seconds: 0, 15, 30, 45... 555
# 8) Transmit timeout timer in seconds: 0, 15, 30, 45... 555 # 8) Receive only: -, +
# 9) Receive only: -, + # 9) Admit criteria: -, Free, Color
# 10) Admit criteria: -, Free, Color # 10) Color code: 0, 1, 2, 3... 15
# 11) Color code: 1, 2, 3... 15 # 11) Time slot: 1 or 2
# 12) Time slot: 1 or 2 # 12) Receive group list: - or index in Grouplist table
# 13) In call criteria: -, Admit, TXInt # 13) Contact for transmit: - or index in Contacts table
# 14) Receive group list: - or index in Grouplist table
# 15) Contact for transmit: - or index in Contacts table
# #
Digital Name Receive Transmit Power Scan TOT RO Admit Color Slot RxGL TxContact Digital Name Receive Transmit Power Scan TOT RO Admit Color Slot RxGL TxContact
# (1) W6TCP, Milpitas, NorCal # (1) W6TCP, Milpitas, NorCal
1 Mi_California 440.125 +5 High - 180 - Free 3 1 3 6 # 3106 California Static 1 Mi_RX_All 440.125 +5 Low - 180 + Color 3 1 1 - # Receive only
2 Mi_TAC_310 440.125 +5 High - 180 - Free 3 1 3 5 # 310 TAC 310 Dynamic 2 Mi_World 440.125 +5 High - 180 - Color 3 1 11 91 # 91 Worldwide Dynamic
3 Mi_Bay-Net 440.125 +5 High - 180 - Free 3 1 3 13 # 31075 Bay-Net Dynamic 3 Mi_North_America 440.125 +5 High - 180 - Color 3 1 12 93 # 93 North America Dynamic
4 Mi_World 440.125 +5 High - 180 - Free 3 1 3 3 # 91 Worldwide Dynamic 4 Mi_TAC_310 440.125 +5 High - 180 - Color 3 1 13 10 # 310 TAC 310 Dynamic
5 Mi_NorCal 440.125 +5 High - 180 - Free 3 2 3 11 # 31068 NorCal Static 5 Mi_TAC_311 440.125 +5 High - 180 - Color 3 1 14 11 # 311 TAC 311 Dynamic
6 Mi_Anarchy 440.125 +5 High - 180 - Free 3 2 3 18 # 31666 DMR of Anarchy Static 6 Mi_USA_Nation 440.125 +5 High - 180 - Color 3 1 15 100 # 3100 USA Nationwide Dynamic
7 Mi_NC_5150 440.125 +5 High - 180 - Free 3 2 3 19 # 95150 NorCal 5150 Static 7 Mi_California 440.125 +5 High - 180 - Color 3 1 16 106 # 3106 California Static
8 Mi_Parrot 440.125 +5 High - 180 - Free 3 2 3 24 # 9990 Parrot Private 8 Mi_NorCal 440.125 +5 High - 180 - Color 3 2 19 68 # 31068 NorCal Static
9 Mi_Bay-Net 440.125 +5 High - 180 - Color 3 1 20 75 # 31075 Bay-Net Dynamic
10 Mi_Anarchy 440.125 +5 High - 180 - Color 3 2 23 66 # 31666 DMR of Anarchy Static
11 Mi_NC_5150 440.125 +5 High - 180 - Color 3 2 24 95 # 95150 NorCal 5150 Static
12 Mi_Parrot 440.125 +5 High - 180 - Color 3 1 - 90 # 9990 Parrot Private
# (2) N6AMG, San Bruno, Baycom # (2) N6AMG, San Bruno, Baycom
11 Br_North_America 440.500 +5 High - 180 - Free 1 1 3 4 # 93 North America Static 21 Br_RX_All 440.500 +5 Low - 180 + Color 1 1 1 - # Receive only
12 Br_California 440.500 +5 High - 180 - Free 1 1 3 6 # 3106 California Static 22 Br_World 440.500 +5 High - 180 - Color 1 1 11 91 # 91 Worldwide Dynamic
13 Br_NC_AllStr 440.500 +5 High - 180 - Free 1 1 3 10 # 31065 NorCal AllStar Static 23 Br_North_America 440.500 +5 High - 180 - Color 1 1 12 93 # 93 North America Static
14 Br_Bay-Net 440.500 +5 High - 180 - Free 1 1 3 13 # 31075 Bay-Net Static 24 Br_TAC_310 440.500 +5 High - 180 - Color 1 1 13 10 # 310 TAC 310 Dynamic
15 Br_USA_Area6 440.500 +5 High - 180 - Free 1 1 3 15 # 31096 USA Area 6 Static 25 Br_TAC_311 440.500 +5 High - 180 - Color 1 1 14 11 # 311 TAC 311 Dynamic
16 Br_TAC_310 440.500 +5 High - 180 - Free 1 1 3 5 # 310 TAC 310 Dynamic 26 Br_USA_Nation 440.500 +5 High - 180 - Color 1 1 15 100 # 3100 USA Nationwide Dynamic
17 Br_World 440.500 +5 High - 180 - Free 1 1 3 3 # 91 Worldwide Dynamic 27 Br_California 440.500 +5 High - 180 - Color 1 1 16 106 # 3106 California Static
18 Br_Baycom 440.500 +5 High - 180 - Free 1 2 3 20 # 97150 Baycom Static 28 Br_NC_AllStr 440.500 +5 High - 180 - Color 1 1 18 65 # 31065 NorCal AllStar Static
19 Br_NorCal 440.500 +5 High - 180 - Free 1 2 3 11 # 31068 NorCal Dynamic 29 Br_NorCal 440.500 +5 High - 180 - Color 1 2 19 68 # 31068 NorCal Dynamic
20 Br_Anarchy 440.500 +5 High - 180 - Free 1 2 3 18 # 31666 DMR of Anarchy Dynamic 30 Br_Bay-Net 440.500 +5 High - 180 - Color 1 1 20 75 # 31075 Bay-Net Static
21 Br_NC_5150 440.500 +5 High - 180 - Free 1 2 3 19 # 95150 NorCal 5150 Dynamic 31 Br_USA_Area6 440.500 +5 High - 180 - Color 1 1 22 96 # 31096 USA Area 6 Static
22 Br_Parrot 440.500 +5 High - 180 - Free 1 2 3 24 # 9990 Parrot Private 32 Br_Anarchy 440.500 +5 High - 180 - Color 1 2 23 66 # 31666 DMR of Anarchy Dynamic
33 Br_NC_5150 440.500 +5 High - 180 - Color 1 2 24 95 # 95150 NorCal 5150 Dynamic
34 Br_Baycom 440.500 +5 High - 180 - Color 1 2 25 97 # 97150 Baycom Static
35 Br_Parrot 440.500 +5 High - 180 - Color 1 1 - 90 # 9990 Parrot Private
# (3) WB6ECE, Boulder Creek, Baycom # (3) WB6ECE, Boulder Creek, Baycom
31 Bo_North_America 440.5875 +5 High - 180 - Free 2 1 3 4 # 93 North America Static 41 Bo_RX_All 440.5875 +5 Low - 180 + Color 2 1 1 - # Receive only
32 Bo_California 440.5875 +5 High - 180 - Free 2 1 3 6 # 3106 California Static 42 Bo_World 440.5875 +5 High - 180 - Color 2 1 11 91 # 91 Worldwide Dynamic
33 Bo_Santa_Clara 440.5875 +5 High - 180 - Free 2 1 3 9 # 31064 Santa Clara County Static 43 Bo_North_America 440.5875 +5 High - 180 - Color 2 1 12 93 # 93 North America Static
34 Bo_NC_AllStr 440.5875 +5 High - 180 - Free 2 1 3 10 # 31065 NorCal AllStar Static 44 Bo_TAC_310 440.5875 +5 High - 180 - Color 2 1 13 10 # 310 TAC 310 Dynamic
35 Bo_Bay-Net 440.5875 +5 High - 180 - Free 2 1 3 13 # 31075 Bay-Net Static 45 Bo_TAC_311 440.5875 +5 High - 180 - Color 2 1 14 11 # 311 TAC 311 Dynamic
36 Bo_USA_Area6 440.5875 +5 High - 180 - Free 2 1 3 15 # 31096 USA Area 6 Static 46 Bo_USA_Nation 440.5875 +5 High - 180 - Color 2 1 15 100 # 3100 USA Nationwide Dynamic
37 Bo_TAC_310 440.5875 +5 High - 180 - Free 2 1 3 5 # 310 TAC 310 Dynamic 47 Bo_California 440.5875 +5 High - 180 - Color 2 1 16 106 # 3106 California Static
38 Bo_World 440.5875 +5 High - 180 - Free 2 1 3 3 # 91 Worldwide Dynamic 48 Bo_Santa_Clara 440.5875 +5 High - 180 - Color 2 1 17 64 # 31064 Santa Clara County Static
39 Bo_Baycom 440.5875 +5 High - 180 - Free 2 2 3 20 # 97150 Baycom Static 49 Bo_NC_AllStr 440.5875 +5 High - 180 - Color 2 1 18 65 # 31065 NorCal AllStar Static
40 Bo_NorCal 440.5875 +5 High - 180 - Free 2 2 3 11 # 31068 NorCal Dynamic 50 Bo_NorCal 440.5875 +5 High - 180 - Color 2 2 19 68 # 31068 NorCal Dynamic
41 Bo_Anarchy 440.5875 +5 High - 180 - Free 2 2 3 18 # 31666 DMR of Anarchy Dynamic 51 Bo_Bay-Net 440.5875 +5 High - 180 - Color 2 1 20 75 # 31075 Bay-Net Static
42 Bo_NC_5150 440.5875 +5 High - 180 - Free 2 2 3 19 # 95150 NorCal 5150 Dynamic 52 Bo_USA_Area6 440.5875 +5 High - 180 - Color 2 1 22 96 # 31096 USA Area 6 Static
43 Bo_Parrot 440.5875 +5 High - 180 - Free 2 2 3 24 # 9990 Parrot Private 53 Bo_Anarchy 440.5875 +5 High - 180 - Color 2 2 23 66 # 31666 DMR of Anarchy Dynamic
54 Bo_NC_5150 440.5875 +5 High - 180 - Color 2 2 24 95 # 95150 NorCal 5150 Dynamic
55 Bo_Baycom 440.5875 +5 High - 180 - Color 2 2 25 97 # 97150 Baycom Static
56 Bo_Parrot 440.5875 +5 High - 180 - Color 2 1 - 90 # 9990 Parrot Private
# (4) K6OTR, Palo Alto, Baycom # (4) K6OTR, Palo Alto, Baycom
51 PA_North_America 441.850 +5 High - 180 - Free 1 1 3 4 # 93 North America Static 61 PA_RX_All 441.850 +5 Low - 180 + Color 1 1 1 - # Receive only
52 PA_California 441.850 +5 High - 180 - Free 1 1 3 6 # 3106 California Static 62 PA_World 441.850 +5 High - 180 - Color 1 1 11 91 # 91 Worldwide Dynamic
53 PA_NC_AllStr 441.850 +5 High - 180 - Free 1 1 3 10 # 31065 NorCal AllStar Static 63 PA_North_America 441.850 +5 High - 180 - Color 1 1 12 93 # 93 North America Static
54 PA_Bay-Net 441.850 +5 High - 180 - Free 1 1 3 13 # 31075 Bay-Net Static 64 PA_TAC_310 441.850 +5 High - 180 - Color 1 1 13 10 # 310 TAC 310 Dynamic
55 PA_USA_Area6 441.850 +5 High - 180 - Free 1 1 3 15 # 31096 USA - Area 6 4646 Static 65 PA_TAC_311 441.850 +5 High - 180 - Color 1 1 14 11 # 311 TAC 311 Dynamic
56 PA_TAC_310 441.850 +5 High - 180 - Free 1 1 3 5 # 310 TAC 310 Dynamic 66 USA_Nation 441.850 +5 High - 180 - Color 1 1 15 100 # 3100 USA Nationwide Dynamic
57 PA_World 441.850 +5 High - 180 - Free 1 1 3 3 # 91 Worldwide Dynamic 67 PA_California 441.850 +5 High - 180 - Color 1 1 16 106 # 3106 California Static
58 PA_Baycom 441.850 +5 High - 180 - Free 1 2 3 20 # 97150 Baycom Static 68 PA_NC_AllStr 441.850 +5 High - 180 - Color 1 1 18 65 # 31065 NorCal AllStar Static
59 PA_NorCal 441.850 +5 High - 180 - Free 1 2 3 11 # 31068 NorCal Dynamic 69 PA_NorCal 441.850 +5 High - 180 - Color 1 2 19 68 # 31068 NorCal Dynamic
60 PA_Anarchy 441.850 +5 High - 180 - Free 1 2 3 18 # 31666 DMR of Anarchy Dynamic 70 PA_Bay-Net 441.850 +5 High - 180 - Color 1 1 20 75 # 31075 Bay-Net Static
61 PA_NC_5150 441.850 +5 High - 180 - Free 1 2 3 19 # 95150 NorCal 5150 Dynamic 71 PA_USA_Area6 441.850 +5 High - 180 - Color 1 1 22 96 # 31096 USA - Area 6 4646 Static
62 PA_Parrot 441.850 +5 High - 180 - Free 1 2 3 24 # 9990 Parrot Private 72 PA_Anarchy 441.850 +5 High - 180 - Color 1 2 23 66 # 31666 DMR of Anarchy Dynamic
73 PA_NC_5150 441.850 +5 High - 180 - Color 1 2 24 95 # 95150 NorCal 5150 Dynamic
74 PA_Baycom 441.850 +5 High - 180 - Color 1 2 25 97 # 97150 Baycom Static
75 PA_Parrot 441.850 +5 High - 180 - Color 1 1 - 90 # 9990 Parrot Private
# (5) KK6USZ, Saratoga # (5) KK6USZ, Saratoga
71 Sa_Nebraska 441.950 +5 High - 180 - Free 1 1 3 7 # 3131 Nebraska Static 81 Sa_RX_All 441.950 +5 Low - 180 + Color 1 1 1 - # Receive only
72 Sa_World 441.950 +5 High - 180 - Free 1 1 3 3 # 91 Worldwide Dynamic 82 Sa_World 441.950 +5 High - 180 - Color 1 1 11 91 # 91 Worldwide Dynamic
73 Sa_California 441.950 +5 High - 180 - Free 1 1 3 6 # 3106 California Dynamic 83 Sa_North_America 441.950 +5 High - 180 - Color 1 1 12 93 # 93 North America Dynamic
74 Sa_Texas 441.950 +5 High - 180 - Free 1 1 3 8 # 3148 Texas Dynamic 84 Sa_TAC_310 441.950 +5 High - 180 - Color 1 1 13 10 # 310 TAC 310 Dynamic
75 Sa_PAPA 441.950 +5 High - 180 - Free 1 1 3 14 # 31078 XLX013D PAPA Dynamic 85 Sa_TAC_311 441.950 +5 High - 180 - Color 1 1 14 11 # 311 TAC 311 Dynamic
76 Sa_TAC_310 441.950 +5 High - 180 - Free 1 1 3 5 # 310 TAC 310 Dynamic 86 Sa_USA_Nation 441.950 +5 High - 180 - Color 1 1 15 100 # 3100 USA Nationwide Dynamic
77 Sa_Santa_Clara 441.950 +5 High - 180 - Free 1 2 3 9 # 31064 Santa Clara County Static 87 Sa_California 441.950 +5 High - 180 - Color 1 1 16 106 # 3106 California Dynamic
78 Sa_NorCal 441.950 +5 High - 180 - Free 1 2 3 11 # 31068 NorCal Static 88 Sa_Nebraska 441.950 +5 High - 180 - Color 1 1 26 131 # 3131 Nebraska Static
79 Sa_Bay-Net 441.950 +5 High - 180 - Free 1 2 3 13 # 31075 Bay-Net Static 89 Sa_Texas 441.950 +5 High - 180 - Color 1 1 27 148 # 3148 Texas Dynamic
80 Sa_Baycom 441.950 +5 High - 180 - Free 1 2 3 20 # 97150 Baycom Static 90 Sa_Santa_Clara 441.950 +5 High - 180 - Color 1 2 17 64 # 31064 Santa Clara County Static
81 Sa_Clst_KK6USZ 441.950 +5 High - 180 - Free 1 2 3 21 # 110670 Cluster KK6USZ Static 91 Sa_NorCal 441.950 +5 High - 180 - Color 1 2 19 68 # 31068 NorCal Static
82 Sa_Anarchy 441.950 +5 High - 180 - Free 1 2 3 18 # 31666 DMR of Anarchy Dynamic 92 Sa_Bay-Net 441.950 +5 High - 180 - Color 1 2 20 75 # 31075 Bay-Net Static
83 Sa_NC_5150 441.950 +5 High - 180 - Free 1 2 3 19 # 95150 NorCal 5150 Dynamic 93 Sa_Anarchy 441.950 +5 High - 180 - Color 1 2 23 66 # 31666 DMR of Anarchy Dynamic
84 Sa_Parrot 441.950 +5 High - 180 - Free 1 2 3 24 # 9990 Parrot Private 94 Sa_NC_5150 441.950 +5 High - 180 - Color 1 2 24 95 # 95150 NorCal 5150 Dynamic
95 Sa_Baycom 441.950 +5 High - 180 - Color 1 2 25 97 # 97150 Baycom Static
96 Sa_Parrot 441.950 +5 High - 180 - Color 1 1 - 90 # 9990 Parrot Private
# (6) WA6YCZ, Mt Umunhum, Baycom # (6) WA6YCZ, Mt Umunhum, Baycom
91 Um_North_America 442.5375 +5 High - 180 - Free 1 1 3 4 # 93 North America Static 101 Um_RX_All 442.5375 +5 Low - 180 + Color 1 1 1 - # Receive only
92 Um_California 442.5375 +5 High - 180 - Free 1 1 3 6 # 3106 California Static 102 Um_World 442.5375 +5 High - 180 - Color 1 1 11 91 # 91 Worldwide Dynamic
93 Um_Santa_Clara 442.5375 +5 High - 180 - Free 1 1 3 9 # 31064 Santa Clara County Static 103 Um_North_America 442.5375 +5 High - 180 - Color 1 1 12 93 # 93 North America Static
94 Um_NC_AllStr 442.5375 +5 High - 180 - Free 1 1 3 10 # 31065 NorCal AllStar Static 104 Um_TAC_310 442.5375 +5 High - 180 - Color 1 1 13 10 # 310 TAC 310 Dynamic
95 Um_Bay-Net 442.5375 +5 High - 180 - Free 1 1 3 13 # 31075 Bay-Net Static 105 Um_TAC_311 442.5375 +5 High - 180 - Color 1 1 14 11 # 311 TAC 311 Dynamic
96 Um_USA_Area6 442.5375 +5 High - 180 - Free 1 1 3 15 # 31096 USA Area 6 Static 106 Um_USA_Nation 442.5375 +5 High - 180 - Color 1 1 15 100 # 3100 USA Nationwide Dynamic
97 Um_TAC_310 442.5375 +5 High - 180 - Free 1 1 3 5 # 310 TAC 310 Dynamic 107 Um_California 442.5375 +5 High - 180 - Color 1 1 16 106 # 3106 California Static
98 Um_World 442.5375 +5 High - 180 - Free 1 1 3 3 # 91 Worldwide Dynamic 108 Um_Santa_Clara 442.5375 +5 High - 180 - Color 1 1 17 64 # 31064 Santa Clara County Static
99 Um_Baycom 442.5375 +5 High - 180 - Free 1 2 3 20 # 97150 Baycom Static 109 Um_NC_AllStr 442.5375 +5 High - 180 - Color 1 1 18 65 # 31065 NorCal AllStar Static
100 Um_NorCal 442.5375 +5 High - 180 - Free 1 2 3 11 # 31068 NorCal Dynamic 110 Um_NorCal 442.5375 +5 High - 180 - Color 1 2 19 68 # 31068 NorCal Dynamic
101 Um_Anarchy 442.5375 +5 High - 180 - Free 1 2 3 18 # 31666 DMR of Anarchy Dynamic 111 Um_Bay-Net 442.5375 +5 High - 180 - Color 1 1 20 75 # 31075 Bay-Net Static
102 Um_NC_5150 442.5375 +5 High - 180 - Free 1 2 3 19 # 95150 NorCal 5150 Dynamic 112 Um_USA_Area6 442.5375 +5 High - 180 - Color 1 1 22 96 # 31096 USA Area 6 Static
103 Um_Parrot 442.5375 +5 High - 180 - Free 1 2 3 24 # 9990 Parrot Private 113 Um_Anarchy 442.5375 +5 High - 180 - Color 1 2 23 66 # 31666 DMR of Anarchy Dynamic
114 Um_NC_5150 442.5375 +5 High - 180 - Color 1 2 24 95 # 95150 NorCal 5150 Dynamic
115 Um_Baycom 442.5375 +5 High - 180 - Color 1 2 25 97 # 97150 Baycom Static
116 Um_Parrot 442.5375 +5 High - 180 - Color 1 1 - 90 # 9990 Parrot Private
# (7) K6LNK, Berkeley, NorCal, Carla # (7) K6LNK, Berkeley, NorCal, Carla
101 Be_California 443.500 +5 High - 180 - Free 1 1 3 6 # 3106 California Static 121 Be_RX_All 443.500 +5 Low - 180 + Color 1 1 1 - # Receive only
102 Be_KPARN 443.500 +5 High - 180 - Free 1 1 3 12 # 31072 KPARN Static 122 Be_World 443.500 +5 High - 180 - Color 1 1 11 91 # 91 Worldwide Dynamic
103 Be_SNARS 443.500 +5 High - 180 - Free 1 1 3 16 # 31328 SNARS (Reno/Tahoe) Static 123 Be_North_America 443.500 +5 High - 180 - Color 1 1 12 93 # 93 North America Dynamic
104 Be_SNARS_2 443.500 +5 High - 180 - Free 1 1 3 17 # 31329 SNARS 2 Static 124 Be_TAC_310 443.500 +5 High - 180 - Color 1 1 13 10 # 310 TAC 310 Dynamic
105 Be_Clst_K6LNK 443.500 +5 High - 180 - Free 1 1 3 2 # 23 Cluster K6LNK Static 125 Be_TAC_311 443.500 +5 High - 180 - Color 1 1 14 11 # 311 TAC 311 Dynamic
106 Be_TAC_310 443.500 +5 High - 180 - Free 1 1 3 5 # 310 TAC 310 Dynamic 126 Be_USA_Nation 443.500 +5 High - 180 - Color 1 1 15 100 # 3100 USA Nationwide Dynamic
107 Be_Bay-Net 443.500 +5 High - 180 - Free 1 1 3 13 # 31075 Bay-Net Dynamic 127 Be_California 443.500 +5 High - 180 - Color 1 1 16 106 # 3106 California Static
108 Be_World 443.500 +5 High - 180 - Free 1 1 3 3 # 91 Worldwide Dynamic 128 Be_NorCal 443.500 +5 High - 180 - Color 1 2 19 68 # 31068 NorCal Static
109 Be_NorCal 443.500 +5 High - 180 - Free 1 2 3 11 # 31068 NorCal Static 129 Be_Bay-Net 443.500 +5 High - 180 - Color 1 1 20 75 # 31075 Bay-Net Dynamic
110 Be_CARLA 443.500 +5 High - 180 - Free 1 2 3 22 # 310604 CARLA Static 130 Be_Anarchy 443.500 +5 High - 180 - Color 1 2 23 66 # 31666 DMR of Anarchy Dynamic
111 Be_Tri-LERT 443.500 +5 High - 180 - Free 1 2 3 23 # 310703 Tri-LERT Static 131 Be_NC_5150 443.500 +5 High - 180 - Color 1 2 24 95 # 95150 NorCal 5150 Dynamic
112 Be_Clst_CARLA 443.500 +5 High - 180 - Free 1 2 3 1 # 21 Cluster CARLA Static 132 Be_Parrot 443.500 +5 High - 180 - Color 1 1 - 90 # 9990 Parrot Private
113 Be_Anarchy 443.500 +5 High - 180 - Free 1 2 3 18 # 31666 DMR of Anarchy Dynamic
114 Be_NC_5150 443.500 +5 High - 180 - Free 1 2 3 19 # 95150 NorCal 5150 Dynamic
115 Be_Parrot 443.500 +5 High - 180 - Free 1 2 3 24 # 9990 Parrot Private
# (8) K6HLE, Loma Prieta, NorCal, AREA # (8) K6HLE, Loma Prieta, NorCal, AREA
121 Lo_North_America 444.025 +5 High - 180 - Free 1 1 3 4 # 93 North America Static 141 Lo_RX_All 444.025 +5 Low - 180 + Color 1 1 1 - # Receive only
122 Lo_California 444.025 +5 High - 180 - Free 1 1 3 6 # 3106 California Static 142 Lo_World 444.025 +5 High - 180 - Color 1 1 11 91 # 91 Worldwide Dynamic
123 Lo_USA_Area_6 444.025 +5 High - 180 - Free 1 1 3 15 # 31096 USA - Area 6 4646 Static 143 Lo_North_America 444.025 +5 High - 180 - Color 1 1 12 93 # 93 North America Static
124 Lo_TAC_310 444.025 +5 High - 180 - Free 1 1 3 5 # 310 TAC 310 Dynamic 144 Lo_TAC_310 444.025 +5 High - 180 - Color 1 1 13 10 # 310 TAC 310 Dynamic
125 Lo_Bay-Net 444.025 +5 High - 180 - Free 1 1 3 13 # 31075 Bay-Net Dynamic 145 Lo_TAC_311 444.025 +5 High - 180 - Color 1 1 14 11 # 311 TAC 311 Dynamic
126 Lo_World 444.025 +5 High - 180 - Free 1 1 3 3 # 91 Worldwide Dynamic 146 Lo_USA_Nation 444.025 +5 High - 180 - Color 1 1 15 100 # 3100 USA Nationwide Dynamic
127 Lo_NorCal 444.025 +5 High - 180 - Free 1 2 3 11 # 31068 NorCal Static 147 Lo_California 444.025 +5 High - 180 - Color 1 1 16 106 # 3106 California Static
128 Lo_Anarchy 444.025 +5 High - 180 - Free 1 2 3 18 # 31666 DMR of Anarchy Dynamic 148 Lo_NorCal 444.025 +5 High - 180 - Color 1 2 19 68 # 31068 NorCal Static
129 Lo_NC_5150 444.025 +5 High - 180 - Free 1 2 3 19 # 95150 NorCal 5150 Dynamic 149 Lo_Bay-Net 444.025 +5 High - 180 - Color 1 1 20 75 # 31075 Bay-Net Dynamic
130 Lo_Parrot 444.025 +5 High - 180 - Free 1 2 3 24 # 9990 Parrot Private 150 Lo_USA_Area6 444.025 +5 High - 180 - Color 1 1 22 96 # 31096 USA - Area 6 4646 Static
151 Lo_Anarchy 444.025 +5 High - 180 - Color 1 2 23 66 # 31666 DMR of Anarchy Dynamic
152 Lo_NC_5150 444.025 +5 High - 180 - Color 1 2 24 95 # 95150 NorCal 5150 Dynamic
153 Lo_Parrot 444.025 +5 High - 180 - Color 1 1 - 90 # 9990 Parrot Private
# (9) WW6BAY, Palo Alto, Bay-Net # (9) WW6BAY, Palo Alto, Bay-Net
141 Bay_Santa_Clara 444.350 +5 High - 180 - Free 1 1 3 9 # 31064 Santa Clara County Static 161 Bay_RX_All 444.350 +5 Low - 180 + Color 1 1 1 - # Receive only
142 Bay_TAC_310 444.350 +5 High - 180 - Free 1 1 3 5 # 310 TAC 310 Dynamic 162 Bay_World 444.350 +5 High - 180 - Color 1 1 11 91 # 91 Worldwide Dynamic
143 Bay_World 444.350 +5 High - 180 - Free 1 1 3 3 # 91 Worldwide Dynamic 163 Bay_North_Am 444.350 +5 High - 180 - Color 1 1 12 93 # 93 North America Dynamic
144 Bay_Bay-Net 444.350 +5 High - 180 - Free 1 2 3 13 # 31075 Bay-Net Static 164 Bay_TAC_310 444.350 +5 High - 180 - Color 1 1 13 10 # 310 TAC 310 Dynamic
145 Bay_NorCal 444.350 +5 High - 180 - Free 1 2 3 11 # 31068 NorCal Dynamic 165 Bay_TAC_311 444.350 +5 High - 180 - Color 1 1 14 11 # 311 TAC 311 Dynamic
146 Bay_Anarchy 444.350 +5 High - 180 - Free 1 2 3 18 # 31666 DMR of Anarchy Dynamic 166 Bay_USA_Nation 444.350 +5 High - 180 - Color 1 1 15 100 # 3100 USA Nationwide Dynamic
147 Bay_NC_5150 444.350 +5 High - 180 - Free 1 2 3 19 # 95150 NorCal 5150 Dynamic 167 Bay_Santa_Clara 444.350 +5 High - 180 - Color 1 1 17 64 # 31064 Santa Clara County Static
148 Bay_Parrot 444.350 +5 High - 180 - Free 1 2 3 24 # 9990 Parrot Private 168 Bay_NorCal 444.350 +5 High - 180 - Color 1 2 19 68 # 31068 NorCal Dynamic
169 Bay_Bay-Net 444.350 +5 High - 180 - Color 1 2 20 75 # 31075 Bay-Net Static
170 Bay_Anarchy 444.350 +5 High - 180 - Color 1 2 23 66 # 31666 DMR of Anarchy Dynamic
171 Bay_NC_5150 444.350 +5 High - 180 - Color 1 2 24 95 # 95150 NorCal 5150 Dynamic
172 Bay_Parrot 444.350 +5 High - 180 - Color 1 1 - 90 # 9990 Parrot Private
# (10) W6OTX, Alum Rock, NorCal, PAARA # (10) W6OTX, Alum Rock, NorCal, PAARA
151 Al_California 444.475 +5 High - 180 - Free 1 1 3 6 # 3106 California Static 181 Al_RX_All 444.475 +5 Low - 180 + Color 1 1 1 - # Receive only
152 Al_TAC_310 444.475 +5 High - 180 - Free 1 1 3 5 # 310 TAC 310 Dynamic 182 Al_World 444.475 +5 High - 180 - Color 1 1 11 91 # 91 Worldwide Dynamic
153 Al_Bay-Net 444.475 +5 High - 180 - Free 1 1 3 13 # 31075 Bay-Net Dynamic 183 Al_North_Am 444.475 +5 High - 180 - Color 1 1 12 93 # 93 North America Dynamic
154 Al_World 444.475 +5 High - 180 - Free 1 1 3 3 # 91 Worldwide Dynamic 184 Al_TAC_310 444.475 +5 High - 180 - Color 1 1 13 10 # 310 TAC 310 Dynamic
155 Al_NorCal 444.475 +5 High - 180 - Free 1 2 3 11 # 31068 NorCal Static 185 Al_TAC_311 444.475 +5 High - 180 - Color 1 1 14 11 # 311 TAC 311 Dynamic
156 Al_Anarchy 444.475 +5 High - 180 - Free 1 2 3 18 # 31666 DMR of Anarchy Dynamic 186 Al_USA_Nation 444.475 +5 High - 180 - Color 1 1 15 100 # 3100 USA Nationwide Dynamic
157 Al_NC_5150 444.475 +5 High - 180 - Free 1 2 3 19 # 95150 NorCal 5150 Dynamic 187 Al_California 444.475 +5 High - 180 - Color 1 1 16 106 # 3106 California Static
158 Al_Parrot 444.475 +5 High - 180 - Free 1 2 3 24 # 9990 Parrot Private 188 Al_NorCal 444.475 +5 High - 180 - Color 1 2 19 68 # 31068 NorCal Static
189 Al_Bay-Net 444.475 +5 High - 180 - Color 1 1 20 75 # 31075 Bay-Net Dynamic
190 Al_Anarchy 444.475 +5 High - 180 - Color 1 2 23 66 # 31666 DMR of Anarchy Dynamic
191 Al_NC_5150 444.475 +5 High - 180 - Color 1 2 24 95 # 95150 NorCal 5150 Dynamic
192 Al_Parrot 444.475 +5 High - 180 - Color 1 1 - 90 # 9990 Parrot Private
# (11) DMR simplex
701 441.0 441.000 +0 High 3 555 - - 1 1 9 99
702 446.5 446.500 +0 High 3 555 - - 1 1 9 99
703 446.075 446.075 +0 High 3 555 - - 1 1 9 99
704 433.45 433.450 +0 High 3 555 - - 1 1 9 99
705 145.79 145.790 +0 High 3 555 - - 1 1 9 99
706 145.51 145.510 +0 High 3 555 - - 1 1 9 99
# Table of analog channels. # Table of analog channels.
# 1) Channel number: 1-1024 # 1) Channel number: 1-1024
@ -180,7 +204,7 @@ Digital Name Receive Transmit Power Scan TOT RO Admit Color Slot
# #
Analog Name Receive Transmit Power Scan TOT RO Admit Squelch RxTone TxTone Width Analog Name Receive Transmit Power Scan TOT RO Admit Squelch RxTone TxTone Width
# VHF Band 144-148 # (12) VHF Band 144-148
201 Palo_Alto_N6NFI 145.230 -0.6 High 1 180 - Free 1 - 100.0 25 201 Palo_Alto_N6NFI 145.230 -0.6 High 1 180 - Free 1 - 100.0 25
202 Milpitas_W6MLP 145.430 -0.6 High 1 180 - Free 1 - 85.4 25 202 Milpitas_W6MLP 145.430 -0.6 High 1 180 - Free 1 - 85.4 25
203 Saratoga_K6SA 146.655 -0.6 High 1 180 - Free 1 - 114.8 25 203 Saratoga_K6SA 146.655 -0.6 High 1 180 - Free 1 - 114.8 25
@ -194,7 +218,7 @@ Analog Name Receive Transmit Power Scan TOT RO Admit Squelch RxT
211 Morgan_Hil_K7DAA 147.330 +0.6 High 1 180 - Free 1 - 103.5 25 211 Morgan_Hil_K7DAA 147.330 +0.6 High 1 180 - Free 1 - 103.5 25
212 Los_Gatos_AB6LI 147.945 -0.6 High 1 180 - Free 1 - 156.7 25 212 Los_Gatos_AB6LI 147.945 -0.6 High 1 180 - Free 1 - 156.7 25
# UHF Band 440-446 # (13) UHF Band 440-446
301 San_Jose_W6YOP 440.275 +5 High 1 180 - Free 1 - 127.3 25 301 San_Jose_W6YOP 440.275 +5 High 1 180 - Free 1 - 127.3 25
302 Woodside_N6ZX 440.450 +5 High 1 180 - Free 1 - 107.2 25 302 Woodside_N6ZX 440.450 +5 High 1 180 - Free 1 - 107.2 25
303 Campbell_NO1PC 441.025 +5 High 1 180 - Free 1 - 110.9 25 303 Campbell_NO1PC 441.025 +5 High 1 180 - Free 1 - 110.9 25
@ -210,7 +234,7 @@ Analog Name Receive Transmit Power Scan TOT RO Admit Squelch RxT
313 San_Jose_K6GOD 444.725 +5 High 1 180 - Free 1 - 162.2 25 313 San_Jose_K6GOD 444.725 +5 High 1 180 - Free 1 - 162.2 25
314 Los_Gatos_WB6KHP 444.975 +5 High 1 180 - Free 1 - 127.3 25 314 Los_Gatos_WB6KHP 444.975 +5 High 1 180 - Free 1 - 127.3 25
# Simplex frequencies # (14) Simplex frequencies
401 S_446.0 446.000 +0 High 2 180 - Free 1 - - 25 401 S_446.0 446.000 +0 High 2 180 - Free 1 - - 25
402 S_446.5 446.500 +0 High 2 180 - Free 1 - - 25 402 S_446.5 446.500 +0 High 2 180 - Free 1 - - 25
403 S_441.0 441.000 +0 High 2 180 - Free 1 - - 25 403 S_441.0 441.000 +0 High 2 180 - Free 1 - - 25
@ -220,45 +244,27 @@ Analog Name Receive Transmit Power Scan TOT RO Admit Squelch RxT
407 WX_1 162.450 +0 Low - 180 + Free 1 - - 25 407 WX_1 162.450 +0 Low - 180 + Free 1 - - 25
408 WX_5 162.550 +0 Low - 180 + Free 1 - - 25 408 WX_5 162.550 +0 Low - 180 + Free 1 - - 25
# FRS/GMRS Band
501 GMRS-1 462.5625 +0 High 3 300 - Free 1 - - 25
502 GMRS-2 462.5875 +0 High 3 300 - Free 1 - - 25
503 GMRS-3 462.6125 +0 High 3 300 - Free 1 - - 25
504 GMRS-4 462.6375 +0 High 3 300 - Free 1 - - 25
505 GMRS-5 462.6625 +0 High 3 300 - Free 1 - - 25
506 GMRS-6 462.6875 +0 High 3 300 - Free 1 - - 25
507 GMRS-7 462.7125 +0 High 3 300 - Free 1 - - 25
508 FRS-8 467.5625 +0 Low 3 300 - Free 1 - - 25
509 FRS-9 467.5875 +0 Low 3 300 - Free 1 - - 25
510 FRS-10 467.6125 +0 Low 3 300 - Free 1 - - 25
511 FRS-11 467.6375 +0 Low 3 300 - Free 1 - - 25
512 FRS-12 467.6625 +0 Low 3 300 - Free 1 - - 25
513 FRS-13 467.6875 +0 Low 3 300 - Free 1 - - 25
514 FRS-14 467.7125 +0 Low 3 300 - Free 1 - - 25
#
# Table of channel zones. # Table of channel zones.
# 1) Zone number: 1-250 # 1) Zone number: 1-250
# 2) Name: up to 16 characters, use '_' instead of space # 2) Name: up to 16 characters, use '_' instead of space
# 3) List of channels: numbers and ranges (N-M) separated by comma # 3) List of channels: numbers and ranges (N-M) separated by comma
# #
Zone Name Channels Zone Name Channels
1 Milpitas 1-8 # 440.125 W6TCP 1 Milpitas 1-12 # 440.125 W6TCP
2 San_Bruno 11-22 # 440.500 N6AMG 2 San_Bruno 21-35 # 440.500 N6AMG
3 Boulder_Creek 31-43 # 440.5875 WB6ECE 3 Boulder_Creek 41-56 # 440.5875 WB6ECE
4 Palo_Alto 51-62 # 441.850 K6OTR 4 Palo_Alto 61-75 # 441.850 K6OTR
5 Saratoga 71-84 # 441.950 KK6USZ 5 Saratoga 81-96 # 441.950 KK6USZ
6 Mt_Umunhum 91-103 # 442.5375 WA6YCZ 6 Mt_Umunhum 101-116 # 442.5375 WA6YCZ
7 Berkeley 101-115 # 443.500 K6LNK 7 Berkeley 121-132 # 443.500 K6LNK
8 Loma_Prieta 121-130 # 444.025 K6HLE 8 Loma_Prieta 141-153 # 444.025 K6HLE
9 Baynet_Palo_Alto 141-148 # 444.350 WW6BAY 9 Baynet_Palo_Alto 161-172 # 444.350 WW6BAY
10 Alum_Rock 151-158 # 444.475 W6OTX 10 Alum_Rock 181-192 # 444.475 W6OTX
11 VHF 201-212 # 144-148 VHF Band 11 DMR_Simplex 701-706 # DMR Simplex: UHF, VHF
12 UHF 301-314 # 440-446 UHF Band 12 VHF 201-212 # 144-148 VHF Band
13 Simplex 401-408 # Simplex VHF, UHF 13 UHF 301-314 # 440-446 UHF Band
14 GMRS 501-514 # 462-467 GMRS 14 FM_Simplex 401-408 # FM Simplex: VHF, UHF
#
# Table of scan lists. # Table of scan lists.
# 1) Scan list number: 1-250 # 1) Scan list number: 1-250
# 2) Name: up to 16 characters, use '_' instead of space # 2) Name: up to 16 characters, use '_' instead of space
@ -269,64 +275,53 @@ Zone Name Channels
# #
Scanlist Name PCh1 PCh2 TxCh Channels Scanlist Name PCh1 PCh2 TxCh Channels
1 Analog - - Last 201-212,301-314 1 Analog - - Last 201-212,301-314
2 Simplex - - Last 401-406 2 FM_Simplex - - Last 401-406
3 GMRS - - Last 501-514 3 DMR_Simplex - - Last 701-706
#
# Table of group lists. # Table of group lists.
# 1) Group list number: 1-250 # 1) Group list number: 1-64
# 2) Name: up to 16 characters, use '_' instead of space # 2) Name: up to 16 characters, use '_' instead of space
# 3) List of contacts: numbers and ranges (N-M) separated by comma # 3) List of contacts: numbers and ranges (N-M) separated by comma
# #
Grouplist Name Contacts Grouplist Name Contacts
1 Timeslot_1 2 # 23 Cluster K6LNK 1 All_Groups 91 # 91 Worldwide
1 Timeslot_1 3 # 91 Worldwide 1 All_Groups 93 # 93 North America
1 Timeslot_1 4 # 93 North America 1 All_Groups 10 # 310 TAC 310
1 Timeslot_1 5 # 310 TAC 310 1 All_Groups 11 # 311 TAC 311
1 Timeslot_1 6 # 3106 California 1 All_Groups 100 # 3100 USA Nationwide
1 Timeslot_1 7 # 3131 Nebraska 1 All_Groups 106 # 3106 California
1 Timeslot_1 8 # 3148 Texas 1 All_Groups 64 # 31064 Santa Clara County
1 Timeslot_1 9 # 31064 Santa Clara County 1 All_Groups 65 # 31065 NorCal AllStar
1 Timeslot_1 10 # 31065 NorCal AllStar 1 All_Groups 68 # 31068 NorCal
1 Timeslot_1 12 # 31072 KPARN 1 All_Groups 75 # 31075 Bay-Net
1 Timeslot_1 13 # 31075 Bay-Net 1 All_Groups 78 # 31078 XLX013D PAPA
1 Timeslot_1 14 # 31078 XLX013D PAPA 1 All_Groups 96 # 31096 USA - Area 6 4646
1 Timeslot_1 15 # 31096 USA - Area 6 4646 1 All_Groups 66 # 31666 DMR of Anarchy
1 Timeslot_1 16 # 31328 SNARS (Reno/Tahoe) 1 All_Groups 95 # 95150 NorCal 5150
1 Timeslot_1 17 # 31329 SNARS 2 1 All_Groups 97 # 97150 Baycom
2 Timeslot_2 1 # 21 Cluster CARLA 9 Simplex 99 # 99 Simplex
2 Timeslot_2 22 # 310604 CARLA 11 Worldwide 91 # 91 Worldwide
2 Timeslot_2 21 # 110670 Cluster KK6USZ 12 North_America 93 # 93 North America
2 Timeslot_2 23 # 310703 Tri-LERT 13 TAC_310 10 # 310 TAC 310
2 Timeslot_2 9 # 31064 Santa Clara County 14 TAC_311 11 # 311 TAC 311
2 Timeslot_2 11 # 31068 NorCal 15 USA_Nationwide 100 # 3100 USA Nationwide
2 Timeslot_2 13 # 31075 Bay-Net 16 California 106 # 3106 California
2 Timeslot_2 18 # 31666 DMR of Anarchy 17 Santa_Clara_Cnty 64 # 31064 Santa Clara County
2 Timeslot_2 19 # 95150 NorCal 5150 18 NorCal_AllStar 65 # 31065 NorCal AllStar
2 Timeslot_2 20 # 97150 Baycom 19 NorCal 68 # 31068 NorCal
20 Bay-Net 75 # 31075 Bay-Net
21 XLX013D_PAPA 78 # 31078 XLX013D PAPA
22 USA_Area_6 96 # 31096 USA - Area 6 4646
23 DMR_of_Anarchy 66 # 31666 DMR of Anarchy
24 NorCal_5150 95 # 95150 NorCal 5150
25 Baycom 97 # 97150 Baycom
26 Nebraska 131 # 3131 Nebraska
27 Texas 148 # 3148 Texas
3 Both 3 # 91 Worldwide
3 Both 4 # 93 North America
3 Both 5 # 310 TAC 310
3 Both 6 # 3106 California
3 Both 7 # 3131 Nebraska
3 Both 8 # 3148 Texas
3 Both 9 # 31064 Santa Clara County
3 Both 10 # 31065 NorCal AllStar
3 Both 11 # 31068 NorCal
3 Both 13 # 31075 Bay-Net
3 Both 14 # 31078 XLX013D PAPA
3 Both 15 # 31096 USA - Area 6 4646
3 Both 18 # 31666 DMR of Anarchy
3 Both 19 # 95150 NorCal 5150
3 Both 20 # 97150 Baycom
3 Both 22 # 310604 CARLA
#
# Table of contacts. # Table of contacts.
# 1) Contact number: 1-10000 # 1) Contact number: 1-256
# 2) Name: up to 16 characters, use '_' instead of space # 2) Name: up to 16 characters, use '_' instead of space
# 3) Call type: Group, Private, All # 3) Call type: Group, Private, All
# 4) Call ID: 1...16777215 # 4) Call ID: 1...16777215
@ -335,29 +330,40 @@ Grouplist Name Contacts
Contact Name Type ID RxTone Contact Name Type ID RxTone
# From all Bay Area repeaters # From all Bay Area repeaters
1 Cluster_CARLA Group 21 - 91 Worldwide Group 91 -
2 Cluster_K6LNK Group 23 - 93 North_America Group 93 -
3 Worldwide Group 91 - 99 Simplex Group 99 -
4 North_America Group 93 - 10 TAC_310 Group 310 -
5 TAC_310 Group 310 - 11 TAC_311 Group 311 -
6 California Group 3106 - 100 USA_Nationwide Group 3100 -
7 Nebraska Group 3131 - 106 California Group 3106 -
8 Texas Group 3148 - 131 Nebraska Group 3131 -
9 Santa_Clara_Cnty Group 31064 - 148 Texas Group 3148 -
10 NorCal_AllStar Group 31065 - 64 Santa_Clara_Cnty Group 31064 -
11 NorCal Group 31068 - 65 NorCal_AllStar Group 31065 -
12 KPARN Group 31072 - 68 NorCal Group 31068 -
13 Bay-Net Group 31075 - 72 KPARN Group 31072 -
14 XLX013D_PAPA Group 31078 - 75 Bay-Net Group 31075 -
15 USA_Area_6 Group 31096 - 78 XLX013D_PAPA Group 31078 -
16 SNARS Group 31328 - 96 USA_Area_6 Group 31096 -
17 SNARS_2 Group 31329 - 28 SNARS Group 31328 -
18 DMR_of_Anarchy Group 31666 - 29 SNARS_2 Group 31329 -
19 NorCal_5150 Group 95150 - 66 DMR_of_Anarchy Group 31666 -
20 Baycom Group 97150 - 95 NorCal_5150 Group 95150 -
21 Cluster_KK6USZ Group 110670 - 97 Baycom Group 97150 -
22 CARLA Group 310604 -
23 Tri-LERT Group 310703 -
# Private # Private
24 Parrot Private 9990 - 90 Parrot Private 9990 -
42 Sergey_KK6ABQ Private 3114542 + # Sergey Vakulenko
# Table of text messages.
# 1) Message number: 1-32
# 2) Text: up to 144 characters
#
Message Text
1 Hi there!
2 QSY Norcal 31068, pls
3 QSY California 3106, pls
4 Be Right Back
5 My email is callsign@arrl.net
6 73 . . .

16
gd77.c
View File

@ -419,7 +419,7 @@ static void setup_zone(int index, const char *name)
zonetab_t *zt = GET_ZONETAB(); zonetab_t *zt = GET_ZONETAB();
zone_t *z = &zt->zone[index]; zone_t *z = &zt->zone[index];
ascii_decode(z->name, name, sizeof(z->name)); ascii_decode(z->name, name, sizeof(z->name), 0xff);
memset(z->member, 0, sizeof(z->member)); memset(z->member, 0, sizeof(z->member));
// Set valid bit. // Set valid bit.
@ -483,7 +483,7 @@ static void setup_scanlist(int index, const char *name,
scanlist_t *sl = &st->scanlist[index]; scanlist_t *sl = &st->scanlist[index];
memset(sl, 0, 88); memset(sl, 0, 88);
ascii_decode(sl->name, name, sizeof(sl->name)); ascii_decode(sl->name, name, sizeof(sl->name), 0xff);
sl->priority_ch1 = prio1; sl->priority_ch1 = prio1;
sl->priority_ch2 = prio2; sl->priority_ch2 = prio2;
@ -571,7 +571,7 @@ static void setup_contact(int index, const char *name, int type, int id, int rxt
ct->ring_style = 0; // TODO ct->ring_style = 0; // TODO
ct->_unused23 = (type < CALL_ALL) ? 0 : 0xff; ct->_unused23 = (type < CALL_ALL) ? 0 : 0xff;
ascii_decode(ct->name, name, 16); ascii_decode(ct->name, name, 16, 0xff);
} }
// //
@ -593,7 +593,7 @@ static void setup_grouplist(int index, const char *name)
grouptab_t *gt = GET_GROUPTAB(); grouptab_t *gt = GET_GROUPTAB();
grouplist_t *gl = &gt->grouplist[index]; grouplist_t *gl = &gt->grouplist[index];
ascii_decode(gl->name, name, sizeof(gl->name)); ascii_decode(gl->name, name, sizeof(gl->name), 0xff);
// Enable grouplist. // Enable grouplist.
gt->nitems1[index] = 1; gt->nitems1[index] = 1;
@ -712,7 +712,7 @@ static void setup_channel(int i, int mode, char *name, double rx_mhz, double tx_
ch->ctcss_dcs_receive = rxtone; ch->ctcss_dcs_receive = rxtone;
ch->ctcss_dcs_transmit = txtone; ch->ctcss_dcs_transmit = txtone;
ascii_decode(ch->name, name, sizeof(ch->name)); ascii_decode(ch->name, name, sizeof(ch->name), 0xff);
// Set valid bit. // Set valid bit.
b->bitmap[i % 128 / 8] |= 1 << (i & 7); b->bitmap[i % 128 / 8] |= 1 << (i & 7);
@ -1475,7 +1475,7 @@ static void gd77_parse_parameter(radio_device_t *radio, char *param, char *value
general_settings_t *gs = GET_SETTINGS(); general_settings_t *gs = GET_SETTINGS();
if (strcasecmp ("Name", param) == 0) { if (strcasecmp ("Name", param) == 0) {
ascii_decode(gs->radio_name, value, 8); ascii_decode(gs->radio_name, value, 8, 0xff);
return; return;
} }
if (strcasecmp ("ID", param) == 0) { if (strcasecmp ("ID", param) == 0) {
@ -1497,11 +1497,11 @@ static void gd77_parse_parameter(radio_device_t *radio, char *param, char *value
intro_text_t *it = GET_INTRO(); intro_text_t *it = GET_INTRO();
if (strcasecmp ("Intro Line 1", param) == 0) { if (strcasecmp ("Intro Line 1", param) == 0) {
ascii_decode(it->intro_line1, value, 16); ascii_decode(it->intro_line1, value, 16, 0xff);
return; return;
} }
if (strcasecmp ("Intro Line 2", param) == 0) { if (strcasecmp ("Intro Line 2", param) == 0) {
ascii_decode(it->intro_line2, value, 16); ascii_decode(it->intro_line2, value, 16, 0xff);
return; return;
} }
fprintf(stderr, "Unknown parameter: %s = %s\n", param, value); fprintf(stderr, "Unknown parameter: %s = %s\n", param, value);

59
main.c
View File

@ -39,29 +39,29 @@ extern int optind;
void usage() void usage()
{ {
fprintf(stderr, _("DMR Config, Version %s, %s\n"), version, copyright); fprintf(stderr, "DMR Config, Version %s, %s\n", version, copyright);
fprintf(stderr, _("Usage:\n")); fprintf(stderr, "Usage:\n");
fprintf(stderr, _(" dmrconfig -r [-t]\n")); fprintf(stderr, " dmrconfig -r [-t]\n");
fprintf(stderr, _(" Read codeplug from the radio to a file 'device.img'.\n")); fprintf(stderr, " Read codeplug from the radio to a file 'device.img'.\n");
fprintf(stderr, _(" Save configuration to a text file 'device.conf'.\n")); fprintf(stderr, " Save configuration to a text file 'device.conf'.\n");
fprintf(stderr, _(" dmrconfig -w [-t] file.img\n")); fprintf(stderr, " dmrconfig -w [-t] file.img\n");
fprintf(stderr, _(" Write codeplug to the radio.\n")); fprintf(stderr, " Write codeplug to the radio.\n");
fprintf(stderr, _(" dmrconfig -c [-t] file.conf\n")); fprintf(stderr, " dmrconfig -c [-t] file.conf\n");
fprintf(stderr, _(" Apply configuration script to the radio.\n")); fprintf(stderr, " Apply configuration script to the radio.\n");
fprintf(stderr, _(" dmrconfig -c file.img file.conf\n")); fprintf(stderr, " dmrconfig -c file.img file.conf\n");
fprintf(stderr, _(" Apply configuration script to the codeplug image.\n")); fprintf(stderr, " Apply configuration script to the codeplug image.\n");
fprintf(stderr, _(" Store modified copy to a file 'device.img'.\n")); fprintf(stderr, " Store modified copy to a file 'device.img'.\n");
fprintf(stderr, _(" dmrconfig file.img\n")); fprintf(stderr, " dmrconfig file.img\n");
fprintf(stderr, _(" Display configuration from the codeplug image.\n")); fprintf(stderr, " Display configuration from the codeplug image.\n");
fprintf(stderr, _(" dmrconfig -u [-t] file.csv\n")); fprintf(stderr, " dmrconfig -u [-t] file.csv\n");
fprintf(stderr, _(" Update contacts database from CSV file.\n")); fprintf(stderr, " Update contacts database from CSV file.\n");
fprintf(stderr, _("Options:\n")); fprintf(stderr, "Options:\n");
fprintf(stderr, _(" -r Read codeplug from the radio.\n")); fprintf(stderr, " -r Read codeplug from the radio.\n");
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, " -l List all supported radios.\n");
fprintf(stderr, _(" -t Trace USB protocol.\n")); fprintf(stderr, " -t Trace USB protocol.\n");
exit(-1); exit(-1);
} }
@ -70,18 +70,7 @@ 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; int list_flag = 0;
// Set locale and message catalogs. copyright = "Copyright (C) 2018 Serge Vakulenko KK6ABQ";
setlocale(LC_ALL, "");
#ifdef MINGW32
// Files with localized messages should be placed in
// in c:/Program Files/dmrconfig/ directory.
bindtextdomain("dmrconfig", "c:/Program Files/dmrconfig");
#else
bindtextdomain("dmrconfig", "/usr/local/share/locale");
#endif
textdomain("dmrconfig");
copyright = _("Copyright (C) 2018 Serge Vakulenko KK6ABQ");
trace_flag = 0; trace_flag = 0;
for (;;) { for (;;) {
switch (getopt(argc, argv, "tcwrul")) { switch (getopt(argc, argv, "tcwrul")) {

View File

@ -402,7 +402,7 @@ static void md380_upload(radio_device_t *radio, int cont_flag)
// //
static int md380_is_compatible(radio_device_t *radio) static int md380_is_compatible(radio_device_t *radio)
{ {
return 1; return strncmp("D868UVE", (char*)&radio_mem[0], 7) == 0;
} }
// //
@ -948,9 +948,9 @@ static void print_analog_channels(FILE *out, int verbose)
fprintf(out, "# 13) Bandwidth in kHz: 12.5, 20, 25\n"); fprintf(out, "# 13) Bandwidth in kHz: 12.5, 20, 25\n");
fprintf(out, "#\n"); fprintf(out, "#\n");
} }
fprintf(out, "Analog Name Receive Transmit Power Scan AS TOT RO Admit Squelch RxTone TxTone Width"); fprintf(out, "Analog Name Receive Transmit Power Scan TOT RO Admit Squelch RxTone TxTone Width");
#ifdef PRINT_RARE_PARAMS #ifdef PRINT_RARE_PARAMS
fprintf(out, " Dly RxRef TxRef LW VOX TA RxSign TxSign ID"); fprintf(out, " AS Dly RxRef TxRef LW VOX TA RxSign TxSign ID");
#endif #endif
fprintf(out, "\n"); fprintf(out, "\n");
for (i=0; i<NCHAN; i++) { for (i=0; i<NCHAN; i++) {

18
radio.c
View File

@ -44,15 +44,16 @@ static struct {
{ "MD-UV390", &radio_uv390 }, // TYT MD-UV390, Retevis RT3S { "MD-UV390", &radio_uv390 }, // TYT MD-UV390, Retevis RT3S
{ "2017", &radio_md2017 }, // TYT MD-2017, Retevis RT82 { "2017", &radio_md2017 }, // TYT MD-2017, Retevis RT82
{ "MD9600", &radio_md9600 }, // TYT MD-9600 { "MD9600", &radio_md9600 }, // TYT MD-9600
{ "BF-5R", &radio_rd5r }, // Baofeng RD-5R
{ "MD-760P", &radio_gd77 }, // Radioddity GD-77, version 3.1.1 and later
{ "D868UVE", &radio_d868uv }, // Anytone AT-D868UV
{ "ZD3688", &radio_d900 }, // Zastone D900 { "ZD3688", &radio_d900 }, // Zastone D900
{ "TP660", &radio_dp880 }, // Zastone DP880 { "TP660", &radio_dp880 }, // Zastone DP880
{ "ZN><:", &radio_rt27d }, // Radtel RT-27D { "ZN><:", &radio_rt27d }, // Radtel RT-27D
{ "BF-5R", &radio_rd5r }, // Baofeng RD-5R
{ "MD-760P", &radio_gd77 }, // Radioddity GD-77, version 3.1.1 and later
{ 0, 0 } { 0, 0 }
}; };
unsigned char radio_mem [1024*1024]; // Radio memory contents, up to 1Mbyte unsigned char radio_mem [1024*1024*67]; // Radio memory contents, up to 67 Mbytes
int radio_progress; // Read/write progress counter int radio_progress; // Read/write progress counter
static radio_device_t *device; // Device-dependent interface static radio_device_t *device; // Device-dependent interface
@ -68,6 +69,7 @@ void radio_disconnect()
dfu_reboot(); dfu_reboot();
dfu_close(); dfu_close();
hid_close(); hid_close();
serial_close();
} }
// //
@ -89,10 +91,15 @@ void radio_connect()
// Try TYT MD family. // Try TYT MD family.
ident = dfu_init(0x0483, 0xdf11); ident = dfu_init(0x0483, 0xdf11);
if (! ident) { if (! ident) {
// Try RD-5R. // Try RD-5R and GD-77.
if (hid_init(0x15a2, 0x0073) >= 0) if (hid_init(0x15a2, 0x0073) >= 0)
ident = hid_identify(); ident = hid_identify();
} }
if (! ident) {
// Try AT-D868UV.
if (serial_init(0x28e9, 0x018a) >= 0)
ident = serial_identify();
}
if (! ident) { if (! ident) {
fprintf(stderr, "No radio detected.\n"); fprintf(stderr, "No radio detected.\n");
fprintf(stderr, "Check your USB cable!\n"); fprintf(stderr, "Check your USB cable!\n");
@ -193,6 +200,9 @@ void radio_read_image(const char *filename)
case 262709: case 262709:
device = &radio_md380; device = &radio_md380;
break; break;
case 1607296:
device = &radio_d868uv;
break;
case 131072: case 131072:
if (fread(ident, 1, 8, img) != 8) { if (fread(ident, 1, 8, img) != 8) {
fprintf(stderr, "%s: Cannot read header.\n", filename); fprintf(stderr, "%s: Cannot read header.\n", filename);

View File

@ -124,6 +124,7 @@ 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
extern radio_device_t radio_rd5r; // Baofeng RD-5R extern radio_device_t radio_rd5r; // Baofeng RD-5R
extern radio_device_t radio_gd77; // Radioddity GD-77, version 3.1.1 and later extern radio_device_t radio_gd77; // Radioddity GD-77, version 3.1.1 and later
extern radio_device_t radio_d868uv; // Anytone AT-D868UV
// //
// Radio: memory contents. // Radio: memory contents.

16
rd5r.c
View File

@ -419,7 +419,7 @@ static void setup_zone(int index, const char *name)
zonetab_t *zt = GET_ZONETAB(); zonetab_t *zt = GET_ZONETAB();
zone_t *z = &zt->zone[index]; zone_t *z = &zt->zone[index];
ascii_decode(z->name, name, sizeof(z->name)); ascii_decode(z->name, name, sizeof(z->name), 0xff);
memset(z->member, 0, sizeof(z->member)); memset(z->member, 0, sizeof(z->member));
// Set valid bit. // Set valid bit.
@ -483,7 +483,7 @@ static void setup_scanlist(int index, const char *name,
scanlist_t *sl = &st->scanlist[index]; scanlist_t *sl = &st->scanlist[index];
memset(sl, 0, 88); memset(sl, 0, 88);
ascii_decode(sl->name, name, sizeof(sl->name)); ascii_decode(sl->name, name, sizeof(sl->name), 0xff);
sl->priority_ch1 = prio1; sl->priority_ch1 = prio1;
sl->priority_ch2 = prio2; sl->priority_ch2 = prio2;
@ -571,7 +571,7 @@ static void setup_contact(int index, const char *name, int type, int id, int rxt
ct->ring_style = 0; // TODO ct->ring_style = 0; // TODO
ct->_unused23 = (type < CALL_ALL) ? 0 : 0xff; ct->_unused23 = (type < CALL_ALL) ? 0 : 0xff;
ascii_decode(ct->name, name, 16); ascii_decode(ct->name, name, 16, 0xff);
} }
// //
@ -593,7 +593,7 @@ static void setup_grouplist(int index, const char *name)
grouptab_t *gt = GET_GROUPTAB(); grouptab_t *gt = GET_GROUPTAB();
grouplist_t *gl = &gt->grouplist[index]; grouplist_t *gl = &gt->grouplist[index];
ascii_decode(gl->name, name, sizeof(gl->name)); ascii_decode(gl->name, name, sizeof(gl->name), 0xff);
// Enable grouplist. // Enable grouplist.
gt->nitems1[index] = 1; gt->nitems1[index] = 1;
@ -716,7 +716,7 @@ static void setup_channel(int i, int mode, char *name, double rx_mhz, double tx_
ch->ctcss_dcs_receive = rxtone; ch->ctcss_dcs_receive = rxtone;
ch->ctcss_dcs_transmit = txtone; ch->ctcss_dcs_transmit = txtone;
ascii_decode(ch->name, name, sizeof(ch->name)); ascii_decode(ch->name, name, sizeof(ch->name), 0xff);
// Set valid bit. // Set valid bit.
b->bitmap[i % 128 / 8] |= 1 << (i & 7); b->bitmap[i % 128 / 8] |= 1 << (i & 7);
@ -1479,7 +1479,7 @@ static void rd5r_parse_parameter(radio_device_t *radio, char *param, char *value
general_settings_t *gs = GET_SETTINGS(); general_settings_t *gs = GET_SETTINGS();
if (strcasecmp ("Name", param) == 0) { if (strcasecmp ("Name", param) == 0) {
ascii_decode(gs->radio_name, value, 8); ascii_decode(gs->radio_name, value, 8, 0xff);
return; return;
} }
if (strcasecmp ("ID", param) == 0) { if (strcasecmp ("ID", param) == 0) {
@ -1501,11 +1501,11 @@ static void rd5r_parse_parameter(radio_device_t *radio, char *param, char *value
intro_text_t *it = GET_INTRO(); intro_text_t *it = GET_INTRO();
if (strcasecmp ("Intro Line 1", param) == 0) { if (strcasecmp ("Intro Line 1", param) == 0) {
ascii_decode(it->intro_line1, value, 16); ascii_decode(it->intro_line1, value, 16, 0xff);
return; return;
} }
if (strcasecmp ("Intro Line 2", param) == 0) { if (strcasecmp ("Intro Line 2", param) == 0) {
ascii_decode(it->intro_line2, value, 16); ascii_decode(it->intro_line2, value, 16, 0xff);
return; return;
} }
fprintf(stderr, "Unknown parameter: %s = %s\n", param, value); fprintf(stderr, "Unknown parameter: %s = %s\n", param, value);

725
serial.c Normal file
View File

@ -0,0 +1,725 @@
/*
* Interface to virtual serial USB port.
*
* Copyright (C) 2018 Serge Vakulenko, KK6ABQ
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include "util.h"
#if defined(__WIN32__) || defined(WIN32)
#include <windows.h>
#include <malloc.h>
static void *fd = INVALID_HANDLE_VALUE;
static DCB saved_mode;
#else
#include <termios.h>
static int fd = -1;
static struct termios saved_mode;
#endif
#ifdef __linux__
# include <libudev.h>
#endif
#ifdef __APPLE__
# include <CoreFoundation/CoreFoundation.h>
# include <IOKit/usb/IOUSBLib.h>
# include <IOKit/serial/IOSerialKeys.h>
#endif
static char *dev_path;
static const unsigned char CMD_PRG[] = "PROGRAM";
static const unsigned char CMD_PRG2[] = "\2";
static const unsigned char CMD_QX[] = "QX\6";
static const unsigned char CMD_ACK[] = "\6";
static const unsigned char CMD_READ[] = "Raaaan";
static const unsigned char CMD_WRITE[] = "Waaaan...";
static const unsigned char CMD_END[] = "END";
#if defined(__WIN32__) || defined(WIN32)
// No need for this function.
#else
//
// Encode the speed in bits per second into bit value
// accepted by cfsetspeed() function.
// Return -1 when speed is not supported.
//
static int baud_encode(int bps)
{
// Linux: only a limited set of values permitted.
switch (bps) {
#ifdef B75
case 75: return B75;
#endif
#ifdef B110
case 110: return B110;
#endif
#ifdef B134
case 134: return B134;
#endif
#ifdef B150
case 150: return B150;
#endif
#ifdef B200
case 200: return B200;
#endif
#ifdef B300
case 300: return B300;
#endif
#ifdef B600
case 600: return B600;
#endif
#ifdef B1200
case 1200: return B1200;
#endif
#ifdef B1800
case 1800: return B1800;
#endif
#ifdef B2400
case 2400: return B2400;
#endif
#ifdef B4800
case 4800: return B4800;
#endif
#ifdef B9600
case 9600: return B9600;
#endif
#ifdef B19200
case 19200: return B19200;
#endif
#ifdef B38400
case 38400: return B38400;
#endif
#ifdef B57600
case 57600: return B57600;
#endif
#ifdef B115200
case 115200: return B115200;
#endif
#ifdef B230400
case 230400: return B230400;
#endif
#ifdef B460800
case 460800: return B460800;
#endif
#ifdef B500000
case 500000: return B500000;
#endif
#ifdef B576000
case 576000: return B576000;
#endif
#ifdef B921600
case 921600: return B921600;
#endif
#ifdef B1000000
case 1000000: return B1000000;
#endif
#ifdef B1152000
case 1152000: return B1152000;
#endif
#ifdef B1500000
case 1500000: return B1500000;
#endif
#ifdef B2000000
case 2000000: return B2000000;
#endif
#ifdef B2500000
case 2500000: return B2500000;
#endif
#ifdef B3000000
case 3000000: return B3000000;
#endif
#ifdef B3500000
case 3500000: return B3500000;
#endif
#ifdef B4000000
case 4000000: return B4000000;
#endif
}
return -1;
}
#endif /* WIN32 */
//
// Send data to device.
// Return number of bytes, or -1 on error.
//
int serial_write(const unsigned char *data, int len)
{
#if defined(__WIN32__) || defined(WIN32)
DWORD written;
if (! WriteFile(fd, data, len, &written, 0))
return -1;
return written;
#else
return write(fd, data, len);
#endif
}
//
// Receive data from device.
// Return number of bytes, or -1 on error.
//
int serial_read(unsigned char *data, int len, int timeout_msec)
{
#if defined(__WIN32__) || defined(WIN32)
DWORD got;
COMMTIMEOUTS ctmo;
// Reset the Windows RX timeout to the current timeout_msec
// value, as it may have changed since the last read.
//
memset(&ctmo, 0, sizeof(ctmo));
ctmo.ReadIntervalTimeout = 0;
ctmo.ReadTotalTimeoutMultiplier = 0;
ctmo.ReadTotalTimeoutConstant = timeout_msec;
if (! SetCommTimeouts(fd, &ctmo)) {
fprintf(stderr, "Cannot set timeouts in serial_read()\n");
return -1;
}
if (! ReadFile(fd, data, len, &got, 0)) {
fprintf(stderr, "serial_read: read error\n");
exit(-1);
}
#else
struct timeval timeout, to2;
long got;
fd_set rfds;
timeout.tv_sec = timeout_msec / 1000;
timeout.tv_usec = timeout_msec % 1000 * 1000;
again:
to2 = timeout;
FD_ZERO(&rfds);
FD_SET(fd, &rfds);
got = select(fd + 1, &rfds, 0, 0, &to2);
if (got < 0) {
if (errno == EINTR || errno == EAGAIN) {
if (trace_flag > 0)
printf("serial_read: retry on select\n");
goto again;
}
fprintf(stderr, "serial_read: select error: %s\n", strerror(errno));
exit(-1);
}
#endif
if (got == 0) {
if (trace_flag > 0)
printf("serial_read: no characters to read\n");
return 0;
}
#if ! defined(__WIN32__) && ! defined(WIN32)
got = read(fd, data, (len > 1024) ? 1024 : len);
if (got < 0) {
fprintf(stderr, "serial_read: read error\n");
exit(-1);
}
#endif
return got;
}
//
// Open the serial port.
// Return -1 on error.
//
int serial_open(const char *devname, int baud_rate)
{
#if defined(__WIN32__) || defined(WIN32)
DCB new_mode;
#else
struct termios new_mode;
#endif
#if defined(__WIN32__) || defined(WIN32)
// Check for the Windows device syntax and bend a DOS device
// into that syntax to allow higher COM numbers than 9
//
if (devname[0] != '\\') {
// Prepend device prefix: COM23 -> \\.\COM23
char *buf = alloca(5 + strlen(devname));
if (! buf) {
fprintf(stderr, "%s: Out of memory\n", devname);
return -1;
}
strcpy(buf, "\\\\.\\");
strcat(buf, devname);
devname = buf;
}
// Open port
fd = CreateFile(devname, GENERIC_READ | GENERIC_WRITE,
0, 0, OPEN_EXISTING, 0, 0);
if (fd == INVALID_HANDLE_VALUE) {
fprintf(stderr, "%s: Cannot open\n", devname);
return -1;
}
// Set serial attributes
memset(&saved_mode, 0, sizeof(saved_mode));
if (! GetCommState(fd, &saved_mode)) {
fprintf(stderr, "%s: Cannot get state\n", devname);
return -1;
}
new_mode = saved_mode;
new_mode.fDtrControl = DTR_CONTROL_ENABLE;
new_mode.BaudRate = baud_rate;
new_mode.ByteSize = 8;
new_mode.StopBits = ONESTOPBIT;
new_mode.Parity = 0;
new_mode.fParity = FALSE;
new_mode.fOutX = FALSE;
new_mode.fInX = FALSE;
new_mode.fOutxCtsFlow = FALSE;
new_mode.fOutxDsrFlow = FALSE;
new_mode.fRtsControl = RTS_CONTROL_ENABLE;
new_mode.fNull = FALSE;
new_mode.fAbortOnError = FALSE;
new_mode.fBinary = TRUE;
if (! SetCommState(fd, &new_mode)) {
fprintf(stderr, "%s: Cannot set state\n", devname);
return -1;
}
#else
// Encode baud rate.
int baud_code = baud_encode(baud_rate);
if (baud_code < 0) {
fprintf(stderr, "%s: Bad baud rate %d\n", devname, baud_rate);
return -1;
}
// Open port
fd = open(devname, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd < 0) {
perror(devname);
return -1;
}
// Set serial attributes
memset(&saved_mode, 0, sizeof(saved_mode));
tcgetattr(fd, &saved_mode);
// 8n1, ignore parity
memset(&new_mode, 0, sizeof(new_mode));
new_mode.c_cflag = CS8 | CLOCAL | CREAD;
new_mode.c_iflag = IGNBRK;
new_mode.c_oflag = 0;
new_mode.c_lflag = 0;
new_mode.c_cc[VTIME] = 0;
new_mode.c_cc[VMIN] = 1;
cfsetispeed(&new_mode, baud_code);
cfsetospeed(&new_mode, baud_code);
tcflush(fd, TCIFLUSH);
tcsetattr(fd, TCSANOW, &new_mode);
// Clear O_NONBLOCK flag.
int flags = fcntl(fd, F_GETFL, 0);
if (flags >= 0)
fcntl(fd, F_SETFL, flags & ~O_NONBLOCK);
#endif
return 0;
}
//
// Find a device path by vid/pid.
//
static char *find_path(int vid, int pid)
{
char *result = 0;
#if defined(__linux__)
// Create the udev object.
struct udev *udev = udev_new();
if (! udev) {
printf("Can't create udev\n");
return 0;
}
// Create a list of the devices in the 'tty' subsystem.
struct udev_enumerate *enumerate = udev_enumerate_new(udev);
udev_enumerate_add_match_subsystem(enumerate, "tty");
udev_enumerate_scan_devices(enumerate);
struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate);
// For each item enumerated, figure out its information.
struct udev_list_entry *dev_list_entry;
udev_list_entry_foreach(dev_list_entry, devices) {
// Get the filename of the /sys entry for the device
// and create a udev_device object (dev) representing it.
const char *syspath = udev_list_entry_get_name(dev_list_entry);
struct udev_device *comport = udev_device_new_from_syspath(udev, syspath);
//printf("syspath = %s\n", syspath);
// Get the parent device with the subsystem/devtype pair
// of "usb"/"usb_device".
struct udev_device *parent = udev_device_get_parent_with_subsystem_devtype(comport,
"usb", "usb_device");
if (! parent) {
//printf("Unable to find parent usb device.\n");
continue;
}
// Get the path to the device node in /dev.
const char *devpath = udev_device_get_devnode(comport);
//printf("devpath = %s\n", devpath);
//printf("parent = %s\n", udev_device_get_devnode(parent));
const char *idVendor = udev_device_get_sysattr_value(parent, "idVendor");
const char *idProduct = udev_device_get_sysattr_value(parent, "idProduct");
if (! idVendor || ! idProduct) {
// No vendor and product ID.
continue;
}
//printf("vid = %s\n", idVendor);
//printf("pid = %s\n", idProduct);
unsigned vendor_id = strtoul(idVendor, 0, 16);
unsigned product_id = strtoul(idProduct, 0, 16);
if (vendor_id != vid || product_id != pid) {
// Wrong ID.
continue;
}
// Print names of vendor and product.
//const char *vendor = udev_device_get_sysattr_value(parent, "manufacturer");
//const char *product = udev_device_get_sysattr_value(parent, "product");
//printf("vendor = %s\n", vendor);
//printf("product = %s\n", product);
// Return result.
udev_device_unref(parent);
result = strdup(devpath);
break;
}
// Free the enumerator object
udev_enumerate_unref(enumerate);
udev_unref(udev);
#elif defined(__APPLE__)
// Create a list of the devices in the 'IOSerialBSDClient' class.
CFMutableDictionaryRef dict = IOServiceMatching(kIOSerialBSDServiceValue);
if (! dict) {
printf("Cannot create IO Service dictionary.\n");
return 0;
}
io_iterator_t devices = IO_OBJECT_NULL;
kern_return_t ret = IOServiceGetMatchingServices(kIOMasterPortDefault,
dict, &devices);
if (ret != KERN_SUCCESS) {
printf("Cannot find matching IO services.\n");
return 0;
}
// For each matching device, print out its information.
io_object_t device;
while ((device = IOIteratorNext(devices)) != MACH_PORT_NULL) {
// Get device path.
char devname[1024];
CFStringRef ref = (CFStringRef) IORegistryEntrySearchCFProperty(device,
kIOServicePlane, CFSTR(kIOCalloutDeviceKey),
kCFAllocatorDefault, kIORegistryIterateRecursively);
if (! ref || ! CFStringGetCString(ref, devname, sizeof(devname), kCFStringEncodingUTF8)) {
// Cannot get device path.
continue;
}
//printf("%s\n", devname);
// Get device parent.
io_registry_entry_t parent = 0;
if (KERN_SUCCESS != IORegistryEntryGetParentEntry(device, kIOServicePlane, &parent)) {
//printf("Cannot get device parent.\n");
continue;
}
// Get device grandparent.
io_registry_entry_t grandparent = 0;
if (KERN_SUCCESS != IORegistryEntryGetParentEntry(parent, kIOServicePlane, &grandparent)) {
//printf("Cannot get device grandparent.\n");
continue;
}
// Get vendor ID.
int vendor_id;
ref = IORegistryEntryCreateCFProperty(grandparent,
CFSTR(kUSBVendorID), kCFAllocatorDefault, 0);
if (! ref || ! CFNumberGetValue((CFNumberRef)ref, kCFNumberIntType, &vendor_id)) {
//printf("Cannot get vendor ID.\n");
continue;
}
// Get product ID.
int product_id;
ref = IORegistryEntryCreateCFProperty(grandparent,
CFSTR(kUSBProductID), kCFAllocatorDefault, 0);
if (! ref || ! CFNumberGetValue((CFNumberRef)ref, kCFNumberIntType, &product_id)) {
//printf("Cannot get product ID.\n");
continue;
}
if (vendor_id != vid || product_id != pid) {
// Wrong ID.
continue;
}
result = strdup(devname);
break;
}
// Free the iterator object
IOObjectRelease(devices);
#else
printf("Don't know how to get the list of CD devices on this system.\n");
#endif
return result;
}
//
// Connect to the specified device.
// Initiate the programming session.
//
int serial_init(int vid, int pid)
{
dev_path = find_path(vid, pid);
if (!dev_path) {
if (trace_flag) {
fprintf(stderr, "Cannot find USB device %04x:%04x\n",
vid, pid);
}
return -1;
}
// Succeeded.
printf("Serial port: %s\n", dev_path);
return 0;
}
//
// Send the command sequence and get back a response.
//
static int send_recv(const unsigned char *cmd, int cmdlen,
unsigned char *response, int reply_len)
{
unsigned char *p;
int len, i, got;
//
// Send command.
//
if (trace_flag > 0) {
fprintf(stderr, "----Send [%d] %x", cmdlen, cmd[0]);
for (i=1; i<cmdlen; ++i)
fprintf(stderr, "-%x", cmd[i]);
fprintf(stderr, "\n");
}
if (serial_write(cmd, cmdlen) < 0) {
fprintf(stderr, "%s: write error\n", dev_path);
exit(-1);
}
//
// Get response.
//
p = response;
len = 0;
while (len < reply_len) {
got = serial_read(p, reply_len - len, 1000);
if (! got)
return 0;
p += got;
len += got;
}
if (trace_flag > 0) {
fprintf(stderr, "----Recv [%d] %x", reply_len, response[0]);
for (i=1; i<reply_len; ++i)
fprintf(stderr, "-%x", response[i]);
fprintf(stderr, "\n");
}
return 1;
}
//
// Close the serial port.
//
void serial_close()
{
#if defined(__WIN32__) || defined(WIN32)
if (fd != INVALID_HANDLE_VALUE) {
SetCommState(fd, &saved_mode);
CloseHandle(fd);
fd = INVALID_HANDLE_VALUE;
}
#else
if (fd >= 0) {
unsigned char ack[1];
send_recv(CMD_END, 3, ack, 1);
tcsetattr(fd, TCSANOW, &saved_mode);
close(fd);
fd = -1;
}
#endif
}
//
// Query and return the device identification string.
// On error, return NULL.
//
const char *serial_identify()
{
static unsigned char reply[16];
unsigned char ack[3];
int retry = 0;
if (serial_open(dev_path, 115200) < 0) {
return 0;
}
again:
#if defined(__WIN32__) || defined(WIN32)
//TODO: flush pending input and output buffers.
#else
tcflush(fd, TCIOFLUSH);
#endif
send_recv(CMD_PRG, 7, ack, 3);
if (memcmp(ack, CMD_QX, 3) != 0) {
if (++retry >= 10) {
fprintf(stderr, "%s: Wrong PRG acknowledge %02x-%02x-%02x, expected %02x-%02x-%02x\n",
__func__, ack[0], ack[1], ack[2], CMD_QX[0], CMD_QX[1], CMD_QX[2]);
return 0;
}
usleep(500000);
goto again;
}
// Reply:
// 49 44 38 36 38 55 56 45 00 56 31 30 32 00 00 06
// I D 8 6 8 U V E V 1 0 2
send_recv(CMD_PRG2, 1, reply, 16);
if (reply[0] != 'I' || reply[15] != CMD_ACK[0]) {
if (++retry >= 10) {
fprintf(stderr, "%s: Wrong PRG2 reply %02x-...-%02x, expected %02x-...-%02x\n",
__func__, reply[0], reply[15], 'I', CMD_ACK[0]);
return 0;
}
usleep(500000);
goto again;
}
// Terminate the string.
reply[8] = 0;
return (char*)&reply[1];
}
void serial_read_region(int addr, unsigned char *data, int nbytes)
{
static const int DATASZ = 64;
unsigned char cmd[6], reply[8 + DATASZ];
int n, i, retry = 0;
for (n=0; n<nbytes; n+=DATASZ) {
// Read command: 52 aa aa aa aa 10
cmd[0] = CMD_READ[0];
cmd[1] = (addr + n) >> 24;
cmd[2] = (addr + n) >> 16;
cmd[3] = (addr + n) >> 8;
cmd[4] = addr + n;
cmd[5] = DATASZ;
again:
send_recv(cmd, 6, reply, sizeof(reply));
if (reply[0] != CMD_WRITE[0] || reply[7+DATASZ] != CMD_ACK[0]) {
fprintf(stderr, "%s: Wrong read reply %02x-...-%02x, expected %02x-...-%02x\n",
__func__, reply[0], reply[7+DATASZ], CMD_WRITE[0], CMD_ACK[0]);
exit(-1);
}
// Compute checksum.
unsigned char sum = reply[1];
for (i=2; i<6+DATASZ; i++)
sum += reply[i];
if (reply[6+DATASZ] != sum) {
fprintf(stderr, "%s: Wrong read checksum %02x, expected %02x\n",
__func__, sum, reply[6+DATASZ]);
if (retry++ < 3)
goto again;
exit(-1);
}
memcpy(data + n, reply + 6, DATASZ);
}
}
void serial_write_region(int addr, unsigned char *data, int nbytes)
{
//static const int DATASZ = 64;
static const int DATASZ = 16;
unsigned char ack, cmd[8 + DATASZ];
int n, i;
for (n=0; n<nbytes; n+=DATASZ) {
// Write command: 57 aa aa aa aa 10 .. .. ss nn
cmd[0] = CMD_WRITE[0];
cmd[1] = (addr + n) >> 24;
cmd[2] = (addr + n) >> 16;
cmd[3] = (addr + n) >> 8;
cmd[4] = addr + n;
cmd[5] = DATASZ;
memcpy(cmd + 6, data + n, DATASZ);
// Compute checksum.
unsigned char sum = cmd[1];
for (i=2; i<6+DATASZ; i++)
sum += cmd[i];
cmd[6 + DATASZ] = sum;
cmd[7 + DATASZ] = CMD_ACK[0];
send_recv(cmd, 8 + DATASZ, &ack, 1);
if (ack != CMD_ACK[0]) {
fprintf(stderr, "%s: Wrong acknowledge %#x, expected %#x\n",
__func__, ack, CMD_ACK[0]);
exit(-1);
}
}
}

53
util.c
View File

@ -334,7 +334,7 @@ void utf8_decode(unsigned short *dst, const char *src, unsigned nsym)
// Replace underscore by space. // Replace underscore by space.
// Fill the rest with 0xff. // Fill the rest with 0xff.
// //
void ascii_decode(unsigned char *dst, const char *src, unsigned nsym) void ascii_decode(unsigned char *dst, const char *src, unsigned nsym, unsigned fill)
{ {
if (src[0] == '-' && src[1] == 0) if (src[0] == '-' && src[1] == 0)
src = ""; src = "";
@ -345,7 +345,7 @@ void ascii_decode(unsigned char *dst, const char *src, unsigned nsym)
if (ch == 0) { if (ch == 0) {
// Clear the remaining bytes. // Clear the remaining bytes.
while (nsym-- > 0) while (nsym-- > 0)
*dst++ = 0xff; *dst++ = fill;
break; break;
} }
if (ch == '_') if (ch == '_')
@ -355,6 +355,34 @@ void ascii_decode(unsigned char *dst, const char *src, unsigned nsym)
} }
} }
//
// Copy ASCII string, at most nsym characters.
// Replace underscore by space.
// Fill the rest with 0xff.
//
void ascii_decode_uppercase(unsigned char *dst, const char *src, unsigned nsym, unsigned fill)
{
if (src[0] == '-' && src[1] == 0)
src = "";
for (; nsym > 0; nsym--) {
int ch = *src++;
if (ch == 0) {
// Clear the remaining bytes.
while (nsym-- > 0)
*dst++ = fill;
break;
}
if (ch == '_')
ch = ' ';
else if (ch >= 'a' && ch <= 'z')
ch += 'A' - 'a';
*dst++ = ch;
}
}
// //
// Convert tone string to BCD format. // Convert tone string to BCD format.
// Four possible formats: // Four possible formats:
@ -531,6 +559,7 @@ void print_offset(FILE *out, unsigned rx_bcd, unsigned tx_bcd)
// //
// Compare channel index for qsort(). // Compare channel index for qsort().
// Treat 0 as empty element.
// //
int compare_index(const void *pa, const void *pb) int compare_index(const void *pa, const void *pb)
{ {
@ -548,6 +577,26 @@ int compare_index(const void *pa, const void *pb)
return 0; return 0;
} }
//
// Compare channel index for qsort().
// Treat 0xffff as empty element.
//
int compare_index_ffff(const void *pa, const void *pb)
{
unsigned short a = *(unsigned short*) pa;
unsigned short b = *(unsigned short*) pb;
if (a == 0xffff)
return (b != 0xffff);
if (b == 0xffff)
return -1;
if (a < b)
return -1;
if (a > b)
return 1;
return 0;
}
// //
// Print CTSS or DCS tone. // Print CTSS or DCS tone.
// //

26
util.h
View File

@ -26,19 +26,6 @@
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
//
// Localization.
//
#if 0
#include <libintl.h>
#define _(str) gettext(str)
#else
#define _(str) str
#define setlocale(x,y) /* empty */
#define bindtextdomain(x,y) /* empty */
#define textdomain(x) /* empty */
#endif
// //
// Program version. // Program version.
// //
@ -77,6 +64,15 @@ void hid_read_finish(void);
void hid_write_block(int bno, unsigned char *data, int nbytes); void hid_write_block(int bno, unsigned char *data, int nbytes);
void hid_write_finish(void); void hid_write_finish(void);
//
// Serial functions.
//
int serial_init(int vid, int pid);
const char *serial_identify(void);
void serial_close(void);
void serial_read_region(int addr, unsigned char *data, int nbytes);
void serial_write_region(int addr, unsigned char *data, int nbytes);
// //
// Delay in milliseconds. // Delay in milliseconds.
// //
@ -153,7 +149,8 @@ void utf8_decode(unsigned short *dst, const char *src, unsigned nsym);
// Copy ASCII string, at most nsym characters. // Copy ASCII string, at most nsym characters.
// Replace underscore by space. // Replace underscore by space.
// //
void ascii_decode(unsigned char *dst, const char *src, unsigned nsym); void ascii_decode(unsigned char *dst, const char *src, unsigned nsym, unsigned fill);
void ascii_decode_uppercase(unsigned char *dst, const char *src, unsigned nsym, unsigned fill);
// //
// Get local time in format: YYYYMMDDhhmmss // Get local time in format: YYYYMMDDhhmmss
@ -196,6 +193,7 @@ void print_offset(FILE *out, unsigned rx_bcd, unsigned tx_bcd);
// Compare channel index for qsort(). // Compare channel index for qsort().
// //
int compare_index(const void *pa, const void *pb); int compare_index(const void *pa, const void *pb);
int compare_index_ffff(const void *pa, const void *pb);
// //
// Print CTSS or DCS tone. // Print CTSS or DCS tone.

44
zone3.diff Normal file
View File

@ -0,0 +1,44 @@
--- d868uv-full.hd 2018-10-26 13:07:36.694185870 -0700
+++ d868uv-full-zone3.hd 2018-10-26 13:10:26.798620813 -0700
@@ -16046,9 +16046,6 @@
0003ead0 08 00 09 00 ff ff ff ff ff ff ff ff ff ff ff ff |................|
0003eae0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
-0003ecc0 00 00 ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| --- Zone list
-0003ecd0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
-*
0003eec0 00 00 ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
0003eed0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
@@ -19683,6 +19680,7 @@
00070910 00 00 00 00 00 00 00 00 00 05 05 0a 0a 64 01 00 |.............d..|
00070920 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
+00070940 fb ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| --- Zone valid bit
00070950 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 03 |................|
00070960 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
00070970 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 03 |................|
@@ -19732,10 +19730,10 @@
000716c0 00 5a 62 02 00 6c dc 02 00 00 00 00 00 ff ff 00 |.Zb..l..........|
000716d0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
-00071700 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| --- Unknown: 'A' channel for zone 3?
+00071700 00 00 08 00 08 00 00 00 00 00 00 00 00 00 00 00 |................|
00071710 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
-00071900 01 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| --- Unknown: 'B' channel for zone 3?
+00071900 01 00 04 00 04 00 00 00 00 00 00 00 00 00 00 00 |................|
00071910 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00071b00 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
@@ -19757,8 +19755,8 @@
00071dd0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00071de0 5a 6f 6e 65 20 32 00 00 00 00 00 00 00 00 00 00 |Zone 2..........|
00071df0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
-00071e00 5a 6f 6e 65 20 33 00 00 00 00 00 00 00 00 00 00 |Zone 3..........| --- Zone name
-00071e10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
+00071e00 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
+*
00071e20 5a 6f 6e 65 20 34 00 00 00 00 00 00 00 00 00 00 |Zone 4..........|
00071e30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00071e40 5a 6f 6e 65 20 35 00 00 00 00 00 00 00 00 00 00 |Zone 5..........|