U-Boot для pic32
2019-10-23 19:59![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Микрочип выпустил серию процессоров PIC32 со встроенной памятью SDRAM объёмом 32 мегабайта. Или с внешней памятью DDR2 до 128 мегабайт. Серия называется PIC32MZ-DA. На таких чипах уже можно пытаться запустить полноразмерный Линукс.

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

Но начнём мы с загрузчика U-Boot. Спасибо Мите Коротину за подробную инструкцию, которую я постараюсь здесь воспроизвести. Кому лениво читать инструкцию: готовый бинарник можно скачать здесь.
Собирать будем под Ubuntu версии 18.04. Устанавливаем кросс-компилятор и утилиты SREC:
Скачиваем тексты U-Boot, адаптированные для PIC32:sudo apt-get install gcc-mips-linux-gnu srecord
Конфигурируем и собираем: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:
Полученный файл u-boot.hex можно прошить в плату PIC32MZ DA Starter Kit с помощью следующего скрипта. У вас должен быть установлен пакет Microchip MPLAB X. В скрипте нужно поправить путь к вашей версии: в моём случае это /opt/microchip/mplabx/v5.25.(
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
Протокол прошивки выглядит так: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
Теперь подключаемся к консоли PIC32 и проверяем работу U-Boot:*****************************************************
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
Изучаем плату:$ 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 # _
Тестируем 640 килобайт внутренней памяти SRAM: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
Прерываем с помощью ^C. Тестируем 31 мегабайт памяти SDRAM. Последний мегабайт пропускаем, так как там находятся рабочие данные самого U-Boot:# mtest 0x80000000 0x800a0000
Testing 80000000 ... 800a0000:
Pattern FFFFFFFF Writing... Reading...Iteration: 94
^C
В следующий раз я расскажу, как запустить на этой плате Линукс.dask # mtest 0x88000000 0x89f00000
Testing 88000000 ... 89f00000:
Pattern FFFFFFFF Writing... Reading...Iteration: 6
no subject
Date: 2019-10-24 11:05 (UTC)Единственное видимое достоинство это встроенная память, типа, чтобы не разводить. Но блин.
no subject
Date: 2019-10-24 15:57 (UTC)no subject
Date: 2019-10-24 15:14 (UTC)есть же вполне работоспособный Pi Zero
no subject
Date: 2019-10-24 15:53 (UTC)