vak: (Default)
[personal profile] vak
Микрочип выпустил серию процессоров PIC32 со встроенной памятью SDRAM объёмом 32 мегабайта. Или с внешней памятью DDR2 до 128 мегабайт. Серия называется PIC32MZ-DA. На таких чипах уже можно пытаться запустить полноразмерный Линукс.



Но начнём мы с загрузчика U-Boot. Спасибо Мите Коротину за подробную инструкцию, которую я постараюсь здесь воспроизвести. Кому лениво читать инструкцию: готовый бинарник можно скачать здесь.

Собирать будем под Ubuntu версии 18.04. Устанавливаем кросс-компилятор и утилиты SREC:
sudo apt-get install gcc-mips-linux-gnu srecord
Скачиваем тексты U-Boot, адаптированные для PIC32:
git clone https://github.com/sergev/u-boot-pic32.git
Конфигурируем и собираем:
cd u-boot-pic32
make pic32mzdask_defconfig
make CROSS_COMPILE=mips-linux-gnu- USE_PRIVATE_LIBGCC=arch/mips/lib/libgcc.a CONFIG_USE_PRIVATE_LIBGCC=y
Имеем бинарный файл u-boot.bin. Теперь преобразуем его в формат .hex, попутно добавив конфигурационные регистры DEVCFG и пару команд по стартовому адресу bfc00000:
(
srec_cat -output - -intel -gen 0x1FC00000 0x1FC00004 -const-l-e 0x0B401000 4
srec_cat -output - -intel -gen 0x1FC00004 0x1FC00008 -const-l-e 0x00000000 4
srec_cat -output - -intel -gen 0x1FC0FFBC 0x1FC0FFC0 -const-l-e 0xF4FFFFFF 4
srec_cat -output - -intel -gen 0x1FC0FFC0 0x1FC0FFC4 -const-l-e 0xFEFFFFFF 4
srec_cat -output - -intel -gen 0x1FC0FFC4 0x1FC0FFC8 -const-l-e 0xF7F9B11A 4
srec_cat -output - -intel -gen 0x1FC0FFC8 0x1FC0FFCC -const-l-e 0x5F74FCF9 4
srec_cat -output - -intel -gen 0x1FC0FFCC 0x1FC0FFD0 -const-l-e 0xF7FFFFD3 4
) | grep -v ':00000001FF' > u-boot.hex
srec_cat -output - -intel u-boot.bin -binary -offset 0x1D004000 >> u-boot.hex
Полученный файл u-boot.hex можно прошить в плату PIC32MZ DA Starter Kit с помощью следующего скрипта. У вас должен быть установлен пакет Microchip MPLAB X. В скрипте нужно поправить путь к вашей версии: в моём случае это /opt/microchip/mplabx/v5.25.
mplabx="/opt/microchip/mplabx/v5.25"
java="$mplabx/sys/java/jre1.8.0_181/bin/java"
ipecmd="$mplabx/mplab_platform/mplab_ipe/ipecmd.jar"

$java -jar $ipecmd -p32MZ2064DAR169 -tpPKOB -fu-boot.hex -m -ol
Протокол прошивки выглядит так:
*****************************************************
Connecting to Starter Kit on Board...
Currently loaded firmware on Starter Kit on Board
Firmware Suite Version.....01.56.00
Firmware type..............PIC32MZ
Target voltage detected
Target device PIC32MZ2064DAR169 found.
Device ID Revision = B1
DEVSN0 = ffffffff
DEVSN1 = ffffffff
Device Erased...
Programming...
The following memory area(s) will be programmed:
program memory: start address = 0x1d004000, end address = 0x1d061fff
boot config memory
configuration memory
Programming/Verify complete
Program Report
23-Oct-2019, 20:39:54
Device Type:PIC32MZ2064DAR169
Program Succeeded.
Operation Succeeded
Теперь подключаемся к консоли PIC32 и проверяем работу U-Boot:
$ screen /dev/ttyACM0 115200
U-Boot 2015.07-00021-g893592104d-dirty (Oct 23 2019 - 20:09:59 -0700)

Board: PIC32MZ[DA]
CPU Speed: 200 MHz
SPI: ready
DRAM: 32 MiB
Flash: 2 MiB
MMC: pic32-sdhci: 0
In: serial
Out: serial
Err: serial
Net: pic32_eth
Error: pic32_eth address not set.

Hit any key to stop autoboot: 5
dask # _
Изучаем плату:
dask # version

U-Boot 2015.07-00021-g893592104d-dirty (Oct 23 2019 - 20:09:59 -0700)
mipsisa32r6-linux-gnu-gcc (Ubuntu 8.3.0-7ubuntu1) 8.3.0
GNU ld (GNU Binutils for Ubuntu) 2.32.90.20190917

dask # bdinfo

boot_params = 0x89F121C8
memstart = 0x08000000
memsize = 0x02000000
flashstart = 0x1D000000
flashsize = 0x00200000
flashoffset = 0x00000000
ethaddr = (not set)
ip_addr =
baudrate = 115200 bps

dask # coninfo

List of available devices:
serial 80000003 SIO stdin stdout stderr
pic32_serial 00000003 .IO

dask # flinfo

