• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

JTAG/SWD (китайский J-Link STLink V2) c OpenOCD

pvvx

Активный участник сообщества
Система Win7x64 (MinGW) + китайский J-Link STLink V2 с прошивкой из SEGGER - The Embedded Experts - ST-LINK on-board
RTL-8710 openocd support от туда:
rebane / rtl8710_openocd / source / — Bitbucket
RTL8710 and OpenOCD - RTL8710 Community Forum

Использовал тестовую команду:
openocd -f interface/jlink.cfg -f rtl8710.ocd -c "init" -c "reset halt" -c "rtl8710_flash_read_id" -c "rtl8710_flash_read dump.bin 0 1048576" -c "shutdown"
Не очень понятно почему низкая скорость чтения Flash:
Код:
E:\RTL87xx\git\rebane-rtl8710_openocd\script>openocd -f interface/jlink.cfg -f rtl8710.ocd -c "init" -c "reset halt" -c "rtl8710_flash_read_id" -c "rtl8710_flash_read dump.bin 0 1048576" -c "shutdown"
GNU ARM Eclipse 64-bits Open On-Chip Debugger 0.10.0-dev-00287-g85cec24-dirty (2016-01-10-10:13)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.org/doc/doxygen/bugs.html
swd
adapter speed: 3500 kHz
adapter_nsrst_delay: 100
cortex_m reset_config sysresetreq
rtl8710_reboot
Info : No device selected, using first device.
Info : J-Link STLink V2 compiled Aug  4 2016 15:36:56
Info : Hardware version: 1.00
Info : VTarget = 3.300 V
Info : clock speed 3500 kHz
Info : SWD IDCODE 0x2ba01477
Info : rtl8710.cpu: hardware has 6 breakpoints, 4 watchpoints
rtl8710.cpu: target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x00000100 msp: 0x1ffffffc
initializing RTL8710 flasher
faultmask (/1): 0x01
sp (/32): 0x20000000
pc (/32): 0x10001000
RTL8710 flasher initialized
manufacturer ID: 0xC2, memory type: 0x20, memory capacity: 1048576 bytes
read offset 0
dumped 262144 bytes in 3.764215s (68.009 KiB/s)
read 262144 bytes
read offset 262144
dumped 262144 bytes in 3.739214s (68.464 KiB/s)
read 262144 bytes
read offset 524288
dumped 262144 bytes in 3.725214s (68.721 KiB/s)
read 262144 bytes
read offset 786432
dumped 262144 bytes in 3.728213s (68.666 KiB/s)
read 262144 bytes
shutdown command invoked
При установке "adapter_khz 4000", т.е. выше 3500 kHz, не работает - чип не определяется.
Это связано с версией данной платы - STLink V2 ?
При прошивке утилитой SEGGER в режим STLink, максимальная скорость ещё меньше...
 

pvvx

Активный участник сообщества
Кто починит это безобразие?
make_array <rtl8710_flasher.bin >>rtl8710.ocd
rebane / rtl8710_openocd / source / Makefile — Bitbucket
В Windows файл открывается в текстовом режиме -> код 0x1A является концом файла и "дампа" не выходит :(
Вылезает обрывок в три слова вместо кода 'флашера':
errorfoocd.gif
 
Последнее редактирование:

garry64

New member
первый пач прошел 26aa ->74eb
замена 2568 -> 90 90 висим
там у меня 75 66

версия STLink
v2.j23.s14
 

goodwin

Member
Разница в трактовках скорее всего ;)
В первом надо поменять 74 на EB
А во втором надо забить последовательно 2 байтика 90 90.
Агрегат вот такой.
 

Вложения

Последнее редактирование:

goodwin

Member
Если что, в "зеленом" разведен полный JTAG, в отличие от "железного".
Лучшее Качество ST Link stlink V2 для STM8S STM8L Cortex M0 STM32 Cortex M3 ПЛАВАТЬ JTAG SWD интерфейс Программист купить на AliExpress

JTAG то разведен в "зеленом", да только прошива от Segger его не поддерживает.
Скорость SWD тоже "программно" ограничена прошивой 4 МГц.
В связке с RTL8710 действительно надо выставлять скорость SWD не более 3.5 МГц.
Иначе возникают глюки. Если выставить скорость "AUTO",
То девайсы соединябтся на 2МГц.
Видимо в железе ST-Link применен программный "ногодрыг" для JTAG (родной ST-Link вообще выше 1 МГц не поддерживает...).

