MyTetra Share
Делитесь знаниями!
Подключение к встроенному шеллу на синтезаторе Yamaha PSR-E473
Время создания: 26.03.2025 12:16
Автор: Xintrea
Текстовые метки: yamaha, PSR, e473, синтезатор, клавиши, MIDI, USB, интерфейс, шелл, shell, консоль, datasheet
Раздел: Музыка - Пианино - Yamaha
Запись: xintrea/mytetra_syncro/master/base/17429806165yp7w437tg/text.html на raw.github.com

Как оказалось, самая актуальная модель линейки PSR на 2023-2025 год - а именно синтезатор Yamaha PSR E-473, имеет встроенный отладочный shell, к которому можно подключиться по USB-кабелю, через разъем, в котором совмещены USB и MIDI протоколы.


Наличие такого шелла обнаружила исследователь "огороженной" техники Portasynthinca3 в момент, когда она пыталась запустить мультфильм Bad Apple на экране своей старенькой Yamaha PSR E-433, модель 2012 года. (Есть такой челленж в среде хакеров - запустить DOOM на каком-нибудь не предназначенном для этого оборудовании. Показать клип Bad Apple на устройстве, совершенно не предназначенном для этого - из той же серии). Естественно, компания Yamaha всячески скрывает информацию о том, как устроены их синтезаторы с точки зрения схемотехники. В сети Интернет с большим трудом можно найти Service Manual на какие-нибудь устаревшие модели, но даже в этих документах никаких подробностей об устройстве программной части, о возможностях подключения, отладки и изменения настроек - никакой информации нет. Всего из пары источников можно узнать хотя бы то, что Ямаховский чип SWL - это на самом деле микроконтроллер с архитектурой ARM7.


В общем, я установил и подправил скрипты, которые Portasynthinca3 сделала во время своих изысканий, и оказалось, что в моем более новом синтезаторе этот метод подключения все так же работает! Да, прошло более 10 лет, были выпущены модели E-433, E-443, E-453, E-463, E-473, и по-всей видимости, во всех них имеется отладочный шелл, который можно использовать для исследования внутренностей синтезатора.


Что нужно изменить в скрипте shell.py, чтобы подключиться к своему синтезатору? Надо подключить USB-кабель к компьютеру, и дать команду:



> amidi -l

Dir Device Name

IO hw:1,0,0 Digital Keyboard MIDI 1



Значение Name, т. е. строку "Digital Keyboard MIDI 1" надо прописать в shell.py в переменных in_port и out_port.


Вот что мой синтезатор Yamaha E-473 рассказывает о себе и командах шелла:



login

passwd? #0000

login OK


> help

logout

help

?

info

ver

stack

perf-on

perf-off

perf-disp

d

dp

d xxxxx

d/s xxxxx

m ADDRESS DATA

m/b ADDRESS DATA

m/w ADDRESS DATA

m/l ADDRESS DATA

regist

voiceset

ots

func

mdb

backup

chkprm

freearea

jobconid

dispinfo

swmask

ioport

getsw

pushsw

sendsw

perf-key

perf-sw

perf-pedal

perf-wheel

perf-vol

sound-cnt-start

sound-cnt-disp

flash-write

voice-time

regist-time



Ого, по сравнению с версией от MAY 16 2012, в этом шелле добавилось 25 новых команд!


Вот что показывают команды, выводящие основную информацию о синтезаторе:



> info

DevelopName PSR-E473

DevelopNumber #4022

Main DevelopNumber #4022

Make data & time MAY 28 2021 14:21:36

J/E Select English


> ver

Main Version 1.01

Boot Version 1.00

Style Version 1.00

Song Version 1.00

Param Version 1.01

Wave Version 1.00

Pattern Version 1.00

Unshi Version No Data

Adss Version No Data

Manufacturer : 0105 : YAMAHA.

Product version : 0200 : V.2.00.00



Я все делал поздно ночью, и пока не стал запускать неизвестные команды, с которыми еще надо разобраться. Так что в данный момент рассказываю о самой возможности получения низкоуровневого доступа к внутреннему устройству Yamaha PSR E-473.


Некоторые сведения о командах и о том как получить дамп памяти, можно посмотреть в следующем обсуждении: https://github.com/portasynthinca3/swl01u/issues/1


Имеется так же описание команд встроенного шелла Yamaha на русском языке.



Продолжение.


Вот какие сведения можно получить из шелла.



Дамп первых байт



> d 0

00000000 00 80 01 01 01 04 00 00 05 01 00 00 0B 01 00 00

