MD-UV380 bring-up checklist
The MD-UV380 port (make BOARD=mduv380, and POWER=10w for an MD-UV390 Plus 10 W) builds and passes its host tests.
Nothing has run on a radio yet. This page is the order to try it in, what each stage proves, and what to change when
it doesn't work. The stage numbers match the unknowns table in hardware-mduv380.md
section 14. Every row names the knob in the source that the likely failure points at.
The radio is a TYT MD-UV380, MD-UV390 or Retevis RT3S, with or without GPS. The port is the UV380 board family's code
(boards/uv380_family, shared with the DM-1701) with this radio's data in boards/mduv380/board.c (uvf_variant,
uvf_key_matrix). Most stages check one entry of that data.
The bench is remote: nobody presses keys or looks at the screen. Every check below reads something over the debug
link (tools/rfoundry_debug.py) or on the SDR bench, and the diagnostics page lines (diag) carry the raw readings.
The feature checklist, with every feature's required HIL tests and the last recorded result, is
tools/bringup.py list --radio mduv380. tools/bringup.py run --radio mduv380 records a run
(tests/hil/README.md). This page keeps the hardware steps and what to
change when one fails.
Status
Not run on a radio. The codec builds were checked on a host only (untested on the radio): TYT 19.26; TYT 19.74 and 219.74, 5 W and 10 W; TYT and Retevis 18.11 and 18.16; Retevis RT3S 19.06 and 219.60. A first DMR test should use a 19.26 file and one whose code goes to the start of sector 10 (RT3S 219.60, any 219.74, S19.74).
0. Before anything
- Back up the radio: the codeplug with the stock CPS, then the whole SPI flash and the internal flash through the
stub (
rfoundry backup). The factory calibration is in the SPI flash security registers; RadioFoundry only reads it. - Build:
make BOARD=mduv380(5 W) ormake BOARD=mduv380 POWER=10w(Plus 10 W). With a supported TYT or Retevis file incodecs/(codec-mduv380.md, "Stock files"), the build also writes_codec.binwith the codec merged in. - Flash with
rfoundry flashthrough the TYT bootloader (PTT and SK1 held at power on) or the web flasher.
1. It boots
| Check | Pass | If not |
|---|---|---|
USB enumerates as RadioFoundry MD-UV380 |
the debug link answers info |
HSE mode (unknown 1): diag line "hse": ext or xtal says which started; HSI means neither (boards/uv380_family/system_uvf.c) |
| Boot reason, crash log empty | rfoundry_debug.py crash empty |
tools/crash_decode.py on the report |
2. Display
| Check | Pass | If not |
|---|---|---|
| Panel type | diag "panel type" 0-3 |
unknown 2: the factory byte (security register 3, 0x1D) maps through uvf_variant.panel_type / panel_rgb |
| Picture upright, not mirrored, colors right | the screen capture (rfoundry_debug.py screen) matches the gallery |
the MADCTL of the type (drivers/display/st7735), madctl_xor in display_uvf.c |
| All 128 rows | no blank or wrapped band at the bottom | UVF_LCD_HIDDEN_ROWS (board.mk) |
| Backlight dims | the brightness setting changes the current draw | PD8 (5 W) / PC6 (10 W): pins.h |
3. Keys, channel knob, power, flash
| Check | Pass | If not |
|---|---|---|
| Each key reports the right name | the debug link's key view, with each key pressed by the HIL key test or a helper at the radio | unknown 4: uvf_key_matrix in boards/mduv380/board.c; diag shows raw rows |
| Encoder: clockwise is the next channel | rfoundry_debug.py encoder counters |
unknown 5: the decoder's rest state (input_uvf.c) |
| Battery voltage within 0.1 V of a meter | diag "bat raw" |
unknown 6: uvf_variant.bat_mul / bat_div |
| Volume 0 at the stop, 100 at the top | diag "vol raw" at both ends |
unknown 7: vol_min, vol_break, vol_max |
| SPI flash JEDEC 0xEF4018 | info |
flash_uvf.c (device) |
| Calibration read | diag "cal" factory or working |
the k factors uvf_variant.cal_k, the reader calibration_uvf.c |
| 10 W marker | read security register 3 byte 0x1C on a 5 W and on a Plus 10 W radio (rfoundry backup keeps the security registers); diag "TX off: 10 W radio, 5 W image" means a 5 W image found the marker |
unknown 3: the TYT images never read the byte, so the marker is unconfirmed; a 10 W image doesn't require it. MDUV380_DEFS=-DMDUV380_10W_CHECK=0 skips it |
4. AT1846S, HR_C6000
| Check | Pass | If not |
|---|---|---|
| Both chips answer | diag "C6000 4:10=80", "errs 0" |
radio_uvf.c bus set-up (the same pins as the DM-1701) |
5. FM receive
tests/hil FM receive cases on 461.4625 against the SDR bench (--fm-mhz).
6. FM transmit (dummy load)
The lowest power first. tests/hil FM transmit cases with --allow-rf.
| Check | Pass | If not |
|---|---|---|
| Carrier on frequency, deviation | the bench's FM check | the TX offset in radio_uvf.c, the calibration's I/Q rows |
| Power per level | a power meter at each level, both band edges | unknown 10: uvf_variant.frac, cal_k |
7. DMR receive
The codec needs the merged image (_codec.bin). diag DMR counters, tests/hil DMR receive cases from the bench HAT.
8. DMR transmit (dummy load, then a hotspot or repeater)
| Check | Pass | If not |
|---|---|---|
| The bench decodes our bursts and voice | tests/hil -m radio_tx DMR cases |
unknown 9: AT1846S 0x44 AF gain; unknown 12: the codec descriptor (vocoder_mduv380.c profile) |
9. GPS
G models only. diag and the APRS position: the module is powered on PA9 for 5 s at start-up, kept on when NMEA is
heard on USART1 (PA10, 9600 baud), switched off otherwise (unknown 8, boards/mduv380/board.c).
10. After the bench
Record each result in hardware-mduv380.md (unknowns table) and in this page's Status,
and move the radio's [status] in boards/mduv380/board.toml on.