"J-Link OB", слепленный на скорую руку из китайской платки STM32 за 100 руб и пары резисторов, SWD работает стабильно на 4 МГц.

C "родным" J-Link V8 работает на 12 МГц через JTAG.
SWD - те же 4 МГц.

Повторюсь: Сама по себе скорость интерфейса SWD в SDK для IAR не является определяющей...
 

Вложения

Последнее редактирование:

goodwin

Member
Продолжу тут...
Выкладываю архив. В архиве два макроса.
"MYpreload_JLink.mac" и "MYpreload_JLink_RAM.mac".
(выбираются в настройках отладчика).
Убрал в них инициализацию SDRAM - она в RTL8710 не нужна.

По-умолчанию (в проекте SDK) при отладке J-Link-ом выполняется макрос "preload.mac".
Но там каша...
Сначала шьется flash, потом заливается образ прямо в RAM.
Все это очень долго...
И дело не только в скорости J-Link.
Там похоже долго инициируется кэш отладчика - проект большой, очень много отладочной информации...
Флеш J-Link-ом заливается довольно быстро.
RAM заливается примерно с такой же скоростью (ногодрыгом через Jtag).
И подозреваю, что сначала считывается флэш, в ней меняется "свежая половина" , после чего все это вместе прошивается (сужу по размеру кода, переданного J-Link-у в логах отладчика).

В IAR есть две кнопки запуска отладки (зеленый и серый "треугольнички". См. мою картинку в предыдущем посту).
Обзываются соответственно "Download an debug" и "Debud without Downloading".
Первый шьет flash, второй, соответственно не шьет, а просто запускает отладку.


"MYpreload_JLink.mac" ускоряет отладку, если просто надо полазить по коду, поустаналивать бряки, посмотреть...
Сначала надо "зеленым" залить скомпилированную прогу.
Потом "серым" можно запускать отладку, возобновлять ее после сброса без всяческих загрузок...
При этом RTL8710 отрабатывает штатно - после сброса загрузчик льет образ в RAM из флэш и подключает отладку.

"MYpreload_JLink_RAM.mac":
"Зеленым" также можно залить скомпилированную прогу во флэш и запустить отладку.
"Серый" грузит СВЕЖЕскомпилированную прогу прямо в RAM, не обновляя флэш.
Подправил в макросе реакцию на "Reset" - теперь после сброва можно запустить прогу
опять же ничего не загружая. Немного ругается при этом на "стек и точку входа в Main",
но это намного лучше, чем было - там надо было перезаливать все заново...
RTL8710 в этом варианте сразу после сброса передает управление в RAM, не обращаясь к flash.
(это можно посмотреть в логах последовательного порта).
Т.е. можно не трогая китайскую прошиву, компилировать и запускать измененный код...

В архив положил копию flash моего модуля.
Увы, там уже нет родной прошивы - только пример из SDK + залитая по OTA прошива с китайского форума :)
 

Вложения

Последнее редактирование:

goodwin

Member
С помощью сеггеровской утилиты JFlash заливка флэш занимала бы считаные секунды.
Но Сеггер держит в секрете формат и протокол их "Custom RAM Code", который должен загружаться в RAM для работы с SPI флэш и взаимодействовать с J-Link...
 

pvvx

Активный участник сообщества
По-умолчанию (в проекте SDK) при отладке J-Link-ом выполняется макрос "preload.mac".
Это всё относится к IAR и первым оф. версиям SDK "Амёба". Ныне всех интересует GCC на MinGW и Lunix-ах. Там используется OpenOCD.
 

pvvx