00000010 11 01 00 00 17 01 00 00 1D 01 00 00 23 01 00 00 #

00000020 29 01 00 00 2F 01 00 00 35 01 00 00 3B 01 00 00 ) / 5 ;

00000030 41 01 00 00 47 01 00 00 4D 01 00 00 53 01 00 00 A G M S

00000040 59 01 00 00 5F 01 00 00 65 01 00 00 6B 01 00 00 Y _ e k

00000050 71 01 00 00 77 01 00 00 7D 01 00 00 83 01 00 00 q w }

00000060 89 01 00 00 8F 01 00 00 95 01 00 00 9B 01 00 00

00000070 A1 01 00 00 A7 01 00 00 AD 01 00 00 B3 01 00 00

00000080 B9 01 00 00 BF 01 00 00 C5 01 00 00 CB 01 00 00

00000090 D1 01 00 00 D7 01 00 00 DD 01 00 00 E3 01 00 00

000000A0 E9 01 00 00 EF 01 00 00 F5 01 00 00 FB 01 00 00

000000B0 01 02 00 00 07 02 00 00 0D 02 00 00 13 02 00 00

000000C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

000000D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

000000E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

000000F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

> d 100

00000100 FF F7 FE BF 02 20 FF F7 FB BF 03 20 FF F7 F8 BF

00000110 04 20 FF F7 F5 BF 05 20 FF F7 F2 BF 06 20 FF F7

00000120 EF BF 07 20 FF F7 EC BF 08 20 FF F7 E9 BF 09 20

00000130 FF F7 E6 BF 0A 20 FF F7 E3 BF 0B 20 FF F7 E0 BF

00000140 0C 20 FF F7 DD BF 0D 20 FF F7 DA BF 0E 20 FF F7

00000150 D7 BF 0F 20 FF F7 D4 BF 10 20 FF F7 D1 BF 11 20

00000160 FF F7 CE BF 12 20 FF F7 CB BF 13 20 FF F7 C8 BF

00000170 14 20 FF F7 C5 BF 15 20 FF F7 C2 BF 16 20 FF F7

00000180 BF BF 17 20 FF F7 BC BF 18 20 FF F7 B9 BF 19 20

00000190 FF F7 B6 BF 1A 20 FF F7 B3 BF 1B 20 FF F7 B0 BF

000001A0 1C 20 FF F7 AD BF 1D 20 FF F7 AA BF 1E 20 FF F7

000001B0 A7 BF 1F 20 FF F7 A4 BF 20 20 FF F7 A1 BF 21 20 !

000001C0 FF F7 9E BF 22 20 FF F7 9B BF 23 20 FF F7 98 BF " #

000001D0 24 20 FF F7 95 BF 25 20 FF F7 92 BF 26 20 FF F7 $ % &

000001E0 8F BF 27 20 FF F7 8C BF 28 20 FF F7 89 BF 29 20 ' ( )

000001F0 FF F7 86 BF 2A 20 FF F7 83 BF 2B 20 FF F7 80 BF * +



Примечание: попытка сделать дамп с адреса 0x01018000 приводит к зависанию.



Замер производительности и задачи через perf-disp


Команда perf-disp показывает 44 задачи. Перед командой perf-disp надо сделать команду perf-on, а когда замеры закончены - perf-off.



> perf-disp

-9Sec -8Sec -7Sec -6Sec -5Sec -4Sec -3Sec -2Sec -1Sec 0Sec (MAX=100%)

ID 00 Task 0.5 0.5 0.5 0.6 0.5 0.5 0.5 0.7 0.7 0.2

ID 01 Task 0.0 0.0 0.5 0.1 0.1 0.0 0.0 0.0 0.0 0.0

ID 02 Task 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

ID 03 Task 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

ID 04 Task 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

ID 05 Task 0.0 0.0 0.1 0.0 0.0 0.0 0.0 0.0 0.0 0.0

ID 06 Task 0.0 0.0 0.0 0.0 0.0 0.0 0.1 0.0 0.0 0.0

ID 07 Task 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

ID 08 Task 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

ID 09 Task 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

ID 10 Task 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

ID 11 Task 1.8 1.7 1.9 1.6 1.6 1.6 1.7 1.4 1.7 0.9

ID 12 Task 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

ID 13 Task 0.2 0.1 0.3 0.0 0.1 0.1 0.1 0.1 0.1 0.1

ID 14 Task 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

ID 15 Task 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

ID 16 Task 2.8 1.5 1.8 1.8 2.7 1.8 2.8 2.3 1.9 1.1

