Customising the unit¶
Every asset inside the media partition that can be replaced, what each one is for, and how
safe it is to touch. All of it lives in system.bin, which
tools/patch_media.py rebuilds — see
Media partition for the format and the checksum cascade.
Replacement only. The partition's system_ctrl.bin records are per-file, and adding a
new file would need a record that does not exist. Everything below is a swap, keeping the
filename.
Where to start
The lowest-risk, highest-visibility swaps are radio station logos (597 plain PNGs)
and the ring / wait / GUI tones (plain WAV). No format work, trivially reversible,
and the worst case is the unit ignoring the file. Save the string tables, gui_*.xml
and the marque .pkg containers for later — see the risk table.
Sounds — 28 WAV files¶
Three independent groups, and they are easy to confuse because they all look like "the sounds".
Ring tones — ring_tones/ (9)¶
The phone ring tones, and the call/status tones.
| file | what it is | format |
|---|---|---|
ring1RT.wav … ring5RT.wav |
the five selectable ring tones | 16-bit mono 44.1 kHz |
busyRT.wav |
engaged tone | same |
errorRT.wav |
error tone | same |
okRT.wav |
confirmation tone | same |
koRT.wav |
failure tone | same |
The RT is part of the real filename. The names the phone UI shows are not here: they
are string literals in the application image (read), which media.names patches in place,
each with a fixed maximum length. See Ring tones.
Wait tones — wait_tones/ (13)¶
Network call-hold music, one per language, and a different format from everything else:
Interface sounds — boardfs/GUI_STYLE/GUIS_RESSOURCES/gui_sounds/ (6 + a map)¶
The touch feedback, with a plain XML map from id to filename:
BalayageZ0.wav page sweep Abandon.wav cancel / back
Validation.wav confirm a panel Clavier.wav keyboard keys
Welcome.wav welcome screen appears Brosser.wav brush
Stock oddity worth knowing: gui_sounds.xml also lists OuvertureMenu.wav (id 1,
MAIN_MENU_OPENING) and that file is not present. The map promises more sounds than ship.
Fonts — 7 TrueType files¶
All in Data_base/TMP/lib/fonts/, and the names say what they are for:
| file | likely role |
|---|---|
GillSansPSA.ttf |
the main UI typeface — PSA's licensed Gill Sans |
PLAQUESgilsans.ttf |
the plaque/harmony style |
GillSansSLIDER.ttf, Ecube SLIDER.ttf, T9typoSLIDER.ttf, TYPEC4SLIDER.ttf |
the "slider" family, one per harmony |
DejaVuSans.ttf |
a fallback with wider script coverage |
The unit ships its own fonts, so the typeface is replaceable. GillSansPSA is a licensed
commercial face, so substituting it is a licensing
question as much as a technical one. DejaVuSans is the free one.
Images and glyphs — 631 PNG + 2 BMP¶
Radio station logos — Data_base/radio/logo/ (597)¶
199 stations in three sizes (Large, Medium, Small), named by country and station:
AT_O3.png, BE_JoeFM.png, …. Plain PNGs, mapped by RadioLogo.sqlite (PI_Logo_List).
The most accessible customisation in the whole unit: no format work, no risk, and it is nearly
600 files of visible result.
Front-panel animation — AVR_img/ (8)¶
AVR_IMG1.png … AVR_IMG8.png, 800×480 RGBA. A wireframe animation of a structure — bridges
and arches — that plays on the front-panel display. It is not the boot logo.
Browser portal art — internet_default/ (26)¶
portal/pgen_<peugeot|citroen>_<home_1..3|load|network|usb>.v2.pgen.png
portal/sprite_offline.v2.png
PMS_picto/6306001.png … 6306012.png status pictograms
config/ErreurPortail_V2.png portal error image
The browser's own artwork, and the only place the marque branding is duplicated across both Peugeot and Citroën in image form.
iPod logo — graphics/logo/iPodLogo/ (2 BMP)¶
iPodLogoPeugeot.bmp, iPodLogoCitroen.bmp — shown while an iPod is connected. BMP, not PNG,
and per marque.
Marque logos — graphics/logo/ (3 .pkg)¶
peugeot.pkg, citroen.pkg, ds.pkg. Decoded in tools/splash.py —
four 800×480 images each. These are not the boot splash; the boot artwork is in a NAND
area a USB package cannot reach. What reads these is the skin system — BigHarm3 is labelled
ESSENTIEL (DS), which is why ds.pkg exists at all.
Strings — 14 language tables¶
boardfs/GUI_STYLE/GUIS_RESSOURCES/gui_texts/gui_text_strings_<LANG>.xml.bin
BR CR CZ DU FR GB GE HO IT PL PO RU SP TU — 14 files ship, of the 16 languages
gui_languages.xml lists (SC and US, the two Chinese entries, are absent). Not XML
despite the name: a 16-byte header, a 12-byte (id, offset, length) record per string, then
the strings as UTF-16BE with no terminator — a byte count bounds each one, not a NUL. The
format is decoded and tools/guistrings.py round-trips it byte-for-byte, which is what allows
overriding a UI label, e.g. calling the AUX tile "CarPlay". See
GUI string tables for the layout, the edit loop and the worked package rebuild.
Theme and layout — the XML¶
| file | what it controls |
|---|---|
boardfs/GUI_STYLE/gui_config.xml |
screen size (800×480), harmony id, language, resource paths |
boardfs/GUI_STYLE/gui_harmonies.xml |
look-and-feel ids 0–7: AGORA, BLUEXY, PLAQUE, EKODO, MORGLUB, AGORA2, FOR_TEST, TEST |
boardfs/GUI_STYLE/gui_languages.xml |
16 languages, id → code |
gui_sounds.xml |
sound id → file |
The catch for all of these: gui_config.xml sets harmony id 10, which is outside the
0–7 range in gui_harmonies.xml, and the image/font/colour paths it references are absent
from the partition. The real skin is delivered by the HARMONY module, not from here. So
these files are configuration for a skin system whose artwork lives elsewhere, and editing them
may change nothing.
See What is reachable for the HARMONY findings, including the five skins the unit ships and why custom artwork is out of reach for now.
Wallpapers¶
There is no wallpaper system in the partition. The nearest things are the browser's
MMR/background_1.css and background_2.css, which set the portal background, and the skin's
own background, which comes from HARMONY. Choosing a different skin is the realistic route to
a different look; see What is reachable.
Cheatcode libraries — Application/CCOD/ (23)¶
libcheatcode_<NAME>.out (+ .inf, .txt.gz) — loadable modules behind the diagnostic
cheatcodes: SPYSTORE, SPYTAKE, SYSPMON, REBOOT, BTINFO, TUNERINFO, ZAINFO,
HWINFO, SWINFO, PING, FPS and others. See Cheatcodes.
What is safe, and what is not¶
| category | risk | why |
|---|---|---|
| Ring tones, wait tones, GUI sounds | low | plain WAV, easy to revert, no format work |
| Radio station logos | low | plain PNG, 597 of them, no format work |
| Fonts | low technically, licensing caveat | plain TTF; GillSansPSA is a commercial face |
| Browser portal art, iPod logos | low | plain PNG/BMP |
| String tables | medium | format decoded and round-tripped, but no label has been flashed and which id a given tile shows is unproven |
gui_*.xml |
medium | plausibly inert, as the skin comes from HARMONY |
Marque .pkg |
unknown | decodable and rebuildable, but what reads them is unidentified |
Everything here is a data change — no application code is patched, and the worst case for the low-risk rows is that the unit ignores the file. That is a materially safer class of change than anything in PATCHES.md.
Tooling¶
tools/assets.pylists every replaceable file with a human-readable label, exports a group, and replaces one asset or a directory of them (--tree media replace --asset radio-logos --with my-logos/).tools/ringtones.pyconverts audio to the tone formats. It does not change level; a build manifest'sgain_dbdoes (see Ring tones).tools/splash.pyhandles the marque.pkgcontainers.tools/patch_media.pyrebuilds the partition and its checksum cascade after any of these.