Активный участник сообщества
С помощью сеггеровской утилиты JFlash заливка флэш занимала бы считаные секунды.
Но Сеггер держит в секрете формат и протокол их "Custom RAM Code", который должен загружаться в RAM для работы с SPI флэш и взаимодействовать с J-Link...
Сделал пока загрузку и запуск кода в RAM для JLinkGDB rtl00TstMinAmebaV35a/gdb_run_ram.jlink at master · pvvx/rtl00TstMinAmebaV35a · GitHub
+ чтение FullFlash rtl00TstMinAmebaV35a/gdb_rdflash.jlink at master · pvvx/rtl00TstMinAmebaV35a · GitHub
Загрузка и запуск проекта в RAM (когда уже проинициализирован CPU, работаем на 4MHz) занимает 3..4 сек в Eclipse:
Код:
....
Loading section .bootloader, size 0x3a98 lma 0x10000bc8
Loading section .image2.start.table, size 0x38 lma 0x10006000
Loading section .ram_image2.text, size 0x3dbd0 lma 0x10006038
Loading section .mon.ram.bss, size 0x350 lma 0x10043c08
Loading section .ram_image2.rodata, size 0x97b7 lma 0x10043f58
Loading section .ram.data, size 0x1c40 lma 0x1004d710
Loading section .ram.bss, size 0x9824 lma 0x1004f350
Loading section .bf_data, size 0xf118 lma 0x10058b74
Loading section .valid, size 0xf574 lma 0x1fff0000
Loading section .dummy, size 0x19c8 lma 0x1ffff574
Start address 0x100, load size 484959
Transfer rate: 172 KB/sec, 3910 bytes/write.
A debugging session is active.

    Inferior 1 [Remote target] will be killed.

Quit anyway? (y or n) [answered Y; input not from terminal]

17:22:48 Build Finished (took 3s.691ms)
Чтение FullFlash (1Мегабайт) [inline]17:25:18 Build Finished (took 7s.936ms)[/inline]

Запись для JLinkGDB сделаю позже, когда определюсь с необходимым мне алгоритмом (сразу всё в память и писать или секторами, или ещё как...). А пока есть реализация через OpenOCD (работает на много быстрее чем в SDK для IAR и т.д.).
 

shangdawei

New member
Sorry, I dont know how to upload a file, so i post as text here.

Uses JFlash to program RTL8710

Here is RTL8710Flash.jflash

Код:
  AppVersion = 61007
  FileVersion = 2
[GENERAL]
  ConnectMode = 0
  CurrentFile = "A:\fullflash.bin"
  DataFileSAddr = 0x98000000
  GUIMode = 0
  HostName = ""
  TargetIF = 1
  USBPort = 0
  USBSerialNo = 0x00000000
[JTAG]
  IRLen = 0
  MultipleTargets = 0
  NumDevices = 0
  Speed0 = 1000
  Speed1 = 12000
  TAP_Number = 0
  UseAdaptive0 = 0
  UseAdaptive1 = 0
  UseMaxSpeed0 = 0
  UseMaxSpeed1 = 0
[CPU]
  NumInitSteps = 10
  InitStep0_Action = "Reset"
  InitStep0_Value0 = 0x00000000
  InitStep0_Value1 = 0x00000005
  InitStep0_Comment = "Reset and Halt"
  InitStep1_Action = "Go"
  InitStep1_Value0 = 0x00000000
  InitStep1_Value1 = 0x00000000
  InitStep1_Comment = ""
  InitStep2_Action = "Reset"
  InitStep2_Value0 = 0x00000000
  InitStep2_Value1 = 0x00000005
  InitStep2_Comment = "Reset and halt target"
  InitStep3_Action = "Write Register"
  InitStep3_Value0 = 0x00000010
  InitStep3_Value1 = 0x01000000
  InitStep3_Comment = "Only T=1"
  InitStep4_Action = "Write 32bit"
  InitStep4_Value0 = 0x40000014
  InitStep4_Value1 = 0x00000001
  InitStep4_Comment = "Setup SystemCoreClock"
  InitStep5_Action = "Delay"
  InitStep5_Value0 = 0x00000000
  InitStep5_Value1 = 0x00000005
  InitStep5_Comment = ""
  InitStep6_Action = "Write 32bit"
  InitStep6_Value0 = 0x1FFFFFF0
  InitStep6_Value1 = 0x00000100
  InitStep6_Comment = "Write Page Size"
  InitStep7_Action = "Write 32bit"
  InitStep7_Value0 = 0x1FFFFFF4
  InitStep7_Value1 = 0x00001000
  InitStep7_Comment = "Write Sector Size"
  InitStep8_Action = "Write 32bit"
  InitStep8_Value0 = 0x1FFFFFF8
  InitStep8_Value1 = 0x00010000
  InitStep8_Comment = "Write Block Size"
  InitStep9_Action = "Write 32bit"
  InitStep9_Value0 = 0x1FFFFFFC
  InitStep9_Value1 = 0x00000010
  InitStep9_Comment = "Write Block Count"
  NumExitSteps = 0
  UseScriptFile = 0
  ScriptFile = ""
  UseRAM = 1
  RAMAddr = 0x10000000
  RAMSize = 0x00010000
  CheckCoreID = 0
  CoreID = 0x00000000
  CoreIDMask = 0x0F000FFF
  UseAutoSpeed = 0x00000001
  ClockSpeed = 0x00000000
  EndianMode = 0
  ChipName = "Cortex-M3"