ID 17 Task 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

ID 18 Task 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

ID 19 Task 0.3 0.4 0.4 0.5 0.4 0.3 0.5 0.3 0.6 0.1

ID 20 Task 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

ID 22 Task 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

ID 23 Task 0.2 0.4 0.1 0.2 0.2 0.2 0.1 0.0 0.2 0.1

ID 24 Task 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

ID 25 Task 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

ID 26 Task 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

ID 29 Task 1.6 1.8 1.9 1.4 1.8 1.7 1.7 1.5 1.7 1.0

ID 30 Task 0.3 0.4 0.3 0.4 0.3 0.2 0.3 0.5 0.3 0.1

ID 31 Task 0.3 0.2 0.3 0.3 0.1 0.2 0.4 0.1 0.3 0.2

ID 33 Task 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

ID 34 Task 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

ID 35 Task 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

ID 36 Task 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

ID 37 Task 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

ID 39 Task 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

ID 40 Task 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

ID 43 Task 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

ID 44 Task 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0



Значения управляющих регистров


Команда regist показывает следующую информацию:



> regist

========= Regist Parameter =========

Part param Main Dual Left

On/Off : 127 000 000

Voice No. : 000 107 088

Bank MSB : 000 000 000

Bank LSB : 115 112 112

Prg Change : 000 048 033

Volume : 110 045 080

Octave : 000 000 -001

Panpot : 064 064 064

Rev Depth : 016 090 008

Cho Depth : 000 000 000

Attk Time : 064 064 064

Rel Time : 064 064 064

Fil Cutoff : 064 064 064

Fil Reso : 064 064 064

Common Param

Rev Type : 003

Cho Type : 003

Rev Total : 064

Style No. : 000

Acmp On/Off : 001

Style Sect : 005

Acmp Volume : 100

Transpose : 000

Pitch BendR : 002

Acmp Split : 054

Split Point : 054

DSP1 Type : 042

DSP2 Type : 001

DSP2 Part : 001

Harm On/Off : 000

Harm Type : 002

Harm Volume : 080

Tempo : 117

Nkob Asin : 000

Apg On/Off : 000

Apg Type : 000

Apg Vel : 001

Apg Quan : 002

Apg Pdl Fnc : 000

Acmp Part : 0xFFFFFF00

====================================



Настройки голоса


Команда voiceset, похоже, показывает настройки, с которыми воспроизводится основной голос:



> voiceset

======== Voiceset Parameter ========

Part param Main Dual Left

On/Off : 127 000 000

Voice No. : 000 107 088

Bank MSB : 000 000 000

Bank LSB : 115 112 112

Prg Change : 000 048 033

Volume : 110 045 080

Octave : 000 000 -001

Panpot : 064 064 064

Rev Depth : 016 090 008

Cho Depth : 000 000 000

Vel Depth : 064 066 064

Vel Offset : 064 064 064

Fil Cutoff : 064 064 064

Fil Reso : 064 064 064

Trns On/Off : 001 001 001

Common Param

Cho Type : 003

DSP1 Type : 042

DSP2 Type : 001

Harm On/Off : 000

Harm Type : 002

Harm Volume : 080

Apg On/Off : 000

Apg Type : 000

Apg Pdl Fnc : 000

====================================



Настройки OTS


Не совсем понятно, это настройки чего. Возможно это настройки голоса, который включится если нажать кнопку OTS.



> ots

=========== OTS Parameter ==========

Part param Main Dual Left

On/Off : 127 000 000

Voice No. : 000 107 088

Bank MSB : 000 000 000

Bank LSB : 115 112 112

Prg Change : 000 048 033

Volume : 110 045 080

Octave : 000 000 -001

Panpot : 064 064 064

Rev Depth : 016 090 008

Cho Depth : 000 000 000

Attk Time : 064 064 064

Rel Time : 064 064 064

Fil Cutoff : 064 064 064

Fil Reso : 064 064 064

Common Param

DSP1 Type : 042

DSP2 Type : 001

Harm On/Off : 000

Harm Type : 002

Harm Volume : 080

Apg On/Off : 000

Apg Type : 000

====================================



Значения всех функций инструмента


В синтезаторе есть функции, значениями которых можно управлять через панель управления синтезатором. Все функции описаны в документации. Команда func выводит все значения в консоль:


> func

======== Function Parameter ========

Part param Main Dual Left

Voice No. : 000 107 088

Volume : 110 045 080

Octave : 000 000 -001

Panpot : 064 064 064

Rev Depth : 016 090 008