Bank # 1: Microchip Internal (8 Mbit, 64 x 16k)
Size: 1 MB in 64 Sectors
Sector Start Addresses:
9D000000 (RO) 9D004000 (RO) 9D008000 (RO) 9D00C000 (RO) 9D010000 (RO)
9D014000 (RO) 9D018000 (RO) 9D01C000 (RO) 9D020000 (RO) 9D024000 (RO)
9D028000 (RO) 9D02C000 (RO) 9D030000 (RO) 9D034000 (RO) 9D038000 (RO)
9D03C000 (RO) 9D040000 (RO) 9D044000 (RO) 9D048000 (RO) 9D04C000 (RO)
9D050000 (RO) 9D054000 (RO) 9D058000 (RO) 9D05C000 (RO) 9D060000 (RO)
9D064000 (RO) 9D068000 (RO) 9D06C000 (RO) 9D070000 (RO) 9D074000 (RO)
9D078000 (RO) 9D07C000 (RO) 9D080000 (RO) 9D084000 (RO) 9D088000 (RO)
9D08C000 (RO) 9D090000 (RO) 9D094000 (RO) 9D098000 (RO) 9D09C000 (RO)
9D0A0000 (RO) 9D0A4000 (RO) 9D0A8000 (RO) 9D0AC000 (RO) 9D0B0000 (RO)
9D0B4000 (RO) 9D0B8000 (RO) 9D0BC000 (RO) 9D0C0000 (RO) 9D0C4000 (RO)
9D0C8000 (RO) 9D0CC000 (RO) 9D0D0000 (RO) 9D0D4000 (RO) 9D0D8000 (RO)
9D0DC000 (RO) 9D0E0000 (RO) 9D0E4000 (RO) 9D0E8000 (RO) 9D0EC000 (RO)
9D0F0000 (RO) 9D0F4000 (RO) 9D0F8000 (RO) 9D0FC000 (RO)

Bank # 2: Microchip Internal (8 Mbit, 64 x 16k)
Size: 1 MB in 64 Sectors
Sector Start Addresses:
9D100000 (RO) 9D104000 (RO) 9D108000 (RO) 9D10C000 (RO) 9D110000 (RO)
9D114000 (RO) 9D118000 (RO) 9D11C000 (RO) 9D120000 (RO) 9D124000 (RO)
9D128000 (RO) 9D12C000 (RO) 9D130000 (RO) 9D134000 (RO) 9D138000 (RO)
9D13C000 (RO) 9D140000 (RO) 9D144000 (RO) 9D148000 (RO) 9D14C000 (RO)
9D150000 (RO) 9D154000 (RO) 9D158000 (RO) 9D15C000 (RO) 9D160000 (RO)
9D164000 (RO) 9D168000 (RO) 9D16C000 (RO) 9D170000 (RO) 9D174000 (RO)
9D178000 (RO) 9D17C000 (RO) 9D180000 (RO) 9D184000 (RO) 9D188000 (RO)
9D18C000 (RO) 9D190000 (RO) 9D194000 (RO) 9D198000 (RO) 9D19C000 (RO)
9D1A0000 (RO) 9D1A4000 (RO) 9D1A8000 (RO) 9D1AC000 (RO) 9D1B0000 (RO)
9D1B4000 (RO) 9D1B8000 (RO) 9D1BC000 (RO) 9D1C0000 (RO) 9D1C4000 (RO)
9D1C8000 (RO) 9D1CC000 (RO) 9D1D0000 (RO) 9D1D4000 (RO) 9D1D8000 (RO)
9D1DC000 (RO) 9D1E0000 (RO) 9D1E4000 (RO) 9D1E8000 (RO) 9D1EC000 (RO)
9D1F0000 (RO) 9D1F4000 (RO) 9D1F8000 (RO) 9D1FC000 (RO)

dask # clk dump

PLL Speed: 200 MHz
CPU Clock Speed: 200 MHz
periph1clk speed: 100 MHz
periph2clk speed: 100 MHz
periph3clk speed: 100 MHz
periph4clk speed: 100 MHz
periph5clk speed: 100 MHz
periph6clk speed: 50 MHz
refosc1clk speed: 10 MHz
refosc2clk speed: 50 MHz
refosc3clk speed: 20 MHz
refosc4clk speed: 25 MHz

dask # mdio list

PIC32-EMAC:
0 - SMSC LAN8740 <--> pic32_eth

dask # mmc info

Device: pic32-sdhci
Manufacturer ID: 1b
OEM: 534d
Name: GB1QT
Tran Speed: 50000000
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 29.8 GiB
Bus Width: 4-bit
Erase Group Size: 512 Bytes

dask # part list mmc 0

Partition Map for MMC device 0 -- Partition Type: DOS

Part Start Sector Num Sectors UUID Type
1 2048 61995008 35304b22-01 83 Boot
2 61997056 524288 35304b22-02 82
Тестируем 640 килобайт внутренней памяти SRAM:
# mtest 0x80000000 0x800a0000
Testing 80000000 ... 800a0000:
Pattern FFFFFFFF Writing... Reading...Iteration: 94
^C
Прерываем с помощью ^C. Тестируем 31 мегабайт памяти SDRAM. Последний мегабайт пропускаем, так как там находятся рабочие данные самого U-Boot:
dask # mtest 0x88000000 0x89f00000 
Testing 88000000 ... 89f00000:
Pattern FFFFFFFF Writing... Reading...Iteration: 6
В следующий раз я расскажу, как запустить на этой плате Линукс.

Date: 2019-10-24 11:05 (UTC)
From: [personal profile] ex0_planet
Я всё понимаю, но 200мгц? ddr2? десять баксов? В 2019 году? Из коммуникаций только ethernet и can. Ок, там подержка дисплеев и графической "акселерации" из коробки, видимо он под hmi заточен. Но 200мгц?

Единственное видимое достоинство это встроенная память, типа, чтобы не разводить. Но блин.

Date: 2019-10-24 15:14 (UTC)
pappadeux: (Default)
From: [personal profile] pappadeux
присоединюсь к вопросу - зачем?

есть же вполне работоспособный Pi Zero