[FLASH]
  BaseAddr = 0x98000000
  CustomRAMCode = "A:\RTL8710Flasher.hex"
  NumBanks = 1
  UseCustomRAMCode = 1
[PRODUCTION]
  AutoBlankCheck = 1
  AutoDisconnect = 0
  AutoMode = 0
  AutoPerformsErase = 1
  AutoPerformsProgram = 1
  AutoPerformsSecure = 0
  AutoPerformsStartApp = 0
  AutoPerformsUnsecure = 0
  AutoPerformsVerify = 1
  EnableTargetPower = 0
  EraseType = 2
  MonitorVTref = 0
  MonitorVTrefMax = 0x0000157C
  MonitorVTrefMin = 0x000003E8
  OverrideTimeouts = 0
  ProgramSN = 0
  SerialFile = ""
  SkipBlankOnRead = 0
  SNAddr = 0x00000000
  SNInc = 0x00000001
  SNLen = 0x00000004
  SNListFile = ""
  SNValue = 0x00000001
  StartAppType = 0
  TargetPowerDelay = 0x00000014
  TimeoutErase = 0x00003A98
  TimeoutProgram = 0x00002710
  TimeoutVerify = 0x00002710
  VerifyType = 1
Here is RTL8710Flash.hex

Код:
:100000007D0439057F05FF056506D506D706000086
:10001000D44908707047D44800680005FBD0D14827
:100020000078C0B2704710B5D048006850F44070F6
:10003000CE490860CE48006850F01000CC490860F6
:10004000CC480468062000F0B7F934F00600C9492E
:100050000860C848006850F00100C64908600020E8
:10006000C54908600020C54908600120C4490860EE
:100070000220C44908600020C34908600020C34929
:1000800008600020C249086010BD2DE9F04104005D
:100090000D001600B6B2002E01D1002048E0B6B225
:1000A000112E01DB102006004FF4407000F084F99F
:1000B00080465FF4401000F07FF95FF4403000F0BC
:1000C0007BF95FF4402000F077F9032010FA08F084
:1000D00010F44070AF490860B6B2AF480660032024
:1000E000FFF796FF200CC0B2FFF792FF200AC0B2C4
:1000F000FFF78EFF2000C0B2FFF78AFF01209E4964
:100100000860002007003800310080B289B28842C0
:1001100005D2FFF780FFBFB2E8557F1CF3E79F4889
:100120000068C007FBD4002093490860300080B20B
:10013000BDE8F08138B54FF4407000F03DF905009E
:100140005FF4401000F038F95FF4403000F034F90B
:100150005FF4402000F030F90320A84010F4407014
:100160008C49086003208C4908600120824908609E
:100170009F20FFF74DFFFFF74EFF0400FFF74BFFF7
:1001800054EA00200400FFF746FF54EA0040040050
:1001900082480068C007FBD400207749086020002F
:1001A00032BD38B54FF4407000F006F905005FF439
:1001B000401000F001F95FF4403000F0FDF85FF40A
:1001C000402000F0F9F80320A84010F44070714975
:1001D0000860012070490860012067490860052017
:1001E000FFF716FFFFF717FF04006C480068C00711
:1001F000FBD40020604908602000C0B232BD38B591
:1002000004004FF4407000F0D7F805005FF4401090
:1002100000F0D2F85FF4403000F0CEF85FF44020F8
:1002200000F0CAF80120A84010F440705949086055
:100230000120514908602000C0B2FFF7E9FE57488D
:100240000068C007FBD400204B49086031BD38B5B9
:1002500004004FF4407000F0AFF805005FF4401068
:1002600000F0AAF85FF4403000F0A6F85FF44020F8
:1002700000F0A2F80120A84010F440704549086041
:1002800001203D4908602020FFF7C2FE200CC0B2CB
:10029000FFF7BEFE200AC0B2FFF7BAFE2000C0B2D0
:1002A000FFF7B6FE3D480068C007FBD40020324986
:1002B000086031BD2DE9F04104000D001600B6B212
:1002C000002E01D100204BE0B6B2B6F5807F02DDF2
:1002D0004FF4807006004FF4407000F06DF88046D7
:1002E0005FF4401000F068F85FF4403000F064F80C
:1002F0005FF4402000F060F8012010FA08F010F4DC
:1003000040702449086001201B4908600220FFF763
:100310007FFE200CC0B2FFF77BFE200AC0B2FFF7C1
:1003200077FE2000C0B2FFF773FE00200700380000
:10033000310080B289B2884205D2BFB2E85DFFF7D2
:1003400067FE7F1CF3E7154800684007FBD513489C
:100350000068C007FBD4002007490860300080B265
:10036000BDE8F08160600040246000403002004041
:1003700010020040C0020040086000402C600040B5
:100380001060004014600040186000401C60004095
:100390004C60004000600040046000402860004065
:1003A00080B5FFF7FEFEC007FBD401BD80B5FFF7A7
:1003B000F8FE8007FBD501BD90FAA0F0B0FA80F0FE
:1003C00070470000010051EA510151EA910151EAE0
:1003D000111151EA112151EA1141064A7A441432AD
:1003E000DFF8B03203FB01F3DB0E52F823201000DC
:1003F000704700BF80030000DFF89C02006850F0E7
:100400004070DFF894120860DFF89002006850F442
:100410008070DFF888120860FF20DFF8841208601F
:10042000FF20DFF880120860704780B500F054F9B3
:1004300001BD0120DFF870120860704780B571B609
:1004400072B6FFF7F6FFFFF7D7FFFFF7EEFF01BD2C
:1004500080B5FFF7E8FDFFF7A3FFFFF76BFEFFF79F
:100460009FFF92480068FFF7ADFF914908609148EF
:100470000068FFF7A7FF9049086001BDF8B50400C8
:100480000D0016008D4800688D49884204D18D48C2
:1004900000688D49884209D08948884908608A489F
:1004A00088490860FFF7CAFFFFF7D2FF814800685C
:1004B00086490968864A12685143B1FBF0F27368B5
:1004C00040271F807A4F3F689F700027DF70012709
:1004D0001F7101275F7100279F710127DF710127BD
:1004E0001F7200275F7201279F7201271F6100277B
:1004F000DFF8DCC1DCF800C067451CD2DFF8CCC1F6
:10050000DCF800C00CFB07FC5FF00C0E0EFB07FED6
:100510009E44CEF814C05FF00C0C0CFB07FC9C440E
:10052000CCF818205FF00C0C0CFB07FC9C44CCF8BA
:100530001C007F1CDCE7F1BD2DE9F04704000D0035
:1005400016007769D6F81080D6F80490002F14D0E2
:10055000200000F0C0F8112F02D35FF0100A00E075
:10056000BA46524692B249464046FFF78EFD1AEB14
:100570000808D144B7EB0A07E8E7BDE8F0872DE9A2
:10058000F84F04000D0016000020286077694848E5
:100590000068B84638FA00F8D6F810904448006869
:1005A00039FA00F9D6F804A0B8F1000F25D0B7F554
:1005B000807F02D94FF4807B00E0BB46FFF7F0FE5E
:1005C0000620FFF71CFEFFF7F1FE5A4692B2514695
:1005D0003648006800FB09F0FFF76CFEFFF7E0FE0D
:1005E0000420FFF70CFEFFF7DBFEDA44B7EB0B0746
:1005F000B8F1010819F10109D6E7BDE8F18F2DE93D
:10060000F84304000D00160030692B490968C84002
:10061000070070698046002028602648006800FBBB
:1006200007F08146B8F1000F1AD0200000F053F80F
:10063000FFF7B6FE0620FFF7E2FDFFF7B7FE4846DC
:10064000FFF705FEFFF7ACFE0420FFF7D8FDFFF72C
:10065000A7FE1848006810EB0909B8F10108E1E7A6
:10066000BDE8F18310B504001448006814498842BD
:1006700004D1144800681449884209D010480F4931
:10068000086011480F490860FFF7D8FEFFF7E0FE49
:1006900010BD0000DDACC407300200401C02004069
:1006A000200300402403004014000040F0FFFF1F1F
:1006B000E0FFFF1FF4FFFF1FE4FFFF1FE8FFFF1F26
:1006C000AA55AA55ECFFFF1F55AA55AAF8FFFF1F10
:1006D000FCFFFF1F7047704710B51E48006850F4BC
:1006E00040501C4908601C48006850F480501A496A
:1006F00008601A4800684006FBD5194804685FF492
:100700004000FFF759FE34F44000154908601448D2
:10071000006850F4801012490860002011490860F8
:100720001148006850F080000F49086044200F49CC
:10073000086000200B49086003240320FFF73CFEFB
:1007400014FA00F010F0030007490860002008497F
:10075000086010BD3002004010020040143000401C
:10076000C0020040043000400C3000400030004027
:1007700008300040000000000900000001000000F7
:100780000A0000000D00000015000000020000003B
:100790001D0000000B0000000E0000001000000013
:1007A0001200000016000000190000000300000005
:1007B0001E000000080000000C00000014000000F3
:1007C0001C0000000F0000001100000018000000D5
:1007D00007000000130000001B00000017000000CD
:1007E000060000001A0000000500000004000000E0
:0407F0001F000000E6
:0400000500000000F7
:00000001FF
 
  • Like