Cho Depth : 000 000 000

Attk Time : 064 064 064

Rel Time : 064 064 064

Fil Cutoff : 064 064 064

Fil Reso : 064 064 064

Common Param

Rev Type : 003

Cho Type : 003

Rev Total : 064

M EQ Type : 002

Acmp Volume : 100

Song Volume : 100

Pattern Vol : 100

Aux Volume : 050

USB Volume : 100

Transpose : 000

Master Tune : 000

Pitch BendR : 002

Acmp Split : 054

Split Point : 054

Tch Sense : 002

Msp On/Off : 000

Msp Pan : 064

DSP1 Type : 042

DSP2 Type : 001

DSP2 Part : 001

Mic Volume : 127

Mic Pan : 064

Mic Reverb Depth: 127

Mic Chorus Depth: 127

Blank Cut : 127

Harm Type : 002

Harm Volume : 080

Apg Type : 000

Apg Vel : 001

Apg Quan : 002

Apg Pdl Fnc : 000

Style Freeze : 000

Transpose Freeze: 000

Voice Freeze : 000

Pst Scale : 000

Base Note : 000

Tune Note : 000

S. Tune C : 000

S. Tune Cs : 000

S. Tune D : 000

S. Tune Ef : 000

S. Tune E : 000

S. Tune F : 000

S. Tune Fs : 000

S. Tune G : 000

S. Tune Af : 000

S. Tune A : 000

S. Tune Bf : 000

S. Tune B : 000

LocalOn/Off : 127

Ext Clock : 000

Key Out : 127

Style Out : 000

Song Out : 000

Loop Back : 001

Metro Sig : 004

Metro Den : 002

Metro Vol : 100

Lsn Trk R : 000

Lsn Trk L : 001

Wait Mode : 002

Demo Group : 002

Demo Play : 001

SP Mute : 001

A Pow Off : 000

Battery Sel : 000

Language : 000

====================================



Сохраняемые параметры


Команда backup показывает, какие параметры с какими значениями сохраняются в долгосрочную память, которая хранит значения между выключениями синтезатора.



> backup

======= Backup Ram Parameter =======

Part param Main Dual Left

Common Param

Rev Total : 064

M EQ Type : 002

Acmp Volume : 100

Song Volume : 100

Pattern Vol : 100

Master Tune : 000

Pitch BendR : 002

Acmp Split : 054

Split Point : 054

Tch Sense : 002

Mic Volume : 127

Mic Pan : 064

Mic Reverb Depth: 127

Mic Chorus Depth: 127

Blank Cut : 127

Style Freeze : 000

Transpose Freeze: 000

Voice Freeze : 000

Loop Back : 001

Metro Vol : 100

Grade : 127

Wait Mode : 002

Demo Group : 002

Demo Play : 001

Demo Cancel : 000

A Pow Off : 000

Battery Sel : 000

Language : 000

====================================



Непонятная команда chkprm


Следующая команда непонятно что делает. Судя по названию, должна проверять какие-то параметры. Вывод команды chkprm следующий:



> chkprm

========== Check Parameter =========

Part param Main Dual Left

Common Param

Msp On/Off : 000

====================================



Свободное место на диске


Непонятно, на каком диске. Возможно, на воткнутой в инструмент флешке.



> freearea

Disk Free Area

1811456



Команда jobconid


Данная команда как-то связана с состоянием дисплея (экрана) инструмента. Как она изменяется написано в следующем разделе.



> jobconid

Jobcon ID

[Alert 000]

[Popup 000]

[Hold3 000]

[Hold2 000]

[Hold1 000]

[Base 004]

[Active 004]

[Char Active Jobcon ID 004]



Команда dispinfo


Данная команда, похоже, отображает состояние дисплея инструмента, (то есть режим работы, который в данный момент используется?)


Ниже показывается как меняется состояние jobconid и dispinfo при последовательном нажатии кнопок Voice - Style - Groove Creator - Voice.



Когда Voice:


> jobconid

Jobcon ID

[Alert 000]

[Popup 000]

[Hold3 000]

[Hold2 000]

[Hold1 000]

[Base 004]

[Active 004]

[Char Active Jobcon ID 004]


> dispinfo

Display ID

002 (Jobcon ID:004)%



Когда Style:


> jobconid

Jobcon ID

[Alert 000]

[Popup 000]

[Hold3 000]

[Hold2 000]

[Hold1 000]

[Base 005]

[Active 005]

[Char Active Jobcon ID 005]


> dispinfo

Display ID

003 (Jobcon ID:005)%



Когда Groove Creator:


