-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
366 lines (319 loc) · 17.3 KB
/
Copy pathindex.html
File metadata and controls
366 lines (319 loc) · 17.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta property="og:title" content=UVMOD - Online Quansheng Firmware Patcher>
<meta property="og:site_name" content=UVMOD>
<meta property="og:url" content=https://whosmatt.github.io/uvmod />
<meta property="og:description"
content="Web-based tool to generate and flash customizable modded firmware, edit the configuration, and flash open source firmware for various Quansheng handheld radios.">
<meta property="og:type" content=website>
<meta property="og:image" content=https://whosmatt.github.io/uvmod/img/banner.webp>
<title>IU2FRL Quansheng modding tool</title>
<link rel="icon" type="image/x-icon" href="img/favicon.ico">
<!-- Custom fonts for this template-->
<link href="fonts/fontawesome-free/css/all.min.css" rel="stylesheet" type="text/css">
<link href="fonts/nunito.css" rel="stylesheet">
<!-- Custom styles for this template-->
<link href="css/sb-admin-2.min.css" rel="stylesheet">
<!-- animated gradient background and other animations-->
<style>
html {
height: 100%;
}
.bg-animated {
min-height: 100%;
background: linear-gradient(-45deg, #555555, #494949, #5e73b3, #4e73df);
background-size: 400% 400%;
background-attachment: fixed;
animation: gradient 5s ease;
animation-fill-mode: forwards;
}
@keyframes gradient {
0% {
background-position: 100% 50%;
}
100% {
background-position: 0% 50%;
}
}
.marquee {
display: none;
left: 0;
position: absolute;
top: 0;
z-index: 999999;
}
@keyframes fadeInFromTop {
from {
opacity: 0;
transform: translateY(-10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.card-body {
animation: fadeInFromTop 1s ease-in-out;
}
@keyframes fadeInFromBottom {
from {
opacity: 0;
transform: translateY(+10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes fadeInFromLeft {
from {
opacity: 0;
transform: translateX(-20px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
.fade-in-from-bottom {
animation: fadeInFromBottom 0.7s ease-out;
}
.fade-in-from-left {
animation: fadeInFromLeft 0.7s ease-out;
}
checkbox {
cursor: pointer;
}
</style>
</head>
<div class="marquee">
<svg width="153px" height="69px">
<g>
<path class="logo"
d="M140.186,63.52h-1.695l-0.692,5.236h-0.847l0.77-5.236h-1.693l0.076-0.694h4.158L140.186,63.52L140.186,63.52z M146.346,68.756h-0.848v-4.545l0,0l-2.389,4.545l-1-4.545l0,0l-1.462,4.545h-0.771l1.924-5.931h0.695l0.924,4.006l2.078-4.006 h0.848V68.756L146.346,68.756z M126.027,0.063H95.352c0,0-8.129,9.592-9.654,11.434c-8.064,9.715-9.523,12.32-9.779,13.02 c0.063-0.699-0.256-3.304-3.686-13.148C71.282,8.7,68.359,0.062,68.359,0.062H57.881V0L32.35,0.063H13.169l-1.97,8.131 l14.543,0.062h3.365c9.336,0,15.055,3.747,13.467,10.354c-1.717,7.24-9.91,10.416-18.545,10.416h-3.24l4.191-17.783H10.502 L4.34,37.219h20.578c15.432,0,30.168-8.13,32.709-18.608c0.508-1.906,0.443-6.67-0.764-9.527c0-0.127-0.063-0.191-0.127-0.444 c-0.064-0.063-0.127-0.509,0.127-0.571c0.128-0.062,0.383,0.189,0.445,0.254c0.127,0.317,0.19,0.57,0.19,0.57l13.083,36.965 l33.344-37.6h14.1h3.365c9.337,0,15.055,3.747,13.528,10.354c-1.778,7.24-9.972,10.416-18.608,10.416h-3.238l4.191-17.783h-14.481 l-6.159,25.976h20.576c15.434,0,30.232-8.13,32.709-18.608C152.449,8.193,141.523,0.063,126.027,0.063L126.027,0.063z M71.091,45.981c-39.123,0-70.816,4.512-70.816,10.035c0,5.59,31.693,10.034,70.816,10.034c39.121,0,70.877-4.444,70.877-10.034 C141.968,50.493,110.212,45.981,71.091,45.981L71.091,45.981z M68.55,59.573c-8.956,0-16.196-1.523-16.196-3.365 c0-1.84,7.239-3.303,16.196-3.303c8.955,0,16.195,1.463,16.195,3.303C84.745,58.05,77.505,59.573,68.55,59.573L68.55,59.573z" />
</g>
</svg>
</div>
<body id="page-top" class="bg-animated">
<!-- Page Wrapper -->
<div id="wrapper animated--grow-in" class="wrapper">
<!-- Content Wrapper -->
<div id="content-wrapper" class="w-100">
<!-- Main Content -->
<div id="content" class="fade-in-from-bottom">
<!-- Begin Page Content -->
<div class="container mt-4" style="max-width: 1440px;">
<!-- Content Row -->
<div class="row">
<div class="col-lg-12 mb-4">
<!-- Instructions Card (Already spans full width) -->
<div class="card shadow mb-4">
<a href="#instructions" class="d-block card-header py-3" data-toggle="collapse" role="button">
<h6 class="m-0 font-weight-bold text-primary">Instructions</h6>
</a>
<div id="instructions" class="card-body collapse">
<h2 class="mb-4">IU2FRL Flasher (derived from UVMOD)</h2>
<p>This tool provides a comprehensive web interface for flashing firmwares and configuring Quansheng UV-K5, UV-K6,
UV-K5(8), and UV-5R Plus handheld radios. It works by connecting to your radio through a compatible programming cable
using Web Serial API.</p>
<h3 class="mt-4">Firmware Flasher Features</h3>
<ul>
<li><strong>Multiple Firmware Options:</strong> Choose from pre-configured firmware versions or upload your own custom firmware</li>
<li><strong>Firmware Download:</strong> Download firmware files to your PC for manual flashing or backup</li>
<li><strong>Automatic Version Detection:</strong> The tool automatically detects firmware versions and handles compatibility checks</li>
<li><strong>Bootloader Communication:</strong> Direct communication with the radio's bootloader for reliable flashing</li>
<li><strong>Progress Monitoring:</strong> Real-time progress updates during the flashing process</li>
<li><strong>Size Verification:</strong> Automatic verification of firmware size to ensure compatibility</li>
</ul>
<h3 class="mt-4">Radio Configurator Features</h3>
<ul>
<li><strong>Read Configuration:</strong> Read and display your radio's current configuration without modifying the firmware</li>
<li><strong>Write Configuration:</strong> Save modified settings back to your radio's EEPROM</li>
<li><strong>Automatic Backups:</strong> Option to automatically create backup files when reading configurations</li>
<li><strong>Configuration Presets:</strong> Load pre-configured settings specifically designed for different firmware versions</li>
<li><strong>Import/Export:</strong> Import configuration from backup files or export your current settings</li>
<li><strong>Radio Reboot:</strong> Automatically reboots the radio after writing configuration changes</li>
</ul>
<h3 class="mt-4">How to Use the Firmware Flasher</h3>
<ol>
<li>Select a firmware from the dropdown menu or upload your own custom firmware file</li>
<li>Put your radio in bootloader mode by holding PTT while powering on (display will be blank)</li>
<li>Connect your radio to your computer using a programming cable</li>
<li>Click "Flash firmware to the radio" to begin the flashing process</li>
<li>Monitor the console window for progress updates and confirmation</li>
<li>Wait for the process to complete before disconnecting your radio</li>
</ol>
<h3 class="mt-4">How to Use the Radio Configurator</h3>
<ol>
<li>Turn on your radio in normal operating mode (not bootloader mode)</li>
<li>Connect your radio to your computer using a programming cable</li>
<li>Click "Read Config" to retrieve your radio's current configuration</li>
<li>To restore a previous configuration, either select a preset or import a backup file</li>
<li>Click "Write Config" to apply changes to your radio</li>
<li>Wait for the configuration process to complete and the radio to reboot</li>
</ol>
<h3 class="mt-4">Technical Details</h3>
<p>The tool utilizes Web Serial API to communicate with your radio and performs the following operations:</p>
<ul>
<li><strong>Firmware Unpacking:</strong> Automatically unpacks binary firmware files for processing</li>
<li><strong>EEPROM Access:</strong> Direct reading and writing to the radio's EEPROM for configuration management</li>
<li><strong>Packet Communication:</strong> Uses specialized protocols to communicate with both the radio's bootloader and normal operating mode</li>
<li><strong>Flash Memory Operations:</strong> Performs safe erase and write operations to the radio's flash memory</li>
</ul>
<h3 class="mt-4">Requirements</h3>
<ul>
<li>Chromium-based browser (Chrome, Edge, Opera) with Web Serial API support</li>
<li>Appropriate drivers for your programming cable (typically CH340, CH341 or CP210X chips)</li>
<li>Stable connection during flashing and configuration processes</li>
<li>For firmware flashing: Radio must be in bootloader mode (hold PTT while powering on)</li>
<li>For configuration: Radio must be in normal operating mode</li>
</ul>
<p class="mt-4 font-weight-bold">Note: This tool is designed for radio enthusiasts and should be used with caution. Always back up your configurations before making changes, and ensure your radio remains connected during the entire flashing or configuration process.</p>
</div>
</div>
<!-- Console Card - Now spans full width -->
<div class="card shadow mb-4">
<div class="card-header py-3 d-flex">
<div class="mr-auto">
<h6 class="m-0 font-weight-bold text-info">Console</h6>
</div>
</div>
<div class="card-body">
<div class="d-flex justify-content-center">
<textarea id="console" class="w-100 form-control" style="height: 10em;" readonly>Waiting</textarea>
</div>
</div>
</div>
<!-- Firmware Updater - Now spans full width -->
<div class="card shadow mb-4">
<div class="card-header py-3 d-flex">
<div class="mr-auto">
<h6 class="m-0 font-weight-bold text-primary">Firmware updater</h6>
</div>
</div>
<div class="card-body">
<div class="row mb-3">
<div class="col-md-12">
<div class="input-group">
<select id="firmwareFileSelect" class="form-control" onchange="handleFirmwareSelect()">
<option value="" selected>Custom firmware file</option>
<option value="fw/k5_v2.01.26_publish.bin">Original firmware V1.26</option>
<option value="fw/firmware.N3.40.bin">IJV V3.4 with no hardware modification</option>
<option value="fw/firmware.X3.40.bin">IJV V3.4 modified with 24M01/24M02 EEPROM (999ch)</option>
<option value="fw/firmware.S3.40.bin">IJV V3.4 modified with slow 24M01/24M02 EEPROM (999ch)</option>
<option value="fw/fagci-r3b0rn-2025-01-19-buggy-nightly1-SNR-CLOSE-43.bin">FAGCI Nightly 2025-01-19 (any EEPROM)</option>
</select>
</div>
</div>
</div>
<div class="row mb-3">
<div class="col-md-12">
<div class="custom-file">
<input id="customFirmwareInput" type="file" class="custom-file-input" accept=".bin" onchange="handleCustomFirmwareSelect()">
<label id="customFirmwareLabel" class="custom-file-label" for="customFirmwareInput">Upload custom firmware</label>
</div>
</div>
</div>
<div class="d-flex">
<a id="downloadFirmwareButton" class="btn btn-dark btn-icon-split mr-1 w-100" onclick="downloadFirmware()">
<span class="icon text-white-50">
<i class="fas fa-download"></i>
</span>
<span class="text w-100">Download firmware to PC</span>
</a>
<a id="flashButton" class="btn btn-dark btn-icon-split w-100">
<span class="icon text-white-50">
<i class="fab fa-usb"></i>
</span>
<span class="text w-100">Flash firmware to the radio</span>
</a>
</div>
</div>
</div>
<!-- Radio Configurator - Now spans full width -->
<div class="card shadow mb-4">
<div class="card-header py-3 d-flex">
<div class="mr-auto">
<h6 class="m-0 font-weight-bold text-success">Radio Configurator</h6>
</div>
</div>
<div class="card-body">
<div id="configContainer" class="mb-4">
<!-- Configuration content will be loaded here -->
</div>
<!-- Added configuration selection row -->
<div class="row mb-3">
<div class="col-md-12">
<div class="input-group">
<select id="configFileSelect" class="form-control" onchange="handleConfigSelect()">
<option value="" selected>Custom config file</option>
<option value="config/ijv_v3.40_config.bin">IJV V3.40 Config</option>
</select>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="input-group mb-3">
<div class="input-group-prepend">
<div class="input-group-text">
<input id="automaticBackupCheckbox" style="cursor: pointer;" type="checkbox" checked>
</div>
</div>
<label for="automaticBackupCheckbox" class="form-control" readonly style="cursor: pointer;">Save
automatic backup</label>
</div>
</div>
<div class="col-md-6">
<div class="custom-file mb-3">
<input id="backupFileInput" type="file" class="custom-file-input" accept=".bin"
onchange="handleBackupFileSelect()">
<label id="backupFileLabel" class="custom-file-label" for="backupFileInput">Import
backup</label>
</div>
</div>
</div>
<div class="d-flex">
<a id="readConfigButton" class="btn btn-success btn-icon-split mr-1 w-100">
<span class="icon text-white-50">
<i class="fas fa-sign-out-alt"></i>
</span>
<span class="text w-100">Read Config</span>
</a>
<a id="writeConfigButton" class="btn btn-success btn-icon-split disabled w-100">
<span class="icon text-white-50">
<i class="fas fa-sign-in-alt"></i>
</span>
<span class="text w-100">Write Config</span>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- /.container-fluid -->
</div>
<!-- End of Main Content -->
</div>
<!-- End of Content Wrapper -->
</div>
<!-- End of Page Wrapper -->
<!-- Bootstrap core JavaScript-->
<script src="js/vendor/jquery.min.js"></script>
<script src="js/vendor/bootstrap.bundle.min.js"></script>
<script src="js/vendor/bs-custom-file-input.min.js"></script>
<!-- Core plugin JavaScript-->
<!-- Patcher JavaScript -->
<script src="js/fwpack.js"></script>
<script src="js/qsSerial.js"></script>
<script src="js/modframework.js"></script>
<script src="js/tool_patcher.js"></script>
<script src="js/tool_configurator.js"></script>
<script src="js/main.js"></script>
</body>
</html>