Реакции: pvvx

goodwin

Member
Сдул F103 с китайской платки, запаял F072, прошил фирмварь JLinkOB 072.
JLinkOB 072 пойдет.
Только максимальная скорость SWD с ним всего 2 МГц.
Ну разве что последовательный порт "на борту" уже имеется...
Переделанный в J-Link клон ST-Link вдвое быстрее - до 4МГц, что предпочтительнее, имхо...
 

pvvx

Активный участник сообщества
Сдул F103 с китайской платки, запаял F072, прошил фирмварь JLinkOB 072.
В STM32F103C8 код от JLinkOB072 не работает. Похоже, что-то связанное с установками внутреннего генератора CLK...
------
JFlash с файлами от shangdawei работает, но запись Flash ещё не проверял и нет работы с efuse...
 

pvvx

Активный участник сообщества
STLink V2(STM32F103) as J-Link OB clock is 4MHz .

Converting ST-LINK on-board into a J-Link
Это тут уже все знают. Но без патча там не всегда всё работает... UDK с Eclipse для модулей RTLxxx под Windows -> fix = Initial version that supports ST-LINK/V2, ST-LINK/V2-1, Chinese and other clones :)
 
Последнее редактирование:

pvvx

Активный участник сообщества
Ну да - в F103 код от F072 не заведется...
Я пока, в основном, с модулями RTL00, работаю со старым оф. J-Link (большая черная коробка). Версию не помню, т.к. уже перешивал и калечил его много раз, но SWD там больше 10 MHz ставится точно...
---
C ST-J-Link RTLxxx тоже работает, но там нет режима JTAG. JTAG и SWD есть в 'xLink ARM-OB STM32'
ourdev_491659.gif
Последнее обновление для него:
Firmware: J-Link ARM-OB STM32 compiled Aug 22 2012 19:52:04
Hardware version: V7.00

Если с JTAG соединен RESET (CHIP-EN), то JTAG работает всегда. C SWD есть варианты, когда программно в RTL отключен JTAG. Его можно вырубить и в efuse, но это я ещё не пробовал... Пусть коммерсанты пробуют - только им из-за псих.болезней нужно отключение чтения Flash... Это ещё одна фича, по чему ESP хуже RTL. ESP32 и ESP8266 такого не позволяет :)
 
Последнее редактирование:

goodwin

Member
Аналогично :) Вот этот почтенный ветеран SAM-ICE пережил 3 последовательных модификации с V5 до V8. По JTAG интерфейсу скорость работы с RTL00 - 12 Мбит/сек.
 

Вложения

Сверху Снизу