> jobconid

Jobcon ID

[Alert 000]

[Popup 000]

[Hold3 000]

[Hold2 000]

[Hold1 000]

[Base 005]

[Active 005]

[Char Active Jobcon ID 005]

> dispinfo

Display ID

003 (Jobcon ID:005)%



Когда опять Voice:


> jobconid

Jobcon ID

[Alert 000]

[Popup 000]

[Hold3 000]

[Hold2 000]

[Hold1 000]

[Base 004]

[Active 004]

[Char Active Jobcon ID 004]


> dispinfo

Display ID

002 (Jobcon ID:004)%



Команда swmask


Возможно, эта команда показывает или задает маску на клавиши панели управления (свитчи, switch). Сказать точно что делает данная команда пока сложно.



> swmask

Mask Pattern

None



Адреса портов ввода-вывода микроконтроллера


Адреса показывает команда ioport:



> ioport

I/O Port

CPIO39_32 0x0000000F

CPIO31_16 0x00000000

GPIO15_00 0x00000CFD

CPO11_00 0x000006A5

CPI08_00 0x00000081



Просмотр истории нажатия клавиш на панели управления


Нажатие клавиш на панели управления. Не реагирует на клавиши фортепиано.


Были последовательно нажаты клавиши:



  • Quick sampling A
  • Quick sampling B
  • Quick sampling C
  • Voice
  • Style
  • Voice


В списке ниже их коды получаются задом-наперед:



> getsw

SW History

new

018 (0x12)

019 (0x13)

018 (0x12)

146 (0x92)

145 (0x91)

144 (0x90)

019 (0x13)

146 (0x92)

145 (0x91)

144 (0x90)

old



Для дальнейшего эксперимента записаны коды кнопок:



  • 0x3C - кнопка Start/Stop
  • 0x39 - кнопка Fill
  • 0x12 - кнопка Voice
  • 0x13 - кнопка Style



Команды pushsw и sendsw


Через sendsw можно делать нажатия клавиш Voice, Style, Groove, Song и других.


Например, перейти в режим Voice из любого другого режима:



sendsw 12



Перейти в режим Style:



sendsw 13



Нажатие кнопки Старт в режиме Song. Начнет проигрываться демонстрационная мелодия 004 Gp demo:



> pushsw 3C

> sendsw 3C



Останавливается этими же двумя командами. Без pushsw 3C не работает. Запускается демо-мелодия потому, что был режим Song.


В режиме Voice можно запустить автоаккомпаниент, сделать Fill, остановить автоаккомпанимент:



Start

> pushsw 3с

> sendsw 3c


Fill

> pushsw 39

> sendsw 39


Start (срабатывает как стоп)

> pushsw 3c

> sendsw 3c



Однозначно сказать, что делает команда pushsw, пока невозможно. То ли это аналог нажатия без отпускания (удерживание кнопки), то ли еще что-то.



Группа команд perf-*


Имеется четыре комнды, начинающиеся на perf. Непонятно что они делают. Наверно, какие-то измерения.



> perf-key

Illegal Debug Sw : SYS_MEASURE_OP_PERF


> perf-sw

Illegal Debug Sw : SYS_MEASURE_OP_PERF


> perf-pedal

Illegal Debug Sw : SYS_MEASURE_OP_PERF


> perf-wheel

Illegal Debug Sw : SYS_MEASURE_OP_PERF


> perf-vol

Illegal Debug Sw : SYS_MEASURE_OP_PERF



Предварительный ввод команды perf-on ни к чему не приводит.



Команды sound-cnt-start и sound-cnt-disp


Непонятно, что они должны показывать.



> sound-cnt-start


> sound-cnt-disp

TG Sound Count Max = 0



Проигрывние автоаккомпанимента, игра мелодии, нажатие звуков Quick Sample к изменению значения не приводят. Надо понять, что значит сокращение TG.



Команды и regist-time


Возможно, какие-то замеры времени исполнения.



> voice-time

Illegal Debug Sw : VOICE_CHG_TIME_PERF_MEASURE


> regist-time

Illegal Debug Sw : REGIST_PLAY_TIME_PERF_MEASURE



Команда flash-write


Запускать не стал во избежание деструктивных действий. Возможно, это команда всего лишь записывает что-то на внешнюю флешку. А может быть перезаписывает прошивку на микросхему FLASH с файла с внешней флешки. Пока неясно, надо разбираться с архитектурой и дизассемблить.


Так же в этом разделе:
 
MyTetra Share v.0.67
Яндекс индекс цитирования